【STM32CubeMx】 串口通信(USART)Printf重定向
- STM32CubeMX: Version 4.26.1
- MDK-ARM: Version 5.24.2
- 开发板: 中移onenet 麒麟座MINI板
- 芯片: STM32F103CBT6
1.STM32CubeMX设置
-
设置外部时钟源
-
设置Debug
-
设置串口 使用USART1 PA9,PA10
-
设置时钟频率
-
设置USART1详细参数
-
生成MDK-ARM工程
2.重定向Printf 及 Scanf
-
主要用到两个函数
-
HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
-
HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
- 在 bsp_debug_usart.h 中添加头文件
#include "stm32f1xx_hal.h"
#include "stm32f1xx_hal_usart.h"
#include <stdio.h>
- 在 bsp_debug_usart.c 中重写fget和fput函数
/**
* 函数功能: 重定向c库函数printf到DEBUG_USARTx
* 输入参数: 无
* 返 回 值: 无
* 说 明:无
*/
int fputc(int ch, FILE *f)
{
HAL_UART_Transmit(&husart_debug, (uint8_t *)&ch, 1, 0xffff);
return ch;
}
/**
* 函数功能: 重定向c库函数getchar,scanf到DEBUG_USARTx
* 输入参数: 无
* 返 回 值: 无
* 说 明:无
*/
int fgetc(FILE *f)
{
uint8_t ch = 0;
HAL_UART_Receive(&husart_debug, &ch, 1, 0xffff);
return ch;
}
- 在 main.c 中添加 bsp_debug_usart.h
#include "bsp_debug_usart.h"
/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/
uint16_t cnt = 0;
char str[256];
/* USER CODE END PV */
while(1)
{
HAL_Delay(1000);
sprintf(str, "%d:usart_debug_test...\r\n", ++cnt);
printf("%s", str);
}
3.调试
4.关于实现串口收发的几种方式
- 轮询法
- 中断法
- DMA法