Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STM32 вход с пулапом
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Jenya7
Хочу отконфигурировать пин как вход с пуллапом.
Камень STM32F103.
CODE
void GpioInit(void)
{
//PORTC Settings
RCC->APB2ENR |= RCC_APB2ENR_IOPCEN; //GPIO portC clocking
GPIOC->CRL |= GPIO_CRL_CNF0_1; //PC0 input with pull-up/pull-down resistor
GPIOC->BSRR = GPIO_BSRR_BS0; //set pull-up on PC0
}


И потом проверяю.
CODE
int main(void)
{
GlobalInit();
UsartSendString("Start\r"); // to check we are still alive
while(1)
{

if(GPIOC->IDR & GPIO_IDR_IDR0==0)
{
delay_100us(); //debounce
if(GPIOC->IDR & GPIO_IDR_IDR0==0)
{
UsartSendString("Button 0\r");
}
}
}


Вроде все сделал правильно но не работает. На пине 0 вольт, хотя должно быть 3.3V.
smalcom
Цитата
И потом проверяю.

1. только программой, не прибором?
2. и что пишет программа?

Цитата
GlobalInit();

а там вызывается GpioInit?


Цитата
GPIOC->IDR & GPIO_IDR_IDR0==0

а с учётом приоритета операций тут чушь написана.

зы. это и отвечает на вопрос про прибор.
Jenya7
Цитата(smalcom @ Sep 9 2013, 11:40) *
1. только программой, не прибором?
2. и что пишет программа?

а там вызывается GpioInit?

а с учётом приоритета операций тут чушь написана.

зы. это и отвечает на вопрос про прибор.


В GlobalInit() входит GpioInit().
GPIOC->IDR & GPIO_IDR_IDR0 обычная проверка с маской, в любом случае она не обнуляет пин,как я понимаю.

я убрал в мэйне код проверки пина, все равно не вижу пулапа на пине.
KnightIgor
Цитата(Jenya7 @ Sep 9 2013, 08:13) *
В GlobalInit() входит GpioInit().
GPIOC->IDR & GPIO_IDR_IDR0 обычная проверка с маской, в любом случае она не обнуляет пин,как я понимаю.

я убрал в мэйне код проверки пина, все равно не вижу пулапа на пине.

Надо установить сам выход (ODR) в "1".
Jenya7
Цитата(KnightIgor @ Sep 9 2013, 12:27) *
Надо установить сам выход (ODR) в "1".


установил GPIOC->ODR = GPIO_ODR_ODR0; все равно 0 вольт на пине.
KnightIgor
Цитата(Jenya7 @ Sep 9 2013, 08:51) *
установил GPIOC->ODR = GPIO_ODR_ODR0; все равно 0 вольт на пине.

GPIOC->CRL |= GPIO_CRL_CNF1_1; //PC0 input with pull-up/pull-down resistor
Jenya7
Цитата(KnightIgor @ Sep 9 2013, 13:18) *
GPIOC->CRL |= GPIO_CRL_CNF1_1; //PC0 input with pull-up/pull-down resistor

не помогло sad.gif
Jenya7
а вообще кто-нибудь конфигурировал пин как вход с пулапом?
Genadi Zawidowski
Я конфигурировал.
see https://188.134.5.254/export/378/trunk/hardware.c, функция arm_hardware_pioa_inputs, например. Используется макрос arm_stm32f10x_hardware_pio_prog
Про приоритет операций в проверке состояния входного пина Вы зря не слушаете... Но к установке PullUp не относится.
Jenya7
Цитата(Genadi Zawidowski @ Sep 9 2013, 15:36) *
Я конфигурировал.
see https://188.134.5.254/export/378/trunk/hardware.c, функция arm_hardware_pioa_inputs, например. Используется макрос arm_stm32f10x_hardware_pio_prog
Про приоритет операций в проверке состояния входного пина Вы зря не слушаете... Но к установке PullUp не относится.

я слушаю - я не понимаю, в чем фишка sm.gif

а понял - скобки не поставил, как то пропустил по невнимательностию

Genadi Zawidowski,
если я иду на использование макроса
CODE
#define arm_stm32f10x_hardware_pio_prog(gpio, iomask, cnf, mode) \
do { \
const portholder_t lo = power4((iomask) >> 0); \
const portholder_t hi = power4((iomask) >> 8); \
(gpio)->CRL = ((gpio)->CRL & ~ ((GPIO_CRL_MODE0 | GPIO_CRL_CNF0) * lo)) | (((GPIO_CRL_MODE0_0 * (mode)) | (GPIO_CRL_CNF0_0 * (cnf))) * lo); \
(gpio)->CRH = ((gpio)->CRH & ~ ((GPIO_CRH_MODE8 | GPIO_CRH_CNF8) * hi)) | (((GPIO_CRH_MODE8_0 * (mode)) | (GPIO_CRH_CNF8_0 * (cnf))) * hi); \
} while (0)


то почему не воспользоваться стандартной библиотекой? я изначально отказался от всяких наворотов, хочу работать напрямую с регистрами, тем более в инициализации, где один раз написал и забыл. в атмеле работа напрямую с регистрами позволяла мне писать довольно эффективный код.

необходимый и достаточный код для входа с пулапом
CODE
RCC->APB2ENR |= RCC_APB2ENR_IOPCEN; //GPIO portC clocking
GPIOC->CRL = GPIO_CRL_CNF0_1; //PC0 input with pull-up/pull-down resistor
GPIOC->BSRR |= GPIO_BSRR_BS0; //set pull-up on PC0


найден эмпирическим путем sm.gif
demiurg_spb
Не надо в BSRR писать по маске.
Просто присвоение быстрее:
Код
GPIOC->BSRR = GPIO_BSRR_BS0;  //set pull-up on PC0
Jenya7
Цитата(demiurg_spb @ Sep 9 2013, 18:11) *
Не надо в BSRR писать по маске.
Просто присвоение быстрее:
Код
GPIOC->BSRR = GPIO_BSRR_BS0;  //set pull-up on PC0

да но если другие пины выставлены в различные состояния? например PC1 выход с единицей на нем?
demiurg_spb
Цитата(Jenya7 @ Sep 9 2013, 17:30) *
да но если другие пины выставлены в различные состояния? например PC1 выход с единицей на нем?

Всё будет хорошо.
Почитайте мануал на регистры BRR и BSRR и тогда поймёте, чем они отличаются от регистра ODR и почему их пара.
Genadi Zawidowski
Цитата
то почему не воспользоваться стандартной библиотекой?

Та библиотека, которая частично находится в продемонстрированном Вам файле - кросплатформенная, проект под под ATMEGAxx, ATXMEGAxx, AT91SAM7/9xxx, ATSAM3Sxxxб STM32F1xx, STM32F3xx, STM32F40x. Стандартной не наблюдается.
Да, а чтение из регистра, предназначенного только для записи даёт непредсказуемое значение.
Jenya7
понял. всем спасибо.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.