RISC-V技术william hill官网
直播中

jf_89761755

4年用户 141经验值
擅长:嵌入式技术
私信 关注
[经验]

【芯昇科技RISC-V生态开发板试用体验】3.串口的封装

    接下来就该串口了。串口分为UART和USART,但是对我来说尽可能的统一命名,所以都改为UART了。一般情况我用不到太高级的功能,能通讯就OK。
    废话少说,直接上代码:
  1. #ifdef DBGLOG
  2.                 #define LOG(...) printf(__VA_ARGS__)
  3.         #else
  4.                 #define LOG(...) //NOLOG
  5.         #endif

  6.         typedef struct _UART CUART;
  7.         typedef void (*tiSR_UART)(CUART* UARTx, uint8_t DAT);

  8.         typedef struct _UART
  9.         {
  10.                 USART_Module* TUART;
  11.                 CIO* TX;
  12.                 CIO* RX;

  13.                 IRQn_Type _IRQn;
  14.                 USART_InitType _hUART;
  15.                 TISR_UART _OnUART;
  16.         } CUART;

  17.         extern void UART_InitCM(CUART* UARTx, TISR_UART OnUART);
  18.         extern void UART_Config(CUART* UARTx, u8 DataBit, u8 Parity, u8 StopBits);
  19.         extern void UART_Start(CUART* UARTx, u32 Baudrate);
  20.         extern void UART_Stop(CUART* UARTx);
  21.         extern void UART_Send(CUART* UARTx, u8* Data, u16 Size);
   连调试的功能都给加上了,可以自行打开关闭宏来定义是否使用调试功能。
  1. void UART_InitCM(CUART* UARTx, TISR_UART OnUART)
  2. {
  3.         RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_AFIO, ENABLE);

  4.         UARTx->TX->Mode = AFPP; UARTx->TX->Speed = FAST;
  5.         UARTx->RX->Mode = IPN; UARTx->RX->Speed = FAST;
  6.         IO_Config(UARTx->RX, 0);

  7.         UARTx->_OnUART = OnUART;
  8.         switch ((u32) UARTx->TUART)
  9.         {
  10.                 case ((u32) USART1):
  11.                         _UARTx[0] = UARTx; UARTx->_IRQn = USART1_IRQn;
  12.                         IO_Config(UARTx->TX, GPIO_RMP_USART1);
  13.                         RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_USART1, ENABLE);
  14.                         break;

  15.                 case ((u32) UART4):
  16.                         _UARTx[3] = UARTx; UARTx->_IRQn = UART4_IRQn;
  17.                         IO_Config(UARTx->TX, GPIO_RMP3_UART4);
  18.                         RCC_EnableAPB1PeriphClk(RCC_APB1_PERIPH_UART4, ENABLE);
  19.                         break;
  20.         }

  21.         ECLIC_SetCfgNlbits(0);
  22.         ECLIC_SetPriorityIRQ(UARTx->_IRQn, 1);
  23.         ECLIC_SetTrigIRQ(UARTx->_IRQn, ECLIC_LEVEL_TRIGGER);

  24.         UART_Config(UARTx, USART_WL_8B, USART_PE_NO, USART_STPB_1);
  25. }

  26. void UART_Config(CUART* UARTx, u8 DataBit, u8 Parity, u8 StopBits)
  27. {
  28.         UARTx->_hUART.WordLength          = USART_WL_8B;
  29.         UARTx->_hUART.StopBits            = USART_STPB_1;
  30.         UARTx->_hUART.Parity              = USART_PE_NO;
  31.         UARTx->_hUART.HardwareFlowControl = USART_HFCTRL_NONE;
  32.         UARTx->_hUART.Mode                = USART_MODE_RX | USART_MODE_TX;
  33. }

  34. void UART_Start(CUART* UARTx, u32 Baudrate)
  35. {
  36.         __disable_irq();
  37.         UARTx->_hUART.BaudRate = Baudrate;
  38.         USART_Init(UARTx->TUART, &UARTx->_hUART);

  39.         USART_ConfigInt(UARTx->TUART, USART_INT_RXDNE, ENABLE);
  40.         USART_Enable(UARTx->TUART, ENABLE);
  41.         ECLIC_EnableIRQ(UARTx->_IRQn);
  42.         __enable_irq();
  43. }

  44. void UART_Stop(CUART* UARTx)
  45. {
  46.         ECLIC_DisableIRQ(UARTx->_IRQn);
  47.         USART_Enable(UARTx->TUART, DISABLE);
  48.         USART_ConfigInt(UARTx->TUART, USART_INT_RXDNE, DISABLE);
  49. }

  50. void UART_Send(CUART* UARTx, u8* Data, u16 Size)
  51. {
  52.         while (Size--)
  53.         {
  54.                 USART_SendData(UARTx->TUART, *Data++);
  55.                 while (!USART_GetFlagStatus(UARTx->TUART, USART_FLAG_TXDE)) ;
  56.         }
  57. }

  58. static void UART_HandlerIRQ(CUART* UARTx)
  59. {
  60.         if (!UARTx->_OnUART) return ;
  61.         UARTx->_OnUART(UARTx, USART_ReceiveData(UARTx->TUART));
  62. }

  63. void USART1_IRQHandler(void)
  64. {
  65.         if (USART_GetIntStatus(USART1, USART_INT_RXDNE)) UART_HandlerIRQ(_UARTx[0]);
  66. }

  67. void UART4_IRQHandler(void)
  68. {
  69.         if (USART_GetIntStatus(UART4, USART_INT_RXDNE)) UART_HandlerIRQ(_UARTx[3]);
  70. }

  71. #ifdef DBGLOG
  72. int _put_char(int ch)
  73. {
  74.         USART_SendData(DBGLOG, (u8)ch);
  75.         while (USART_GetFlagStatus(DBGLOG, USART_FLAG_TXDE) == RESET);
  76.         return ch;
  77. }
  78. #endif
   实现的代码有点多了,其实和例程差不多,只不过分解了一下而已,没什么难度。


更多回帖

发帖
×
20
完善资料,
赚取积分