#include"ls1x_uart.h" extern uint32_t SystemFreq; void UART_Init(UART_TypeDef* UARTx, UART_InitTypeDef* UART_InitStruct) { uint8_t data = 0; uint32_t div = 0; assert_param(IS_UART_PERIPH(UARTx)); assert_param(IS_UART_WORD_LENGTH(UART_InitStruct->UART_WordLength)); assert_param(IS_UART_STOPBITS(UART_InitStruct->UART_StopBits)); assert_param(IS_UART_PARITY(UART_InitStruct->UART_Parity)); assert_param(IS_UART_CLOCK(UART_InitStruct->Clock_Freq)); assert_param(IS_UART_FIFO_TRIGGER(UART_InitStruct->UART_Triger)); /* 复位LCR寄存器 */ UARTx->LCR = 0x03; div = (UART_InitStruct->Clock_Freq << 4); div = div / (UART_InitStruct->UART_BaudRate); //[23:16] DL_H [15: 8] DL_L [ 7: 0] DL_D SET_BIT(UARTx->LCR,UART_Lab_En); UARTx->IIR_FCR_DL_D = div & 0xff; div >>= 8; UARTx->DAT_DL_L = div & 0xff; div >>= 8; UARTx->IER_DL_H = div & 0xff; CLEAR_BIT(UARTx->LCR,UART_Lab_En); UARTx->IER_DL_H = 0x00; UARTx->IIR_FCR_DL_D = UART_InitStruct->UART_Triger | UART_FIFO_TX_RST | UART_FIFO_RX_RST; SET_BIT(UARTx->LCR,UART_InitStruct->UART_WordLength); SET_BIT(UARTx->LCR,UART_InitStruct->UART_Parity); SET_BIT(UARTx->LCR,UART_InitStruct->UART_Parity_Bid_Control); SET_BIT(UARTx->LCR,UART_InitStruct->UART_StopBits); SET_BIT(UARTx->LCR,UART_InitStruct->UART_Break_Control); SET_BIT(UARTx->LCR,UART_InitStruct->UART_Parity_Control); data = UARTx->DAT_DL_L; } void Uart_init(UART_TypeDef* UARTx) { uint8_t data = 0; uint32_t div = 0; assert_param(IS_UART_PERIPH(UARTx)); /* 复位LCR寄存器 */ UARTx->LCR = 0x03; SET_BIT(UARTx->LCR,UART_Lab_En); //UARTx->IIR_FCR_DL_D = 0x57; UARTx->IIR_FCR_DL_D = 0xca; //UARTx->DAT_DL_L = 0x4; UARTx->DAT_DL_L = 0x5; UARTx->IER_DL_H = 0x0; CLEAR_BIT(UARTx->LCR,UART_Lab_En); UARTx->IER_DL_H = 0x00; UARTx->IIR_FCR_DL_D =UART_FIFO_TRIGGER_1| UART_FIFO_TX_RST | UART_FIFO_RX_RST; data = UARTx->DAT_DL_L; } ///** // * @brief Fills each USART_InitStruct member with its default value. // * @param USART_InitStruct: pointer to a USART_InitTypeDef structure // * which will be initialized. // * @retval None // * remark: // * uart1 clock freq is 32k; // */ void UART_StructInit(UART_InitTypeDef* UART_InitStruct) { /* USART_InitStruct members default value */ UART_InitStruct->UART_BaudRate = 115200; UART_InitStruct->Clock_Freq = 8000000; UART_InitStruct->UART_WordLength = UART_Word_Length_8b; UART_InitStruct->UART_StopBits = UART_StopBits_1; UART_InitStruct->UART_Parity = UART_Parity_Odd ; UART_InitStruct->UART_Parity_Control = UART_Parity_No; UART_InitStruct->UART_Break_Control = UART_Break_Control_NEn; UART_InitStruct->UART_Parity_Bid_Control = UART_Parity_No_Bid; UART_InitStruct->UART_Triger = UART_FIFO_TRIGGER_1; } /** * brief: Enables or disables the specified USART interrupts. * param: USARTx: Select the USART or the UART peripheral. * This parameter can be one of the following values: * USART0, USART1 * param: USART_IT: specifies the UART interrupt sources to be enabled or disabled. * This parameter can be one of the following values: * UART_IT_IME: 保留的 Modem中断使能 * UART_IT_ILE: 线路状态中断使能 * UART_IT_ITE: 发送状态中断使能 * UART_IT_IRE: 接收状态中断使能 * param: NewState: new state of the specified USARTx interrupts. * This parameter can be: ENABLE or DISABLE. * retval: None */ void UART_ITConfig(UART_TypeDef* UARTx, uint8_t UART_IT, FunctionalState NewState) { /* Check the parameters */ assert_param(IS_UART_PERIPH(UARTx)); assert_param(IS_UART_CONFIG_IT(USART_IT)); assert_param(IS_FUNCTIONAL_STATE(NewState)); (NewState != DISABLE)? (SET_BIT(UARTx->IER_DL_H,UART_IT)) : (CLEAR_BIT(UARTx->IER_DL_H,UART_IT)); } ///** // * brief: Enables or disables the specified UART interrupts. // * @param USARTx: Select the USART or the UART peripheral. // * This parameter can be one of the following values: // * USART0, USART1 // * @param NewState: new state of the specified USARTx interrupt. // * This parameter can be: ENABLE or DISABLE. // * @retval None // */ //void UART_ITCmd(UART_TypeDef* UARTx, FunctionalState NewState) //{ // uint8_t uartdata = 0x00; // // assert_param(IS_UART_PERIPH(USARTx)); // assert_param(IS_FUNCTIONAL_STATE(NewState)); // // /* clear data reg*/ // uartdata = UARTx->DAT_DL_L; // // if(UARTx != UART1) // { // /* 设置uart0中断为 高电平触发 */ //// INT->INT_POL |= 0x08; // (NewState != DISABLE)? (INT->INT_EN |= ((uint8_t)0x08)) : (INT->INT_EN &= ((uint8_t)0xF7)); // } // else // { // /* 设置uart1中断为 高电平触发 */ //// INT->INT_POL |= 0x04; // (NewState != DISABLE)? (INT->INT_EN |= ((uint8_t)0x04)) : (INT->INT_EN &= ((uint8_t)0xFB)); // } // //} /** * brief: Transmits single data through the USARTx peripheral. * param: USARTx: Select the USART or the UART peripheral. * This parameter can be one of the following values: * USART0, USART1 * param: Data: the data to transmit. * retval: None */ void UART_SendData(UART_TypeDef* UARTx, uint8_t Data) { assert_param(IS_UART_PERIPH(USARTx)); while (!READ_BIT(UARTx->LSR,UART_LSR_FLAG_TFE)); UARTx->DAT_DL_L = Data; } /** * brief: Receive single data through the USARTx peripheral. * param: USARTx: Select the USART or the UART peripheral. * This parameter can be one of the following values: * USART0, USART1 * param: * retval: the data receive. */ uint8_t UART_ReceiveData(UART_TypeDef* UARTx) { uint8_t data = 0; assert_param(IS_UART_PERIPH(USARTx)); while (!READ_BIT(UARTx->LSR,UART_LSR_FLAG_RXNE)); data = UARTx->DAT_DL_L ; return data; } /** * @brief Checks whether the specified USART flag is set or not. * @param USARTx: Select the USART or the UART peripheral. * This parameter can be one of the following values: * USART1, USART2, USART3, UART4 or UART5. * @param USART_FLAG: specifies the flag to check. * This parameter can be one of the following values: * UART_LSR_FLAG_ERR: Error flag * UART_LSR_FLAG_TE: Transmit data register empty flag * UART_LSR_FLAG_TFE: Transmit fifo register empty flag * UART_LSR_FLAG_BI: break flag * UART_LSR_FLAG_FE: Framing Error flag * UART_LSR_FLAG_PE: Parity Error flag * UART_LSR_FLAG_OE: OverRun Error flag * UART_LSR_FLAG_RXNE: Receive data register not empty flag * @retval The new state of USART_FLAG (SET or RESET). */ FlagStatus UART_GetFlagStatus(UART_TypeDef* UARTx, uint8_t UART_FLAG) { FlagStatus bitstatus = RESET; assert_param(IS_UART_PERIPH(USARTx)); assert_param(IS_UART_LSR_FLAGS(UART_FLAG)); if(UARTx->LSR & UART_FLAG != (uint8_t)RESET) { bitstatus = SET; } else { bitstatus = RESET; } return bitstatus; } /** *@说明: Checks whether the specified UART interrupt has occurred or not. *param: USARTx: Select the USART or the UART peripheral. * This parameter can be one of the following values: * USART0、 USART1 * *param USART_IT: specifies the USART interrupt source to check. * This parameter can be one of the following values: * UART_IT_RXOT: 接收超时,有数据有效且后续4个字符时间内无操作 * UART_IT_IL: 奇偶 、 溢出 或 帧错误、 或打断中断 * UART_IT_RXNE:接收寄存器非空中断 * UART_IT_TXE: 发送fifo空中断 * UART_IT_MDM: 保留的 Modem寄存器,两线串口实现无此中断源 * UART_IT_INTPn 是否存在未处理的中断 *retval: None * * 由于中断位有重叠,所以查询时,一次只允许查询一个中断标志;不可以同时将多个中断标志取位或后,去查询; */ ITStatus UART_GetITStatus(UART_TypeDef* UARTx, uint8_t UART_IT_FLAG) { FlagStatus bitstatus = RESET; assert_param(IS_UART_PERIPH(USARTx)); if(UARTx->IIR_FCR_DL_D ^ UART_IT_FLAG == (uint8_t)RESET) { bitstatus = SET; } else { bitstatus = RESET; } return bitstatus; } ///** // *@brief Clears the USARTx's interrupt pending bits. // *param: USARTx: Select the USART or the UART peripheral. // * USART0, USART1 // * // *retval None // */ // //void UART_ClearIT(UART_TypeDef* UARTx) //{ // //uint8_t uartdata = 0x00; // // assert_param(IS_UART_PERIPH(USARTx)); // assert_param(IS_FUNCTIONAL_STATE(NewState)); // // /* clear data reg*/ // //uartdata = UARTx->DAT_DL_L; // // if(UARTx != UART1) // { // INT->INT_CLR |= 0x08; // } // else // { // INT->INT_CLR |= 0x04; // // } // //} /** *@说明: Clears the USARTx's interrupt pending bits. *param: USARTx: Select the USART or the UART peripheral. * This parameter can be one of the following values: * USART0、 USART1 * *param USART_IT: specifies the USART interrupt source to check. * This parameter can be one of the following values: * UART_IT_RXOT: 接收超时,有数据有效且后续4个字符时间内无操作 * UART_IT_IL: 奇偶 、 溢出 或 帧错误、 或打断中断 * UART_IT_RXNE:接收寄存器非空中断 * UART_IT_TXE: 发送fifo空中断 * UART_IT_MDM: 保留的 Modem寄存器,两线串口实现无此中断源 *retval None *remark: * UART_IT_RXOT: 读数据寄存器即可复位中断标志位 * UART_IT_IL: 读LSR寄存器即可复位中断标志位 * UART_IT_RXNE: 读数据寄存器即可复位中断标志位 * UART_IT_TXE: 写数据寄存器或读中断寄存器即可复位中断标志位 * UART_IT_MDM: 读Modem寄存器即可复位中断标志位 * 一般不用刻意清除,有上述操作,中断标志位即自动清除,不影响下次响应;若无则需该函数清楚相应中断寄存器; */ void UART_ClearITPendingBit(UART_TypeDef* UARTx, uint16_t UART_IT) { uint8_t data = 0; assert_param(IS_UART_PERIPH(USARTx)); assert_param(IS_UART_GET_IT(UART_IT_FLAG)); switch(UART_IT) { case UART_IT_RXOT: data = UARTx->DAT_DL_L; break; case UART_IT_IL: data = UARTx->LSR; break; case UART_IT_RXNE: data = UARTx->DAT_DL_L; break; case UART_IT_TXE: data = UARTx->IIR_FCR_DL_D; break; // case UART_IT_MDM: // data = UARTx->MSR; // break; default: break; } } uint8_t x_getchar(void) { uint8_t chr; chr = UART0_RxData ; return chr; } void UartInit(void) { UART_InitTypeDef UART_InitStruct; UART_StructInit(&UART_InitStruct); UART_InitStruct.Clock_Freq = SystemFreq; UART_InitStruct.UART_BaudRate = 115200; UART_Init(UART0,&UART_InitStruct); UART_ITConfig(UART0,UART_IT_IRE,DISABLE); }