4,STM32CubeMX配置UART串口工程

 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 */

        效果如下所示。

  • 14
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值