我在keil uVision(STM32F103RBT6)中使用按钮和IRQ处理程序时遇到麻烦

问题描述 投票:0回答:1

很抱歉问这样一个基本问题,我是ARM编程的初学者。我目前正在努力进行实验室练习。

我应该:使用板上按钮(PC13)打开和关闭板上LED(PA5)。按下按钮时,LED点亮。释放按钮后,LED熄灭。

下面的代码可以构建,但不会产生我想要的结果。实际上,当我按下按钮时什么也没有发生。

#include "stm32f10x.h"                  // Device header
#include "stdbool.h"                 // For Boolean data type

#define BUTTON_RCC_GPIO  RCC_APB2Periph_GPIOC
#define BUTTON_GPIO       GPIOC 
#define BUTTON_GPIO_PIN   GPIO_Pin_13

int main(void) {

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    RCC_APB2PeriphClockCmd(BUTTON_RCC_GPIO, ENABLE); 


    //GPIO set up for PA5 (on board LED)
    GPIO_InitTypeDef GPIO_InitStructure; 
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    //Timer 2 set up
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

    TIM_TimeBaseInitTypeDef timerInitStructure;
    timerInitStructure.TIM_Prescaler = 0;  
    timerInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
    timerInitStructure.TIM_Period = 0;  
    timerInitStructure.TIM_ClockDivision = 0; 
    timerInitStructure.TIM_RepetitionCounter = 0;
    TIM_TimeBaseInit(TIM2, &timerInitStructure);
    TIM_Cmd(TIM2, ENABLE);

    TIM_TIxExternalClockConfig(TIM2, TIM_TIxExternalCLK1Source_TI2, TIM_ICPolarity_Rising, 0);

    //Enable update event for Timer2
    TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
    NVIC_EnableIRQ(TIM2_IRQn);

    while(1);

    static char state = 0;
}

static char state = 0;

void TIM2_IRQHandler(void) { 
    if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) { 
            GPIO_ResetBits(GPIOA, GPIO_Pin_5); 
            state = 1; 
        } else {
            GPIO_SetBits(GPIOA, GPIO_Pin_5);
            state = 0;
        }
        TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
}
arm stm32 interrupt keil
1个回答
0
投票

您未明确编写此内容,但我假设您的实验室练习使用NUCLEO-F103RB,您可以在其中找到STM32F103RBTx控制器在PC13处配备了一个用户按钮,在PA5处配备了一个用户LED-我几乎不认为其他品牌会创建具有相同属性的PCB ...:-)


正如KIIV在评论中已经指出的那样,按下按钮时看不到LED改变的原因是,甚至没有检查按钮所连接的控制器输入引脚(PC13)。

相反,LED的输出状态(PA5)在由计时器(TIM2)中断触发的ISR中切换。在事件TI2处,外部时钟源的上升沿触发了计时器配置(这可能是不完整的,我无法仅通过阅读代码片段来判断),该事件与通道TIM2_CH2关联(可用于引脚[ C0]和PA1,但是我看不到任何初始化代码。


某些行是多余的(对PB3的调用和RCC_APB2PeriphClockCmd()的定义,它们会相互影...)。

我给您的印象是该代码尚未完成,但是对于您首先研究您希望通过该程序实现什么以及将要在代码的哪个部分实现什么可能会有所帮助。然后,为每个细节找到合适的解决方案更多是用功的问题,并查找合适的数据表(请参见上面的链接)。

© www.soinside.com 2019 - 2024. All rights reserved.