ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

5.STM32F407之HAL库——串口通信

2022-01-20 21:31:38  阅读:177  来源: 互联网

标签:ch HAL UART 通信 uint8 串口 STM32F407


使用STM32CubeMX配置工程+MDKARM编写代码实现串口通信

一、串口通信简介

  串口按位(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也不会生效。
USE MicroLIB

  感谢各位的浏览。鄙人水平有限,很多地方写的感觉差强人意,如果有不对的地方欢迎指正。

标签:ch,HAL,UART,通信,uint8,串口,STM32F407
来源: https://blog.csdn.net/qq_36528377/article/details/122476520

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有