bsp_sensor.c 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. #include "bsp_sensor.h"
  2. #include "gd32f4xx_libopt.h"
  3. #include "string.h"
  4. #include "FreeRTOS.h"
  5. #include "task.h"
  6. static uint8_t sensor_dma_send[20] = {0};
  7. static uint8_t sensor_dma_recive[2][20] = {0};
  8. static usart_t sensor={0};
  9. static int usart_recive(uint8_t *recive);
  10. static int usart_dma_send(uint8_t *send,uint16_t len);
  11. usart_t* get_bsp_sensor()
  12. {
  13. return &sensor;
  14. }
  15. static void sensor_gpio(void)
  16. {
  17. rcu_periph_clock_enable(RCU_GPIOB);
  18. gpio_af_set(GPIOB, GPIO_AF_7, GPIO_PIN_10);
  19. gpio_af_set(GPIOB, GPIO_AF_7, GPIO_PIN_11);
  20. gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_10);
  21. gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_10);
  22. gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_11);
  23. gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_11);
  24. }
  25. static void sensor_dma(void)
  26. {
  27. rcu_periph_clock_enable(RCU_DMA0);
  28. dma_single_data_parameter_struct dma_init_struct;
  29. dma_single_data_para_struct_init(&dma_init_struct);
  30. dma_deinit(DMA0, DMA_CH3);
  31. dma_init_struct.direction = DMA_MEMORY_TO_PERIPH;
  32. dma_init_struct.memory0_addr = (uint32_t)(&sensor_dma_send);
  33. dma_init_struct.memory_inc = DMA_MEMORY_INCREASE_ENABLE;
  34. dma_init_struct.periph_memory_width = DMA_PERIPH_WIDTH_8BIT;
  35. dma_init_struct.number = (uint32_t)(20);
  36. dma_init_struct.periph_addr = ((uint32_t)&USART_DATA(USART2));
  37. dma_init_struct.periph_inc = DMA_PERIPH_INCREASE_DISABLE;
  38. dma_init_struct.priority = DMA_PRIORITY_LOW;
  39. dma_single_data_mode_init(DMA0, DMA_CH3, &dma_init_struct);
  40. dma_deinit(DMA0, DMA_CH1);
  41. dma_init_struct.direction = DMA_PERIPH_TO_MEMORY;
  42. dma_init_struct.memory0_addr = (uint32_t)(&sensor_dma_recive[0][0]);
  43. dma_init_struct.memory_inc = DMA_MEMORY_INCREASE_ENABLE;
  44. dma_init_struct.periph_memory_width = DMA_PERIPH_WIDTH_8BIT;
  45. dma_init_struct.number = (20);
  46. dma_init_struct.periph_addr = ((uint32_t)&USART_DATA(USART2));
  47. dma_init_struct.periph_inc = DMA_PERIPH_INCREASE_DISABLE;
  48. dma_init_struct.priority = DMA_PRIORITY_MEDIUM;
  49. dma_single_data_mode_init(DMA0, DMA_CH1, &dma_init_struct);
  50. dma_circulation_disable(DMA0, DMA_CH1);
  51. dma_channel_subperipheral_select(DMA0, DMA_CH1, DMA_SUBPERI4);
  52. usart_dma_receive_config(USART2,USART_RECEIVE_DMA_ENABLE);
  53. dma_circulation_disable(DMA0, DMA_CH3);
  54. dma_channel_subperipheral_select(DMA0, DMA_CH3, DMA_SUBPERI4);
  55. usart_dma_transmit_config(USART2,USART_TRANSMIT_DMA_ENABLE);
  56. // dma_flag_clear(DMA0,DMA_CH5,DMA_FLAG_FTF);
  57. // dma_flag_clear(DMA0,DMA_CH6,DMA_FLAG_FTF);
  58. //dma_channel_enable(DMA0, DMA_CH6);
  59. dma_channel_enable(DMA0, DMA_CH1);
  60. }
  61. static void sensor_usart(uint32_t baund)
  62. {
  63. rcu_periph_clock_enable(RCU_USART2);
  64. usart_deinit(USART2);
  65. usart_baudrate_set(USART2, baund);
  66. usart_word_length_set(USART2, USART_WL_8BIT);
  67. usart_stop_bit_set(USART2, USART_STB_1BIT);
  68. usart_parity_config(USART2, USART_PM_NONE);
  69. usart_transmit_config(USART2, USART_TRANSMIT_ENABLE);
  70. usart_receive_config(USART2,USART_RECEIVE_ENABLE);
  71. usart_interrupt_enable(USART2,USART_INT_IDLE);
  72. usart_interrupt_flag_clear(USART2,USART_INT_FLAG_IDLE);
  73. nvic_irq_enable(USART2_IRQn, 5, 4);
  74. usart_enable(USART2);
  75. }
  76. void bsp_sensor_init(void)
  77. {
  78. sensor_gpio();
  79. sensor_usart(9600);
  80. sensor_dma();
  81. sensor.recive = usart_recive;
  82. sensor.send = usart_dma_send;
  83. }
  84. void USART2_IRQHandler(void)
  85. {
  86. uint16_t len= 0;
  87. if(usart_interrupt_flag_get(USART2, USART_INT_FLAG_IDLE)) {
  88. USART_STAT0(USART2);
  89. USART_DATA(USART2);
  90. //fr_printf("???????\r\n");
  91. dma_channel_disable(DMA0, DMA_CH1);
  92. sensor.recive_len = 20 - dma_transfer_number_get(DMA0, DMA_CH1);
  93. sensor.recive_complete = SET;
  94. sensor.curent_recive_id = (sensor.curent_recive_id == 0) ? 1 : 0;
  95. dma_memory_address_config(DMA0, DMA_CH1,DMA_MEMORY_0,(uint32_t)(&sensor_dma_recive[sensor.curent_recive_id][0]));
  96. dma_transfer_number_config(DMA0, DMA_CH1, 20);
  97. usart_dma_receive_config(USART2, USART_RECEIVE_DMA_ENABLE);
  98. dma_flag_clear(DMA0,DMA_CH1,DMA_FLAG_FTF);
  99. dma_channel_enable(DMA0, DMA_CH1);
  100. }
  101. }
  102. static int usart_recive(uint8_t *recive)
  103. {
  104. uint8_t id = sensor.curent_recive_id == 1 ? 0 : 1;
  105. memcpy(recive,&sensor_dma_recive[id][0],sensor.recive_len);
  106. sensor.recive_complete = RESET;
  107. //fr_printf("recive!!!!!!!! recive_len = %d\r\n",sensor.recive_len);
  108. // for(int i = 0; i < sensor.recive_len;i++)
  109. // {
  110. // fr_printf("[%02x] ",recive[i]);
  111. // }
  112. // fr_printf("\r\n");
  113. return sensor.recive_len;
  114. }
  115. static int usart_dma_send(uint8_t *send,uint16_t len)
  116. {
  117. //fr_printf("send!!!!!!!!\n");
  118. // for(int i = 0; i < len;i++)
  119. // {
  120. // fr_printf("<%02x> ",send[i]);
  121. // }
  122. // fr_printf("\r\n");
  123. dma_channel_disable(DMA0,DMA_CH3);
  124. memcpy(sensor_dma_send,send,len);
  125. dma_transfer_number_config(DMA0, DMA_CH3,len);
  126. dma_channel_enable(DMA0,DMA_CH3);
  127. while(!dma_flag_get(DMA0, DMA_CH3, DMA_FLAG_FTF)){
  128. vTaskDelay(1);
  129. }
  130. dma_flag_clear(DMA0, DMA_CH3, DMA_FLAG_FTF);
  131. sensor.recive_complete = RESET;
  132. }