串口初始化
- /*串口初始化*/
- void UART_Init(void)
- {
- en_result_t enRet = Ok;
- stc_irq_regi_conf_t stcIrqRegiCfg;
-
- /*配置串口使用的时钟和基本通信配置*/
- const stc_usart_uart_init_t stcInitCfg = {
- UsartIntClkCkOutput,
- UsartClkDiv_16,//时钟分频
- UsartDataBits8,
- UsartDataLsbFirst,
- UsartOneStopBit,
- UsartParityNone,
- UsartSamleBit8,
- UsartStartBitFallEdge,
- UsartRtsEnable,
- };
-
- /*打开时钟*/
- PWC_Fcg1PeriphClockCmd(PWC_FCG1_PERIPH_USART4, Enable);
-
- /*配置相应的IO作为串口的RX引脚*/
- PORT_SetFunc(USART_TX_PORT, USART_TX_PIN, USART_TX_FUNC, Disable);
- PORT_SetFunc(USART_RX_PORT, USART_RX_PIN, USART_RX_FUNC, Disable);
-
- /*初始化串口配置*/
- enRet = USART_UART_Init(USART_CH, &stcInitCfg);
- while (enRet != Ok);
- /*串口波特率设置*/
- enRet = USART_SetBaudrate(USART_CH, USART_BAUDRATE);
- while (enRet != Ok);
-
- /*设置串口接收中断*/
- stcIrqRegiCfg.enIRQn = USART_RX_IRQn;
- stcIrqRegiCfg.pfnCallback = &Usart4RxIrqCallback;
- stcIrqRegiCfg.enIntSrc = USART_RI_NUM;
- enIrqRegistration(&stcIrqRegiCfg);
- NVIC_SetPriority(stcIrqRegiCfg.enIRQn, DDL_IRQ_PRIORITY_DEFAULT);
- NVIC_ClearPendingIRQ(stcIrqRegiCfg.enIRQn);
- NVIC_EnableIRQ(stcIrqRegiCfg.enIRQn);
-
- /*设置串口接收错误中断*/
- stcIrqRegiCfg.enIRQn = USART_ERR_IRQn; /* 中断号,可通过参考手册查阅对应的中断号 */
- stcIrqRegiCfg.pfnCallback = &Usart4ErrIrqCallback; /* 中断回调函数 */
- stcIrqRegiCfg.enIntSrc = USART_EI_NUM; /* 错误中断向量号,可通过参考手册查阅对应的中断号*/
- enIrqRegistration(&stcIrqRegiCfg);
- NVIC_SetPriority(stcIrqRegiCfg.enIRQn, DDL_IRQ_PRIORITY_DEFAULT);/* 配置中断优先级 */
- NVIC_ClearPendingIRQ(stcIrqRegiCfg.enIRQn); /*先清一下这个中断的标志位(置零)*/
- NVIC_EnableIRQ(stcIrqRegiCfg.enIRQn); /*在使能这个中断*/
-
- /*设置接收超时中断*/
- stcIrqRegiCfg.enIRQn = USART_RTO_IRQn; /* 中断号,可通过参考手册查阅对应的中断号 */
- stcIrqRegiCfg.pfnCallback = &Usart4TimeoutIrqCallback; /* 中断回调函数 */
- stcIrqRegiCfg.enIntSrc = INT_USART4_RTO; /* 错误中断向量号,可通过参考手册查阅对应的中断号*/
- enIrqRegistration(&stcIrqRegiCfg);
- NVIC_SetPriority(stcIrqRegiCfg.enIRQn, DDL_IRQ_PRIORITY_DEFAULT); /* 配置中断优先级 */
- NVIC_ClearPendingIRQ(stcIrqRegiCfg.enIRQn); /*先清一下这个中断的标志位(置零)*/
- NVIC_EnableIRQ(stcIrqRegiCfg.enIRQn); /*在使能这个中断*/
-
- /*设置串口发送中断*/
- stcIrqRegiCfg.enIRQn = USART_TX_IRQn; /* 中断号,可通过参考手册查阅对应的中断号 */
- stcIrqRegiCfg.pfnCallback = &UsartTxIrqCallback; /* 中断回调函数 */
- stcIrqRegiCfg.enIntSrc = USART_TI_NUM; /* 错误中断向量号,可通过参考手册查阅对应的中断号*/
- enIrqRegistration(&stcIrqRegiCfg);
- NVIC_SetPriority(stcIrqRegiCfg.enIRQn, DDL_IRQ_PRIORITY_DEFAULT); /* 配置中断优先级 */
- NVIC_ClearPendingIRQ(stcIrqRegiCfg.enIRQn); /*先清一下这个中断的标志位(置零)*/
- NVIC_EnableIRQ(stcIrqRegiCfg.enIRQn); /*在使能这个中断*/
-
- /*设置串口发送完成中断*/
- stcIrqRegiCfg.enIRQn = USART_CMP_IRQn; /* 中断号,可通过参考手册查阅对应的中断号 */
- stcIrqRegiCfg.pfnCallback = &UsartTxCmpltIrqCallback; /* 中断回调函数 */
- stcIrqRegiCfg.enIntSrc = USART_TCI_NUM; /* 错误中断向量号,可通过参考手册查阅对应的中断号*/
- enIrqRegistration(&stcIrqRegiCfg);
- NVIC_SetPriority(stcIrqRegiCfg.enIRQn, DDL_IRQ_PRIORITY_DEFAULT); /* 配置中断优先级 */
- NVIC_ClearPendingIRQ(stcIrqRegiCfg.enIRQn); /*先清一下这个中断的标志位(置零)*/
- NVIC_EnableIRQ(stcIrqRegiCfg.enIRQn); /*在使能这个中断*/
-
-
- USART_FuncCmd(USART_CH, UsartTx, Enable);//使能发送
- USART_FuncCmd(USART_CH, UsartRx, Enable);//使能接收
- USART_FuncCmd(USART_CH, UsartRxInt, Enable);//使能接收中断
- USART_FuncCmd(USART_CH, UsartTimeOut, Enable);//使能超时
- USART_FuncCmd(USART_CH, UsartTimeOutInt, Enable);//使能超时中断
- }
|