色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

使用APM32系列產品的經驗總結

RTThread物聯網操作系統 ? 來源:21ic論壇極海半導體專區 ? 作者:21ic論壇極海半導體 ? 2022-07-11 09:48 ? 次閱讀

串口+DMA解決數據接收的難題


之前由于項目需要不停地利用串口接收數據,剛開始的時候采用單字節中斷的方式接收判斷。但是用來做通信的時候需要不停的產生串口接收中斷,會嚴重影響主程序的運行。后來采用DMA接收的方式,但是一般情況下配置的DMA都是接收指定長度的串口數據,對于未知長度的串口數據接收并不適用。后來在網上發現了一種方法可以利用串口的 空閑中斷+DMA接收的方法可解決此類問題,特別適用于不需要每個接收字節都判斷的串口數據接收,下面簡單介紹一下。

思路:采用APM32E103的串口1,并配置成空閑中斷模式且使能DMA接收,并同時設置接收緩沖區和初始化DMA。當初始化完成之后,外部給MCU發送數據的時候,假設這幀數據長度是100個字節,那么在MCU中接收到一個字節的時候并不會產生串口中斷,而是DMA在后臺把數據全部搬運到你指定的緩沖區里面,當整幀數據發送完畢之后串口才會產生一次中斷,此時可以利用CurrDataCounterBegin = DMA_ReadDataNumber(DMA1_Channel6);計算出本次的數據接受長度,從而進行數據處理。

關鍵代碼分析:
#include "public.h"
#ifndef __USART_H
#define __USART_H
#include "stdio.h"

volatile uint32_t CurrDataCounterBegin = 0;
#define DMA_Rec_Len 256 //定義一個256個字節的數據緩沖區。

void uartInit(void)
{
//GPIO端口設置
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
DMA_InitTypeDef DMA_InitStructure;

RCM_EnableAPB2PeriphClock((RCM_APB2_PERIPH_T)(RCM_APB2_PERIPH_GPIOA | RCM_APB2_PERIPH_USART1)); //使能USART1,GPIOA時鐘
RCM_EnableAHBPeriphClock(RCM_AHB_PERIPH_DMA1); //使能DMA傳輸
USART_DeInit(USART1);//復位串口1
//USART1_TX PA9
GPIO_InitStructure.pin = GPIO_PIN_9; //PA.9
GPIO_InitStructure.speed = GPIO_SPEED_50MHz;
GPIO_InitStructure.mode = GPIO_MODE_AF_PP; //復用推挽輸出
GPIO_Config(GPIOA, &GPIO_InitStructure); //初始化PA9

//USART1_RXA10
GPIO_InitStructure.pin = GPIO_PIN_10;
GPIO_InitStructure.mode = GPIO_MODE_IN_FLOATING;//浮空輸入
GPIO_Config(GPIOA, &GPIO_InitStructure);//初始化PA10
//USART 初始化設置
USART_InitStructure.USART_BaudRate = 115200;
USART_InitStructure.USART_WordLength = USART_WORD_LEN_8B;//字長為8位數據格式
USART_InitStructure.USART_StopBits = USART_STOP_BIT_1;//一個停止位
USART_InitStructure.USART_Parity = USART_PARITY_NONE;//無奇偶校驗位
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//無硬件數據流控制
USART_InitStructure.USART_Mode = USART_MODE_TX | USART_MODE_RX; //收發模式

USART_Config(USART1, &USART_InitStructure);

USART_EnableInterrupt(USART1, USART_INT_IDLE);//開啟空閑中斷

USART_EnableDMA(USART1,USART_DMA_RX); //使能串口1 DMA接收

USART_Enable(USART1); //使能串口

// NVIC 配置
NVIC_EnableIRQRequest(DMA1_Channel6_IRQn, 3, 2);


//相應的DMA配置
DMA_Reset(DMA1_Channel6);
DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&USART1->DR;//DMA外設ADC基地址
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)DMA_Rece_Buf;//DMA內存基地址
DMA_InitStructure.DMA_DIR = DMA_DIR_PERIPHERAL_SRC;//數據傳輸方向,從外設讀取發送到內存
DMA_InitStructure.DMA_BufferSize = DMA_Rec_Len;//DMA通道的DMA緩存的大小
DMA_InitStructure.DMA_PeripheralInc = DMA_PERIPHERAL_INC_DISABLE;//外設地址寄存器不變
DMA_InitStructure.DMA_MemoryInc = DMA_MEMORY_INC_ENABLE;//內存地址寄存器遞增
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PERIPHERAL_DATA_SIZE_WOED;//數據寬度為8位
DMA_InitStructure.DMA_MemoryDataSize = DMA_MEMORY_DATA_SIZE_WOED; //數據寬度為8位
DMA_InitStructure.DMA_Mode = DMA_MODE_NORMAL;//工作在正常緩存模式
DMA_InitStructure.DMA_Priority = DMA_PRIORITY_HIGH; //DMA通道 x擁有中優先級
DMA_InitStructure.DMA_M2M = DMA_M2MEN_ENABLE;//DMA通道x沒有設置為內存到內存傳輸
DMA_Init(DMA1_Channel6, &DMA_InitStructure);//根據DMA_InitStruct中指定的參數初始化DMA的通道

DMA_EnableInterrupt(DMA1_Channel6, DMA_INT_TC);
CurrDataCounterBegin = DMA_ReadDataNumber(DMA1_Channel6);

DMA_Enable(DMA1_Channel6);
}

//串口中斷函數
void USART1_IRQHandler(void) //串口1中斷服務程序
{

if(USART_ReadStatusFlag(USART1, USART_FLAG_IDLE) != RESET)//接收中斷(接收到的數據必須是0x0d 0x0a結尾)
{
USART_RxData(USART1);//讀取數據 注意:這句必須要,否則不能夠清除中斷標志位。
Usart1_Rec_Cnt = DMA_Rec_Len-CurrDataCounterBegin(DMA1_Channel6); //算出接本幀數據長度

//幀數據處理函數
printf ("The lenght:%d ",Usart1_Rec_Cnt);
printf ("The data: ");
USART_TxData(DMA_Rece_Buf,Usart1_Rec_Cnt);
USART_ClearIntFlag(USART1, USART_FLAG_IDLE); //清除中斷標志
DMA_Enable(DMA1_Channel6); //恢復DMA指針,等待下一次的接收
}

原文標題:APM32芯得 EP.03 | APM32E103串口+DMA解決數據接收的困擾

文章出處:【微信公眾號:RTThread物聯網操作系統】歡迎添加關注!文章轉載請注明出處。

審核編輯:彭靜

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • mcu
    mcu
    +關注

    關注

    146

    文章

    17171

    瀏覽量

    351512
  • dma
    dma
    +關注

    關注

    3

    文章

    562

    瀏覽量

    100635
  • 串口數據
    +關注

    關注

    0

    文章

    33

    瀏覽量

    13899

原文標題:APM32芯得 EP.03 | APM32E103串口+DMA解決數據接收的困擾

文章出處:【微信號:RTThread,微信公眾號:RTThread物聯網操作系統】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    怎么用Clion開發APM32

    APM32 官方 SDK 中提供了三種開發環境:Keil、IAR 和 Eclipse。不否認這三種環境的強大,但是在 AI 時代做嵌入式開發,用這三種環境就顯得有點不夠優雅了。本篇文章主要介紹怎么用
    的頭像 發表于 12-17 09:19 ?893次閱讀
    怎么用Clion開發<b class='flag-5'>APM32</b>

    APM32F10xx進入低功耗模式的問題分析

    近日,在學習APM32開發板關于PMU模塊的內容,看到很多內容都是調用WFI內核指令進入低功耗模式,于是自己想嘗試調用WFE內核指令進入低功耗模式,但在APM32F10xx中,我運用按鍵中斷,在中斷
    的頭像 發表于 10-18 16:13 ?316次閱讀
    <b class='flag-5'>APM</b>32F10xx進入低功耗模式的問題分析

    芯來NA系列產品再獲ISO 26262 ASIL-D產品認證證書

    近日,芯來科技NA300系列產品正式獲得了德國exida頒發的ISO26262 ASIL-D產品認證證書。
    的頭像 發表于 07-15 16:11 ?637次閱讀
    芯來NA<b class='flag-5'>系列產品</b>再獲ISO 26262 ASIL-D<b class='flag-5'>產品</b>認證證書

    凱迪正大對電纜安全檢查知識經驗總結分享

    電纜作為電力傳輸的重要載體,其安全穩定運行直接關系到整個電力系統的可靠性。因此,電纜的安全檢查至關重要。下面給大家分享一下武漢凱迪正大電氣多年電纜故障查找總結經驗,我們將圍繞電纜安全檢查的關鍵點,給大家分享。
    的頭像 發表于 05-27 11:33 ?409次閱讀
    凱迪正大對電纜安全檢查知識<b class='flag-5'>經驗總結</b>分享

    知行科技iDC系列產品獲得奇瑞歐萌達量產定點

    出海布局再下一城!知行科技iDC系列產品獲得奇瑞歐萌達量產定點
    的頭像 發表于 05-07 09:39 ?388次閱讀
    知行科技iDC<b class='flag-5'>系列產品</b>獲得奇瑞歐萌達量產定點

    寬電壓時鐘振蕩器系列產品選型指南

    寬電壓時鐘振蕩器系列產品選型指南
    的頭像 發表于 04-22 14:53 ?579次閱讀
    寬電壓時鐘振蕩器<b class='flag-5'>系列產品</b>選型指南

    奧拓電子SW系列產品斬獲2024年度德國紅點獎

    近日,奧拓電子SW系列產品從來自全球各地的優秀作品中脫穎而出,獲得了2024年度德國紅點獎,這是繼3月份CV-MIP系列產品榮獲德國iF設計大獎之后,公司獲得的又一項重量級國際設計大獎。
    的頭像 發表于 04-08 14:09 ?942次閱讀

    APM32下載了APM專屬的HEX例程后識別不了芯片怎么解決?

    之前焊了一塊,可以識別芯片,下載了APM專屬的HEX例程后反而識別不了了,非常痛苦。ARM內核仍然存在,Keil里面也下載不了了……不是板子鎖死的問題
    發表于 03-28 06:20

    工業數顯壓力測量系列產品介紹

    電子發燒友網站提供《工業數顯壓力測量系列產品介紹》資料免費下載
    發表于 03-11 14:04 ?0次下載

    油田泥漿壓力測量系列產品介紹

    電子發燒友網站提供《油田泥漿壓力測量系列產品介紹》資料免費下載
    發表于 03-11 14:01 ?0次下載

    Nexperia發布全新模擬開關系列產品

    全球基礎半導體器件領域的領軍企業Nexperia(安世半導體)最近發布了全新的專用于監測和保護1.8V電子系統的4通道和8通道模擬開關系列產品。這一創新系列產品的推出,旨在滿足汽車、消費類電子產品及工業應用等多樣化領域對高性能模
    的頭像 發表于 03-11 10:08 ?719次閱讀

    AMD推出Spartan UltraScale+ FPGA系列產品

    AMD公司,全球知名的芯片巨頭,近日宣布推出全新的AMD Spartan UltraScale+ FPGA系列產品組合。這一新系列作為AMD成本優化型FPGA、自適應SoC產品家族的最新成員,特別針對成本敏感型邊緣應用進行了優化
    的頭像 發表于 03-07 10:15 ?719次閱讀

    HOLTEK新推出HT66R00x A/D OTP MCU系列產品

    Holtek新推出A/D型OTP MCU - HT66R00x系列產品,提供客戶具有高性價比的卓越解決方案,整系列功能涵蓋面廣,可滿足客戶多元化產品需求
    的頭像 發表于 02-19 14:25 ?1587次閱讀

    拉曼光纖放大器系列產品手冊

    電子發燒友網站提供《拉曼光纖放大器系列產品手冊.pptx》資料免費下載
    發表于 01-23 09:42 ?0次下載

    HO-P系列電流互感器HO 60 250-P系列產品手冊

    電子發燒友網站提供《HO-P系列電流互感器HO 60 250-P系列產品手冊.pdf》資料免費下載
    發表于 01-19 09:24 ?0次下載
    主站蜘蛛池模板: 色欲无码国产喷水AV精品| 国产成+人欧美+综合在线观看| 久久国产免费观看精品1| 芭乐视频免费资源在线观看| 亚洲乱码中文字幕久久| 日久精品不卡一区二区| 麻豆精品国产剧情观看| 国产在线观看www| 高清国语自产拍在线| 99久久久免费精品国产| 尤物国产在线精品三区| 亚洲精品久久7777777| 涩涩在线观看免费视频| 欧美亚洲另类热图| 美女一级毛片免费不卡视频| 九九热视频在线观看| 国产亚洲精品久久久999密臂| 成人在无码AV在线观看一| cntv官网| 99欧美精品| 0855福利| 国产女合集第六部| 草柳最新地址| a级毛片高清免费视频| 97视频视频人人碰视频| 肉肉高潮液体高干文H| 欧美大片免费| 免费精品一区二区三区在线观看| 精品性影院一区二区三区内射| 国产人成无码视频在线观看| 国产叼嘿久久精品久久| 中国少妇内射XXXHD免费| 亚洲国产第一区二区三区| 四虎一级片| 色吧电影院| 欧美日韩一级黄色片| 男总裁憋尿PLAY灌尿BL| 免费在线视频一区| 欧美videqsdesex0| 漂亮的保姆3中文版完整版| 秋霞影院福利电影|