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