串口初始化
/*串口初始化*/
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);//使能超时中断
}
|