bsp_huart.c 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. #include "include.h"
  2. #include "bsp_huart.h"
  3. #include "api.h"
  4. #include "driver_com.h"
  5. #include "driver_hsuart.h"
  6. #include "ble_init.h"
  7. #if LE_DUT_UART_EN
  8. //#define LE_FCC_TONE_EN
  9. #ifdef LE_FCC_TONE_EN
  10. static fcc_cfg_t fcc_cfg;
  11. #endif
  12. ALIGNED(4)
  13. u8 huart_buffer[128];
  14. AT(.com_text.huart.text)
  15. void huart_wait_txdone(void)
  16. {
  17. while (hsuart_get_flag(HSUART_IT_TX) == RESET);
  18. }
  19. ///设置HUART波特率
  20. AT(.text.huart.huart_set_baudrate)
  21. void huart_set_baudrate(uint baud_rate)
  22. {
  23. hsuart_baud_config(baud_rate);
  24. }
  25. ///HUART 发送1Byte数据
  26. AT(.com_text.huart.text)
  27. void huart_putchar(const char ch)
  28. {
  29. while (hsuart_get_flag(HSUART_IT_TX) == RESET);
  30. hsuart_send_data((uint16_t)ch);
  31. }
  32. ///HUART 获取RXFIFO中的数据个数
  33. AT(.com_text.huart.huart_getchar)
  34. uint huart_get_rxcnt(void)
  35. {
  36. return hsuart_get_fifo_counter();
  37. }
  38. ///HUART 获取1Byte数据
  39. AT(.com_text.huart.huart_getchar)
  40. char huart_getchar(void)
  41. {
  42. char data = 0;
  43. hsuart_receive_data_from_fifo((uint8_t *)&data, 1);
  44. return data;
  45. }
  46. ///HUART 发送数据
  47. AT(.com_text.huart.text)
  48. void huart_tx(const void *buf, uint len)
  49. {
  50. huart_wait_txdone();
  51. if ((u32)buf >= 0x10000000) {
  52. HSUT0CON &= ~BIT(7); //buf mode
  53. const char *txbuf = buf;
  54. while (len--) {
  55. huart_putchar(*txbuf++);
  56. }
  57. } else {
  58. HSUT0CON |= BIT(7); //dma mode
  59. hsuart_dma_start(HSUT_TRANSMIT, DMA_ADR(buf), len);
  60. }
  61. }
  62. void bt_uart_init(void)
  63. {
  64. gpio_init_typedef gpio_init_structure;
  65. hsuart_init_typedef hsuart_init_struct;
  66. clk_gate0_cmd(CLK_GATE0_HSUART, CLK_EN);
  67. /************************************ GPIO Init ************************************/
  68. if (ble_get_work_mode() == MODE_FCC_TEST) {
  69. gpio_init_structure.gpio_pin = HSUART_FCC_PIN_SEL;
  70. gpio_init_structure.gpio_dir = GPIO_DIR_INPUT;
  71. gpio_init_structure.gpio_fen = GPIO_FEN_PER;
  72. gpio_init_structure.gpio_fdir = GPIO_FDIR_MAP;
  73. gpio_init_structure.gpio_mode = GPIO_MODE_DIGITAL;
  74. gpio_init_structure.gpio_pupd = GPIO_PUPD_PU10K;
  75. gpio_init(HSUART_FCC_PORT_SEL, &gpio_init_structure);
  76. /* NOTE: make sure printf_io isn't using PB3 */
  77. gpio_func_mapping_clear(HSUART_FCC_PORT_SEL, HSUART_FCC_PIN_SEL);
  78. gpio_func_mapping_config(HSUART_FCC_PORT_SEL, HSUART_FCC_PIN_SEL, GPIO_CROSSBAR_IN_HURRX);
  79. gpio_func_mapping_config(HSUART_FCC_PORT_SEL, HSUART_FCC_PIN_SEL, GPIO_CROSSBAR_OUT_HURTX);
  80. } else if (ble_get_work_mode() == MODE_BQB_RF_BLE) {
  81. gpio_init_structure.gpio_pin = HSUART_BQB_RX_PIN_SEL;
  82. gpio_init_structure.gpio_dir = GPIO_DIR_INPUT;
  83. gpio_init_structure.gpio_fen = GPIO_FEN_PER;
  84. gpio_init_structure.gpio_fdir = GPIO_FDIR_SELF;
  85. gpio_init_structure.gpio_mode = GPIO_MODE_DIGITAL;
  86. gpio_init_structure.gpio_pupd = GPIO_PUPD_PU10K;
  87. gpio_init(HSUART_BQB_RX_PORT_SEL, &gpio_init_structure);
  88. gpio_init_structure.gpio_pin = HSUART_BQB_TX_PIN_SEL;
  89. gpio_init_structure.gpio_dir = GPIO_DIR_OUTPUT;
  90. gpio_init_structure.gpio_fdir = GPIO_FDIR_SELF;
  91. gpio_init_structure.gpio_drv = GPIO_DRV_6MA;
  92. gpio_init(HSUART_BQB_TX_PORT_SEL, &gpio_init_structure);
  93. gpio_func_mapping_config(HSUART_BQB_RX_PORT_SEL, HSUART_BQB_RX_PIN_SEL, GPIO_CROSSBAR_IN_HURRX);
  94. gpio_func_mapping_config(HSUART_BQB_TX_PORT_SEL, HSUART_BQB_TX_PIN_SEL, GPIO_CROSSBAR_OUT_HURTX);
  95. }
  96. /*********************************** HSUART Init ***********************************/
  97. if (ble_get_work_mode() == MODE_FCC_TEST) {
  98. hsuart_init_struct.baud = HSUART_FCC_BAUD;
  99. hsuart_init_struct.one_line_en = HSUT_ONELINE_EN;
  100. } else if (ble_get_work_mode() == MODE_BQB_RF_BLE) {
  101. hsuart_init_struct.baud = HSUART_BQB_BAUD;
  102. hsuart_init_struct.one_line_en = HSUT_ONELINE_DIS;
  103. }
  104. hsuart_init_struct.tx_mode = HSUT_TX_DMA_MODE;
  105. hsuart_init_struct.rx_mode = HSUT_RX_DMA_MODE;
  106. hsuart_init_struct.tx_stop_bit = HSUT_STOP_BIT_2BIT;
  107. hsuart_init_struct.tx_word_len = HSUT_TX_LENGTH_8b;
  108. hsuart_init_struct.rx_word_len = HSUT_RX_LENGTH_8b;
  109. hsuart_init_struct.clk_source = HSUT_24M_CLK;
  110. hsuart_init_struct.rx_dma_buf_mode = HSUT_DMA_BUF_LOOP;
  111. hsuart_init(&hsuart_init_struct);
  112. hsuart_clear_flag(HSUART_IT_RX);
  113. hsuart_cmd(HSUT_TRANSMIT | HSUT_RECEIVE, ENABLE);
  114. hsuart_dma_start(HSUT_RECEIVE, (uint32_t)huart_buffer, 128);
  115. #ifdef LE_FCC_TONE_EN
  116. if (ble_get_work_mode() == MODE_FCC_TEST) {
  117. fcc_cfg.rf_mode = FCC_TX_TONE;
  118. fcc_cfg.tx_power = 7;
  119. fcc_cfg.tx_freq = 1;
  120. fcc_cfg.todo = 1;
  121. ble_fcc_cfg_init(&fcc_cfg);
  122. }
  123. #endif
  124. }
  125. void bt_uart_exit(void)
  126. {
  127. }
  128. #endif