Added software PWM and deleted Debug folder

This commit is contained in:
dooku
2021-06-08 11:43:04 +02:00
parent e0417166f4
commit 62dd633874
111 changed files with 206 additions and 10422 deletions

48
fw/Core/Inc/led.h Normal file
View File

@@ -0,0 +1,48 @@
/*
* led.h
*
* Created on: Jun 6, 2021
* Author: user
*/
#ifndef INC_LED_H_
#define INC_LED_H_
#include "stdint.h"
#include "stm32l0xx_hal.h"
#include "stm32l0xx_ll_gpio.h"
/*
* Context struct
*/
typedef struct {
GPIO_TypeDef *red_led_port;
int red_led_pin;
GPIO_TypeDef *green_led_port;
int green_led_pin;
GPIO_TypeDef *blue_led_port;
int blue_led_pin;
} led_context_t;
/*
* Externally defined variables
*/
extern int led_pwm_max;
extern int led_pwm_counter;
extern int led_red_intensity;
extern int led_green_intensity;
extern int led_blue_intensity;
/*
* Function prototypes
*/
void led_set_color(uint8_t red, uint8_t green, uint8_t blue);
void led_off();
void led_pwm_handler();
void led_init(led_context_t *context, int pwm_freq, int pwm_handler_freq);
#endif /* INC_LED_H_ */

View File

@@ -44,6 +44,7 @@ extern "C" {
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "led.h"
/* USER CODE END Includes */
/* Exported types ------------------------------------------------------------*/

121
fw/Core/Src/led.c Normal file
View File

@@ -0,0 +1,121 @@
/*
* led.c
*
* Created on: Jun 6, 2021
* Author: user
*/
#include "led.h"
/*
* Global variables
*/
int led_pwm_max;
int led_pwm_counter;
int led_red_intensity;
int led_green_intensity;
int led_blue_intensity;
int led_red_state;
int led_green_state;
int led_blue_state;
led_context_t *led_context = NULL;
/*
* Functions
*/
/*
* led_set_color():
* Set LED color
* Arguments:
* uint8_t red: red color intensity, possible values 0 ... 255
* uint8_t green: green color intensity, possible values 0 ... 255
* uint8_t blue: blue color intensity, possible values 0 ... 255
* NOTE: if (color * led_pwm_max) < 255, LED will be off
*/
void led_set_color(uint8_t red, uint8_t green, uint8_t blue)
{
led_red_intensity = (int)red * led_pwm_max / 255;
led_green_intensity = (int)green * led_pwm_max / 255;
led_blue_intensity = (int)blue * led_pwm_max / 255;
}
/*
* led_off():
* Set LED intensity to 0 for each color
*/
void led_off()
{
led_red_intensity = 0;
led_green_intensity = 0;
led_blue_intensity = 0;
}
/*
* led_pwm_handler():
* handles switching LEDs on/off according to desired intensity;
* should be regularly called in timer routine, preferably in SysTick_Handler()
*/
void led_pwm_handler()
{
int new_red_state, new_green_state, new_blue_state;
if (led_context == NULL) {
// led_pwm_handler() may be called before led_init() was called;
// this would result in a crash
return;
}
new_red_state = led_pwm_counter >= led_red_intensity ? 1 : 0;
new_green_state = led_pwm_counter >= led_green_intensity ? 1 : 0;
new_blue_state = led_pwm_counter >= led_blue_intensity ? 1 : 0;
// SysTick() is called at 1 kHz frequency, we don't want to call HAL_GPIO_WritePin() every time
if (led_red_state != new_red_state) {
LL_GPIO_TogglePin(led_context->red_led_port, led_context->red_led_pin);
led_red_state = new_red_state;
}
if (led_green_state != new_green_state) {
LL_GPIO_TogglePin(led_context->green_led_port, led_context->green_led_pin);
led_green_state = new_green_state;
}
if (led_blue_state != new_blue_state) {
LL_GPIO_TogglePin(led_context->blue_led_port, led_context->blue_led_pin);
led_blue_state = new_blue_state;
}
if (++led_pwm_counter >= led_pwm_max) {
led_pwm_counter = 0;
}
}
/*
* led_init():
* Saves context and calculates max pwm value. Note that is PWM frequency is low (< 25 Hz),
* flickering might be visible. If pwm_handler_freq is low (less than several kHz),
* resolution of PWM will be limited
* Arguments:
* led_context_t *context:
* Pointer to LED context struct, which contains port and pin for each LED
* int pwm_freq:
* Desired frequency of PWM in Hz (e.g. 25 Hz)
* int pwm_handler_freq:
* Frequency of led_pwm_handler() calls. Eequal to timer frequency if timer callback is used,
* e.g. if led_pwm_handler() is called within SysTick_Handler(), then frequency is
* HAL_TICK_FREQ_1KHZ
*/
void led_init(led_context_t *context, int pwm_freq, int pwm_handler_freq)
{
// save context
led_context = context;
// Initial values
led_red_intensity = 0;
led_red_state = 1; // state is inverted (LEDs are sinking current into MCU)
led_green_intensity = 0;
led_green_state = 1;
led_blue_intensity = 0;
led_blue_state = 1;
// calculate PWM counter overflow value (max value)
// e.g. for 1 kHz handler freq and 25 Hz PWM freq, we only have
// resolution of 40 steps for pwm
led_pwm_max = pwm_handler_freq / pwm_freq;
}

View File

@@ -94,6 +94,16 @@ int main(void)
/* USER CODE BEGIN 2 */
LL_I2C_Enable(I2C1);
LL_LPUART_Enable(LPUART1);
/* LED PWM context */
led_context_t led_context;
led_context.red_led_port = LED_R_GPIO_Port;
led_context.green_led_port = LED_G_GPIO_Port;
led_context.blue_led_port = LED_B_GPIO_Port;
led_context.red_led_pin = LED_R_Pin;
led_context.green_led_pin = LED_G_Pin;
led_context.blue_led_pin = LED_B_Pin;
led_init(&led_context, 50, 1000);
led_set_color(0, 20, 0);
/* USER CODE END 2 */
/* Infinite loop */

View File

@@ -23,6 +23,7 @@
#include "stm32l0xx_it.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "led.h"
/* USER CODE END Includes */
/* Private typedef -----------------------------------------------------------*/
@@ -130,6 +131,7 @@ void SysTick_Handler(void)
/* USER CODE END SysTick_IRQn 0 */
HAL_IncTick();
/* USER CODE BEGIN SysTick_IRQn 1 */
led_pwm_handler();
/* USER CODE END SysTick_IRQn 1 */
}