У меня проблемы с кнопками и обработчиком IRQ в keil uVision (STM32F103RBT6) - PullRequest
0 голосов
/ 23 апреля 2020

Извините, что задали такой базовый c вопрос, я новичок в программировании ARM. В настоящее время я борюсь с лабораторным упражнением.

Я должен был: С помощью встроенной кнопки (PC13) включить и выключить встроенный светодиод (PA5). Когда кнопка нажата, светодиод горит. Когда кнопка отпущена, светодиод не горит.

Код ниже может быть построен, но он не дает желаемого результата. На самом деле, ничего не происходит, когда я нажимаю sh кнопку.

#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);
}

Редактировать: я сильно изменил свой код, я решил вообще не использовать таймеры.

#include "stm32f10x.h"                  // Device header
#include "stdbool.h"

//TI2 PA1 Tim2 Ch2
#define BUTTON_RCC_GPIO   RCC_APB2Periph_GPIOA
#define BUTTON_GPIO   GPIOA
#define BUTTON_GPIO_PIN   GPIO_Pin_13

#define L3_RCC_GPIO  RCC_APB2Periph_GPIOA
#define L3_GPIO      GPIOA
#define L3_PIN     GPIO_Pin_5


static bool wait = true;

int main(void) {
    GPIO_InitTypeDef GPIO_InitStruct;

    // GPIO clock for I/O
    RCC_APB2PeriphClockCmd(BUTTON_RCC_GPIO, ENABLE);
  RCC_APB2PeriphClockCmd(L3_RCC_GPIO, ENABLE);

    // Configure I/O for L3
    GPIO_InitStruct.GPIO_Pin = L3_PIN;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;
    GPIO_Init(L3_GPIO, &GPIO_InitStruct);

    while(1) {
                if(BUTTON_GPIO_PIN==true)
                {
                    GPIO_SetBits(L3_GPIO, L3_PIN);
                }else
                {
                    GPIO_ResetBits(L3_GPIO, L3_PIN);
                }
    }
}

1 Ответ

0 голосов
/ 24 апреля 2020

Вы не написали это явно, но я предполагаю, что ваше лабораторное упражнение использует NUCLEO-F103RB , где вы найдете контроллер STM32F103RBTx , оборудованный пользователем pu Кнопка sh на ПК13 и пользовательский светодиод на PA5 - я не думаю, что другой бренд создает печатную плату с такими же свойствами ...: -)


Как уже указывал KIIV в комментарий, причина, по которой вы не видите смены светодиода при нажатии кнопки, заключается в том, что входной контакт контроллера, к которому подключена кнопка (PC13), даже не проверен.

Вместо этого состояние выхода (PA5) для светодиода переключается в ISR, запускаемом прерыванием таймера (TIM2). Конфигурация таймера (которая может быть неполной, я не могу сказать, прочитав только ваш фрагмент кода), запускается нарастающими фронтами на внешнем источнике синхронизации в событии TI2, которое привязано к каналу TIM2_CH2 (доступно для выводов PA1 и PB3, для которых я не вижу никакого кода инициализации, однако).


Некоторые строки являются избыточными (вызовы RCC_APB2PeriphClockCmd() и определения state, которые будут затенять друг друга ...).

У меня сложилось впечатление, что этот код еще не близок к завершению, но вам может быть полезно сначала изучить, чего вы хотите достичь с помощью программы, и что Вы собираетесь достичь с помощью какого раздела вашего кода. Тогда поиск правильного решения для каждой детали - это скорее вопрос старательности и поиска правильных таблиц (см. Ссылки выше).

...