参考demo
E:\tfs\data\smartsafe\N32G430\Nations.N32G430_Library.1.0.0\projects\n32g430_EVAL\examples\USART\Interrupt开发uart1和uart3驱动。Uart1用于通信,uart3用于调试。
参考用户手册5.2.5复用功能。Uart1_tx引脚使用PA9,重映射使用AF5,Uart1_rx引脚使用PA10,重映射使用AF5,Uart3_tx引脚使用PB10,重映射使用AF10,Uart3_Rx引脚使用PB11,重映射使用AF10。
串口使用ringbuffer,中断方式接收和发送。
1、配置时钟
包括GPIO时钟和uart时钟。
void RCC_Configuration(void)
{
/* Enable GPIO clock */
RCC_AHB_Peripheral_Clock_Enable(USARTy_GPIO_CLK | USARTz_GPIO_CLK);
/* Enable USARTy and USARTz Clock */
USARTy_APBxClkCmd(USARTy_CLK);
USARTz_APBxClkCmd(USARTz_CLK);
}
2、配置IO
配置IO的复用功能为UART。
void GPIO_Configuration(void)
{
GPIO_InitType GPIO_InitStructure;
/* Initialize GPIO_InitStructure */
GPIO_Structure_Initialize(&GPIO_InitStructure);
/* Configure USARTy Tx as alternate function push-pull */
GPIO_InitStructure.Pin = USARTy_TxPin;
GPIO_InitStructure.GPIO_Mode = GPIO_MODE_AF_PP;
GPIO_InitStructure.GPIO_Alternate = USARTy_Tx_GPIO_AF;
GPIO_Peripheral_Initialize(USARTy_GPIO, &GPIO_InitStructure);
/* Configure USARTz Tx as alternate function push-pull */
GPIO_InitStructure.Pin = USARTz_TxPin;
GPIO_InitStructure.GPIO_Alternate = USARTz_Tx_GPIO_AF;
GPIO_Peripheral_Initialize(USARTz_GPIO, &GPIO_InitStructure);
/* Configure USARTx Rx as alternate function push-pull */
GPIO_InitStructure.Pin = USARTy_RxPin;
GPIO_InitStructure.GPIO_Alternate = USARTy_Rx_GPIO_AF;
GPIO_Peripheral_Initialize(USARTy_GPIO, &GPIO_InitStructure);
/* Configure USARTz Rx as alternate function push-pull */
GPIO_InitStructure.Pin = USARTz_RxPin;
GPIO_InitStructure.GPIO_Alternate = USARTz_Rx_GPIO_AF;
GPIO_Peripheral_Initialize(USARTz_GPIO, &GPIO_InitStructure);
}
3、配置UART
包括初始化uart,使能uart中断,使能uart外设等。
/* USARTy and USARTz configuration ------------------------------------------------------*/
USART_InitStructure.BaudRate = 115200;
USART_InitStructure.WordLength = USART_WL_8B;
USART_InitStructure.StopBits = USART_STPB_1;
USART_InitStructure.Parity = USART_PE_NO;
USART_InitStructure.HardwareFlowControl = USART_HFCTRL_NONE;
USART_InitStructure.Mode = USART_MODE_RX | USART_MODE_TX;
/* Configure USARTy and USARTz */
USART_Initializes(USARTy, &USART_InitStructure);
USART_Initializes(USARTz, &USART_InitStructure);
/* Enable USARTy Receive and Transmit interrupts */
USART_Interrput_Enable(USARTy, USART_INT_RXDNE);
USART_Interrput_Enable(USARTy, USART_INT_TXDE);
/* Enable USARTz Receive and Transmit interrupts */
USART_Interrput_Enable(USARTz, USART_INT_RXDNE);
USART_Interrput_Enable(USARTz, USART_INT_TXDE);
/* Enable the USARTy and USARTz */
USART_Enable(USARTy);
USART_Enable(USARTz);
4、uart中断响应函数
void COM_UART_IRQHandler(void)
{
uint8_t data;
if (USART_Interrupt_Status_Get(COM_UART, USART_INT_RXDNE) != RESET)
{
data = USART_Data_Receive(COM_UART);
ringBuffer_write(pcomUartRxRingBuffer,data);
}
if (USART_Interrupt_Status_Get(COM_UART, USART_INT_TXDE) != RESET)
{
if (ringBuffer_is_empty(p_comUartTxRingBuffer))
{
/*没有发送数据时要关闭串口发送中断*/
/* Disable the COM_UART Transmit interrupt */
USART_Interrput_Disable(COM_UART, USART_INT_TXDE);
}
else
{
ringBuffer_read(p_comUartTxRingBuffer,&data);
USART_Data_Send(COM_UART, data);
}
}
}