请选择 进入手机版 | 继续访问电脑版
查看: 421|回复: 0

[运维管理] stm32 串口使用

686

主题

686

帖子

2071

积分

猿er

Rank: 1

积分
2071
发表于 2016-8-14 17:50:13
stm32 串口使用配置数库,描述blog链接:
http://my.oschina.net/u/2255341/blog/501995
  1. #include "usart.h"
  2. void Init_Usart1(void)
  3. {
  4. GPIO_InitTypeDef GPIO_InitStructure; //定义一个GPIO结构体变量
  5. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1,ENABLE);
  6. //使能各个端口时钟,重要!!!
  7. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //配置串口接收端口挂接到9端口
  8. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用功能输出开漏
  9. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //配置端口速度为50M
  10. GPIO_Init(GPIOA, &GPIO_InitStructure); //根据参数初始化GPIOA寄存器
  11. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
  12. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入(复位状态);
  13. GPIO_Init(GPIOA, &GPIO_InitStructure); //根据参数初始化GPIOA寄存器
  14. }
  15. void Init_Usart2(void)
  16. {
  17. GPIO_InitTypeDef GPIO_InitStructure; //定义一个GPIO结构体变量
  18. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  19. //使能各个端口时钟,重要!!!
  20. RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
  21. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //配置串口接收端口挂接到9端口
  22. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用功能输出开漏
  23. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //配置端口速度为50M
  24. GPIO_Init(GPIOA, &GPIO_InitStructure); //根据参数初始化GPIOA寄存器
  25. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
  26. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入(复位状态);
  27. GPIO_Init(GPIOA, &GPIO_InitStructure); //根据参数初始化GPIOA寄存器
  28. }
  29. void Usart1_Configuration(uint32_t BaudRate)
  30. {
  31. USART_InitTypeDef USART_InitStructure; //定义一个串口结构体
  32. USART_InitStructure.USART_BaudRate =BaudRate ; //波特率115200
  33. USART_InitStructure.USART_WordLength = USART_WordLength_8b; //传输过程中使用8位数据
  34. USART_InitStructure.USART_StopBits = USART_StopBits_1; //在帧结尾传输1位停止位
  35. USART_InitStructure.USART_Parity = USART_Parity_No ; //奇偶失能
  36. USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//硬件流失能
  37. USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //接收和发送模式
  38. USART_Init(USART1, &USART_InitStructure); //根据参数初始化串口寄存器
  39. USART_ITConfig(USART1,USART_IT_RXNE,ENABLE); //使能串口中断接收
  40. USART_Cmd(USART1, ENABLE); //使能串口外设
  41. }
  42. void Usart2_Configuration(uint32_t BaudRate)
  43. {
  44. USART_InitTypeDef USART_InitStructure; //定义一个串口结构体
  45. USART_InitStructure.USART_BaudRate =BaudRate ; //波特率115200
  46. USART_InitStructure.USART_WordLength = USART_WordLength_8b; //传输过程中使用8位数据
  47. USART_InitStructure.USART_StopBits = USART_StopBits_1; //在帧结尾传输1位停止位
  48. USART_InitStructure.USART_Parity = USART_Parity_No ; //奇偶失能
  49. USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//硬件流失能
  50. USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //接收和发送模式
  51. USART_Init(USART2, &USART_InitStructure); //根据参数初始化串口寄存器
  52. USART_ITConfig(USART2,USART_IT_RXNE,ENABLE); //使能串口中断接收
  53. USART_Cmd(USART2, ENABLE); //使能串口外设
  54. }
  55. void Usart1_Init_NVIC(void)
  56. {
  57. NVIC_InitTypeDef NVIC_InitStructure; //定义一个NVIC向量表结构体变量
  58. #ifdef VECT_TAB_RAM //向量表基地址选择
  59. NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); //将0x20000000地址作为向量表基地址(RAM)
  60. #else
  61. NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0); //将0x08000000地址作为向量表基地址(FLASH)
  62. #endif
  63. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置中断组 为2
  64. NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; //配置串口1为中断源
  65. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //设置占先优先级为2
  66. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //设置副优先级为0
  67. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能串口1中断
  68. NVIC_Init(&NVIC_InitStructure); //根据参数初始化中断寄存器
  69. }
  70. void Usart2_Init_NVIC(void)
  71. {
  72. NVIC_InitTypeDef NVIC_InitStructure; //定义一个NVIC向量表结构体变量
  73. /*
  74. #ifdef VECT_TAB_RAM //向量表基地址选择
  75. NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); //将0x20000000地址作为向量表基地址(RAM)
  76. #else
  77. NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0); //将0x08000000地址作为向量表基地址(FLASH)
  78. #endif*/
  79. // NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置中断组 为2
  80. NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn; //配置串口1为中断源
  81. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //设置占先优先级为2
  82. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //设置副优先级为0
  83. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能串口1中断
  84. NVIC_Init(&NVIC_InitStructure); //根据参数初始化中断寄存器
  85. }
  86. /*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  87. ** 函数名称: USART1_Send_Byte
  88. ** 功能描述: 串口发送一个字符串
  89. ** 参数描述:Data 要发送的数据
  90. ** 作  者: Dream
  91. ** 日  期: 2011年6月20日
  92. :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
  93. void Usart1_Send_Byte(uint16_t Data)
  94. {
  95. while(!USART_GetFlagStatus(USART1,USART_FLAG_TXE)); //USART_GetFlagStatus:得到发送状态位
  96. //USART_FLAG_TXE:发送寄存器为空 1:为空;0:忙状态
  97. USART_SendData(USART1,Data); //发送一个字符
  98. }
  99. void Usart2_Send_Byte(uint16_t Data)
  100. {
  101. while(!USART_GetFlagStatus(USART2,USART_FLAG_TXE)); //USART_GetFlagStatus:得到发送状态位
  102. //USART_FLAG_TXE:发送寄存器为空 1:为空;0:忙状态
  103. USART_SendData(USART2,Data); //发送一个字符
  104. }
  105. uint8_t Usart1_Receive_Byte(void)
  106. {
  107. while(!(USART_GetFlagStatus(USART1,USART_FLAG_RXNE))); //USART_GetFlagStatus:得到接收状态位
  108. //USART_FLAG_RXNE:接收数据寄存器非空标志位
  109. //1:忙状态 0:空闲(没收到数据,等待。。。)
  110. return USART_ReceiveData(USART1); //接收一个字符
  111. }
  112. uint8_t Usart2_Receive_Byte(void)
  113. {
  114. while(!(USART_GetFlagStatus(USART2,USART_FLAG_RXNE))); //USART_GetFlagStatus:得到接收状态位
  115. //USART_FLAG_RXNE:接收数据寄存器非空标志位
  116. //1:忙状态 0:空闲(没收到数据,等待。。。)
  117. return USART_ReceiveData(USART2); //接收一个字符
  118. }
  119. int fputc(int Data, FILE *f)
  120. {
  121. while(!USART_GetFlagStatus(USART1,USART_FLAG_TXE)); //USART_GetFlagStatus:得到发送状态位
  122. //USART_FLAG_TXE:发送寄存器为空 1:为空;0:忙状态
  123. USART_SendData(USART1,Data); //发送一个字符
  124. return Data; //返回一个值
  125. }
  126. //void USART1_IRQHandler()
  127. //{
  128. // uint8_t ReceiveDate; //?????????????
  129. // recvFlag = 1;
  130. // if((USART_GetITStatus(USART1,USART_IT_RXNE))) //USART_IT_RXNE
  131. // //USART_FLAG_RXNE:????????????
  132. // //1:??? 0:??(?????,?????)
  133. // {
  134. // USART_ClearITPendingBit(USART1,USART_IT_RXNE); //???????
  135. // ReceiveDate=USART_ReceiveData(USART1); //????????
  136. // // printf("%c",ReceiveDate); //??????????,????????????????????????
  137. // //????"1"?????49 ? ??"A" ?????65
  138. // putmsg(ReceiveDate);
  139. // }
  140. //}
复制代码
  1. #ifndef _UART_H_
  2. #define _UART_H_
  3. #include "stm32f10x.h"
  4. #include <stdio.h>
  5. void Init_Usart1(void);
  6. void Init_Usart2(void);
  7. void Usart1_Init_NVIC(void);
  8. void Usart2_Init_NVIC(void);
  9. void Usart1_Configuration(uint32_t BaudRate);
  10. void Usart2_Configuration(uint32_t BaudRate);
  11. void Usart1_Send_Byte(uint16_t Data);
  12. void Usart2_Send_Byte(uint16_t Data);
  13. uint8_t Usart1_Receive_Byte(void);
  14. uint8_t Usart2_Receive_Byte(void);
  15. void Usart1_Init_NVIC(void);
  16. void Usart2_Init_NVIC(void);
  17. int fputc(int Data, FILE *f);
  18. #endif
复制代码


回复

使用道具 举报