0 / 0 / 0
Регистрация: 06.04.2022
Сообщений: 3
1

stm32 не реагирует на кнопку

18.12.2023, 20:46. Показов 432. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Ломаю голову уже 3 день. Есть задание: При нажатии кнопки первый раз загорается светодиод 1, при нажатии второй раз этой же кнопки загорается 2 светодиод. Нужно написать код, используя драйвер CMSIS. Разобрался в регистрах, все написал, а кнопка зараза все никак не хочет реагировать. Даже неправильно. Светодиоды начинают гореть только тогда, когда я без блока if саморучно в коде их зажигаю. Помогите, прошу. Не понимаю в чем ошибка. Использую stm32f103r4

Код:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include "stm32f1xx.h"
 
void LEDinit (void)
{
    SET_BIT(RCC->APB2ENR, RCC_APB2ENR_IOPAEN);
        GPIOA->CRH |=1<<24; 
        GPIOA->CRH &= ~(1<<26);
 
        GPIOA->CRH |= 1<<20;
        GPIOA->CRH &= ~(1<<22);
}
 
void Buttoninit (void)
{
    SET_BIT(RCC->APB2ENR, RCC_APB2ENR_IOPCEN);
    GPIOC->CRH |=1<<7;
    GPIOC->CRH &=~(1<<6);
 
}
 
int main()
{
    LEDinit ();
    Buttoninit ();
 
    GPIOA->ODR |= GPIO_ODR_ODR13;
    GPIOA->ODR |= GPIO_ODR_ODR14;
 
 
_Bool But = 1;
 
    while(1)
    {
 
        if ((GPIOC->IDR & GPIO_IDR_IDR9) && But ==1)
        {
            GPIOA->BSRR |= GPIO_BSRR_BR13;
 
            while(But)
            {
                if(!(GPIOC->IDR & GPIO_IDR_IDR9))
                {
                    But = 0;
                }
            }
        }
 
        if((GPIOC->IDR & GPIO_IDR_IDR9) && But ==0)
        {
            GPIOA->BSRR |= GPIO_BSRR_BR14;
        }
 
}
}
Скриншот схемы:
Миниатюры
stm32 не реагирует на кнопку  
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.12.2023, 20:46
Ответы с готовыми решениями:

СМА ARISTON AQSL 85 CSI HA 080510580000 после подачи напряжения горят все светодиоды и не реагирует ни на одну кнопку, На блоке управления горят все светодиоды и не реагирует на кнопки
СМА ARISTON AQSL 85 CSI HA S/N 080510580000 по словам клиента машинку после окончания стирки...

Не реагирует на кнопку питания
Здравствуйте уважаемые! Планшет Yarvik Xenta Tab 07-200 Во время игры весь экран резко стал...

Бот не реагирует на кнопку
при нажатии на кнопку и отправке файла он замолкает, не могу понять в чем проблема import os...

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

Не реагирует на кнопку включения
Со мной вышла очень глупая ситуация. Я вставил внешнюю сетевую карту в PCI разъем не той стороной....

4
21 / 18 / 3
Регистрация: 21.11.2017
Сообщений: 111
19.12.2023, 09:23 2
Дребезг контактов кнопки.
0
3881 / 2479 / 418
Регистрация: 09.09.2017
Сообщений: 10,878
19.12.2023, 12:53 3
Цитата Сообщение от CodeNameHawk Посмотреть сообщение
Дребезг контактов кнопки.
В симуляторе, ага.
Цитата Сообщение от Hruck Посмотреть сообщение
кнопка зараза все никак не хочет реагировать.
Тогда попробуйте отвлечься от задания и разобраться сначала с кнопкой. Скажем, написать функцию или макрос, возвращающий нажата ли она, написать программу-повторитель чтобы состояние светодиода всегда равнялось состоянию кнопки.
C
1
2
3
4
5
6
7
char button_pressed(){...}
void led_on(){...}
void led_off(){...}
...
while(1){
  if(button_pressed())led_on(); else led_off();
}
Цитата Сообщение от Hruck Посмотреть сообщение
GPIOC->CRH |=1<<7;
GPIOC->CRH &=~(1<<6);
Это какой режим?
Лучше пишите так:
C
1
2
3
4
uint32_t temp = GPIOC->CRH;
temp &=~ (0b1111 << ((9-8)*4));
temp |= (0b0100 << ((9-8)*4)); //Input, HI-Z
GPIOC->CRH = temp;
Разумеется, это можно написать в одну строчку и заменить магические чиселки константами, но так, мне кажется, будет понятнее алгоритм.
0
523 / 217 / 28
Регистрация: 22.09.2023
Сообщений: 577
19.12.2023, 13:27 4
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Лучше пишите так:
Лучше так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
    enum
    {                   //   CNF        MODE
        ANALOG          = (0 << 2) | (0 << 0),
        INPUT           = (1 << 2) | (0 << 0),
        INPUT_PULL      = (2 << 2) | (0 << 0),
        // Assume 2MHz output
        OUTPUT          = (0 << 2) | (2 << 0),
        OUTPUT_OD       = (1 << 2) | (2 << 0),
 
        ALT_OUTPUT      = (2 << 2) | (2 << 0),
        ALT_OUTPUT_10MHZ= (2 << 2) | (1 << 0),
        ALT_OUTPUT_50MHZ= (2 << 2) | (3 << 0),
        ALT_OUTPUT_OD   = (3 << 2) | (2 << 0),
    };
 
    GPIOA->CRH = 0
        | (INPUT            << 7 * 4)  // ADC_DRDY_1
        | (INPUT_PULL       << 6 * 4)  // SWCLK, pull-down
        | (INPUT_PULL       << 5 * 4)  // SWDIO, pull-up
        | (ALT_OUTPUT_50MHZ << 4 * 4)  // USB_D+
        | (ALT_OUTPUT_50MHZ << 3 * 4)  // USB_D-
        | (OUTPUT           << 2 * 4)  // NC
        | (INPUT_PULL       << 1 * 4)  // USB_VBUS
        | (ALT_OUTPUT_50MHZ << 0 * 4)  // MCO, PHY_CLK
        ;
 
    GPIOA->CRL = 0
        | (INPUT            << 7 * 4)  // PHY_CRS_DV
        | (OUTPUT           << 6 * 4)  // NC
        | (OUTPUT           << 5 * 4)  // NC
        | (OUTPUT           << 4 * 4)  // NC
        | (INPUT_PULL       << 3 * 4)  // PHY_INT
        | (ALT_OUTPUT_50MHZ << 2 * 4)  // PHY_MDIO
        | (INPUT            << 1 * 4)  // MAC_REF_CLK
        | (OUTPUT           << 0 * 4)  // PHY_RST
        ;
"Машина должна работать, а человек - думать" (принцип IBM)
0
3881 / 2479 / 418
Регистрация: 09.09.2017
Сообщений: 10,878
19.12.2023, 15:08 5
Цитата Сообщение от Dushevny Посмотреть сообщение
Лучше так:
Это уже следующий шаг. Пока для ТСа важнее не накручивать абстракции, а реализовать задуманное самым дубовым и очевидным способом. Чтобы он на 100% был уверен как оно работает.
А что до абстракций, мне все же макросы ближе:
C
1
2
3
4
5
6
7
8
9
10
11
12
#define BTN C,9,1,GPIO_HIZ
#define LED1 A,13,0,GPIO_PP50
#define LED2 A,14,0,GPIO_PP50
...
GPIO_config(BTN);
GPIO_config(LED1);
GPIO_config(LED2);
while(1){
  if(GPI_ON(BTN))GPO_ON(LED1); else GPO_OFF(LED1);
  GPO_T(LED2);
  for(volatile uint32_t i=0; i<100000; i++){}
}
0
19.12.2023, 15:08
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.12.2023, 15:08
Помогаю со студенческими работами здесь

Ноутбук не реагирует на кнопку включения
Есть ноутбук HP Compaq 8710p. Не реагирует на кнопку включения, ни с аккумулятором, ни от розетки....

Компьютер не включается, не реагирует на кнопку
Задел шнур мыши и сломал 2 USB входа(блок из 2х разёмов), после чего ПК отключился и больше...

Плата не реагирует на кнопку включения
Приветствую. В общем, есть плата h61m-e. Работала себе работала, пока однажды под руку мне не...

Ноутбук не реагирует на кнопку питания
Предыстория: Я полнейший чайник без чая. Ноутбук ASUS A6000 (A6U REV2.1) не реагирует на кнопку...

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

Компьютер не реагирует на кнопку включение
Вообщем дело было так, я нашёл видеокарты старую решил её проверить, вставил её и компьютер послее...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru