STM32. Проблема с кнопкой - кнопка не реагирует.

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Vdun
Родился
Сообщения: 10
Зарегистрирован: Пт янв 27, 2017 21:07:35

STM32. Проблема с кнопкой - кнопка не реагирует.

Сообщение Vdun »

Всем здрасти.
Подскажите, бьюсь уже неделю, победить не могу:
Приобрел STM32L152 Discovery.
Зажигать светодиоды научился, мигать тоже.
Проблема с кнопкой - кнопка не реагирует.

RCC->AHBENR...подали тактирование
GPIOB->MODER...6 и 7 пин на выход
GPIOA->MODER...1 пин на вход
GPIOB->PUPDR...push-pull pull-up
GPIOA->PUPDR...push-pull pull-up
if (GPIOA->IDR&0x01U)
{горит левый LED}
else
{горит правый LED}

Программа на кнопку не реагирует. Если проинвертировать условие то диоды горят наоборот.
Проект собирал в кокосе.
Из всех примеров на эту CPU с копкой в интернете нашел только один, но там кнопка задействована через EXTI.
Из референс мануала не похоже, что надо через прерывания опрашивать кнопку, все должно работать через I/O input.

В чем моя ошибка, подскажите пожалуйста.
Реклама
Аватара пользователя
Myp3ik
Мучитель микросхем
Сообщения: 450
Зарегистрирован: Вс янв 09, 2011 23:05:37
Откуда: СССР

Re: STM32. Проблема с кнопкой - кнопка не реагирует.

Сообщение Myp3ik »

Код: Выделить всё

#define GPIO_IDR_IDR_1    ((uint32_t)0x00000002)
Вы проверяете pin_0

Код: Выделить всё

if (GPIOA->IDR & GPIO_IDR_IDR_1)
{
    горит левый LED
}
else
{
    горит правый LED
}
Иван Сусанин - первый полупроводник :solder:
Реклама
Vdun
Родился
Сообщения: 10
Зарегистрирован: Пт янв 27, 2017 21:07:35

Re: STM32. Проблема с кнопкой - кнопка не реагирует.

Сообщение Vdun »

Прошу прощения, не правильно расписал инициализации. Пин 1 имелось ввиду первая нога порта. Светодиоды висят на PB6 PB7 а кнопка на PA0. Соответственно все инициализируется правильно и проверяется тоже.
В отладчика по шагам все проходит правильно, условие проверяется. Но вот нажатие на кнопку ничего не даёт.

Пришла в голову мысль, что может это только для low power контроллеров?

При разборке кода других семейств, там такого не встречал. Данные считываются с порта сразу.
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: STM32. Проблема с кнопкой - кнопка не реагирует.

Сообщение dosikus »

Код целиком выложите...
Реклама
Эиком - электронные компоненты и радиодетали
Vdun
Родился
Сообщения: 10
Зарегистрирован: Пт янв 27, 2017 21:07:35

Re: STM32. Проблема с кнопкой - кнопка не реагирует.

Сообщение Vdun »

Досикус, спасибо.
Стал копировать код и увидел, что порт А не тактируется. Добавил бит и все заработало.
Ошибку искал в другом месте. тк разбираясь с проблемой кнопку цеплял и на порт B так же.
#include "stm32l1xx.h"
int main(void)
{

RCC->AHBENR |= (RCC_AHBENR_GPIOBEN | RCC_AHBENR_GPIOAEN);


GPIOB->MODER |= GPIO_MODER_MODER6_0;
GPIOB->MODER |= GPIO_MODER_MODER7_0;
GPIOA->PUPDR|=GPIO_PUPDR_PUPDR0_0;
GPIOB->PUPDR|=GPIO_PUPDR_PUPDR6_0;
GPIOB->PUPDR|=GPIO_PUPDR_PUPDR7_0;

while(1)
{
if(!(GPIOA->IDR & 0x01U))
{
GPIOB->BSRRH|=GPIO_BSRR_BS_6;
GPIOB->BSRRL|=GPIO_BSRR_BS_7;
}else{
GPIOB->BSRRH|=GPIO_BSRR_BS_7;
GPIOB->BSRRL|=GPIO_BSRR_BS_6;
}
}
}

Добавлено after 8 minutes 16 seconds:
Для тех, кто только учится:
AHBENR - включаем порт A и B (подаем тактирование)
MODER - настраиваем вход/выход. Порт А не указан по той причине, что он по умолчанию настроен на вход.
PUPDR - включаем подтяжку.
IDR - считываем кнопку (читается весь порт!)
BSRRH и BSRRL - 32 битный регистр BSRR для установки/сброса значения в порт.
Можно использовать и ODR, но через BSSR делать быстрее, не надо читать значение порта.
Реклама
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: STM32. Проблема с кнопкой - кнопка не реагирует.

Сообщение dosikus »

В BSRRx не надо делать RMW, сразу записывайте значение.
Не |= а =
Реклама
Аватара пользователя
Myp3ik
Мучитель микросхем
Сообщения: 450
Зарегистрирован: Вс янв 09, 2011 23:05:37
Откуда: СССР

Re: STM32. Проблема с кнопкой - кнопка не реагирует.

Сообщение Myp3ik »

Удобнее когда BSRR определен как один 32-разрядный регистр. Тогда можно делать так:

Код: Выделить всё

GPIOB->BSRR = !(GPIOA->IDR & GPIO_IDR_IDR_0) ? GPIO_BSRR_BR_6 | GPIO_BSRR_BS_7 : GPIO_BSRR_BS_6 | GPIO_BSRR_BR_7;
Вместо:

Код: Выделить всё

if (!(GPIOA->IDR & 0x01U))
{
    GPIOB->BSRRH|=GPIO_BSRR_BS_6;
    GPIOB->BSRRL|=GPIO_BSRR_BS_7;
}
else
{
    GPIOB->BSRRH|=GPIO_BSRR_BS_7;
    GPIOB->BSRRL|=GPIO_BSRR_BS_6;
}
Иван Сусанин - первый полупроводник :solder:
Vdun
Родился
Сообщения: 10
Зарегистрирован: Пт янв 27, 2017 21:07:35

Re: STM32. Проблема с кнопкой - кнопка не реагирует.

Сообщение Vdun »

Спасибо, учту. Ещё много но не знаю. С выучил за новогодние праздники, так что строго не судите
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: STM32. Проблема с кнопкой - кнопка не реагирует.

Сообщение dosikus »

Код: Выделить всё

GPIOB->BSRR = !(GPIOA->IDR & GPIO_IDR_IDR_0) ? GPIO_BSRR_BR_6 | GPIO_BSRR_BS_7 : GPIO_BSRR_BS_6 | GPIO_BSRR_BR_7;
Vdun, лучше не делать подобных конструкций на этапе изучения.
Код от этого не уменьшится, зато мозг вам затрахает при отладке.

Код: Выделить всё

if (!(GPIOA->IDR & 0x01U))
{
    GPIOB->BSRRH|=GPIO_BSRR_BS_6;
    GPIOB->BSRRL|=GPIO_BSRR_BS_7;
}
else
{
    GPIOB->BSRRH|=GPIO_BSRR_BS_7;
    GPIOB->BSRRL|=GPIO_BSRR_BS_6;
}

Здесь выгодней заменять на макросы

Код: Выделить всё

  
#define KEY     GPIOA->IDR & 0x01UL
#define LED_GREEN_ON  GPIOB->BSRRH=GPIO_BSRR_BS_6
#define LED_GREEN_OFF  GPIOB->BSRRL=GPIO_BSRR_BS_6

#define LED_BLUE_ON  GPIOB->BSRRH=GPIO_BSRR_BS_7
#define LED_BLUE_OFF  GPIOB->BSRRL=GPIO_BSRR_BS_7
В итоге код становится читаем и самодокументируемым :

Код: Выделить всё

if (!(KEY))
{
    LED_GREEN_ON;
    LED_BLUE_OFF ;
}
else
{
   LED_BLUE_ON;
   LED_GREEN_OFF;
}
Vdun
Родился
Сообщения: 10
Зарегистрирован: Пт янв 27, 2017 21:07:35

Re: STM32. Проблема с кнопкой - кнопка не реагирует.

Сообщение Vdun »

To Мурзик.
Проблема в том, что BSRR в кокосе не определен.
есть два регистра H и L.
поэтому Ваш вариант не работает.

To Досикус
Согласен, что так проще и удобнее, но как я и говорил, Си только начал осваивать, поэтому многие структуры еще не понятны )))
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: STM32. Проблема с кнопкой - кнопка не реагирует.

Сообщение dosikus »

Спрашивайте, поможем чем сможем :)))
Аватара пользователя
Myp3ik
Мучитель микросхем
Сообщения: 450
Зарегистрирован: Вс янв 09, 2011 23:05:37
Откуда: СССР

Re: STM32. Проблема с кнопкой - кнопка не реагирует.

Сообщение Myp3ik »

Если не определен, значит надо определить :)))

Код: Выделить всё

#define GPIOB_BSRR    (*((__IO uint32_t*)&GPIOB->BSRRL))

GPIOB_BSRR = !(GPIOA->IDR & GPIO_IDR_IDR_0) ? GPIO_BSRR_BR_6 | GPIO_BSRR_BS_7 : GPIO_BSRR_BS_6 | GPIO_BSRR_BR_7;
Иван Сусанин - первый полупроводник :solder:
Ответить

Вернуться в «ARM»