精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

STM32使用DMA接收串口數據

商務辦公
在串口講解的文章中,示例代碼采用中斷方式接收和發送數據,中斷的好處在于可以及時響應,快速接收到數據,但缺點也很明顯,那就是頻繁中斷,接收1000個字節需要中斷1000次,頻繁中斷就意味著會打斷其他代碼的執行,對一些應用場景是不允許的。

[[397454]]

01概述

在之前的文章里《STM32串口詳解》和《STM32 DMA詳解》文章中,詳細講解了STM32的串口和DMA外設,本篇文章將不在細述串口和DMA的知識。

在串口講解的文章中,示例代碼采用中斷方式接收和發送數據,中斷的好處在于可以及時響應,快速接收到數據,但缺點也很明顯,那就是頻繁中斷,接收1000個字節需要中斷1000次,頻繁中斷就意味著會打斷其他代碼的執行,對一些應用場景是不允許的。這個時候,使用DMA+串口的組合就可以很好解決這個問題。

DMA每個數據流有8個通道,每個通道映射到不同外設,這有利于針對不同的產品配置不同的DMA外設請求。

每個數據流只能配置為映射到一個通道,無法配置為映射到多個通道。即,與數據流不同,每個DMA控制器可以同時配置多個數據流(因為有仲裁器),但每個數據流不能同時配置多個通道(因為只有選擇器)。

我們使用USART1串口外設,從數據手冊中可以查到,USART1的發送和接收都是支持DMA的,使用的是DMA2.

接下來我們循序漸進了解DMA在串口中的應用

02DMA接收

我們先配置DMA,將DMA外設和串口聯動起來。首先需要配置DMA。

DMA配置這一塊不再詳解,不太懂的同學請看文章《STM32DMA詳解》,這里我們直接貼代碼。

  1. void DMA_Config(void) 
  2.   DMA_InitTypeDef  DMA_InitStructure; 
  3.      
  4.   /* Enable DMA clock */ 
  5.   RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE); 
  6.    
  7.   /* Reset DMA Stream registers (for debug purpose) */ 
  8.   DMA_DeInit(DMA2_Stream2); 
  9.  
  10.   /* Check if the DMA Stream is disabled before enabling it. 
  11.      Note that this step is useful when the same Stream is used multiple times: 
  12.      enabled, then disabled then re-enabled... In this case, the DMA Stream disable 
  13.      will be effective only at the end of the ongoing data transfer and it will  
  14.      not be possible to re-configure it before making sure that the Enable bit  
  15.      has been cleared by hardware. If the Stream is used only once, this step might  
  16.      be bypassed. */ 
  17.   while (DMA_GetCmdStatus(DMA2_Stream2) != DISABLE) 
  18.   { 
  19.   } 
  20.    
  21.   /* Configure DMA Stream */ 
  22.   DMA_InitStructure.DMA_Channel = DMA_Channel_4;  //DMA請求發出通道 
  23.   DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&USART1->DR;//配置外設地址 
  24.   DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)UART_Buffer;//配置存儲器地址 
  25.   DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;//傳輸方向配置 
  26.   DMA_InitStructure.DMA_BufferSize = (uint32_t)32;//傳輸大小 
  27.   DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//外設地址不變 
  28.   DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//memory地址自增 
  29.   DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;//外設地址數據單位 
  30.   DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;//memory地址數據單位 
  31.   DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;//DMA模式:正常模式 
  32.   DMA_InitStructure.DMA_Priority = DMA_Priority_High;//優先級:高 
  33.   DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;//FIFO 模式不使能.           
  34.   DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;// FIFO 閾值選擇 
  35.   DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;//存儲器突發模式選擇,可選單次模式、 4 節拍的增量突發模式、 8 節拍的增量突發模式或 16 節拍的增量突發模式。 
  36.   DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;//外設突發模式選擇,可選單次模式、 4 節拍的增量突發模式、 8 節拍的增量突發模式或 16 節拍的增量突發模式。 
  37.   DMA_Init(DMA2_Stream2, &DMA_InitStructure);  
  38.    
  39.   /* DMA Stream enable */ 
  40.   DMA_Cmd(DMA2_Stream2, ENABLE); 

除了配置DMA外設外,我們還需要配置串口對應的DMA配置,在手冊有一小章節講解到。

需要配置的寄存器是USART_CR3寄存器。

我們可以通過配置USART_CR3寄存器的bit6和bit7使能串口發送和接收DMA。ST的標準外設庫同樣提供了對應的外設庫。

  1. void USART_DMACmd(USART_TypeDef* USARTx, uint16_t USART_DMAReq, FunctionalState NewState) 

通過上面接口可以配置串口的DMA配置如下:

  1. /*使能串口DMA接收*/ 
  2. USART_DMACmd(USART1, USART_DMAReq_Rx, ENABLE); 

03中斷

我們使用DMA+串口解決了頻繁中斷的問題,但現在有一個問題,我們還需要及時將接收的數據信息通知CPU,以便達到數據的及時性。我們使用DMA和串口兩個外設,他們都有自己的中斷。

使用DMA中斷,如下配置

  1. /* Enable DMA Stream Transfer Complete interrupt */ 
  2. DMA_ITConfig(DMA2_Stream2, DMA_IT_TC, ENABLE); 
  3.    
  4. /* Enable the DMA Stream IRQ Channel */ 
  5. NVIC_InitStructure.NVIC_IRQChannel = DMA2_Stream2_IRQn; 
  6. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; 
  7. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; 
  8. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 
  9. NVIC_Init(&NVIC_InitStructure); 

當DMA接收完畢時,會產生中斷通知CPU取數據。

但這有個明顯的缺陷:串口接收一包數據,長度如果小于DMA的緩沖長度,那么久不能觸發中斷,只能等DMA接收滿數據才會產生中斷,如果下一包數據遲遲不來,那么這一包就不能被及時響應。

那么我們采用串口中斷是一個不錯的方案。串口提供了一個空閑中斷,“似乎”就是為了DMA專門使用的。

當串口接收一包數據,接收完最后一個字節,沒有數據接收時,會產生一個中斷,這個時候,CPU就可以取數據。

串口的配置知識不再講解,不太懂的同學請看《STM32串口詳解》,串口空閑中斷配置如下

  1. USART_ITConfig(USART1, USART_IT_IDLE, ENABLE); 
  2.    
  3. /* Enable the USARTx Interrupt */ 
  4. NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; 
  5. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =0; 
  6. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; 
  7. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 
  8. NVIC_Init(&NVIC_InitStructure); 

串口中斷代碼如下

  1. void USART1_IRQHandler(void) 
  2.   uint8_t temp
  3.   if(USART_GetFlagStatus(USART1, USART_FLAG_IDLE) == SET
  4.   { 
  5.     DealWith_UartData(); 
  6. //    USART_ClearFlag(USART1, USART_FLAG_IDLE); 
  7.     temp = USART1->SR;   
  8.     temp = USART1->DR; //清USART_IT_IDLE標志   
  9.   } 

重點:這里有一個坑!!!

清除空閑中斷位的代碼是

  1. temp = USART1->SR;    
  2. temp = USART1->DR; //清USART_IT_IDLE標志 

證據如下

這一點很坑人,注意。

04代碼

DMA+串口接收的工程代碼是開源的,Keil和IAR的工程都有

  • 33-USART-DMA-Receive DMA串口接收(沒有使用中斷)
  • 34-USART-Receive-DMAInterrupt DMA串口接收(DMA中斷)
  • 35-USART-DMA-Receive-Interrupt DMA串口接收(串口空閑中斷)

PCB和工程代碼開源地址:

https://github.com/strongercjd/STM32F207VCT6

本文轉載自微信公眾號「知曉編程」,可以通過以下二維碼關注。轉載本文請聯系知曉編程公眾號。

 

責任編輯:武曉燕 來源: 知曉編程
相關推薦

2021-05-20 07:26:22

DMASTM32數據

2021-02-03 13:04:24

STM32網絡控制器

2021-06-26 07:50:20

STM32串口開發環形緩沖區

2021-08-31 08:01:40

STM32DSP指令

2022-07-25 14:31:55

LiteOS開發工具

2021-02-05 08:41:44

STM32網絡中斷

2021-01-20 09:51:25

STM32網絡接口

2021-08-26 06:29:47

STM32DWT數據觀察點觸發

2022-10-10 08:24:15

編程數據邏輯語句

2021-12-22 06:56:07

STM32C語言內存

2022-01-07 08:24:13

STM32枚舉結構體

2021-03-06 21:21:11

STM32單片機追蹤庫

2021-04-22 08:39:23

哈佛結構馮洛伊曼結構ARM架構

2021-02-01 06:39:42

模塊封裝庫

2020-12-03 06:32:21

STM32單片機通信

2021-11-15 09:53:16

STM32PSPMSP

2018-10-15 10:15:30

STM32Linux經驗

2021-02-26 08:46:46

PHY寄存器網絡

2020-01-10 22:51:30

硬件軟件人生第一份工作

2011-07-01 13:03:32

QT 線程 串口
點贊
收藏

51CTO技術棧公眾號

欧美成人r级一区二区三区| 国产91对白在线观看九色| 亚洲欧美日韩第一区| 免费在线观看毛片网站| 国产98在线| 精品一区精品二区高清| 精品中文字幕乱| 偷偷色噜狠狠狠狠的777米奇| 9999热视频在线观看| 久久香蕉国产线看观看99| 国产精品xxxxx| 91高清免费观看| 精品一区二区三区亚洲| 五月婷婷另类国产| 一区二区免费电影| 空姐吹箫视频大全| 日韩激情av在线| 欧美精品手机在线| 欧美 日韩 国产 成人 在线观看 | 欧美成人精品一级| 亚洲图片自拍偷拍| 五月天久久狠狠| 99视频免费看| 老牛影视一区二区三区| 久久天天躁狠狠躁夜夜爽蜜月| 色悠悠在线视频| 亚洲伦理影院| 亚洲成人av电影| 五月婷婷综合色| 人妻无码中文字幕| 久久成人18免费观看| 最近中文字幕日韩精品| 人妖粗暴刺激videos呻吟| 亚洲电影有码| 亚洲va在线va天堂| 一区二区三区国产福利| 日韩av免费观影| 粉嫩在线一区二区三区视频| 国产精品www色诱视频| 91精品国产高潮对白| 欧美丰满老妇| 国产一区av在线| 无码国产精品久久一区免费| 99久久伊人| 亚洲成人在线观看视频| 18视频在线观看娇喘| yw在线观看| 久久夜色精品国产噜噜av| 成人在线免费网站| 99久久精品国产成人一区二区| 亚洲欧美不卡| 久久久免费精品| wwwav国产| 色呦哟—国产精品| 亚洲一级黄色片| 一级国产黄色片| 风间由美一区二区av101| 欧美情侣在线播放| 少妇一级淫免费放| 日韩成人亚洲| 色婷婷亚洲婷婷| 日韩免费毛片视频| 樱桃视频成人在线观看| 一区二区三区成人在线视频| 亚洲永久激情精品| 永久免费av片在线观看全网站| 2017欧美狠狠色| 精品乱色一区二区中文字幕| 黄色片一区二区三区| 国产精品12区| 国产在线999| 国产精品视频在线观看免费| 久久激五月天综合精品| 国产精品视频久| 依依成人综合网| 丝袜亚洲精品中文字幕一区| 欧美激情在线狂野欧美精品| 国产无套粉嫩白浆内谢| 在线播放一区| 97超碰国产精品女人人人爽| 日韩精品视频免费播放| 亚洲精品系列| 日韩av男人的天堂| 最新国产中文字幕| 久久er99精品| 豆国产97在线| 四虎影视2018在线播放alocalhost| 国产成人亚洲综合色影视| 91九色蝌蚪成人| 欧美一级片免费| 久久你懂得1024| 日韩亚洲视频在线| 韩国中文字幕在线| 亚洲永久免费av| 黄页免费在线观看视频| 日韩欧美看国产| 欧美日韩黄色一区二区| 激情小说欧美色图| 麻豆国产欧美一区二区三区r| 日韩高清有码在线| 日本猛少妇色xxxxx免费网站| 99久久.com| 欧美黄色性视频| youjizz在线视频| 久久电影网电视剧免费观看| 不卡的av一区| 国产色a在线| 亚洲精品免费播放| 精品丰满人妻无套内射| 性欧美freehd18| 日韩欧美精品三级| 免费观看av网站| 亚洲国产日韩欧美在线| 久久人人爽亚洲精品天堂| 久久久久久天堂| 日本怡春院一区二区| 亚洲中国色老太| 免费黄网站在线观看| 亚洲视频一区二区在线| 国产精品动漫网站| 免费一区二区三区在线视频| 亚洲九九九在线观看| 精品人妻伦九区久久aaa片| 妖精视频成人观看www| 国产日韩欧美综合| 欧美日韩国产综合视频| 亚洲另类中文字| 国产三级国产精品国产专区50| 少妇精品在线| 欧美zozo| 国产人久久人人人人爽| 妞干网在线视频观看| 日韩欧美中文字幕在线视频| 久久精品国产亚洲| 中文字幕在线一| 国产欧美一区二区精品秋霞影院| 成熟了的熟妇毛茸茸| 一区二区三区免费在线看| 精品国内自产拍在线观看| 中国一级片黄色一级片黄| 久久久www成人免费无遮挡大片| 日韩小视频在线播放| 中文久久电影小说| 欧美激情一级欧美精品| 狠狠人妻久久久久久综合麻豆| 亚洲美女视频在线观看| 国产黄色一区二区三区| 欧美在线首页| 国产精品二区在线观看| 欧美人体视频xxxxx| 日韩欧美国产高清| 妺妺窝人体色www聚色窝仙踪 | 国产成人一区二| 黄色片在线免费观看| 日韩欧美亚洲一二三区| 日本成人免费视频| 日本一区中文字幕| 中日韩在线视频| 亚洲一区二区三区在线免费| 欧美成人免费全部| 日本成人动漫在线观看| 午夜私人影院久久久久| 免费看黄色aaaaaa 片| 欧美一级专区| 日韩偷拍一区二区| 精品国产乱码一区二区三区| 久久99亚洲精品| 天天射,天天干| 欧美在线不卡视频| 国产一区二区精彩视频| 国产精品一级在线| 可以在线看的av网站| 久操国产精品| 成人免费淫片aa视频免费| 在线播放免费av| 亚洲精品国精品久久99热一| 久久国产乱子伦精品| 国产精品高潮呻吟| 97中文字幕在线观看| 视频一区中文字幕| 日韩视频在线观看视频| 牛牛精品成人免费视频| 国产精品久久久av| 中中文字幕av在线| 亚洲精品视频免费| 91麻豆视频在线观看| 亚洲图片欧美色图| 久久久久久国产免费a片| 国产精品综合二区| 国产精品免费成人| 国产精品激情| 性欧美精品一区二区三区在线播放 | 91日本在线视频| 午夜影院在线观看国产主播| 中文字幕欧美亚洲| 亚洲美女性生活| 欧美偷拍一区二区| 国产大片中文字幕| 国产精品久久久久9999吃药| 伊人网综合视频| 精品伊人久久久久7777人| aa在线免费观看| 午夜精品视频| 亚洲精品国产精品国自产观看| 97久久超碰| 国产美女精品视频| 成人香蕉视频| 欧美精品激情blacked18| 啊v在线视频| 精品国产成人在线影院| 一区二区自拍偷拍| 色综合天天视频在线观看| 久久精品免费在线| ...xxx性欧美| 日韩毛片无码永久免费看| gogogo免费视频观看亚洲一| 亚洲精品在线网址| 裸体在线国模精品偷拍| 亚洲国产精品久久久久婷蜜芽| 午夜久久福利| 中文字幕日韩精品一区二区| 日本不卡电影| 日本免费高清一区| 蜜桃tv一区二区三区| 国产精品xxx在线观看www| 免费一区二区三区在线视频| 国产欧美最新羞羞视频在线观看| 校园春色亚洲色图| 欧美亚洲视频在线看网址| 成人影音在线| 欧美精品激情视频| 国产精品69xx| 国内免费久久久久久久久久久| 成年人网站在线| 久久国产加勒比精品无码| 日本激情视频在线观看| 在线观看不卡av| 成人在线观看网站| 亚洲人精选亚洲人成在线| 日本在线视频1区| 日韩精品欧美国产精品忘忧草| 色欲久久久天天天综合网 | 国产精品嫩草69影院| 国产精品99久久久久久久女警| 在线免费看污网站| 狠狠色丁香婷婷综合久久片| 免费av不卡在线| 久久99精品久久久久久| 欧美精品 - 色网| 国模娜娜一区二区三区| 中文字幕第三区| 国产aⅴ综合色| 精品久久久久一区二区| av在线播放一区二区三区| 中出视频在线观看| 91美女在线观看| 神马久久久久久久久久久| 国产精品亲子乱子伦xxxx裸| 午夜黄色福利视频| 亚洲视频免费观看| 久久久久亚洲av成人片| 福利二区91精品bt7086| 国产情侣免费视频| 在线成人免费视频| 亚洲精品久久久蜜桃动漫 | 熟女俱乐部一区二区| 国产亚洲成aⅴ人片在线观看 | 欧美国产偷国产精品三区| 丰满女人性猛交| 亚洲国产日韩在线| 成人在线激情网| 国内一区二区视频| 亚洲欧美日韩偷拍| 国产亚洲一区字幕| 欧美日韩人妻精品一区二区三区| 亚洲国产精品一区二区www在线| 国产美女激情视频| 欧美午夜片在线看| 亚洲av无码国产精品永久一区 | 无码少妇一区二区| 中文字幕综合网| 看片网址国产福利av中文字幕| 欧美三电影在线| 蜜桃视频在线观看www| 亚洲性日韩精品一区二区| 好操啊在线观看免费视频| 6080yy精品一区二区三区| 成人国产网站| 国产精品有限公司| 欧美aaaaaaaaaaaa| 日韩在线一级片| 韩国精品在线观看| 国产伦精品一区二区三区妓女| 国产精品久久久久久亚洲伦| 国产主播在线播放| 欧美日韩国产在线播放网站| 香蕉视频国产在线| 久久精品亚洲94久久精品| 蜜桃av.网站在线观看| 91在线直播亚洲| 国产成人手机高清在线观看网站| 黄色一级视频播放| 日韩一区精品字幕| 中文字幕乱码在线| 亚洲青青青在线视频| 亚洲中文字幕无码爆乳av| 亚洲精品一线二线三线 | 97涩涩爰在线观看亚洲| 亚洲tv在线| 欧美午夜精品理论片a级大开眼界| 中出一区二区| 日韩精品视频一二三| 99久久婷婷国产综合精品| 国产精品久久久精品四季影院| 色94色欧美sute亚洲线路一久 | 91国产精品| 日本在线成人一区二区| 亚洲免费成人| 亚洲国产精品第一页| 国产精品初高中害羞小美女文| wwwwww国产| 亚洲黄色www| 96av在线| 国产一区二区免费在线观看| 欧美日一区二区三区在线观看国产免| 欧美性猛交xxx乱久交| 91蜜桃婷婷狠狠久久综合9色| 国产午夜久久久| 日韩久久久久久| 在线看三级电影| 91精品国产一区二区三区动漫 | 亚洲区小说区图片区qvod| 国产曰肥老太婆无遮挡| 国产二区国产一区在线观看| 成人性视频免费看| 欧美视频一区二区三区四区| 日韩电影网址| 欧美在线视频免费观看| 亚洲国产精品嫩草影院久久av| 国产视频在线观看网站| 国产乱子轮精品视频| 91精品少妇一区二区三区蜜桃臀| 欧美系列亚洲系列| 欧美激情办公室videoshd| 国产精品日韩久久久久| 日韩一级毛片| 福利片一区二区三区| 成人免费在线播放视频| 国产亲伦免费视频播放| 久久精品影视伊人网| 高清一区二区三区av| 天堂av在线中文| 国产精品99久久久久久有的能看| 久一区二区三区| 亚洲电影av在线| 国产va在线视频| 欧美一进一出视频| 日本亚洲一区二区| 午夜三级在线观看| 日韩一区二区三区电影| 女同视频在线观看| 黄色99视频| 视频一区二区不卡| 在线观看日本黄色| 91精品国产色综合久久不卡电影| 中文字幕中文字幕在线中高清免费版 | 久久久久久久国产精品影院| 无码人妻精品一区二区三区不卡| 视频直播国产精品| 国产日本亚洲| 国产免费黄色一级片| 国产午夜精品久久| 国产一区二区小视频| 久久久久久国产精品| 国产成人一区二区三区影院| 91香蕉国产线在线观看| 亚洲成a人v欧美综合天堂 | 欧美高跟鞋交xxxxhd| 看全色黄大色大片免费久久久| 国产第一页视频| 亚洲人一二三区| 天堂a√中文在线| 成人有码视频在线播放| 亚洲免费播放| 四虎地址8848| 日韩精品极品毛片系列视频| av在线播放一区| 国产美女主播在线播放| 国产天堂亚洲国产碰碰| 性一交一乱一精一晶| 国产成人午夜视频网址| 国产精品v欧美精品v日本精品动漫| 91精品人妻一区二区| 制服丝袜一区二区三区| 蜜桃视频动漫在线播放| 正在播放91九色| 久久九九影视网| 丰满人妻一区二区| 国产主播欧美精品| 亚洲欧美日韩精品一区二区|