




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