智林STM32開發(fā)板上實(shí)現(xiàn)的簡單人機(jī)界面_第1頁
智林STM32開發(fā)板上實(shí)現(xiàn)的簡單人機(jī)界面_第2頁
智林STM32開發(fā)板上實(shí)現(xiàn)的簡單人機(jī)界面_第3頁
智林STM32開發(fā)板上實(shí)現(xiàn)的簡單人機(jī)界面_第4頁
智林STM32開發(fā)板上實(shí)現(xiàn)的簡單人機(jī)界面_第5頁
免費(fèi)預(yù)覽已結(jié)束,剩余29頁可下載查看

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、智林STM32開發(fā)板上實(shí)現(xiàn)的簡單人機(jī)界面之三1、用于智林STM32開發(fā)板2、命令支持現(xiàn)在共支持四個(gè)命令:help、cls、ledon、ledoff。輸入help顯示系統(tǒng)的可用命令。輸入cls清屏。輸入ledon,點(diǎn)亮開發(fā)板的綠色指示燈。Ledoff將指示燈熄滅。如果輸入其它命令,屏幕顯示BadCommand,重新回到提示符下。3、輸入方法在開發(fā)板上有七個(gè)按鍵:搖桿方向鍵五個(gè)、右下角PB2和PB3。可以用這七個(gè)鍵輸入英文和簡單命令。搖桿往上按一下輸入a,迅速再按一下切換為b,依次可切換為abcdefg。往右推可輸入hijklmn,往左是opqrst和?,往下是rstuvw和!。中間鍵可輸入空格、

2、逗號(hào)、句號(hào)和0123.PB2用于退格,若是退格到提示符,揚(yáng)聲器示警。PB3表示回車,命令輸入完成。在測(cè)試過程中有一些小BUG,不過正常的操作是不會(huì)出現(xiàn)的。系統(tǒng)分嵌入用戶分智林STM32之人機(jī)界標(biāo)智林3TM32,人機(jī)交來原類:心|類:面篇|簽:互,shell|源:創(chuàng)|點(diǎn)擊查看原文發(fā)表評(píng)論閱讀全文(353)|回復(fù)(0)發(fā)表于2009/10/1820:25:30智林STM32人機(jī)交互程序的編制計(jì)劃03智林STM32人機(jī)交互程序的編制計(jì)劃031、背景智林STM32上只有七個(gè)按鍵,命令的輸入比較不方便。今天我仔細(xì)研究了一下手機(jī)鍵盤的英文輸入方法,覺得可以借鑒一下。2、手機(jī)鍵盤英文輸入的特點(diǎn)每一個(gè)按鍵對(duì)應(yīng)

3、多個(gè)字符,剛按下去時(shí),字符陰影顯示;再接著按一下,顯示字符改變。如果停頓一會(huì)兒,該字符的輸入就確定了,可以輸入新的字符。3、編寫思路在前面的程序里面,使用了KB_GetChar這個(gè)函數(shù),新的程序的編寫以此為基礎(chǔ)。前面的程序是案件消息驅(qū)動(dòng)的,如果消息隊(duì)列里沒有消息,則KB_GetChar()會(huì)一直等待。而新的驅(qū)動(dòng)是時(shí)間敏感的,所以必須進(jìn)行周期性掃描,如果消息隊(duì)列里沒有消息,一定時(shí)間內(nèi)也必須做出相應(yīng)的反映。4、狀態(tài)變遷圖為了更清晰地表示出鍵盤輸入的特點(diǎn),我覺得必須要畫一個(gè)狀態(tài)轉(zhuǎn)移圖才能更清晰地表達(dá)。上層程序調(diào)用KB_GetChar(),并根據(jù)返回信息,進(jìn)行輸入字符回顯和命令緩沖區(qū)的填充。面篇|盤|

4、較令.類:式|類:來原源:創(chuàng)|點(diǎn)擊查看原文發(fā)表于2009/10/1812:11:08發(fā)表評(píng)論閱讀全文(289)|回復(fù)(0)1KeilMDK下的STM32工程一、功能分析1、該工程是一個(gè)簡單的shell,用于智林STM32開發(fā)板。在開發(fā)板上有七個(gè)按鍵:搖桿方向鍵五個(gè)、右下角PB2和PB3。可以用這七個(gè)鍵輸入英文和簡單命令。2、使用方法開發(fā)板上點(diǎn)復(fù)位以后,處于初始模式,最上面一欄顯示CPU的使用率(這是ucos統(tǒng)計(jì)任務(wù)得到的值)和當(dāng)前模式可輸入字符(abcd和空格鍵)。同時(shí)第二行顯示命令提示符:sh。搖桿上推輸入a在液晶上回顯,右推輸入b,左推輸入c,下推輸入d,按OK輸入空格。按PB2可切換輸入

5、模式,總共六種模式:初始化是abcd和空格鍵,按PB2可分別切換為:efgh退格、ijkl逗號(hào)、mnop句號(hào)、qrstu和vwxyz。包括所有的英文小寫和兩個(gè)標(biāo)點(diǎn)、空格鍵和退格鍵,簡單的命令輸入已經(jīng)夠了。退格鍵可清除剛剛輸入的字符,當(dāng)?shù)竭_(dá)命令提示符時(shí),再按退格則揚(yáng)聲器報(bào)警提示。3、命令支持現(xiàn)在共支持四個(gè)命令:help、cls、ledon、ledoff。輸入help顯示系統(tǒng)的可用命令。輸入cls清屏。輸入ledon,點(diǎn)亮開發(fā)板的綠色指示燈。Ledoff將指示燈熄滅。如果輸入其它命令,屏幕顯示BadCommand,重新回到提示符下。二、工程源代碼組織1、文件的組織工程目錄下共六個(gè)目錄:startu

6、p、lcd、deviceucos_stm32、ucos、userapp。其中startup目錄下放著stm32起動(dòng)文件和庫文件、lcd目錄下放著液晶驅(qū)動(dòng)文件和shell輸出處理文件、device目錄下放置設(shè)備驅(qū)動(dòng)文件(現(xiàn)在就一個(gè)speaker.c用于以后擴(kuò)展設(shè)備卜ucos_stm32放置ucos在STM32下移植時(shí)需要的兩個(gè)文件、usos目錄放著uscos操作系統(tǒng)源代碼。Userapp目錄放著用戶主程序,為了方便閱讀,每一個(gè)任務(wù)使用一個(gè)c文件。2、工程的組織組織方式與文件目錄的組織基本一致,用KeilMDK的主菜單project/manage/components、enviroments子菜單

7、可進(jìn)行工程文件組的組織。經(jīng)過這兩天的整理,我覺得源代碼的組織已經(jīng)比較清晰了。其它的話我也不多說,大家看代碼吧。如果有智林STM32開發(fā)板的朋友可以下載、編譯使用。系統(tǒng)分卷入用戶分智林STM32之人機(jī)界標(biāo)智林,STM32,人機(jī)交來原類:且|類:面篇|簽:互,shell|源:創(chuàng)|點(diǎn)擊查看原文發(fā)表評(píng)論閱讀全文(417)|回復(fù)(1)發(fā)表于2009/10/1720:52:261智林STM32程序源代碼的分析和整理04智林STM32程序源代碼的分析和整理04一、定時(shí)器的配置1、概述STM32的定時(shí)器功能比較多、配置也較復(fù)雜,我現(xiàn)在了解不多,邊用邊學(xué)吧。智林開發(fā)板上有兩個(gè)用定時(shí)器的地方,一個(gè)是液晶的背光電源

8、,要求輸出一定的PWM波形,用于整流提供電源;二是用于控制喇叭,也是時(shí)鐘脈沖輸出。定時(shí)器首先的選擇是計(jì)數(shù)、還是定時(shí),我這里用的都是定時(shí),輸出模式可以是輸入時(shí)定時(shí)器的捕獲,可以是比較匹配時(shí)設(shè)定輸出(經(jīng)常用到這一種)。2、源程序voidTIMx_Config(void)TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;時(shí)基單元配置數(shù)據(jù)結(jié)構(gòu)TIM_OCInitTypeDefTIM_OCInitStructure;輸出模式設(shè)置數(shù)據(jù)結(jié)構(gòu)/*PA2腳接著定時(shí)器2CH3方波脈沖輸出,該輸出是液晶顯示整流電源*/GPIO_InitStructure.GPIO_Pin=G

9、PIO_Pin_2;/PA2,復(fù)用輸出模式GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;即用于定時(shí)2通道3GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);/*時(shí)基單元配置:TIM2計(jì)數(shù)頻率=36MHz除以3=12MHz,輸出頻率=12MHz除以2倍周期值。*/TIM_TimeBaseStructure.TIM_Period=CCR3_Val;/40寫入自動(dòng)裝載寄存器,150KHz輸出。TIM_TimeBaseStructure.TI

10、M_Prescaler=2;分頻系數(shù)3TIM_TimeBaseStructure.TIM_ClockDivision=0;/與什么采樣相關(guān),這里用不到向上計(jì)數(shù)的特點(diǎn)是:從0到加載值,產(chǎn)生溢出;然后重新從0計(jì)數(shù)。TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);/*輸出比較模式配置:通道3*/TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_Toggle;定時(shí)器計(jì)數(shù)與比較通道匹配時(shí)翻轉(zhuǎn)TIM_OCInitSt

11、ructure.TIM_OutputState=TIM_OutputState_Enable;開啟輸出通道TIM_OCInitStructure.TIM_Pulse=CCR3_Val;比較通道的計(jì)數(shù)值TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low;低電平有效TIM_OC3Init(TIM2,&TIM_OCInitStructure);TIM_OC3PreloadConfig(TIM2,TIM_OCPreload_Enable);自動(dòng)重裝載,預(yù)裝載TIM_Cmd(TIM2,ENABLE);/*TIM2定時(shí)器工作使能*/TIM_ITCon

12、fig(TIM2,TIM_IT_CC3,ENABLE);/*時(shí)鐘中斷使能*/這里只列出了液晶使用的定時(shí)器2通道3的輸出,輸出150kHz的頻率。沒用到中斷。這個(gè)頻率是怎么得到的呢?首先是TIM2使用APB1的36M,經(jīng)過預(yù)分頻,分頻系數(shù)為(Prescaler+1)=3,3分頻后為12MHz。計(jì)數(shù)周期為40,計(jì)數(shù)到40與輸出比較寄存器產(chǎn)生匹配,觸發(fā)輸出翻轉(zhuǎn),然后計(jì)數(shù)器重新開始計(jì)數(shù)。故輸出通道的頻率為12MHz除以80,得到150kHz。二、串口的配置按鍵輸入命令不怎么方便,很快我就要編寫串口通信程序,用串口輸入命令,控制開發(fā)板。串口配置用庫函數(shù)很方便。voidUART_Config(void)進(jìn)

13、行串口的初始化配置USART_InitTypeDefUSART_InitStructure;GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;/*UART的發(fā)送引腳*/GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;/*UART的接收引腳*/GPIO_InitStructure.G

14、PIO_Mode=GPIO_Mode_IN_FLOATING;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);USART_InitStructure.USART_BaudRate=115200;波特率USART_InitStructure.USART_WordLength=USART_WordLength_8b;/數(shù)據(jù)位8位USART_InitStructure.USART_StopBits=USART_StopBits_1;/停止位1USART_InitStructure.

15、USART_Parity=USART_Parity_No;無奇偶校驗(yàn)USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;無硬件流控USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;發(fā)送、接受模式有效USART_Init(USART1,&USART_InitStructure);/*根據(jù)上面結(jié)構(gòu)的參數(shù)對(duì)串口1進(jìn)行初始化*/USART1-BRR=0x0271;/*庫函數(shù)的串口波特率計(jì)算有些問題,這里重新計(jì)算了一下*/*使能串口1*

16、/USART_Cmd(USART1,ENABLE);系統(tǒng)分隹人用戶分智林STM32之人機(jī)界標(biāo)智林,STM32,源代碼,整來原類:且|類:皿|簽:H|源:創(chuàng)|點(diǎn)擊查看原文發(fā)表評(píng)論閱讀全文(291)|回復(fù)(0)發(fā)表于2009/10/1717:12:091智林STM32程序源代碼的分析和整理03智林STM32程序源代碼的分析和整理03一、Systick的配置1、簡單介紹這是一個(gè)系統(tǒng)定時(shí)器,時(shí)鐘源可以為AHB時(shí)鐘,也可設(shè)置為SysClk/8。使用時(shí)先設(shè)定初始值,然后每來一個(gè)時(shí)鐘,減去1,計(jì)數(shù)器為0時(shí)標(biāo)志置位,也可觸發(fā)中斷。在我的程序中,Systick用作usos的工作時(shí)鐘。2、我的源程序voidSys

17、Tick_Config(void)SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);/*將AHB始終作為SysTick時(shí)鐘源*/SysTick_SetReload(72000*10);/*每10毫秒發(fā)生一次中斷,ucos的系統(tǒng)頻率為100Hz*/72MHz的頻率下,計(jì)數(shù)72000需要1ms。SysTick_ITConfig(ENABLE);/*使能中斷*/下面是中斷服務(wù)程序voidSysTickHandler(void)OS_CPU_SRcpu_sr;OS_ENTER_CRITICAL();OSIntNesting+;中斷嵌套計(jì)數(shù)OS_EXIT_C

18、RITICAL();OSTimeTick();/ucos的時(shí)鐘服務(wù)程序OSIntExit();/這里可以觸發(fā)任務(wù)切換軟中斷二、GPIO的配置1、PA口PA0對(duì)應(yīng)按鍵PB3,開發(fā)板右下角。PA1用于模擬電位器,JP1在這里。PA2用定時(shí)器的PWM產(chǎn)生液晶的背光電源。PA4-PA7用于SPI模式操作SD卡。PA9,PA10用于串口0通信。PA11,PA12是USB差分線。PA13、PA14、PA15是JTAG的三個(gè)腳。PA3、PA8沒用到。2、PB口PB0用于揚(yáng)聲器,PB2與JP4用于Boot1選擇。PB3和PB4是JTAG的另外兩個(gè)腳。PB5控制綠色指示燈,在SD卡上面。PB6、PB7用于I2C

19、的存儲(chǔ)器。PB8、PB9用于CAN收發(fā)器。PB11-PB15用于搖桿按鍵。PB1和PB10沒有用到3、PC口PC0到PC7用于液晶的數(shù)據(jù)口,PB8-PB12分別用于讀、寫、命令數(shù)據(jù)選擇、復(fù)位和片選。PB13是PB2按鍵,在PB3左邊。PB14-PB15外接32.768KHz晶振。以上是開發(fā)板上各個(gè)IO口的用途,通用IO口先在這里配置,其它復(fù)用功能的在相應(yīng)的功能里配置,以下是源程序。4、程序voidGPIO_Config(void)GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;/*PA0接著按鈕PB3*/GPIO_InitStructure.GPIO_Mode=G

20、PIO_Mode_IN_FLOATING;浮空輸入GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;最大速度50MHzGPIO_Init(GPIOA,&GPIO_InitStructure);/對(duì)A口初始化/*配置PB5為輸出推挽方式,控制一個(gè)小綠燈*/GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GP

21、IO_InitStructure);/*配置PB11-PB15為輸入浮空方式,是搖桿五鍵輸入*/GPIOInitStructure.GPIOPin=GPIOPin11|GPIOPin13|GPIOPin13|GPIOPin14|GPIO_Pin_15;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13

22、;/*PC13腳接著按鈕PB2*/GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOC,&GPIO_InitStructure);/*液晶控制的IO在LCD底層驅(qū)動(dòng)函數(shù)中實(shí)現(xiàn)直接設(shè)置,PC0-PC12*/系統(tǒng)分諭人用戶分智林STM32之人機(jī)界標(biāo)智林,STM32,源代碼,整來原類:且|類:回曳|簽:H|源:創(chuàng)|點(diǎn)擊查看原文發(fā)表評(píng)論閱讀全文(308)|回復(fù)(0)發(fā)表于2009/10/1716:45:061智林STM32程序源代

23、碼的分析和整理02智林STM32程序源代碼的分析和整理02一、STM32時(shí)鐘配置程序分析1、RCCRCC是指ResetandClockControl復(fù)位和時(shí)鐘控制。主要寄存包括控制、配置、中斷、外設(shè)復(fù)位、外設(shè)時(shí)鐘使能、復(fù)位狀態(tài)寄存器。內(nèi)核的工作時(shí)鐘為SysClk,它的來源有三種:外部時(shí)鐘HSE、內(nèi)部時(shí)鐘HSI和PLL輸出時(shí)鐘。當(dāng)然PLL的時(shí)鐘也是來自于外部或內(nèi)部時(shí)鐘。2、我的源程序voidRCC_Config(void)時(shí)鐘配置,采用外部時(shí)鐘和PLLErrorStatusHSEStartUpStatus;/*枚舉變量,定義高速日鐘的起動(dòng)狀態(tài)*/RCC_DeInit();/*RCC寄存器值復(fù)位為

24、初始值*/RCC_HSEConfig(RCC_HSE_ON);/*使能外部HSE晶振*/HSEStartUpStatus=RCC_WaitForHSEStartUp();/*等待循環(huán)直至UHSE時(shí)鐘起振*/如果外部時(shí)鐘起振成功if(HSEStartUpStatus=SUCCESS)/*使能預(yù)取指令緩存*/FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);FLASH_SetLatency(FLASH_Latency_2);/*Flash2個(gè)時(shí)鐘延時(shí)*/RCC_HCLKConfig(RCC_SYSCLK_Div1);/HCLK=SYSCLKA

25、HB時(shí)鐘等于系統(tǒng)時(shí)RCC_PCLK2Config(RCC_HCLK_Div1);/*PCLK2=HCLKAPB2時(shí)鐘等于AHB時(shí)鐘*/RCC_PCLK1Config(RCC_HCLK_Div2);/PCLK1=HCLK/2APB1時(shí)鐘等于1/2AHB時(shí)鐘/*PLLCLK(鎖相環(huán)輸出時(shí)鐘)=12MHz(外部時(shí)鐘)*6(倍率)=72MHz(系統(tǒng)時(shí)鐘)*/RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_6);RCC_PLLCmd(ENABLE);/*使能PLL*/等待PLL準(zhǔn)備好while(RCC_GetFlagStatus(RCC_FLAG_PLLR

26、DY)=RESET);RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);/選擇PLL作為系統(tǒng)時(shí)鐘while(RCC_GetSYSCLKSource()!=0x08);/*等待PLL作為系統(tǒng)時(shí)鐘標(biāo)志位置位*/*使能外部相關(guān)部件的時(shí)鐘,包括AHB總線、APB2高速外圍總線、APB1總線*/RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);使能APB1上的TIM2RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB,ENABLE);RCC_

27、APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);使能三個(gè)IO口時(shí)鐘RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);/使能IO復(fù)用功能時(shí)鐘RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);使能串口1時(shí)鐘二、NVIC的配置1、NVIC它是指嵌套向量中斷控制器。中斷的數(shù)目與向量表的大小相關(guān)。加上保留的,每個(gè)向量占據(jù)4個(gè)字節(jié),一共占據(jù)0x0000,00EC個(gè)字節(jié)。NVIC的配置與具體中斷相關(guān),都在具體器件里配置,所以程序里的代碼很少。2、源代碼v

28、oidNVIC_Config(void)#ifdefVECT_TAB_RAM/*將向量表設(shè)置在RAM0x20000000*/NVIC_SetVectorTable(NVIC_VectTab_RAM,0x0);#else/*VECT_TAB_FLASH*/*將向量表設(shè)置在FlashROM0x08000000*/NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x0);#endif/*配置0位作為搶占優(yōu)先級(jí),4位子優(yōu)先級(jí)*/NVIC_PriorityGroupConRg(NVIC_PriorityGroup_0);/STM32共有四位數(shù)字進(jìn)行優(yōu)先級(jí)選擇系統(tǒng)分卷人用戶分

29、智林STM32之人機(jī)界標(biāo)智林,STM32,源代碼,整來原類:且|類:|簽:H|源:創(chuàng)|點(diǎn)擊查看原文發(fā)表評(píng)論閱讀全文(335)|回復(fù)(0)發(fā)表于2009/10/1710:38:571智林STM32程序源代碼的分析和整理012009年10月17日星期六9:13:13智林STM32程序源代碼的分析和整理01一、目的1、前些天,編寫了開發(fā)板上鍵盤掃描、字符輸入和簡單shell的程序,該程序的編寫是在以前工程的基礎(chǔ)上修改而成的,源代碼的組織比較亂,也沒有很好的注釋。這兩天,先把代碼整理一下,加上比較詳細(xì)的注釋,使得可讀性、擴(kuò)展性更好。2、乘這個(gè)機(jī)會(huì),也把程序里與STM32硬件相關(guān)的部分好好學(xué)習(xí)一下。二、

30、開發(fā)板配置分析1、PA口PA0對(duì)應(yīng)按鍵PB3,開發(fā)板右下角。PA1用于模擬電位器,JP1在這里。PA2用定時(shí)器的PWM產(chǎn)生液晶的背光電源。PA4-PA7用于SPI模式操作SD卡。PA9,PA10用于串口0通信。PA11,PA12是USB差分線。PA13、PA14、PA15是JTAG的三個(gè)腳。PA3、PA8沒用到。2、PB口PB0用于揚(yáng)聲器,PB2與JP4用于Boot1選擇。PB3和PB4是JTAG的另外兩個(gè)腳。PB5控制綠色指示燈,在SD卡上面。PB6、PB7用于I2C的存儲(chǔ)器。PB8、PB9用于CAN收發(fā)器。PB11-PB15用于搖桿按鍵。PB1和PB10沒有用到3、PC口PC0到PC7用于

31、液晶的數(shù)據(jù)口,PB8-PB12分別用于讀、寫、命令數(shù)據(jù)選擇、復(fù)位和片選。PB13是PB2按鍵,在PB3左邊。PB14-PB15外接32.768KHz晶振。4、PD口PD0-PD1外接12MHz晶振,PD2用于USB的連接斷開控制,低電平主機(jī)能檢測(cè)到,高電平斷開連接,JP3可直接控制連接。另外還有BOOT0腳,模式受控于JB5。下面還有復(fù)位引腳。這里5個(gè)腳加上上面48個(gè),共53個(gè)引腳。5、電源口共11個(gè)腳,還有電池引腳。到這里,開發(fā)板的IO配置基本已經(jīng)很清晰了。三、初始化配置程序的編寫程序中采用ucos操作系統(tǒng),在調(diào)用OS_Init()之前,先調(diào)用BSP_Config()進(jìn)行開發(fā)板IO配置工作。

32、下面是程序框架的源代碼。/*下面是包含文件*/#includestm32f10x_lib.h#includebsp_config.h/*可以在這里定義一些意義較為清晰地常量,如果不用改變,就放在文件user_conf.h里*/*用戶自己的全局變量在這里定義,按意義進(jìn)行組合*/staticGPIO_InitTypeDefGPIO_InitStructure;/進(jìn)彳亍GPIO端口設(shè)置的數(shù)據(jù)結(jié)構(gòu)staticNVIC_InitTypeDefNVIC_InitStructure;/進(jìn)行中斷設(shè)置的數(shù)據(jù)結(jié)構(gòu),前面的變量是用typedef在nvic的頭文件中定義的。/*用戶實(shí)現(xiàn)的函數(shù)在這里聲明*/voidRC

33、C_Config(void);voidNVIC_Config(void);voidSysTick_Config(void);voidGPIO_Config(void);voidTIM_Config(void);voidUSART_Config(void);/*該函數(shù)實(shí)現(xiàn)時(shí)鐘系統(tǒng)、中斷、系統(tǒng)時(shí)鐘和IO口配置的初始化實(shí)現(xiàn)STM32直接外圍器件的初始化*/voidBSP_Config(void)RCC_Config();時(shí)鐘配置NVIC_Config();/中斷向量配置,主要工作不在這兒做SysTick_Config();系統(tǒng)時(shí)鐘配置,用于usos的時(shí)鐘GPIO_Config();/通用IO口配置,

34、復(fù)用端口單獨(dú)配置TIM_Config();/定時(shí)器配置UART_Config();/異步串行端口配置以下就是這些具體配置函數(shù)的源代碼,我會(huì)邊修改邊發(fā)出來。有了這么一個(gè)程序框架后,對(duì)于不同的應(yīng)用程序,軟件的裁剪就比較方便。系統(tǒng)分卷區(qū)用戶分智林STM32之人機(jī)界標(biāo)智林,STM32,源代碼,整來原類:且|類:畫史|簽:理|源:創(chuàng)|點(diǎn)擊查看原文發(fā)表評(píng)論閱讀全文(412)|回復(fù)(0)發(fā)表于2009/10/1621:42:131程序調(diào)試記錄2009年10月16日星期五19:44:43程序調(diào)試一、調(diào)試目的在前兩天編寫的shell程序中,出了這么一個(gè)問題:shell程序從消息隊(duì)列讀取按鍵,當(dāng)讀取到enter鍵

35、時(shí),進(jìn)入命令執(zhí)行狀態(tài);命令執(zhí)行完成后,回到輸入態(tài),繼續(xù)讀取按鍵。但是實(shí)際執(zhí)行過程中發(fā)現(xiàn),如果輸入錯(cuò)誤命令,程序正常執(zhí)行;但是輸入正確命令執(zhí)行完成以后,會(huì)進(jìn)入一個(gè)讀取按鍵的死循環(huán)。通過簡單調(diào)試發(fā)現(xiàn),是消息隊(duì)列那里出了問題,今天的調(diào)試就從消息隊(duì)列開始。二、ucos的消息隊(duì)列1、它是如何創(chuàng)建的?在操作系統(tǒng)初始化時(shí),調(diào)用了OS_QInit(),該函數(shù)主要是初始化了OSQFreeList=&OSQTbl0;并且把各個(gè)消息隊(duì)列控制塊鏈接起來。然后應(yīng)用程序調(diào)用OS_QCreate()創(chuàng)建自己的消息隊(duì)列,提供的參數(shù)兩個(gè):一個(gè)是事件控制塊,事件控制塊包括一類型、指針、等待任務(wù)列表等;一個(gè)是消息指針數(shù)組。創(chuàng)建的過

36、程大概是這樣:取出一個(gè)事件控制塊,類型設(shè)置為消息隊(duì)列,取出一個(gè)隊(duì)列控制塊,讓事件控始化。pq-OSQStartpq-OSQEndpq-OSQInpq-OSQOutpq-OSQSizepq-OSQEntries2、消息發(fā)到消息隊(duì)列制塊的指針指向它。然后隊(duì)列控制塊有讀指針、寫指針、消息數(shù)量、隊(duì)列容量等參數(shù)進(jìn)行初=start;/*Initializethequeue*/=&startsize;=start;=start;=size;=0;程序調(diào)用OS_QPost()函數(shù)將消息發(fā)送到隊(duì)列,實(shí)際上消息內(nèi)容需要程序自己提供內(nèi)存,消息隊(duì)列接受內(nèi)容的指針,將它復(fù)制到消息指針數(shù)字里,同時(shí)調(diào)整寫指針,指向下一個(gè)消

37、息指針。*pq-OSQIn+=pmsg;/*Insertmessageintoqueue*/pq-OSQEntries+;3、從消息隊(duì)列取數(shù)據(jù)程序調(diào)用OS_QPend()函數(shù)從消息隊(duì)列取消息,實(shí)際上是得到一個(gè)指針,然后根據(jù)指針取到相應(yīng)的內(nèi)容,同時(shí)還要調(diào)整隊(duì)列控制塊的讀指針和有效消息數(shù)。pq=(OS_Q*)pevent-OSEventPtr;/*Pointatqueuecontrolblock*/if(pq-OSQEntries0)/*Seeifanymessagesinthequeue*/pmsg=*pq-OSQOut+;/*Yes,extractoldestmessagefromtheque

38、ue*/pq-OSQEntries-;當(dāng)然,如果沒有消息,那就在該隊(duì)列上等待。三、調(diào)試過程1、觀察事件控制塊的參數(shù)變化我定義的事件控制塊為KeyValueOSQ,先把它加到觀察列表。在出問題的地方之前設(shè)置一個(gè)斷點(diǎn),起動(dòng)調(diào)試。輸入一個(gè)正確的命令,程序執(zhí)行輸出:輸入help,屏幕顯示shell支持的其他三個(gè)命令。最后觀察KeyValueOSQ:它的隊(duì)列控制塊指針為0x2000,0df0.同時(shí)把消息指針數(shù)組加到觀察列表。進(jìn)入KB_GetChar()函數(shù)的內(nèi)部,調(diào)用OS_QPend()從消息隊(duì)列取數(shù)據(jù),一進(jìn)去,發(fā)現(xiàn)if(perr=(INT8U*)0)/*Validateperr*/return(voi

39、d*)0);是由于這句話因此返回一個(gè)無效指針。Perr沒有有效地址。解決辦法:將它設(shè)置為一個(gè)全局變量。2、最終的解決方案開始定義u8*|個(gè)隨即的值。改為u8Err,然后在調(diào)用OS_QPend時(shí)采用參數(shù),&Err,程序正常運(yùn)行。四、收獲1、調(diào)試過程中要做好計(jì)劃,先確定故障的范圍,一般來說,結(jié)合程序的輸出表現(xiàn)、單步調(diào)試可以確定故障點(diǎn)。2、指針的使用一定要注意:使用之前必須先初始化,比如這個(gè)程序中我定義了u8*perr。然后在程序中直接調(diào)用KeyPtr=OS_QPend(KeyValueOSQ,0,perr);這是一個(gè)還未賦值和初始化的指針,它的值是隨機(jī)的,當(dāng)它變?yōu)?后,這個(gè)程序的運(yùn)行就不正常了。改

40、為:u8Err定義,然后這樣調(diào)用KeyPtr=OS_QPend(KeyValueOSQ,0,&Err),程序的運(yùn)行就恢復(fù)正常了。系統(tǒng)分卷區(qū)用戶分智林STM32之人機(jī)界面標(biāo)C語言,指來原類:式|類:篇|簽:針|源:創(chuàng)|點(diǎn)擊查看原文發(fā)表評(píng)論閱讀全文(232)|回復(fù)(0)發(fā)表于2009/10/1618:12:021智林STM32開發(fā)板上實(shí)現(xiàn)的簡單人機(jī)界面之二國楊屹的為uCOS51增加Shell界面hell工程,智林STM32下使用,實(shí)現(xiàn)了四個(gè)命令:help-用于顯示其他可用命令,cls-用于清屏,ledon-點(diǎn)亮開發(fā)板上的綠色指示燈,ledoff-關(guān)閉指示燈。有智林STM32板的朋友可以下載使用。2

41、009年10月14日星期三19:51:18人機(jī)交互程序編寫過程一、參考的文獻(xiàn)上次的計(jì)劃里已經(jīng)說明了此次編寫的目標(biāo),ommandShell。參考的文獻(xiàn)主要是楊屹的為好。我會(huì)把我編寫過程中的一些想法記錄在此,友可以閱讀參考。這個(gè)人機(jī)交互程序?qū)嶋H上就是一個(gè)簡單的CuCOS51增加Shell界面這篇文章,寫得很然后也會(huì)上傳楊屹的這篇文章,有興趣的朋、編寫Shell的準(zhǔn)備工作1、我這個(gè)命令界面要在開發(fā)板的按鍵和液晶顯示的基礎(chǔ)上實(shí)現(xiàn),而楊屹的Shell是在串口上實(shí)現(xiàn)。這里共同的地方是:不管字符來自按鍵還是來自串口,都是通過同樣的函數(shù)接口將KB字符先存儲(chǔ)到緩沖區(qū),這樣使得Shell接口的可移植性提高。我這里

42、使用后在使用串口的時(shí)候,這個(gè)函數(shù)可以更名為Uart_GetChar(),對(duì)于上層程序來說,它提供了近似的接口。2、shell任務(wù)采用軟件狀態(tài)機(jī)實(shí)現(xiàn),以下是已詳細(xì)注釋的源代碼:switch(CmdState)根據(jù)狀態(tài)機(jī)進(jìn)行散轉(zhuǎn)caseStateinput:/如果處于輸入狀態(tài)CharIn=(char)KB_GetChar();讀取輸入按鍵if(CharIn=n)/如果按下了Enter鍵,它是觸發(fā)軟件狀態(tài)機(jī)從輸入態(tài)/進(jìn)入命令解釋執(zhí)行態(tài)的關(guān)鍵。CmdBufCharCount=0;/CharCount=輸入字符的數(shù)字,命令緩沖區(qū)以0結(jié)束Shell_PutChar(Charin);顯示器上回顯換行if(C

43、harCount=0)/之前沒有輸入字符,就是平白按了一下EnterShell_PutString(sh);重新顯示命令提示符,仍在輸入態(tài)下循環(huán)elseCmdState=StateExe;/如果輸入過字符,進(jìn)入命令解釋態(tài)CharCount=0;elseif(CharIn=b)如果輸入退格鍵if(CharCount=0)/之前沒有輸入字符,按退格不能理他Buzzer_Beep();警告,已經(jīng)退回提示符了,再退就:了。elseCharCount-=1;有效字符數(shù)減去1.Shell_PutChar(CharIn);/讓字符界面自己處理退格鍵else如果是其他鍵CmdBufCharCount=Char

44、In;將字符存入緩沖區(qū)當(dāng)前位置CharCount+=1;/緩沖區(qū)位置向前移動(dòng)if(CharCount=CharMaxCount+1)/如果超過了,這個(gè)字符現(xiàn)在占據(jù)最后一個(gè)位置CharCount=CharMaxCount;使當(dāng)前位置保持為最后一個(gè),等待Enter。Buzzer_Beep();這個(gè)字符也不向字符界面輸出,而是產(chǎn)生警告)else(Shell_PutChar(CharIn);將有效字符輸出。)break;caseStateExe:/如果處于命令執(zhí)行態(tài)CmdStr=ParseCmdBuf(CmdBuf);解析命令緩沖區(qū),得到命令結(jié)構(gòu)信息,我這里還只支持簡單命令/所以處理很簡單,直接獲得命

45、令字符串,以后可以擴(kuò)展。for(CmdIndex=0;CmdIndex4;CmdIndex+)/在命令表里搜索對(duì)應(yīng)命令字符串CompResult=strcmp(CmdStr,CmdStrTableCmdIndex);/命令字符串比較的結(jié)果if(CompResult=0)/如果在字符串表里找到。返回0.break;/此時(shí)CmdIndex對(duì)應(yīng)的值為命令在命令表里的索引。if(CmdIndex);break;三、實(shí)際效果最終實(shí)現(xiàn)的四個(gè)命令是:help-用于顯示其他可用命令,cls-用于清屏,ledon-點(diǎn)亮開發(fā)板上的綠色指示燈,ledoff-關(guān)閉指示燈。命令都能正確執(zhí)行,也能識(shí)別不正確的命令,但是每

46、次執(zhí)行一次正確命令,獲取按鍵的程序就進(jìn)入死循環(huán),再不能輸入新的命令。問題正在調(diào)試過程中o系統(tǒng)分聯(lián)人用戶分智林STM32之人機(jī)界標(biāo)智林,STM32,人機(jī)交來原類:芭|類:面篇|簽:互,shell|源:創(chuàng)|點(diǎn)擊查看原文發(fā)表評(píng)論閱讀全文(310)|回復(fù)(0)發(fā)表于2009/10/1420:34:111人機(jī)交互程序的編制計(jì)劃022009年10月14日星期三19:51:18人機(jī)交互程序的編制計(jì)劃020、前言前面的程序?qū)崿F(xiàn)英文字符的輸入,但是在程序內(nèi)部沒有任何對(duì)輸入信息的處理,今天編制的這個(gè)計(jì)劃是要做一個(gè)很簡單的Shell命令接口,能夠?qū)τ脩舻暮唵蚊钭龀鎏幚怼?、要達(dá)到的目標(biāo)。(1)能夠識(shí)別簡單的命令:

47、這里先實(shí)現(xiàn)這么幾條指令,ledon-點(diǎn)亮開發(fā)板上的綠色指示燈,ledoff-關(guān)閉指示燈,cls-清屏,只顯示命令提示符,hello-顯示hello,stm32sworld.總共這四條指令。2、實(shí)現(xiàn)的步驟。(1)首先修改之前工程文件里的按鍵信息處理任務(wù),task_keyhandler,使之成為一個(gè)函數(shù)KB_GetChar(),這個(gè)函數(shù)將由命令回顯和執(zhí)行的任務(wù)Task_CmdShell()調(diào)用取得按鍵的輸入值。(2) Task_CmdShell()主要需要完成的任務(wù)是:不斷從鍵盤獲取字符,當(dāng)接受到ENTER按鍵時(shí),認(rèn)為命令的輸入已經(jīng)完成,接下來在能夠?qū)崿F(xiàn)的命令數(shù)組里查找相應(yīng)的命令,若有對(duì)應(yīng)命令,則

48、調(diào)用相應(yīng)的函數(shù)完成命令。(3) Task_CmdShell()的主體部分采用狀態(tài)機(jī)實(shí)現(xiàn)-這是我比較喜歡的軟件處理方式,結(jié)合操作系統(tǒng)的時(shí)間管理和通信功能,能夠?qū)崿F(xiàn)比較復(fù)雜的任務(wù)處理。命令解釋器有兩種狀態(tài):一個(gè)是輸入態(tài),不斷地PendOn消息隊(duì)列,取出按鍵值,存入命令緩沖字符數(shù)組,當(dāng)收到ENTER時(shí),轉(zhuǎn)入命令態(tài)進(jìn)行處理。一個(gè)是命令解釋態(tài):首先從命令緩沖字符數(shù)組取得命令,進(jìn)行必要的格式化處理,(暫時(shí)不支持參數(shù)輸入,也不支持括號(hào)、斜杠等輸入),然后執(zhí)行相應(yīng)的命令后,重新回到命令提示符下。系統(tǒng)分嵌入用戶分智林STM32之人機(jī)界標(biāo)智林,STM32,人機(jī)交來原類:心|類:面篇|簽:互,shell|源:創(chuàng)|點(diǎn)

49、擊查看原文發(fā)表評(píng)論閱讀全文(276)|回復(fù)(0)發(fā)表于2009/10/1318:04:21人機(jī)界面程序之一的小改進(jìn)2009年10月13日星期二17:59:23前面發(fā)布的那個(gè)程序,沒有光標(biāo)指示,在程序里我早就寫了顯示光標(biāo)的函數(shù),但是存在一些BUG,所以把光標(biāo)顯示的部分沒有使用。剛才調(diào)試了一會(huì)兒,把很明顯的BUG去掉了,因此現(xiàn)在重新發(fā)布一個(gè)。感覺現(xiàn)在有了光標(biāo)指示,輸入字符很舒服啊。可惜還沒有想到如何實(shí)現(xiàn)光標(biāo)的閃爍,如果大家有好的想法,可以在下面留言啊。吃飯去也!系統(tǒng)分卷入用戶分智林STM32之人機(jī)界標(biāo)智林,STM32,輸入,顯來原類:山|類:皿|簽:丕|源:創(chuàng)|點(diǎn)擊查看原文發(fā)表評(píng)論閱讀全文(339

50、)|回復(fù)(1)發(fā)表于2009/10/1317:23:141智林一STM32開發(fā)板上實(shí)現(xiàn)的簡單人機(jī)界面之一STM32工程文件如果有智林STM32開發(fā)板的朋友可以下載使用,利用按鍵輸入英文,在屏幕上顯示。2009年10月12日星期一16:12:45標(biāo)題:簡單人機(jī)接口程序設(shè)計(jì)一、工作環(huán)境1、智林STM32開發(fā)板。2、已經(jīng)移植好的ucosiiV2.86操作系統(tǒng)環(huán)境。二、設(shè)計(jì)目標(biāo)。在前面的一篇文章人機(jī)接口程序的編制計(jì)戈【J01里已經(jīng)描述了界面功能、程序框架,現(xiàn)在就開始吧。三、步驟1、利用前面已有的工程進(jìn)行修改,保留四個(gè)任務(wù):開始任務(wù)、鍵盤掃描任務(wù)、按鍵處理任務(wù)和顯示任務(wù),其它的不用的都刪掉,使程序結(jié)構(gòu)更

51、清晰。2、調(diào)整工程的組,建立五個(gè)組:startup,ucos_stm32,ucos,shell,userapp。Startup里加入兩個(gè)文件:起動(dòng)文件和庫文件ucos_stm32:放入ucos在STM32上移植的兩個(gè)文件。Uses:操作系統(tǒng)的源文件Shell:放入LCD驅(qū)動(dòng)文件和字符顯示文件Userapp:包括中斷程序、系統(tǒng)初始化程序和用戶主程序文件,另外每個(gè)用戶任務(wù)使用一個(gè)C文件。3、先進(jìn)行鍵盤掃描任務(wù)設(shè)計(jì):該鍵盤掃描程序的作用:實(shí)現(xiàn)了數(shù)字、字符鍵的單擊和連擊,而系統(tǒng)鍵PB2和PB3則只在按下時(shí)發(fā)送按下信息。PB2用于模式切換,PB3表示ENTER。最終作為回車換行處理。4、接下來進(jìn)行按鍵消

52、息處理任務(wù)的設(shè)計(jì)如果為字符輸入按鍵,則根據(jù)當(dāng)前模式和按鍵消息值從表中取得相應(yīng)的ascii字符。如果按下PB2,則進(jìn)行模式的切換。這個(gè)任務(wù)設(shè)計(jì)下來,發(fā)現(xiàn)沒有使用顯示任務(wù)的必要,在按鍵消息處理任務(wù)中可以直接調(diào)用Shell_PutChar函數(shù)進(jìn)行輸入字符的顯示。5、進(jìn)行液晶顯示函數(shù)的修改對(duì)外輸出的函數(shù)主要有:voidLCD_Init(void);液晶初始化函數(shù)voidLCD_ClearScreen(void);用背景色進(jìn)行清屏voidLCD_FillScreen(u16ColorData);用指定顏色清屏voidLCD_SetPixel(u16x,u16y,u16ColorData);/設(shè)置點(diǎn)的顏色

53、voidLCD_PutChar(u16x,u16y,u8c,u16ForeColor,u16BackColor);輸出字符在字符輸出模式下,主要用到第五個(gè)函數(shù)。6、進(jìn)行字符輸入函數(shù)的編寫。主要編寫了這么幾個(gè)函數(shù):voidShell_PutChar(u8CharValue);/偉俞出字符函數(shù)voidShell_PutCharC010r(u8CharValue,u16FColor,u16BColor);/輸出指定前景色和背景色的字符voidShell_PutString(u8*Str);/在當(dāng)前位置輸出字符串voidShell_PutStrPos(u16Col,u16Row,u8*Str);/在指定位置輸出字符,并不改變光標(biāo)位置。voidShell_PutStrColor(u8*Str,u16FColor,u16BColor);輸出指定顏色字符串。voidShell_PutStrPC(u16Col,u16Row,u8*Str,u16FColor,u16BColor);前兩者綜合。四、最終效果在屏幕上留出一欄顯示CPU利用率,現(xiàn)在的輸入模式(五個(gè)按鍵對(duì)應(yīng)abcd還是efgh)。剩下的7欄用于顯示字符,可以輸入所有的小寫字母,可用輸入逗號(hào)和句號(hào),空格,可以實(shí)現(xiàn)退格。每輸入一個(gè)字符,系統(tǒng)內(nèi)部光標(biāo)往前移動(dòng)。系統(tǒng)復(fù)位以后,屏幕顯示

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論