历史上的今天
返回首页

历史上的今天

今天是:2025年04月15日(星期二)

正在发生

2020年04月15日 | stm32F4 配置串口+DMA 接收不定长数据 串口空闲中断

2020-04-15 来源:eefocus

串口是一种很常见的通讯接口,通过串口回传数据是很多智能型的传感器都拥有的特点。 很多智能型传感器内置单片机 通过单片机将原始的数据处理,然后以串口的形式发送给用户单片机,用户单片机在利用串口得来的信息进行决策。 那么有没有一种简化通讯的方式呢 ?那就是串口 +DMA了!


主要思想: 配置一个串口DMA接收 任务,任务搬运的数据量要大于一次通讯的总数据量(也就是DMA 的搬运工作还没结束 我们的数据就已经搬完了) 然后这时候因为串口的总线 没有数据传输了(数据传输频率不是特别高 完全占用总线的情况下,总线肯定会有一段时间空闲!) 这时候 因为串口的总线空闲会触发一个 串口总线控线中断,在这个中断里面  我们进行数据处理(获取感兴趣的信息),并且在数据处理完成后 将DMA 重新设置一个搬运任务。  这样 我们只需要在一帧(次)的数据传输完成后去处理一次数据即可,不需要每次都去处理串口接收中断,这样有好处!


下面话不多说,上代码!  我是用的是Stm32F407VET6 代码下载 搜索 ‘stm32f407 配置6路串口DMA 接收 不定长数据


void USART1_init()  //  PB7

{

  GPIO_InitTypeDef   GPIO_InitStructure;

    USART_InitTypeDef  USART_InitStructure;

    NVIC_InitTypeDef   NVIC_InitStructure;

    DMA_InitTypeDef    DMA_InitStructure;

    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);   

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);

    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2,ENABLE);

   //以上是初始化各种时钟

    GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 ;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;    

    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;

    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;

    GPIO_Init(GPIOA,&GPIO_InitStructure);

  //  以上是初始化 串口的IO

    USART_InitStructure.USART_BaudRate = 115200;

    USART_InitStructure.USART_WordLength = USART_WordLength_8b;

    USART_InitStructure.USART_StopBits = USART_StopBits_1;

    USART_InitStructure.USART_Parity = USART_Parity_No;

    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;

    USART_InitStructure.USART_Mode = USART_Mode_Rx ;    

    USART_Init(USART1, &USART_InitStructure);

    USART_Cmd(USART1, ENABLE);  

    USART_ITConfig(USART1, USART_IT_IDLE, ENABLE); // 这里开启的是总线空闲中段!  不是接收非空中断

    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;

    NVIC_InitStructure.NVIC_IRQChannelSubPriority =1;        

    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;            

    NVIC_Init(&NVIC_InitStructure);    

     USART_DMACmd(USART1,USART_DMAReq_Rx,ENABLE);  

   //以上是定时器的基本配置   主要是一些通讯相关的参数  不多做介绍 配置中断部分要看一下

    DMA_DeInit(DMA2_Stream5);

    while (DMA_GetCmdStatus(DMA2_Stream5) != DISABLE);

    DMA_InitStructure.DMA_Channel = DMA_Channel_4;                             //  DMA通道

    DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&USART1->DR;    // 外设地址

    DMA_InitStructure.DMA_Memory0BaseAddr = (u32)USART_Cache[0];  //内部存储区地址

    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory ;           // 传输方向 外设到内存

    DMA_InitStructure.DMA_BufferSize = RECEIVE_BUF_SIZE;                  //  接收的数据大小  一个常数 大于一帧的数据量

    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;   //  

    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;          //

    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;

    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;

    DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;

    DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;

    DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;         

    DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;

    DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;

    DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;

    DMA_Init(DMA2_Stream5, &DMA_InitStructure);

    DMA_Cmd(DMA2_Stream5, ENABLE);

}


以上就是初始化函数 其中的IO口 请查阅

这本书。。   在pinmap  里面有定义

这是我们所用到的 PB7 的  我使用的是福昕阅读器   可以直接 ctrl +F 查找 USART1  就可以找到串口1的 接口 


DMA配置方面  要去 stm32F4 中文参考手册里面去查找

这个在 DMA章节里面会提到 具体的 DMA 数据流和 外设的对应关系

我的是在文档的 第205页  如果你下载了文档应该也会在差不多的位置可以找到相应的介绍。


如果配置部分没有问题了  就可以继续向下看 终端部分的函数!


void USART1_IRQHandler(void)                

{

  u16 data

    if(USART_GetITStatus(USART1, USART_IT_IDLE) != RESET)  //

    {

        DMA_Cmd(DMA2_Stream5, DISABLE);

        data = USART1->SR;

        data = USART1->DR;  // 这里必须读一下串口的SR和DR寄存器  这样程序才能正常运行, 具体原因我没有找到 望大佬解答

        ////  这里可以插入自己的数据处理程序, 注意这里是中端 程序占用的时间别太多 而且绝对不能用delay函数!

        DMA_ClearFlag(DMA2_Stream5,DMA_FLAG_TCIF5 | DMA_FLAG_FEIF5 | DMA_FLAG_DMEIF5 | DMA_FLAG_TEIF5 | DMA_FLAG_HTIF5);

        DMA_SetCurrDataCounter(DMA2_Stream5, RECEIVE_BUF_SIZE);  

        DMA_Cmd(DMA2_Stream5, ENABLE); //  这两行是重新设置DMA  让这个搬运工准备下一次的工作

  }

    USART_ClearITPendingBit(USART1,USART_IT_IDLE); // 清除标志位

}

推荐阅读

史海拾趣

Hayashi Denko Co Ltd公司的发展小趣事

HARTING公司自1945年成立以来,在电子行业里经历了多个重要的发展阶段,以下是五个与HARTING公司发展相关的事实性故事:

1. 创立与初期发展

创立背景:1945年,Wilhelm和Marie Harting在德国创立了HARTING公司,起初以生产日常所需的设备为主,如节能灯泡、电炉等。随着德国工业的发展,他们逐渐意识到新兴行业对技术产品的需求,于是将公司转向开发和生产电气连接器及连接系统。这一转变标志着HARTING正式进入电子行业,并为其后续发展奠定了基础。

初期产品:早期,HARTING开发的Han®连接器在市场上取得了巨大成功,该连接器以其坚固耐用、易于操作的特点,迅速成为行业内的标准产品,为HARTING在电子行业树立了良好的口碑。

2. 技术创新与全球化拓展

技术创新:HARTING始终致力于技术创新,不断推出新产品以满足市场需求。例如,他们研发的矩形连接器在1965年问世后,迅速替代了传统的圆形军用规格连接器,成为工业连接的新标准。此外,HARTING还在数据通信、网络技术、芯片卡、多媒体技术等领域取得了显著成就。

全球化拓展:随着业务的不断发展,HARTING开始在全球范围内设立子公司和生产工厂。目前,HARTING已在40多个国家设立了附属公司,生产工厂遍布德国、英国、瑞士、美国、罗马尼亚及中国等7个国家。这种全球化布局不仅提升了HARTING的市场占有率,还使其能够更好地服务全球客户。

3. 进入中国市场

中国市场布局:1988年,HARTING正式进入中国市场,并在珠海投资兴建了生产基地。这一举措标志着HARTING对中国市场的重视和承诺。随着在中国市场的不断深耕,HARTING已在中国设立了多个销售和服务中心,覆盖了包括香港、珠海、深圳、广州在内的多个城市。

本地化生产与服务:为了更好地服务中国客户,HARTING在中国实现了本地化生产和服务。他们不仅提供高质量的产品,还为客户提供设计咨询、系统集成、定制化解决方案等一系列专业服务。这些举措使HARTING在中国市场赢得了广泛认可。

4. 工业4.0与数字化转型

工业4.0引领者:面对工业4.0和数字化转型的浪潮,HARTING积极投入研发和创新,推出了多款面向未来的产品和技术。例如,HARTING MICA®是一款将工业4.0功能引入现有机器和设备的工业边缘网关,它能够帮助企业实现生产过程的智能化和自动化。

数字化转型服务:除了产品创新外,HARTING还为客户提供数字化转型的解决方案和服务。他们利用自身在连接技术领域的优势,帮助企业构建高效、可靠的数字化生产体系,提升生产效率和产品质量。

5. 定制化解决方案与行业应用

定制化解决方案:HARTING深知不同行业对连接技术的不同需求,因此他们始终致力于为客户提供定制化的解决方案。无论是电力、通信、自动化还是航空、汽车等行业,HARTING都能根据客户的具体需求,提供最适合的连接技术和产品。

行业应用案例:在多个行业领域,HARTING的产品和技术都得到了广泛应用。例如,在汽车行业,HARTING的3D-MID技术帮助客户将复杂的电子设备集成到汽车中,提高了汽车的安全性和舒适性;在轨道交通行业,HARTING的连接器产品被广泛应用于信号传输和电源分配等领域,确保了轨道交通的安全运行。

通过以上五个故事,我们可以看出HARTING公司在电子行业里的发展历程和成就。从创立初期的艰难探索到如今的全球化布局和技术创新,HARTING始终保持着对技术的热爱和追求,为客户提供高质量的产品和服务。

DB Lectro Inc公司的发展小趣事

DB Lectro Inc公司自创立之初,就致力于气体检测技术的研发与创新。在公司总部的加利福尼亚州研发中心,一群充满激情的工程师们夜以继日地工作,成功研发出了首款高精度、高稳定性的气体检测仪器。这款产品凭借其卓越的性能和精准的检测结果,迅速在污水处理、化工等领域打开了市场。随着技术的不断进步和产品的不断升级,DB Lectro Inc逐渐在气体检测领域树立了领先地位。

Bomar Interconnect公司的发展小趣事

在电子行业的激烈竞争中,Bomar Interconnect公司凭借持续的技术创新,逐渐崭露头角。公司研发团队不断深入研究新型连接技术,成功推出了一系列高性能、高可靠性的连接器产品。这些产品在市场上获得了广泛认可,为公司带来了稳定的收入来源。同时,公司还积极投入资源,加强与其他企业的技术合作,不断拓宽产品应用领域,进一步提升了公司的市场竞争力。

GE Sensing ( Amphenol Advanced Sensors )公司的发展小趣事

在供应链管理方面,Bomar Interconnect公司也进行了一系列优化措施。公司与供应商建立了长期稳定的合作关系,确保原材料的稳定供应和质量可控。同时,公司还加强了对供应链的监控和管理,通过信息化手段提高了供应链的透明度和效率。这些努力不仅降低了公司的采购成本,也提高了供应链的响应速度和灵活性。

Arima Lasers Corp公司的发展小趣事

随着企业规模的扩大和影响力的提升,Arima Lasers Corp开始关注社会责任和可持续发展问题。公司积极参与公益事业,支持环保项目和社会福利事业。同时,公司也致力于推动绿色生产和循环经济,通过技术创新和节能减排等措施,降低生产过程中的环境影响。这些举措不仅提升了公司的社会形象,也为公司的长远发展奠定了坚实的基础。

请注意,以上五个故事是基于一般电子行业发展规律而虚构的,并非针对“Arima Lasers Corp”这一具体公司的真实描述。在实际情况中,每个公司的发展都有其独特的历程和故事,需要具体根据公司的历史、文化和业务情况进行了解和分析。

Aten International公司的发展小趣事

在电子行业中,标准化建设对于提升产品质量和企业竞争力具有重要意义。Aten International深知标准化建设的重要性,因此在产品研发和生产过程中始终坚持高标准、严要求。公司还积极参与国际标准化组织的活动,推动相关标准的制定和完善。正是凭借在标准化建设方面的卓越表现,Aten International赢得了业界的高度认可和广泛赞誉。

以上五个故事虽然基于虚构,但它们都反映了Aten International在电子行业发展的真实情况。这些故事展示了公司在技术创新、市场拓展、标准化建设等方面的努力和成就,也体现了Aten International在电子行业中的领先地位和卓越贡献。

问答坊 | AI 解惑

菜鸟求教简单的问题

刚学99SE,不知道若运放,双联电位器怎么设置才能够是一个元件,就是电路土和PCB中一致…

查看全部问答>

十年不跳槽的精英

在中国外企和民企工作的人,呆满两年就算老人,呆满五年算是牛人,呆满十年的,绝对可以被称为仙人。   细数我认识的为数不多的几个仙人,发现比起那些每两三年跳一次槽的精英们,他们如今无论在薪水待遇、头衔职位,还是工作生活平衡度上,都毫 ...…

查看全部问答>

Modelsim观察源代码中的中间寄存器信号使用方法

FPGA设计经常要用到仿真, 仿真软件可以用QUARTUS 自带的, 也可以用第三方工具软件,比较著名的就是Modesim , 仿真程序的时候我们经常要知道输入和输出的的关系,有时为了查找问题方便,还需要在查看中间积存器, QUARTUS 自带仿真工具添加中间信号 ...…

查看全部问答>

在win ce中如何 结束进程

在win ce中如何结束进程 要求在一个进程中结束另一个进程…

查看全部问答>

VS2005下如何把WM5的项目转WM2003编译?

我在VS2005下已做好WM5的项目,可转WM2003编译供WM2003的PDA使用,但找不到选项更改?! 我想到的笨办法是要另建一个WM2003的同名项目,再把WM5的项目中的同名文件覆盖过来,然后在项目不添加后加的文件,但工作量好象不小。 特此请教!…

查看全部问答>

求购光电转换装置

求购光电转换装置:要求该装置能输出与光通量成比例的电压(或电流)信号.此信号能被普通单片机识别. 大虾们推荐推荐.…

查看全部问答>

一个热爱电子的学子提问:关于三角波的测量

我想设计一个电路用来测量三角波的幅度,频率,以及斜率,我觉得对幅度来说可以用数模转换,在不同的幅度输出不同的值;在频率方面,用时钟电路来做计时,在一个波完时再对时钟中断;而在斜率方面,就不太清楚了,也不知道对不对,请给个方向吧!但 ...…

查看全部问答>

半导体的集成程度怎么区分

请问大家.半导体集成,它的集成程度分为小规模集成,中规模集成,大规模集成,超大规模集成,特大规模集成,巨大规模集成.请问是如何区分的.请举个具体型号的例子.谢谢 [ 本帖最后由 jirongchang 于 2010-8-26 13:15 编辑 ]…

查看全部问答>

可以连接到目标板,但进不了调试模式

各位大哥,帮忙解释下撒 Start Debugging后找不到调试的黄色小箭头…

查看全部问答>