STM32
直播中

李明聪

8年用户 1233经验值
私信 关注
[问答]

STM32F030K6T6无法进入中断的原因?如何解决?

void Usart_Init(void)
{
        //GPIO¶Ë¿ÚÉèÖÃ
    GPIO_InitTypeDef   GPIO_InitStructure;
  USART_InitTypeDef  USART_InitStructure;
  NVIC_InitTypeDef   NVIC_InitStructure;
   //DMA_InitTypeDef DMA_InitStructure;

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_AHBPeriph_GPIOA, ENABLE); //ʹÄÜUSART1£¬GPIOAʱÖÓ

   USART_DeInit(USART1);

  GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_1);
  GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_1);
  
  //USART1_TX   PA.9
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_10; //PA.9
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //¸´ÓÃÍÆÍìÊä³ö
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
    GPIO_Init(GPIOA,  GPIO_InitStructure); //³õʼ»¯PA9

   //USART ³õʼ»¯ÉèÖÃ
  USART_InitStructure.USART_BaudRate = 9600;//Ò»°ãÉèÖÃΪ9600;
  USART_InitStructure.USART_WordLength = USART_WordLength_8b;//×Ö³¤Îª8λÊý¾Ý¸ñʽ
  USART_InitStructure.USART_StopBits = USART_StopBits_1;//Ò»¸öֹͣλ
  USART_InitStructure.USART_Parity = USART_Parity_No;//ÎÞÆæÅ¼Ð£Ñéλ
  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//ÎÞÓ²¼þÊý¾ÝÁ÷¿ØÖÆ
  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //ÊÕ·¢Ä£Ê½
   USART_Init(USART1,  USART_InitStructure); //³õʼ»¯´®¿Ú
   USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//¿ªÆôÖжÏ
   USART_ITConfig(USART1, USART_IT_IDLE, ENABLE);//
    //USART_DMACmd(USART1,USART_DMAReq_Rx,ENABLE);   //DMA enable
   USART_Cmd(USART1, ENABLE);                   //
   //Usart1 NVIC ÅäÖÃ
    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPriority = 1;  //×ÓÓÅÏȼ¶3
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;   //IRQͨµÀʹÄÜ
  NVIC_Init( NVIC_InitStructure); //¸ù¾ÝÖ¸¶¨µÄ²ÎÊý³õʼ»¯VIC¼Ä´æÆ÷
  
}




void USART1_IRQHandler(void)                 //´®¿Ú1ÖжϷþÎñ³ÌÐò
{
uint8_t Res;
GPIO_ResetBits(GPIOA,GPIO_Pin_8);
if(USART_GetiTStatus(USART1, USART_IT_RXNE) != RESET)  //½ÓÊÕÖжÏ(½ÓÊÕµ½µÄÊý¾Ý±ØÐëÊÇ0x0d 0x0a½áβ)
  {
   Res =USART_ReceiveData(USART1);//(USART1->DR); //¶ÁÈ¡½ÓÊÕµ½µÄÊý¾Ý
   USART1_RX_BUF[len_usart1]=Res;
   len_usart1++;  
   //LedShinning();  
//GPIO_ResetBits(GPIOA,GPIO_Pin_8);   
   
//Receive_Done = 1;   
  }  
if(USART_GetITStatus(USART1, USART_IT_IDLE) != RESET)  //½ÓÊÕÖжÏ(½ÓÊÕµ½µÄÊý¾Ý±ØÐëÊÇ0x0d 0x0a½áβ)
  {
   USART_ClearITPendingBit(USART1,USART_IT_IDLE);
   Receive_Done = 1;  
   //LedShinning();  
//GPIO_ResetBits(GPIOA,GPIO_Pin_8);   
  }  


回帖(1)

恐龙之家

2024-4-12 16:03:23
可能的原因之一是中断优先级配置不正确,导致中断无法触发。可以通过以下步骤来解决:

1. 确保已经正确初始化了外设:GPIO和USART。检查相关的时钟使能以及GPIO和USART的配置是否正确。

2. 确保已经正确配置了USART中断向量表。在NVIC_INIT函数中,使用相应的优先级分组,启用USART相关的中断。

3. 检查是否在USART初始化函数中正确配置了USART的中断使能位USART_ITConfig(USARTx, USART_IT_RXNE, ENABLE)。这里的USART_IT_RXNE表示使能接收寄存器非空中断,可以根据需要进行调整。

4. 确认在主循环中已经使用过相关的USART发送和接收函数,以触发USART中断。

5. 可以通过使用调试工具(如JTAG/SWD)来进行实时调试,观察中断是否被触发以及中断服务程序是否正常执行。

整体来说,需要检查并排除以下可能的原因:时钟、GPIO、USART的配置,中断优先级错误,中断使能配置错误,以及主循环中是否调用了相关的USART函数。同时,使用调试工具进行实时调试也可以帮助找到问题所在。
举报

更多回帖

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