打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
STM32采用串口DMA方式连续发送数据

STM32采用串口DMA方式,用115200bps或更高速率向上位机连续发送数据

  • 1.CubeMX生成初始化代码
    • 1.1建立工程
    • 1.2串口配置步骤
    • 1.3代码生成
  • 2.编写代码开启DMA和不使用DMA的串口函数操作上区别不大,分别如下
  • 3.程序下载

1.CubeMX生成初始化代码

1.1建立工程

芯片选择:
打开cube软件,选择从芯片来创建工程,一般开发都是使用这个来开发,有的时候也可能使用另外两个,但不多,第二个基于ST提供的开发板创建工程,针对性高,第三个则选择ST提供的例程来创建工程。

F4探索者的主控为STM32F407ZET6,所以在搜索框找到STM32F407ZE后点击具体芯片,再开始工程:


配置时钟源:
我们点开SystemCore(系统内核设置),再点击RCC配置HSE和LSE时钟源,这里我都选择使用外部时钟,配置后,我们可以看到右边芯片引脚分配图的两个时钟源引脚点亮,表示时钟配置为外部源。


配置时钟树:
我们进入ClockConfiguration配置时钟树,使时钟的输入路径和大小符合我们预期,精英板的晶振和时钟倍频如下

1.2串口配置步骤

开启串口
参考之前文章生成初始化代码部分进行配置:https://blog.csdn.net/weixin_56393108/article/details/121124395?utm_source=app&app_version=4.17.2&code=app_1562916241&uLinkId=usr1mkqgl919blen
开启DMA
在配置普通串口的基础上增加以下步骤,点击串口配置里面的DMA设置


点击添加,选择RX和TX,添加后结果如下:

开启DMA循环,每次接收完成就会准备下次接收,不用重复使能

其中DMA通道已经默认分配好,可以使用默认的,如果有其他需求可以自行修改。

1.3代码生成

点击进入Project Manager 配置生成工程的名字,存储路径**(不要有中文)**以及编译器,


配置生成选项,主要为下面三大块,第一个我们选择只拷贝必要的库,第二个选择为每个外设生成.c和.h文件,保存之前的用户代码,以及删除之前的生成代码,第三个不选择

/* USER CODE BEGIN 1 */

/* USER CODE END 1 */

最后点击生成代码

2.编写代码开启DMA和不使用DMA的串口函数操作上区别不大,分别如下

普通串口:

超时机制发送接收,即传入参数有一个时间限制,超过之后或者完成之后,发送、接收就停止;

HAL_UART_Transmit(); //串口发送数据
HAL_UART_Receive();  //串口接收数据

中断机制发送接收,通过中断来接收或者发送数据,发送完就停止;

HAL_UART_Transmit_IT();//串口中断模式发送  
HAL_UART_Receive_IT();//串口中断模式接收

DMA串口:

DMA中断机制发送接收,通过中断来接收或者发送数据,发送完就停止;

HAL_UART_Transmit_DMA();//串口DMA模式发送
HAL_UART_Transmit_DMA();//串口DMA模式接收

打开MDK,在主函数中用户代码段编写如下代码:

头部定义字符串数组

/* USER CODE BEGIN Includes */
unsigned char buf[20];
/* USER CODE END Includes */

主函数插入以下代码:

  /* USER CODE BEGIN 2 */
	//发送数据
	HAL_UART_Transmit_DMA(&huart1,'Uart System Init\r\n',sizeof('Uart System Init\r\n'));
	//启动接收固定长度的数据
	//只有在达到接收长度之后,才会调用回调函数
	HAL_UART_Receive_DMA(&huart1,buf,sizeof('jeck666\r\n'));
  /* USER CODE END 2 */
	
  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */
		
    /* USER CODE BEGIN 3 */
		HAL_Delay(1000);
  }
  /* USER CODE END 3 */

设置串口1回调函数(DMA回调函数的触发条件为接收到设置长度的字符串后,才调用回调函数)

/* USER CODE BEGIN 4 */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
		if(huart == &huart1)
		{
			//将接收到的数据再发送
			HAL_UART_Transmit_DMA(&huart1,buf,13);
		}
}
/* USER CODE END 4 */

3.程序下载

使用MDK自带的下载环境下载程序,我们给单片机连接ST-Link后配置下载,点击魔术棒,选择debug


选择ST-link后,点击setting

添加对应F4的Flash

keil界面点击下载。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
STM32 之 HAL库
STM32F0单片机快速入门八 聊聊 Coolie DMA
STM32
STM32+FreeRTOS+CUBEMX
超全STM32 HAL的知识总结
STM32 HAL库UART的使用
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服