STM32CubeMX配置串口发送和接收中断详解
创作时间:
作者:
@小白创作中心
STM32CubeMX配置串口发送和接收中断详解
引用
51CTO
1.
https://blog.51cto.com/u_16099218/13053267
本文将详细介绍如何使用STM32CubeMX配置串口发送和接收中断,包括串行通信的基础知识、STM32CubeMX中的配置步骤、HAL库中串口发送和接收的重要函数,以及具体的代码实例。
串行接口相关知识
- 两种通信方式:并行通信与串行通信,并行通信传输速度快但是占用的引脚资源多,串行通信传输速度慢但是占用的引脚资源少。
- 三种模式:单工、半双工、全双工
- 异步串行通信:通信双方在没有同步时钟的前提下,将一个字符(包括特定的附加位)按位进行传输的通信方式。
- 波特率:每秒钟传输的二进制位数,如9600bps。
- 串口<--------->USB接口:CH340 CP2012
- STM32芯片的串口UASRT功能十分强大,但对于日常编程而言,使用最多的还是异步串行通信。
USART1_TX与PA9复用,USART1_RX与PA10复用。
USART2_TX与PA2复用,USART2_RX与PA3复用。
STM32CubeMX中关于USART的配置
注意:(1)Mode模式设置为异步通信;(2)波特率配置要与上位机选择的一致;
HAL库中串口发送的重要函数(重点)
- 阻塞式发送函数(串口数据发送完以后,单片机才能执行下一步程序,一般串口需要发送的数据也不多,等他发完也不会花太多时间,所以其影响可忽略不计)
HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
四个参数:使用哪个串口;需要发送的数据(是字符串还是字节获数组);数据大小;设定的发送时间;
- 非阻塞式发送函数(串口发送数据,不需要等待发送完数据,单片机能执行下一步程序,一般用于串口需要发送很长的数据的情况)待串口将数据发送完以后,回调对应中断服务函数。
HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
- 发送完毕中断回调函数
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart);
串口发送数据实例
- 使用非阻塞式的串口发送函数,将发送缓数组dat_Txd中的前5个数据发送到USART1,在数据发送完成后,翻转PB9引脚的输出电平。
HAL_UART_Transmit_IT(&huart1,&dat_Txd,5);//调用非阻塞式的串口发送函数
void HAL_UART_TxCpltCalback(UART_HandleTypeDef *huart)//发送完毕中断回调函数
{
if(huart->Instance == USART1)//判断是否为串口1
{
HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_9);
}
}
- 补充:使用阻塞式的串口发送函数怎么写代码?
HAL_UART_Transmit(&huart1, &dat_Txd, 5, 10000);
HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_9);
HAL库中串口接收的重要函数(重点)
- 阻塞式接收函数(不推荐使用,一般不知道什么时候能够接受到数据,单片机不可能一直不工作只为等着接收数据)
HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
- 非阻塞式接收函数(推荐使用)
HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
- 接收完毕中断回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);
串口接收数据实例
- 使用非阻塞式的串口接收函数,接收USART1的一个字节,将其保存在变量dat_Txd中,在数据接收完成后若该字节为0x5A,翻转PB8引脚的输出电平。
HAL_UART_Receive_IT(&huart1,&dat_Rxd,1);//调用非阻塞式的串口发送函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance == USART1)//判断是否为串口1
{
if(huart->Instance == USART1)
{
if(dat_Rxd == 0x5A)
HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_8);
}
}
}
综合实训
在STM32F103C8T6开发板上,连接相关外电路,还需要一个串口,利用STM32CubeMX和Keil5协同开发,完成以下的功能。
- 开机后,向串口1发送“hello world ! ”。
- 串口1收到字节指令“OxA1”,PB9输出高电平,发送“LED1 Open ! ”。
- 串口1收到字节指令“OxA2”,PB9输出低电平,发送“LED1 Closed! ”。
- 在串口发送过程中,翻转PB8作为发送数据指示灯。
cubmx配置
在本文第2点关于USART的配置基础下勾选中断,并将波特率修改为9600。
Keil5编写代码
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
/*宏定义*/
#define LED1_ON() HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET);
#define LED1_OFF() HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_RESET);
#define LED2_ON() HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_SET);
#define LED2_OFF() HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_RESET);
uint8_t Tx_str1[] = "hello world!\r\n";
uint8_t Tx_str2[] = "LED1 Open!\r\n";
uint8_t Tx_str3[] = "LED1 Close!\r\n";
uint8_t RX_dat = 0;
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance == USART1)//判断是否为串口1
{
if(huart->Instance == USART1)
{
if(RX_dat == 0xa1)
{
LED1_ON();
LED2_ON();
HAL_UART_Transmit(&huart1,Tx_str1,sizeof(Tx_str2),10000);
LED2_OFF();
HAL_UART_Receive_IT(&huart1,&RX_dat,1);
}
else if(RX_dat == 0xa2)
{
LED1_OFF();
LED2_ON();
HAL_UART_Transmit(&huart1,Tx_str1,sizeof(Tx_str3),10000);
LED2_OFF();
HAL_UART_Receive_IT(&huart1,&RX_dat,1);
}
}
}
}
/* USER CODE END 0 */
/* USER CODE BEGIN 2 */
LED2_ON();
HAL_UART_Transmit(&huart1,Tx_str1,sizeof(Tx_str1),10000);
LED2_OFF();
HAL_UART_Receive_IT(&huart1,&RX_dat,1);
/* USER CODE END 2 */
操作完毕!
热门推荐
当短剧流行,微型小说迎来发展新天地?
了解电动汽车充电器的输入电压和电流以及如何选择合适的充电器
PP棉滤芯完全指南:从选购到更换的实用知识
数控激光切割机在智能制造中的应用与前景
阿比西尼亚猫的饲养指南(从喂养到训练,全面了解阿比西尼亚猫的生活方式)
Android从驱动到app,以LED控制系统简单示例
激光加工技术在精密制造领域中的应用前景
如何区分南北方
家具选购要注意的几个关键点
夫妻离婚房产怎么办理赠与子女
住院不慌乱!必备物品清单全在这
借款用途有什么用
块头很大,却甘愿为奴!《暗黑破坏神2》中被小怪当作专属坐骑的攻城兽
车主必读:多因素对电动汽车充电功率的影响及应对策略
元宵节的由来介绍简短 元宵节的由来简单介绍
经常贴双眼皮贴会有什么危害
鞘内泵是什么?工作原理、适应症及手术过程详解
车厘子选购完全攻略:从品种到品牌,教你挑选高品质车厘子
SpringBoot长途汽车网上售票系统设计与实现
日本7天自由行花费指南:省钱小秘诀与预算规划
奥克兰大学:新西兰顶尖学府的全面解析
参数和非参数机器学习算法的定义和区别是什么呢
5G智能专网是什么?有什么用?怎么部署?
“廿”字的读音与文化探讨:揭示汉字背后的历史与意义
盲人现状与科技助盲的探索
“交通一体化”正在重塑地理意义上的京津冀,跨省通勤成为新日常
天冷咳嗽就“怕”它,隔天吃1次,清肺润喉,做成小零食,更好
牡丹花语:不同颜色牡丹花的情感与寓意
积极政策谁最受益?券商6月金股地产增配居前,牧原股份最热
《哪吒之魔童闹海》:科技与文化的交响