drv_usart_2.c 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. #include "common.h"
  2. #include "drv_usart_2.h"
  3. /* transmit buffer and receive buffer */
  4. static uint8_t tx_buffer[TX_2_BUFFER_SIZE];
  5. static uint8_t rx_buffer[RX_2_BUFFER_SIZE];
  6. /* counter of transmit buffer and receive buffer */
  7. static uint16_t tx_count = 0, rx_count = 0;
  8. /* size of transmit buffer and receive buffer */
  9. static uint32_t /*rx_buffer_size ,*/ tx_buffer_size;
  10. DELAY_COMMON uart2_tout;
  11. void Enable_Uart2_Timer(uint8_t enable,uint16_t timeout)
  12. {
  13. if(enable)
  14. {
  15. uart2_tout.set = 1;
  16. uart2_tout.count = timeout;
  17. }
  18. else
  19. memset(&uart2_tout,0x00,sizeof(uart2_tout));
  20. }
  21. static void Reset_RX_Buffer(void)
  22. {
  23. memset(rx_buffer,0x00,sizeof(rx_buffer));
  24. rx_count = 0;
  25. }
  26. uint16_t Get_RS485_2_Data(uint8_t * dbuf,uint16_t dbuf_len)
  27. {
  28. if(dbuf == NULL || dbuf_len < rx_count)
  29. return 0;
  30. memcpy(dbuf,rx_buffer,rx_count);
  31. dbuf_len = rx_count;
  32. Reset_RX_Buffer();
  33. return dbuf_len;
  34. }
  35. int8_t Send_Data_2_RS485(uint8_t*data,uint16_t size)
  36. {
  37. if(data == NULL || size == 0 || size > sizeof(tx_buffer))
  38. return 0;
  39. memcpy(tx_buffer,data,size);
  40. tx_count = 0;
  41. tx_buffer_size = size;
  42. //
  43. #if 0
  44. do
  45. {
  46. while(RESET == usart_flag_get(USART1, USART_FLAG_TC));
  47. usart_data_transmit(USART1,tx_buffer[tx_count++]);
  48. }while(tx_count < tx_buffer_size);
  49. #else
  50. //while(RESET == USART_GetFlagStatus(USART2, USART_FLAG_TC));
  51. //USART_SendData(USART2,tx_buffer[tx_count++]);
  52. usart_interrupt_enable(USART1, USART_INT_TC);
  53. #endif
  54. return 1;
  55. }
  56. /*
  57. * 函数名:USART2_Config
  58. * 描述 :USART2 GPIO 配置,工作模式配置。9600 8-N-1
  59. * 输入 :无
  60. * 输出 : 无
  61. * 调用 :外部调用
  62. */
  63. void Usart2_Initial(void)
  64. {
  65. /* enable GPIO clock */
  66. rcu_periph_clock_enable(RCU_GPIOA);
  67. rcu_periph_clock_enable(RCU_AF);
  68. /* connect port to USARTx_Tx */
  69. gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_2);
  70. /* connect port to USARTx_Rx */
  71. gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_3);
  72. /* USART configure */
  73. /* enable USART clock */
  74. rcu_periph_clock_enable(RCU_USART1);
  75. usart_deinit(USART1);
  76. usart_baudrate_set(USART1, USART_1_BAUND);
  77. usart_word_length_set(USART1, USART_WL_8BIT);
  78. usart_stop_bit_set(USART1, USART_STB_1BIT);
  79. usart_parity_config(USART1, USART_PM_NONE);
  80. usart_hardware_flow_rts_config(USART1, USART_RTS_DISABLE);
  81. usart_hardware_flow_cts_config(USART1, USART_CTS_DISABLE);
  82. usart_receive_config(USART1, USART_RECEIVE_ENABLE);
  83. usart_transmit_config(USART1, USART_TRANSMIT_ENABLE);
  84. nvic_priority_group_set(NVIC_PRIGROUP_PRE4_SUB0);
  85. nvic_irq_enable(USART1_IRQn, 1, 0);
  86. usart_interrupt_enable(USART1, USART_INT_RBNE);
  87. #if UART_1_IDAR
  88. /*USART_ClockInitTypeDef USART_ClockInitStruct;
  89. USART_ClockInitStruct.USART_Clock = USART_Clock_Disable;
  90. USART_ClockInitStruct.USART_CPOL = USART_CPOL_Low;
  91. USART_ClockInitStruct.USART_CPHA = USART_CPHA_2Edge;
  92. USART_ClockInitStruct.USART_LastBit = USART_LastBit_Disable;
  93. USART_ClockInit(USART1, &USART_ClockInitStruct);*/
  94. usart_enable(USART1);
  95. usart_prescaler_config(USART1, 0x01);
  96. usart_irda_lowpower_config(USART1, USART_IRLP_NORMAL);
  97. usart_irda_mode_enable(USART1);
  98. #else
  99. usart_enable(USART1);
  100. #endif
  101. }
  102. /*******************************************************************************
  103. * Function Name : USART2_IRQHandler
  104. * Description : This function handles USART2 global interrupt request.
  105. * Input : None
  106. * Output : None
  107. * Return : None
  108. *******************************************************************************/
  109. void USART1_IRQHandler(void)
  110. {
  111. uint8_t c;
  112. /* 串口接收 */
  113. if(usart_flag_get(USART1, USART_FLAG_RBNE) == SET)
  114. {
  115. c = usart_data_receive(USART1);
  116. if (rx_count >= sizeof(rx_buffer))
  117. {
  118. return;
  119. }
  120. //USART_ReceiverTimeOutCmd(USART2,DISABLE);
  121. Enable_Uart2_Timer(0,0);
  122. /* Read one byte from the receive data register */
  123. rx_buffer[rx_count++] = c;
  124. Enable_Uart2_Timer(1,5);
  125. }
  126. /* 发送 */
  127. if(usart_flag_get(USART1, USART_FLAG_TC) == SET)
  128. {
  129. //USART_ClearFlag(USART1, USART_FLAG_TC);
  130. if (tx_count >= tx_buffer_size)
  131. {
  132. /* Disable the EVAL_COM1 Transmit interrupt */
  133. usart_interrupt_disable(USART1,USART_INT_TC);
  134. //USART_ClearFlag(USART1, USART_FLAG_TC);
  135. return;
  136. }
  137. /* Write one byte to the transmit data register */
  138. usart_data_transmit(USART1,tx_buffer[tx_count++]);
  139. }
  140. }
  141. #if 0
  142. //
  143. //用于系统调用printf
  144. //
  145. #ifdef __GNUC__
  146. /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
  147. set to 'Yes') calls __io_putchar() */
  148. #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
  149. #else
  150. #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
  151. #endif /* __GNUC__ */
  152. PUTCHAR_PROTOTYPE
  153. {
  154. // RS485发送使能
  155. gpio_bit_set(GPIOA, GPIO_PIN_4);
  156. usart_data_transmit(USART1,(uint8_t) ch);
  157. while(!(usart_flag_get(USART1, USART_FLAG_TC) == SET));
  158. // RS485接收使能
  159. gpio_bit_reset(GPIOA, GPIO_PIN_4);
  160. return ch;
  161. }
  162. #endif