今天讲讲STM32的串口学习。
串口最基本的设置就是波特率的设置。所以在调用STM32的串口功能前要进行设置:
1.开启串口时钟;
2.设置相应的IO口模式;
3.配置波特率、数据位长度、就校验位
每个串口都有一个自己独立的波特率寄存器USART_BRR。
Tx/Rx波特率=fPCLKx/(16*USARTDIV)
同时需要注意的是:USART和GPIO是两种不同的设备,USART是“借用”了GPIO设备作为自己的输出通道,所以在使用串口功能时,不仅要打开USART时钟,而且还要打开相应GPIO的时钟,同时要将对应GPIO引脚设置为第二功能模式。
贴出串口初始化部分代码,大家共享:
void uart_init(U32 bound)
{
//GPIO端口设置
GPIO_InitTypeDef GPIO_InitStructure; //定义GPIO端口初始化结构体
USART_InitTypeDef USART_InitStructure; //定义USART初始化结构体
NVIC_InitTypeDef NVIC_InitStructure; // 定义优先级初始化结构体
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE); //使能USART1、GPIOA时钟,将GPIOA设置为第2功能
//USART1_TX PA.9
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//USART1_RX PA.10
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//Usart1 NVIC 配置
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ; //中断优先级:0 1 2 3
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; // 中断响应优先级:0 1 2 3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器USART1
//USART 初始化设置
USART_InitStructure.USART_BaudRate = bound;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART1, &USART_InitStructure);
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启中断
USART_Cmd(USART1, ENABLE); //使能串口
}
文章评论(0条评论)
登录后参与讨论