蓝桥杯STM32G431学习记录5

您所在的位置:网站首页 串口的发送与接收寄存器都是USART_DR 蓝桥杯STM32G431学习记录5

蓝桥杯STM32G431学习记录5

2024-07-17 19:22| 来源: 网络整理| 查看: 265

串口通信模块 串口原理图及复用引脚图通过CubeMX配置相应的串口初始化代码 串口发送串口发送步骤usart.c文件usart.hmain.c 串口接收串口接收步骤串口中断相应配置`main.c文件 串口编程步骤

串口原理图及复用引脚图

在这里插入图片描述

通过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 #ifndef __USART_H #define __USART_H #include "main.h" extern UART_HandleTypeDef huart1; //变量可扩展到其他工程文件使用 void USART1_UART_Init(void); void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle); #endif 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_Pointer0的跳变后,就表示开始接收了。 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


【本文地址】


今日新闻


推荐新闻


    CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3