ST意法半导体
直播中

的撒的

11年用户 820经验值
擅长:可编程逻辑
私信 关注
[问答]

如何在stm32f103c8t6上配置外部中断?

#include "STM32f10x.h"
void EXti3_IRQ_IRQHandler(无效)
{
        
        如果(EXTI->PR & EXTI_PR_PR3)
        {
EXTI->PR |= EXTI_PR_PR3;
GPIOA-> BRR |= GPIO_BRR_BS1;
        
        }
        
}
int 主要(无效)
{
        
        RCC ->APB2ENR |= RCC_APB2ENR_IOPAEN; //LED(输出引脚)(PA1)
        GPIOA->CRL &= ~(GPIO_CRL_CNF1);
        GPIOA->CRL |= GPIO_CRL_MODE1_0;
        GPIOA->CRL &= ~(GPIO_CRL_MODE1_1);
        
        RCC ->APB2ENR |= RCC_APB2ENR_IOPBEN;//按钮(输入引脚)(PB3)
        GPIOB->CRL |= GPIO_CRL_CNF3_0;
GPIOB->CRL &= ~(GPIO_CRL_CNF3_1);
        GPIOB->CRL &= ~(GPIO_CRL_MODE3);
        
        RCC ->APB2ENR |= RCC_APB2ENR_AFIOEN;//用于替代功能
        EXTI->IMR |= EXTI_IMR_MR3;//中断屏蔽寄存器(0:屏蔽,1:非屏蔽)
        EXTI->RTSR |= EXTI_RTSR_TR3; // 上升沿触发中断
        AFIO->EXTICR[0] = AFIO_EXTICR1_EXTI3_PB;
        
        
        NVIC_EnableIRQ(EXTI3_IRQn);
        NVIC_SetPriority(EXTI3_IRQn,0);
        
        而(1)
        {
  
GPIOA->BSRR |= GPIO_BSRR_BR1;

        }
}




回帖(1)

廉鼎琮

2023-2-3 15:42:55
我检测到故障/错误,你是对的:我只需要在行之前添加一个延迟(不完全是断点,而是一个延迟函数):GPIOA-> BSRR |= GPIO_BSRR_BR1; 在 while 循环中,因为中断处理函数在处理中断后返回到 while 循环,所以我的代码可能如下所示:


  • void EXTI3_IRQHandler(void)

  • {


  • if(EXTI->PR & EXTI_PR_PR3)

  • {

  • EXTI->PR |= EXTI_PR_PR3;

  • GPIOA-> BRR |= GPIO_BRR_BS1;


  • }


  • }




  • int main(void)

  • {


  • RCC ->APB2ENR |= RCC_APB2ENR_IOPAEN;   //LED(OUTPUT PIN)(PA1)

  • GPIOA->CRL &= ~(GPIO_CRL_CNF1);

  • GPIOA->CRL |= GPIO_CRL_MODE1_0;

  • GPIOA->CRL &= ~(GPIO_CRL_MODE1_1);


  • RCC ->APB2ENR |= RCC_APB2ENR_IOPBEN;   //PUSH BUTTON(INPUT PIN)(PB3)

  • GPIOB->CRL |= GPIO_CRL_CNF3_0;

  • GPIOB->CRL &= ~(GPIO_CRL_CNF3_1);

  • GPIOB->CRL &= ~(GPIO_CRL_MODE3);


  • RCC ->APB2ENR |= RCC_APB2ENR_AFIOEN;  //FOR ALTERNATE FUNCTION

  • EXTI->IMR |= EXTI_IMR_MR3;      //INTERRUPT MASK REGISTER(0:MASKING, 1:NON-MASKING)

  • EXTI->RTSR |= EXTI_RTSR_TR3;     // RISING EDGE TRIGGERED INTERRUPT

  • AFIO->EXTICR[0] = AFIO_EXTICR1_EXTI3_PB;     //ALTERNATE FUNCTION CONFIGURATION FOR-PB3)



  • NVIC_EnableIRQ(EXTI3_IRQn);

  • NVIC_SetPriority(EXTI3_IRQn,0);


  • while(1)

  • {

  •   
  • for(volatile int i=0; i<=10000000; i++);
  • GPIOA-> BSRR |= GPIO_BSRR_BR1;


  • }

  • }
举报

更多回帖

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