版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第第頁STM32f103串口接收不定長數(shù)據(jù)方法1:串口接受數(shù)據(jù),定時器來判斷超時是否接受數(shù)據(jù)完成。
方法2:DMA接受+IDLE中斷
實現(xiàn)思路:采用STM32F103的串口1,并配置成空閑中斷IDLE模式且使能DMA接收,并同時設(shè)置接收緩沖區(qū)和初始化DMA。那么初始化完成之后,當(dāng)外部給單片機(jī)發(fā)送數(shù)據(jù)的時候,假設(shè)這幀數(shù)據(jù)長度是200個字節(jié),那么在單片機(jī)接收到一個字節(jié)的時候并不會產(chǎn)生串口中斷,而是DMA在后臺把數(shù)據(jù)默默地搬運到你指定的緩沖區(qū)里面。當(dāng)整幀數(shù)據(jù)發(fā)送完畢之后串口才會產(chǎn)生一次中斷,此時可以利用DMA_GetCurrDataCounter();函數(shù)計算出本次的數(shù)據(jù)接受長度,從而進(jìn)行數(shù)據(jù)處理。
應(yīng)用對象:適用于各種串口相關(guān)的通信協(xié)議,如:MODBUS,PPI;還有類似于GPS數(shù)據(jù)接收解析,串口WIFI的數(shù)據(jù)接收等,都是很好的應(yīng)用對象。
關(guān)鍵代碼分析:
voiduart_init(u32bound);voidMYDMA_Enable(DMA_Channel_TypeDef*DMA_CHx);#endifusart.C//初始化IO串口1//bound:波特率voiduart_init(u32bound){//GPIO端口設(shè)置GPIO_InitTypeDefGPIO_InitStructure;USART_InitTypeDefUSART_InitStructure;NVIC_InitTypeDefNVIC_InitStructure;DMA_InitTypeDefDMA_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA,ENABLE);//使能USART1,GPIOA時鐘RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);//使能DMA傳輸RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);//使能USART2時鐘USART_DeInit(USART1);//復(fù)位串口1//USART1_TXPA.9GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;//PA.9GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//復(fù)用推挽輸出GPIO_Init(GPIOA,//初始化PA9//USART1_RXPA.10GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;//浮空輸入GPIO_Init(GPIOA,//初始化PA10//Usart1NVIC配置NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;//搶占優(yōu)先級3NVIC_InitStructure.NVIC_IRQChannelSubPriority=3;//子優(yōu)先級3NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;//IRQ通道使能NVIC_Init(//根據(jù)指定的參數(shù)初始化VIC寄存器//USART初始化設(shè)置USART_InitStructure.USART_BaudRate=bound;USART_InitStructure.USART_WordLength=USART_WordLength_8b;//字長為8位數(shù)據(jù)格式USART_InitStructure.USART_StopBits=USART_StopBits_1;//一個停止位USART_InitStructure.USART_Parity=USART_Parity_No;//無奇偶校驗位USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//無硬件數(shù)據(jù)流控制USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;//收發(fā)模式USART_Init(USART1,//初始化串口USART_ITConfig(USART1,USART_IT_IDLE,ENABLE);//開啟空閑中斷USART_DMACmd(USART1,USART_DMAReq_Rx,ENABLE);//使能串口1DMA接收USART_Cmd(USART1,ENABLE);//使能串口//相應(yīng)的DMA配置DMA_DeInit(DMA1_Channel5);//將DMA的通道5寄存器重設(shè)為缺省值串口1對應(yīng)的是DMA通道5DMA_InitStructure.DMA_PeripheralBaseAddr=(u32)//DMA外設(shè)usart基地址DMA_InitStructure.DMA_MemoryBaseAddr=(u32)DMA_Rece_Buf;//DMA內(nèi)存基地址DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralSRC;//數(shù)據(jù)傳輸方向,從外設(shè)讀取發(fā)送到內(nèi)存DMA_InitStructure.DMA_BufferSize=DMA_Rec_Len;//DMA通道的DMA緩存的大小DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable;//外設(shè)地址寄存器不變DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable;//內(nèi)存地址寄存器遞增DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_Byte;//數(shù)據(jù)寬度為8位DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_Byte;//數(shù)據(jù)寬度為8位DMA_InitStructure.DMA_Mode=DMA_Mode_Normal;//工作在正常緩存模式DMA_InitStructure.DMA_Priority=DMA_Priority_Medium;//DMA通道x擁有中優(yōu)先級DMA_InitStructure.DMA_M2M=DMA_M2M_Disable;//DMA通道x沒有設(shè)置為內(nèi)存到內(nèi)存?zhèn)鬏擠MA_Init(DMA1_Channel5,//根據(jù)DMA_InitStruct中指定的參數(shù)初始化DMA的通道DMA_Cmd(DMA1_Channel5,ENABLE);//正式驅(qū)動DMA傳輸}//重新恢復(fù)DMA指針voidMYDMA_Enable(DMA_Channel_TypeDef*DMA_CHx){DMA_Cmd(DMA_CHx,DISABLE);//關(guān)閉USART1TXDMA1所指示的通道DMA_SetCurrDataCounter(DMA_CHx,DMA_Rec_Len);//DMA通道的DMA緩存的大小DMA_Cmd(DMA_CHx,ENABLE);//打開USART1TXDMA1所指示的通道}//發(fā)送len個字節(jié)//buf:發(fā)送區(qū)首地址//len:發(fā)送的字節(jié)數(shù)voidUsart1_Send(u8*buf,u8len){u8t;for(t=0;t這是串口CR1寄存器,其中,對bit4寫1開啟IDLE中斷,對bit5寫1開啟接收數(shù)據(jù)中斷。(注意:不同系列的STM32,對應(yīng)的寄存器位可能不同)
RXNE中斷和IDLE中斷的區(qū)別?當(dāng)接收到1個字節(jié),就會產(chǎn)生RXNE中斷,當(dāng)接收到一幀數(shù)據(jù),就會產(chǎn)生IDLE中斷。比如給單片機(jī)一次性發(fā)送了8個字節(jié),就會產(chǎn)生8次RXNE中斷,1次IDLE中斷。這是狀態(tài)寄存器,當(dāng)串口接收到數(shù)據(jù)時,bit5就會自動變成1,當(dāng)接收完一幀數(shù)據(jù)后,bit4就會變成1.
需要注意的是,在中斷函數(shù)里面,需要把對應(yīng)的位清0,否則會影響下一次數(shù)據(jù)的接收。比如RXNE接收數(shù)據(jù)中斷,只要把接收到的一個字節(jié)讀出來,就會清除這個中斷。IDLE中斷,如何是F0系列的單片機(jī),需要用ICR寄存器來清除,如果是F1系列的單片機(jī),清除方法是“先讀SR寄存器,再讀DR寄存器”。(我怎么知道?手冊上寫的)
下面以STM32F103為例給出源程序。
我們先來看程序中的主要部分。串口初始化函數(shù)片段
/*****************************************************************************名稱:voidUSART1_Configuration(void)*功能:配置USART1參數(shù)*入口參數(shù):*出口參數(shù):無*說明:*調(diào)用方法:無****************************************************************************/voidUSART1_Configuration(void){GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;//USART1TXGPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//復(fù)用推挽輸出GPIO_Init(GPIOA,//A端口GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;//USART1RXGPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;//復(fù)用開漏輸入GPIO_Init(GPIOA,//A端口USART_InitStructure.USART_BaudRate=USART_BAUDRATE;//波特率250000bpsUSART_InitStructure.USART_WordLength=USART_WordLength_8b;//數(shù)據(jù)位8位USART_InitStructure.USART_StopBits=USART_StopBits_1;//停止位1位USART_InitStructure.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,//配置串口參數(shù)函數(shù)USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//使能接收中斷USART_ITConfig(USART1,USART_IT_IDLE,ENABLE);//空閑中斷USART_Cmd(USART1,ENABLE);//使能USART1}
串口中斷函數(shù)
voidUSART1_IRQHandler(void)//串口1中斷服務(wù)程序{uint8_tClear=0;/*如果接收到一字節(jié)數(shù)據(jù)*/if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)//判斷讀寄存器是否非空{(diào)USART_ClearITPendingBit(USART1,USART_IT_RX
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度國家級創(chuàng)新平臺財政資金股權(quán)投資委托管理合同3篇
- 二零二五年度新型住宅小區(qū)開發(fā)商委托專業(yè)物業(yè)管理地下車庫服務(wù)合同3篇
- 二零二五年度LED燈具研發(fā)生產(chǎn)與安裝服務(wù)合同模板2篇
- 二零二五年度旅游度假村個人開發(fā)承包合同示例3篇
- 二零二五年度國有企業(yè)員工持股計劃股權(quán)轉(zhuǎn)讓合同3篇
- 二零二五年度影視作品角色形象使用權(quán)許可合同3篇
- 二零二五年度板材夾板加工定制專項合同2篇
- 海南醫(yī)學(xué)院《生物醫(yī)藥進(jìn)展專題1》2023-2024學(xué)年第一學(xué)期期末試卷
- 2025版鉆井平臺打井工程維護(hù)保養(yǎng)合同2篇
- 海南衛(wèi)生健康職業(yè)學(xué)院《網(wǎng)絡(luò)應(yīng)用開發(fā)》2023-2024學(xué)年第一學(xué)期期末試卷
- 民航概論5套模擬試卷考試題帶答案
- 2024屆中國電建地產(chǎn)校園招聘網(wǎng)申平臺高頻500題難、易錯點模擬試題附帶答案詳解
- 2024包鋼(集團(tuán))公司招聘941人高頻考題難、易錯點模擬試題(共500題)附帶答案詳解
- 基于信創(chuàng)底座的智慧交通行業(yè)解決方案
- 2024年青海省中考生物地理合卷試題(含答案解析)
- 大學(xué)美育-美育賞湖南智慧樹知到期末考試答案章節(jié)答案2024年湖南高速鐵路職業(yè)技術(shù)學(xué)院
- 數(shù)據(jù)結(jié)構(gòu)期末考試題及答案
- 廣州市番禺區(qū)2022-2023學(xué)年七年級上學(xué)期期末統(tǒng)考英語試題
- 重大事故隱患判定標(biāo)準(zhǔn)與相關(guān)事故案例培訓(xùn)課件(建筑)
- DZ/T 0430-2023 固體礦產(chǎn)資源儲量核實報告編寫規(guī)范(正式版)
- 2024浙江寧波市象山縣人力資源和社會保障局招聘歷年公開引進(jìn)高層次人才和急需緊缺人才筆試參考題庫(共500題)答案詳解版
評論
0/150
提交評論