STM32CubeMX串口空闲中断加DMA实现不定长度收发数据

发布者:温暖拥抱最新更新时间:2018-10-05 来源: eefocus关键字:STM32CubeMX  串口空闲  中断  DMA  收发数据 手机看文章 扫描二维码
随时随地手机看文章

这里教程是选择的STM32F407。STM32F103也测试过。


1.首先选择串口,选择异步通信。




2.添加DMA




3.打开中断




4.生成代码,生成代码选择了每个外设单独使用.c/.h




5.我使用的是Keil5。打开工程,首先注释掉dma.c里的DMA接收中断,因为不需要DMA接收中断,DMA发送中断是需要的。(dma.c)


void MX_DMA_Init(void)   

{  

    

  __HAL_RCC_DMA2_CLK_ENABLE();  

  

    

    

  HAL_NVIC_SetPriority(DMA2_Stream0_IRQn, 2, 0);  

  HAL_NVIC_EnableIRQ(DMA2_Stream0_IRQn);  

    

//  HAL_NVIC_SetPriority(DMA2_Stream2_IRQn, 0, 0);  

//  HAL_NVIC_EnableIRQ(DMA2_Stream2_IRQn);  

    

  HAL_NVIC_SetPriority(DMA2_Stream7_IRQn, 1, 0);  

  HAL_NVIC_EnableIRQ(DMA2_Stream7_IRQn);  

  

}  

6.在usart.h文件里定义串口接收数据类型我是如下定义的(usart.h)

  

#define RECEIVELEN 1024  

#define USART_DMA_SENDING 1//发送未完成  

#define USART_DMA_SENDOVER 0//发送完成  

typedef struct  

{  

uint8_t receive_flag:1;//空闲接收标记  

uint8_t dmaSend_flag:1;//发送完成标记  

uint16_t rx_len;//接收长度  

uint8_t usartDMA_rxBuf[RECEIVELEN];//DMA接收缓存  

}USART_RECEIVETYPE;  

   

extern USART_RECEIVETYPE UsartType1;  

  

  

  

7.然后在usart.c里需要添加空闲中断处理函数,以及DMA发送函数等。(usart.c)

 


首先定义串口数据类型:


  

USART_RECEIVETYPE UsartType1;  

  

  


然后定义空闲中断处理函数和DMA发送函数

 

  

#ifdef __GNUC__  

  

    

#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)  

#else  

  

  #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)  

#endif   

      

PUTCHAR_PROTOTYPE  

{  

    HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1, 0xFFFF);  

    return ch;  

}  

  

//DMA发送函数  

void Usart1SendData_DMA(uint8_t *pdata, uint16_t Length)  

{  

    while(UsartType1.dmaSend_flag == USART_DMA_SENDING);  

    UsartType1.dmaSend_flag = USART_DMA_SENDING;  

    HAL_UART_Transmit_DMA(&huart1, pdata, Length);  

}  

  

//DMA发送完成中断回调函数  

void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)  

{  

     __HAL_DMA_DISABLE(huart->hdmatx);  

    UsartType1.dmaSend_flag = USART_DMA_SENDOVER;  

}  

  

//串口接收空闲中断  

void UsartReceive_IDLE(UART_HandleTypeDef *huart)  

{  

    uint32_t temp;  

  

    if((__HAL_UART_GET_FLAG(huart,UART_FLAG_IDLE) != RESET))  

    {   

        __HAL_UART_CLEAR_IDLEFLAG(&huart1);  

        HAL_UART_DMAStop(&huart1);  

        temp = huart1.hdmarx->Instance->NDTR;  

        UsartType1.rx_len =  RECEIVELEN - temp;   

        UsartType1.receive_flag=1;  

        HAL_UART_Receive_DMA(&huart1,UsartType1.usartDMA_rxBuf,RECEIVELEN);  

    }  

}  

  


  

8.在中断文件里添加(当然,上面的空闲中断处理函数需要声明)(stm32f4xxit.c)


void USART1_IRQHandler(void)  

{  

    

    UsartReceive_IDLE(&huart1);  

    

  HAL_UART_IRQHandler(&huart1);  

    

  

    

}  


9.主函数里,打开空闲中断,初始化DMA接收

 


    HAL_UART_Receive_DMA(&huart1, UsartType1.usartDMA_rxBuf, RECEIVELEN);  

    __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);  

    


10.然后就可以在while(1)里处理数据了  

      

  while (1)  

  {  

        if(UsartType1.receive_flag)//如果产生了空闲中断  

        {  

            UsartType1.receive_flag=0;//清零标记  

            Usart1SendData_DMA(UsartType1.usartDMA_rxBuf,UsartType1.rx_len);//串口打印收到的数据。  

        }  

    

  

    

          

  }  


关键字:STM32CubeMX  串口空闲  中断  DMA  收发数据 引用地址:STM32CubeMX串口空闲中断加DMA实现不定长度收发数据

上一篇:STM32高级开发-在GCC和GNU中使用printf打印串口数据
下一篇:STM32F411RE Nucleo笔记-按键控制PWM占空比

推荐阅读最新更新时间:2024-03-16 16:14

STM32 Cubemax(九) ——利用输入捕获中断实现超声波测距
前言 因为要实现一下卡尔曼滤波,所以这次先写一下超声波,顺便重温一下输入捕获中断。 一、超声波模块原理 但凡在网上搜过超声波这个模块的,对这个图都不陌生,简单的说就是想得到超声波的数据,包含以下几个步骤。 1.发送大于10us的触发信号。 2.检测超声波发出信号时产生的高电平。 3.检测超声波接收到信号时产生的低电平 而我们就是通过后两步,即去检测处因为超声波产生的高电平的时间,从而来得到距离信息的。而输入捕获的作用就是用来去捕获高电平或者低电平的持续时间的 我们的编程就是根据上图来实现的。 二、Cubmax配置 1.配置定时器输入捕获 本实验板子为F407,分频系数选择84-1,则计数精度达到1us。10
[单片机]
STM32 Cubemax(九) ——利用输入捕获<font color='red'>中断</font>实现超声波测距
2440中断解析
MACRO $HandlerLabel HANDLER $HandleLabel $HandlerLabel sub sp,sp,#4 ;decrement sp(to store jump address) stmfd sp!,{r0} ;PUSH the work register to stack(lr does not push because it return to original address) ldr r0,=$HandleLabel; load the address of HandleXXX to r0 ldr r0, ;load the contents(service r
[单片机]
ATmega64 复位与中断处理
AVR有不同的中断源。每个中断和复位在程序空间都有独立的中断向量。所有的中断事件 都有自己的使能位。当使能位置位,且状态寄存器的全局中断使能位I 也置位时,中断可 以发生。根据程序计数器PC 的不同,在引导锁定位BLB02 或BLB12 被编程的情况下, 中断可能被自动禁止。这个特性提高了软件的安全性。详见 P281“ 存储器编程” 的描述。 程序存储区的最低地址缺省为复位向量和中断向量。完整的向量列表请参见 P57“中断” 。 列表也决定了不同中断的优先级。向量所在的地址越低,优先级越高。RESET 具有最高 的优先级,第二个为INT0 – 外部中断请求0。通过置位MCU 控制寄存器 (MCUCR) 的 IVSEL,中断向量
[单片机]
STM32中断优先级和开关总中断(很老很经典)
一、中断优先级: STM32(Cortex-M3)中的优先级概念 STM32(Cortex-M3)中有两个优先级的概念——抢占式优先级和响应优先级,有人把响应优先级称作'亚优先级'或'副优先级',每个中断源都需要被指定这两种优先级。 具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断嵌套,或者说高抢占式优先级的中断可以嵌套低抢占式优先级的中断。 当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后才能被处理。如果这两个中断同时到达,则中断控制器根据他们的响应优先级高低来决
[单片机]
STM32<font color='red'>中断</font>优先级和开关总<font color='red'>中断</font>(很老很经典)
STM32CubeMX新建工程的过程及方法解析
Ⅰ、写在前面 关于STM32CubeMX新建工程的过程。最终通过STM32CubeMX工具配置完成一个驱动IO(点亮LED)的软件工程,也就是通过STM32CubeMX配置完成之后,打开工程直接下载就能点亮LED的工程。 Ⅱ、STM32CubeMX新建工程描述 这里结合实例来讲述新建工程的每一个步骤的细节。 1.打开STM32CubeMX软件,点击“新建工程” 2.选择MCU或选择(ST官方)开发板 A.如果是我们网上购买的,或者自己画的开发板,点击“MCU Selector”进入MCU选择器。选择器在网页上常见,根据自己需求进行选择(我们以STM32F103E为例)。 1.根据“系列”选择;如:F0、F1、F2.。..。
[单片机]
<font color='red'>STM32CubeMX</font>新建工程的过程及方法解析
STM32CUBEMX(10)--Flash读写
概述 本例程主要讲解如何对芯片自带Flash进行读写,用芯片内部Flash可以对一些需要断电保存的数据进行保存,无需加外部得存储芯片,本例程采用的是STM32F030R8T6,64K大小的Flash。 硬件准备 首先需要准备一个开发板,这里我准备的是NUCLEO-F030R8的开发板: 选择芯片型号 使用STM32CUBEMX选择芯片stm32f030r8,如下所示: 配置时钟源 HSE与LSE分别为外部高速时钟和低速时钟,在本文中使用内置的时钟源,故都选择Disable选项,如下所示: 配置时钟树 STM32F0的最高主频到48M,所以配置48即可: 串口配置 本次实验使用的串口1进行串口通信,波特率配置为1
[单片机]
<font color='red'>STM32CUBEMX</font>(10)--Flash读写
STM32 USART中断小程序
尽管网上的例程一堆堆,但还是花了好几天时间才跑通了一个USART通过中断方式实现的小程序。相当无比地郁闷啊。记录一下遇到的问题: 1. 配置RCC的时机 在主程序中通过查询方式收发数据时,结果并不稳定。对比了ST提供的例程中的设置,将RCC配置提到了所有配置的最前面后,功能实现。结论:应先配置RCC,再初始化其他外设。 2. RAM下调试遇到的问题 在上述查询方式的基础上,增加对NVIC的配置,USART的中断设置,以及ISR中的处理过程,放到RAM下调试,无法进入ISR。有以下两个测试结果:1)在主程序while中调用USART_GetITStatus,判断USART中断事件是否发生及中断是否使能,结果为SET。2)
[单片机]
STM32 USART<font color='red'>中断</font>小程序
Windows98下硬件中断驱动程序的开发
摘 要: 介绍了Windows98的内核管理机制和应用程序权限级别,简述了在Windows98下进行虚拟驱动程序开发的几种工具和编程方法,并给出了借助VToolsD用C++语言编写的处理硬件中断的程序实例。 关键词: 虚拟设备驱动程序 VToolsD 中断服务例程 美国微软公司出品的Windows98以其友好的图形用户界面,在我国赢得了广泛的市场。在给广大办公环境工作人员带来方便的同时,也给不少工程技术人员带来了一些麻烦。一些原本在DOS下很容易编出的控制硬件的程序,现在在Windows98下就不那么容易实现了。作为一个完善的操作系统也必须能控制硬件,象DOS那样直接与硬件打交道是Windows98
[应用]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved