




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
ARMCortex-M3嵌入式控制技術(shù)
——基于STM32F103RCT6
STM32F103硬件系統(tǒng)與KEILMDK工程第七章
串口通信與聲碼器
TM32F103RCT6微控制器具有5個串口,其中USART1~3是帶有同步串行通信能力的同步異步串行口,而UART4~5是標(biāo)準(zhǔn)的異步串行通信口。本章將以STM32F103RCT6微控制器的USART2為例,介紹其片內(nèi)串口外設(shè)的工作原理,并借助實(shí)例詳細(xì)介紹串口通信的程序設(shè)計(jì)方法,包括串口發(fā)送數(shù)據(jù)和基于串口中斷服務(wù)函數(shù)接收數(shù)據(jù)的方法。1串口通信工作原理2STM32F103串口3
串口通信寄存器類型實(shí)例4串口通信庫函數(shù)類型實(shí)例5聲碼器7.1串口通信工作原理串口通信是指數(shù)據(jù)的各位按串行的方式沿一根總線進(jìn)行的通信方式,RS-232標(biāo)準(zhǔn)的UART串口通信是典型的異步雙工串行通信,通信方式如左圖所示。UART串口通信需要兩個引腳,即TXD和RXD,TXD為串口數(shù)據(jù)發(fā)送端,RXD為串口數(shù)據(jù)接收端。STM32F103微控制器的串口與計(jì)算機(jī)的串口按圖7-1的方式相連,串行數(shù)據(jù)傳輸沒有同步時鐘,需要雙方按相同的位傳輸速率異步傳輸,這個速率稱為波特率,常用的波特率有4800bps、9600bps和115200bps等。UART串口通信的數(shù)據(jù)包以幀為單位,常用的幀結(jié)構(gòu)為:1位起始位+8位數(shù)據(jù)位+1位奇偶校驗(yàn)位(可選)+1位停止位,如右圖所示。7.2STM32F103串口TM32F103RCT6微控制器共有5個串口,其中,USART1~3為帶同步串行通信功能的通用同步異步串行口,UART4~5為標(biāo)準(zhǔn)的異步串行通信口。這里以USART2工作在標(biāo)準(zhǔn)的異步串行通信方式下為例,介紹STM32F103RCT6微控制器的串口工作原理。7.2STM32F103串口串口USART2的基地址為0x40004400,其各個寄存器的情況如下所述。(1)串口數(shù)據(jù)寄存器USART_DR(偏移地址0x04)
32位的串口數(shù)據(jù)寄存器USART_DR只有第[8:0]位有效,用于發(fā)送串口數(shù)據(jù)時記為TDR,用于接收串口數(shù)據(jù)時記為RDR,TDR和RDR是映射到同一個地址的兩個物理寄存器,通過讀、寫指令來區(qū)分使用了哪個寄存器,即讀USART_DR時自動識別為RDR,寫USART_DR時自動識別為TDR。(2)波特率寄存器USART_BRR(偏移地址為0x08,復(fù)位值為0x0)
32位的波特率寄存器USART_BRR只有第[15:0]位域有效,其中,第[15:4]位域記為DIV_Mantissa[11:0],第[3:0]位域記為DIV_Fraction[3:0]。波特率的計(jì)算公式為:波特率=fck/(16×USART_DIV),而USART_DIV=DIV_Mantissa+DIV_Fraction/16,例如,對USART2而言,當(dāng)fck=PCLK1=32MHz時,如果波特率設(shè)為9600bps,則可配置DIV_Mantissa=208,DIV_Fraction=5;如果波特率設(shè)為115200bps,則可配置DIV_Mantissa=17,DIV_Fraction=6,實(shí)際波特率為115108bps,誤差為0.08%(可接收范圍內(nèi))。
(3)串口狀態(tài)寄存器USART_SR(偏移地址為0x0,復(fù)位值為0xC0)
32位的串口狀態(tài)寄存器USART_SR只有第[9:0]位有效,如表所示。位號名稱屬性含義31:10
保留9CTS可讀/可寫CTS標(biāo)志位。當(dāng)nCTS線路輸入跳變時,硬件置位,寫入0清零8LBD可讀/可寫LIN中止檢測標(biāo)志位。LIN中止發(fā)生后硬件置位,寫入0清零7TXE只讀發(fā)送數(shù)據(jù)寄存器空標(biāo)志位。TDR內(nèi)容傳給移位寄存器時硬件置1,寫DR寄存器清06TC可讀/可寫發(fā)送完成標(biāo)志位。發(fā)送完成硬件置1,寫入0清零(寫DR+讀SR也可清0)5RXNE可讀/可寫接收數(shù)據(jù)沒有就緒標(biāo)志位。接收數(shù)據(jù)準(zhǔn)備好時硬件置1,讀DR或?qū)?均可清零4IDLE只讀空閑線路檢測標(biāo)志位。空閑時自動置1,讀DR+讀SR可清零3ORE只讀溢出錯誤標(biāo)志位。接收溢出時硬件置1,讀DR+讀SR清零2NE只讀噪聲錯誤標(biāo)志位。接收的位在采樣時出現(xiàn)噪聲時則硬件置1,讀DR+讀SR可清零1FE只讀幀錯誤標(biāo)志位。幀錯誤發(fā)生時硬件置1,讀DR+讀SR可清零該位0PE只讀校驗(yàn)位錯誤標(biāo)志位。接收的數(shù)據(jù)校驗(yàn)錯誤時硬件置1,讀DR+讀SR可清零該位(4)串口控制寄存器USART_CR1(偏移地址為0x0C,復(fù)位值為0x0)
32位的串口控制寄存器USART_CR1只有第[13:0]位有效,如表所示位號名稱屬性含義31:14
保留13UE可讀/可寫USART有效位。寫入1開啟USART,寫入0關(guān)閉12M可讀/可寫字長位。為0表示8位數(shù)據(jù)位;為1表示9位數(shù)據(jù)位11WAKE可讀/可寫USART喚醒方式位。為0表示空閑位喚醒;為1表示最后有效數(shù)據(jù)位喚醒10PCE可讀/可寫校驗(yàn)控制位。為0表示無校驗(yàn);為1表示有校驗(yàn)9PS可讀/可寫校驗(yàn)選擇位。為0表示偶校驗(yàn);為1表示奇校驗(yàn)8PEIE可讀/可寫PE中斷有效位。為1表示校驗(yàn)位出錯觸發(fā)中斷,為0表示不觸發(fā)7TXEIE可讀/可寫TXE中斷有效位。為1表示發(fā)送數(shù)據(jù)進(jìn)入移位寄存器后觸發(fā)中斷,為0表示不觸發(fā)6TCIE可讀/可寫發(fā)送完成中斷有效位。為1表示發(fā)送數(shù)據(jù)完成后觸發(fā)中斷,為0表示不觸發(fā)5RXNEIE可讀/可寫RXNE中斷有效位。為1表示接收數(shù)據(jù)就緒或溢出時觸發(fā)中斷,為0表示不觸發(fā)4IDLEIE可讀/可寫空閑中斷有效位。為1表示空閑將觸發(fā)中斷,為0表示不觸發(fā)3TE可讀/可寫發(fā)送有效位。為0表示關(guān)閉發(fā)送單元;為1表示開啟發(fā)送單元2RE可讀/可寫接收有效位。為0表示關(guān)閉接收單元;為1表示開啟接收單元1RWU可讀/可寫接收喚醒位。為0表示接收處于活躍模式下;為1表示處于靜默模式下0SBK可讀/可寫發(fā)送中止符位。為1表示中止符將被發(fā)送,為0表示不發(fā)送中止符綜上所述,可知串口的操作主要有如下3種:(1)串口初始化串口初始化包括3個主要的操作,即配置串口通信的波特率、設(shè)置串口數(shù)據(jù)幀的格式以及開啟串口接收中斷等。對于STM32F103RCT6,還應(yīng)通過寄存器USART_CR1打開接收單元和發(fā)送單元。(2)發(fā)送數(shù)據(jù)串口發(fā)送數(shù)據(jù)一般通過函數(shù)調(diào)用實(shí)現(xiàn),發(fā)送數(shù)據(jù)前應(yīng)先判斷前一個發(fā)送的數(shù)據(jù)是否發(fā)送完成,即判斷USART_SR寄存器的TC位是否為1,如果為1表示前一個數(shù)據(jù)發(fā)送完成,則可以啟動本次數(shù)據(jù)發(fā)送。發(fā)送數(shù)據(jù)只需要將待發(fā)送的數(shù)據(jù)寫入串口數(shù)據(jù)寄存器USART_DR中,發(fā)送單元會按擬定的波特率將數(shù)據(jù)串行發(fā)送出去。(3)接收數(shù)據(jù)串口接收數(shù)據(jù)一般通過串口接收中斷實(shí)現(xiàn),需要開啟串口接收中斷,當(dāng)接收到新的數(shù)據(jù)就緒時,在串口中斷服務(wù)函數(shù)中讀取串口接收到的數(shù)據(jù)。7.3串口通信寄存器類型實(shí)例在STM32F103RCT6學(xué)習(xí)板上,PA2和PA3口通過網(wǎng)標(biāo)TXD232和RXD232與串口電平芯片ST3232的T2IN和R2OUT管腳相連,參考第2章圖3-2和圖3-6。本節(jié)將討論寄存器類型的串口USART2通信實(shí)例。具體實(shí)現(xiàn)步驟如下所示:(1)在工程PRJ13的基礎(chǔ)上,新建工程“PRJ15”,保存在目錄“D:\STM32F103RCT6PRJ\PRJ15”下。此時的工程PRJ15與PRJ13完全相同。(2)新建文件uart2.c和uart2.h,保存在目錄“D:\STM32F103RCT6PRJ\PRJ15\BSP”下。代碼:代碼:代碼:代碼:添加文件uart2.c到工程管理器的“BSP”分組下編譯鏈接和運(yùn)行工程PRJ15,同時在計(jì)算機(jī)端打開串口調(diào)試助手,其顯示結(jié)果如圖所示。在圖中,點(diǎn)擊“手動發(fā)送”,即將“DEF”三個字符由計(jì)算機(jī)發(fā)送給STM32F103RCT6開發(fā)板,然后,開發(fā)板的STM32F103RCT6微控制器將這三個字符再回送給上位機(jī)(這里表示計(jì)算機(jī))。工程PRJ15的運(yùn)行流程7.4串口通信庫函數(shù)類型實(shí)例本節(jié)介紹庫函數(shù)類型的串口通信工程實(shí)例,與寄存器類型工程PRJ15實(shí)現(xiàn)相同的功能,具體建設(shè)步驟如下:(1)在工程PRJ14的基礎(chǔ)上,新建工程“PRJ16”,保存在目錄“D:\STM32F103RCT6PRJ\PRJ16”下。此時的工程PRJ16與工程PRJ14完全相同。(2)新建文件uart2.c和uart2.h,保存在目錄“D:\STM32F103RCT6PRJ\PRJ16\BSP”下。代碼:代碼:代碼:將文件uart2.c添加到工程管理器的“BSP”分組下,將目錄“D:\STM32F103RCT6PRJ\PRJ16\STM32F10x_FWLib\src”下的文件stm32f10x_usart.c添加到工程管理器的“LIB”分組下。7.4聲碼器聲碼器SYN6288是一種中文語音合成芯片,通過硬件的形式實(shí)現(xiàn)了將中文文本轉(zhuǎn)化為語音(TTS)。一般地,上位機(jī)(這里指ARM微控制器)通過串口將文本數(shù)據(jù)發(fā)送到SYN6288,然后,SYN6288通過文本(包括漢字、數(shù)字和字母等)的編碼值,在語音庫中查找其數(shù)字形式存儲的發(fā)音,再通過片內(nèi)的數(shù)模轉(zhuǎn)換器(還集成了數(shù)字濾波器等)將數(shù)字形式的語音轉(zhuǎn)換為模擬語音信號,并送出模擬語音信號。SYN6288可以直接驅(qū)動8歐姆0.5W的揚(yáng)聲器。7.4.1聲碼器工作原理借助于網(wǎng)標(biāo)TXD_AUDIO和RXD_AUDIO,STM32F103RCT6微控制器的PA9和PA10管腳與SYN6288的RXD和TXD相連接。由于SYN6288的輸入端RXD為與標(biāo)準(zhǔn)的串口信號反向,所以,需要借助于一個反相器(這里使用了三極管S8050)連接TXD_AUDIO和RXD。在STM32F103RCT6微控制器中,PA9和PA10復(fù)用了USART1_TX和USART1_RX功能,即PA9和PA10可作為串口USART1的TXD和RXD端口。聲碼器SYN6288只能工作在波特率為9600bps、19200bps和38400bps下,并且要求串口數(shù)據(jù)格式為“1位起始位、8位數(shù)據(jù)位、無校驗(yàn)位、1位停止位”。因此,可配置STM32F103RCT6微控制器串口USART1工作在9600bps波特率下,然后,借助于串口USART1按照SYN6288規(guī)定的數(shù)據(jù)包協(xié)議向其發(fā)送文本數(shù)據(jù),實(shí)現(xiàn)文本數(shù)據(jù)的語音轉(zhuǎn)換與輸出。SYN6288的數(shù)據(jù)包格式包結(jié)構(gòu)包頭(1字節(jié))數(shù)據(jù)區(qū)長度數(shù)據(jù)區(qū)命令字(1字節(jié))命令參數(shù)(1字節(jié))文本數(shù)據(jù)異或校驗(yàn)碼(1字節(jié))數(shù)據(jù)0xFD0x000x??0x??0x??0x??0x??...0x??0x??說明固定為0xFD0x??為數(shù)據(jù)區(qū)的字節(jié)數(shù)見下表長度必須小于等于200字節(jié)全部數(shù)據(jù)(不含校驗(yàn)碼)的異或值包結(jié)構(gòu)包頭(1字節(jié))數(shù)據(jù)區(qū)長度數(shù)據(jù)區(qū)包結(jié)構(gòu)包頭(1字節(jié))數(shù)據(jù)區(qū)長度數(shù)據(jù)區(qū)命令字(1字節(jié))命令參數(shù)(1字節(jié))文本數(shù)據(jù)異或校驗(yàn)碼(1字節(jié))數(shù)據(jù)0xFD0x000x020x21無無0xDE查詢SYN6288的工作狀態(tài)“數(shù)據(jù)區(qū)”的控制命令格式數(shù)據(jù)區(qū)(長度小于等于203個字節(jié))命令字(1字節(jié))命令參數(shù)(1字節(jié))文本(最多200字節(jié))異或校驗(yàn)碼(1字節(jié))取值含義高5位含義低3位含義0x01播放文本可取值0,1,2,...,15中的任一值當(dāng)取值為0時,無背景音樂;當(dāng)取值為1至15中的某一數(shù)k時,播放編號為k的背景音樂0文本采用GB2312編碼要轉(zhuǎn)化為語音的文本全部數(shù)據(jù)(含包頭、表示數(shù)據(jù)區(qū)長度的2個字節(jié)、命令字、命令參數(shù)和文本,不含異或校驗(yàn)碼)的異或值1文本采用GBK編碼2文本采用BIG5編碼3文本采用UNICODE碼0x31設(shè)置波特率00000b0設(shè)置波特率為9600bps無文本1設(shè)置波特率為19200bps2設(shè)置波特率為38400bps0x02停止播放無參數(shù)0x03暫停播放0x04繼續(xù)播放SYN6288配置波特率數(shù)據(jù)包SYN6288播放控制的數(shù)據(jù)包波特率(bps)數(shù)據(jù)包96000xFD0x000x030x310x000xCF192000xFD0x000x030x310x010xCE384000xFD0x000x030x310x020xCD播放控制數(shù)據(jù)包停止播放0xFD0x000x020x20xFD暫停播放0xFD0x000x020x030xFC繼續(xù)播放0xFD0x000x020x040xFB轉(zhuǎn)義文本表序號轉(zhuǎn)義文本含義1[v?]這里的“?”可取值為0至16,表示播放文本的音量大小,0為靜音,16為最大音量,默認(rèn)為“[v10]”2[m?]這里的“?”可取值為0至16,表示播放背景音樂的音量大小,0為靜音,16為最大音量,默認(rèn)為“[m4]”3[t?]這里的“?”可取值為0至5,表示語速,0為最慢,5為最快,默認(rèn)為“[t4]”4[n?]數(shù)字的發(fā)音方式,這里的“?”可取值為0至2,為1表示數(shù)字單個發(fā)音(例如“12”發(fā)音為“一二”,為2表示相鄰數(shù)字合成為數(shù)值發(fā)音(例如“12”發(fā)音為“十二”),為0表示自動識別,默認(rèn)為“[n0]”5[y?]數(shù)字1的讀法,“?”只能取值0或1,為0時,“1”讀“幺”;為1時,“1”讀“一”,默認(rèn)為“[y0]”6[o?]文本朗讀方式,“?”只能取值0或1,為0時,自然朗讀;為1時,逐字發(fā)音,默認(rèn)為“[o0]”7[r][r]后面緊跟的漢字按姓氏發(fā)音,用于多音字的情況8[2][2]后緊跟的兩個漢字聯(lián)合成一個詞語發(fā)音,中間無停頓9[3][3]后緊跟的三個漢字聯(lián)合成一個詞語發(fā)音,中間無停頓聲碼器SYN6288支持4種文本編碼體系,即GB2312、GBK、BIG5和Unicode。如果使用KeilMDK編程環(huán)境,建議使用GB2312或GBK(GBK包括了GB2312)。大多數(shù)情況下,GB2312已經(jīng)能滿足日常需求了,GB2312包括半角ASCII碼(編碼范圍為0x00~0x7F)、全角符號(編碼范圍為0xA1A0~0xA3FE)和6768個漢字(編碼范圍為0xB0A1~0xF7FE)。程序員無需去查閱文本的編碼值,KeilMDK自動將漢字轉(zhuǎn)化為其編碼形式存儲。7.4.2聲碼器寄存器類型實(shí)例在工程PRJ15的基礎(chǔ)上新建工程PRJ17,保存在“D:\STM32F103RCT6PRJ\PRJ17”目錄下,此時的工程PRJ17與PRJ15完全相同。然后,編寫程序文件syn6288.c和syn6288.h,并修改文件includes.h、bsp.c和tim2.c。接著,將文件syn6288.c添加到工程管理器的BSP分組下。代碼:代碼:工程PRJ17實(shí)現(xiàn)的功能框圖7.4.3聲碼器庫函數(shù)類型實(shí)例本小節(jié)介紹庫函數(shù)類型的聲碼器驅(qū)動程序,與工程PRJ17實(shí)現(xiàn)相同的功能。具體建設(shè)步驟如下:(1)在工程PRJ16的基礎(chǔ)上,新建工程PRJ18,保存在目錄“D:\STM32F103RCT6PRJ\PRJ18”下。此時的工程PRJ18與工程PRJ16完全相同。(2)新建syn6288.c和syn6288.h文件,保存在“D:\STM32F103RCT6PRJ\PRJ18\BSP”目錄下代碼:代碼:代碼:第八章
存儲器管理目錄SRAM存儲器EEPROM存儲器FLASH存儲器本章小結(jié)通過網(wǎng)標(biāo)USER_ADC0_CH7,PA0口連接到滑動變阻器的分壓輸出端。通過調(diào)節(jié)滑動變阻器VR1,其分壓輸出端可輸出0~3.3V的電壓,該模擬電壓信號被送到STM32F103RCT6的ADC模塊,進(jìn)行模數(shù)轉(zhuǎn)換后,得到電壓值。8.1SRAM存儲器23STM32F103RCT6微控制器內(nèi)置了3個12-bit的ADC模塊,最高采樣速率為1MSPS,具有常規(guī)方式和注入方式等多種工作模式。在STM32F103RCT6學(xué)習(xí)板上,用10kΩ滑動變阻器輸出0~3.3V模擬電壓送給STM32F103RCT6微控制器的ADC通道0輸入端,如圖3-2和圖3-10所示。ADC通道0復(fù)用了管腳PA0,需要將PA0配置為ADC123_IN0功能。ADC模塊時鐘最大可為14MHz,ADC模塊時鐘來自APB2總線(即PCLK2,16MHz),需配置時鐘配置寄存器RCC_CFGR的第[15:14]位域?yàn)?0b,表示對PCLK2二分頻后的8MHz時鐘信號供給ADC模塊。ADC工作原理4ADC模塊相關(guān)的寄存器列于下表中。ADC工作原理5下面介紹表中常用的寄存器的含義,其余寄存器請參考STM32F103RCT6用戶手冊。ADC控制寄存器CR1的各位含義如下表所示。ADC工作原理6ADC控制寄存器CR2的各位含義如下表所示。ADC工作原理7ADC工程實(shí)例在工程PRJ15的基礎(chǔ)上新建工程PRJ19,保存在“D:\STM32F103RCT6PRJ\PRJ19”目錄下,此時的工程PRJ19與PRJ15完全相同。然后,新建文件adc.c和adc.h,并修改includes.h、bsp.c、exti.c和tim2.c文件。其中,includes.h文件中需要添加對adc.h頭文件的包括,即添加以下一條語句:#include"adc.h"文件bsp.c的MyBSPInit初始化函數(shù)中(函數(shù)內(nèi)部末尾處,即在程序段7-4的第16行和第17行中間),插入以下一條語句:MyADCInit();即調(diào)用MyADCInit函數(shù)初始化模數(shù)轉(zhuǎn)換器ADC。8ADC工程實(shí)例文件exti.c的EXTI9_5_IRQHandler中斷服務(wù)函數(shù)中添加以下一條語句:MyADCStart();當(dāng)按下按鍵S18時點(diǎn)亮LED燈D10且同時調(diào)用MyADCStart函數(shù)啟動模數(shù)轉(zhuǎn)換。在文件tim2.c中將下面的語句注釋掉,即//if(i%6==0) //UART2PutString((Int08U*)"Running...\n");即不再通過串口2向上位機(jī)發(fā)送“Running…”的功能,其位置如下圖所示。將文件adc.c添加到工程管理器的BSP分組下。9工程PRJ19實(shí)現(xiàn)的功能如下圖所示,圖中只展示了工程PRJ19在工程PRJ15基礎(chǔ)上新添加的功能。ADC工程實(shí)例10在用戶按鍵S18的中斷服務(wù)函數(shù)EXTI9_5_IRQHandler中,添加了MyADCStart函數(shù),當(dāng)S18被按下時,將啟動STM32F103RCT6微控制器的ADC1轉(zhuǎn)換,當(dāng)模數(shù)轉(zhuǎn)換完成后,自動觸發(fā)ADC1中斷服務(wù)程序ADC1_2_IRQHandler,在其中讀取模擬電壓的數(shù)字信號量,保存在myadcv全局變量中,并進(jìn)一步調(diào)用MyADCValDisp函數(shù)將數(shù)字電壓通過串口2送到上位機(jī)(計(jì)算機(jī))顯示出來,其結(jié)果如右圖所示。ADC工程實(shí)例11下面詳細(xì)介紹文件myadc.c和myadc.h的內(nèi)容,分別如下面的程序段所示。ADC工程實(shí)例12ADC工程實(shí)例13ADC工程實(shí)例14下面介紹庫函數(shù)類型的ADC工程。在工程PRJ16的基礎(chǔ)上新建工程PRJ20,保存在“D:\STM32F103RCT6PRJ\PRJ20”目錄下,此時的工程PRJ20與PRJ16完全相同。然后,進(jìn)行如下的工作:(1)修改文件includes.h、bsp.c、exti.c和tim2.c,其中includes.h和bsp.c與工程PRJ19中的同名文件相同,即在includes.h的末尾添加“#include"adc.h"”,在bsp.c文件中的BSPInit函數(shù)內(nèi)部的末尾添加“MyADCInit();”。在exti.c文件的中斷服務(wù)函數(shù)EXTI9_5_IRQHandler中添加語句“MyADCStart();”,右面的程序段僅列舉了該中斷服務(wù)函數(shù)的內(nèi)容:ADC工程實(shí)例15(2)添加新文件adc.h和adc.c,其中adc.h與程序段8-2完全相同,文件adc.c如下面的程序段所示。ADC工程實(shí)例16ADC工程實(shí)例17(3)將adc.c文件添加到工程管理器的“BSP”分組下,將目錄“D:\STM32F103RCT6PRJ\PRJ20\STM32F10x_FWLib\src”下的文件stm32f10x_adc.c添加到工程管理器的“LIB”分組下,編譯鏈接并運(yùn)行工程PRJ20,其運(yùn)行結(jié)果與工程PRJ19相同。ADC工程實(shí)例8.2EEPROM存儲器1819AT24C128內(nèi)部ROM容量為131072b,即16384B,被分成256頁,每頁64B。因此,AT24C128的地址長度為14位(被稱為字地址),其中,8位用于頁尋址,6位用于頁內(nèi)尋址。AT24C128寫入數(shù)據(jù)方式有兩種,即整頁寫入數(shù)據(jù)和單個字節(jié)寫入數(shù)據(jù);其讀出數(shù)據(jù)方式有三種:當(dāng)前地址讀出數(shù)據(jù)、隨機(jī)地址讀出數(shù)據(jù)和順序地址讀出數(shù)據(jù)。為了節(jié)省篇幅,這里僅介紹常用的單個字節(jié)寫入數(shù)據(jù)和隨機(jī)地址讀出數(shù)據(jù)的編程方法,這兩種方法可以實(shí)現(xiàn)對AT24C128整個ROM空間任一地址的讀寫操作。單個字節(jié)寫入數(shù)據(jù)和隨機(jī)地址讀出數(shù)據(jù)的時序如下圖所示。EEPROM存儲器20STM32F103RCT6微控制器的I2C1接口模塊支持通過I2C通信協(xié)議訪問AT24C128芯片,此時,I2C1接口模塊工作在主模式下,如下圖所示。EEPROM存儲器21下面將討論上圖中各個寄存器的含義,如下面的表所示,I2C1模塊的基地址為0x40005400。EEPROM存儲器22本小節(jié)介紹訪問AT24C128存儲器的寄存器類型實(shí)例,其建設(shè)步驟如下:(1)在工程15的基礎(chǔ)上,新建工程“PRJ21”,保存在“D:\STM32F103RCT6PRJ\PRJ21”目錄下。此時的工程PRJ21與工程PRJ15完全相同,然后,進(jìn)行后續(xù)工作。(2)新建文件iic1.c和iic1.h,保存在目錄“D:\STM32F103RCT6PRJ\PRJ21\BSP”下,其源代碼如下面的程序段所示。訪問EEPROM寄存器類型實(shí)例23訪問EEPROM寄存器類型實(shí)例24訪問EEPROM寄存器類型實(shí)例25訪問EEPROM寄存器類型實(shí)例26訪問EEPROM寄存器類型實(shí)例27訪問EEPROM寄存器類型實(shí)例28訪問EEPROM寄存器類型實(shí)例(3)修改includes.h文件,其源代碼如右面的程序段所示。29訪問EEPROM寄存器類型實(shí)例(4)修改bsp.c文件,其源代碼如右面的程序段所示。30訪問EEPROM寄存器類型實(shí)例(5)修改main.c文件,其源代碼如右面的程序段所示。31訪問EEPROM寄存器類型實(shí)例(6)將文件iic1.c添加到工程管理器的“BSP”分組下。完成后的工程PRJ21如下圖所示。32訪問EEPROM寄存器類型實(shí)例在上圖中,編譯鏈接并在線仿真工程PRJ21,在程序段的第26行設(shè)定斷點(diǎn),運(yùn)行到斷點(diǎn)處后,可以得到如下圖所示的“Watch1”窗口結(jié)果。由圖可知,寫入AT24C128和讀出AT24C128的操作均正確。33訪問EEPROM庫函數(shù)類型實(shí)例本小節(jié)介紹訪問AT24C128的庫函數(shù)類型的工程實(shí)例,其建設(shè)步驟如下:(1)在工程PRJ16的基礎(chǔ)上,新建工程“PRJ22”,保存在目錄“D:\STM32F103RCT6PRJ\PRJ22”下。此時的工程PRJ22與工程PRJ16完全相同,然后,進(jìn)行后續(xù)工作。(2)新建文件iic1.c和iic1.h,保存在目錄“D:\STM32F103RCT6PRJ\PRJ22\BSP”下。34訪問EEPROM寄存器類型實(shí)例35訪問EEPROM寄存器類型實(shí)例36訪問EEPROM寄存器類型實(shí)例37訪問EEPROM寄存器類型實(shí)例(3)修改includes.h文件。(4)修改bsp.c文件。(5)修改main.c文件。(6)將文件iic1.c添加到工程管理器的“BSP”分組下,將目錄“D:\STM32F103RCT6PRJ\PRJ17\STM32F10x_FWLib\src”下的文件stm32f10x_i2c.c添加到工程管理器的“LIB”分組下。8.3FLASH存儲器3839FLASH存儲器STM32F103RCT6微控制器具有3個同步串行口,其中有2個復(fù)用了I2S協(xié)議接口。在STM32F103RCT6學(xué)習(xí)板上,SPI2口與FLASH存儲器W25Q64相連接。本節(jié)將以SPI2口為例詳細(xì)介紹SPI通信協(xié)議、工作時序和STM32F103RCT6微控制器通過SPI2口訪問Flash存儲器W25Q64的程序設(shè)計(jì)方法。40STM32F103同步串行口STM32F103RCT6微控制器的SPI2口具有4個功能引腳,其中STM32F103RCT6工作在主機(jī)模式,W25Q64為從機(jī)模式,各個功能引腳的定義如下表所示。41STM32F103同步串行口根據(jù)SPI2_SCK信號的時鐘極性CPOL和相位CPHA,SPI工作協(xié)議有4種工作模式。這里,設(shè)定CPOL=1和CPHA=1,此時SPI的工作時序如下圖所示(摘自STM32F103參考手冊)。42STM32F103同步串行口STM32F103RCT6微控制器的SPI模塊結(jié)構(gòu)如下圖所示。43STM32F103同步串行口下面詳細(xì)介紹SPI模塊的各個寄存器的情況。SPI2模塊的基地址為0x40003800,與APB1外設(shè)總線(最高36MHz,這里為32MHz)相連接。44STM32F103同步串行口45W25Q64訪問控制W25Q64為64Mb(即8MB)的串行接口FLASH存儲芯片,工作電壓為3.3V,與微控制器STM32F103RCT6的電路連接如圖3-7和圖3-2所示。當(dāng)采用標(biāo)準(zhǔn)SPI模式訪問W25Q64時,其各個引腳的含義為:CS表示片選輸入信號(低有效),CLK表示串行時鐘輸入信號,DI為串行數(shù)據(jù)輸入信號,DO為串行數(shù)據(jù)輸出信號,WP表示寫保護(hù)輸入信號(低有效),VCC和GND分別表示電源和地。STM32F103RCT6通過PB12、PB13(SPI2_SCK)、PB15(SPI2_MOSI)和PB14(SPI2_MISO)四根線實(shí)現(xiàn)對W25Q64的讀/寫訪問,指令、地址和數(shù)據(jù)在CLK上升沿通過DI線進(jìn)入W25Q64,而在SCK下降沿從W25Q64的DO線中讀出數(shù)據(jù)或狀態(tài)字。46W25Q64訪問控制W25Q64芯片容量為8MB,分為32768個頁,每個頁256B。向W25Q64芯片寫入數(shù)據(jù),僅能按頁寫入,即一次寫入一頁內(nèi)容。在寫入數(shù)據(jù)(稱為編程)前,必須首先對該頁擦除,然后才能向該頁寫入一整頁的內(nèi)容。對W25Q64的擦除操作可以基于扇區(qū)或塊,每個扇區(qū)包括16個頁,大小為4KB;每個塊包括8個扇區(qū),大小為32KB;甚至可以整片擦除。對W25Q64的讀操作,可以讀出任一地址的字節(jié),或一次讀出一個頁的內(nèi)容。W25Q64的編址分為頁地址(16位)和字節(jié)地址(8位),通過指定一個24位的地址,可以讀出該地址的字節(jié)內(nèi)容。47W25Q64訪問控制W25Q64具有2個8-bit的狀態(tài)寄存器:狀態(tài)寄存器1和狀態(tài)寄存器2。狀態(tài)寄存器1第0位為只讀的BUSY位,當(dāng)W25Q64為忙時,讀出該位的值為1;當(dāng)W25Q64空閑時,讀出該位的值為0。狀態(tài)寄存器1的第1位為只讀WEL位,當(dāng)可寫入時WEL為1,當(dāng)不可寫入時WEL為0。狀態(tài)寄存器1的第6:2位域均寫入0,表示非寫保護(hù)狀態(tài);第7位SRP0寫入1,該位與狀態(tài)寄存器2的第0位SRP1(該位寫入0),組合在一起表示可寫入模式。狀態(tài)寄存器2的第7:2位保留,終始為0;第1位為QE位,寫入0表示為標(biāo)準(zhǔn)SPI模式。因此,初始化W25Q64時,狀態(tài)寄存器1和2應(yīng)分別寫入0x80和0x00。48W25Q64訪問控制W25Q64具有27條操作指令,下面介紹常用的幾條,如下表所示。表中讀器件ID號指令讀出的W25Q64的ID號為0xEF16。49W25Q64訪問控制W25Q64整片擦除的工作流程如下圖所示。50W25Q64訪問控制W25Q64芯片4kB扇區(qū)擦除的工作流程如下圖所示。51W25Q64訪問控制W25Q64的頁編程工作流程如下圖所示。52訪問FLASH存儲器寄存器類型工程實(shí)例工程PRJ23的具體實(shí)現(xiàn)步驟如下:(1)在工程PRJ21的基礎(chǔ)上,新建工程“PRJ23”,保存在目錄“D:\STM32F103RCT6PRJ\PRJ23”下。此時的工程PRJ23與工程PRJ21完全相同,然后,進(jìn)行后續(xù)步驟。(2)新建文件spiflash.c和spiflash.h文件,保存在“D:\STM32F103RCT6PRJ\PRJ18\BSP”目錄下。53訪問FLASH存儲器寄存器類型工程實(shí)例54訪問FLASH存儲器寄存器類型工程實(shí)例55訪問FLASH存儲器寄存器類型工程實(shí)例56訪問FLASH存儲器寄存器類型工程實(shí)例57訪問FLASH存儲器寄存器類型工程實(shí)例58訪問FLASH存儲器寄存器類型工程實(shí)例59訪問FLASH存儲器寄存器類型工程實(shí)例60訪問FLASH存儲器寄存器類型工程實(shí)例(3)修改includes.h文件,如右面程序段所示。61訪問FLASH存儲器寄存器類型工程實(shí)例(4)修改bsp.c文件,如下面程序段所示。62訪問FLASH存儲器寄存器類型工程實(shí)例(5)修改main.c文件,如下面程序段所示。63訪問FLASH存儲器寄存器類型工程實(shí)例64訪問FLASH存儲器寄存器類型工程實(shí)例(6)將文件spiflash.c添加到工程管理器的“BSP”分組下。完成后的工程PRJ23如下圖所示。65訪問FLASH存儲器寄存器類型工程實(shí)例(7)寫入W25Q64中的數(shù)據(jù),在系統(tǒng)掉電后仍然保存著,一般地,W25Q64能有效存儲數(shù)據(jù)20年,存取次數(shù)可達(dá)10萬次。現(xiàn)在將程序段中第27~32行全部注釋掉,并將STM32F103RCT6學(xué)習(xí)板斷開電源幾分鐘后再次上電,再次借助ULINK2在線仿真工程PRJ23,可以看到變量wdat和數(shù)組WDat2中的數(shù)據(jù)仍然是正確的,如右圖中“Watch1”窗口所示。66訪問FLASH存儲器庫函數(shù)類型工程實(shí)例本小節(jié)介紹讀寫W25Q64存儲器的庫函數(shù)類型工程實(shí)例,具體建設(shè)步驟如下:(1)在工程PRJ22的基礎(chǔ)上,新建工程“PRJ24”,保存在目錄“D:\STM32F103RCT6PRJ24\PRJ24”下。此時的工程PRJ24與工程PRJ22完全相同,然后進(jìn)行下述工作。(2)新建文件spiflash.c和spiflash.h,保存在“D:\STM32F103RCT6PRJ\PRJ24\BSP”目錄下。67訪問FLASH存儲器庫函數(shù)類型工程實(shí)例68訪問FLASH存儲器庫函數(shù)類型工程實(shí)例69訪問FLASH存儲器庫函數(shù)類型工程實(shí)例70訪問FLASH存儲器庫函數(shù)類型工程實(shí)例(3)修改文件includes.h。(4)修改文件bsp.c。(5)修改文件main.c。(6)將文件spiflash.c添加到工程管理器的“BSP”分組下,將目錄“D:\STM32F103RCT6PRJ\PRJ24\STM32F10x_FWLib\src”下的文件stm32f10x_spi.c添加到工程管理器的“LIB”分組下,完成后的工程PRJ24如下圖所示。8.4本章小結(jié)71本章詳細(xì)介紹了STM32F103RCT6微控制器ADC模塊、I2C模塊和SPI模塊的工作原理與程序設(shè)計(jì)方法。本章的工程實(shí)例闡述了訪問ADC模塊、EEPROM芯片AT24C128和FLASH芯片W25Q64的程序設(shè)計(jì)方法。AT24C128和W25Q64芯片是常用存儲器芯片的代表,其訪問操作方法具有通用性和指導(dǎo)意義。建議讀者朋友在本章學(xué)習(xí)的基礎(chǔ)上,編寫將漢字庫存入W25Q64芯片的工程,整個16*16點(diǎn)陣宋體漢字庫約占300kB,建議將漢字庫存儲在W25Q64芯片中的首地址設(shè)為0x8000。thankyouARMCortex-M3嵌入式控制技術(shù)
——基于STM32F103RCT6
STM32F103硬件系統(tǒng)與KEILMDK工程第九章
LCD屏與溫度傳感器
LCD顯示屏是嵌入式系統(tǒng)中最重要的輸出設(shè)備之一,STM32F103RCT6學(xué)習(xí)板集成了一塊3.2寸240×320像素分辨率的SSD1289驅(qū)動真彩色TFT型LCD屏,可工作在262k色彩下。本章將介紹STM32F103RCT6驅(qū)動LCD屏的顯示技術(shù)和工程程序設(shè)計(jì)方法,并介紹溫度傳感器DS18B20的應(yīng)用方法。
本章的學(xué)習(xí)目標(biāo):
了解LCD屏顯示原理;
熟悉DS18B20溫度傳感器的工作原理;
掌握DS18B20溫度讀取方法;
熟練應(yīng)用寄存器或庫函數(shù)方法在LCD屏上輸出字符、漢字和圖像。1LCD屏顯示原理2溫度傳感器3
LCD顯示實(shí)例9.1LCD屏顯示原理串口通信是指數(shù)據(jù)的各位按串行的方式沿一根總線進(jìn)行的通信方式,RS-232標(biāo)準(zhǔn)的UART串口通信是典型的異步雙工串行通信,通信方式如左圖所示。UART串口通信需要兩個引腳,即TXD和RXD,TXD為串口數(shù)據(jù)發(fā)送端,RXD為串口數(shù)據(jù)接收端。STM32F103微控制器的串口與計(jì)算機(jī)的串口按圖7-1的方式相連,串行數(shù)據(jù)傳輸沒有同步時鐘,需要雙方按相同的位傳輸速率異步傳輸,這個速率稱為波特率,常用的波特率有4800bps、9600bps和115200bps等。UART串口通信的數(shù)據(jù)包以幀為單位,常用的幀結(jié)構(gòu)為:1位起始位+8位數(shù)據(jù)位+1位奇偶校驗(yàn)位(可選)+1位停止位,如右圖所示。LCD顯示模塊與STM32F103RCT6的電路連接PD0口輸出高電平,則點(diǎn)亮LCD屏背光。STM32F103RCT6微控制器通過SSD1289芯片驅(qū)動LCD屏的顯示。SSD1289芯片中集成了172800字節(jié)的RAM空間(常記為GDDRAM,即圖形顯示數(shù)據(jù)存儲空間)。由于LCD屏的顯示色彩數(shù)為262144色,因此每個像素點(diǎn)的色彩位數(shù)為18位(218=262144),又因?yàn)槠浞直媛蕿?40×320,故需要存儲空間為240×320×18位=240×320×18/8=172800字節(jié)。LCD屏按設(shè)定的刷新頻率(這里設(shè)為65Hz)不斷地將RAM空間中的內(nèi)容顯示在LCD屏上。所以,控制LCD屏顯示的本質(zhì)在于讀寫SSD1289的RAM空間。序號LCD屏引腳名LCD屏引腳網(wǎng)絡(luò)標(biāo)號STM32F103引腳1背光控制腳LEDK1~LEDK5LCDBKENPD02芯片選通腳CSLCDCSPA53寫選通腳WRLCDWRPA44讀選通腳RDLCDRDPD15命令/數(shù)據(jù)腳RSLCDRSPA16數(shù)據(jù)總線[15:0]DB[15:0]DB15~DB0PC15~PC0工作在8080并口方式下的SSD1289讀寫操作。(a)寫SSD1289操作時序;(b)讀SSD1289操作時序代碼:代碼:代碼:代碼:代碼:代碼:代碼:代碼:代碼:9.2溫度傳感器美信公司的DS18B20芯片是最常用的溫度傳感器,工作在單一總線模式下,稱作“一線”芯片,只占用STM32F103RCT6微控制器的一個通用IO口,測溫精度為±0.5℃,表示測量結(jié)果的最高精度為0.0625℃,主要用于測溫精度要求不高的環(huán)境溫度測量。本節(jié)將首先介紹DS18B20芯片的單總線訪問工作原理,主要參考自DS18B20芯片手冊;然后介紹讀取實(shí)時溫度的程序設(shè)計(jì)方法。DS18B20是一款常用的溫度傳感器,只有3個管腳,即電源VDD、地GND和雙向數(shù)據(jù)口DQ。根據(jù)圖3-9和圖3-2可知,在STM32F103RCT6學(xué)習(xí)板上,DS18B20的DQ與STM32F103RCT6的PB0相連接。DS18B20的測溫精度為±0.5℃(-10~85℃間),可用9~12位表示測量結(jié)果,默認(rèn)情況下,用12位表示測量結(jié)果,數(shù)值精度為0.0625℃。DS18B20存儲配置溫度值數(shù)據(jù)格式DS18B20的常用操作流程DS18B20復(fù)位時序DS18B20位讀寫時序代碼:代碼:代碼:代碼:9.3LCD顯示實(shí)例在工程PRJ15的基礎(chǔ)上,新建工程“PRJ25”,保在“D:\STM32F103RCT6PRJ\PRJ25”目錄下,此時的工程PRJ25與工程PRJ15完全相同,然后,進(jìn)行如下的設(shè)計(jì)工作:9.3.1寄存器類型實(shí)例代碼:代碼:代碼:代碼:代碼:將文件ds18b20.c和lcd.c添加到工程管理器的“BSP”分組下編譯鏈接并運(yùn)行工程PRJ25,LCD屏的顯示如圖所示9.3.1庫函數(shù)類型實(shí)例在工程PRJ16的基礎(chǔ)上,新建工程“PRJ26”,保存在“D:\STM32F103RCT6PRJ\PRJ26”目錄下,此時的工程PRJ26與工程PRJ16完全相同,然后,進(jìn)行下面的設(shè)計(jì)工作:代碼:代碼:代碼:代碼:代碼:thankyou第十章
μC/OS-II系統(tǒng)與移植目錄μC/OS-II系統(tǒng)移植μC/OS-II系統(tǒng)結(jié)構(gòu)與配置μC/OS-II系統(tǒng)任務(wù)本章小結(jié)本章將介紹嵌入式實(shí)時操作系統(tǒng)μC/OS-II的系統(tǒng)結(jié)構(gòu)及其在STM32F103RCT6學(xué)習(xí)板上的移植工程,并將闡述μC/OS-II系統(tǒng)配置與裁剪的方法。μC/OS-II是美國Labrosse先生推出的開源嵌入式實(shí)時操作系統(tǒng),具有體積小、實(shí)時性強(qiáng)和移植能力強(qiáng)的特點(diǎn)。μC/OS-II可以移植到幾乎所有的ARM微控制器上,那些具有一定RAM空間(最好是8kB以上)且具有堆棧操作的微控制器均可成功移植。STM32F103RCT6片上RAM空間為48kB,可以很好地支持μC/OS-II系統(tǒng)。110.1μC/OS-II系統(tǒng)移植23在工程PRJ26的基礎(chǔ)上,新建工程“PRJ27”,保存在“D:\STM32F103RCT6PRJ\PRJ27”目錄下,此時的工程PRJ27與工程PRJ26完全相同。現(xiàn)在,進(jìn)行下面的設(shè)計(jì)工作:(1)在工程PRJ27工作窗口中,單擊“ManageRun-TimeEnvironment”快捷鈕(“管理運(yùn)行環(huán)境”),或者單擊菜單“Project|Manage|Run-TimeEnvironment...”,將彈出如右圖所示對話框。μC/OS-II系統(tǒng)移植4然后,單擊“OK”按鈕進(jìn)入下圖所示界面。μC/OS-II系統(tǒng)移植5(2)在上圖中左側(cè)的工程管理器中,鼠標(biāo)右鍵單擊“STM32F103RCT6”,在其彈出菜單中單擊“OptionsforTarget‘STM32F103RCT6’...Alt+F7”,進(jìn)入下圖所示對話框,在下圖中選擇“C/C++”選項(xiàng)卡。μC/OS-II系統(tǒng)移植6(3)修改系統(tǒng)啟動文件startup_stm32f10x_hd.s,如下面的程序段所示。μC/OS-II系統(tǒng)移植7(4)修改文件app_cfg.h,如下面的程序段所示。(5)修改includes.h文件,如下面的程序段所示。μC/OS-II系統(tǒng)移植8(6)修改main.c文件,如下面的程序段所示。μC/OS-II系統(tǒng)移植9(7)新建文件strfun.c和strfun.h,保存在目錄“D:\STM32F103RCT6PRJ\PRJ27\USER”下,其代碼如下面的程序段所示。μC/OS-II系統(tǒng)移植10μC/OS-II系統(tǒng)移植11(8)新建文件task01.c和task01.h,保存在“D:\STM32F103RCT6PRJ\PRJ27\USER”目錄下,其代碼如下面的程序段所示。μC/OS-II系統(tǒng)移植12(9)修改exti.c文件中如下面的程序段所示的部分。μC/OS-II系統(tǒng)移植13(10)修改os_cfg.h文件中宏常量“OS_TMR_EN”的值,由0u修改為1u(位于文件的第139行),表示打開系統(tǒng)定時器模塊。第10.2節(jié)中將詳細(xì)介紹os_cfg.h文件。(11)將文件strfun.c和task01.c添加到工程管理器的“USER”分組下。(12)在bsp.c文件中注釋掉SysTickInit函數(shù),即“//SysTickInit();”,工程中的systick.c和systick.h文件可以從工程中移除,這是因?yàn)橄到y(tǒng)節(jié)拍定時器專用于μC/OS-II操作系統(tǒng)。工程PRJ27是一個完整的工程,在STM32F103RCT6學(xué)習(xí)板上運(yùn)行時,LED燈D11每隔1秒閃爍一次(注意:LED燈D9不閃爍,D10的閃爍由通用定時器2控制),在LCD屏的左上角顯示一行信息“uC/OS-IIVersion:2.9211.”(如果按下按鍵S18或S19蜂鳴器將啟動或關(guān)閉),如右圖所示。μC/OS-II系統(tǒng)移植10.2μC/OS-II系統(tǒng)結(jié)構(gòu)與配置1415本書使用的μC/OS-II嵌入式實(shí)時操作系統(tǒng),版本號為V2.92.11,結(jié)合工程PRJ27工作窗口圖可知,μC/OS-II共有16個系統(tǒng)文件(包括ucos_ii.h),如下表所示。μC/OS-II系統(tǒng)結(jié)構(gòu)與配置16如果重點(diǎn)關(guān)注μC/OS-II系統(tǒng)的應(yīng)用程序設(shè)計(jì),可以只關(guān)心系統(tǒng)配置文件os_cfg.h,通過該文件可對μC/OS-II系統(tǒng)進(jìn)行裁剪,該文件內(nèi)容如下面的程序段所示。μC/OS-II系統(tǒng)結(jié)構(gòu)與配置17μC/OS-II系統(tǒng)結(jié)構(gòu)與配置18μC/OS-II系統(tǒng)結(jié)構(gòu)與配置19μC/OS-II系統(tǒng)結(jié)構(gòu)與配置20μC/OS-II系統(tǒng)結(jié)構(gòu)與配置下面將os_cfg.h文件中常用的配置宏列在下表中。10.3μC/OS-II系統(tǒng)任務(wù)2122μC/OS-II系統(tǒng)任務(wù)μC/OS-II具有3個系統(tǒng)任務(wù),即空閑任務(wù)、統(tǒng)計(jì)任務(wù)和定時器任務(wù)(注意,定時器任務(wù)在一些書中被稱為用戶任務(wù),本書中將定時器任務(wù)稱為系統(tǒng)任務(wù))。系統(tǒng)任務(wù)由μC/OS-II內(nèi)核創(chuàng)建;除了系統(tǒng)任務(wù)外,其余任務(wù)由用戶創(chuàng)建,實(shí)現(xiàn)所需要的功能,均被稱為用戶任務(wù)。23空閑任務(wù)空閑任務(wù)是當(dāng)所有其他任務(wù)均沒有使用CPU時,空閑任務(wù)占用CPU,因此,空閑任務(wù)是μC/OS-II中優(yōu)先級最低的任務(wù),其優(yōu)先級號固定為OS_LOWEST_PRIO。空閑任務(wù)實(shí)現(xiàn)的工作為:每執(zhí)行一次空閑任務(wù),系統(tǒng)全局變量OSIdleCtr自增1;每次空閑任務(wù)的執(zhí)行都將調(diào)用一次鉤子函數(shù)OSTaskIdleHook,用戶可以通過該鉤子函數(shù)擴(kuò)展功能,例如使STM32F103RCT6進(jìn)入低功耗模式。24統(tǒng)計(jì)任務(wù)統(tǒng)計(jì)任務(wù)用于統(tǒng)計(jì)CPU的使用率和各個任務(wù)的堆棧使用情況。統(tǒng)計(jì)任務(wù)的優(yōu)先級號固定為OS_LOWEST_PRIO-1,僅比空閑任務(wù)的優(yōu)先級高,對于μC/OS-IIV2.92.11而言,每0.1秒執(zhí)行統(tǒng)計(jì)任務(wù)一次,將統(tǒng)計(jì)這段時間內(nèi)空閑任務(wù)運(yùn)行的時間,用OSIdleCtr表示,用該數(shù)值與0.1秒時間內(nèi)只有空閑任務(wù)運(yùn)行時的OSIdleCtr的值(用OSIdleCtrMax表示,在OSStatInit函數(shù)中統(tǒng)計(jì)到該值)相比,即得到這0.1秒時間內(nèi)的CPU空閑率,1減去CPU空閑率的差為CPU使用率。當(dāng)需要查詢某個任務(wù)的堆棧使用情況時,必須在創(chuàng)建這個任務(wù)時把它的堆棧內(nèi)容全部清0,這樣,統(tǒng)計(jì)任務(wù)在統(tǒng)計(jì)每個任務(wù)的堆棧使用情況時,統(tǒng)計(jì)其堆棧中不為0的元素個數(shù),該值為其堆棧使用的長度,堆棧總長度減去前者即得到該任務(wù)的空閑堆棧空間長度。25統(tǒng)計(jì)任務(wù)當(dāng)程序段10-10的第44行OS_TASK_STAT_EN為1時,則開啟μC/OS-II統(tǒng)計(jì)任務(wù)功能。此時需要在第一個用戶任務(wù)的無限循環(huán)體前面插入語句“OSStatInit();”以初始化統(tǒng)計(jì)任務(wù),并且要求使用函數(shù)OSTaskCreateExt創(chuàng)建用戶任務(wù),最后一個參數(shù)使用“OS_TASK_OPT_STK_CHK|OS_TASK_OPT_STK_CLR”。統(tǒng)計(jì)任務(wù)可以統(tǒng)計(jì)各個任務(wù)的CPU占用率以及其堆棧占用情況。一般地,在第一個用戶任務(wù)中顯示CPU使用率和各個任務(wù)堆棧占用情況,CPU使用率保存在一個系統(tǒng)全局變量OSCPUUsage中,其值為0~100的整數(shù),如果為3,則表示CPU使用率為3%。26統(tǒng)計(jì)任務(wù)當(dāng)查詢某個任務(wù)的堆棧使用情況時,需要定義結(jié)構(gòu)體變量類型OS_STK_DATA的變量,然后調(diào)用函數(shù)OSTaskStkChk,該函數(shù)有兩個參數(shù),第一個為任務(wù)優(yōu)先級號,第二個為指向OS_STK_DATA型結(jié)構(gòu)體變量的指針。例如,OS_STK_DATAStkData;OSTaskStkChk(2,&StkData);則將優(yōu)先級號為2的任務(wù)的堆棧使用情況保存在StkData變量中,其中,StkData.OSFree為該任務(wù)空閑的堆棧大小,StkData.OSUsed為該任務(wù)使用的堆棧大小,單位為字節(jié)。27定時器任務(wù)定時器任務(wù)由μC/OS-II系統(tǒng)提供,用于創(chuàng)建軟定時器(或稱系統(tǒng)定時器)。相對于STM32F103RCT6芯片的硬件定時器而言,軟定時器是指μC/OS-II系統(tǒng)提供的軟件定時器組件,具有和硬件定時器相似的定時功能。根據(jù)表10-2所示的配置方式,在后續(xù)的工程中將定時器任務(wù)的優(yōu)先級號配置為61。程序段10-10中第105行宏定義了常量OS_TMR_CFG_MAX為16,表示最多可以創(chuàng)建16個軟定時器。μC/OS-II定時器任務(wù)可管理的定時器數(shù)量僅受定時器數(shù)據(jù)類型的限制,對于16位無符號整型而言,可管理多達(dá)65536個定時器。10.4本章小結(jié)2829本章小結(jié)本章詳細(xì)討論了μC/OS-II系統(tǒng)移植到STM32F103RCT6硬件平臺的工程框架,并闡述了μC/OS-II系統(tǒng)的文件結(jié)構(gòu)和裁剪系統(tǒng)內(nèi)核組件的配置文件內(nèi)容,最后,介紹了μC/OS-II系統(tǒng)的三個系統(tǒng)任務(wù)及其作用。本章給出的工程PRJ27是一個完整的可執(zhí)行工程,但是只有一個用戶任務(wù),下一章將在工程PRJ27的基礎(chǔ)上,添加更多的用戶任務(wù),并深入闡述多任務(wù)的工程實(shí)例的工作原理。thankyouARMCortex-M3嵌入式控制技術(shù)
——基于STM32F103RCT6
嵌入式實(shí)時操作系統(tǒng)μC/OS-II第十一章
μC/OS-II任務(wù)管理
本章將介紹μC/OS-II任務(wù)管理相關(guān)的系統(tǒng)函數(shù)及其應(yīng)用方法,并將深入剖析多任務(wù)的工程實(shí)例及其工作原理,然后,還將介紹統(tǒng)計(jì)任務(wù)的作用和系統(tǒng)定時器的創(chuàng)建方法。
本章的學(xué)習(xí)目標(biāo):
了解統(tǒng)計(jì)任務(wù)的用法;
熟悉μC/OS-II用戶任務(wù)相關(guān)的系統(tǒng)函數(shù);
掌握μC/OS-II用戶任務(wù)的創(chuàng)建方法;
熟練應(yīng)用庫函數(shù)方法創(chuàng)建多任務(wù)工程。
1μC/OS-II用戶任務(wù)2μC/OS-II多任務(wù)工程實(shí)例3
統(tǒng)計(jì)任務(wù)實(shí)例4系統(tǒng)定時器11.1μC/OS-II用戶任務(wù)相對于系統(tǒng)任務(wù)而言,μC/OS-II應(yīng)用程序中用戶創(chuàng)建的任務(wù),稱為用戶任務(wù),每個用戶任務(wù)都在周期性地執(zhí)行著某項(xiàng)工作,或請求到事件后執(zhí)行相應(yīng)的功能。用戶任務(wù)的特點(diǎn)如下:(1)用戶任務(wù)對應(yīng)的函數(shù)是一個帶有無限循環(huán)體的函數(shù),由于具有無限循環(huán)體,故該類函數(shù)沒有返回值。(2)用戶任務(wù)對應(yīng)的函數(shù)具有一個“void*”類型的指針參數(shù),該類型指針可以指向任何類型的數(shù)據(jù),通過該指針在任務(wù)創(chuàng)建時向任務(wù)傳遞一些數(shù)據(jù),這種傳遞只能發(fā)生一次,即創(chuàng)建任務(wù)的時候,一旦任務(wù)開始工作,就無法再通過函數(shù)參數(shù)向任務(wù)傳遞數(shù)據(jù)了。(3)每個用戶任務(wù)具有唯一的優(yōu)先級號,取值范圍為0~OS_LOWEST_PRIO-3(OS_LOWEST_PRIO為os_cfg.h中宏定義的常量,最大值為254),一般地,系統(tǒng)的空閑任務(wù)優(yōu)先級號為OS_LOWEST_PRIO,統(tǒng)計(jì)任務(wù)的優(yōu)先級號為OS_LOWEST_PRIO-1,定時器任務(wù)的優(yōu)先級號常設(shè)定為OS_LOWEST_PRIO-2。此外,需要為優(yōu)先級繼承優(yōu)先級留出優(yōu)先級號,所以,用戶任務(wù)的優(yōu)先級號一般為5~OS_LOWEST_PRIO-3。在基于STM32F103RCT6的工程中,OS_LOWEST_PRIO被宏定義為63(參考表10-2和程序段10-10的os_cfg.h文件),定時器任務(wù)的優(yōu)先級號為61,因此,用戶任務(wù)的優(yōu)先級號的取值范圍為5~60。(4)每個用戶任務(wù)具有獨(dú)立的堆棧,使用OS_STK類型定義堆棧,堆棧數(shù)組的大小一般要在50(即200字節(jié))以上。函數(shù)原型功能INT8UOSTaskCreate(void(*task)(void*p_arg),
void*p_arg,OS_STK*ptos,INT8Uprio);創(chuàng)建一個任務(wù)。4個參數(shù)的含義依次為:用戶任務(wù)對應(yīng)的函數(shù)名、函數(shù)參數(shù)、任務(wù)堆棧、任務(wù)優(yōu)先級。可以在啟動多任務(wù)前創(chuàng)建任務(wù),也可在一個已經(jīng)運(yùn)行的任務(wù)中創(chuàng)建新的任務(wù),但不能在中斷服務(wù)程序中創(chuàng)建任務(wù)。任務(wù)函數(shù)必須包含無限循環(huán)體,且必須調(diào)用OSMboxPend、OSFlagPend、OSMutexPend、OSQPend、OSSemPend、OSTimeDly、OSTimeDlyHMSM、OSTaskSuspend和OSTaskDel中的一個,用于實(shí)現(xiàn)任務(wù)調(diào)度。任務(wù)優(yōu)先級不應(yīng)取為0~4,并且不能取為OS_LOWEST_PRIO-1~OS_LOWEST_PRIOINT8UOSTaskCreateExt(void(*task)(void*p_arg),
void*p_arg,OS_STK*ptos,INT8Uprio,INT16Uid,OS_STK*pbos,
INT32Ustk_size,void*pext,INT16Uopt);與OSTaskCreate作用相同,用于創(chuàng)建一個任務(wù)。該函數(shù)的前4個參數(shù)與OSTaskCreate相同,增加了表示任務(wù)ID號、任務(wù)堆棧棧底、任務(wù)堆棧大小、用戶定義的任務(wù)外部空間指針和任務(wù)創(chuàng)建選項(xiàng)等參數(shù)。如果要對任務(wù)的堆棧進(jìn)行檢查,必須使用該函數(shù)創(chuàng)建任務(wù),且opt應(yīng)設(shè)置為“OS_TASK_OPT_STK_CHK|OS_TASK_OPT_STK_CLR”,本書中實(shí)例全部使用該函數(shù)創(chuàng)建用戶任務(wù)INT8UOSTaskDel(INT8Uprio);通過指定任務(wù)優(yōu)先級或OS_PRIO_SELF刪除一個任務(wù)或調(diào)用該函數(shù)的任務(wù)自己。被刪除的任務(wù)進(jìn)入休眠態(tài),調(diào)用OSTaskCreate或OSTaskCreateExt可再次激活它(中斷服務(wù)程序不能調(diào)用該函數(shù))INT8UOSTaskDelReq(INT8Uprio);請求任務(wù)刪除自己。一般用于刪除占有資源的任務(wù),假設(shè)該任務(wù)的優(yōu)先級號為10,發(fā)出刪除任務(wù)10請求的任務(wù)優(yōu)先級號為5,則在任務(wù)5中調(diào)用OSTaskDelReg(10),任務(wù)10中會調(diào)用OSTaskDelReq(OS_PRIO_SELF),如果返回值為OS_TASK_DEL_REQ,則表明有來自其他任務(wù)的刪除請求,任務(wù)10首先釋放其占有的資源,然后調(diào)用OSTaskDel(OS_PRIO_SELF)刪除自己(中斷服務(wù)程序不能調(diào)用該函數(shù))INT8UOSTaskChangePrio(INT8Uoldprio,INT8Unewprio);更改任務(wù)的優(yōu)先級INT8UOSTaskSuspend(INT8Uprio);無條件掛起一個任務(wù),參數(shù)指定為OS_PRIO_SELF時掛起任務(wù)自己。與OSTaskResume配對使用INT8UOSTaskResume(INT8Uprio);恢復(fù)(或就緒)一個被OSTaskSuspend掛起的任務(wù),而且是唯一可恢復(fù)被OSTaskSuspend掛起任務(wù)的函數(shù)INT8UOSTaskQuery(INT8Uprio,OS_TCB*p_task_data);查詢?nèi)蝿?wù)信息INT8UOSTaskStkChk(INT8Uprio,OS_STK_DATA*p_stk_data);檢查任務(wù)堆棧信息,例如,棧未用空間和已用空間。該函數(shù)要求使用OSTaskCreateExt創(chuàng)建任務(wù),且opt參數(shù)指定為OS_TASK_OPT_STK_CHKINT8UOSTaskNameGet(INT8Uprio,INT8U*pname,INT8U*perr);得到已命名任務(wù)的名稱,為ASCII字符串,長度最大為OS_TASK_NAME_SIZE(包括結(jié)尾NULL空字符),常用于調(diào)試(中斷服務(wù)程序不能調(diào)用該函數(shù))。3個參數(shù)的含義為:任務(wù)優(yōu)先級號、任務(wù)名、出錯信息碼voidOSTaskNameSet(INT8Uprio,INT8U*pname,INT8U*perr);為任務(wù)命名,名稱為ASCII字符串,長度最大為OS_TASK_NAME_SIZE(包括結(jié)尾NULL空字符),常用于調(diào)試(中斷服務(wù)程序不能調(diào)用該函數(shù))。3個參數(shù)的含義為:任務(wù)優(yōu)先級號、任務(wù)名、出錯信息碼μC/OS-II系統(tǒng)中有兩個創(chuàng)建任務(wù)的函數(shù),即OSTaskCreate和OSTaskCreateExt。任務(wù)本質(zhì)上是具有無限循環(huán)體的函數(shù)。一般地,要創(chuàng)建一個任務(wù),有以下步驟:(1)編寫一個帶有無限循環(huán)體的函數(shù),由于具有無限循環(huán)體,故函數(shù)沒有返回值。該函數(shù)具有一個void*類型的指針,該指針可以指向任何類型的數(shù)據(jù),通過該指針在任務(wù)創(chuàng)建時向任務(wù)傳遞一些數(shù)據(jù),這種傳遞只能發(fā)生一次,一旦任務(wù)開始工作,就無法通過函數(shù)參數(shù)向任務(wù)傳遞數(shù)據(jù)了。該函數(shù)的典型樣式如程序段11-1所示。2)為要創(chuàng)建的任務(wù)指定優(yōu)先級號,每個任務(wù)都有唯一的優(yōu)先級號,取值范圍從0至OS_LOWEST_PRIO-2(OS_LOWEST_PRIO為文件os_cfg.h中的宏定義常量,最大值為254),一般地,用戶任務(wù)優(yōu)先級從5至OS_LOWEST_PRIO-3。優(yōu)先級號常用宏常量來定義,例如#defineTask01Prio5(3)為要創(chuàng)建的任務(wù)定義堆棧,必須使用OS_STK類型定義堆棧,例如OS_STKTask01Stk[200];(4)調(diào)用OSTaskCreate或OSTaskCreateExt函數(shù)創(chuàng)建任務(wù)。例如OSTaskCreate(Task01,(void*)0,&Task01Stk[199],Task01Prio);或OSTaskCreateExt(Task01,(void*)0,&Task01Stk[199],Task01Prio,1,&Task01Stk[0],200,(void*)0,OS_TASK_OPT_STK_CHK|OS_TASK_OPT_STK_CLR);經(jīng)過上述四步,一個基于函數(shù)Task01的任務(wù)創(chuàng)建好了,在不造成混淆的情況下,一般該任務(wù)也稱為Task01。在μC/OS-II中,用戶任務(wù)共有五種狀態(tài)11.2μC/OS-II多任務(wù)工程實(shí)例代碼:代碼:代碼:代碼:代碼:代碼:代碼:將文件task02.c、task03.c、task04.c、task05.c和task06.c添加到工程管理器的“USER”分組下,建設(shè)好的工程PRJ28如圖所示編譯鏈接并運(yùn)行工程PRJ28,將在LCD屏上顯示如圖所示結(jié)果,同時,LED燈D11每隔1秒閃爍一次。注:上圖中編譯結(jié)果“BuildOutput”中會有2個警告信息,這2個警告信息是由于μC/OS-II系統(tǒng)中的函數(shù)參數(shù)沒有使用導(dǎo)致的,無需修改。工程PRJ28的文件目錄結(jié)構(gòu)如表所示序號子目錄文件性質(zhì)來源1USERmain.c、includes.h、vartypes.h、strfun.c、strfun.h、task01.c、task01.h、task02.c、task02.h、task03.c、task03.h、tasko4.c、task04.、task05.c、task05.h、task06.c、task06.h用戶應(yīng)用程序文件用戶編寫2BSPbeep.c、beep.h、bsp.c、bsp.h、ds18b20.c、ds18b20.h、exti.c、exti.h、key.c、key.h、lcd.c、lcd.h、led.c、led.h、rt.c、rt.h、textlib.h、tim2.c、tim2.h、uart2.c、uart2.h、zlg7289.c、zlg7289.h板級支持包文件用戶編寫3STM32F10x_FWLibstm32f10x_conf.h庫函數(shù)配置文件4STM32F10x_FWLib\incmisc.h、stm32f10x_adc.h、stm32f10x_bkp.h、stm32f10x_can.h、stm32f10x_cec.h、stm32f10x_crc.h、stm32f10x_dac.h、stm32f10x_dbgmcu.h、stm32f10x_dma.h、stm32f10x_exti.h、stm32f10x_flash.h、stm32f10x_fsmc.h、stm32f10x_gpio.h、stm32f10x_i2c.h、stm32f10x_iwdg.h、stm32f10x_pwr.h、stm32f10x_rcc.h、stm32f10x_rtc.h、stm32f10x_sdio.h、stm32f10x_spi.h、stm32f10x_tim.h、stm32f10x_usart.h、stm32f10x_wwdg.h庫函數(shù)文件5STM32F10x_FWLib\srcmisc.c、stm32f10x_adc.c、stm32f10x_bkp.c、stm32f10x_can.c、stm32f10x_cec.c、stm32f10x_crc.c、stm32f10x_dac.c、stm32f10x_dbgmcu.c、stm32f10x_dma.c、stm32f10x_exti.c、stm32f10x_flash.c、stm32f10x_fsmc.c、stm32f10x_gpio.c、stm32f10x_i2c.c、stm32f10x_iwdg.c、stm32f10x_pwr.c、stm32f10x_rcc.c、stm32f10x_rtc.c、stm32f10x_sdio.c、stm32f10x_spi.c、stm32f10x_tim.c、stm32f10x_usart.c、stm32f10x_wwdg.c庫函數(shù)頭文件6PRJMyPrj.uvprojx、MyPrj.uvoptx、MyPrj.uvguix.Administrator工程文件KeilMDK創(chuàng)建7PRJ\RTE其下有四個子目錄RTOS、Device、_Target_1、_STM32F103RCT6運(yùn)行環(huán)境組件頭文件
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 智能照明在醫(yī)療手術(shù)室照明中的應(yīng)用考核試卷
- 礦物干燥劑生產(chǎn)考核試卷
- 森林植被恢復(fù)與重建考核試卷
- 糖尿病患者護(hù)理查房 2
- 一年級上冊數(shù)學(xué)口算(每天5分鐘60題)
- 2025年中考初三學(xué)業(yè)質(zhì)量檢測(一)物理模擬題答案
- 統(tǒng)編版語文五年級下冊第9課《古詩三首》精美課件
- 三亞中瑞酒店管理職業(yè)學(xué)院《商貿(mào)英語聽說上》2023-2024學(xué)年第二學(xué)期期末試卷
- 遼寧省朝陽市雙塔區(qū)2024-2025學(xué)年五下數(shù)學(xué)期末復(fù)習(xí)檢測模擬試題含答案
- 山東省濟(jì)南市濟(jì)陽縣2025屆初三畢業(yè)班模擬考試(五)英語試題含答案
- 公文調(diào)研方案
- 小學(xué)英語四年級下冊Unit 4 Part A Let's learn教學(xué)設(shè)計(jì)1
- 胃腸減壓評分標(biāo)
- 光學(xué)系統(tǒng)的像差理論和像質(zhì)評價課件
- 2023年四川省公務(wù)員錄用考試《行測》試題及答案
- 河少版生物七年級下知識點(diǎn)總結(jié)
- 【灌溉系統(tǒng)】-基于單片機(jī)的智能灌溉系統(tǒng)
- 中國急性胰腺炎診治指南課件
- 地質(zhì)災(zāi)害治理竣工資料匯總(完整資料)
- YY/T 1560-2017脊柱植入物椎體切除模型中枕頸和枕頸胸植入物試驗(yàn)方法
- MT/T 589-1996煤礦用防爆柴油機(jī)鋼輪/齒軌機(jī)車及齒軌裝置
評論
0/150
提交評論