uart.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386
  1. /* Copyright Statement:
  2. *
  3. * This software/firmware and related documentation ("AutoChips Software") are
  4. * protected under relevant copyright laws. The information contained herein is
  5. * confidential and proprietary to AutoChips Inc. and/or its licensors. Without
  6. * the prior written permission of AutoChips inc. and/or its licensors, any
  7. * reproduction, modification, use or disclosure of AutoChips Software, and
  8. * information contained herein, in whole or in part, shall be strictly
  9. * prohibited.
  10. *
  11. * AutoChips Inc. (C) 2022. All rights reserved.
  12. *
  13. * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
  14. * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("AUTOCHIPS SOFTWARE")
  15. * RECEIVED FROM AUTOCHIPS AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
  16. * ON AN "AS-IS" BASIS ONLY. AUTOCHIPS EXPRESSLY DISCLAIMS ANY AND ALL
  17. * WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
  18. * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
  19. * NONINFRINGEMENT. NEITHER DOES AUTOCHIPS PROVIDE ANY WARRANTY WHATSOEVER WITH
  20. * RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
  21. * INCORPORATED IN, OR SUPPLIED WITH THE AUTOCHIPS SOFTWARE, AND RECEIVER AGREES
  22. * TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
  23. * RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
  24. * OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN AUTOCHIPS
  25. * SOFTWARE. AUTOCHIPS SHALL ALSO NOT BE RESPONSIBLE FOR ANY AUTOCHIPS SOFTWARE
  26. * RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
  27. * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND AUTOCHIPS'S
  28. * ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE AUTOCHIPS SOFTWARE
  29. * RELEASED HEREUNDER WILL BE, AT AUTOCHIPS'S OPTION, TO REVISE OR REPLACE THE
  30. * AUTOCHIPS SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
  31. * CHARGE PAID BY RECEIVER TO AUTOCHIPS FOR SUCH AUTOCHIPS SOFTWARE AT ISSUE.
  32. */
  33. /******************************************************************************
  34. * @version: V2.0.1 AC7840x Demo
  35. ******************************************************************************/
  36. #include "uart.h"
  37. #include "string.h"
  38. #include "ckgen_drv.h"
  39. #include "ckgen_hw.h"
  40. #include "gpio_drv.h"
  41. #include "gpio_hw.h"
  42. #include "uart_drv.h"
  43. #include "uart_hw.h"
  44. #include "uart_irq.h"
  45. #include "dma_drv.h"
  46. #include "dma_hw.h"
  47. #include "cfg.h"
  48. #define UART1_RX_DMA_CHANNEL 0
  49. #define UART1_TX_DMA_CHANNEL 1
  50. #define UART1_INSTANCE_ID 1
  51. //#define UART_DATA_LEN 4 /*数据传输长度*/
  52. uart_state_t s_uartState = {NULL}; /*UART运行变量状态*/
  53. UART_INFO uart1_info;
  54. uint32_t dmaRxBuf[UART1_RECV_DATA_POOL_COUNT>>2];
  55. uint32_t dmaTxBuf[UART1_TRANSMIT_DATA_POOL_COUNT>>2];
  56. //uint8_t g_sendflag = 0;
  57. void UART_TxDMAEventCallback(void *device, uint32_t wparam, uint32_t lparam);
  58. void UART_RxDMAEventCallback(void *DMAx, uint32_t wparam, uint32_t lparam);
  59. /* UART rx DMA channel config */
  60. dma_channel_config_t s_uartRxDmaChConfig =
  61. {
  62. .channelPriority = DMA_CHN_PRIORITY_LOW,
  63. .virtChnConfig = UART1_RX_DMA_CHANNEL,
  64. .source = DMA_REQ_UART1_RX,
  65. .callback = (dma_callback_t)UART_RxDMAEventCallback,
  66. .callbackParam = NULL,
  67. .enableTrigger = false,
  68. };
  69. /* UART tx DMA channel config */
  70. dma_channel_config_t s_uartTxDmaChConfig =
  71. {
  72. .channelPriority = DMA_CHN_PRIORITY_LOW,
  73. .virtChnConfig = UART1_TX_DMA_CHANNEL,
  74. .source = DMA_REQ_UART1_TX,
  75. .callback = (dma_callback_t)UART_TxDMAEventCallback,
  76. .callbackParam = NULL,
  77. .enableTrigger = false,
  78. };
  79. dma_chn_state_t s_uartRxDmaChState =
  80. {
  81. .virtChn = UART1_RX_DMA_CHANNEL, /* dma virtual channel */
  82. .status = DMA_CHN_NORMAL, /* dma channel normal */
  83. .callback = NULL, /* no callback function */
  84. };
  85. /* UART tx dma channel state */
  86. dma_chn_state_t s_uartTxDmaChState =
  87. {
  88. .virtChn = UART1_TX_DMA_CHANNEL, /* dma virtual channel */
  89. .status = DMA_CHN_NORMAL, /* dma channel normal */
  90. .callback = NULL,
  91. };
  92. dma_state_t g_dma_state;
  93. typedef enum
  94. {
  95. UART_RX_INIT = 1,
  96. UART_RX_DATA = 2,
  97. UART_RX_FINISH = 3,
  98. UART_TX_STA = 4,
  99. } uart_rx_step_t;
  100. uart_rx_step_t g_uartRxStep = UART_RX_INIT;
  101. /*!
  102. * @brief Uart transmit event callback
  103. * @param[in] DMAx: DMA_Type pointer
  104. * @param[in] wparam: reserve for user's code
  105. * @param[in] lparam: reserve for user's code
  106. * @return none
  107. */
  108. void UART_TxDMAEventCallback(void *device, uint32_t wparam, uint32_t lparam)
  109. {
  110. }
  111. /*!
  112. * @brief Uart dma receive handle
  113. * @param[in] DMAx: DMA_Type pointer
  114. * @param[in] wparam: reserve for user's code
  115. * @param[in] lparam: reserve for user's code
  116. * @return none
  117. */
  118. void UART_RxDMAEventCallback(void *DMAx, uint32_t wparam, uint32_t lparam)
  119. {
  120. }
  121. /*!
  122. * @brief UART1接收中断回调函数
  123. *
  124. *
  125. * @param none
  126. * @return none
  127. */
  128. void UART1_RX_Callback(void *driverState, uint32_t event, void *userData)
  129. {
  130. if(event == UART_EVENT_IDLE_LINE){
  131. //UART_Type * uart_type = UART_DRV_GetBase(UART1_INSTANCE_ID);
  132. //UART_SetIdleInterrupt(uart_type, false);
  133. uint32_t rxRemainByte = UART1_RECV_DATA_POOL_COUNT;
  134. UART_DRV_GetReceiveStatus(UART1_INSTANCE_ID, &rxRemainByte);
  135. uart1_info.recv_len = UART1_RECV_DATA_POOL_COUNT - rxRemainByte;
  136. UART_DRV_AbortReceivingData(UART1_INSTANCE_ID);
  137. }else if(event == UART_EVENT_END_TRANSFER){
  138. //LED3_TOGGLE;
  139. }else{
  140. }
  141. }
  142. /*!
  143. * @brief UART1发送中断回调函数
  144. *
  145. *
  146. * @param none
  147. * @return none
  148. */
  149. void UART1_TX_Callback(void *driverState, uint32_t event, void *userData)
  150. {
  151. if(UART_EVENT_TX_EMPTY == event){
  152. }else if(event == UART_EVENT_END_TRANSFER){
  153. //uart1_info.recv_len = 0;
  154. //UART_Type * uart_type = UART_DRV_GetBase(UART1_INSTANCE_ID);
  155. //UART_SetIdleInterrupt(uart_type, true);
  156. //UART_DRV_ReceiveData(1, uart1_info.recv_buffer, UART1_RECV_DATA_POOL_COUNT); /*接收数据*/
  157. }else{
  158. }
  159. }
  160. /**
  161. * Uart1_Initialize
  162. *
  163. * @param[in] none
  164. * @return none
  165. *
  166. * @brief uart 初始化
  167. */
  168. void Uart1_Initialize(void)
  169. {
  170. uart_user_config_t userConfig;
  171. memset(&userConfig, 0U, sizeof(userConfig));
  172. /*GPIO Configuration for UART1 */
  173. GPIO_DRV_SetMuxModeSel(PORTC, (gpio_channel_type_t)8U, PORT_MUX_ALT2); /* PC8: UART1_RX */
  174. GPIO_DRV_SetMuxModeSel(PORTC, (gpio_channel_type_t)9U, PORT_MUX_ALT2); /* PC9: UART1_TX */
  175. GPIO_DRV_SetPullSel(PORTC, (gpio_channel_type_t)8U, PORT_INTERNAL_PULL_UP_ENABLED);
  176. GPIO_DRV_SetPullSel(PORTC, (gpio_channel_type_t)9U, PORT_INTERNAL_PULL_UP_ENABLED);
  177. switch(config->br_index){
  178. case BaudRate_4800:
  179. userConfig.baudRate = 4800;
  180. break;
  181. case BaudRate_9600:
  182. userConfig.baudRate = 9600;
  183. break;
  184. case BaudRate_19200:
  185. userConfig.baudRate = 19200;
  186. break;
  187. case BaudRate_38400:
  188. userConfig.baudRate = 38400;
  189. break;
  190. case BaudRate_57600:
  191. userConfig.baudRate = 57600;
  192. break;
  193. case BaudRate_115200:
  194. userConfig.baudRate = 115200;
  195. break;
  196. case BaudRate_230400:
  197. userConfig.baudRate = 230400;
  198. break;
  199. default:
  200. userConfig.baudRate = 115200;
  201. break;
  202. };
  203. userConfig.parityMode = UART_PARITY_DISABLED; /*奇偶校验模式选择 */
  204. userConfig.stopBitCount = UART_ONE_STOP_BIT; /*停止位选择1-bit */
  205. userConfig.bitCountPerChar = UART_8_BITS_PER_CHAR; /*数据长度选择8 */
  206. userConfig.transferType = UART_USING_INTERRUPTS; /*UART传输方式选择 (interrupt or dma) */
  207. userConfig.rxDMAChannel = UART1_RX_DMA_CHANNEL; /*DMA传输方式下的DMA rx 通道*/
  208. userConfig.txDMAChannel = UART1_TX_DMA_CHANNEL; /*DMA传输方式下的DMA tx 通道*/
  209. userConfig.rxCallback = UART1_RX_Callback;
  210. userConfig.rxCallbackParam = NULL;
  211. userConfig.txCallback = UART1_TX_Callback;
  212. userConfig.txCallbackParam = NULL;
  213. UART_DRV_Init(UART1_INSTANCE_ID, &s_uartState, &userConfig);
  214. UART_Type * uart_type = UART_DRV_GetBase(UART1_INSTANCE_ID);
  215. UART_SetIdleFunc(uart_type, true);
  216. UART_SetIdleInterrupt(uart_type, true);
  217. uart1_info.recv_buffer = (uint8_t *)dmaRxBuf;
  218. uart1_info.send_buffer = (uint8_t *)dmaTxBuf;
  219. uart1_info.recv_len = 0;
  220. uart1_info.send_len = 0;
  221. UART_DRV_ReceiveData(UART1_INSTANCE_ID, uart1_info.recv_buffer, UART1_RECV_DATA_POOL_COUNT); /*接收数据*/
  222. }
  223. int Uart1_TransmitData(uint8_t *pdata, uint16_t length)
  224. {
  225. //UART_DRV_SendData(UART1_INSTANCE_ID, pdata, length);
  226. UART_DRV_SendDataBlocking(UART1_INSTANCE_ID, pdata, length, 50);
  227. return 0;
  228. }
  229. void Uart1_RecvData(void)
  230. {
  231. uart1_info.recv_len = 0;
  232. //UART_Type * uart_type = UART_DRV_GetBase(UART1_INSTANCE_ID);
  233. //UART_SetIdleFunc(uart_type, true);
  234. //UART_SetIdleInterrupt(uart_type, true);
  235. UART_DRV_ReceiveData(1, uart1_info.recv_buffer, UART1_RECV_DATA_POOL_COUNT); /*接收数据*/
  236. }
  237. /*!
  238. * @brief UART模块配置
  239. * UART1配置普通UART模式,波特率115200,数据长度为8bit,停止位为1bit
  240. * 使能接收和发送DMA功能
  241. * @param none
  242. * @return none
  243. */
  244. void UART1_Init(void)
  245. {
  246. uart_user_config_t userConfig;
  247. /*GPIO Configuration for UART1 */
  248. GPIO_DRV_SetMuxModeSel(PORTC, (gpio_channel_type_t)8U, PORT_MUX_ALT2); /* PC8: UART1_RX */
  249. GPIO_DRV_SetMuxModeSel(PORTC, (gpio_channel_type_t)9U, PORT_MUX_ALT2); /* PC9: UART1_TX */
  250. GPIO_DRV_SetPullSel(PORTC, (gpio_channel_type_t)8U, PORT_INTERNAL_PULL_UP_ENABLED);
  251. GPIO_DRV_SetPullSel(PORTC, (gpio_channel_type_t)9U, PORT_INTERNAL_PULL_UP_ENABLED);
  252. memset(&userConfig, 0U, sizeof(userConfig));
  253. userConfig.baudRate = 115200; /*波特率配置 */
  254. userConfig.parityMode = UART_PARITY_DISABLED; /*奇偶校验模式选择 */
  255. userConfig.stopBitCount = UART_ONE_STOP_BIT; /*停止位选择1-bit */
  256. userConfig.bitCountPerChar = UART_8_BITS_PER_CHAR; /*数据长度选择8 */
  257. userConfig.transferType = UART_USING_INTERRUPTS; /*UART传输方式选择 (interrupt or dma) */
  258. userConfig.rxDMAChannel = UART1_RX_DMA_CHANNEL; /*DMA传输方式下的DMA rx 通道*/
  259. userConfig.txDMAChannel = UART1_TX_DMA_CHANNEL; /*DMA传输方式下的DMA tx 通道*/
  260. userConfig.rxCallback = UART1_RX_Callback;
  261. userConfig.rxCallbackParam = NULL;
  262. userConfig.txCallback = UART1_TX_Callback;
  263. userConfig.txCallbackParam = NULL;
  264. UART_DRV_Init(UART1_INSTANCE_ID, &s_uartState, &userConfig);
  265. UART_Type * uart_type = UART_DRV_GetBase(UART1_INSTANCE_ID);
  266. UART_SetIdleFunc(uart_type, true);
  267. UART_SetIdleInterrupt(uart_type, true);
  268. /*DMA配置*/
  269. //DMA_DRV_Init(&g_dma_state, NULL, NULL, NULL);
  270. //DMA_DRV_ChannelInit(&s_uartRxDmaChState, &s_uartRxDmaChConfig);
  271. //DMA_DRV_ChannelInit(&s_uartTxDmaChState, &s_uartTxDmaChConfig);
  272. uart1_info.recv_buffer = (uint8_t *)dmaRxBuf;
  273. uart1_info.send_buffer = (uint8_t *)dmaTxBuf;
  274. uart1_info.recv_len = 0;
  275. uart1_info.send_len = 0;
  276. UART_DRV_ReceiveData(UART1_INSTANCE_ID, uart1_info.recv_buffer, UART1_RECV_DATA_POOL_COUNT); /*接收数据*/
  277. }
  278. /*!
  279. * @brief UART数据传输处理
  280. * UART查询接收数据,接收到数据后再将数据发送出去
  281. *
  282. * @param none
  283. * @return none
  284. */
  285. void UART1_DATA_Proce(void)
  286. {
  287. //uint32_t rxRemainByte = 0;
  288. #if 0
  289. status_t status;
  290. status = UART_DRV_ReceiveDataPolling(1, uart1_info.recv_buffer, UART1_RECV_DATA_POOL_COUNT); /*接收数据*/
  291. if (status == STATUS_SUCCESS)
  292. {
  293. memcpy(uart1_info.send_buffer, uart1_info.recv_buffer, uart1_info.recv_len); /*将接收到的数据拷贝给发送数据*/
  294. uart1_info.send_len = uart1_info.recv_len;
  295. UART_DRV_SendData(UART1_INSTANCE, uart1_info.send_buffer, uart1_info.send_len);
  296. }
  297. #else
  298. if(uart1_info.recv_len > 0){
  299. memcpy(uart1_info.send_buffer, uart1_info.recv_buffer, uart1_info.recv_len); /*将接收到的数据拷贝给发送数据*/
  300. uart1_info.send_len = uart1_info.recv_len;
  301. UART_DRV_SendData(UART1_INSTANCE_ID, uart1_info.send_buffer, uart1_info.send_len);
  302. uart1_info.recv_len = 0;
  303. }
  304. #endif
  305. }