исходные данные:
stm32vldiscovery
STM32VL-Discovery-template
- No CubeX
набросал тест "помограть" с "кнопкой"
- синий св.диод моргает ~ 1Гц
- зеленый св.диод - меняет состояние по нажатию на кнопку
есть непонимание: код чтения пина кнопки "тормозит", точнее
- если код "чтения" заремить - то син.св.диод переключается "правильно", прим. 1Гц
- если код "включить", то син.св.диод переключается прим. в 2 раза медленнее
понятное дело, где-то тупой косяк, швыряйтесь наздоровье.
спасибо
main.c
Спойлер
Код: Выделить всё
#include "stm32f10x.h"
#define TIMER_CNT 0xFFFFE
#define LED_B_SET (GPIO_SetBits (GPIOC, GPIO_Pin_8))
#define LED_B_CLR (GPIO_ResetBits(GPIOC, GPIO_Pin_8))
#define LED_G_SET (GPIO_SetBits (GPIOC, GPIO_Pin_9))
#define LED_G_CLR (GPIO_ResetBits(GPIOC, GPIO_Pin_9))
////////////////////////////////////////////////////////////////////////////////
void RCC_init()
////////////////////////////////////////////////////////////////////////////////
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); // enable clocking on Port C
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
}
////////////////////////////////////////////////////////////////////////////////
void Setup(void)
////////////////////////////////////////////////////////////////////////////////
{
GPIO_InitTypeDef GPIOC_init_params;
RCC_init();
/*
http://we.easyelectronics.ru/STM32/rukovodstvo-k-bystromu-startu-po-rabote-s-periferiey-stm32f10x.html
stm32lib/inc/stm32f10x_gpio.h
GPIO_Mode_AIN — аналоговый вход;
GPIO_Mode_IN_FLOATING — вход без подтяжки, болтающийся (англ. float) в воздухе
GPIO_Mode_IPD — вход с подтяжкой к земле (англ. Pull-down)
GPIO_Mode_IPU — вход с подтяжкой к питанию (англ. Pull-up)
GPIO_Mode_Out_OD — выход с открытым стоком (англ. Open Drain)
GPIO_Mode_Out_PP — выход двумя состояниями (англ. Push-Pull — туда-сюда)
GPIO_Mode_AF_OD — выход с открытым стоком для альтернативных функций (англ. Alternate Function). Используется в случаях, когда выводом должна управлять периферия, прикрепленная к данному разряду порта (например, вывод Tx USART и т.п.)
GPIO_Mode_AF_PP — то же самое, но с двумя состояниями
*/
//
// 2 LED pin's
//
GPIOC_init_params.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9; // Blue LED PC[8], Green LED PC[9]
GPIOC_init_params.GPIO_Speed = GPIO_Speed_10MHz;
GPIOC_init_params.GPIO_Mode = GPIO_Mode_Out_PP; // Push-pull output
GPIO_Init (GPIOC, &GPIOC_init_params);
//
// Button
//
GPIOC_init_params.GPIO_Pin = GPIO_Pin_0; // user button PA0
GPIOC_init_params.GPIO_Speed = GPIO_Speed_10MHz; // 10-50 по барабану
GPIOC_init_params.GPIO_Mode = GPIO_Mode_IPD; // GPIO_Mode_IPD - PD connect GND
GPIO_Init (GPIOA, &GPIOC_init_params); //
}
////////////////////////////////////////////////////////////////////////////////
int main(void)
////////////////////////////////////////////////////////////////////////////////
{
int cnt = TIMER_CNT;
int flag_time = 0;
int flag_btn = 0;
while(1)
{
if(!cnt--)
{
flag_time = 1;
cnt = TIMER_CNT;
}
if(flag_time)
{
flag_time = 0;
if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_8)) { LED_B_CLR; } // invert Blue Led
else { LED_B_SET; }
if(flag_btn)
{
flag_btn = 0;
if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_9)) { LED_G_CLR; } // invert Green Led
else { LED_G_SET; }
} // if(flag_btn)
} // if(flag_time)
//
// читаем пин-кнопку
//
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0))
{
flag_btn = 1;
} //*/
} // while()
}
////////////////////////////////////////////////////////////////////////////////


