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); //死循环,反复执行程序
}

 最终,使用串口调试助手结果如下

 

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值