MM32G0001清除不了空闲中断

[复制链接]
11521|16
 楼主| 桑有槐 发表于 2024-7-3 16:19 | 显示全部楼层 |阅读模式
用户手册说读取寄存器后会将标志位清零,但是在中断函数中读取了SR和DR寄存器还是会一直进入空闲中断,一直在发数据。串口发送函数注释掉也没用,应该和发送函数没有关系
 楼主| 桑有槐 发表于 2024-7-3 16:20 | 显示全部楼层

MM32G0001清除不了空闲中断

 楼主| 桑有槐 发表于 2024-7-3 16:21 | 显示全部楼层

MM32G0001清除不了空闲中断

 楼主| 桑有槐 发表于 2024-7-3 16:22 | 显示全部楼层

MM32G0001清除不了空闲中断

void USART1_IRQHandler(void)
{
    int a=0;

    if ((RESET != USART_GetITStatus(USART1, USART_IT_PE)) ||
        (RESET != USART_GetITStatus(USART1, USART_IT_ERR)))
    {
        a=USART1->SR;
        a=USART1->DR;//软件序列清除IDLE标志位
        USART_SendData(USART1,52);
    }

    if (RESET != USART_GetITStatus(USART1, USART_IT_RXNE))
    {
        RX_one[i] = USART_ReceiveData(USART1);
        RX_flat = 0;
        USART_SendData(USART1,RX_one[i]);
        i++;
    }

    if (RESET != USART_GetITStatus(USART1, USART_IT_IDLE))
    {
        a=USART1->SR;
        a=USART1->DR;//软件序列清除IDLE标志位

        RX_one[i] = '\0';USART_SendData(USART1,53);
        RX_flat = 1;

    }   
}
xch 发表于 2024-7-3 19:06 | 显示全部楼层
桑有槐 发表于 2024-7-3 16:22
void USART1_IRQHandler(void)
{
    int a=0;

可能读多次SR 再读DR就没法清除了。
xch 发表于 2024-7-3 19:31 | 显示全部楼层
void USART1_IRQHandler(void)
{
  uint16_t status = USART1->SR;  //read SR only once
  if ( status & USART_IT_RXNE )
{
   RX_one[i ++ ] = USART1->>DR;
    //......
}
  if (  status & USART_IT_IDLE )
{
    USART->DR;
  //....................
}
}

试试。

评论

xch
@桑有槐 :可能是又空闲了会再次中断。  发表于 2024-7-4 09:10
还是不行,一直在进空闲中断  发表于 2024-7-4 08:48
xionghaoyun 发表于 2024-7-4 08:26 | 显示全部楼层
寄存器打扰了

评论

是因为有别的地方读取了SR和DR吗?  发表于 2024-7-4 08:49
xch 发表于 2024-7-4 09:16 | 显示全部楼层
void USART1_IRQHandler(void)
{
  uint16_t status = USART1->SR;  //read SR only once
  if ( status & USART_IT_RXNE )
{
   RX_one[i ++ ] = USART1->>DR;
    //......
}
  if (  status & USART_IT_IDLE )
{
    USART1->DR;
    volatile uint16_t test_sr =0;
   test_sr = USART1->SR; //给寄存器照个快照
  while(1)
{
   test_sr  &= USART_IT_IDLE ;
}
  //....................
}
}

评论

我没太看懂这个....为什么要写一个while(1)啊  发表于 2024-7-4 09:38
xch 发表于 2024-7-4 09:33 | 显示全部楼层
我用别家MCU 空闲中断是收到正常数据后才使能空闲中断。空闲中断一次就禁止空闲中断。
void USART1_IRQHandler(void)
{
  uint16_t status = USART1->SR;  //read SR only once
  if ( status & USART_IT_RXNE )
{
   RX_one[i ++ ] = USART1->>DR;
   USART1->CR1 |= USART_CR1_IDLEIEN; //启用空闲中断
    //......
}
  if ((  status & USART_IT_IDLE )&&(USART1->CR1 & USART_CR1_IDLEIEN ) )
{
    USART1->CR1 &= ~USART_CR1_IDLEIEN; //禁止空闲中断
    USART1->DR;
  //....................
}
}

评论

xch
@桑有槐 :禁止空闲中断了怎么还进去?  发表于 2024-7-4 12:14
@xch :现在是按照你的这个写的,发现空闲中断是,接收数据前进入了一次,接收完数据后又进入了一次。不管在接收数据前有没有开启空闲中断都是这样  发表于 2024-7-4 10:23
xch
@桑有槐 :初始化时不开空闲中断。仅收到一个字符后才开空闲中断。  发表于 2024-7-4 10:02
MM32G0001用户手册里面写的是“空闲状态为总线在开始发送或者开始接收前的初始状态。”,好像每次接受前都会进入一次空闲中断  发表于 2024-7-4 09:46
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

13

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部