![STM32使用DMA加串口空閑中斷接收數(shù)據(jù)_第1頁(yè)](http://file2.renrendoc.com/fileroot_temp3/2021-3/9/56ebd6ce-09b1-4559-8a3f-92f42fe07fbf/56ebd6ce-09b1-4559-8a3f-92f42fe07fbf1.gif)
![STM32使用DMA加串口空閑中斷接收數(shù)據(jù)_第2頁(yè)](http://file2.renrendoc.com/fileroot_temp3/2021-3/9/56ebd6ce-09b1-4559-8a3f-92f42fe07fbf/56ebd6ce-09b1-4559-8a3f-92f42fe07fbf2.gif)
![STM32使用DMA加串口空閑中斷接收數(shù)據(jù)_第3頁(yè)](http://file2.renrendoc.com/fileroot_temp3/2021-3/9/56ebd6ce-09b1-4559-8a3f-92f42fe07fbf/56ebd6ce-09b1-4559-8a3f-92f42fe07fbf3.gif)
![STM32使用DMA加串口空閑中斷接收數(shù)據(jù)_第4頁(yè)](http://file2.renrendoc.com/fileroot_temp3/2021-3/9/56ebd6ce-09b1-4559-8a3f-92f42fe07fbf/56ebd6ce-09b1-4559-8a3f-92f42fe07fbf4.gif)
![STM32使用DMA加串口空閑中斷接收數(shù)據(jù)_第5頁(yè)](http://file2.renrendoc.com/fileroot_temp3/2021-3/9/56ebd6ce-09b1-4559-8a3f-92f42fe07fbf/56ebd6ce-09b1-4559-8a3f-92f42fe07fbf5.gif)
版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、 STM32使用DMA加串口空閑中斷接收數(shù)據(jù) STM32中,需要用串口接收數(shù)據(jù),是使用串口中斷來(lái)接收數(shù)據(jù)。但是用這種方法的話(huà),就要頻繁進(jìn)入串口中斷,然后處理,效率就比較低。于是就想到用DMA來(lái)接收串口數(shù)據(jù),這個(gè)STM32也是支持的。但是關(guān)鍵的一點(diǎn),怎么知道數(shù)據(jù)接收完畢了呢?如果接收的數(shù)據(jù)長(zhǎng)度固定,那就好辦,直接設(shè)置DMA的接收數(shù)據(jù)個(gè)數(shù)就行了。但是如果長(zhǎng)度不固定了,那應(yīng)該怎么辦了?這個(gè)時(shí)候,就要用到STM32在串口中提供的另一個(gè)好用的東西了,就是串口空閑中斷。在STM32的串口控制器中,設(shè)置了有串口空閑中斷,即如果串口空閑,又開(kāi)啟了串口空閑中斷的話(huà),就觸發(fā)串口空閑中斷,然后程序就會(huì)跳到串口中斷去
2、執(zhí)行。有了這個(gè),是不是可以判斷什么時(shí)候串口數(shù)據(jù)接收完畢了呢?因?yàn)榇跀?shù)據(jù)接收完畢后,串口總線肯定是會(huì)空閑的嘛,那這個(gè)中斷肯定是會(huì)觸發(fā)的了。還有一個(gè)問(wèn)題,這串口空閑中斷是只要串口空閑就會(huì)產(chǎn)生嗎?其實(shí)不是的,串口空閑中斷要觸發(fā)的話(huà),是要RXNE位被置位后,串口總線空閑才會(huì)觸發(fā)的。所以我們不用擔(dān)心,串口數(shù)據(jù)發(fā)送完畢后,會(huì)不會(huì)觸發(fā)串口空閑中斷了。下面用代碼來(lái)說(shuō)明。1、配置串口。包括設(shè)置串口的引腳配置,串口的配置,串口中斷的配置,串口的接收DMA的配置void USART_init(void) GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef
3、USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; /開(kāi)啟時(shí)鐘 RCC_APB2PeriphClockCmd(USART_RCC,ENABLE); /配置TX端口 GPIO_InitStructure.GPIO_Pin = GPIO_USART_TX; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIO_USART_TYPE,&GPIO_InitStructu
4、re); /配置RX端口 GPIO_InitStructure.GPIO_Pin = GPIO_USART_RX; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIO_USART_TYPE,&GPIO_InitStructure); /配置串口模式 USART_InitStructure.USART_BaudRate = 115200; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_S
5、topBits = USART_StopBits_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; USART_Init(USART1,&USART_InitStructure); /中斷配置 NVIC_InitStructure.NVIC_IRQCha
6、nnel = USART1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStructure.NVIC_IRQChannelSubPriority=0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); /* 若總線空閑,產(chǎn)生中斷 */ USART_ITConfig(USART1, USART_IT_IDLE, ENABLE); /*開(kāi)啟串口DMA接收*/ USART_DMACmd(US
7、ART1,USART_DMAReq_Rx,ENABLE); USART_Cmd(USART1,ENABLE);代碼比較簡(jiǎn)單,一看就明白了,這就是使用庫(kù)函數(shù)開(kāi)發(fā)的好處,代碼易懂。這里,關(guān)鍵的是要開(kāi)啟總線空閑中斷,并且開(kāi)啟串口DMA接收。注意,不要開(kāi)啟串口接收中斷,不然接收數(shù)據(jù)就會(huì)一直產(chǎn)生中斷了。2、DMA配置DMA配置,要先查看串口接收是使用的哪個(gè)DMA的哪個(gè)通道,對(duì)于USART1_RX使用的是DMA1的5通道。然后就是代碼配置DMA了。void DMA_init(void) DMA_InitTypeDef DMA_Initstructure;/ NVIC_InitTypeDef NVIC_In
8、itstructure; /*開(kāi)啟DMA時(shí)鐘*/ RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE); / /* Enable the DMA1 Interrupt */ NVIC_Initstructure.NVIC_IRQChannel = DMA1_Channel4_IRQn; /通道設(shè)置為串口1中斷/ NVIC_Initstructure.NVIC_IRQChannelSubPriority = 1; /中斷響應(yīng)優(yōu)先級(jí)0/ NVIC_Initstructure.NVIC_IRQChannelPreemptionPriority=1;/ NV
9、IC_Initstructure.NVIC_IRQChannelCmd = ENABLE; /打開(kāi)中斷/ NVIC_Init(&NVIC_Initstructure); /*DMA配置*/ DMA_Initstructure.DMA_PeripheralBaseAddr = (u32)(&USART1-DR); DMA_Initstructure.DMA_MemoryBaseAddr = (u32)receive_data; DMA_Initstructure.DMA_DIR = DMA_DIR_PeripheralSRC; DMA_Initstructure.DMA_BufferSize =
10、 128; DMA_Initstructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_Initstructure.DMA_MemoryInc =DMA_MemoryInc_Enable; DMA_Initstructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; DMA_Initstructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; DMA_Initstructure.DMA_Mode = DMA_Mode_
11、Normal; DMA_Initstructure.DMA_Priority = DMA_Priority_High; DMA_Initstructure.DMA_M2M = DMA_M2M_Disable; DMA_Init(DMA1_Channel5,&DMA_Initstructure); /啟動(dòng)DMA DMA_Cmd(DMA1_Channel5,ENABLE); /開(kāi)啟DMA發(fā)送發(fā)成中斷 /DMA_ITConfig(DMA1_Channel4,DMA_IT_TC,ENABLE); 因?yàn)檫@里,不需要用到DMA中斷,所以DMA中斷就不要使能了。因此DMA中斷配置也就不需要了。這里,關(guān)鍵的是
12、要設(shè)置DMA_DIR為DMA_DIR_PeripheralSRC,表示數(shù)據(jù)是從外設(shè)到內(nèi)存。這里設(shè)定的DMA_Mode是普通模式,即數(shù)據(jù)傳輸就只能一次。3、串口中斷程序編寫(xiě)這個(gè)就是關(guān)鍵的地方了。在這里,需要做什么了。需要對(duì)DMA設(shè)置下。當(dāng)進(jìn)入這個(gè)中斷的時(shí)候,串口接收的數(shù)據(jù),已經(jīng)在內(nèi)存的數(shù)組中了。通過(guò)讀取DMA的計(jì)數(shù)值,就可以知道接收到了多少個(gè)數(shù)據(jù)。然后再把DMA給diable掉,重新設(shè)置接收數(shù)據(jù)長(zhǎng)度,在開(kāi)啟DMA,接收下一次串口數(shù)據(jù)。為什么要這么做了,因?yàn)樵赟TM32手冊(cè)中有如下說(shuō)明:另外還有一點(diǎn),串口空閑中斷觸發(fā)后,硬件會(huì)自動(dòng)將串口空閑中斷標(biāo)志位給置1,我們是需要將給標(biāo)志位給置0的,不然又要進(jìn)
13、中斷了,這個(gè)在手冊(cè)中也有說(shuō)明。代碼就如下了: void USART1_IRQHandler(void) unsigned char num=0; if(USART_GetITStatus(USART1,USART_IT_IDLE) = SET) num = USART1-SR; num = USART1-DR; /清USART_IT_IDLE標(biāo)志 DMA_Cmd(DMA1_Channel5,DISABLE); /關(guān)閉DMA num = 128 - DMA_GetCurrDataCounter(DMA1_Channel5); /得到真正接收數(shù)據(jù)個(gè)數(shù) receive_datanum = 0; DMA1_Channel5-CNDTR=128; /重新設(shè)置接收數(shù)據(jù)個(gè)數(shù) DMA_Cmd(DMA1_Channel5,ENABLE); /開(kāi)啟DMA receive_flag = 1; /接收數(shù)據(jù)標(biāo)志位置1 關(guān)鍵的一點(diǎn),就是要讀取SR,DR,將USART_IT_IDLE標(biāo)志給清掉,然后DMA設(shè)置要注意下。在主函數(shù)中,使用下面代碼測(cè)試: int main() periph_init(); printf
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年重慶貨運(yùn)從業(yè)資格證模擬試題答案大全及答案
- 2025年貴州貨運(yùn)從業(yè)資格證500道題目答案
- 2025年池州道路貨運(yùn)駕駛員從業(yè)資格證考試
- 2025年巴彥淖爾貨運(yùn)從業(yè)資格證考試模擬考試
- 病人護(hù)理服務(wù)合同(2篇)
- 北京課改版歷史七年級(jí)下冊(cè)第2課《貞觀之治》聽(tīng)課評(píng)課記錄
- 2024-2025學(xué)年八年級(jí)數(shù)學(xué)上冊(cè)第十三章軸對(duì)稱(chēng)13.1軸對(duì)稱(chēng)教案新版新人教版
- 2024-2025學(xué)年高中數(shù)學(xué)課時(shí)分層作業(yè)13向量的概念含解析新人教B版必修4
- 2024-2025學(xué)年七年級(jí)數(shù)學(xué)上冊(cè)第1章有理數(shù)1.5有理數(shù)的乘法和除法作業(yè)設(shè)計(jì)新版湘教版
- 英語(yǔ)七年級(jí)聽(tīng)評(píng)課記錄
- 西門(mén)子starter軟件簡(jiǎn)易使用手冊(cè)
- 暢捷通g6財(cái)務(wù)管理系統(tǒng)專(zhuān)業(yè)版使用手冊(cè)
- 化工儀表及自動(dòng)化ppt課件匯總?cè)譸pt完整版課件最全教學(xué)教程整套課件全書(shū)電子教案全套電子講義
- 2022注冊(cè)電氣工程師專(zhuān)業(yè)考試規(guī)范清單匯總
- 桂花-作文ppt-PPT課件(共14張)
- 高一數(shù)學(xué)概率部分知識(shí)點(diǎn)總結(jié)及典型例題解析 新課標(biāo) 人教版 必修
- 鐵路運(yùn)費(fèi)計(jì)算方法
- 《小腦梗死護(hù)理查房》
- 免疫及炎癥相關(guān)信號(hào)通路
- 某風(fēng)電場(chǎng)設(shè)備材料設(shè)備清單
- —橋梁專(zhuān)業(yè)施工圖設(shè)計(jì)審查要(終)
評(píng)論
0/150
提交評(píng)論