当前位置:   article > 正文

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

stm32f1串口寄存器配置

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、串口操作常用的库函数

  1. void USART_Init(); //串口初始化(波特率、数据字长、奇偶校验等)
  2. void USART_Cmd(); //使能串口
  3. void USART_ItConfig(); //使能相关中断
  4. void USART_SendDate(); //发送数据到串口,DR
  5. uint16_t USART_ReceiveData(); //接收数据,从DR读取的数据
  6. FlagStatus USART_GetFlagStatus(); //获取状态标志位
  7. void USART_ClearFlag(); //清楚状态标志位
  8. ITStatus USART_GetITStatus(); //获取中断状态标志位
  9. void USART_ClearITPendingBit(); //清楚中断状态标志位

 1.3、串口配置的一般步骤

 2.2、主程序代码

  1. #include "stm32f10x.h"
  2. void My_USART1_Init(void)
  3. {
  4. GPIO_InitTypeDef GPIO_InitStrue; //定义结构体变量
  5. USART_InitTypeDef USART_InitStrue; //定义串口的结构体变量
  6. NVIC_InitTypeDef NVIC_InitStrue; //定义中断结构体变量
  7. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //使能GPIOA时钟
  8. RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); //使能串口1时钟
  9. GPIO_InitStrue.GPIO_Mode=GPIO_Mode_AF_PP; //设置输出模式为复用推挽输出
  10. GPIO_InitStrue.GPIO_Pin=GPIO_Pin_9; //PA9
  11. GPIO_InitStrue.GPIO_Speed=GPIO_Speed_10MHz; //输出速度
  12. GPIO_Init(GPIOA,&GPIO_InitStrue); //GPIO初始化函数
  13. GPIO_InitStrue.GPIO_Mode=GPIO_Mode_IN_FLOATING; //设置输出模式为复用推挽输出
  14. GPIO_InitStrue.GPIO_Pin=GPIO_Pin_10; //PA10
  15. GPIO_InitStrue.GPIO_Speed=GPIO_Speed_10MHz; //输出速度
  16. GPIO_Init(GPIOA,&GPIO_InitStrue); //GPIO初始化函数
  17. USART_InitStrue.USART_BaudRate=115200; //波特率设为115200
  18. USART_InitStrue.USART_HardwareFlowControl=USART_HardwareFlowControl_None; //设置为不使用硬件流
  19. USART_InitStrue.USART_Mode=USART_Mode_Tx|USART_Mode_Rx; //使能发送和接收
  20. USART_InitStrue.USART_Parity=USART_Parity_No; //不使用奇偶校验
  21. USART_InitStrue.USART_StopBits=USART_StopBits_1; //停止位设置为1
  22. USART_InitStrue.USART_WordLength=USART_WordLength_8b; //字长设置为8比特
  23. USART_Init(USART1,&USART_InitStrue); //串口初始化函数
  24. USART_Cmd(USART1,ENABLE); //串口使能
  25. USART_ITConfig(USART1,USART_IT_RXNE,ENABLE); //打开接收中断,打开串口1的接收中断
  26. NVIC_InitStrue.NVIC_IRQChannel=USART1_IRQn;
  27. NVIC_InitStrue.NVIC_IRQChannelCmd=ENABLE;
  28. NVIC_InitStrue.NVIC_IRQChannelPreemptionPriority=1; //随便设,因为只有一个优先级分组
  29. NVIC_InitStrue.NVIC_IRQChannelSubPriority=1; //随便设,因为没有子优先级
  30. NVIC_Init(&NVIC_InitStrue);
  31. }
  32. void USART1_IRQHandler(void) //中断服务函数,每接收一次数据就产生一次中断
  33. {
  34. u8 res;
  35. if(USART_GetITStatus(USART1,USART_IT_RXNE)) //判断是否是因为接受数据产生的中断
  36. {
  37. res=USART_ReceiveData(USART1); //调用接收数据函数,读取串口1接收的数据并赋值给变量res
  38. USART_SendData(USART1,res); //调用发送数据函数,发送接收到的数据
  39. }
  40. }
  41. int main(void)
  42. {
  43. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //系统的中断优先级分组设置为2,即2位响应优先级,2位抢占优先级
  44. My_USART1_Init();
  45. while(1); //死循环,反复执行程序
  46. }

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

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/600347
推荐阅读
相关标签
  

闽ICP备14008679号