funktioniert AUfg1

This commit is contained in:
Max-R
2026-03-10 17:58:59 +01:00
parent fb89de5354
commit acb872ae29
18 changed files with 1753 additions and 104 deletions
+94 -88
View File
@@ -35,27 +35,19 @@
#include "stm32g431xx.h"
#include "STefi-Light.h"
/* ------------------------------------ DEFINES --------------------------------------- */
#define LOOPS_PER_MS 1244 // NOP-loops for delay()
#define WAITTIME 500
#define FIRST_LED 0
#define LAST_LED 3
#define UP 1
#define DOWN -1
#define WAITTIME 333
/* ------------------------------------ TYPE DEFINITIONS ------------------------------ */
/* ------------------------------------ GLOBAL VARIABLES ------------------------------ */
int state = 0;
/* ------------------------------------ PRIVATE VARIABLES ----------------------------- */
/* ------------------------------------ PRIVATE VARIABLES ----------------------------- */
/* ------------------------------------ PROTOTYPES ------------------------------------ */
static void GPIO_init(void);
static void delay(const uint16_t ms);
static void blink(const unint numLED);
/* ------------------------------------ M A I N --------------------------------------- */
int main(void)
@@ -67,70 +59,89 @@ int main(void)
__enable_irq(); // enable interrupts globally
/* --- one time tasks --- */
//s0 Hilfvariablen auserhalb von while deklarieren
int running = 0; //0 Lauflicht aus, 1 Lauflicht an
int lastButtonState = 1; // Hilfsvariable zur Flankenerkennung
/* --- infinite processing loop --- */
while (1)
{
/* ... add your code to implement the lab assignment ... */
int direction;
int buttonState = GPIOB->IDR & (1 << 0);
while(1){
if(i == FIRST_LED){
direction = UP;
}
else if(i == LAST_LED){
direction = DOWN;
}
blink(i); //One full LED blink cylce
if(direction == UP){
i++;
}
else if(direction == DOWN){
i--;
}
// fallende Flanke erkennen
if (lastButtonState && !buttonState)
{
running ^= 1; // toggle running
/* delay(50); // entprellen */
}
lastButtonState = buttonState;
switch (state) {
if(running)
{
switch (state)
{
case 0:
GPIOA->ODR &= ~(1 << 0); // LED0 on
GPIOA->ODR &= ~(1 << 1);
GPIOA->ODR &= ~(1 << 2);
GPIOA->ODR &= ~(1 << 3);
state++;
GPIOA->ODR &= ~(1 << 0);
delay(WAITTIME);
GPIOA->ODR |= (1 << 0);
break;
case 1:
delay(WAITTIME); // wait
state++;
GPIOA->ODR &= ~(1 << 1);
delay(WAITTIME);
GPIOA->ODR |= (1 << 1);
break;
case 2:
GPIOA->ODR |= (1 << 0); // LED0 off
GPIOA->ODR |= (1 << 1);
state++;
GPIOA->ODR &= ~(1 << 2);
delay(WAITTIME);
GPIOA->ODR |= (1 << 2);
break;
case 3:
state++;
GPIOA->ODR &= ~(1 << 3);
delay(WAITTIME);
GPIOA->ODR |= (1 << 3);
delay(WAITTIME); // wait
state = 0;
break;
default:
case 4:
state++;
GPIOA->ODR &= ~(1 << 2);
delay(WAITTIME);
GPIOA->ODR |= (1 << 2);
break;
case 5:
state=0;
GPIOA->ODR &= ~(1 << 1);
delay(WAITTIME);
GPIOA->ODR |= (1 << 1);
break;
}
}
return 1;
case 99:
GPIOA->ODR |= MASK_LED_ALL;
while(1){
if((GPIOB->IDR & (1 << 0)) == 0){
state=0;
break;
}
}
}
}
}
//aktuell geht er mit drücken durch die cases
// wegen break geht er ganz aus der if bedingung raus, nicht nur ausm switch case
return 1;
}
/* ------------------------------------ GLOBAL FUNCTIONS ------------------------------ */
/* ------------------------------------ PRIVATE FUNCTIONS ----------------------------- */
/* ------------------------------------------------------------------------------------ *\
@@ -141,26 +152,38 @@ int main(void)
* requires: - nothing -
* parameters: - none -
* returns: - nothing -
\* ------------------------------------------------------------------------------------ */
\* ------------------------------------------------------------------------------------ */
static void GPIO_init(void)
{
/* enable port clocks */
RCC->AHB2ENR |= RCC_AHB2ENR_GPIOAEN; // LEDs: A
int i = FIRST_LED;
/* enable port clocks */
RCC->AHB2ENR |= RCC_AHB2ENR_GPIOAEN; // LEDs: A
RCC->AHB2ENR |= RCC_AHB2ENR_GPIOBEN; //Taster versuch
/* --- LEDs --- */
GPIOA->ODR |= MASK_LED_ALL;
GPIOA->MODER &= ~(3 << 0);
GPIOA->MODER &= ~(3 << 2);
GPIOA->MODER &= ~(3 << 4);
GPIOA->MODER &= ~(3 << 6);
GPIOA->MODER |= (1 << 0); // set LED pin to output
GPIOA->MODER |= (1 << 2);
GPIOA->MODER |= (1 << 4);
GPIOA->MODER |= (1 << 6);
/* --- LEDs --- */
GPIOA->ODR |= MASK_LED_ALL;
GPIOA->MODER &= ~(3 << 0);
GPIOA->MODER |= (1 << 0); // set LED pin to output
/* LED1 als Output */
GPIOA->MODER &= ~(3 << 2); // Versuch: LED 1 Mode löschen :klappt so
GPIOA->MODER |= (1 << 2); // Versuch: LED 1 PA1 = output :klappt so
/* LED2 als Output */
GPIOA->MODER &= ~(3 << 4); // Versuch: LED 2 Mode löschen :klappt
GPIOA->MODER |= (1 << 4); // Versuch: LED 2 PA1 = output :klappt
/* LED3 als output */
GPIOA->MODER &= ~(3 << 6);
GPIOA->MODER |= (1 << 6);
/* s0 (PB0) als Input Versuch */
GPIOB->MODER &= ~(3 << 0);
/* Pull-Up Aktivieren Versuch */
GPIOB->PUPDR &= ~(3 << 0);
GPIOB->PUPDR |= (1 << 0); // 01 = Pull-Up
}
/* ------------------------------------------------------------------------------------ *\
* method: static void delay(const uint16_t ms)
*
@@ -169,37 +192,20 @@ static void GPIO_init(void)
* requires: - nothing -
* parameters: ms - delay time in milliseconds
* returns: - nothing -
\* ------------------------------------------------------------------------------------ */
\* ------------------------------------------------------------------------------------ */
static void delay(const uint16_t ms)
{
for (uint16_t i = 0; i < ms; ++i)
for (uint16_t i = 0; i < ms; ++i)
{
if((GPIOB->IDR & (1 << 0)) == 0){
state = 99;
break;
}
for (uint16_t j = 0; j < LOOPS_PER_MS; ++j)
{
for (uint16_t j = 0; j < LOOPS_PER_MS; ++j)
{
__asm("NOP");
}
__asm("NOP");
}
}
static void blink(const uint numLED)
{
switch (state) {
case 0:
GPIOA->ODR &= ~(1 << numLED); // LEDX on
state++;
break;
case 1:
delay(WAITTIME); // wait
state++;
break;
case 2:
GPIOA->ODR |= (1 << numLED); // LEDX off
delay(WAITTIME); // wait
state = default;
break;
default:
break;
}
/* ************************************ E O F ***************************************** */