#include "main.h"
#include "tm1637.h"
#include "keyboard.h"
#include "access_control.h"
volatile uint32_t tickCount;
uint32_t last_display_update;
uint16_t counter;
char lastKey;
uint32_t lastScanTime;
// Глобальные переменные системы управления доступом объявлены в access_control.c
void osSystickHandler(void) {
tickCount++;
}
void initGPIO() {
// Включаем тактирование GPIOA и GPIOB
RCC->AHBENR |= RCC_AHBENR_GPIOAEN | RCC_AHBENR_GPIOBEN;
// Настраиваем PA5 как выход (зеленый светодиод)
GPIOA->MODER = (GPIOA->MODER & ~(3 << 10)) | (1 << 10);
GPIOA->OTYPER &= ~(1 << 5);
GPIOA->OSPEEDR |= (1 << 10);
// Настраиваем PA15 как выход (красный светодиод)
GPIOA->MODER = (GPIOA->MODER & ~(3 << 30)) | (1 << 30);
GPIOA->OTYPER &= ~(1 << 15);
GPIOA->OSPEEDR |= (1 << 30);
// Настраиваем PA9 как выход (синий светодиод)
GPIOA->MODER = (GPIOA->MODER & ~(3 << 18)) | (1 << 18);
GPIOA->OTYPER &= ~(1 << 9);
GPIOA->OSPEEDR |= (1 << 18);
}
void initUSART2() {
// Включаем тактирование USART2
RCC->APB1ENR |= RCC_APB1ENR_USART2EN;
// Настраиваем PA2 и PA3 в альтернативный режим
GPIOA->MODER = (GPIOA->MODER & ~(0xF << 4)) | (0xA << 4);
GPIOA->AFR[0] = (GPIOA->AFR[0] & ~(0xFF << 8)) | (1 << 8) | (1 << 12);
// Настраиваем USART2
USART2->BRR = 417; // 48MHz/115200
USART2->CR1 = USART_CR1_TE | USART_CR1_UE;
}
void initSysTick() {
SysTick->LOAD = 47999; // 1ms при 48MHz
SysTick->VAL = 0;
SysTick->CTRL = (1 << 2) | (1 << 1) | (1 << 0);
}
int _write(int file, uint8_t *ptr, int len) {
for (int i = 0; i < len; i++) {
while (!(USART2->ISR & USART_ISR_TXE));
USART2->TDR = ptr[i];
}
return len;
}
void checkTickCount() {
// Периодический вывод статуса системы каждые 30 секунд
if ((tickCount % 30000) == 0) {
access_control_show_status();
}
}
int main(void) {
initGPIO();
initUSART2();
initSysTick();
initKeyboard();
tm1637_init();
access_control_init();
printf("=== Access Control System ===\n");
printf("System initialized successfully!\n");
printf("Master PIN: %s\n", master_pin);
printf("Instructions:\n");
printf("- Enter 4-digit PIN to access\n");
printf("- Press * for setup mode\n");
printf("- Press # to cancel input\n");
printf("=============================\n");
while (1) {
checkTickCount();
tm1637_update();
scanKeyboard();
access_control_update();
}
return 0;
}
Loading
st-nucleo-c031c6
st-nucleo-c031c6