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

    文章

    17022

    浏览量

    350385
  • dma
    dma
    +关注

    关注

    3

    文章

    559

    浏览量

    100447
  • 串口数据
    +关注

    关注

    0

    文章

    33

    浏览量

    13871

原文标题:APM32芯得 EP.03 | APM32E103串口+DMA解决数据接收的困扰

文章出处:【微信号:RTThread,微信公众号:RTThread物联网操作系统】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    APM32F10xx进入低功耗模式的问题分析

    近日,在学习APM32开发板关于PMU模块的内容,看到很多内容都是调用WFI内核指令进入低功耗模式,于是自己想尝试调用WFE内核指令进入低功耗模式,但在APM32F10xx中,我运用按键中断,在中断
    的头像 发表于 10-18 16:13 216次阅读
    <b class='flag-5'>APM</b>32F10xx进入低功耗模式的问题分析

    芯来NA系列产品再获ISO 26262 ASIL-D产品认证证书

    近日,芯来科技NA300系列产品正式获得了德国exida颁发的ISO26262 ASIL-D产品认证证书。
    的头像 发表于 07-15 16:11 584次阅读
    芯来NA<b class='flag-5'>系列产品</b>再获ISO 26262 ASIL-D<b class='flag-5'>产品</b>认证证书

    凯迪正大对电缆安全检查知识经验总结分享

    电缆作为电力传输的重要载体,其安全稳定运行直接关系到整个电力系统的可靠性。因此,电缆的安全检查至关重要。下面给大家分享一下武汉凯迪正大电气多年电缆故障查找总结经验,我们将围绕电缆安全检查的关键点,给大家分享。
    的头像 发表于 05-27 11:33 368次阅读
    凯迪正大对电缆安全检查知识<b class='flag-5'>经验总结</b>分享

    知行科技iDC系列产品获得奇瑞欧萌达量产定点

    出海布局再下一城!知行科技iDC系列产品获得奇瑞欧萌达量产定点
    的头像 发表于 05-07 09:39 361次阅读
    知行科技iDC<b class='flag-5'>系列产品</b>获得奇瑞欧萌达量产定点

    宽电压时钟振荡器系列产品选型指南

    宽电压时钟振荡器系列产品选型指南
    的头像 发表于 04-22 14:53 527次阅读
    宽电压时钟振荡器<b class='flag-5'>系列产品</b>选型指南

    奥拓电子SW系列产品斩获2024年度德国红点奖

    近日,奥拓电子SW系列产品从来自全球各地的优秀作品中脱颖而出,获得了2024年度德国红点奖,这是继3月份CV-MIP系列产品荣获德国iF设计大奖之后,公司获得的又一项重量级国际设计大奖。
    的头像 发表于 04-08 14:09 828次阅读

    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 672次阅读

    AMD推出Spartan UltraScale+ FPGA系列产品

    AMD公司,全球知名的芯片巨头,近日宣布推出全新的AMD Spartan UltraScale+ FPGA系列产品组合。这一新系列作为AMD成本优化型FPGA、自适应SoC产品家族的最新成员,特别针对成本敏感型边缘应用进行了优化
    的头像 发表于 03-07 10:15 651次阅读

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

    Holtek新推出A/D型OTP MCU - HT66R00x系列产品,提供客户具有高性价比的卓越解决方案,整系列功能涵盖面广,可满足客户多元化产品需求
    的头像 发表于 02-19 14:25 1508次阅读

    拉曼光纤放大器系列产品手册

    电子发烧友网站提供《拉曼光纤放大器系列产品手册.pptx》资料免费下载
    发表于 01-23 09:42 0次下载

    HO-P系列电流互感器HO 60 250-P系列产品手册

    电子发烧友网站提供《HO-P系列电流互感器HO 60 250-P系列产品手册.pdf》资料免费下载
    发表于 01-19 09:24 0次下载

    选择烧结银的经验总结

    选择烧结银的经验总结
    的头像 发表于 12-17 15:46 1320次阅读
    选择烧结银的<b class='flag-5'>经验总结</b>