1、STM32串口常用的库函数和寄存器;
2、串口配置的步骤;
1.1、常用的STM32串口寄存器
USART_SR 状态寄存器
USART_DR 数据寄存器
USART_BRR 波特率寄存器
(1)其中,在传输数据时USART_DR数据寄存器的作用尤为重要,在向外传输数据时,控制器是 先将数据写入数据寄存器中储存,而控制器读取数据时,也是从数据寄存器读取数据。
(2)而状态寄存器则是用于读取某些数据的状态位;
(3)波特率(比特率)寄存器的作用如图所示:
如图所示,USART_BRR寄存器产生一个时钟频率,再除以16,就是波特率寄存器产生的波特率。具体的算术关系如下所示:
PS:这里可以参考USART_BRR寄存器位数含义,如图所示:
2.1、串口操作常用的库函数
void USART_Init(); //串口初始化(波特率、数据字长、奇偶校验等)
void USART_Cmd(); //使能串口
void USART_ItConfig(); //使能相关中断
void USART_SendDate(); //发送数据到串口,DR
uint16_t USART_ReceiveData(); //接收数据,从DR读取的数据
FlagStatus USART_GetFlagStatus(); //获取状态标志位
void USART_ClearFlag(); //清楚状态标志位
ITStatus USART_GetITStatus(); //获取中断状态标志位
void USART_ClearITPendingBit(); //清楚中断状态标志位
1.3、串口配置的一般步骤
2.2、主程序代码
#include "stm32f10x.h"
void My_USART1_Init(void)
{
GPIO_InitTypeDef GPIO_InitStrue; //定义结构体变量
USART_InitTypeDef USART_InitStrue; //定义串口的结构体变量
NVIC_InitTypeDef NVIC_InitStrue; //定义中断结构体变量
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //使能GPIOA时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); //使能串口1时钟
GPIO_InitStrue.GPIO_Mode=GPIO_Mode_AF_PP; //设置输出模式为复用推挽输出
GPIO_InitStrue.GPIO_Pin=GPIO_Pin_9; //PA9
GPIO_InitStrue.GPIO_Speed=GPIO_Speed_10MHz; //输出速度
GPIO_Init(GPIOA,&GPIO_InitStrue); //GPIO初始化函数
GPIO_InitStrue.GPIO_Mode=GPIO_Mode_IN_FLOATING; //设置输出模式为复用推挽输出
GPIO_InitStrue.GPIO_Pin=GPIO_Pin_10; //PA10
GPIO_InitStrue.GPIO_Speed=GPIO_Speed_10MHz; //输出速度
GPIO_Init(GPIOA,&GPIO_InitStrue); //GPIO初始化函数
USART_InitStrue.USART_BaudRate=115200; //波特率设为115200
USART_InitStrue.USART_HardwareFlowControl=USART_HardwareFlowControl_None; //设置为不使用硬件流
USART_InitStrue.USART_Mode=USART_Mode_Tx|USART_Mode_Rx; //使能发送和接收
USART_InitStrue.USART_Parity=USART_Parity_No; //不使用奇偶校验
USART_InitStrue.USART_StopBits=USART_StopBits_1; //停止位设置为1
USART_InitStrue.USART_WordLength=USART_WordLength_8b; //字长设置为8比特
USART_Init(USART1,&USART_InitStrue); //串口初始化函数
USART_Cmd(USART1,ENABLE); //串口使能
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE); //打开接收中断,打开串口1的接收中断
NVIC_InitStrue.NVIC_IRQChannel=USART1_IRQn;
NVIC_InitStrue.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStrue.NVIC_IRQChannelPreemptionPriority=1; //随便设,因为只有一个优先级分组
NVIC_InitStrue.NVIC_IRQChannelSubPriority=1; //随便设,因为没有子优先级
NVIC_Init(&NVIC_InitStrue);
}
void USART1_IRQHandler(void) //中断服务函数,每接收一次数据就产生一次中断
{
u8 res;
if(USART_GetITStatus(USART1,USART_IT_RXNE)) //判断是否是因为接受数据产生的中断
{
res=USART_ReceiveData(USART1); //调用接收数据函数,读取串口1接收的数据并赋值给变量res
USART_SendData(USART1,res); //调用发送数据函数,发送接收到的数据
}
}
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //系统的中断优先级分组设置为2,即2位响应优先级,2位抢占优先级
My_USART1_Init();
while(1); //死循环,反复执行程序
}
最终,使用串口调试助手结果如下
版权声明:本文为CSDN博主「小石头石头小小」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_45271734/article/details/122848503
暂无评论