funktioniert AUfg1
This commit is contained in:
+94
-88
@@ -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 ***************************************** */
|
||||
|
||||
Reference in New Issue
Block a user