打印

华大HC32F460KETA串口1无法进入其中断

[复制链接]
271|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
123zax|  楼主 | 2022-7-22 14:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
以下是我的代码:

/* 串口接收回调函数 */
static void UsartRxIrqCallback(void)
{
        if (Set == USART_GetStatus(USART_CH, UsartRxNoEmpty))
        {
                uint16_t RxData;
                RxData = USART_RecData(USART_CH);//取出数据
//                rx_buffer[0] = USART_RecData(USART_CH);
                x=1;//为了在仿真时观察是否进入中断
                rx_buffer[0] = ((uint8_t)RxData)&0xff;
//                rx_buffer[rx_counter++] = ((uint8_t)RxData)&0xff;
//                if (rx_counter > 4)
//                {
//                        rx_counter = 0;
//                }
        }
}

/* 超时中断回调函数 */
static void  Usart1TimeoutIrqCallback(void)
{
        x=1;
        TIMER0_Cmd(M4_TMR01, Tim0_ChannelA,Disable);
        USART_ClearStatus(USART_CH, UsartRxTimeOut);
}

/*接收错误回调函数*/
static void UsartErrIrqCallback(void)
{
        x=1;
  if (Set == USART_GetStatus(USART_CH, UsartFrameErr))
  {
    USART_ClearStatus(USART_CH, UsartFrameErr);
  }
        else {}
               
  if (Set == USART_GetStatus(USART_CH, UsartParityErr))
  {
    USART_ClearStatus(USART_CH, UsartParityErr);
  }
        else {}
               
  if (Set == USART_GetStatus(USART_CH, UsartOverrunErr))
  {
    USART_ClearStatus(USART_CH, UsartOverrunErr);
  }
        else {}
}

/* 串口初始化配置 */
void usart1_init(void)
{
        en_result_t enRet = Ok;
  stc_irq_regi_conf_t stcIrqRegiCfg; //用于中断配置的结构体

        /* 开启外设时钟 clock */
  PWC_Fcg1PeriphClockCmd(PWC_FCG1_PERIPH_USART1, 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);
       
  const stc_usart_uart_init_t stcInitCfg = {
                UsartIntClkCkNoOutput,//使用内部时钟源,不需要在其时钟输出IO上输出通信的时钟信号
                UsartClkDiv_1,//始终不分频
    UsartDataBits8,//一个字节8位
    UsartDataLsbFirst,//先传输低位
    UsartOneStopBit,//停止位1位
    UsartParityNone,//无奇偶校验位
    UsartSampleBit8,//每次传输1字节(8bit),也可以传输16位UsartDataBits16
    UsartStartBitFallEdge,//起始位:RD pin下降沿
    UsartRtsEnable,//使能RTS(串口开始传输前让RTS输出一个高脉冲信号)
  };//串口参数结构体

  /* 初始化 USART */
  enRet = USART_UART_Init(USART_CH, &stcInitCfg);
  if (enRet != Ok)
  {
    while (1);
  }

  /* 设置串口波特率 */
  enRet = USART_SetBaudrate(USART_CH, USART_BAUDRATE);
  if (enRet != Ok)
  {
    while (1);
  }

  /* 设置串口读取方式为中断读取 */
  stcIrqRegiCfg.enIntSrc = INT_USART1_RI; //中断类型为读中断
  stcIrqRegiCfg.enIRQn = Int000_IRQn; //每个中断必须有一个对应的中断号
  stcIrqRegiCfg.pfnCallback = &UsartRxIrqCallback;//中断发生时候的回调函数
  enIrqRegistration(&stcIrqRegiCfg);
  NVIC_SetPriority(stcIrqRegiCfg.enIRQn, DDL_IRQ_PRIORITY_00);//中断优先级
  NVIC_ClearPendingIRQ(stcIrqRegiCfg.enIRQn);//先清一下这个中断的标志位(置零)
  NVIC_EnableIRQ(stcIrqRegiCfg.enIRQn);//在使能这个中断
       
  /* 当串口接收发生错误的时候产生中断 */
  stcIrqRegiCfg.enIntSrc = INT_USART1_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);
       
        /* 串口接收空闲中断 */
        stcIrqRegiCfg.enIntSrc = INT_USART1_RTO;//中断名称(串口1空闲中断)
        stcIrqRegiCfg.enIRQn = Int003_IRQn;//中断向量
        stcIrqRegiCfg.pfnCallback = &Usart1TimeoutIrqCallback;
        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);
        USART_FuncCmd(USART_CH, UsartTx, Enable);
        USART_FuncCmd(USART_CH, UsartTxEmptyInt, Disable);
        USART_FuncCmd(USART_CH, UsartTimeOut, Enable);
        USART_FuncCmd(USART_CH, UsartTimeOutInt, Enable);
        USART_FuncCmd(USART_CH, UsartNoiseFilter, Enable);
}


/*发送一串数据*/
void Uart1_SendString(M4_USART_TypeDef *USARTx, unsigned char *data, unsigned char strlen)
{
        unsigned char dataleng;
        for(dataleng=0;dataleng<strlen;dataleng++)
        {
                USART_SendData(USARTx,data[dataleng]);
                while (Reset == USART_GetStatus(USARTx, UsartTxComplete));//等待发送完成UsartTxEmpty
        }
}

本人萌新,实在是找不到出了什么问题,希望哪位前辈可以帮个忙解答一下,感恩!
搜索
复制

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

6

帖子

0

粉丝