在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

    文章

    17889

    瀏覽量

    361727
  • dma
    dma
    +關注

    關注

    3

    文章

    574

    瀏覽量

    102542
  • 串口數據
    +關注

    關注

    0

    文章

    34

    瀏覽量

    14091

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

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

收藏 人收藏

    評論

    相關推薦
    熱點推薦

    基于極海APM32E103 MCU的CoreMark測試方法

    CoreMark跑分可以了解到MCU的算力。下面以APM32E103芯片和Keil為例,介紹一下如何在APM32上面運行CoraMark測試。CoreMark需要定時器用于計時,還需要用串口來打印輸出測試結果。
    的頭像 發表于 06-12 09:42 ?281次閱讀
    基于極海<b class='flag-5'>APM</b>32E103 MCU的CoreMark測試方法

    GaN E-HEMTs的PCB布局經驗總結

    GaN E-HEMTs的PCB布局經驗總結
    的頭像 發表于 03-13 15:52 ?494次閱讀
    GaN E-HEMTs的PCB布局<b class='flag-5'>經驗總結</b>

    致真精密儀器探針臺系列產品介紹

    致真精密儀器探針臺系列產品介紹
    的頭像 發表于 02-18 10:47 ?446次閱讀
    致真精密儀器探針臺<b class='flag-5'>系列產品</b>介紹

    致真精密儀器低溫設備系列產品介紹

    致真精密儀器低溫設備系列產品介紹
    的頭像 發表于 02-18 10:45 ?439次閱讀
    致真精密儀器低溫設備<b class='flag-5'>系列產品</b>介紹

    安科瑞APM產品及其平臺集成在智能電力管理中的應用研究

    安科瑞 程瑜 187 0211 2087 摘要 本文研究了安科瑞APM產品及其平臺集成在智能電力管理中的應用。通過對APM系列產品的功能特點、技術優勢以及在工業、商業和公共設施等領域的
    的頭像 發表于 02-13 14:52 ?376次閱讀
    安科瑞<b class='flag-5'>APM</b><b class='flag-5'>產品</b>及其平臺集成在智能電力管理中的應用研究

    源杰科技推出50G EML+SOA批量系列產品

    下一代高速PON網絡設計。 此次推出的50G EML+SOA系列產品,是基于源杰科技在10G 1577nm EML+SOA大規模量產中積累的豐富經驗,經過精心研發而成。該系列產品不僅滿足了當前市場對高速、大功率PON光芯片的需求
    的頭像 發表于 02-12 10:23 ?697次閱讀

    N32A455xxL8系列產品簡介

    電子發燒友網站提供《N32A455xxL8系列產品簡介.pdf》資料免費下載
    發表于 01-22 16:37 ?0次下載
    N32A455xxL8<b class='flag-5'>系列產品</b>簡介

    N32G451系列產品簡介

    電子發燒友網站提供《N32G451系列產品簡介.pdf》資料免費下載
    發表于 01-22 15:34 ?1次下載
    N32G451<b class='flag-5'>系列產品</b>簡介

    PIC32CM MC00系列產品簡介

    電子發燒友網站提供《PIC32CM MC00系列產品簡介.pdf》資料免費下載
    發表于 01-21 14:06 ?0次下載
    PIC32CM MC00<b class='flag-5'>系列產品</b>簡介

    上海貝嶺150V SGT MOSFET系列產品介紹

    上海貝嶺推出150V SGT MOSFET系列產品。貝嶺150V SGT系列產品采用業界先進工藝,使得器件具有良好的柵極漏電流IGSS性能;采用深溝槽、多層外延襯底以及多重浮空環終端結構,使得器件
    的頭像 發表于 01-03 10:19 ?1034次閱讀
    上海貝嶺150V SGT MOSFET<b class='flag-5'>系列產品</b>介紹

    怎么用Clion開發APM32

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

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

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

    AM57xx Sitara IO配置要求德州儀器Sitara系列產品

    電子發燒友網站提供《AM57xx Sitara IO配置要求德州儀器Sitara系列產品.pdf》資料免費下載
    發表于 10-11 10:15 ?0次下載
    AM57xx Sitara IO配置要求德州儀器Sitara<b class='flag-5'>系列產品</b>

    藍海華騰參股公司頂控科技發布運動控制一體機系列產品

    藍海華騰參股公司深圳市頂控科技有限公司運動控制一體機系列產品上市!本次新品發布會發布三個系列產品,這三個系列又包含了五款新產品
    的頭像 發表于 09-03 09:28 ?801次閱讀

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

    近日,芯來科技NA300系列產品正式獲得了德國exida頒發的ISO26262 ASIL-D產品認證證書。
    的頭像 發表于 07-15 16:11 ?935次閱讀
    芯來NA<b class='flag-5'>系列產品</b>再獲ISO 26262 ASIL-D<b class='flag-5'>產品</b>認證證書
    主站蜘蛛池模板: 色两性网欧美 | 婷婷开心激情网 | www.亚洲视频.com | 日韩欧美一卡二区 | 中文字幕三级久久久久久 | 性欧美xxxxhd | 欧美视频精品在线 | 久久草在线播放 | 亚洲成a人片777777久久 | 三级网站免费看 | 国产美女动态免费视频 | 色五阁 | 日干夜干天天干 | 天堂tv在线观看 | 一级特黄a免费大片 | re久久 | 亚洲色图27p | 亚洲欧美综合一区二区三区四区 | 女人张开腿让男人做爽爽 | 午夜理伦片免费 | 亚洲va久久久噜噜噜久久男同 | 狠狠插狠狠操 | 视频网站免费看 | 天堂网www天堂在线资源链接 | 日本高清网站 | 黄 色 片 在 线 看 | 一区二区三区网站在线免费线观看 | 午夜影视在线 | 免费黄色福利视频 | 久久综合九九亚洲一区 | 久久精品99 | 无毒三级| 午夜免费啪视频 | 免费一级大毛片a一观看不卡 | 综合涩| 二十年等一人小说在线观看 | 曰韩欧美| chinese国产videoxx实拍 | 下农村女人一级毛片 | 久久艹影院 | 免费看国产精品久久久久 |