Нет реакции на нажатие кнопки в stm32vldiscovery(ответ найден)
Программирую на плате stm32vldiscovery. Кнопка соединена с микроконтроллером через пин A0, светодиод - через пин С9 (кнопка и светодиод встроены в плату). Все нужные библиотеки подключены. Написал следующий код на Си:
#include "stm32f10x.h"
#include "stm32f10x_conf.h"
void main(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitTypeDef GPIO_Init_struct;
GPIO_StructInit(&GPIO_Init_struct);
GPIO_Init_struct.GPIO_Pin=GPIO_Pin_0;
GPIO_Init_struct.GPIO_Speed= GPIO_Speed_2MHz;
GPIO_Init_struct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_Init_struct);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitTypeDef GPIO_Init_struct2;
GPIO_StructInit(&GPIO_Init_struct2);
GPIO_Init_struct2.GPIO_Pin = GPIO_Pin_9;
GPIO_Init_struct2.GPIO_Speed= GPIO_Speed_2MHz;
GPIO_Init_struct2.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOC, &GPIO_Init_struct2);
int state;
while (1){
state = GPIO_ReadInputDataBit(GPIOA, 0);
if (state){
GPIO_SetBits(GPIOC, GPIO_Pin_9);
}
else{
GPIO_ResetBits(GPIOC, GPIO_Pin_9);
}
}}
Ошибки нет, программа компилируется. Только светодиод не горит, когда нажимаю на кнопку, просто всё время находится в выключенном состоянии. Значение GPIO_Mode менять пробовал, ничего не изменилось. Дело именно в кнопке, так как я пробовал инвертировать условие:
if (!state){
GPIO_SetBits(GPIOC, GPIO_Pin_9);
}
else{
GPIO_ResetBits(GPIOC, GPIO_Pin_9);
}
Светодиод теперь всё время горит, несмотря на нажатие кнопки. Судя по всему, проблема в том, что GPIO_ReadInputDataBit(GPIOA, 0) возвращает всё время только 0.
Решение нашлось. Вместо
state = GPIO_ReadInputDataBit(GPIOA, 0);
надо было писать
state = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0);