版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
任務10
用空閑中斷處理串口接收數(shù)據(jù)任務要求STM32的PE0~PE7引腳上接有8只發(fā)光二極管控制電路,發(fā)光二極管采用低電平有效控制,編號為LED1~LED8。串口1作異步通信口,與計算機進行串行通信,計算機通過串口調(diào)試助手向STM32發(fā)送控制命令,控制發(fā)光二極管的點亮、閃爍和熄滅,STM32接收到控制命令后需用串口向計算機發(fā)送反饋信息,以便能在串口調(diào)試助手中顯示相關(guān)信息。串口的波特率BR=115200bps,數(shù)據(jù)位8位,停止位1位。計算機的串口發(fā)送的控制命令以及調(diào)試助手中顯示的數(shù)據(jù)如表所示,要求用STM23CubeMX生成初始化程序,然后在Keil中編程實現(xiàn)表的功能。任務要求表中,命令數(shù)據(jù)為16進制數(shù),55AA為數(shù)據(jù)頭,5A為數(shù)據(jù)尾,val表示用戶輸入的某個16進制數(shù),例如,STM32的串口接收到0x55AA04055A,就需要用串口向計算機發(fā)送“執(zhí)行命令4,收到數(shù)據(jù)05”。命令功能串口調(diào)試助手顯示的數(shù)據(jù)55AA015ALED1亮,其他發(fā)光二極管熄滅執(zhí)行命令1,LED1亮55AA025ALED1閃爍,其他發(fā)光二極管熄滅執(zhí)行命令2,LED1閃爍55AA035ALED2亮,其他發(fā)光二極管熄滅執(zhí)行命令3,LED2亮55AA04val5A點亮所有發(fā)光二極管執(zhí)行命令4,收到數(shù)據(jù)val知識儲備
1.串口的空閑中斷STM32的串口支持多種中斷,與串口接收相關(guān)的中斷有8種,其中串口接收中斷中最常用的是串口接收數(shù)據(jù)寄存器不為空(RXNE)中斷和檢測到空閑線路(IDLE)中斷。串口接收數(shù)據(jù)寄存器不為空中斷習慣也叫做串口接收中斷。它的發(fā)生條件是,串口接收到了新的數(shù)據(jù)。因此,該中斷發(fā)生后,STM32就可以從串口接收寄存器中讀取新接收到的數(shù)據(jù)。檢測到空閑線路中斷也叫做空閑中斷。它的發(fā)生條件是,串口接收完1字節(jié)數(shù)據(jù)后,數(shù)據(jù)線保持高電平(空閑)的時間超過傳輸1個字節(jié)數(shù)據(jù)所用的時間。
1.串口的空閑中斷【舉例】計算機用串口向STM32發(fā)送字符串“STM32”時,這5個字符是連續(xù)發(fā)送的,STM32接收這5個字符數(shù)據(jù)時也是連續(xù)接收的,STM32每接收到一個字符就會產(chǎn)生一次串口接收(RXNE)中斷,但不產(chǎn)生IDLE中斷,當這5個字符接收完畢后,接收數(shù)據(jù)線將在一個較長的時間內(nèi)呈高電平狀態(tài),就會產(chǎn)生空閑(IDLE)中斷。所以,IDLE中斷的發(fā)生標志著一批連接數(shù)據(jù)接收完畢,如果我們把串口接收數(shù)據(jù)保存到某個緩沖區(qū)中,當IDLE中斷發(fā)生后,我們就可以從緩沖區(qū)讀取連接接收的一批數(shù)據(jù)。
2.HAL庫中操作空閑中斷的宏宏的用法宏__HAL_UART_GET_FLAG(__HANDLE__,__FLAG__)功能檢測指定的串口中斷標志是否置位。參數(shù)1__HANDLE__:串口的句柄,取值為變量huartx的地址,其中x為串口編號,值為1~5。參數(shù)2__FLAG__:所要檢測的中斷標志位,取值如表4-11所示。返回值所檢測標志位的狀態(tài)。值為SET或者RESET。(1)__HAL_UART_GET_FLAG(__HANDLE__,__FLAG__)宏2.HAL庫中操作空閑中斷的宏中斷標志位(1)__HAL_UART_GET_FLAG(__HANDLE__,__FLAG__)宏中斷源取值含義UART_FLAG_CTSCTS改變標志UART_FLAG_LBD檢測到LIN斷路標志UART_FLAG_TXE發(fā)送數(shù)據(jù)寄存器為空標志UART_FLAG_TC發(fā)送完成標志UART_FLAG_RXNE接收數(shù)據(jù)寄存器非空標志UART_FLAG_IDLE空閑線路標志UART_FLAG_ORE溢出錯誤標志UART_FLAG_NE噪聲錯誤標志UART_FLAG_FE幀錯誤標志UART_FLAG_PE奇偶校驗錯誤標志
2.HAL庫中操作空閑中斷的宏宏的用法宏__HAL_UART_CLEAR_IDLEFLAG(__HANDLE__)功能清除指定串口的空閑中斷標志位。參數(shù)__HANDLE__:串口的句柄,取值為變量huartx的地址,其中x為串口編號,值為1~5。返回值無。(2)__HAL_UART_CLEAR_IDLEFLAG(__HANDLE__)宏【說明】在HAL庫中,宏__HAL_UART_CLEAR_FLAG(__HANDLE__,__FLAG__)也是清除串口中斷請求標志位,但該宏只能清除CTS、LIN、TC、RXNE等4個串口中斷請求標志位,不能清除IDLE、ORE、NE、FE、PE等幾個串口中斷請求標志位。3.空閑中斷的編程方法空閑中斷可以采用中斷方式編程,也可以采用查詢方式編程,但都需要與RXNE中斷一起編程,在實際應用中通常采用查詢方式編程。采用查詢方式的編程方法是,用變量aRxBuf作串口緩沖器,用來存放RXNE中斷發(fā)生后串口所接收到的數(shù)據(jù);用數(shù)組UserRxBuf[]作串口接收緩沖區(qū),用來存放串口所接收到的一批數(shù)據(jù);用變量UserRxCnt作接收數(shù)據(jù)計數(shù)器,用來記錄所接收的數(shù)據(jù)個數(shù),這個變量也是新接收到的數(shù)據(jù)在數(shù)組UserRxBuf[]中存放的位置。在RXNE中斷中只負責接收數(shù)據(jù),并將數(shù)據(jù)存放在數(shù)組UserRxBuf[]中,在應用程序中則查閱IDLE中斷請求標志位是否置位,若已置位,則表明空閑中斷已發(fā)生,就進行接收數(shù)據(jù)處理,數(shù)據(jù)處結(jié)束后再將IDLE中斷請求標志位清0,表示本輪數(shù)據(jù)處理結(jié)束,禁止再進行數(shù)據(jù)處理。3.空閑中斷的編程方法步驟(1)在main()函數(shù)的初始化部分的最后用HAL_UART_Receive_IT()函數(shù)使能串口接收中斷,并指定接收緩沖區(qū)和接收數(shù)據(jù)的長度。(2)在串口接收中斷回調(diào)函數(shù)HAL_UART_RxCpltCallback()中讀取串口所接收的數(shù)據(jù),并保存至用戶串口緩沖區(qū)UserRxBuf[]中。(3)在main()函數(shù)的while(1)死循環(huán)中用__HAL_UART_GET_FLAG()宏讀取IDLE中斷請求標志,并判斷其狀態(tài)。若為復位狀態(tài),則結(jié)束串口接收數(shù)據(jù)處理工作;若為置位狀態(tài),則根據(jù)應用的需要對UserRxBuf[]中的數(shù)據(jù)進行對應的處理,處理結(jié)束后再用__HAL_UART_CLEAR_IDLEFLAG()宏清除IDLE中斷請求標志。3.空閑中斷的編程方法12345678910111213141516171819202122232425262728293031#defineUSER_RX_BUF_LEN128uint8_tUserRxCnt=0;/*串口接收計數(shù)器*/uint8_tUserRxBuf[USER_RX_BUF_LEN];/*串口接收緩沖區(qū),保存所接收的一批數(shù)*/uint8_taRxBuf; /*串口接收緩沖器,存放RXNE中斷發(fā)生后串口所接收到的數(shù)據(jù)*//*main()函數(shù)*/intmain(void){…/*其他軟硬件初始化*/ HAL_UART_Receive_IT(&huart1,&aRxBuf,1);/*使能串口1接收中斷,并指定接收緩沖區(qū)和接收數(shù)據(jù)長度*/ while(1) { if(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE)!=RESET)/*判斷是否是空閑中斷(IDLE)發(fā)生*/ {/*此處添加對接收緩沖區(qū)的數(shù)據(jù)(UserRxBuf[]中的數(shù)據(jù))進行處理的代碼*/memset(UserRxBuf,0,UserRxCnt);UserRxCnt=0;/*串口接收計數(shù)值清0*/__HAL_UART_CLEAR_IDLEFLAG(&huart1);/*清除IDLE中斷請求標志*/} …/*其他事務處理*/}}/*串口接收中斷回調(diào)函數(shù)*/voidHAL_UART_RxCpltCallback(UART_HandleTypeDef*huart){ if(huart==&huart1)//判斷是否是串口1 { UserRxBuf[UserRxCnt++]=aRxBuf;//持續(xù)接收數(shù)據(jù) UserRxCnt%=USER_RX_BUF_LEN;//防超界處理 } HAL_UART_Receive_IT(&huart1,&aRxBuf,1);//使能串口1接收中斷,并指定接收緩沖區(qū)和接收數(shù)據(jù)長度}程序的框架結(jié)構(gòu):函數(shù)的用法(1)strstr()函數(shù)4.常用的串操作函數(shù)原型char*strstr(constchar*str1,constchar*str2);原型的位置string.h文件中功能求串str2在串str1中首次出現(xiàn)的地址。參數(shù)1被查找的目標串。參數(shù)2str2:所要查找的串。返回值若str2是串str1的子串,則返回str2在str1首次出現(xiàn)的地址。若str2不是str1的子串,則返回NULL。4.常用的串操作函數(shù)(2)memset()函數(shù)原型void*memset(void*buf,intval,intlen);原型的位置string.h文件中功能將存儲區(qū)的內(nèi)容設(shè)置成指定值。參數(shù)1buf:所要設(shè)置存儲區(qū)的首地址。參數(shù)2val:所要設(shè)置的值。參數(shù)3len:所要設(shè)置存儲區(qū)的長度。返回值函數(shù)的返回值為所設(shè)置存儲區(qū)的首地址。函數(shù)的用法4.常用的串操作函數(shù)(3)strlen()函數(shù)原型vunsignedintstrlen(constchar*str);原型的位置string.h文件中功能計算串的長度。參數(shù)str:串的首地址。返回值串中的字符個數(shù)。函數(shù)的用法【舉例】語句“l(fā)en=strlen("STM32");”執(zhí)行后,len的值為5。(4)sprintf()函數(shù)4.常用的串操作函數(shù)原型intsprintf(char*buf,constchar*format,[argument]);原型的位置string.h文件中功能將格式化數(shù)據(jù)保存至指定的緩沖區(qū)中。參數(shù)1buf:指向存放格式化數(shù)據(jù)的緩沖區(qū)的指針,即緩沖區(qū)的首地址。參數(shù)2format:格式化字符串。格式化字符串可以是需要原樣輸出的正常字符串,也可以是以%開頭的格式規(guī)定字符,如%d、%s、%f、%x等。format參數(shù)的用法和要求與printf()函數(shù)中的format參數(shù)的用法和要求完全相同。函數(shù)的用法4.常用的串操作函數(shù)(4)sprintf()函數(shù)原型intsprintf(char*buf,constchar*format,[argument]);參數(shù)3argument:所需輸出的參數(shù)。該參數(shù)是一個可選的系列參數(shù),參數(shù)的個數(shù)、順序必須與format參數(shù)中的格式規(guī)定字符的個數(shù)、順序相同,且各參數(shù)之間需用“,”符號分開。argument參數(shù)的用法和要求與printf()函數(shù)中的argument參數(shù)的用法和要求完全相同。返回值若寫入成功,則返回實際寫入緩沖區(qū)的字符個數(shù)。若寫入失敗,則返回-1。函數(shù)的用法4.常用的串操作函數(shù)【說明】(1)sprintf()函數(shù)的功能和用法與printf()函數(shù)非常相似,兩者的差別是,printf()函數(shù)是向標準的輸出設(shè)備(顯示器)輸出格式化字符串,而sprintf()函數(shù)則是向指定的緩沖區(qū)(數(shù)組)輸出格式化字符串。(2)若程序中使用了sprintf()函數(shù),則需在程序文件的開頭處包含頭文件stdio.h。(4)sprintf()函數(shù)實現(xiàn)方法與步驟與任務9相比,任務10的硬件電路增加了8只發(fā)光二極管控制電路,任務10的硬件電路:
1.搭建電路
2.生成硬件初始化代碼相對于任務9而言,任務10中增加了PE0~PE7,其初始化代碼可在任務9的基礎(chǔ)上產(chǎn)生,其生成過程如下:步驟(1)在“D:\ex”文件夾中新建Task10子文件夾。(2)將任務9的STM32CubeMX工程文件Task9.ioc(位于“D:\ex\Task9”文件夾中)復制到Task10文件夾中,并將其改名為Task10.ioc。(3)雙擊Task10.ioc文件圖標,打開任務10的STM32CubeMX工程文件。
2.生成硬件初始化代碼步驟(4)按照任務2中介紹的方法將PE0~PE7設(shè)置為輸出口,輸出電平為高電平、推挽輸出、無上拉電阻也無下拉電阻、高速輸出、無用戶標簽。(5)保存STM32CubeMX工程文件,然后在工程窗口中點擊“GENERATECODE”按鈕,STM32CubeMX就會生成任務10的初始化代碼。
3.編寫數(shù)據(jù)接收程序本任務中,我們將數(shù)據(jù)接收程序放在自定義文件Serial.c中步驟(1)在“D:\ex\Task10”文件夾中新建User子文件夾,用來保存用戶程序文件。(2)打開“D:\ex\Task10\MDK-ARM”文件夾,然后雙擊文件夾中的Keil工程文件Task10.uvprojx,打開任務10的Keil工程。若任務10的Keil工程已打開,則跳過此步。
3.編寫數(shù)據(jù)接收程序步驟(3)在Keil工程中新建User工程組,其方法如下:第1步:在“Project”窗口中點擊“Project:Task10”前面的“+”號,將工程展開。第2步:用鼠標右鍵點擊“Task10”,在彈出的快捷菜單中點擊“AddGroup”菜單項。第3步:分2次用鼠標點擊“NewGroup”組名(注意:不是雙擊),將光標移至組名中,再將組名修改為“User”,然后用鼠標點擊窗口的任意地方。3.編寫數(shù)據(jù)接收程序步驟(4)在Keil中新建Serial.c文件和Serial.h文件,并保存至D:\ex\Task10\User文件夾中。(5)在Serial.c文件中定義串口接收緩沖區(qū)數(shù)組UserRxBuf[]、接收數(shù)據(jù)計數(shù)器UserRxCnt、串口接收緩沖器aRxBuf,并重定義fputc()函數(shù)和串口接收中斷回調(diào)函數(shù)HAL_UART_RxCpltCallback()。(6)在Serial.h文件中添加3個全局變量UserRxBuf[]、UserRxCnt、aRxBuf的說明。3.編寫數(shù)據(jù)接收程序步驟(7)將Serial.c文件添加至User組中。其方法如下:第1步:在Project窗口中用鼠標右鍵點擊“User”組名,然后在彈出的菜單中點擊如圖所示的“AddExistingFilestoGroup‘User’”菜單項,打開如圖所示的添加文件對話框。3.編寫數(shù)據(jù)接收程序步驟第2步:在添加文件對話框中點擊“文件類型(T)”下拉列表框,從中選擇“CSourcefile(*.c)”列表項,再在“查找范圍(I)”下拉列表框選擇Serial.c文件存放的文件夾“D:\ex\Task10\User”,“查找范圍(I)”下面的列表框中就會顯示Serial.c文件。第3步:在添加文件對話框中點擊Serial.c文件(圖中的第3處),對話框的“文件名(N)”文本框中就會出現(xiàn)我們所選擇的文件,再點擊“Add”按鈕,將Serial.c文件添加至User組中,此時User組的前面會出現(xiàn)“+”加號。第4步:關(guān)閉添加文件對話框。第5步:在Project窗口中點擊“User”組名前的“+”號,就可以看到Serial.c文件位于User組中,表明Serial.c文件添加成功,如圖所示。3.編寫數(shù)據(jù)接收程序添加文件對話框文件添加的結(jié)果
4.編寫數(shù)據(jù)處理程序?qū)⑸鲜龃a按照程序編寫規(guī)范的要求添加至main.c文件的對應處,我們要以發(fā)現(xiàn)以下現(xiàn)象:(1)在“#include“Serial.h””語句前有一個“X”符號,將鼠標移至該符號出會出現(xiàn)“fatalerror:‘Serial.h’filenotfound”的提示。main.c文件中的用戶應用程序
4.在main.c文件中編寫應用程序(2)編譯程序時輸出窗口中會出現(xiàn)如圖所示的錯誤提示。上述提示的含義是,沒找到頭文件Serial.h。其原因是,Serial.h文件所在的文件夾“D:\ex\Task10\User”并不是工程的頭文件所在文件夾,解決問題的方法是,在任務10的Keil工程中增加Serial.h文件所在的文件夾。main.c文件中的用戶應用程序5.增加include目錄步驟第1步:在Keil窗口中單擊圖標工具按鈕“
”,打開如圖所示OptionsforTarget對話框。第2步:在第一步所示對話框中點擊“C/C++”標簽,再點擊includePaths后面的“
”按鈕,打開如圖所示的FolderSetup對話框。5.增加include目錄步驟第3步:在FolderSetup對話框中點擊插入圖標按鈕“
”,在列表框中插入一個空白行,然后點擊空白行后面的“
”按鈕,打開如圖所示的“選擇文件夾”對話框。第4步:在選擇文件夾對話框中的地址欄中選擇文件夾“D:\ex\Task10”(參考右圖),對話框的列表框中就會顯示“D:\ex\Task10”文件夾中的內(nèi)容,然后在列表框中點擊“User”文件夾名(圖中第2處)再點擊“選擇文件夾”接鈕,返回至第二步所示對話框中。5.增加include目錄步驟第5步:在第2步所示對話框中點擊“OK”按鈕,再返回第1步所示的FolderSetup對話框中。第6步:在FolderSetup對話框中點擊“OK”按鈕,完成頭文件位置的設(shè)置。
6.調(diào)試與下載程序步驟(1)按照前面任務中介紹的方法編譯連接程序,并調(diào)試程序直至程序正確無誤。(2)將程序下載至開發(fā)板中,并運行程序。(3)打開串口調(diào)試助手,并按圖所示設(shè)置好串行通信參數(shù),其中數(shù)據(jù)按Hex發(fā)送。6.調(diào)試與下載程序步驟
(4)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 古典園林修復施工合同
- 幼兒園班主任辭職報告15篇
- 四年級閱讀指導課教案設(shè)計-小學四年級閱讀指導課教案
- 幼兒園教師述職報告集錦15篇
- 一生的讀書計劃心得10篇
- 2025企業(yè)規(guī)范集體合同書
- 2024年電梯設(shè)備進口報關(guān)合同
- DB45T 2641-2023 喀斯特森林生態(tài)系統(tǒng)木本植物多樣性定位監(jiān)測技術(shù)規(guī)范
- 銷售轉(zhuǎn)正工作總結(jié)(15篇)
- 認知框架如何影響商業(yè)模式創(chuàng)新
- 材料力學第4版單輝祖習題答案
- 造紙企業(yè)清潔生產(chǎn)報告2014年
- 診所抗菌藥物管理制度
- 智慧嬰幼兒托管解決方案
- 設(shè)計構(gòu)成與應用 完整全套教學課件 第1-12章 平面構(gòu)成設(shè)計元素- 立體構(gòu)成在建筑設(shè)計中的應用
- 2、廣東省高速公路發(fā)展股份有限公司 2019年度內(nèi)控缺陷整改臺賬
- 物業(yè)公司安全生產(chǎn)檢查表
- 室內(nèi)配套設(shè)備家具、家電及窗簾等項目供貨服務方案技術(shù)投標方案
- 公司規(guī)章制度清單
- 《高效能人士的七個習慣》PPT演講模板
- 獨領(lǐng)風騷的古代技術(shù)創(chuàng)造
評論
0/150
提交評論