usart.c 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. #include "usart.h"
  2. /* \arg COM_EC800: EC800
  3. \arg COM_485: 485
  4. \arg COM_232: 232
  5. */
  6. static rcu_periph_enum COM_CLK[COMn] = {COM_EC800_CLK, COM_485_CLK, COM_232_CLK};
  7. static uint32_t COM_TX_PIN[COMn] = {COM_EC800_TX_PIN, COM_485_TX_PIN, COM_232_TX_PIN};
  8. static uint32_t COM_RX_PIN[COMn] = {COM_EC800_RX_PIN, COM_485_RX_PIN, COM_232_RX_PIN};
  9. static uint32_t COM_GPIO_PORT[COMn] = {COM_EC800_GPIO_PORT, COM_485_GPIO_PORT, COM_232_GPIO_PORT};
  10. static rcu_periph_enum COM_GPIO_CLK[COMn] = {COM_EC800_GPIO_CLK, COM_485_GPIO_CLK, COM_232_GPIO_CLK};
  11. static uint32_t COM_IT_HANDLER[COMn] = {COM_EC800_IT_HANDLER, COM_485_IT_HANDLER, COM_232_IT_HANDLER};
  12. static uint32_t COM_BAUDTATE[COMn]={COM_EC800_BAUDRATE,COM_485_BAUDRATE,COM_232_BAUDRATE};
  13. uint8_t UART0_RX_BUF[UART0_RX_LEN];
  14. uint8_t UART0_RX_STAT = 0;
  15. uint8_t UART0_RX_MQTT_SUB_STAT=0; //mqttt订阅信息标志位
  16. uint32_t UART0_RX_NUM = 0;
  17. usart_data_buf_t usart1_rx_buf;
  18. //清除dma buffer内数据
  19. void Clear_DMA_Buffer(void)
  20. {
  21. UART0_RX_NUM=0;
  22. memset(UART0_RX_BUF,0,UART0_RX_LEN);
  23. }
  24. /*!
  25. \brief configure COM port
  26. \param[in] com: COM on the board
  27. \arg COM_EC800: EC800
  28. \arg COM_485: 485
  29. \arg COM_232: 232
  30. \param[out] none
  31. \retval none
  32. */
  33. void gd_com_init(uint32_t com)
  34. {
  35. uint32_t com_id = 0U;
  36. if(COM_EC800 == com)
  37. {
  38. com_id = 0U;
  39. }
  40. else if(COM_485 == com)
  41. {
  42. com_id=1U;
  43. }
  44. else if(COM_232 == com)
  45. {
  46. com_id = 2U;
  47. //重映射usart2端口
  48. rcu_periph_clock_enable(RCU_AF);
  49. gpio_pin_remap_config(GPIO_USART2_FULL_REMAP, ENABLE);
  50. }
  51. //nvic_irq_enable(COM_IT_HANDLER[com_id], 0, 0);
  52. /* enable GPIO clock */
  53. rcu_periph_clock_enable(COM_GPIO_CLK[com_id]);
  54. /* enable USART clock */
  55. rcu_periph_clock_enable(COM_CLK[com_id]);
  56. /* connect port to USARTx_Tx */
  57. gpio_init(COM_GPIO_PORT[com_id], GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, COM_TX_PIN[com_id]);
  58. /* connect port to USARTx_Rx */
  59. gpio_init(COM_GPIO_PORT[com_id], GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, COM_RX_PIN[com_id]);
  60. /* USART configure */
  61. usart_deinit(com);
  62. usart_baudrate_set(com, COM_BAUDTATE[com_id]);
  63. usart_word_length_set(com, USART_WL_8BIT);
  64. usart_stop_bit_set(com, USART_STB_1BIT);
  65. usart_parity_config(com, USART_PM_NONE);
  66. usart_hardware_flow_rts_config(com, USART_RTS_DISABLE);
  67. usart_hardware_flow_cts_config(com, USART_CTS_DISABLE);
  68. usart_receive_config(com, USART_RECEIVE_ENABLE);
  69. usart_transmit_config(com, USART_TRANSMIT_ENABLE);
  70. usart_enable(com);
  71. // usart_interrupt_enable(com, USART_INT_TBE);
  72. usart_interrupt_enable(com, USART_INT_RBNE);
  73. usart_interrupt_enable(com, USART_INT_IDLE);
  74. }
  75. /*!
  76. \brief configure EC800M pin
  77. \param[out] none
  78. \retval none
  79. */
  80. void gd_EC800M_pin_init(void)
  81. {
  82. /* enable the EC800M power pin clock */
  83. rcu_periph_clock_enable(EC800M_PER_GPIO_CLK);
  84. /* configure EC800M GPIO port */
  85. gpio_init(EC800M_PER_GPIO_PORT, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, EC800M_PER_PIN);
  86. GPIO_BC(EC800M_PER_GPIO_PORT) = EC800M_PER_PIN;
  87. /* enable the EC800M reset pin clock */
  88. rcu_periph_clock_enable(EC800M_RST_GPIO_CLK);
  89. /* configure EC800M GPIO port */
  90. gpio_init(EC800M_RST_GPIO_PORT, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, EC800M_RST_PIN);
  91. GPIO_BC(EC800M_RST_GPIO_PORT) = EC800M_RST_PIN;
  92. }
  93. void gd_pull_EC800M_pwr_up(void)
  94. {
  95. GPIO_BOP(EC800M_PER_GPIO_PORT) = EC800M_PER_PIN;
  96. }
  97. void gd_pull_EC800M_pwr_down(void)
  98. {
  99. GPIO_BC(EC800M_PER_GPIO_PORT) = EC800M_PER_PIN;
  100. }
  101. void gd_pull_EC800M_rst_up(void)
  102. {
  103. GPIO_BOP(EC800M_RST_GPIO_PORT) = EC800M_RST_PIN;
  104. }
  105. void gd_pull_EC800M_rst_down(void)
  106. {
  107. GPIO_BC(EC800M_RST_GPIO_PORT) = EC800M_RST_PIN;
  108. }
  109. ////////////////////////////////////////////////////////////////////
  110. //默认的dma配置
  111. void dma_config(void)
  112. {
  113. dma_parameter_struct dma_init_struct;
  114. rcu_periph_clock_enable(RCU_DMA0);
  115. dma_deinit(DMA0, DMA_CH4);
  116. dma_init_struct.direction = DMA_PERIPHERAL_TO_MEMORY;
  117. dma_init_struct.memory_addr = (uint32_t)UART0_RX_BUF;
  118. dma_init_struct.memory_inc = DMA_MEMORY_INCREASE_ENABLE;
  119. dma_init_struct.memory_width = DMA_MEMORY_WIDTH_8BIT;
  120. dma_init_struct.number = UART0_RX_LEN;
  121. dma_init_struct.periph_addr = (uint32_t)(&USART_DATA(USART0));// ((uint32_t)0x40013804);
  122. dma_init_struct.periph_inc = DMA_PERIPH_INCREASE_DISABLE;
  123. dma_init_struct.periph_width = DMA_PERIPHERAL_WIDTH_8BIT;
  124. dma_init_struct.priority = DMA_PRIORITY_ULTRA_HIGH;
  125. dma_init(DMA0, DMA_CH4, &dma_init_struct);
  126. dma_circulation_disable(DMA0, DMA_CH4);
  127. dma_memory_to_memory_disable(DMA0, DMA_CH4);
  128. usart_dma_transmit_config(USART0, USART_DENT_ENABLE|USART_DENR_ENABLE);
  129. //nvic_irq_enable(DMA0_Channel4_IRQn, 2, 2);
  130. dma_interrupt_enable(DMA0, DMA_CH4, DMA_INT_FTF|DMA_INT_HTF|DMA_INT_ERR);
  131. dma_channel_enable(DMA0, DMA_CH4);
  132. }
  133. //手动控制dma搬运的数据地址和大小,在使用完成后需要恢复到默认的dma配置
  134. void dma_config_change(char *dmaBuffer,uint32_t bufferSize)
  135. {
  136. dma_parameter_struct dma_init_struct;
  137. rcu_periph_clock_enable(RCU_DMA0);
  138. dma_deinit(DMA0, DMA_CH4);
  139. dma_init_struct.direction = DMA_PERIPHERAL_TO_MEMORY;
  140. dma_init_struct.memory_addr = (uint32_t)dmaBuffer;
  141. dma_init_struct.memory_inc = DMA_MEMORY_INCREASE_ENABLE;
  142. dma_init_struct.memory_width = DMA_MEMORY_WIDTH_8BIT;
  143. dma_init_struct.number = bufferSize;
  144. dma_init_struct.periph_addr = (uint32_t)(&USART_DATA(USART0));// ((uint32_t)0x40013804);
  145. dma_init_struct.periph_inc = DMA_PERIPH_INCREASE_DISABLE;
  146. dma_init_struct.periph_width = DMA_PERIPHERAL_WIDTH_8BIT;
  147. dma_init_struct.priority = DMA_PRIORITY_ULTRA_HIGH;
  148. dma_init(DMA0, DMA_CH4, &dma_init_struct);
  149. dma_circulation_disable(DMA0, DMA_CH4);
  150. dma_memory_to_memory_disable(DMA0, DMA_CH4);
  151. usart_dma_transmit_config(USART0, USART_DENT_ENABLE|USART_DENR_ENABLE);
  152. //nvic_irq_enable(DMA0_Channel4_IRQn, 2, 2);
  153. dma_interrupt_enable(DMA0, DMA_CH4, DMA_INT_FTF|DMA_INT_ERR);
  154. dma_channel_enable(DMA0, DMA_CH4);
  155. }
  156. void nvic_config(void)
  157. {
  158. nvic_priority_group_set(NVIC_PRIGROUP_PRE2_SUB2); // 设置抢占优先级和子优先级的位数为 2
  159. nvic_irq_enable(USART0_IRQn, 0, 0);
  160. // nvic_irq_enable(USART1_IRQn, 1, 0);
  161. // nvic_irq_enable(USART2_IRQn, 2, 0);
  162. nvic_irq_enable(DMA0_Channel4_IRQn, 2, 1);
  163. }