STM32-HAL库02-USART串口通信
所用材料:
STM32F103C8T6(单片机);
STM32CUBEMX(软件);
MDK5(软件);
XCOM v2.0(串口助手);
本节内容:
实现电脑与STM32的串口通信,包括串口发送与中断接收。
第一步:新建CUBEMX工程
- 选择MCU-F103C8
第二步:USART串口配置
- 选择USART1
- MODE选择:异步通信Asynchronous
- Parameter Settings(参数设定)全部默认
- 比特率:115200
- NVIC Setting中勾选串口中断
第三步:SYS设置
将DEBUG选线设置为Serial Wire
第四步:RCC设置
选择高速外部时钟
第五步:时钟树设置
对照图片设置即可
第六步:文件设置
第七步:程序编写
- 打开MDK5
- 烧录程序设置:魔术棒-DEBUG(选择STlink)-Settings-Flash Download-勾选Reset and run
- 在usart.c中将printf重定向
usart.c中添加一下程序:
#include "stdio.h"
int fputc(int ch, FILE *f)
{
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);//HAL库串口发送函数
return ch;
}
int fgetc(FILE *f)
{
uint8_t ch = 0;
HAL_UART_Receive(&huart1, &ch, 1, 0xffff);//HAL库串口接收函数
return ch;
}
魔术棒中勾选Use MicroLIB
- 实现串口发送
通过重定义后的printf函数实现串口信息的发送。
while (1)
{
/* USER CODE END WHILE */
printf("Open ready\n");
HAL_Delay(1000);
/* USER CODE BEGIN 3 */
}
5. 实现串口中断接收
先设定单字节接收缓冲,数组接收缓冲与接收计数
uint16_t rx_bit; //单字节接收缓冲
uint16_t rx_data[256]; //数组接收缓冲
uint8_t rx_cnt=0; //接收计数
再在主函数中,while(1)之前调用一次接收中断开启函数
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USART1_UART_Init();
/* USER CODE BEGIN 2 */
printf("Open ready\r\n");
HAL_UART_Receive_IT(&huart1, (uint8_t *)&rx_bit, 1);//接收中断开启函数
/* USER CODE END 2 */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
最后在main.c中,主函数以外的地方编写中断回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
rx_data[rx_cnt] = rx_bit;
rx_cnt=rx_cnt+1;
if (rx_data[rx_cnt-1] == 0x0A && rx_data[rx_cnt-2] == 0x0D)
{
printf("接收到的数据为:\r\n");
HAL_UART_Transmit(&huart1, (uint8_t *)&rx_data, sizeof(rx_data),0xFFFF);
printf("\r\n");
rx_cnt =0;
memset(rx_data,0x00,sizeof(rx_data));
}
HAL_UART_Receive_IT(&huart1, (uint8_t *)&rx_bit, 1);
}
强烈推荐一个免费好用的串口调试工具vofa+
下载网址如下 : https://www.vofa.plus/