一、所用工具:
1、芯片: STM32F407ZET6
2、STM32CubeMx软件
3、IDE: MDK-Keil软件
4、STM32F4xxHAL库
二、实现功能:
初始化CUBEMX及串口配置
三、HAL库配置步骤:
1、打开CUBEMX,新建工程
2、选择自己的芯片
3、选择调试器
4、配置为外部时钟源
5、配置详细时钟频率
6、开启异步串口通信
7、命名工程,不要带中文,选择IDE
8、勾选“仅生成比原的库文件”,“生成对应的.c/.h文件”
至此,CUBEMX初始化配置完成
五、MDK_ARM配置
1、初始化设置
点击 确定 -> ok,完成配置
2、串口重定向
在自定义代码四区输入以下代码,头文件最好添加在USER CODE BEGIN Includes区
#include "stdio.h"
int fputc(int ch, FILE *f)
{
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
return ch;
}
int fgetc(FILE *f)
{
uint8_t ch = 0;
HAL_UART_Receive(&huart1, &ch, 1, 0xffff);
return ch;
}
3、串口接收数据
#include "string.h"
#include "stdio.h"
#include "stdlib.h"
#define RXBUFFERSIZE 256
char RxBuffer[RXBUFFERSIZE],rx_buf[5];
uint8_t aRxBuffer;
uint8_t Uart1_Rx_Cnt = 0;
int num=0;
HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer, 1);
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
UNUSED(huart);
if(huart==&huart1){
if(Uart1_Rx_Cnt >= 255) { //数据溢出判定
Uart1_Rx_Cnt = 0;
memset(RxBuffer,0x00,sizeof(RxBuffer));
HAL_UART_Transmit(&huart1, (uint8_t *)"OVERFLOW", 10,0xFFFF);
}
else{
RxBuffer[Uart1_Rx_Cnt++] = aRxBuffer;
if((RxBuffer[Uart1_Rx_Cnt-1] == 0x0A)&&(RxBuffer[Uart1_Rx_Cnt-2] == 0x0D)) { //帧头帧尾判定
strcpy(rx_buf,RxBuffer);
num=atoi(rx_buf);
while(HAL_UART_GetState(&huart1) == HAL_UART_STATE_BUSY_TX);
Uart1_Rx_Cnt = 0;
memset(RxBuffer,0x00,sizeof(RxBuffer));
}
}
HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer, 1);
}
}