最近又要重新用32做点东西,发现一两年没怎么碰的结果就是,曾经熟得不行的东西都变得极度陌生,这种重新学习记忆的过程过于痛苦,果然还是要留下一些记录给之后失忆的自己的。

1.STM32CUBE配置

1.1 pinout设置

找到想要用的串口,配置模式,正常情况是Asyn(异步)和Disable。

关于mode的几个选项:

  • Asyn 异步
  • Syn同步
  • Single Wire单工
  • 后面几个没有太多的了解惹

1.2  configuration设置

Parameter Settings可以设置:波特率/字长/奇偶校验/停止位/收发模式

DMA Settings中添加接收DMA的流

NVIC Settings中将global interrupt一项使能

1.3 生成项目

在CUBE中有关于串口的配置就此完成啦,之后生成项目就可以了。

2.中断逻辑和DMA

建立一个bsp_usart.c和bsp_usart.h文件,涉及串口中断和DMA接收的东西放这里。

2.1 几个函数

  • DMA接收函数
 static int UART_Receive_DMA_No_IT(UART_HandleTypeDef* huart, uint8_t* pData, uint32_t Size)
{
uint32_t tmp1 = ;
tmp1 = huart->State;
if((tmp1 == HAL_UART_STATE_READY) || (tmp1 == HAL_UART_STATE_BUSY_TX))
{
if((pData == NULL ) || (Size == )) //Ö¸ÕëÖ¸µÄÇøÓò²»Îª¿Õ
{
return HAL_ERROR;
} /* Process Locked */
__HAL_LOCK(huart); huart->pRxBuffPtr = pData;
huart->RxXferSize = Size; huart->ErrorCode = HAL_UART_ERROR_NONE;
/* Check if a transmit process is ongoing or not */
if(huart->State == HAL_UART_STATE_BUSY_TX)
{
huart->State = HAL_UART_STATE_BUSY_TX_RX;
}
else
{
huart->State = HAL_UART_STATE_BUSY_RX;
} /* Enable the DMA Stream */
HAL_DMA_Start(huart->hdmarx, (uint32_t)&huart->Instance->DR, (uint32_t)pData, Size); /* Enable the DMA transfer for the receiver request by setting the DMAR bit
in the UART CR3 register */
huart->Instance->CR3 |= USART_CR3_DMAR; /* Process Unlocked */
__HAL_UNLOCK(huart); return HAL_OK;
}
else
{
return HAL_BUSY;
}
}
  • 串口复位重启DMA函数
void uart_reset_idle_rx_callback(UART_HandleTypeDef *huart)
{
if(__HAL_UART_GET_FLAG(huart, UART_FLAG_IDLE))
{
__HAL_UART_CLEAR_IDLEFLAG(huart);
//clear idle it flag
//ÖØÆôDMA
uint32_t DMA_FLAGS = __HAL_DMA_GET_TC_FLAG_INDEX(huart->hdmarx); __HAL_DMA_DISABLE(huart->hdmarx);
__HAL_DMA_CLEAR_FLAG(huart->hdmarx, DMA_FLAGS);
//__HAL_DMA_SET_COUNTER(huart->hdmarx, MAX_DMA_COUNT);
__HAL_DMA_ENABLE(huart->hdmarx);
}
}

2.2 串口初始化


在main函数初始化的时候调用哦

void huart_init(void)
{
__HAL_UART_CLEAR_IDLEFLAG(&huart1);
__HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE); UART_Receive_DMA_No_IT(&huart1, MsgBuff, DMsgBuffSize);
}

这个初始化函数其实可以修改修改传参复用的。

2.3 串口处理句柄

void MushroomUARTIRQHandler(UART_HandleTypeDef *huart)
{
if(huart == &huart1)
{
//这里放入希望在串口接收中断里处理的事情or函数
}
}

3.将中断处理句柄放入中断文件中

打开stm32f1xx_it.c文件,找到选择的串口中断函数,比如void USART1_IRQHandler(void)。在里面放入写好的串口处理句柄。

然后就大功告成啦!

STM32单片机串口中断+DMA使用(含CUBE配置)的更多相关文章

  1. (三)stm32之串口通信DMA传输完成中断

    一.DMA功能简介 首先唠叨一下DMA的基本概念,DMA的出现大大减轻了CPU的工作量.在硬件系统中,主要由CPU(内核).外设.内存(SRAM).总线等结构组成,数据经常要在内存和外设之间,外设和外 ...

  2. stm32的串口中断

    下面有很多问题没有验证: 在设置USART_CR1中的TE位时,会发送一个空闲帧作为第一次数据发送, 目前我所了解的串口中断发送,有两种方式: 一个是:TC 一个是:TXE 这是判断两个标志位, 第一 ...

  3. STM32单片机串口一键下载电路与操作方法详解

    STM32三种启动模式对应的存储介质均是芯片内置的,它们是:1)用户闪存 = 芯片内置的Flash.2)SRAM = 芯片内置的RAM区,就是内存啦.3)系统存储器 = 芯片内部一块特定的区域,芯片出 ...

  4. STM32基础分析——USART的DMA模式

    有关USART的DMA传输模式,其基本的概念和配置,网上有很多博客和教程都有,这里不再赘述,只是记录一下比较容易忽视而造成调试不通的问题. 1. 串口发送和接收分属两个DMA通道 一般方式操作串口时, ...

  5. STM32使用串口1配合DMA接收不定长数据,减轻CPU载荷

    STM32使用串口1配合DMA接收不定长数据,减轻CPU载荷 http://www.openedv.com/thread-63849-1-1.html 实现思路:采 用STM32F103的串口1,并配 ...

  6. STM32之串口DMA接收不定长数据

    STM32之串口DMA接收不定长数据 引言 在使用stm32或者其他单片机的时候,会经常使用到串口通讯,那么如何有效地接收数据呢?假如这段数据是不定长的有如何高效接收呢? 同学A:数据来了就会进入串口 ...

  7. STM32串口中断的一些资料

    在研究STM32串口接收发送中断的时候找到不少不错的资料,现在备份在这里.以供自己查阅,以及方便其他人. TC ====TXE 顺便预告下最近会写个有关串口处理数据的帖子,从查询和中断方面以及数据处理 ...

  8. STM32 HAL库利用DMA实现串口不定长度接收方法

    参考:https://blog.csdn.net/u014470361/article/details/79206352 我这里使用的芯片是 F1 系列的,主要是利用 DMA 数据传输方式实现的,在配 ...

  9. STM32 串口USART DMA方式发送接收数据

    硬件:stm32f103cbt6 软件:STM32F10x_StdPeriph_Lib_V3.5.0 文章目录 头文件 USART3_DR的地址 DMA的通道 DMA的中断 USART接收回调函数 头 ...

随机推荐

  1. CentOS 7安装Azcopy

    Azcopy是Azure存储一个非常好用的工具.本文将介绍如何在CentOS7下安装的过程. 更新:目前需要.net core 2.0版本.具体下载地址大家自己搜索. 1 安装.net core 1. ...

  2. Java-API-POI-Excel:XSSFWorkbook Documentation

    ylbtech-Java-API-POI:XSSFWorkbook Documentation 1.返回顶部 1. org.apache.poi.xssf.usermodel Class XSSFWo ...

  3. 数据库学习笔记 (三) python操作数据库

    python 操作MYSQL数据库主要有两种方式: 使用原生模块:pymysql ORM框架:SQLAchemy 一.pymysql 1.1下载安装模块 第一种:cmd下:执行命令下载安装:pip3 ...

  4. delphi VCL组件同名继承

    当我们在扩展一个 vcl 组件功能的时候,既想保留IDE中能拖动大小与直接设置属性的功能,又想减少写创建与释放代码和安装扩展后新组件的麻烦,那么本文中的方法,就非常实用了. 以给TStringGrid ...

  5. leetcode319

    public class Solution { public int BulbSwitch(int n) { var x = Math.Sqrt(n); var y = Convert.ToInt32 ...

  6. docker 笔记(6)网络

    docker network ls   默认docker安装时会创建3个网络 none网络 one 网络就是什么都没有的网络.挂在这个网络下的容器除了 lo,没有其他任何网卡.容器创建时,可以通过 - ...

  7. C语言学习笔记--条件编译

    C语言中的条件编译的行为类似于 C 语言中的 if…else…,是预编译指示命令,用于控制是否编译某段代码 . 1.条件编译的本质 (1)预编译器根据条件编译指令有选择的删除代码 (2)编译器不知道代 ...

  8. eclipse配置hadoop location的端口号

    在eclipse下配置hadoop location的时候 hadoop端口号应该与conf文件夹下的core-site.xml以及mapred-site.xml保持一致 前者对应dfs master ...

  9. php中使用array_reduce给数组降维

    PHP里面最强大的工具,就是数组,它融合了多种数据结构的特点,数组.队列.栈.哈希表等等,而且容器可以兼容各种类型,任意嵌套,简直无所不能.围绕着数组,PHP原生支持了一些列的函数,使得数组在实际编程 ...

  10. cocos2d-js 序列帧动画

    var spriteCache = cc.spriteFrameCache;spriteCache.addSpriteFrames(res.fireworks_plist,res.fireworks_ ...