STM32
直播中

徐生财

10年用户 851经验值
擅长:MEMS/传感技术
私信 关注
[问答]

STM8L151G6串口进不了中断的原因?

void main(void)//*************************主函数
{
        uint8 i;
  System_Init();
  //PVD_Config();
  __enable_interrupt();//**************开总中断
  while (1)
  {
         
          /*Prompt_Tone(4);
          delay_ms(500);
          Prompt_Tone(0);
          delay_ms(500);
          Prompt_Tone(1);
          delay_ms(500);
          Prompt_Tone(2);
          delay_ms(500);
          Prompt_Tone(3);
          delay_ms(500);
          RLED_OFF();
          delay_ms(500);*/
                for(i = 0; i < 200; i++)
                {
                        RLED_ON();
                        UART0_Send_Byte(i);
                        delay_ms(500);
                        RLED_OFF();
                        delay_ms(500);
                }
        }
}

void Uart_Init(void)//********************************中断初始化
{
  CLK_PeripheralClockConfig(CLK_Peripheral_USART1, ENABLE);
  GPIO_ExternalPullUpConfig(GPIOC, GPIO_Pin_3, ENABLE);

  USART_Init(USART1, (uint32_t)9600, USART_WordLength_8b, USART_StopBits_1,USART_Parity_No, (USART_Mode_TypeDef)(USART_Mode_Tx));//串口初始化
  USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//************开串口中断
  USART_Cmd(USART1, ENABLE);
}

#pragma vector = USART1_RX_IRQn
__interrupt void UART1_RX_IRQHandler(void)
{
        BUZE(1);//***************蜂鸣
        RxBuffer[0] = USART_ReceiveData8(USART1); //Store the received byte in RxBuffer
        UART0_Send_Byte(RxBuffer[0]);//************发回接收到的数据
        return;
}


以上是我对串口的操作,发送的我没有贴上来,因为发送正常,就是串口接收,我想要用中断来接收,可测试发现不管怎么折腾都进不了中断,疑惑,求解!


回帖(2)

刘丽菲

2024-4-30 16:32:35
中断处理函数,不要用 return 试试 
举报

李鸿

2024-5-6 17:13:52
STM8L151G6串口进不了中断的原因可能有以下几点:

1. 中断使能未开启:在STM8L151G6的串口通信中,需要确保串口的接收中断使能位(CR2寄存器的RIEN位)和全局中断使能位(CR1寄存器的EA位)都已设置。

2. 中断优先级设置不正确:STM8L151G6的中断优先级需要正确设置,以确保串口中断能够被正确触发。请检查ITC_SPRx寄存器中的优先级设置。

3. 串口配置错误:确保串口的配置正确,包括波特率、数据位、停止位和奇偶校验位等。

4. 串口接收缓冲区溢出:如果串口接收缓冲区溢出,可能会导致串口中断无法触发。请检查串口接收缓冲区的状态,并在接收到数据后及时处理。

5. 中断服务函数未正确编写:请确保你的中断服务函数(如USART_RX_IRQHandler)已经正确编写,并在其中处理串口接收到的数据。

6. 中断标志位未清除:在中断服务函数中,需要清除相应的中断标志位(如USART_SR寄存器的RXNE位),以确保中断能够继续触发。

7. 硬件问题:如果以上步骤都检查无误,但串口中断仍然无法触发,可能是硬件存在问题。建议检查STM8L151G6的硬件连接和外围设备。

在你的代码中,已经开启了全局中断(`__enable_interrupt();`),但是还需要确保串口的接收中断使能位(CR2寄存器的RIEN位)已设置。此外,请检查你的中断服务函数是否正确编写,并在其中处理串口接收到的数据。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分