Страница 1 из 1
STM32. Проблема с кнопкой - кнопка не реагирует.
Добавлено: Пт янв 27, 2017 21:21:06
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.
В чем моя ошибка, подскажите пожалуйста.
Re: STM32. Проблема с кнопкой - кнопка не реагирует.
Добавлено: Пт янв 27, 2017 22:09:46
Myp3ik
Код: Выделить всё
#define GPIO_IDR_IDR_1 ((uint32_t)0x00000002)
Вы проверяете pin_0
Код: Выделить всё
if (GPIOA->IDR & GPIO_IDR_IDR_1)
{
горит левый LED
}
else
{
горит правый LED
}
Re: STM32. Проблема с кнопкой - кнопка не реагирует.
Добавлено: Сб янв 28, 2017 08:09:23
Vdun
Прошу прощения, не правильно расписал инициализации. Пин 1 имелось ввиду первая нога порта. Светодиоды висят на PB6 PB7 а кнопка на PA0. Соответственно все инициализируется правильно и проверяется тоже.
В отладчика по шагам все проходит правильно, условие проверяется. Но вот нажатие на кнопку ничего не даёт.
Пришла в голову мысль, что может это только для low power контроллеров?
При разборке кода других семейств, там такого не встречал. Данные считываются с порта сразу.
Re: STM32. Проблема с кнопкой - кнопка не реагирует.
Добавлено: Сб янв 28, 2017 13:33:14
dosikus
Код целиком выложите...
Re: STM32. Проблема с кнопкой - кнопка не реагирует.
Добавлено: Сб янв 28, 2017 19:02:05
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 делать быстрее, не надо читать значение порта.
Re: STM32. Проблема с кнопкой - кнопка не реагирует.
Добавлено: Сб янв 28, 2017 19:35:28
dosikus
В BSRRx не надо делать RMW, сразу записывайте значение.
Не |= а =
Re: STM32. Проблема с кнопкой - кнопка не реагирует.
Добавлено: Сб янв 28, 2017 23:55:49
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;
}
Re: STM32. Проблема с кнопкой - кнопка не реагирует.
Добавлено: Вс янв 29, 2017 07:19:43
Vdun
Спасибо, учту. Ещё много но не знаю. С выучил за новогодние праздники, так что строго не судите
Re: STM32. Проблема с кнопкой - кнопка не реагирует.
Добавлено: Вс янв 29, 2017 10:32:01
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;
}
Re: STM32. Проблема с кнопкой - кнопка не реагирует.
Добавлено: Вс янв 29, 2017 12:16:44
Vdun
To Мурзик.
Проблема в том, что BSRR в кокосе не определен.
есть два регистра H и L.
поэтому Ваш вариант не работает.
To Досикус
Согласен, что так проще и удобнее, но как я и говорил, Си только начал осваивать, поэтому многие структуры еще не понятны )))
Re: STM32. Проблема с кнопкой - кнопка не реагирует.
Добавлено: Вс янв 29, 2017 12:44:27
dosikus
Спрашивайте, поможем чем сможем

Re: STM32. Проблема с кнопкой - кнопка не реагирует.
Добавлено: Вс янв 29, 2017 14:03:15
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;