misc.c 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  1. #include "misc.h"
  2. #include "FreeRTOS.h"
  3. #include "task.h"
  4. #include "mux.h"
  5. #include "mb.h"
  6. #include "mbport.h"
  7. #include "at32f403a_407_board.h"
  8. #include <stdio.h>
  9. char recv_buf[1024] = {0};
  10. // TIM1, 8, 9, 10, 11 тактируются от 120 МГц
  11. // TIM2, 3, 4, 5, 6, 7, 12, 13, 14 тактируются от 240 МГц
  12. void nop(uint32_t cnt);
  13. void modbus_tim_init(void)
  14. {
  15. crm_clocks_freq_type crm_clocks_freq_struct = {0};
  16. crm_periph_clock_enable(CRM_TMR7_PERIPH_CLOCK, TRUE);
  17. crm_clocks_freq_get(&crm_clocks_freq_struct);
  18. tmr_base_init(TMR7, 1, 5999);
  19. tmr_cnt_dir_set(TMR7, TMR_COUNT_UP);
  20. tmr_flag_clear(TMR7, TMR_OVF_FLAG);
  21. nvic_priority_group_config(NVIC_PRIORITY_GROUP_4);
  22. nvic_irq_enable(TMR7_GLOBAL_IRQn, 5, 0);
  23. tmr_counter_enable(TMR7, TRUE);
  24. tmr_interrupt_enable(TMR7, TMR_OVF_INT, TRUE);
  25. }
  26. //
  27. void modbus_init(void)
  28. {
  29. const UCHAR ucSlaveID[] = {0xAA, 0xBB, 0xCC};
  30. uint32_t baud = 115200;
  31. eMBParity par = MB_PAR_NONE;
  32. UCHAR mb_addr = 1;
  33. unsigned int stop_bits = 1;
  34. #if 1
  35. eMBInit(MB_RTU, mb_addr, 4, baud, par, stop_bits);
  36. eMBSetSlaveID(0x34, TRUE, ucSlaveID, 3);
  37. eMBEnable();
  38. #endif
  39. }
  40. //
  41. void test_modbus_port_init(void)
  42. {
  43. gpio_init_type gpio_init_struct;
  44. crm_periph_clock_enable(CRM_USART3_PERIPH_CLOCK, TRUE);
  45. crm_periph_clock_enable(CRM_GPIOD_PERIPH_CLOCK, TRUE);
  46. crm_periph_clock_enable(CRM_IOMUX_PERIPH_CLOCK, TRUE);
  47. gpio_pin_remap_config(USART3_GMUX_0011, TRUE);
  48. gpio_default_para_init(&gpio_init_struct);
  49. // configure the uart tx pin
  50. gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
  51. gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
  52. gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
  53. gpio_init_struct.gpio_pins = GPIO_PINS_8;
  54. gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
  55. gpio_init(GPIOD, &gpio_init_struct);
  56. // configure the uart rx pin
  57. gpio_init_struct.gpio_mode = GPIO_MODE_INPUT;
  58. gpio_init_struct.gpio_pins = GPIO_PINS_9;
  59. gpio_init_struct.gpio_pull = GPIO_PULL_UP;
  60. gpio_init(GPIOD, &gpio_init_struct);
  61. // configure the uart rx pin
  62. gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
  63. gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
  64. gpio_init_struct.gpio_mode = GPIO_MODE_OUTPUT;
  65. gpio_init_struct.gpio_pins = GPIO_PINS_10;
  66. gpio_init_struct.gpio_pull = GPIO_PULL_UP;
  67. gpio_init(GPIOD, &gpio_init_struct);
  68. MB_RX_ENABLE;
  69. // configure uart param
  70. usart_init(USART3, 115200, USART_DATA_8BITS, USART_STOP_1_BIT);
  71. usart_parity_selection_config(USART3, USART_PARITY_NONE);
  72. usart_flag_clear(USART3, USART_RDBF_FLAG);
  73. usart_interrupt_enable(USART3, USART_RDBF_INT, TRUE);
  74. usart_receiver_enable(USART3, TRUE);
  75. usart_transmitter_enable(USART3, TRUE);
  76. usart_enable(USART3, TRUE);
  77. nvic_priority_group_config(NVIC_PRIORITY_GROUP_4);
  78. nvic_irq_enable(USART3_IRQn, 5, 0);
  79. }
  80. void nop(uint32_t cnt)
  81. {
  82. for (uint32_t i = 0; i < cnt; i++)
  83. __NOP();
  84. }
  85. // PA_2 (pin_25)
  86. void mb_test_gpio_init(void)
  87. {
  88. gpio_init_type gpio_init_struct;
  89. crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
  90. gpio_default_para_init(&gpio_init_struct);
  91. // configure the uart tx pin
  92. gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
  93. gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
  94. gpio_init_struct.gpio_mode = GPIO_MODE_OUTPUT;
  95. gpio_init_struct.gpio_pins = GPIO_PINS_2;
  96. gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
  97. gpio_init(GPIOA, &gpio_init_struct);
  98. }
  99. //
  100. void pwm_test(void)
  101. {
  102. tmr_output_config_type tmr_oc_init_structure;
  103. pwm_gpio_config();
  104. uint16_t prescaler_value = 0;
  105. uint16_t pulse = 0;
  106. uint16_t timer_period = 10000 - 1;
  107. // Режим PWM
  108. crm_periph_clock_enable(CRM_TMR9_PERIPH_CLOCK, TRUE);
  109. prescaler_value = (uint16_t)(system_core_clock / 10000) - 1;
  110. tmr_base_init(TMR9, timer_period, prescaler_value);
  111. pulse = (uint16_t)(((uint32_t) 70 * (timer_period - 1)) / 100); // 70%
  112. tmr_cnt_dir_set(TMR9, TMR_COUNT_UP);
  113. tmr_clock_source_div_set(TMR9, TMR_CLOCK_DIV1);
  114. tmr_output_default_para_init(&tmr_oc_init_structure);
  115. tmr_oc_init_structure.oc_mode = TMR_OUTPUT_CONTROL_PWM_MODE_A;
  116. tmr_oc_init_structure.oc_idle_state = FALSE;
  117. tmr_oc_init_structure.oc_polarity = TMR_OUTPUT_ACTIVE_HIGH;
  118. tmr_oc_init_structure.oc_output_state = TRUE;
  119. tmr_output_channel_config(TMR9, TMR_SELECT_CHANNEL_2, &tmr_oc_init_structure);
  120. tmr_channel_value_set(TMR9, TMR_SELECT_CHANNEL_2, pulse);
  121. tmr_output_channel_buffer_enable(TMR9, TMR_SELECT_CHANNEL_2, TRUE);
  122. tmr_period_buffer_enable(TMR12, TRUE);
  123. nvic_irq_enable(TMR1_BRK_TMR9_IRQn, 5, 0);
  124. tmr_interrupt_enable(TMR9, TMR_C2_INT, TRUE);
  125. tmr_counter_enable(TMR9, TRUE);
  126. }
  127. //
  128. void pwm_gpio_config(void)
  129. {
  130. gpio_init_type gpio_init_struct;
  131. crm_periph_clock_enable(CRM_GPIOB_PERIPH_CLOCK, TRUE);
  132. gpio_default_para_init(&gpio_init_struct);
  133. #if 0
  134. // Пин в режиме PWM таймера
  135. gpio_init_struct.gpio_pins = GPIO_PINS_15;
  136. gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
  137. gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
  138. gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
  139. gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
  140. gpio_init(GPIOB, &gpio_init_struct);
  141. #endif
  142. gpio_init_struct.gpio_pins = GPIO_PINS_15;
  143. gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
  144. gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
  145. gpio_init_struct.gpio_mode = GPIO_MODE_OUTPUT;
  146. gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
  147. gpio_init(GPIOB, &gpio_init_struct);
  148. // Простой выход
  149. gpio_init_struct.gpio_pins = GPIO_PINS_13;
  150. gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
  151. gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
  152. gpio_init_struct.gpio_mode = GPIO_MODE_OUTPUT;
  153. gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
  154. gpio_init(GPIOB, &gpio_init_struct);
  155. }
  156. #if 0
  157. // Для отладки PWM режимов TMR_12
  158. void TMR8_BRK_TMR12_IRQHandler(void)
  159. {
  160. if(tmr_flag_get(TMR12, TMR_C2_FLAG) != RESET)
  161. {
  162. tmr_flag_clear(TMR12, TMR_C2_FLAG);
  163. GPIOB->odt ^= GPIO_PINS_13;
  164. }
  165. }
  166. #endif
  167. #if 0
  168. void USART3_IRQHandler(void)
  169. {
  170. char rx_byte;
  171. static int counter = 0;
  172. if (usart_flag_get(USART3, USART_RDBF_FLAG) != RESET) {
  173. rx_byte = USART3->dt;
  174. PRINT_UART->dt = ((uint16_t)rx_byte & 0x01FF);
  175. recv_buf[counter++] = rx_byte;
  176. if (counter == 1024)
  177. counter = 0;
  178. MB_TX_ENABLE;
  179. nop(10000);
  180. while(usart_flag_get(USART3, USART_TDBE_FLAG) == RESET);
  181. USART3->dt = ((uint16_t)(rx_byte + 1) & 0x01FF);
  182. while(usart_flag_get(USART3, USART_TDC_FLAG) == RESET);
  183. MB_RX_ENABLE;
  184. }
  185. }
  186. #endif
  187. #if 0
  188. //
  189. void TMR7_GLOBAL_IRQHandler(void)
  190. {
  191. if(tmr_flag_get(TMR7, TMR_OVF_FLAG) != RESET)
  192. {
  193. tmr_flag_clear(TMR7, TMR_OVF_FLAG);
  194. mux_led_test_toggle();
  195. }
  196. }
  197. #endif