1,前言
单片机型号:STM32F407
编程环境 :STM32CubeMX + Keil v5
硬件连接 :PF9 ---> LED0 ,PF10--->LED1
注:本工程在1,STM32CubeMX工程基础(配置Debug、时钟树)基础上完成。
2,STM32CubeMX配置UART串口
在Connectivity(1)中选择USART1(2)进行配置串口1,在Mode中下拉选择异步通信方式Asynchronous(3),做好后我们可以看到RX和TX两个引脚已经被配置完毕。
下面进行串口配置,在Configuration(1)进行配置串口,点击Parameter Settings(2),在(3)中配置波特率、字节长度、停止位等信息。
3,STM32CubeMX配置串口接收中断
在点击System Core(1)下方的NVIC(2),再点击勾选USART1 global interrupt(3)开启串口1中断使能。
4,STM32HAL库的UART相关函数
1,HAL_UART_Transmit串口发送函数。输入值huart为串口1句柄,输入值pData为发送缓冲区,输入值Size为发送大小,输入值Timeout为超时时间。
HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
2,HAL_UART_Transmit_IT串口中断发送函数。输入值huart为串口1句柄,输入值pData为发送缓冲区,输入值Size为发送大小。
HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
3,HAL_UART_Receive串口接收函数。输入值huart为串口1句柄,输入值pData为接收缓冲区,输入值Size为接收大小,输入值Timeout为超时时间。
HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
4,HAL_UART_Receive_IT串口中断接收函数。输入值huart为串口1句柄,输入值pData为接收缓冲区,输入值Size为接收大小。
HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
5,重定义fputc函数
对fputc函数重定义是为了方便我们使用标准C语言库stdio.h中的串口相关函数,如printf()函数,可以方便我们测试程序以及查找程序中的问题等,十分有用。也可以不做此部分内容。
#include <stdio.h>
struct __FILE { int handle; /* Add whatever you need here */ };
FILE __stdout;
FILE __stdin;
int fputc(int ch, FILE *f) {
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 1000);
return ch;
}
6,编程实战
添加fput()函数重定向,新增stdio.h头文件,接着重新编写串口中断回调函数。
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "usart.h"
#include "gpio.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include <stdio.h>
struct __FILE { int handle; /* Add whatever you need here */ };
FILE __stdout;
FILE __stdin;
int fputc(int ch, FILE *f) {
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 1000);
return ch;
}
/* USER CODE END Includes */
/* USER CODE BEGIN PTD */
uint8_t Rx_Buff[8]={0};
/* USER CODE END PTD */
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */
/* USER CODE END PFP */
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
/* USER CODE END 0 */
/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
//...省略
/* USER CODE BEGIN WHILE */
printf("uart1 begin\r\n");
while (1)
{
HAL_UART_Receive_IT(&huart1, Rx_Buff, 8);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
/* USER CODE BEGIN 4 */
//重定义串口中断接收回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
for(uint8_t i=0;i<8;i++)
{
printf("Rx_Buff[%d]:%d\r\n",i,Rx_Buff[i]);
}
}
/* USER CODE END 4 */
效果如下所示。