IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> STM32G431学习记录5——USART串口通信 -> 正文阅读

[嵌入式]STM32G431学习记录5——USART串口通信

串口原理图及复用引脚图

在这里插入图片描述
通过CubeMX配置相应的串口初始化代码

串口发送

串口发送步骤

1.向CR1的UE位写1使能串口。
2.向CR1的M位定义字长。
3.CR2的停止位数量进行编程。
4.对DMA进行配置。
5.配置BRR寄存器的波特率。
6.发送器对TE位置1,发送一个空闲帧作为第一次数据发送。
7.把要发送的数据写进USART_DR寄存器,硬件自动发送。TXE(DR数据是否为空标志〉清零。
8.在写入最后一个数据字后,等待Tc=1,表示最后一个数据帧的传输结束。
9.如果USART_CR1寄存器中的TCIE位被置位,则会产生中断。

usart.c文件

#include "usart.h"

UART_HandleTypeDef huart1;	//UART句柄

void USART1_UART_Init(void)	//将CubeMX中的串口初始化内容复制至该函数中
{

  huart1.Instance = USART1;	//USART1
  huart1.Init.BaudRate = 9600;	//波特率
  huart1.Init.WordLength = UART_WORDLENGTH_8B;	//字长为8位数据格式
  huart1.Init.StopBits = UART_STOPBITS_1;	//一个停止位
  huart1.Init.Parity = UART_PARITY_NONE;	//无奇偶校验位
  huart1.Init.Mode = UART_MODE_TX_RX;	//收发模式
  huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;	//无硬件流控
  huart1.Init.OverSampling = UART_OVERSAMPLING_16;	//16位过采样
  huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;	
  huart1.Init.ClockPrescaler = UART_PRESCALER_DIV1;	//1分频
  huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
  if (HAL_UART_Init(&huart1) != HAL_OK)		//HAL_UART_Init()会使能UART1
  {
    Error_Handler();
  }
  if (HAL_UARTEx_SetTxFifoThreshold(&huart1, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK)
  {
    Error_Handler();
  }
  if (HAL_UARTEx_SetRxFifoThreshold(&huart1, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK)
  {
    Error_Handler();
  }
  if (HAL_UARTEx_DisableFifoMode(&huart1) != HAL_OK)
  {
    Error_Handler();
  }
}

void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)
{

  GPIO_InitTypeDef GPIO_InitStruct = {0};
  if(uartHandle->Instance==USART1)	//如果是串口1,进行串口1 MSP初始化
  {
    /* USART1 clock enable */
    __HAL_RCC_USART1_CLK_ENABLE();	//使能USART1时钟
    __HAL_RCC_GPIOA_CLK_ENABLE();	//使能GPIOA时钟
    /**USART1 GPIO Configuration
    PA9     ------> USART1_TX
    PA10     ------> USART1_RX
    */
    GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  }
}

usart.h

#include "main.h"

extern UART_HandleTypeDef huart1;	//变量可扩展到其他工程文件使用

void USART1_UART_Init(void);
void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle);

main.c

#include "main.h"
#include "stdio.h"
#include "string.h"
#include "usart.h"

_IO uint32_t uwTick_UART_State_Pointer;	//串口打点速度控制变量
int counter = 0;	//计数标志
char str[40];	

void SystemClock_Config(void);
void USART_Proc(void);

void USART_Proc(void)
{
	
		if(uwTick-uwTick_UART_State_Pointer<500) return;	//串口扫描时间500ms
		uwTick_UART_State_Pointer=uwTick;
	
		sprintf(str, "%04d:Hello,world.\r\n", counter);		//将counter的值打印到str数组中
		HAL_UART_Transmit(&huart1,(unsigned char *)str, strlen(str), 50);	//串口发送函数
		//HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
		//*pData:需要发送的数据   uint16_t Size:发送数据的大小 uint32_t Timeout:最大发送时间,发送数据超过该时间退出发送 
		if(++counter == 10000)
			counter = 0;
}

int main(void)
{
  HAL_Init();

  SystemClock_Config();
  USART1_UART_Init();
  while (1)
  {
		USART_Proc();
	}
}

串口接收

串口接收步骤

1.使能CR1寄存器中的UE位。
⒉.修改CR1中的M位定义字长。
3.对CR2中的停止位数量进行编程。
4.配置DMA(如果需要)。
5.配置BRR选择波特率。
6.将CR1中的RE位置1.检测如下序列。检测序列表示开始接收1110XOXoXO000因为发送前,先发送空闲帧,起始位又为低电平,所以,检测到从1→>0的跳变后,就表示开始接收了。
7.接收到字符,RXNE(接收寄存器不为空>置1,表示移位寄存器内容传送到了RDR寄存器。
8.如果RXNEIE置1,产生接收中断。
9.软件读取DR寄存器,RXNE自动清零,或者手动写入o清零。

串口中断相应配置`

在usart.c文件中加入如下串口中断初始化

#include "usart.h"
  /* USART1 interrupt Init */
    HAL_NVIC_SetPriority(USART1_IRQn, 1 , 0);	//设置串口1中断优先级的抢占优先级为1 响应优先级为0
    HAL_NVIC_EnableIRQ(USART1_IRQn);	//串口1中断使能

在stm32g4xx_it.c文件中加入如下函数


void USART1_IRQHandler(void)	//串口中断处理 中断服务函数入口进入回调函数
{
  HAL_UART_IRQHandler(&huart1);
}

main.c文件

#include "main.h"
#include "stdio.h"
#include "string.h"
#include "led.h"
#include "lcd.h"
#include "usart.h"
__IO uint32_t uwTick_UART_State_Pointer;
int counter = 0;
char str[40];

unsigned char rx;

void SystemClock_Config(void);
void LCD_Proc(void);
void USART_Proc(void);

int main(void)
{
  HAL_Init(); //在此函数中可查看滴答定时器并配置中断优先级
  SystemClock_Config();

	LED_Init();
	LCD_Init();
	
	LCD_Clear(White);
	LCD_SetBackColor(White);
	LCD_SetTextColor(Magenta);

	USART1_UART_Init();	//初始化串口并配置串口中断优先级
	
	HAL_UART_Receive_IT(&huart1, &rx, 1);	//使能串口1接收中断 进入中断回调函数

  while (1)
  {
		USART_Proc();	//串口发送函数处理
		LCD_Proc();		//lcd显示串口接收到的字符
  }
}


void LCD_Proc(void)
{
	if(uwTick-uwTick_LCD_State_Pointer<100) return;
	uwTick_LCD_State_Pointer=uwTick;	

	memset(Lcd_Disp_String,0,sizeof(Lcd_Disp_String));	//将定义的字符串清空
	sprintf((char*)Lcd_Disp_String, "   rx num: %03d         ",(unsigned int)rx); //将串口接收到的数据打印到字串Lcd_Disp_String中
	LCD_DisplayStringLine(Line0, Lcd_Disp_String);	//在lcd上显示接收到的字符
	
}

void USART_Proc(void)
{
	
		if(uwTick-uwTick_UART_State_Pointer<500) return;
		uwTick_UART_State_Pointer=uwTick;
	
		sprintf(str, "%04d:Hello,world.\r\n", counter);
		HAL_UART_Transmit(&huart1,(unsigned char *)str, strlen(str), 50);
		
		if(++counter == 10000)
			counter = 0;
	
}

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)	//串口中断回调函数
{
	LED_Display(0xff);	//当有数据接收产生时 进入该中断 所有led闪烁
	HAL_Delay(300);
	LED_Display(0x00);
	HAL_UART_Receive_IT(&huart1, &rx, 1);
}

串口编程步骤

IO引脚的配置
1.选择串口的RX和TX映射到的Io引脚。
⒉.设置IO引脚的工作模式、上下拉、速度。串口相关配置

串口相关配置
1.配置波特率
⒉.配置数据位,奇偶校验,停止位。
3.数据传输方向。
4.过采样(8倍,16倍。)
5.串口的时钟使能。

串口中断配置
1.打开串口全局中断。
⒉.中断分组设置。
3.中断优先级配置。

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-01-25 10:45:17  更:2022-01-25 10:46:22 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 10:36:55-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码