问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

STM32F407串口通信配置与实现

创作时间:
作者:
@小白创作中心

STM32F407串口通信配置与实现

引用
CSDN
1.
https://blog.csdn.net/qq_36528377/article/details/122476520

本文将详细介绍如何使用STM32CubeMX配置工程并通过MDK-ARM编写代码实现STM32F407的串口通信。内容包括串口通信的基本概念、STM32CubeMX的配置步骤以及具体的代码实现。

一、串口通信简介

串口按位(bit)发送和接收字节的通信方式。通信可以分为同步串口通信和异步串口通信。

  • 波特率:是一个衡量符号传输速率的参数。在单片机使用中,常用的波特率有9600、115200等。
  • 数据位:通信中实际数据位的参数。
  • 停止位:单个包的最后位。典型的值为1,1.5和2位。
  • 校验位:判断是否有噪声干扰了通信或者是否传输和接收数据是否不同步。

二、STM32CubeMX配置

配置串口引脚,和串口设置

设置串口中断优先级

中断优先级又分为抢占优先级和响应优先级。数字越小越优先。

点击generate code生成初始化代码。

三、代码实现

编写fputc重定义函数。重写后可以在单片机项目中使用stdio.h库中的printf函数。

/*
如果需要支持stdio.h还需要在target里面选择USE MicroLIB
*/
/*使用范例
        printf("Hello world \r\n");
        HAL_Delay(500);
        HAL_UART_Transmit(&huart1,"使用HAL库函数发送数据\r\n",23,1000);  //1-选择串口,2-输出内容,3-输出内容长度,4-最长等待时间
*/
//重定义fputc函数
//需要调用 stdio.h头文件,支持库中printf函数
int fputc(int ch, FILE *f)
{
    HAL_UART_Transmit(&huart1,(uint8_t *)&ch,1,HAL_MAX_DELAY);//挂载到串口1
    return ch;
}	
//重定义fgetc函数
int fgetc(FILE *f)
{
    uint8_t ch;
    HAL_UART_Receive(&huart1,(uint8_t *)&ch,1,HAL_MAX_DELAY);
    return ch;
}
//串口中断回调
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{ 
    if(huart -> Instance == USART1)
    {
        HAL_UART_Receive_IT(&huart1,(uint8_t*)usart1_ReadBuffer,USART1_LENGTH);	
    }	
}

头文件中声明函数

#include "usart.h"
#include "stdio.h"     //为了支持printf
#define USART1_LENGTH 8
extern uint8_t usart1_ReadBuffer[8];
//在mian.c中要定义这些外部变量
    
int fputc(int ch, FILE *f);
int fgetc(FILE *f);
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);

main函数中调用串口通信相关函数实现功能,main.h中包含头文件。

  /* USER CODE BEGIN 2 */	
    HAL_UART_Receive_IT(&huart1,(uint8_t*)usart1_ReadBuffer,USART1_LENGTH);
    printf("STM32F407 Init!\r\n");
    Led0_Light_N(5,500);
    Led1_Light_N(5,500);
  /* USER CODE END 2 */

四、在target里面选择USE MicroLIB

这一步挺关键的,如果没有在target里面选择USE MicroLIB的话,前面写了重定义fputc也不会生效。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号