task 2 und 3 fertig
This commit is contained in:
+103
-19
@@ -51,16 +51,28 @@
|
||||
#include "stm32g431xx.h"
|
||||
#include "STefi-Light.h"
|
||||
|
||||
#define ROT_AN (GPIOA->BSRR = (1UL<<16))
|
||||
#define ROT_AUS (GPIOA->BSRR = (1UL<<0))
|
||||
#define GELB_AN (GPIOA->BSRR = (1UL<<17))
|
||||
#define GELB_AUS (GPIOA->BSRR = (1UL<<1))
|
||||
#define GRÜN_AN (GPIOA->BSRR = (1UL<<18))
|
||||
#define GRÜN_AUS (GPIOA->BSRR = (1UL<<2))
|
||||
#define BLAU_AN (GPIOA->BSRR = (1UL<<19))
|
||||
#define BLAU_AUS (GPIOA->BSRR = (1UL<<3))
|
||||
|
||||
/* ------------------------------------ DEFINES --------------------------------------- */
|
||||
/* ------------------------------------ TYPE DEFINITIONS ------------------------------ */
|
||||
/* ------------------------------------ GLOBAL VARIABLES ------------------------------ */
|
||||
volatile uint32_t timer_ticks = 0;
|
||||
volatile uint8_t ampel_aktiv = 0;
|
||||
volatile uint32_t lbp = 0;
|
||||
/* ------------------------------------ PRIVATE VARIABLES ----------------------------- */
|
||||
|
||||
|
||||
/* ------------------------------------ PROTOTYPES ------------------------------------ */
|
||||
static void GPIO_init(void);
|
||||
|
||||
void Timer_init(void);
|
||||
void EXTI_init(void);
|
||||
|
||||
/* ------------------------------------ M A I N --------------------------------------- */
|
||||
int main(void)
|
||||
@@ -69,28 +81,88 @@ int main(void)
|
||||
__disable_irq(); // disable interrupts globally
|
||||
|
||||
GPIO_init();
|
||||
Timer_init();
|
||||
EXTI_init();
|
||||
|
||||
__enable_irq(); // enable interrupts globally
|
||||
|
||||
lbp = 0;
|
||||
|
||||
GRÜN_AN;
|
||||
ROT_AUS;
|
||||
GELB_AUS;
|
||||
BLAU_AUS;
|
||||
/* --- one time tasks --- */
|
||||
|
||||
|
||||
/* --- infinite processing loop --- */
|
||||
while (1)
|
||||
{
|
||||
GPIOA->ODR ^= (1 << 0); // toggle LED0
|
||||
while (1){
|
||||
|
||||
__WFI();
|
||||
}
|
||||
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
/* ------------------------------------ GLOBAL FUNCTIONS ------------------------------ */
|
||||
void EXTI_IRQHandler(void){
|
||||
if(EXTI->PR1 & EXTI_PR1_PIF0){
|
||||
EXTI->PR1 = EXTI_PR1_PIF0;
|
||||
|
||||
if((timer_ticks - lbp)> 200){
|
||||
lbp = timer_ticks;
|
||||
|
||||
if(ampel_aktiv == 0){
|
||||
timer_ticks = 0;
|
||||
ampel_aktiv=1;
|
||||
}
|
||||
}
|
||||
}
|
||||
//TIM6_DAC_IRQHandler();timer_ticks
|
||||
}
|
||||
|
||||
|
||||
void TIM6_DAC_IRQHandler(void){
|
||||
if(TIM6->SR & (1<<0)){
|
||||
TIM6->SR &= ~(1U<<0);
|
||||
|
||||
timer_ticks++;
|
||||
|
||||
if(ampel_aktiv == 1){
|
||||
switch(timer_ticks){
|
||||
case 10000:
|
||||
GRÜN_AUS;
|
||||
GELB_AN;
|
||||
break;
|
||||
case 11000:
|
||||
GELB_AUS;
|
||||
ROT_AN;
|
||||
break;
|
||||
case 12000:
|
||||
break;
|
||||
case 27000:
|
||||
BLAU_AUS;
|
||||
GELB_AN;
|
||||
break;
|
||||
case 28000:
|
||||
ROT_AUS;
|
||||
GELB_AUS;
|
||||
GRÜN_AN;
|
||||
ampel_aktiv = 0;
|
||||
break;
|
||||
}
|
||||
if(timer_ticks >=12000 && timer_ticks < 27000){
|
||||
if(timer_ticks % 1000 == 0){
|
||||
BLAU_AN;
|
||||
}
|
||||
else if(timer_ticks % 1000 == 500){
|
||||
BLAU_AUS;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
/* ------------------------------------ PRIVATE FUNCTIONS ----------------------------- */
|
||||
|
||||
/* ------------------------------------------------------------------------------------ *\
|
||||
@@ -104,26 +176,38 @@ int main(void)
|
||||
\* ------------------------------------------------------------------------------------ */
|
||||
static void GPIO_init(void)
|
||||
{
|
||||
/* enable port clocks */
|
||||
RCC->AHB2ENR |= RCC_AHB2ENR_GPIOAEN; // LEDs: A
|
||||
RCC->AHB2ENR |= RCC_AHB2ENR_GPIOAEN | RCC_AHB2ENR_GPIOBEN;
|
||||
|
||||
// LEDs PA0-PA3 Output (01)
|
||||
GPIOA->MODER &= ~(0xFF);
|
||||
GPIOA->MODER |= 0x55;
|
||||
|
||||
/* --- LEDs --- */
|
||||
GPIOA->ODR |= (1 << 0);
|
||||
GPIOA->MODER &= ~(3 << 0);
|
||||
GPIOA->MODER |= (1 << 0); // set LED pin to output
|
||||
// Initial alle aus (Low-Active: 1 = AUS)
|
||||
GPIOA->ODR |= 0x0F;
|
||||
|
||||
// S0 (PB0) Input (00) mit Pull-Up (01)
|
||||
GPIOB->MODER &= ~(3 << 0);
|
||||
GPIOB->PUPDR |= (1 << 0);
|
||||
}
|
||||
|
||||
/* --- buttons --- */
|
||||
|
||||
/* init */
|
||||
|
||||
|
||||
|
||||
|
||||
/* interrupt config for Buttons */
|
||||
void Timer_init(void) {
|
||||
RCC->APB1ENR1 |= RCC_APB1ENR1_TIM6EN;
|
||||
|
||||
// 16MHz Systemtakt. 16MHz / 16 (PSC+1) = 1MHz.
|
||||
// Bei 1MHz sind 1000 Ticks (ARR+1) exakt 1 Millisekunde.
|
||||
TIM6->PSC = 15;
|
||||
TIM6->ARR = 999;
|
||||
TIM6->DIER |=(1<<0);
|
||||
NVIC_EnableIRQ(TIM6_DAC_IRQn);
|
||||
TIM6->CR1 |= (1<<0);
|
||||
}
|
||||
|
||||
void EXTI_init(void) {
|
||||
RCC->APB2ENR |= RCC_APB2ENR_SYSCFGEN;
|
||||
SYSCFG->EXTICR[0] = (SYSCFG->EXTICR[0] & ~(0xF)) | 0x1;
|
||||
EXTI->IMR1 |= (1<<0);
|
||||
EXTI->FTSR1 |= (1<<0);
|
||||
NVIC_EnableIRQ(EXTI0_IRQn);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -52,7 +52,8 @@
|
||||
extern void* _estack; // initial stack pointer from ldscript
|
||||
extern void* Reset_Handler; // exception handler from startup code
|
||||
|
||||
|
||||
extern void TIM6_DAC_IRQHandler();
|
||||
extern void EXTI_IRQHandler();
|
||||
/* ------------------------------------ PRIVATE VARIABLES ----------------------------- */
|
||||
/* ------------------------------------ PROTOTYPES ------------------------------------ */
|
||||
|
||||
@@ -136,7 +137,7 @@ void (* const paIsrFunc[118])(void) =
|
||||
ISR_default, /* 3 (0x0000004C) RTC Wakeup timer through EXTI line 20 interrupt */
|
||||
ISR_default, /* 4 (0x00000050) Flash global interrupt */
|
||||
ISR_default, /* 5 (0x00000054) RCC global interrupt */
|
||||
ISR_default, /* 6 (0x00000058) EXTI Line 0 interrupt */
|
||||
EXTI_IRQHandler, /* 6 (0x00000058) EXTI Line 0 interrupt */
|
||||
ISR_default, /* 7 (0x0000005C) EXTI Line 1 interrupt */
|
||||
ISR_default, /* 8 (0x00000060) EXTI Line 2 interrupt */
|
||||
ISR_default, /* 9 (0x00000064) EXTI Line 3 interrupt */
|
||||
@@ -184,7 +185,7 @@ void (* const paIsrFunc[118])(void) =
|
||||
ISR_default, /* 51 (0x0000010C) SPI3 global interrupt */
|
||||
ISR_default, /* 52 (0x00000110) UART4 global + EXTI line 34 interrupts */
|
||||
ISR_default, /* 53 (0x00000114) UART5 global + EXTI line 35 interrupts */
|
||||
ISR_default, /* 54 (0x00000118) TIM6 + DAC1/3 underrun global interrupts */
|
||||
TIM6_DAC_IRQHandler, /* 54 (0x00000118) TIM6 + DAC1/3 underrun global interrupts */
|
||||
ISR_default, /* 55 (0x0000011C) TIM7 + DAC2/4 underrun global interrupts */
|
||||
ISR_default, /* 56 (0x00000120) DMA2 channel 1 interrupt */
|
||||
ISR_default, /* 57 (0x00000124) DMA2 channel 2 interrupt */
|
||||
|
||||
Reference in New Issue
Block a user