3.2 串口初始化函数
//串口初始化
void uart2_init(void)
{
stc_irq_regi_conf_t stcIrqRegiCfg; //用于中断配置的结构体
en_result_t enRet = Ok;
uint32_t u32Fcg1Periph = PWC_FCG1_PERIPH_USART1 | PWC_FCG1_PERIPH_USART2 | \
PWC_FCG1_PERIPH_USART3 | PWC_FCG1_PERIPH_USART4;
const stc_usart_uart_init_t stcInitCfg = {
UsartIntClkCkNoOutput,
UsartClkDiv_1,
UsartDataBits8,
UsartDataLsbFirst,
UsartOneStopBit,
UsartParityNone,
UsartSampleBit8,
UsartStartBitFallEdge,
UsartRtsEnable,
};//串口参数结构体
/* 调用DMA初始化函数,初始化对应的dma通道 */
DmaInit();
/* 开启外设时钟 clock */
PWC_Fcg1PeriphClockCmd(u32Fcg1Periph, Enable);
/* USART对应的引脚初始化,但是引脚先失能,防止串口还没配置完成就接收导致错误 */
PORT_SetFunc(USART_RX_PORT, USART_RX_PIN, USART_RX_FUNC, Disable);
PORT_SetFunc(USART_TX_PORT, USART_TX_PIN, USART_TX_FUNC, Disable);
/* 初始化 USART */
enRet = USART_UART_Init(USART_CH, &stcInitCfg);
if (enRet != Ok)
{
while (1)
{
}
}
else
{
}
/* 设置串口波特率 */
enRet = USART_SetBaudrate(USART_CH, USART_BAUDRATE);
if (enRet != Ok)
{
while (1)
{
}
}
else
{
}
/* 设置串口读取方式为中断读取 */
stcIrqRegiCfg.enIntSrc = INT_USART2_RI; //中断类型为读中断
stcIrqRegiCfg.enIRQn = Int000_IRQn; //每个中断必须有一个对应的中断号
stcIrqRegiCfg.pfnCallback = &UsartRxIrqCallback;//中断发生时候的回调函数
enIrqRegistration(&stcIrqRegiCfg);
NVIC_SetPriority(stcIrqRegiCfg.enIRQn, DDL_IRQ_PRIORITY_DEFAULT);//中断优先级
NVIC_ClearPendingIRQ(stcIrqRegiCfg.enIRQn);//先清一下这个中断的标志位(置零)
NVIC_EnableIRQ(stcIrqRegiCfg.enIRQn);//在使能这个中断
/* 当串口接收发生错误的时候产生中断 */
stcIrqRegiCfg.enIntSrc = INT_USART2_EI;
stcIrqRegiCfg.enIRQn = Int001_IRQn;
stcIrqRegiCfg.pfnCallback = &UsartErrIrqCallback;
enIrqRegistration(&stcIrqRegiCfg);
NVIC_SetPriority(stcIrqRegiCfg.enIRQn, DDL_IRQ_PRIORITY_DEFAULT);
NVIC_ClearPendingIRQ(stcIrqRegiCfg.enIRQn);
NVIC_EnableIRQ(stcIrqRegiCfg.enIRQn);
//最后使能串口的引脚,串口正式工作
USART_FuncCmd(USART_CH, UsartRx, Enable);
USART_FuncCmd(USART_CH, UsartRxInt, Enable);
}
|