STM32笔记16--串口通信寄存器库函数配置以及实例编写

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

生成海报
点赞 0

小石头石头小小

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

STM32学习笔记2

GPIO GPIO:General Purpose Input & Output 是通用输入输出端口的简称,简单来说就是软件可控制的引脚, STM32芯片的GPIO引脚与外部设备连接起来,从而实现与外部通讯、控制以

stm32f407用oled实时显示日期和时间

这里我用的rtc时钟是非常好用的,先借鉴一下正点原子的理论知识。 STM32F4 的 RTC,是一个独立的 BCD 定时器/计数器。RTC 提供一个日历时钟(包含年月日时分秒信息)、两个