Serial.c 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822
  1. /*******************************************************************************************
  2. * File Name: Serial.c
  3. * Function Describe:device for serial
  4. * Relate Module:
  5. * Explain:
  6. 接收采用中断方式
  7. UART1: 连接尾插,用于与PC相连 另外,printf映射到UART1
  8. UART3: 连接Modem
  9. * Writer: ShiLiangWen
  10. * Date: 2015.1.20
  11. ********************************************************************************************/
  12. #include "Serial.h"
  13. #include "stm32f10x_dma.h"
  14. #include "includes.h"
  15. #define USART1_DR_Base 0x40013804
  16. #define USART2_DR_Base 0x40004404
  17. #define USART3_DR_Base (u32)&USART3->DR
  18. unsigned char g_ucUARTSel=0;//0--MCU 1--Modem 2--GPS
  19. //UART1 Trace
  20. unsigned char RxBuffer1[UART1_RX_BUFFER_SIZE];
  21. unsigned char TxBuffer1[UART1_TX_BUFFER_SIZE];
  22. //unsigned char g_ucUart1Received=0;//接受到一包数据标志位
  23. //unsigned char g_ucUart1Sending=0;//仍有数据待发送标志
  24. static unsigned short rx1_ct=0,rx1_ct_max=0,rx1_len=0;
  25. //static unsigned short tx1_ct=0,tx1_len=0;
  26. //UART2 用于与GPS通讯
  27. //unsigned char RxBuffer2[UART2_RX_BUFFER_SIZE];
  28. //unsigned char TxBuffer2[UART2_TX_BUFFER_SIZE];
  29. //unsigned char g_ucUart2Received=0;//接受到一包数据标志位
  30. //unsigned char g_ucUart2Sending=0;//仍有数据待发送标志
  31. //static unsigned short rx2_ct=0,rx2_ct_max=0,rx2_len=0;
  32. //static unsigned short tx2_ct=0,tx2_len=0;
  33. //UART3 用于与MODEM通讯
  34. unsigned char RxBuffer3[UART3_RX_BUFFER_SIZE];
  35. unsigned char TxBuffer3[UART3_TX_BUFFER_SIZE];
  36. //unsigned char g_ucUart3Received=0;//接受到一包数据标志位
  37. //unsigned char g_ucUart3Sending=0;//仍有数据待发送标志
  38. static unsigned short rx3_ct=0,rx3_ct_max=0,rx3_len=0;
  39. //static unsigned short tx3_ct=0,tx3_len=0;
  40. static unsigned short datalen;
  41. /********************************************************************
  42. *Uart1DMAInit
  43. *串口1 DMA设置
  44. *串口1 发送必须用通道4,接收必须用通道5
  45. *********************************************************************/
  46. void Uart1DMAInit(void)
  47. {
  48. NVIC_InitTypeDef NVIC_InitStructure;
  49. DMA_InitTypeDef DMA_InitStructure;
  50. //启动DMA时钟
  51. RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
  52. //DMA 通道4用于UART1 TX
  53. DMA_DeInit(DMA1_Channel4);
  54. DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)(&USART1->DR);//外设地址
  55. DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)TxBuffer1;//内存地址
  56. DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;//DMA传输方向单向
  57. DMA_InitStructure.DMA_BufferSize = UART1_TX_BUFFER_SIZE; //设置DMA在传输时缓冲区的长度
  58. DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //设置DMA的外设递增模式
  59. DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //设置DMA的内存递增模式
  60. DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;//外设数据字长
  61. DMA_InitStructure.DMA_MemoryDataSize = DMA_PeripheralDataSize_Byte;//内存数据字长
  62. DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; //设置DMA的传输模式
  63. DMA_InitStructure.DMA_Priority = DMA_Priority_Low; //设置DMA的优先级别
  64. DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;//设置DMA的2个memory中的变量互相访问
  65. DMA_Init(DMA1_Channel4,&DMA_InitStructure);
  66. //DMA中断设置
  67. NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel4_IRQn;
  68. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
  69. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
  70. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  71. NVIC_Init(&NVIC_InitStructure);
  72. DMA_ITConfig(DMA1_Channel4,DMA_IT_TC,ENABLE);//中断设置
  73. DMA_Cmd(DMA1_Channel4, DISABLE); //等到需要发送的时候再使能
  74. //DMA 通道5用于UART1 RX
  75. DMA_DeInit(DMA1_Channel5);
  76. DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)(&USART1->DR);//外设地址
  77. DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)RxBuffer1;//内存地址
  78. DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;//DMA传输方向单向
  79. DMA_InitStructure.DMA_BufferSize = UART1_RX_BUFFER_SIZE; //设置DMA在传输时缓冲区的长度
  80. DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //设置DMA的外设递增模式
  81. DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //设置DMA的内存递增模式
  82. DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;//外设数据字长
  83. DMA_InitStructure.DMA_MemoryDataSize = DMA_PeripheralDataSize_Byte;//内存数据字长
  84. DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; //设置DMA的传输模式
  85. DMA_InitStructure.DMA_Priority = DMA_Priority_High; //设置DMA的优先级别
  86. DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;//设置DMA的2个memory中的变量互相访问
  87. DMA_Init(DMA1_Channel5,&DMA_InitStructure);
  88. DMA_Cmd(DMA1_Channel5, ENABLE); //使能通道
  89. }
  90. /********************************************************************
  91. *Uart2DMAInit
  92. *串口2 DMA设置
  93. *串口2接收必须使用DMA通道6
  94. *********************************************************************/
  95. void Uart2DMAInit(void)
  96. {
  97. // NVIC_InitTypeDef NVIC_InitStructure;
  98. DMA_InitTypeDef DMA_InitStructure;
  99. //启动DMA时钟
  100. RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
  101. DMA_DeInit(DMA1_Channel6);
  102. DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)(&USART2->DR);//外设地址
  103. DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)RxBuffer2;//内存地址
  104. DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;//DMA传输方向单向
  105. DMA_InitStructure.DMA_BufferSize = UART2_RX_BUFFER_SIZE; //设置DMA在传输时缓冲区的长度
  106. DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //设置DMA的外设递增模式
  107. DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //设置DMA的内存递增模式
  108. DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;//外设数据字长
  109. DMA_InitStructure.DMA_MemoryDataSize = DMA_PeripheralDataSize_Byte;//内存数据字长
  110. DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; //设置DMA的传输模式
  111. DMA_InitStructure.DMA_Priority = DMA_Priority_Medium; //设置DMA的优先级别
  112. DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;//设置DMA的2个memory中的变量互相访问
  113. DMA_Init(DMA1_Channel6,&DMA_InitStructure);
  114. DMA_Cmd(DMA1_Channel6, ENABLE); //使能通道
  115. }
  116. /********************************************************************
  117. *Uart3DMAInit
  118. *串口3 DMA设置
  119. *串口3 发送必须用通道2,接收必须用通道3
  120. *********************************************************************/
  121. void Uart3DMAInit(void)
  122. {
  123. NVIC_InitTypeDef NVIC_InitStructure;
  124. DMA_InitTypeDef DMA_InitStructure;
  125. //启动DMA时钟
  126. RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
  127. //DMA 通道2用于UART3 TX
  128. DMA_DeInit(DMA1_Channel2);
  129. DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)(&USART3->DR);//外设地址
  130. DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)TxBuffer3;//内存地址
  131. DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;//DMA传输方向单向
  132. DMA_InitStructure.DMA_BufferSize = UART3_TX_BUFFER_SIZE; //设置DMA在传输时缓冲区的长度
  133. DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //设置DMA的外设递增模式
  134. DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //设置DMA的内存递增模式
  135. DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;//外设数据字长
  136. DMA_InitStructure.DMA_MemoryDataSize = DMA_PeripheralDataSize_Byte;//内存数据字长
  137. DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; //设置DMA的传输模式
  138. DMA_InitStructure.DMA_Priority = DMA_Priority_High; //设置DMA的优先级别
  139. DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;//设置DMA的2个memory中的变量互相访问
  140. DMA_Init(DMA1_Channel2,&DMA_InitStructure);
  141. //DMA中断设置
  142. NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel2_IRQn;
  143. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
  144. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
  145. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  146. NVIC_Init(&NVIC_InitStructure);
  147. DMA_ITConfig(DMA1_Channel2,DMA_IT_TC,ENABLE);//中断设置
  148. DMA_Cmd(DMA1_Channel2, DISABLE); //等到需要发送的时候再使能
  149. //DMA 通道3用于UART3 RX
  150. DMA_DeInit(DMA1_Channel3);
  151. DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)(&USART3->DR);//外设地址
  152. DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)RxBuffer3;//内存地址
  153. DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;//DMA传输方向单向
  154. DMA_InitStructure.DMA_BufferSize = UART3_RX_BUFFER_SIZE; //设置DMA在传输时缓冲区的长度
  155. DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //设置DMA的外设递增模式
  156. DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //设置DMA的内存递增模式
  157. DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;//外设数据字长
  158. DMA_InitStructure.DMA_MemoryDataSize = DMA_PeripheralDataSize_Byte;//内存数据字长
  159. DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; //设置DMA的传输模式
  160. DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh; //设置DMA的优先级别
  161. DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;//设置DMA的2个memory中的变量互相访问
  162. DMA_Init(DMA1_Channel3,&DMA_InitStructure);
  163. DMA_Cmd(DMA1_Channel3, ENABLE); //使能通道
  164. }
  165. /*********************************************************************************************
  166. *UART3RxTxISRHandler
  167. *串口3中断处理函数
  168. **********************************************************************************************/
  169. void UART3RxTxISRHandler(void)
  170. {
  171. __IO unsigned char uart_data;
  172. static __IO unsigned char uart_last_data;
  173. char *p;
  174. int i;
  175. int temp;
  176. //----接收中断--------
  177. if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)
  178. {
  179. uart_data = USART_ReceiveData(USART3); // Read one byte from the receive data register
  180. if(g_ucUARTSel==COM_SEL_MODEM){
  181. USART_SendData(USART1, uart_data);
  182. USART_ClearITPendingBit(USART3, USART_IT_RXNE); //清除中断标志
  183. return;
  184. }
  185. //MCU 处理Modem
  186. RxBuffer3[rx3_ct++]= uart_data;
  187. if(rx3_ct>=UART3_RX_BUFFER_SIZE) rx3_ct=0;
  188. if(uart_last_data==0x0d && uart_data==0x0a){ //收到回车换行符
  189. if(rx3_ct<2){ //独立的回车换行直接忽略
  190. rx3_ct=0;
  191. }else{
  192. //先判断是否+ZIPRECV,如果是则需特殊处理
  193. datalen=0;
  194. if(RxBuffer3[0]=='+' && RxBuffer3[7]=='V' && RxBuffer3[1]=='Z' && RxBuffer3[3]=='P' && RxBuffer3[5]=='E') { //+ZIPRECV
  195. //获取ZIPRECV接收数据长度
  196. if(rx3_ct>11 && RxBuffer3[11]>0x2f && RxBuffer3[11]<0x3a){
  197. if(RxBuffer3[12]>0x2f && RxBuffer3[12]<0x3a){
  198. if(RxBuffer3[13]>0x2f && RxBuffer3[13]<0x3a){
  199. datalen=100*(RxBuffer3[11]-0x30);
  200. datalen+=10*(RxBuffer3[12]-0x30);
  201. datalen+=RxBuffer3[13];
  202. datalen+=15;
  203. }else{
  204. datalen=10*(RxBuffer3[11]-0x30);
  205. datalen+=(RxBuffer3[12]-0x30);
  206. datalen+=14;
  207. }
  208. }else{
  209. datalen= RxBuffer3[11]-0x30;
  210. datalen+=13;
  211. }
  212. }
  213. }
  214. //非+ZIPRECV包,或大于+ZIPRECV包长的包,则认为完成一包数据接收
  215. if(rx3_ct>datalen){
  216. //以'+'开头的才处理 或 OK
  217. if(RxBuffer3[0]=='+' || (RxBuffer3[0]=='O' && RxBuffer3[1]=='K') ){
  218. // //数据拷贝
  219. // p=&ModemMsgBuf[ModemMsgBufIndex][0];
  220. // for(i=0;i<rx3_ct;i++){
  221. // p[i]=RxBuffer3[i];
  222. // }
  223. // ModemMsgBuf[ModemMsgBufIndex][rx3_ct]=0;
  224. // //发消息
  225. // OSQPost(ModemQ, (void *)&ModemMsgBuf[ModemMsgBufIndex][0]);
  226. // if(++ModemMsgBufIndex>=MODEM_Q_NUM)ModemMsgBufIndex=0;
  227. }
  228. rx3_ct=0;
  229. }
  230. }
  231. }
  232. // else if(uart_last_data==0x0a && uart_data=='>'){ //GPRS 才有
  233. // if(RxBuffer3[2]=='+' && RxBuffer3[3]=='Z' && RxBuffer3[4]=='I' && RxBuffer3[5]=='P' \
  234. // && RxBuffer3[6]=='S' && RxBuffer3[7]=='E' && RxBuffer3[8]=='N'&& RxBuffer3[9]=='D'){//AT+ZIPSEND
  235. // ModemMsgBuf[ModemMsgBufIndex][0]='>';
  236. // ModemMsgBuf[ModemMsgBufIndex][1]=0x20;
  237. // OSQPost(ModemQ, (void *)&ModemMsgBuf[ModemMsgBufIndex][0]);
  238. // if(++ModemMsgBufIndex>=MODEM_Q_NUM)ModemMsgBufIndex=0;
  239. // rx3_ct=0;
  240. // }
  241. // }
  242. uart_last_data = uart_data;
  243. USART_ClearITPendingBit(USART3, USART_IT_RXNE); //清除中断标志
  244. }
  245. //接收空闲中断
  246. if(USART_GetITStatus(USART3, USART_IT_IDLE) != RESET){
  247. //printf("UART3_IDLE\r\n");
  248. temp = USART3->SR;//先读SR,再读DR
  249. temp = USART3->DR;//方可清USART_IT_IDLE标志
  250. temp = UART3_RX_BUFFER_SIZE - DMA1_Channel3->CNDTR;
  251. DMA_Cmd(DMA1_Channel3,DISABLE);
  252. //处理数据
  253. if(temp>3){
  254. //拷贝数据
  255. // p=&ModemMsgBuf[ModemMsgBufIndex][0];
  256. // for(i=0;i<temp;i++){
  257. // p[i]=RxBuffer3[i];
  258. // }
  259. // ModemMsgBuf[ModemMsgBufIndex][temp]=0;
  260. // //发消息
  261. // OSQPost(ModemQ, (void *)&ModemMsgBuf[ModemMsgBufIndex][0]);
  262. // if(++ModemMsgBufIndex>=MODEM_Q_NUM)ModemMsgBufIndex=0;
  263. }
  264. //重设DMA传输数据长度
  265. DMA1_Channel3->CNDTR = UART3_RX_BUFFER_SIZE;
  266. //打开DMA
  267. DMA_Cmd(DMA1_Channel3,ENABLE);
  268. }
  269. }
  270. /******************************************************************************
  271. *
  272. *******************************************************************************/
  273. unsigned char Uart1GetPack(unsigned char *pCmd,unsigned char *pData)
  274. {
  275. unsigned char datalen;
  276. unsigned short checksum;
  277. int i,j;
  278. //引导码检查
  279. if(RxBuffer1[0]!=UART_HEAD0 || RxBuffer1[1]!=UART_HEAD1)return 0xff;
  280. //地址码检查
  281. if(RxBuffer1[2]!=0 && RxBuffer1[2]!=0)return 0xff;
  282. //命令码检查
  283. if(RxBuffer1[3]==0)return 0xff;//命令不能为0
  284. //获取长度
  285. datalen=RxBuffer1[4];
  286. //校验码
  287. checksum=chksum(0,RxBuffer1,datalen+5);
  288. //校验码检查
  289. if(RxBuffer1[datalen+5]!=(checksum/256) || RxBuffer1[datalen+6]!=(checksum%256))return 0xff;
  290. //
  291. *pCmd=RxBuffer1[3];
  292. j=5;
  293. for(i=0;i<datalen;i++){
  294. pData[i]=RxBuffer1[j++];
  295. }
  296. return datalen;
  297. }
  298. /********************************************************************************
  299. *Uart1Send
  300. *串口1启动发送
  301. *********************************************************************************/
  302. void Uart1Send(void)
  303. {
  304. //if(tx1_len==0 || tx1_len>UART1_BUFFER_SIZE)return;
  305. //启动新一轮发送
  306. //g_ucUart1Sending=tx1_len;
  307. //tx1_ct=0;
  308. //发送
  309. //USART_ClearITPendingBit(USART2, USART_IT_TXE);//Clean interrupt flag
  310. //USART_ITConfig(USART2, USART_IT_TXE, ENABLE);
  311. for(tx1_ct=0;tx1_ct<tx1_len;tx1_ct++){
  312. USART_SendData(USART1, TxBuffer1[tx1_ct]);
  313. while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
  314. }
  315. }
  316. /*********************************************************************************************
  317. *UART1RxTxISRHandler
  318. *串口1中断处理函数
  319. **********************************************************************************************/
  320. void UART1RxTxISRHandler(void)
  321. {
  322. __IO unsigned char uart_data;
  323. //----接收中断--------
  324. if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
  325. {
  326. uart_data = USART_ReceiveData(USART1);
  327. if(g_ucUart1Received){//上一批没处理,不接受新数据
  328. rx1_ct=0;
  329. }else if(rx1_ct==0 && uart_data==UART_HEAD0){
  330. RxBuffer1[rx1_ct++]=uart_data;
  331. }else if(rx1_ct==1 && uart_data==UART_HEAD1){
  332. RxBuffer1[rx1_ct++]=uart_data;
  333. rx1_ct_max=6;//先默认最大长度
  334. }else if(rx1_ct>1){
  335. RxBuffer1[rx1_ct++]=uart_data;
  336. if(rx1_ct==5){
  337. rx1_ct_max=uart_data+7;//更新数据长度
  338. if(rx1_ct_max>(UART1_RX_BUFFER_SIZE-1))rx1_ct_max=(UART1_RX_BUFFER_SIZE-1);
  339. }else if(rx1_ct>=rx1_ct_max){
  340. g_ucUart1Received=1;
  341. rx1_ct=0;
  342. }
  343. }else{
  344. rx1_ct=0;
  345. }
  346. USART_ClearITPendingBit(USART1, USART_IT_RXNE); //清除中断标志
  347. }
  348. }
  349. /***********************************************************************
  350. *
  351. ************************************************************************/
  352. void UART2RxTxISRHandler(void)
  353. {
  354. uint32_t temp = 0;
  355. uint16_t i = 0;
  356. char *p;
  357. char *msg;
  358. __IO unsigned char uart_data;
  359. __IO static unsigned char uart_last_data=0;
  360. if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET){
  361. uart_data = USART_ReceiveData(USART2);
  362. if(g_ucUARTSel==COM_SEL_GPS){
  363. USART_SendData(USART1, uart_data);
  364. USART_ClearITPendingBit(USART2, USART_IT_RXNE); //Clean interrupt flag
  365. }else{
  366. RxBuffer2[rx2_ct]= uart_data;
  367. if(RxBuffer2[0]!='$')rx2_ct=0;
  368. else rx2_ct++;
  369. if(rx2_ct>=UART2_RX_BUFFER_SIZE) rx2_ct=0;
  370. if(uart_last_data==0x0d && uart_data==0x0a){ //收到回车换行符
  371. if(RxBuffer2[1]=='G' && RxBuffer2[3]=='R' && RxBuffer2[5]=='C'){//$GPRMC
  372. // //拷贝数据
  373. // p=&GpsMsgBuf[GpsMsgBufIndex][0];
  374. // for(i=0;i<rx2_ct;i++){
  375. // p[i]= RxBuffer2[i];
  376. // }
  377. // GpsMsgBuf[GpsMsgBufIndex][rx2_ct] = 0;
  378. // //Send message
  379. // OSQPost(GpsQ, (void *)&GpsMsgBuf[GpsMsgBufIndex][0]);
  380. // if(++GpsMsgBufIndex>=GPS_Q_NUM)GpsMsgBufIndex=0;
  381. }
  382. rx2_ct=0;
  383. }
  384. USART_ClearITPendingBit(USART2, USART_IT_RXNE); //Clean interrupt flag
  385. }
  386. uart_last_data=uart_data;
  387. }
  388. }
  389. /*******************************************************************************
  390. 校验
  391. *******************************************************************************/
  392. unsigned short chksum(unsigned short sum, unsigned char *data, unsigned short len)
  393. {
  394. unsigned short t;
  395. unsigned char *dataptr;
  396. unsigned char *last_byte;
  397. dataptr = data;
  398. last_byte = data + len - 1;
  399. while(dataptr < last_byte) { /* At least two more bytes */
  400. t = (dataptr[0] << 8) + dataptr[1];
  401. sum += t;
  402. if(sum < t) {
  403. sum++; /* carry */
  404. }
  405. dataptr += 2;
  406. }
  407. if(dataptr == last_byte) {
  408. t = (dataptr[0] << 8) + 0;
  409. sum += t;
  410. if(sum < t) {
  411. sum++; /* carry */
  412. }
  413. }
  414. /* Return sum in host byte order. */
  415. return sum;
  416. }
  417. /*******************************************************************************
  418. ComSelect
  419. 调试口选择
  420. #define COM_SEL_MCU 0
  421. #define COM_SEL_GPS 1
  422. #define COM_SEL_MODEM 2
  423. *******************************************************************************/
  424. void ComSelect(unsigned char sel)
  425. {
  426. switch(sel)
  427. {
  428. case COM_SEL_MCU:
  429. SlwTrace(INF,"Debug COM selcet to MCU!\r\n");
  430. SlwTraceWaitCompleted();
  431. g_ucUARTSel=sel;
  432. USART_ITConfig(USART1, USART_IT_RXNE, DISABLE); //ENABLE DISABLE
  433. USART_ITConfig(USART1, USART_IT_IDLE, ENABLE); //USART_IT_IDLE USART_IT_RXNE
  434. USART_DMACmd(USART1,USART_DMAReq_Tx,ENABLE);
  435. USART_DMACmd(USART1,USART_DMAReq_Rx,ENABLE);
  436. USART_ITConfig(USART2, USART_IT_RXNE, DISABLE); //ENABLE DISABLE
  437. USART_ITConfig(USART2, USART_IT_IDLE, ENABLE); //USART_IT_IDLE USART_IT_RXNE
  438. USART_DMACmd(USART2,USART_DMAReq_Tx,DISABLE);
  439. USART_DMACmd(USART2,USART_DMAReq_Rx,ENABLE);
  440. break;
  441. case COM_SEL_GPS:
  442. SlwTrace(INF,"Debug COM selcet to GPS!\r\n");
  443. SlwTraceWaitCompleted();
  444. g_ucUARTSel=sel;
  445. USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); //ENABLE DISABLE
  446. USART_ITConfig(USART1, USART_IT_IDLE, DISABLE); //USART_IT_IDLE USART_IT_RXNE
  447. USART_DMACmd(USART1,USART_DMAReq_Tx,DISABLE);
  448. USART_DMACmd(USART1,USART_DMAReq_Rx,ENABLE);
  449. USART_ITConfig(USART2, USART_IT_RXNE, ENABLE); //ENABLE DISABLE
  450. USART_ITConfig(USART2, USART_IT_IDLE, DISABLE); //USART_IT_IDLE USART_IT_RXNE
  451. USART_DMACmd(USART2,USART_DMAReq_Tx,DISABLE);
  452. USART_DMACmd(USART2,USART_DMAReq_Rx,DISABLE);
  453. break;
  454. case COM_SEL_MODEM:
  455. SlwTrace(INF,"Debug COM selcet to Modem!\r\n");
  456. SlwTraceWaitCompleted();
  457. g_ucUARTSel=sel;
  458. USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); //ENABLE DISABLE
  459. USART_ITConfig(USART1, USART_IT_IDLE, DISABLE); //USART_IT_IDLE USART_IT_RXNE
  460. USART_DMACmd(USART1,USART_DMAReq_Tx,DISABLE);
  461. USART_DMACmd(USART1,USART_DMAReq_Rx,DISABLE);
  462. DMA_Cmd(DMA1_Channel4, DISABLE); //等到需要发送的时候再使能
  463. DMA_Cmd(DMA1_Channel5, DISABLE); //等到需要发送的时候再使能
  464. USART_ITConfig(USART3, USART_IT_RXNE, ENABLE); //ENABLE DISABLE
  465. USART_ITConfig(USART3, USART_IT_IDLE, DISABLE); //USART_IT_IDLE USART_IT_RXNE
  466. USART_DMACmd(USART3,USART_DMAReq_Tx,DISABLE);
  467. USART_DMACmd(USART3,USART_DMAReq_Rx,DISABLE);
  468. DMA_Cmd(DMA1_Channel2, DISABLE); //等到需要发送的时候再使能
  469. DMA_Cmd(DMA1_Channel3, DISABLE); //等到需要发送的时候再使能
  470. break;
  471. }
  472. }
  473. /*******************************************************************************
  474. Uart1Init
  475. Use for Trace
  476. *******************************************************************************/
  477. void Uart1Init(void)
  478. {
  479. NVIC_InitTypeDef NVIC_InitStructure;
  480. GPIO_InitTypeDef GPIO_InitStructure;
  481. USART_InitTypeDef USART_InitStructure;
  482. RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1,ENABLE);
  483. /*
  484. * USART1_TX -> PA9 , USART1_RX -> PA10
  485. */
  486. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
  487. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  488. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  489. GPIO_Init(GPIOA, &GPIO_InitStructure);
  490. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
  491. GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IN_FLOATING;// GPIO_Mode_IPU;//GPIO_Mode_IN_FLOATING;
  492. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  493. GPIO_Init(GPIOA, &GPIO_InitStructure);
  494. USART_InitStructure.USART_BaudRate =115200;// 115200;
  495. USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  496. USART_InitStructure.USART_StopBits = USART_StopBits_1;
  497. USART_InitStructure.USART_Parity = USART_Parity_No;
  498. USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  499. USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  500. USART_Init(USART1, &USART_InitStructure);
  501. USART_Cmd(USART1, ENABLE);
  502. /* Configure the NVIC Preemption Priority Bits */
  503. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  504. /* Enable the USART1 Interrupt */
  505. NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
  506. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
  507. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  508. NVIC_Init(&NVIC_InitStructure);
  509. USART_ClearFlag(USART1,USART_FLAG_TC);
  510. USART_ITConfig(USART1, USART_IT_TXE, DISABLE); //ENABLE DISABLE
  511. USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); //ENABLE DISABLE
  512. USART_ITConfig(USART1, USART_IT_IDLE, DISABLE); //USART_IT_IDLE USART_IT_RXNE
  513. USART_DMACmd(USART1,USART_DMAReq_Rx,DISABLE); //使能USART1的接收DMA请求
  514. USART_DMACmd(USART1,USART_DMAReq_Tx,DISABLE); //使能USART1的发送DMA请求
  515. // Uart1DMAInit();
  516. }
  517. /***************************************************************************
  518. Uart2Init
  519. Use for MainBoard
  520. ****************************************************************************/
  521. void Uart2Init(void)
  522. {
  523. NVIC_InitTypeDef NVIC_InitStructure;
  524. GPIO_InitTypeDef GPIO_InitStructure;
  525. USART_InitTypeDef USART_InitStructure;
  526. /*使能串口2使用的GPIO时钟*/
  527. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  528. /*使能串口2时钟*/
  529. RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
  530. /*串口2 RX管脚配置*/
  531. /* Configure USART2 Rx as input floating */
  532. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
  533. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//GPIO_Mode_IN_FLOATING;
  534. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  535. GPIO_Init(GPIOA, &GPIO_InitStructure);
  536. /*串口2 TX管脚配置*/
  537. /* Configure USART2 Tx as alternate function push-pull */
  538. // GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
  539. // GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  540. // GPIO_Init(GPIOA, &GPIO_InitStructure);
  541. USART_InitStructure.USART_BaudRate = 9600;//57600;//115200;
  542. USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  543. USART_InitStructure.USART_StopBits = USART_StopBits_1;
  544. USART_InitStructure.USART_Parity = USART_Parity_No;
  545. USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  546. USART_InitStructure.USART_Mode = USART_Mode_Rx ;//| USART_Mode_Tx;
  547. USART_Init(USART2, &USART_InitStructure);
  548. /* Configure the NVIC Preemption Priority Bits */
  549. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  550. /* Enable the USART2 Interrupt */
  551. NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
  552. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  553. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  554. NVIC_Init(&NVIC_InitStructure);
  555. USART_ClearFlag(USART2,USART_FLAG_TC);
  556. USART_ITConfig(USART2, USART_IT_TXE, DISABLE); //ENABLE DISABLE
  557. USART_ITConfig(USART2, USART_IT_RXNE, ENABLE); //ENABLE DISABLE
  558. USART_ITConfig(USART2, USART_IT_IDLE, DISABLE);//USART_IT_IDLE USART_IT_RXNE
  559. USART_Cmd(USART2, ENABLE);
  560. //USART_DMACmd(USART2,USART_DMAReq_Rx,ENABLE); //使能USART1的接收DMA请求
  561. //Uart2DMAInit();
  562. }
  563. /***************************************************************************
  564. Uart3Init
  565. ****************************************************************************/
  566. void Uart3Init(void)
  567. {
  568. NVIC_InitTypeDef NVIC_InitStructure;
  569. GPIO_InitTypeDef GPIO_InitStructure;
  570. USART_InitTypeDef USART_InitStructure;
  571. /*使能串口3使用的GPIO时钟*/
  572. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
  573. /*使能串口3时钟*/
  574. RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
  575. /*串口3 RX管脚配置*/
  576. /* Configure USART3 Rx as input floating */
  577. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
  578. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//GPIO_Mode_IPU;//GPIO_Mode_IN_FLOATING;
  579. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  580. GPIO_Init(GPIOB, &GPIO_InitStructure);
  581. /*串口3 TX管脚配置*/
  582. /* Configure USART2 Tx as alternate function push-pull */
  583. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
  584. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//GPIO_Mode_AF_PP;
  585. GPIO_Init(GPIOB, &GPIO_InitStructure);
  586. USART_InitStructure.USART_BaudRate = 115200;//115200;//57600;//115200;
  587. USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  588. USART_InitStructure.USART_StopBits = USART_StopBits_1;
  589. USART_InitStructure.USART_Parity = USART_Parity_No;;
  590. USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  591. USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  592. USART_Init(USART3, &USART_InitStructure);
  593. /* Configure the NVIC Preemption Priority Bits */
  594. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  595. /* Enable the USART3 Interrupt */
  596. NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
  597. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  598. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  599. NVIC_Init(&NVIC_InitStructure);
  600. USART_ClearFlag(USART3,USART_FLAG_TC);
  601. USART_ITConfig(USART3, USART_IT_TXE, DISABLE); //ENABLE DISABLE
  602. USART_ITConfig(USART3, USART_IT_RXNE, ENABLE); //ENABLE DISABLE
  603. USART_ITConfig(USART3, USART_IT_IDLE, DISABLE);//USART_IT_IDLE USART_IT_RXNE
  604. USART_Cmd(USART3, ENABLE);
  605. USART_DMACmd(USART3,USART_DMAReq_Tx,DISABLE); //使能USART1的DMA请求
  606. USART_DMACmd(USART3,USART_DMAReq_Rx,DISABLE); //使能USART1的DMA请求
  607. //Uart3DMAInit();
  608. }
  609. void UartSetPinLowPower(void)
  610. {
  611. // NVIC_InitTypeDef NVIC_InitStructure;
  612. GPIO_InitTypeDef GPIO_InitStructure;
  613. // USART_InitTypeDef USART_InitStructure;
  614. //串口2
  615. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3;
  616. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;//;
  617. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  618. GPIO_Init(GPIOA, &GPIO_InitStructure);
  619. GPIOA->BRR = (GPIO_Pin_2|GPIO_Pin_3);
  620. //串口3
  621. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11;
  622. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;//;
  623. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  624. GPIO_Init(GPIOB, &GPIO_InitStructure);
  625. GPIOB->BRR = (GPIO_Pin_10|GPIO_Pin_11);
  626. }
  627. /********************************************************************************
  628. *Uart3Send
  629. *串口3启动发送
  630. *********************************************************************************/
  631. void Uart3Send(void)
  632. {
  633. if(tx3_len==0 || tx3_len>UART3_TX_BUFFER_SIZE)return;
  634. // //启动新一轮发送
  635. // g_ucUart2Sending=tx2_len;
  636. // tx2_ct=0;
  637. // //发送
  638. // //USART_ClearITPendingBit(USART2, USART_IT_TXE); //清除中断标志
  639. // USART_ITConfig(USART2, USART_IT_TXE, ENABLE);
  640. for(tx3_ct=0;tx3_ct<tx3_len;tx3_ct++){
  641. USART_SendData(USART3, TxBuffer3[tx3_ct]);
  642. while (USART_GetFlagStatus(USART3, USART_FLAG_TC) == RESET);
  643. }
  644. }
  645. #ifdef __GNUC__
  646. /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
  647. set to 'Yes') calls __io_putchar() */
  648. #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
  649. #else
  650. #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
  651. #endif /* __GNUC__ */
  652. /**
  653. * @brief Retargets the C library printf function to the USART.
  654. * @param None
  655. * @retval None
  656. */
  657. PUTCHAR_PROTOTYPE
  658. {
  659. /* Place your implementation of fputc here */
  660. /* e.g. write a character to the USART */
  661. USART_SendData(USART1, (uint8_t) ch);
  662. /* Loop until the end of transmission */
  663. while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)
  664. {}
  665. return ch;
  666. }
  667. /**************************************************************************
  668. * USART1_SendOK_IQ
  669. * 串口1发送数据完毕后,会调用的中断函数,将发送标志置0
  670. * 此函数需在stm32f10x_it.c 的 DMA1_Channel4_IRQHandler()中被调用
  671. ***************************************************************************/
  672. void USART1_SendOK_IQ(void)
  673. {
  674. //判断是否为DMA发送完成中断
  675. if(DMA_GetFlagStatus(DMA1_FLAG_TC4)==SET)
  676. {
  677. DMA_ClearITPendingBit(DMA1_IT_GL4);
  678. DMA_ClearFlag(DMA1_FLAG_TC4);
  679. DMA_Cmd (DMA1_Channel4,DISABLE);
  680. g_ucUart1Sending = 0; //数据发送完毕
  681. }
  682. }
  683. /**************************************************************************
  684. * USART3_SendOK_IQ
  685. * 串口3发送数据完毕后,会调用的中断函数,将发送标志置0
  686. * 此函数需在stm32f10x_it.c 的 DMA1_Channel2_IRQHandler()中被调用
  687. ***************************************************************************/
  688. void USART3_SendOK_IQ(void)
  689. {
  690. //判断是否为DMA发送完成中断
  691. if(DMA_GetFlagStatus(DMA1_FLAG_TC2)==SET)
  692. {
  693. DMA_ClearITPendingBit(DMA1_IT_GL2);
  694. DMA_ClearFlag(DMA1_FLAG_TC2);
  695. DMA_Cmd (DMA1_Channel2,DISABLE);
  696. g_ucUart3Sending = 0; //数据发送完毕
  697. }
  698. }
  699. /*
  700. * 函数名:USART1_Send
  701. * 描述 :串口1发送数据函数
  702. * 输入 :要发送数据的首地址,发送数据的个数。发送数据的地址任意,并不用固定为Txd1Buffer
  703. * 输出 : 无
  704. * 举例 :Usart1_Send("Hello word!",11); Usart1_Send(Txd1Buffer,11);
  705. */
  706. void USART1_Send(char *pbuffer, int size)
  707. {
  708. if(size<=0)return;
  709. DMA_Cmd (DMA1_Channel4,DISABLE);
  710. DMA1_Channel4->CMAR = (u32)pbuffer;
  711. DMA1_Channel4->CNDTR = size;
  712. DMA_Cmd (DMA1_Channel4,ENABLE); //使能DMA,开始发送
  713. g_ucUart1Sending=1; //数据发送中 //灯亮
  714. }
  715. /*
  716. * 函数名:USART2_Send
  717. * 描述 :串口1发送数据函数
  718. * 输入 :要发送数据的首地址,发送数据的个数。发送数据的地址任意,并不用固定为Txd1Buffer
  719. * 输出 : 无
  720. * 举例 :Usart1_Send("Hello word!",11); Usart1_Send(Txd1Buffer,11);
  721. */
  722. void USART3_Send(char *pbuffer, int size)
  723. {
  724. if(size<=0)return;
  725. DMA_Cmd (DMA1_Channel2,DISABLE);
  726. DMA1_Channel2->CMAR = (u32)pbuffer;
  727. DMA1_Channel2->CNDTR = size;
  728. DMA_Cmd (DMA1_Channel2,ENABLE); //使能DMA,开始发送
  729. g_ucUart3Sending=1; //数据发送中 //灯亮
  730. }
  731. /***********************************************************************************
  732. *
  733. ************************************************************************************/
  734. void SlwTrace(TRACE_TYPE type,char *buf)
  735. {
  736. int len;
  737. char *p=buf;
  738. char d;
  739. #ifndef SLW_DEBUG
  740. if(type==DEBUG)return;
  741. #endif
  742. if(g_ucUARTSel!=COM_SEL_MCU)return;
  743. //等待上一次发送完成
  744. while(g_ucUart1Sending){
  745. // OSTimeDly(1);
  746. }
  747. len=0;
  748. if(0==*p)return;
  749. while(0!=*p && len<UART1_TX_BUFFER_SIZE){
  750. TxBuffer1[len]=(unsigned char)(*p);
  751. len++;
  752. p++;
  753. }
  754. if(len)USART1_Send(TxBuffer1,len);
  755. }
  756. void SlwTraceWaitCompleted()
  757. {
  758. while(g_ucUart1Sending){
  759. //OSTimeDly(1);
  760. }
  761. }