串口原理图及复用引脚图
通过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;
void USART1_UART_Init(void)
{
huart1.Instance = USART1;
huart1.Init.BaudRate = 9600;
huart1.Init.WordLength = UART_WORDLENGTH_8B;
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;
huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
huart1.Init.ClockPrescaler = UART_PRESCALER_DIV1;
huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
if (HAL_UART_Init(&huart1) != HAL_OK)
{
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)
{
__HAL_RCC_USART1_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
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;
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;
}
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"
HAL_NVIC_SetPriority(USART1_IRQn, 1 , 0);
HAL_NVIC_EnableIRQ(USART1_IRQn);
在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);
while (1)
{
USART_Proc();
LCD_Proc();
}
}
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_DisplayStringLine(Line0, Lcd_Disp_String);
}
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);
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.中断优先级配置。
|