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

下載本文檔

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

文檔簡介

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

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

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

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

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

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

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

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

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

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

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

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

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;無奇偶校驗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ù)對串口1進行初始化*/USART1-BRR=0x0271;/*庫函數(shù)的串口波特率計算有些問題,這里重新計算了一下*/*使能串口1*

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

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

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

19、的存儲器。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ā)板上各個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);/對A口初始化/*配置PB5為輸出推挽方式,控制一個小綠燈*/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ū)動函數(shù)中實現(xiàn)直接設(shè)置,PC0-PC12*/系統(tǒng)分諭人用戶分智林STM32之人機界標智林,STM32,源代碼,整來原類:且|類:回曳|簽:H|源:創(chuàng)|點擊查看原文發(fā)表評論閱讀全文(308)|回復(fù)(0)發(fā)表于2009/10/1716:45:061智林STM32程序源代

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

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

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

26、DY)=RESET);RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);/選擇PLL作為系統(tǒng)時鐘while(RCC_GetSYSCLKSource()!=0x08);/*等待PLL作為系統(tǒng)時鐘標志位置位*/*使能外部相關(guān)部件的時鐘,包括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);使能三個IO口時鐘RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);/使能IO復(fù)用功能時鐘RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);使能串口1時鐘二、NVIC的配置1、NVIC它是指嵌套向量中斷控制器。中斷的數(shù)目與向量表的大小相關(guān)。加上保留的,每個向量占據(jù)4個字節(jié),一共占據(jù)0x0000,00EC個字節(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)先級,4位子優(yōu)先級*/NVIC_PriorityGroupConRg(NVIC_PriorityGroup_0);/STM32共有四位數(shù)字進行優(yōu)先級選擇系統(tǒng)分卷人用戶分

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

30、開發(fā)板配置分析1、PA口PA0對應(yīng)按鍵PB3,開發(fā)板右下角。PA1用于模擬電位器,JP1在這里。PA2用定時器的PWM產(chǎn)生液晶的背光電源。PA4-PA7用于SPI模式操作SD卡。PA9,PA10用于串口0通信。PA11,PA12是USB差分線。PA13、PA14、PA15是JTAG的三個腳。PA3、PA8沒用到。2、PB口PB0用于揚聲器,PB2與JP4用于Boot1選擇。PB3和PB4是JTAG的另外兩個腳。PB5控制綠色指示燈,在SD卡上面。PB6、PB7用于I2C的存儲器。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的連接斷開控制,低電平主機能檢測到,高電平斷開連接,JP3可直接控制連接。另外還有BOOT0腳,模式受控于JB5。下面還有復(fù)位引腳。這里5個腳加上上面48個,共53個引腳。5、電源口共11個腳,還有電池引腳。到這里,開發(fā)板的IO配置基本已經(jīng)很清晰了。三、初始化配置程序的編寫程序中采用ucos操作系統(tǒng),在調(diào)用OS_Init()之前,先調(diào)用BSP_Config()進行開發(fā)板IO配置工作。

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

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

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

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

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

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

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

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

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

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

42、使用后在使用串口的時候,這個函數(shù)可以更名為Uart_GetChar(),對于上層程序來說,它提供了近似的接口。2、shell任務(wù)采用軟件狀態(tài)機實現(xiàn),以下是已詳細注釋的源代碼:switch(CmdState)根據(jù)狀態(tài)機進行散轉(zhuǎn)caseStateinput:/如果處于輸入狀態(tài)CharIn=(char)KB_GetChar();讀取輸入按鍵if(CharIn=n)/如果按下了Enter鍵,它是觸發(fā)軟件狀態(tài)機從輸入態(tài)/進入命令解釋執(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;/如果輸入過字符,進入命令解釋態(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ū)位置向前移動if(CharCount=CharMaxCount+1)/如果超過了,這個字符現(xiàn)在占據(jù)最后一個位置CharCount=CharMaxCount;使當(dāng)前位置保持為最后一個,等待Enter。Buzzer_Beep();這個字符也不向字符界面輸出,而是產(chǎn)生警告)else(Shell_PutChar(CharIn);將有效字符輸出。)break;caseStateExe:/如果處于命令執(zhí)行態(tài)CmdStr=ParseCmdBuf(CmdBuf);解析命令緩沖區(qū),得到命令結(jié)構(gòu)信息,我這里還只支持簡單命令/所以處理很簡單,直接獲得命

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

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

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

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

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

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

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

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

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

溫馨提示

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

評論

0/150

提交評論