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
    +关注

    关注

    147

    文章

    19134

    浏览量

    404065
  • dma
    dma
    +关注

    关注

    3

    文章

    582

    浏览量

    106278
  • 串口数据
    +关注

    关注

    1

    文章

    34

    浏览量

    14291

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

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

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    EMI整改实战经验总结

    搞硬件的工程师最怕啥?产品做出来了,测试的时候EMI超标,一整改起来没完没了。我见过太多项目因为EMI问题延期交货,改板改到怀疑人生。其实EMI整改没大家想得那么复杂,滤波和接地就是最实用、最直接的两把利剑。搞懂这两个,你的整改效率至少翻倍。
    的头像 发表于 04-20 10:20 773次阅读
    EMI整改实战<b class='flag-5'>经验总结</b>

    中创新航至远电池船用系列产品亮相2026新加坡亚洲海事展

    近日,2026新加坡亚洲海事展(APM)在新加坡举行。中创新航携「至远」电池船用系列产品重磅亮相,全面覆盖客渡船、货船、海工船及港作船舶等应用场景,系统展示电动船舶领域的整体解决方案能力。
    的头像 发表于 03-30 11:35 455次阅读

    COSEL AC - DC 电源系列产品深度剖析

    COSEL AC - DC 电源系列产品深度剖析 在电子设备的设计中,电源模块的选择至关重要,它直接影响着设备的性能、稳定性和可靠性。今天,我们就来深入了解一下 COSEL 公司的 AC - DC
    的头像 发表于 03-27 10:40 188次阅读

    安世中国发布集成输入和输出保护的LDO系列产品

    安世半导体(中国)近期推出了全新的40V输入,120mA/150mA/300mA输出电流的LDO系列。该系列产品集成完整的输入和输出保护功能,完美适用通过线束进行离板供电的汽车电子应用场景,如车身域控、BMS、车灯、转向、动力等一系列产
    的头像 发表于 03-13 14:00 464次阅读
    安世中国发布集成输入和输出保护的LDO<b class='flag-5'>系列产品</b>

    极海APM32F427系列MCU荣获IEC 60730/60335功能安全认证

    近日,极海APM32F427系列工业级高性能拓展型MCU,成功通过IEC 60730/60335功能安全认证。这标志着该系列产品在功能安全设计上已达到国际领先水平,能够为客户提供符合Class B标准的功能安全库,并助力其高效缩
    的头像 发表于 02-09 09:15 1019次阅读
    极海<b class='flag-5'>APM</b>32F427<b class='flag-5'>系列</b>MCU荣获IEC 60730/60335功能安全认证

    Amphenol Socapex USBFIELD™ 系列产品:满足严苛环境的 USB 连接解决方案

    Amphenol Socapex USBFIELD™ 系列产品:满足严苛环境的 USB 连接解决方案 在电子设备的连接领域,面对复杂恶劣的环境,可靠且高性能的 USB 连接方案至关重要
    的头像 发表于 12-12 09:35 490次阅读

    Cortex-M0+通用 MCU CW32F系列产品介绍

    推出,该系列可提供TSSOP24、TSSOP20和QFN20等封装。CW32F系列产品已全面实现 -40℃ ~105℃超宽温度范围和 1.65V~5.5V 超宽工作电压,面向最广泛的各种基础应用,开始
    发表于 12-12 06:22

    Amphenol GuardXcel™电缆接头系列产品解析

    在工业电子领域,电缆接头作为连接电缆与设备的关键部件,其性能直接影响到整个系统的稳定性和可靠性。Amphenol的GuardXcel™电缆接头系列产品,凭借其卓越的性能和广泛的适用性,在众多工业应用中脱颖而出。今天,我们就来深入剖析这个系列
    的头像 发表于 12-09 13:39 543次阅读

    在极海APM32系列MCU中如何把代码重定位到SDRAM运行

    在有些情况下,我们想要把代码放到SDRAM运行。下面介绍在APM32的MCU中,如何把代码重定位到SDRAM运行。对于不同APM32系列的MCU,方法都是一样的。
    的头像 发表于 11-04 09:14 5400次阅读
    在极海<b class='flag-5'>APM32</b><b class='flag-5'>系列</b>MCU中如何把代码重定位到SDRAM运行

    求助,关于5.0.2 + serial_v1 + apm32f103vet6串口读一帧问题求解

    第一次使用rtt,第一次来这里,先给各位前辈问个好,祝大家年年加薪,身体杠杠! 开始使用v2版本,编译通过后下载没反应,可能针对极海APM32适配还不完善,就使用了v1版本,官方提供的历程可以正常
    发表于 10-10 07:11

    极海APM32E030/F402系列MCU通过IEC 60730/60335功能安全认证

    近日,极海APM32E030系列基础拓展型MCU、APM32F402系列高性能高性价比MCU通过IEC 60730/60335认证,可提供符合Class B标准的功能安全库,助力客户快
    的头像 发表于 08-29 13:57 1372次阅读
    极海<b class='flag-5'>APM</b>32E030/F402<b class='flag-5'>系列</b>MCU通过IEC 60730/60335功能安全认证

    新洁能推出增强型N沟道MOSFET系列产品

    新洁能研发团队沟槽型工艺平台推出耐压30V 1mΩ级别增强型N沟道MOSFET 系列产品
    的头像 发表于 08-22 18:02 2518次阅读
    新洁能推出增强型N沟道MOSFET<b class='flag-5'>系列产品</b>

    Kubernetes集群运维经验总结

    本文总结了我和团队在K8s生产环境中遇到的10个最常见且最致命的坑,每个坑都配有真实案例、详细分析和可执行的解决方案。
    的头像 发表于 08-18 11:23 791次阅读

    千方科技推出AI视频充电桩系列产品

    近年来,充电基础设施保有量快速增长,运营管理过程中普遍存在充电桩利用率低、设备维护困难等问题。千方科技推出AI视频充电桩系列产品,从感知系统、控制系统到运维体系实现智能化升级,助力充电场站实现运营增效。
    的头像 发表于 07-26 14:47 2305次阅读

    基于极海APM32E103 MCU的CoreMark测试方法

    CoreMark跑分可以了解到MCU的算力。下面以APM32E103芯片和Keil为例,介绍一下如何在APM32上面运行CoraMark测试。CoreMark需要定时器用于计时,还需要用串口来打印输出测试结果。
    的头像 发表于 06-12 09:42 1606次阅读
    基于极海<b class='flag-5'>APM</b>32E103 MCU的CoreMark测试方法