STM32. Проблема с кнопкой - кнопка не реагирует.
STM32. Проблема с кнопкой - кнопка не реагирует.
Всем здрасти.
Подскажите, бьюсь уже неделю, победить не могу:
Приобрел 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.
В чем моя ошибка, подскажите пожалуйста.
Подскажите, бьюсь уже неделю, победить не могу:
Приобрел 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. Проблема с кнопкой - кнопка не реагирует.
Код: Выделить всё
#define GPIO_IDR_IDR_1 ((uint32_t)0x00000002)
Код: Выделить всё
if (GPIOA->IDR & GPIO_IDR_IDR_1)
{
горит левый LED
}
else
{
горит правый LED
}
Иван Сусанин - первый полупроводник 
Re: STM32. Проблема с кнопкой - кнопка не реагирует.
Прошу прощения, не правильно расписал инициализации. Пин 1 имелось ввиду первая нога порта. Светодиоды висят на PB6 PB7 а кнопка на PA0. Соответственно все инициализируется правильно и проверяется тоже.
В отладчика по шагам все проходит правильно, условие проверяется. Но вот нажатие на кнопку ничего не даёт.
Пришла в голову мысль, что может это только для low power контроллеров?
При разборке кода других семейств, там такого не встречал. Данные считываются с порта сразу.
В отладчика по шагам все проходит правильно, условие проверяется. Но вот нажатие на кнопку ничего не даёт.
Пришла в голову мысль, что может это только для low power контроллеров?
При разборке кода других семейств, там такого не встречал. Данные считываются с порта сразу.
Re: STM32. Проблема с кнопкой - кнопка не реагирует.
Код целиком выложите...
Re: STM32. Проблема с кнопкой - кнопка не реагирует.
Досикус, спасибо.
Стал копировать код и увидел, что порт А не тактируется. Добавил бит и все заработало.
Ошибку искал в другом месте. тк разбираясь с проблемой кнопку цеплял и на порт 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 делать быстрее, не надо читать значение порта.
Стал копировать код и увидел, что порт А не тактируется. Добавил бит и все заработало.
Ошибку искал в другом месте. тк разбираясь с проблемой кнопку цеплял и на порт 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. Проблема с кнопкой - кнопка не реагирует.
В BSRRx не надо делать RMW, сразу записывайте значение.
Не |= а =
Не |= а =
Re: STM32. Проблема с кнопкой - кнопка не реагирует.
Удобнее когда 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. Проблема с кнопкой - кнопка не реагирует.
Спасибо, учту. Ещё много но не знаю. С выучил за новогодние праздники, так что строго не судите
Re: STM32. Проблема с кнопкой - кнопка не реагирует.
Код: Выделить всё
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;
}Здесь выгодней заменять на макросы
Код: Выделить всё
#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. Проблема с кнопкой - кнопка не реагирует.
To Мурзик.
Проблема в том, что BSRR в кокосе не определен.
есть два регистра H и L.
поэтому Ваш вариант не работает.
To Досикус
Согласен, что так проще и удобнее, но как я и говорил, Си только начал осваивать, поэтому многие структуры еще не понятны )))
Проблема в том, что BSRR в кокосе не определен.
есть два регистра H и L.
поэтому Ваш вариант не работает.
To Досикус
Согласен, что так проще и удобнее, но как я и говорил, Си только начал осваивать, поэтому многие структуры еще не понятны )))
Re: STM32. Проблема с кнопкой - кнопка не реагирует.
Спрашивайте, поможем чем сможем 
Re: STM32. Проблема с кнопкой - кнопка не реагирует.
Если не определен, значит надо определить
Код: Выделить всё
#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;
Иван Сусанин - первый полупроводник 


