uart.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478
  1. #include "uart.h"
  2. #include "libs/os.h"
  3. #include "libs/task.h"
  4. #include "libs/crc16.h"
  5. #include "libs/logger.h"
  6. #define SHARK_UART_BAUDRATE 38400
  7. #define SHARK_UART0_com UART3
  8. #define SHARK_UART0_tx_port GPIOB
  9. #define SHARK_UART0_tx_pin GPIO_PIN_10
  10. #define SHARK_UART0_rx_port GPIOB
  11. #define SHARK_UART0_rx_pin GPIO_PIN_11
  12. #define SHARK_UART0_irq UART3_IRQn
  13. #define SHARK_UART0_clk RCU_UART3
  14. #define SHARK_UART0_tx_gpio_clk RCU_GPIOB
  15. #define SHARK_UART0_rx_gpio_clk RCU_GPIOB
  16. #define SHARK_UART0_tx_dma DMA1
  17. #define SHARK_UART0_tx_dma_ch DMA_CH4
  18. #define SHARK_UART0_tx_dma_clk RCU_DMA1
  19. #define SHARK_UART0_rx_dma DMA1
  20. #define SHARK_UART0_rx_dma_ch DMA_CH2
  21. #define SHARK_UART0_rx_dma_clk RCU_DMA1
  22. // ================================================================================
  23. #define ENABLE_RX_DMA 1
  24. #define UART_NUM 1
  25. static u8 shark_uart0_tx_cache[SHARK_UART_TX_MEM_SIZE];
  26. #if UART_NUM==2
  27. static u8 shark_uart1_tx_cache[SHARK_UART_TX_MEM_SIZE];
  28. #endif
  29. static u8 shark_uart0_rx_cache[SHARK_UART_RX_MEM_SIZE];
  30. #if UART_NUM==2
  31. static u8 shark_uart1_rx_cache[SHARK_UART_RX_MEM_SIZE];
  32. #endif
  33. static shark_uart_t _shark_uart[1];
  34. static task_t _uart_task;
  35. ///static bool uart_no_data = false;
  36. #if ENABLE_RX_DMA==1
  37. #define update_dma_w_pos(uart) circle_update_write_position(&uart->rx_queue, SHARK_UART_RX_MEM_SIZE - DMA_CHCNT(SHARK_UART0_rx_dma, uart->rx_dma_ch))
  38. #else
  39. #define update_dma_w_pos(uart){}
  40. #endif
  41. // ================================================================================
  42. static uart_enum_t _uart_index(uint32_t com){
  43. return com == SHARK_UART0_com?SHARK_UART0:SHARK_UART1;
  44. }
  45. static bool shark_uart_on_rx_frame(shark_uart_t *uart)
  46. {
  47. u16 crc0 = DECODE_U16(uart->rx_frame + uart->rx_length);
  48. u16 crc1 = crc16_get(uart->rx_frame, uart->rx_length);
  49. if (crc0 != crc1) {
  50. return false;
  51. }
  52. //protocol_recv_frame(_uart_index(uart->uart_com), (char *)uart->rx_frame, uart->rx_length);
  53. return true;
  54. }
  55. static void shark_uart_rx(shark_uart_t *uart){
  56. while(1) {
  57. u8 data;
  58. update_dma_w_pos(uart);
  59. if (circle_get_one_data(&uart->rx_queue, &data) != 1) {
  60. break;
  61. }
  62. switch(data){
  63. case CH_START:
  64. uart->rx_length = 0;
  65. uart->escape = false;
  66. uart->start = true;
  67. break;
  68. case CH_END:
  69. if (uart->rx_length > 2 && uart->rx_length != 0xFFFF){
  70. uart->rx_length -= 2; //skip crc
  71. shark_uart_on_rx_frame(uart);
  72. }
  73. uart->rx_length = 0xFFFF;
  74. uart->start = false;
  75. break;
  76. case CH_ESC:
  77. uart->escape = true;
  78. break;
  79. default:
  80. if (uart->escape) {
  81. uart->escape = false;
  82. switch (data) {
  83. case CH_ESC_START:
  84. data = CH_START;
  85. break;
  86. case CH_ESC_END:
  87. data = CH_END;
  88. break;
  89. case CH_ESC_ESC:
  90. data = CH_ESC;
  91. break;
  92. default:
  93. data = 0xFF;
  94. }
  95. }
  96. if (uart->rx_length < sizeof(uart->rx_frame)) {
  97. uart->rx_frame[uart->rx_length] = data;
  98. uart->rx_length++;
  99. } else {
  100. uart->rx_length = 0xFFFF;
  101. }
  102. }
  103. }
  104. }
  105. static void shark_uart_dma_tx(shark_uart_t *uart)
  106. {
  107. u32 value = DMA_CHCTL(SHARK_UART0_tx_dma, uart->tx_dma_ch);
  108. if (value & DMA_CHXCTL_CHEN) {
  109. if (SET != dma_flag_get(SHARK_UART0_tx_dma, uart->tx_dma_ch, DMA_FLAG_FTF)) {
  110. return;
  111. }
  112. byte_queue_skip(&uart->tx_queue, uart->tx_length);
  113. DMA_CHCTL(SHARK_UART0_tx_dma, uart->tx_dma_ch) = value & (~DMA_CHXCTL_CHEN);
  114. }
  115. uart->tx_length = byte_queue_peek(&uart->tx_queue);
  116. if (uart->tx_length > 0) {
  117. DMA_CHCNT(SHARK_UART0_tx_dma, uart->tx_dma_ch) = uart->tx_length;
  118. DMA_CHMADDR(SHARK_UART0_tx_dma, uart->tx_dma_ch) = (u32) byte_queue_head(&uart->tx_queue);
  119. dma_flag_clear(SHARK_UART0_tx_dma, uart->tx_dma_ch, DMA_FLAG_FTF);
  120. DMA_CHCTL(SHARK_UART0_tx_dma, uart->tx_dma_ch) = value | DMA_CHXCTL_CHEN;
  121. }
  122. }
  123. static void shark_uart_write(shark_uart_t *uart, const u8 *buff, u16 size)
  124. {
  125. while (size > 0) {
  126. u16 length = byte_queue_write(&uart->tx_queue, buff, size);
  127. if (length == size) {
  128. shark_uart_dma_tx(uart);
  129. break;
  130. }
  131. shark_uart_dma_tx(uart);
  132. buff += length;
  133. size -= length;
  134. }
  135. }
  136. static void shark_uart_write_byte(shark_uart_t *uart, u8 value)
  137. {
  138. shark_uart_write(uart, &value, 1);
  139. }
  140. static void shark_uart_tx_dma_init(shark_uart_t *uart){
  141. dma_parameter_struct dma_init_struct;
  142. rcu_periph_clock_enable(_uart_index(uart->uart_com)== SHARK_UART0?SHARK_UART0_tx_dma_clk:SHARK_UART0_tx_dma_clk);
  143. dma_deinit(SHARK_UART0_tx_dma, uart->tx_dma_ch);
  144. dma_init_struct.direction = DMA_MEMORY_TO_PERIPHERAL;
  145. dma_init_struct.memory_inc = DMA_MEMORY_INCREASE_ENABLE;
  146. dma_init_struct.memory_width = DMA_MEMORY_WIDTH_8BIT;
  147. dma_init_struct.periph_addr = (u32) &USART_DATA(uart->uart_com);
  148. dma_init_struct.periph_inc = DMA_PERIPH_INCREASE_DISABLE;
  149. dma_init_struct.periph_width = DMA_PERIPHERAL_WIDTH_8BIT;
  150. dma_init_struct.priority = DMA_PRIORITY_ULTRA_HIGH;
  151. dma_init(SHARK_UART0_tx_dma, uart->tx_dma_ch, &dma_init_struct);
  152. dma_circulation_disable(SHARK_UART0_tx_dma, uart->tx_dma_ch);
  153. dma_memory_to_memory_disable(SHARK_UART0_tx_dma, uart->tx_dma_ch);
  154. usart_dma_transmit_config(uart->uart_com, USART_DENT_ENABLE);
  155. #if 0
  156. if (uart->tx_dma_ch == DMA_CH1) {
  157. nvic_irq_enable(DMA_Channel1_2_IRQn ,4, 0);
  158. }else {
  159. nvic_irq_enable(DMA_Channel3_4_IRQn ,4, 0);
  160. }
  161. dma_interrupt_enable(uart->tx_dma_ch, DMA_INT_FTF);
  162. #endif
  163. }
  164. #if ENABLE_RX_DMA==1
  165. static void shark_uart_rx_dma_init(shark_uart_t *uart){
  166. dma_parameter_struct dma_init_struct;
  167. rcu_periph_clock_enable(_uart_index(uart->uart_com)== SHARK_UART0?SHARK_UART0_rx_dma_clk:SHARK_UART0_rx_dma_clk);
  168. dma_deinit(SHARK_UART0_rx_dma, uart->rx_dma_ch);
  169. dma_init_struct.direction = DMA_PERIPHERAL_TO_MEMORY;
  170. dma_init_struct.memory_inc = DMA_MEMORY_INCREASE_ENABLE;
  171. dma_init_struct.memory_width = DMA_MEMORY_WIDTH_8BIT;
  172. dma_init_struct.memory_addr = (u32)uart->rx_queue.buffer;
  173. dma_init_struct.number = uart->rx_queue.buffer_len;
  174. dma_init_struct.periph_addr = (u32) &USART_DATA(uart->uart_com);
  175. dma_init_struct.periph_inc = DMA_PERIPH_INCREASE_DISABLE;
  176. dma_init_struct.periph_width = DMA_PERIPHERAL_WIDTH_8BIT;
  177. dma_init_struct.priority = DMA_PRIORITY_ULTRA_HIGH;
  178. dma_init(SHARK_UART0_rx_dma, uart->rx_dma_ch, &dma_init_struct);
  179. dma_circulation_enable(SHARK_UART0_rx_dma, uart->rx_dma_ch);
  180. dma_memory_to_memory_disable(SHARK_UART0_rx_dma, uart->rx_dma_ch);
  181. dma_channel_enable(SHARK_UART0_rx_dma, uart->rx_dma_ch);
  182. usart_dma_receive_config(uart->uart_com, USART_DENR_ENABLE);
  183. }
  184. #endif
  185. static void shark_uart_pin_init(shark_uart_t *uart){
  186. rcu_periph_clock_enable(SHARK_UART0_clk);
  187. rcu_periph_clock_enable(SHARK_UART0_rx_gpio_clk);
  188. rcu_periph_clock_enable(SHARK_UART0_tx_gpio_clk);
  189. gpio_init(SHARK_UART0_tx_port, GPIO_MODE_OUT_PP,GPIO_OSPEED_50MHZ,SHARK_UART0_tx_pin);
  190. gpio_init(SHARK_UART0_rx_port, GPIO_MODE_IN_FLOATING,GPIO_OSPEED_50MHZ,SHARK_UART0_rx_pin);
  191. }
  192. static void shark_uart_pin_deinit(shark_uart_t *uart){
  193. if (_uart_index(uart->uart_com) == SHARK_UART0) {
  194. gpio_init(SHARK_UART0_tx_port, GPIO_MODE_IN_FLOATING,GPIO_OSPEED_50MHZ,SHARK_UART0_tx_pin);
  195. gpio_init(SHARK_UART0_rx_port, GPIO_MODE_IN_FLOATING,GPIO_OSPEED_50MHZ,SHARK_UART0_rx_pin);
  196. }
  197. }
  198. static void shark_uart_device_init(shark_uart_t *uart){
  199. usart_deinit(uart->uart_com);
  200. usart_baudrate_set(uart->uart_com, SHARK_UART_BAUDRATE);
  201. usart_word_length_set(uart->uart_com, USART_WL_8BIT);
  202. usart_stop_bit_set(uart->uart_com, USART_STB_1BIT);
  203. usart_parity_config(uart->uart_com, USART_PM_NONE);
  204. usart_hardware_flow_rts_config(uart->uart_com, USART_RTS_DISABLE);
  205. usart_hardware_flow_cts_config(uart->uart_com, USART_CTS_DISABLE);
  206. usart_receive_config(uart->uart_com, USART_RECEIVE_ENABLE);
  207. usart_transmit_config(uart->uart_com, USART_TRANSMIT_ENABLE);
  208. #if ENABLE_RX_DMA==0
  209. usart_lin_mode_disable(uart->uart_com);
  210. usart_receiver_timeout_disable(uart->uart_com);
  211. usart_interrupt_enable(uart->uart_com,USART_INT_RBNE);
  212. #endif
  213. }
  214. static u32 shark_uart_handler(void)
  215. {
  216. shark_uart_t *uart = _shark_uart + SHARK_UART0;
  217. if (uart->uart_com != 0) {
  218. shark_uart_rx(uart);
  219. shark_uart_dma_tx(uart);
  220. }
  221. #if UART_NUM==2
  222. uart = _shark_uart + SHARK_UART1;
  223. if (uart->uart_com != 0) {
  224. shark_uart_rx(uart);
  225. shark_uart_dma_tx(uart);
  226. }
  227. #endif
  228. return 0;
  229. }
  230. void shark_uart_flush(void){
  231. shark_uart_t *uart = _shark_uart + SHARK_UART0;
  232. if (uart->uart_com != 0) {
  233. while(!byte_queue_empty(&uart->tx_queue)) {
  234. shark_uart_dma_tx(uart);
  235. }
  236. }
  237. #if UART_NUM==2
  238. uart = _shark_uart + SHARK_UART1;
  239. if (uart->uart_com != 0) {
  240. while(!byte_queue_empty(&uart->tx_queue)) {
  241. shark_uart_dma_tx(uart);
  242. }
  243. }
  244. #endif
  245. }
  246. #if 0
  247. void DMA_Channel1_2_IRQHandler(void){
  248. shark_uart_t *uart = _shark_uart + SHARK_UART0;
  249. if (dma_interrupt_flag_get(uart->tx_dma_ch, DMA_INT_FLAG_FTF) != RESET){
  250. shark_uart_dma_tx(uart);
  251. dma_interrupt_flag_clear(uart->tx_dma_ch, DMA_INT_FLAG_FTF);
  252. }
  253. }
  254. void DMA_Channel3_4_IRQHandler(void){
  255. shark_uart_t *uart = _shark_uart + SHARK_UART1;
  256. if (dma_interrupt_flag_get(uart->tx_dma_ch, DMA_INT_FLAG_FTF) != RESET){
  257. shark_uart_dma_tx(uart);
  258. dma_interrupt_flag_clear(uart->tx_dma_ch, DMA_INT_FLAG_FTF);
  259. }
  260. }
  261. #endif
  262. static u8 *tx_cache_addr(uart_enum_t uart_no){
  263. #if UART_NUM==2
  264. return (uart_no == SHARK_UART0)?shark_uart0_tx_cache:shark_uart1_tx_cache;
  265. #else
  266. return shark_uart0_tx_cache;
  267. #endif
  268. }
  269. static u8 *rx_cache_addr(uart_enum_t uart_no){
  270. #if UART_NUM==2
  271. return (uart_no == SHARK_UART0)?shark_uart0_rx_cache:shark_uart1_rx_cache;
  272. #else
  273. return shark_uart0_rx_cache;
  274. #endif
  275. }
  276. void shark_uart_deinit(uart_enum_t uart_no){
  277. shark_uart_t *uart = _shark_uart + uart_no;
  278. if (uart->uart_com != 0) {
  279. usart_disable(uart->uart_com);
  280. usart_deinit(uart->uart_com);
  281. rcu_periph_clock_disable(uart_no == SHARK_UART0?SHARK_UART0_clk:SHARK_UART0_clk);
  282. dma_channel_disable(SHARK_UART0_rx_dma, uart->rx_dma_ch);
  283. dma_channel_disable(SHARK_UART0_tx_dma, uart->tx_dma_ch);
  284. rcu_periph_clock_disable(uart_no == SHARK_UART0?SHARK_UART0_tx_dma_clk:SHARK_UART0_tx_dma_clk);
  285. rcu_periph_clock_disable(uart_no == SHARK_UART0?SHARK_UART0_rx_dma_clk:SHARK_UART0_rx_dma_clk);
  286. shark_uart_pin_deinit(uart);
  287. }
  288. if (uart_no == SHARK_UART0) {
  289. #if ENABLE_RX_DMA==0
  290. nvic_irq_disable(USART0_IRQn);
  291. #endif
  292. }else {
  293. #if ENABLE_RX_DMA==0
  294. nvic_irq_disable(USART1_IRQn);
  295. #endif
  296. }
  297. }
  298. bool shark_uart_timeout(void){
  299. #if UART_NUM==2
  300. return (_shark_uart[0].uart_no_data && _shark_uart[1].uart_no_data)?TRUE:FALSE;
  301. #else
  302. return (_shark_uart[0].uart_no_data)?TRUE:FALSE;
  303. #endif
  304. }
  305. void shark_uart_init(uart_enum_t uart_no)
  306. {
  307. shark_uart_t *uart = _shark_uart + uart_no;
  308. uart->escape = false;
  309. uart->rx_length = 0;
  310. uart->tx_length = 0;
  311. uart->uart_com = (uart_no == SHARK_UART0)?SHARK_UART0_com:SHARK_UART0_com;
  312. circle_buffer_init(&uart->rx_queue, rx_cache_addr(uart_no), SHARK_UART_RX_MEM_SIZE);
  313. byte_queue_init(&uart->tx_queue,tx_cache_addr(uart_no), SHARK_UART_TX_MEM_SIZE);
  314. uart->rx_dma_ch = (uart_no == SHARK_UART0)?SHARK_UART0_rx_dma_ch:SHARK_UART0_rx_dma_ch;
  315. uart->tx_dma_ch = (uart_no == SHARK_UART0)?SHARK_UART0_tx_dma_ch:SHARK_UART0_tx_dma_ch;
  316. shark_uart_pin_init(uart);
  317. shark_uart_device_init(uart);
  318. #if ENABLE_RX_DMA==1
  319. shark_uart_rx_dma_init(uart);
  320. #endif
  321. shark_uart_tx_dma_init(uart);
  322. usart_enable(uart->uart_com);
  323. if (_uart_task.handler == NULL) {
  324. _uart_task.handler = shark_uart_handler;
  325. task_add(&_uart_task);
  326. }
  327. if (uart_no == SHARK_UART0) {
  328. #if ENABLE_RX_DMA==0
  329. nvic_irq_enable(UART3_IRQn, 3, 0);
  330. #endif
  331. }else {
  332. #if ENABLE_RX_DMA==0
  333. nvic_irq_enable(USART1_IRQn, 3, 0);
  334. #endif
  335. }
  336. uart->uart_no_data = false;
  337. }
  338. #if ENABLE_RX_DMA==0
  339. void USART3_IRQHandler(void){
  340. if(usart_flag_get(USART0, USART_FLAG_RBNE) == SET){
  341. shark_uart_t *uart = _shark_uart + SHARK_UART0;
  342. u8 c = usart_data_receive(USART0);
  343. circle_put_one_data(&uart->rx_queue, c);
  344. }
  345. }
  346. #endif
  347. static void shark_uart_write_byte_esc(shark_uart_t *uart, u8 value)
  348. {
  349. switch (value) {
  350. case CH_START:
  351. shark_uart_write_byte(uart, CH_ESC);
  352. value = CH_ESC_START;
  353. break;
  354. case CH_END:
  355. shark_uart_write_byte(uart, CH_ESC);
  356. value = CH_ESC_END;
  357. break;
  358. case CH_ESC:
  359. shark_uart_write_byte(uart, CH_ESC);
  360. value = CH_ESC_ESC;
  361. break;
  362. }
  363. shark_uart_write_byte(uart, value);
  364. }
  365. static void shark_uart_write_esc(shark_uart_t *uart, const u8 *buff, u16 length)
  366. {
  367. const u8 *buff_end;
  368. for (buff_end = buff + length; buff < buff_end; buff++) {
  369. shark_uart_write_byte_esc(uart, *buff);
  370. }
  371. }
  372. static void shark_uart_tx_start(shark_uart_t *uart)
  373. {
  374. shark_uart_write_byte(uart, CH_START);
  375. uart->tx_crc16 = 0;
  376. }
  377. static void shark_uart_tx_continue(shark_uart_t *uart, const void *buff, u16 length)
  378. {
  379. shark_uart_write_esc(uart, (const u8 *) buff, length);
  380. uart->tx_crc16 = crc16_update(uart->tx_crc16, (const u8 *) buff, length);
  381. }
  382. static void shark_uart_tx_end(shark_uart_t *uart)
  383. {
  384. shark_uart_write_esc(uart, (u8 *)&uart->tx_crc16, sizeof(uart->tx_crc16));
  385. shark_uart_write_byte(uart, CH_END);
  386. }
  387. void shark_uart_write_frame(uart_enum_t uart_no, uint8_t *bytes, int len){
  388. shark_uart_t *uart = _shark_uart + uart_no;
  389. shark_uart_tx_start(uart);
  390. shark_uart_tx_continue(uart, bytes, len);
  391. shark_uart_tx_end(uart);
  392. }
  393. void shark_uart_frame_start(uart_enum_t uart_no, uint8_t *bytes, int len){
  394. shark_uart_t *uart = _shark_uart + uart_no;
  395. shark_uart_tx_start(uart);
  396. shark_uart_tx_continue(uart, bytes, len);
  397. }
  398. void shark_uart_frame_continue(uart_enum_t uart_no, uint8_t *bytes, int len){
  399. shark_uart_t *uart = _shark_uart + uart_no;
  400. shark_uart_tx_continue(uart, bytes, len);
  401. }
  402. void shark_uart_frame_end(uart_enum_t uart_no){
  403. shark_uart_tx_end(_shark_uart + uart_no);
  404. }
  405. void shark_uart_write_bytes(uart_enum_t uart_no, u8 *buff, u16 size){
  406. shark_uart_write(_shark_uart + uart_no, buff, size);
  407. }
  408. #if LOG_UART==1
  409. int fputc(int c, FILE *fp){
  410. shark_uart_write_byte(_shark_uart+SHARK_UART0, (u8)c);
  411. return 1;
  412. }
  413. #endif