赞
踩
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); //死循环,反复执行程序
- }
最终,使用串口调试助手结果如下
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。