参考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);} }
}