股票

SAM4S双串口驱动(UART&USART)

SAM4S4A芯片附带了三个串口:

UART:universal asynchronous receiver and transmitter通用异步收发器,有两个:UART0(URXD0, PA9A; UTXD0, PA10A),UART1(URXD1, PB2A; UTXD1, PB3A)

USART:universal synchronous asynchronous receiver and transmitter通用同步异步收发器,有一个:USART0(RXD0, PA5A; TXD0, PA6A).

由于引脚资源有限,这些串口都作为了异步串口。本来我的计划是用UART0和UART1,这样两个驱动一样,只需要改下引脚就行了。结果硬件设计的人员把USART0给我接到了设备上,没办法,就用这两个串口吧。

这两个收发器的驱动基本一样,使用asf的话,只是寄存器值一个是UART,另一个是USART。

USART0:

  1. #define CONSOLE_USART               USART0
  2. #define CONSOLE_USART_ID            ID_USART0
  3. #define CONFSOLE_USART_IRQn         USART0_IRQn
  4. /**
  5. * @brief  Initializes the USART0.
  6. * @param  None
  7. * @retval None
  8. */
  9. void USART0_Init(uint32_t Baudrate)
  10. {
  11.     static uint32_t ul_sysclk;
  12.     const sam_usart_opt_t usart_console_settings = {
  13.         Baudrate,
  14.         US_MR_CHRL_8_BIT,
  15.         US_MR_PAR_NO,
  16.         US_MR_NBSTOP_1_BIT,
  17.         US_MR_CHMODE_NORMAL,
  18.         /* This field is only used in IrDA mode. */
  19.         0
  20.     };
  21.     ul_sysclk = sysclk_get_cpu_hz();
  22.     /* Enable peripheral clock. */
  23.     sysclk_enable_peripheral_clock(CONSOLE_USART_ID);
  24.     /* Configure USART. */
  25.     usart_init_hw_handshaking(CONSOLE_USART, &usart_console_settings, ul_sysclk);
  26.     /* Disable all the interrupts. */
  27.     usart_enable_interrupt(CONSOLE_USART, US_IER_RXRDY);
  28.     /* Enable Tx & Rx function. */
  29.     usart_enable_tx(CONSOLE_USART);
  30.     usart_enable_rx(CONSOLE_USART);
  31.     NVIC_DisableIRQ(CONFSOLE_USART_IRQn);
  32.     NVIC_ClearPendingIRQ(CONFSOLE_USART_IRQn);
  33.     NVIC_SetPriority(CONFSOLE_USART_IRQn, 1);
  34.     NVIC_EnableIRQ(CONFSOLE_USART_IRQn);
  35. }

UART1:

  1. #define CONSOLE_UART                UART1
  2. #define CONSOLE_UART_ID             ID_UART1
  3. #define CONFSOLE_UART_IRQn          UART1_IRQn
  4. /**
  5. * @brief  Initializes the USART1.
  6. * @param  None
  7. * @retval None
  8. */
  9. void UART1_Init(uint32_t Baudrate)
  10. {
  11.     /* USARTx configured as follow:
  12.     – BaudRate =  Baudrate
  13.     – Word Length = 8 Bits
  14.     – One Stop Bit
  15.     – No parity
  16.     – Hardware flow control disabled (RTS and CTS signals)
  17.     – Receive and transmit enabled
  18.     */
  19.     const usart_serial_options_t uart_serial_options = {
  20.         .baudrate = Baudrate,
  21.         .charlength = UART_SERIAL_CHAR_LENGTH,
  22.         .paritytype = CONF_UART_PARITY,
  23.         .stopbits = UART_SERIAL_STOP_BIT
  24.     };
  25.     /* Configure console UART. */
  26.     sysclk_enable_peripheral_clock(CONSOLE_UART_ID);
  27.     stdio_serial_init(CONSOLE_UART, &uart_serial_options);
  28.     uart_enable_interrupt(CONSOLE_UART,US_IER_RXRDY);
  29.     uart_enable(CONSOLE_UART);
  30.     NVIC_DisableIRQ(CONFSOLE_UART_IRQn);
  31.     NVIC_ClearPendingIRQ(CONFSOLE_UART_IRQn);
  32.     NVIC_SetPriority(CONFSOLE_UART_IRQn, 0);
  33.     NVIC_EnableIRQ(CONFSOLE_UART_IRQn);
  34. }

中断函数:

  1. /************************************************************************/
  2. /* @brief Interrupt handler for UART1.                                                                      
  3. /************************************************************************/
  4. void UART1_Handler(void)
  5. {
  6.     uint32_t ul_status;
  7.     uint32_t gs_ul_read_buffer;
  8.     UART_DATA *ptrComData = NULL;
  9.     ptrComData = &Uart1_Data;
  10.     // read UART status
  11.     ul_status = uart_get_status(CONF_UART);
  12.     if(ul_status & UART_SR_RXRDY)
  13.     {
  14.         usart_getchar(CONF_UART, (uint32_t *)&gs_ul_read_buffer);
  15.     }
  16. }
  17. /************************************************************************/
  18. /* @brief Interrupt handler for USART0.
  19. /************************************************************************/
  20. void USART0_Handler(void)
  21. {
  22.     uint32_t ul_status;
  23.     uint32_t gs_ul_read_buffer;
  24.     UART_DATA *ptrComData = NULL;
  25.     ptrComData = &Uart1_Data;
  26.     // read USART status
  27.     ul_status = usart_get_status(USART0);
  28.     if(ul_status & US_CSR_RXRDY)
  29.     {
  30.         usart_getchar(USART0, (uint32_t *)&gs_ul_read_buffer);
  31.     }
  32. }

注意中断函数的名字不能错了,asf中都有对应的地址的。

打赏
原文链接:,转发请注明来源!

发表评论