/
AVLGU
/
STM32F072_Programming
Обзор
Документация
Войти
/
AVLGU
/
STM32F072_Programming
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
main.c
149 строк
3 KB
AVLGU
4 button 4 lights
14 окт 2025, 16:10
14 окт 2025, 16:10
e7a1155
Код
Авторство
О чём код?
#include "stm32f0xx.h" void Interrupt_counter (void); static void init(void) { // PA0 -INPUT BUTTON RCC->AHBENR |= RCC_AHBENR_GPIOAEN; GPIOA->MODER &= ~(GPIO_MODER_MODER0); // reset on leg 0 GPIOA->PUPDR &= ~(GPIO_PUPDR_PUPDR0); // reset PUPDR on leg 0 GPIOA->PUPDR |= ~(GPIO_PUPDR_PUPDR0_0); // PUR on leg 0 //PA4, PA5 - PD INPUT GPIOA->MODER &= ~(GPIO_MODER_MODER4 | GPIO_MODER_MODER5); // reset on leg 4,5 GPIOA->PUPDR &= ~(GPIO_PUPDR_PUPDR4 | GPIO_PUPDR_PUPDR5); // reset PUPDR on leg 0 GPIOA->PUPDR |= ~(GPIO_PUPDR_PUPDR4_1 | GPIO_PUPDR_PUPDR5_1); // PDR on leg 0 // PA12, PA15 - OUTPUT GPIOC->MODER &= ~(GPIO_MODER_MODER12 | GPIO_MODER_MODER15); // reset on legs 12,15 GPIOC->MODER |= (GPIO_MODER_MODER12_0 | GPIO_MODER_MODER15_0); // 1 on 0st bit on legs 12,15 //PC6-PC9 LEDs RCC->AHBENR |= RCC_AHBENR_GPIOCEN; GPIOC->MODER &= ~(GPIO_MODER_MODER6 | GPIO_MODER_MODER7 | GPIO_MODER_MODER8 | GPIO_MODER_MODER9); // reset on legs 6,7,8,9 GPIOC->MODER |= (GPIO_MODER_MODER6_0 | GPIO_MODER_MODER7_0 | GPIO_MODER_MODER8_0 | GPIO_MODER_MODER9_0); // 1 on 0st bit on legs 6,7 //GPIOC->ODR |= GPIO_ODR_6; //LIGHT ON LEG 6 red -1 //GPIOC->ODR |= GPIO_ODR_7; //LIGHT ON LEG 7 blue -3 //GPIOC->ODR |= GPIO_ODR_8; //LIGHT ON LEG 6 orange -4 //GPIOC->ODR |= GPIO_ODR_9; //LIGHT ON LEG 9 green - 2 /* RCC -> APB2ENR |= RCC_APB2ENR_TIM1EN; TIM1 -> CR1 = TIM_CR1_CEN; TIM1->PSC = 719; TIM1->ARR = 9999;*/ } /* static void TIM1_CC_IRQHandler(void) { Interrupt_counter(); } */ static volatile uint16_t button; static volatile uint8_t counter=0; static void CheckButtons (void) { GPIOC->ODR &= ~(GPIO_ODR_6 | GPIO_ODR_7 | GPIO_ODR_8 | GPIO_ODR_9);//light off GPIOA->ODR |= GPIO_ODR_12; if ((GPIOA->IDR)&GPIO_IDR_5)// 1 button { GPIOC->ODR |= GPIO_ODR_6; //LIGHT ON LEG 6 red -1 } if ((GPIOA->IDR)&GPIO_IDR_4)// 2 button { GPIOC->ODR |= GPIO_ODR_9; //LIGHT ON LEG 9 green - 2 } GPIOA->ODR &= ~GPIO_ODR_12; GPIOA->ODR |= GPIO_ODR_15; if ((GPIOA->IDR)&GPIO_IDR_4)// 3 button { GPIOC->ODR |= GPIO_ODR_7; //LIGHT ON LEG 7 blue -3 } if ((GPIOA->IDR)&GPIO_IDR_5)// 4 button { GPIOC->ODR |= GPIO_ODR_8; //LIGHT ON LEG 6 orange -4 } GPIOA->ODR &= ~GPIO_ODR_15; } void Interrupt_counter (void) { GPIOC->ODR &= ~(GPIO_ODR_6 | GPIO_ODR_7 | GPIO_ODR_8 | GPIO_ODR_9); button = (GPIOA->IDR)&GPIO_IDR_0; if (button) { if (counter>0) { counter--; } else counter = 3; } else{ if (counter<3) { counter++; } else counter = 0; } } static void SpinLights (void) { if (counter==1) { GPIOC->ODR |= GPIO_ODR_6; //LIGHT ON LEG 6 red -1 } else if(counter==2) { GPIOC->ODR |= GPIO_ODR_9; //LIGHT ON LEG 9 green - 2 } else if(counter==3) { GPIOC->ODR |= GPIO_ODR_7; //LIGHT ON LEG 7 blue -3 } else if(counter==0) { GPIOC->ODR |= GPIO_ODR_8; //LIGHT ON LEG 8 orange -4 } } static void systick_init(void) { SystemCoreClockUpdate(); SysTick->LOAD = SystemCoreClock/8-1; //restart val SysTick->VAL = 0; // first start val SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_ENABLE_Msk; } int main(void) { init(); systick_init(); while(1) { if (SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk) { CheckButtons(); } } }