212 lines
6.4 KiB
C
212 lines
6.4 KiB
C
/* ***************************************************************************************
|
|
* Project: task1 - C:GPIO
|
|
* File: task1.c
|
|
*
|
|
* Language: C
|
|
*
|
|
* Hardware: STefi Light v1.1
|
|
* Processor: STM32G431KBT6U
|
|
*
|
|
* Author: Manuel Lederhofer
|
|
* Datum: 10.09.2021
|
|
*
|
|
* Version: 2.1
|
|
* History:
|
|
* 10.09.2021 ML create project
|
|
* 09.03.2022 ML port from STM32F042K6T6 to STM32G431KBT6U
|
|
* 18.02.2025 TK changed projectname to "C: GPIO)
|
|
*
|
|
* Status: under development
|
|
*
|
|
* Description:
|
|
* Blinks the red LED of STefi Light, currently.
|
|
* This file contains the main routine and the initialization.
|
|
*
|
|
* Notes:
|
|
* - MCU speed at startup is 16 MHz
|
|
*
|
|
* Todo:
|
|
* - Change the example code to match the description and requirements
|
|
* of the requested application in the lab exercise guide.
|
|
*
|
|
************************************************************************************** */
|
|
|
|
/* ------------------------------------ INCLUDES -------------------------------------- */
|
|
#include "stm32g431xx.h"
|
|
#include "STefi-Light.h"
|
|
|
|
/* ------------------------------------ DEFINES --------------------------------------- */
|
|
#define LOOPS_PER_MS 1244 // NOP-loops for delay()
|
|
#define WAITTIME 333
|
|
|
|
/* ------------------------------------ TYPE DEFINITIONS ------------------------------ */
|
|
/* ------------------------------------ GLOBAL VARIABLES ------------------------------ */
|
|
int state = 0;
|
|
|
|
/* ------------------------------------ PRIVATE VARIABLES ----------------------------- */
|
|
|
|
/* ------------------------------------ PROTOTYPES ------------------------------------ */
|
|
static void GPIO_init(void);
|
|
static void delay(const uint16_t ms);
|
|
|
|
/* ------------------------------------ M A I N --------------------------------------- */
|
|
int main(void)
|
|
{
|
|
/* --- initialization --- */
|
|
__disable_irq(); // disable interrupts globally
|
|
|
|
GPIO_init();
|
|
|
|
__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)
|
|
{
|
|
int buttonState = GPIOB->IDR & (1 << 0);
|
|
|
|
// fallende Flanke erkennen
|
|
if (lastButtonState && !buttonState)
|
|
{
|
|
running ^= 1; // toggle running
|
|
/* delay(50); // entprellen */
|
|
}
|
|
|
|
lastButtonState = buttonState;
|
|
|
|
|
|
if(running)
|
|
{
|
|
switch (state)
|
|
{
|
|
case 0:
|
|
state++;
|
|
GPIOA->ODR &= ~(1 << 0);
|
|
delay(WAITTIME);
|
|
GPIOA->ODR |= (1 << 0);
|
|
break;
|
|
case 1:
|
|
state++;
|
|
GPIOA->ODR &= ~(1 << 1);
|
|
delay(WAITTIME);
|
|
GPIOA->ODR |= (1 << 1);
|
|
break;
|
|
case 2:
|
|
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);
|
|
break;
|
|
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;
|
|
|
|
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 ----------------------------- */
|
|
|
|
/* ------------------------------------------------------------------------------------ *\
|
|
* method: static void GPIO_init(void)
|
|
*
|
|
* Initializes GPIOs on STefi Light for pins with peripherals attached.
|
|
*
|
|
* requires: - nothing -
|
|
* parameters: - none -
|
|
* returns: - nothing -
|
|
\* ------------------------------------------------------------------------------------ */
|
|
static void GPIO_init(void)
|
|
{
|
|
/* 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 |= (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)
|
|
*
|
|
* Realizes a millisecond delay by very bad busy-wait.
|
|
*
|
|
* 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)
|
|
{
|
|
if((GPIOB->IDR & (1 << 0)) == 0){
|
|
state = 99;
|
|
break;
|
|
}
|
|
for (uint16_t j = 0; j < LOOPS_PER_MS; ++j)
|
|
{
|
|
__asm("NOP");
|
|
}
|
|
}
|
|
}
|
|
|
|
/* ************************************ E O F ***************************************** */
|