打印
[技术问答]

M031开启中断之后一直进入中断函数

[复制链接]
1110|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
//串口代码如下
void Blue_Init(void)
{
  //串口时钟使能
  CLK_EnableModuleClock(UART0_MODULE);
  //串口时钟选择HIRC(48MHZ)
  CLK_SetModuleClock(UART0_MODULE,CLK_CLKSEL1_UART0SEL_HIRC,CLK_CLKDIV0_UART0(1));
  //串口管脚复用PA14:TXD0/PA15:RXD0
  SYS->GPA_MFPH=(SYS->GPA_MFPH & ~(SYS_GPA_MFPH_PA14MFP_Msk | SYS_GPA_MFPH_PA15MFP_Msk))        |\
                                  (SYS_GPA_MFPH_PA14MFP_UART0_TXD | SYS_GPA_MFPH_PA15MFP_UART0_RXD);
  //复位串口
  SYS_ResetModule(UART0_RST);
  //打开串口波特率115200
  UART_Open(UART0, 57600);
  Blue_NVInit();
}
void Blue_NVInit(void)
{
  //打开串口0的中断
  NVIC_EnableIRQ(UART02_IRQn);
  //设置中断优先级
  NVIC_SetPriority(UART02_IRQn,1);
  //打开串口的发送/接收中断使能
  UART_EnableInt(UART0,(UART_INTEN_THREIEN_Msk|UART_INTEN_RDAIEN_Msk));
}

现在的问题是一直进入中断?但是规格书上面写的寄存器是只读没有写的标志,所以没有清除标志的函数。
//串口0/2中断服务函数
void UART02_IRQHandler(void)
{
  if(UART_GET_INT_FLAG(UART0,UART_INTSTS_THREINT_Msk))
  {
    Blue_Tx_IT();
  }
  if(UART_GET_INT_FLAG(UART0,UART_INTSTS_RDAINT_Msk))
  {
      Blue_Rx_IT();
  }
}
发帖问问大家怎么办?

使用特权

评论回复
沙发
Jackluo886|  楼主 | 2020-5-3 15:14 | 只看该作者
void UART02_IRQHandler(void)
{
    UART_TEST_HANDLE();
}

/*---------------------------------------------------------------------------------------------------------*/
/* UART Callback function                                                                                  */
/*---------------------------------------------------------------------------------------------------------*/
void UART_TEST_HANDLE()
{
    uint8_t u8InChar = 0xFF;

    if (UART_GET_INT_FLAG(UART0,UART_INTSTS_RDAINT_Msk))
    {
        printf("\nInput:");

        /* Get all the input characters */
        while(UART_IS_RX_READY(UART0))
        {
            /* Get the character from UART Buffer */
            u8InChar = UART_READ(UART0);

            printf("%c ", u8InChar);

            if(u8InChar == '0')
            {
                g_bWait = FALSE;
            }

            /* Check if buffer full */
            if(g_u32comRbytes < RXBUFSIZE)
            {
                /* Enqueue the character */
                g_u8RecData[g_u32comRtail] = u8InChar;
                g_u32comRtail = (g_u32comRtail == (RXBUFSIZE - 1)) ? 0 : (g_u32comRtail + 1);
                g_u32comRbytes++;
            }
        }
        printf("\nTransmission Test:");
    }

    if(UART_GET_INT_FLAG(UART0, UART_INTSTS_THREINT_Msk))
    {
        uint16_t tmp;
        tmp = g_u32comRtail;
        if(g_u32comRhead != tmp)
        {
            u8InChar = g_u8RecData[g_u32comRhead];
            while(UART_IS_TX_FULL(UART0));  /* Wait Tx is not full to transmit data */
            UART_WRITE(UART0, u8InChar);
            g_u32comRhead = (g_u32comRhead == (RXBUFSIZE - 1)) ? 0 : (g_u32comRhead + 1);
            g_u32comRbytes--;
        }
    }

    if(UART0->FIFOSTS & (UART_FIFOSTS_BIF_Msk | UART_FIFOSTS_FEF_Msk | UART_FIFOSTS_PEF_Msk | UART_FIFOSTS_RXOVIF_Msk))
    {
        UART_ClearIntFlag(UART0, (UART_INTSTS_RLSINT_Msk| UART_INTSTS_BUFERRINT_Msk));
    }
}
//官方代码如上


使用特权

评论回复
板凳
jasontu| | 2020-5-4 08:23 | 只看该作者
UART_INTEN_RDAIEN_Msk=>串口FIFO有资料进入,串口要取走资料,就不会产生RDA中断

UART_INTSTS_THREINT_Msk=>表示TX FIFO为空,就会一直进入中断

使用特权

评论回复
评论
Jackluo886 2020-5-5 11:32 回复TA
是的。一直进入中断的是发送空导致。官方代码最后有一个取消中断使能!没看到这里 
地板
huahuagg| | 2020-5-10 17:45 | 只看该作者
取消使能是不是就OK了

使用特权

评论回复
5
xuanhuanzi| | 2020-5-10 17:51 | 只看该作者
官方的例子也是这样的结果?

使用特权

评论回复
6
wahahaheihei| | 2020-5-10 21:35 | 只看该作者
一直发空,要是数据发完了就要关闭。

使用特权

评论回复
7
yiy| | 2020-5-10 23:52 | 只看该作者
之前有人问过这个问题,最后就是取消中断使能,解决。

使用特权

评论回复
8
antusheng| | 2020-5-10 23:57 | 只看该作者
这个波特率也是很少有人用。

使用特权

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

本版积分规则

7

主题

24

帖子

0

粉丝