uart2.c 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. #include "hal/hal.h"
  2. #include "stm32f3xx_ll_usart.h"
  3. #include "uart2.h"
  4. static UART_HandleTypeDef huart2;
  5. static void UART2_Pin_Init(void){
  6. GPIO_InitTypeDef GPIO_InitStruct = {0};
  7. /* Peripheral clock enable */
  8. __HAL_RCC_USART2_CLK_ENABLE();
  9. __HAL_RCC_GPIOA_CLK_ENABLE();
  10. /**USART2 GPIO Configuration
  11. PA2 ------> USART2_TX
  12. PA3 ------> USART2_RX
  13. */
  14. GPIO_InitStruct.Pin = UART_TX_Pin|UART_RX_Pin;
  15. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  16. GPIO_InitStruct.Pull = GPIO_NOPULL;
  17. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  18. GPIO_InitStruct.Alternate = GPIO_AF7_USART2;
  19. HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  20. }
  21. void UART2_Init(void){
  22. huart2.Instance = USART2;
  23. huart2.Init.BaudRate = 500000;
  24. huart2.Init.WordLength = UART_WORDLENGTH_8B;
  25. huart2.Init.StopBits = UART_STOPBITS_1;
  26. huart2.Init.Parity = UART_PARITY_NONE;
  27. huart2.Init.Mode = UART_MODE_TX_RX;
  28. huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  29. huart2.Init.OverSampling = UART_OVERSAMPLING_16;
  30. huart2.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
  31. huart2.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
  32. UART2_Pin_Init();
  33. if (HAL_UART_Init(&huart2) != HAL_OK)
  34. {
  35. Error_Handler();
  36. }
  37. LL_USART_DisableIT_TXE(huart2.Instance);
  38. //LL_USART_EnableDirectionRx(huart2.Instance);
  39. LL_USART_EnableDirectionTx(huart2.Instance);
  40. //LL_USART_EnableIT_RXNE(huart2.Instance);
  41. HAL_NVIC_EnableIRQ(USART2_IRQn);
  42. }
  43. void UART2_EnableTx(void) {
  44. USART_TypeDef *USARTx = huart2.Instance;
  45. if (!LL_USART_IsEnabledIT_TXE(USARTx)) {
  46. LL_USART_EnableIT_TXE(huart2.Instance);
  47. }
  48. }
  49. void UART2_TxData(u8 data) {
  50. LL_USART_TransmitData8(huart2.Instance, data);
  51. }
  52. __weak bool uart_tx_finished(void) {return true;}
  53. __weak void uart_rx_put(u8 ch) {};
  54. void uart2_irq_handler(void) {
  55. USART_TypeDef *USARTx = huart2.Instance;
  56. if (LL_USART_IsActiveFlag_RXNE(USARTx)){
  57. uart_rx_put(LL_USART_ReceiveData8(USARTx));
  58. }
  59. if (LL_USART_IsActiveFlag_TXE(USARTx)) {
  60. if (uart_tx_finished()){
  61. LL_USART_DisableIT_TXE(huart2.Instance);
  62. }
  63. }
  64. }