Вс мар 13, 2022 18:51:22
#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()
}
////////////////////////////////////////////////////////////////////////////////
Пн мар 14, 2022 06:39:58
#define TIMER_CNT 0xFFFFE / 100
<...>
int main (void) {
int loop_10ms = 0;
int flag_time = 0;
int flag_btn = 0;
int is_button_pressed = 0; // Добавочный флаг, позволяющий создать из переменной flag_btn триггер
<...>
// Тикает 100 раз в секунду
while (1) {
if (!(cnt--)) {
cnt = TIMER_CNT;
loop_10ms++;
// Читаем состояние пина.
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)) {
// Если высокое И ЕСЛИ добавочный флаг НЕ взведён,
if (!is_button_pressed) {
// Взводим оба флага - добавочный и сам триггер.
is_button_pressed = 1;
flag_btn = 1;
};
} else {
// Если кнопка отпущена И ЕСЛИ был взведён дополнительный флаг
if (is_button_pressed) {
// Сбрасываем его. flag_btn не изменяется, потому что он уже в состоянии "0" из-за кода ниже.
is_button_pressed = 0;
};
};
};
if (loop_10ms >= 100) {
// 1 секунда
loop_10ms = 0;
flag_time = 1; // Тикнула секунда
};
};
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; }
};
};
Пн мар 14, 2022 07:28:00
volatile bool flag_1Hz=false;
int main()
{
for(;;)
{
if(key.pressed())
green_led.toggle();
if(flag_1Hz)
{
blue_led.toggle();
flag_1Hz=false;
}
}
}
Пн мар 14, 2022 14:33:55
Пн мар 14, 2022 17:10:08
Пн мар 14, 2022 17:35:54
Пн мар 14, 2022 17:41:55
Вт мар 15, 2022 04:15:50
Вт мар 15, 2022 04:51:46
Вт мар 15, 2022 06:24:58
Вт мар 15, 2022 08:17:57
Вт мар 15, 2022 08:35:08
Вт мар 15, 2022 16:34:42
sunjob писал(а):уточнение - переключение св.д от нажатия !!! синхронизируется !!! с морганием 1го св.диода, т.е. это так и задумано :о)
Вт мар 15, 2022 19:38:47
Вт мар 15, 2022 19:50:17
if(!cnt--) {flag_time=1; cnt=TIMER_CNT;}
if(flag_time)
{
flag_time = 0;
if(Read8) {LED_B_CLR;}else{LED_B_SET;}
if(flag_btn)
{
flag_btn = 0;
if(Read9) {LED_G_CLR;}else{ LED_G_SET;}
}
}
if(Read0) {flag_btn = 1;}
Вт мар 15, 2022 19:57:11
Вт мар 15, 2022 20:14:43
Вт мар 15, 2022 20:17:47
Ср мар 16, 2022 06:30:14
Ср мар 16, 2022 07:02:01