USARTSetup.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313
  1. /*--------------------------------------------------------------------------------------
  2. * @file USARTSetup.c
  3. * @author ZhangJing
  4. * @version base on stm32f0x
  5. * @date 2015.09.11
  6. * @brief 串口驱动
  7. ---------------------------------------------------------------------------------------*/
  8. #include "stm32f10x_gpio.h"
  9. #include "TypeDefine.h"
  10. #include "USARTSetup.h"
  11. #include "stm32f10x_dma.h"
  12. uint8_t usart1XmitBuffer[USART1_XMIT_LEN]; //USART1发送缓冲
  13. uint8_t usart1RecvBuffer[USART1_RECV_LEN]; //USART1接收缓冲
  14. uint8_t usart1RecvCnt = 0; //USART1接收计数
  15. uint8_t usart2XmitBuffer[USART2_XMIT_LEN]; //USART2发送缓冲
  16. uint8_t usart2RecvBuffer[USART2_RECV_LEN]; //USART2接收缓冲
  17. uint8_t usart2RecvCnt = 0; //USART2接收计数
  18. uint8_t usart3XmitBuffer[USART3_XMIT_LEN]; //USART3发送缓冲
  19. uint8_t usart3RecvBuffer[USART3_RECV_LEN]; //USART3接收缓冲
  20. uint8_t usart3RecvCnt = 0; //USART3接收计数
  21. /*******************************************************************************
  22. * Function: USART2_DMAinit()
  23. * Object: 串口1初始化函数
  24. * 输入: 无
  25. * 输出: 无
  26. * 备注: 与PC通信
  27. ********************************************************************************/
  28. void USART2_DMAinit(void)
  29. {
  30. /*DMA_InitTypeDef DMA_InitStructure;
  31. RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
  32. // DMA channel6configuration
  33. DMA_DeInit(DMA1_Channel6);
  34. DMA_InitStructure.DMA_PeripheralBaseAddr =(u32)(&USART2->DR); //外设地址
  35. DMA_InitStructure.DMA_MemoryBaseAddr =(u32)usart2RecvBuffer;
  36. DMA_InitStructure.DMA_DIR =DMA_DIR_PeripheralSRC; //外设作为目的地址 //DMA_DIR_PeripheralSRC; //外设作为DMA的源端
  37. DMA_InitStructure.DMA_BufferSize =50; //BufferSize; //传输大小
  38. DMA_InitStructure.DMA_PeripheralInc =DMA_PeripheralInc_Disable; //外设递增模式禁止 DMA_PeripheralInc_Enable; //外设地址增加
  39. DMA_InitStructure.DMA_MemoryInc =DMA_MemoryInc_Enable; //内存地址自增
  40. DMA_InitStructure.DMA_PeripheralDataSize =DMA_PeripheralDataSize_Byte; //传输方式:字节 DMA_PeripheralDataSize_Word; //字(32位)
  41. DMA_InitStructure.DMA_MemoryDataSize =DMA_PeripheralDataSize_Byte; //内存存储方式:字节 DMA_MemoryDataSize_Word;
  42. DMA_InitStructure.DMA_Mode =DMA_Mode_Normal; //DMA_Mode_Normal 正常模式,只传送一次; DMA_Mode_Circular:循环模式,不停的传送;
  43. DMA_InitStructure.DMA_Priority =DMA_Priority_High;
  44. DMA_InitStructure.DMA_M2M =DMA_M2M_Disable; //DMA_M2M_Enable;
  45. DMA_Init(DMA1_Channel6,&DMA_InitStructure);
  46. // Enable DMA Channel4Transfer Complete interrupt
  47. // DMA_ITConfig(DMA1_Channel6,DMA_IT_TC, ENABLE);
  48. //采用DMA方式发送
  49. // USART_DMACmd(USART2,USART_DMAReq_Rx,ENABLE);
  50. // DMA_ITConfig(DMA1_Channel6,DMA_IT_TC, ENABLE);
  51. // DMA_Cmd(DMA1_Channel6,ENABLE); //启动通道6*/
  52. }
  53. /********************************************************************************
  54. * Function: USART1Init
  55. * Object: 串口1初始化函数
  56. * 输入: 无
  57. * 输出: 无
  58. * 备注: 与PC通信
  59. *********************************************************************************/
  60. void USART1_Init(uint32_t BaudRate)
  61. {
  62. GPIO_InitTypeDef GPIO_InitStructure;
  63. USART_InitTypeDef USART_InitStructure;
  64. NVIC_InitTypeDef NVIC_InitStructure;
  65. //USART1配置
  66. RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
  67. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  68. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
  69. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  70. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  71. GPIO_Init(GPIOA, &GPIO_InitStructure);
  72. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
  73. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  74. GPIO_Init(GPIOA, &GPIO_InitStructure);
  75. RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART1,ENABLE);//复位串口1
  76. RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART1,DISABLE);//停止复位
  77. USART_InitStructure.USART_BaudRate = BaudRate;//一般设置为9600;
  78. USART_InitStructure.USART_WordLength = USART_WordLength_8b;//8位数据长度
  79. USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
  80. USART_InitStructure.USART_Parity = USART_Parity_No;///奇偶校验位
  81. USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
  82. USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//收发模式
  83. USART_Init(USART1, &USART_InitStructure); //初始化串口1
  84. NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; //使能串口1中断
  85. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; //先占优先级2级
  86. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级2级
  87. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道
  88. NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
  89. USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启中断
  90. USART_Cmd(USART1, ENABLE); //使能串口
  91. }
  92. /********************************************************************************
  93. * Function: USART2Init
  94. * Object: 串口2初始化函数
  95. * 输入: 无
  96. * 输出: 无
  97. * 备注: 与Zigbee通信
  98. *********************************************************************************/
  99. void USART2_Init(uint32_t BaudRate)
  100. {
  101. /*GPIO_InitTypeDef GPIO_InitStructure;
  102. USART_InitTypeDef USART_InitStructure;
  103. NVIC_InitTypeDef NVIC_InitStructure;
  104. //USART2配置
  105. RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
  106. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  107. USART2_DMAinit();//调用USART2 DMA配置函数
  108. //USART2管脚配置
  109. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
  110. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  111. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  112. GPIO_Init(GPIOA, &GPIO_InitStructure); // TXIO
  113. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
  114. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  115. GPIO_Init(GPIOA, &GPIO_InitStructure); // RXIO
  116. RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2,ENABLE);//复位串口2
  117. RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2,DISABLE);//停止复位
  118. USART_InitStructure.USART_BaudRate = BaudRate;//设置串口波特率
  119. USART_InitStructure.USART_WordLength = USART_WordLength_8b;//设置数据位
  120. USART_InitStructure.USART_StopBits = USART_StopBits_1;//设置停止位
  121. USART_InitStructure.USART_Parity = USART_Parity_No;//设置效验位
  122. USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//设置流控制
  123. USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//设置工作模式
  124. USART_Init(USART2, &USART_InitStructure); //配置入结构体
  125. //中断设置
  126. NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn; //使能串口2中断
  127. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级2级
  128. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //从优先级2级
  129. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道
  130. NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
  131. //USART_ITConfig(USART2, (USART_IT_RXNE | USART_IT_IDLE), ENABLE);//开启中断
  132. //中断配置
  133. USART_ITConfig(USART2,USART_IT_TC,DISABLE);
  134. USART_ITConfig(USART2,USART_IT_RXNE,DISABLE);
  135. USART_ITConfig(USART2,USART_IT_IDLE,ENABLE);
  136. //采用DMA方式发送
  137. USART_DMACmd(USART2,USART_DMAReq_Rx,ENABLE);
  138. //DMA_Cmd(DMA1_Channel6,ENABLE); //启动通道6
  139. DMA_Cmd(DMA1_Channel6,DISABLE); //失能DMA功能
  140. USART_Cmd(USART2, ENABLE); //使能串口 */
  141. GPIO_InitTypeDef GPIO_InitStructure;
  142. USART_InitTypeDef USART_InitStructure;
  143. NVIC_InitTypeDef NVIC_InitStructure;
  144. //USART2配置
  145. /* Enable USART clock */
  146. RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
  147. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  148. //USART2管脚配置
  149. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
  150. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  151. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  152. GPIO_Init(GPIOA, &GPIO_InitStructure); /* TXIO */
  153. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
  154. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  155. GPIO_Init(GPIOA, &GPIO_InitStructure); /* RXIO */
  156. RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2,ENABLE);//复位串口2
  157. RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2,DISABLE);//停止复位
  158. USART_InitStructure.USART_BaudRate = BaudRate;//设置串口波特率
  159. USART_InitStructure.USART_WordLength = USART_WordLength_8b;//设置数据位
  160. USART_InitStructure.USART_StopBits = USART_StopBits_1;//设置停止位
  161. USART_InitStructure.USART_Parity = USART_Parity_No;//设置效验位
  162. USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//设置流控制
  163. USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//设置工作模式
  164. USART_Init(USART2, &USART_InitStructure); //配置入结构体
  165. //中断设置
  166. NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn; //使能串口2中断
  167. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级2级
  168. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //从优先级2级
  169. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道
  170. NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
  171. USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//开启中断
  172. USART_Cmd(USART2, ENABLE); //使能串口
  173. }
  174. /********************************************************************************
  175. * Function: USART3Init
  176. * Object: 串口3初始化函数
  177. * 输入: 无
  178. * 输出: 无
  179. * 备注: 与从机通信
  180. *********************************************************************************/
  181. void USART3_Init(uint32_t BaudRate)
  182. {
  183. GPIO_InitTypeDef GPIO_InitStructure;
  184. USART_InitTypeDef USART_InitStructure;
  185. NVIC_InitTypeDef NVIC_InitStructure;
  186. //USART3配置
  187. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
  188. RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
  189. //USART3管脚配置
  190. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
  191. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  192. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  193. GPIO_Init(GPIOB, &GPIO_InitStructure); /* TXIO */
  194. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
  195. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  196. GPIO_Init(GPIOB, &GPIO_InitStructure); /* RXIO */
  197. RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART3,ENABLE);//复位串口3
  198. RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART3,DISABLE);//停止复位
  199. USART_InitStructure.USART_BaudRate = BaudRate;//设置串口波特率
  200. USART_InitStructure.USART_WordLength = USART_WordLength_8b;//设置数据位
  201. USART_InitStructure.USART_StopBits = USART_StopBits_1;//设置停止位
  202. USART_InitStructure.USART_Parity = USART_Parity_No;//设置效验位
  203. USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//设置流控制
  204. USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//设置工作模式
  205. USART_Init(USART3, &USART_InitStructure); //配置入结构体
  206. //
  207. // //中断设置
  208. NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn; //使能串口3中断
  209. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; //先占优先级2级
  210. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级2级
  211. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道
  212. NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
  213. USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);//开启中断
  214. USART_Cmd(USART3, ENABLE);
  215. }
  216. /********************************************************************************
  217. * Function: USART1Send
  218. * Object: USART1发送函数
  219. * 输入: uint8_t *xmitDataBuf 待发送数据缓存区
  220. * uint32_t xmitLen 发送数据长度
  221. * 输出: 无
  222. * 备注: 1、根据xmitLen设定长度发送 xmitDataBuf中的数据
  223. *********************************************************************************/
  224. void USART1Send( uint8_t *xmitDataBuf, uint32_t xmitLen )
  225. {
  226. uint8_t i;
  227. for( i = 0; i < xmitLen ; i++ )
  228. {
  229. while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET); //发送完成
  230. USART_SendData(USART1,*(xmitDataBuf++));
  231. }
  232. while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
  233. }
  234. /********************************************************************************
  235. * Function: USART2Send
  236. * Object: USART2发送函数
  237. * 输入: uint8_t *xmitDataBuf 待发送数据缓存区
  238. * uint32_t xmitLen 发送数据长度
  239. * 输出: 无
  240. * 备注: 1、根据xmitLen设定长度发送 xmitDataBuf中的数据
  241. *********************************************************************************/
  242. void USART2Send( uint8_t *xmitDataBuf, uint32_t xmitLen )
  243. {
  244. uint8_t i;
  245. for( i = 0; i < xmitLen ; i++ )
  246. {
  247. while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET); //发送完成
  248. USART_SendData(USART2,*(xmitDataBuf++));
  249. }
  250. while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);
  251. }
  252. /********************************************************************************
  253. * Function: USART3Send
  254. * Object: USART3发送函数
  255. * 输入: uint8_t *xmitDataBuf 待发送数据缓存区
  256. * uint32_t xmitLen 发送数据长度
  257. * 输出: 无
  258. * 备注: 1、根据xmitLen设定长度发送 xmitDataBuf中的数据
  259. *********************************************************************************/
  260. void USART3Send( uint8_t *xmitDataBuf, uint32_t xmitLen )
  261. {
  262. uint8_t i;
  263. for( i = 0; i < xmitLen ; i++ )
  264. {
  265. while(USART_GetFlagStatus(USART3, USART_FLAG_TC) == RESET); //发送完成
  266. USART_SendData(USART3,*(xmitDataBuf++));
  267. }
  268. while(USART_GetFlagStatus(USART3, USART_FLAG_TC) == RESET);
  269. }