WS2812 DMA driver added and RPM Shift limiter

This commit is contained in:
benas-gavea 2023-04-05 19:51:02 +01:00
parent 11abd39b4b
commit 0a5c96959c
15 changed files with 546 additions and 552 deletions

View File

@ -68,7 +68,7 @@
#define configTICK_RATE_HZ ((TickType_t)1000)
#define configMAX_PRIORITIES ( 56 )
#define configMINIMAL_STACK_SIZE ((uint16_t)64)
#define configTOTAL_HEAP_SIZE ((size_t)28360)
#define configTOTAL_HEAP_SIZE ((size_t)128360)
#define configMAX_TASK_NAME_LEN ( 16 )
#define configUSE_TRACE_FACILITY 1
#define configUSE_16_BIT_TICKS 0

View File

@ -14,25 +14,18 @@ extern "C" {
#include <Def/SCREEN_Def.h>
#define BH1750_ENABLED 0
#define GPS_ENABLED 0
#define CAN_ENABLED 1
#define CAN_ENABLED 0
#define RGB_ENABLED 1
#define UART_ENABLED 0
#define IND_ENABLED 0
#define ALERT_ENABLED 0
#define DEMO 0
#define LED_NUMBER 24
#define LED_DEFAULT_BRIGHTNESS 50
#define CAN_SETUP_ID 0x580
#define LED_DEFAULT_BRIGHTNESS 50
#define LCD_DEFAULT_BRIGHTNESS 400
#define LCD_RPM_HIGH 8000
#define PROTECTION_RPM_LOW 6500
#define PROTECTION_RPM_HIGH 7800
#define PROTECTION_RPM_HIGH 8000
#define PROTECTION_RPM_LED 6
#define PROTECTION_OIL_LOW 40

View File

@ -0,0 +1,15 @@
/*
* setupDash.h
*
* Created on: 4 Apr 2023
* Author: Ben
*/
#ifndef INC_SETUP_DASH_SETUPDASH_H_
#define INC_SETUP_DASH_SETUPDASH_H_
#endif /* INC_SETUP_DASH_SETUPDASH_H_ */

View File

@ -0,0 +1,15 @@
/*
* setupField.h
*
* Created on: 4 Apr 2023
* Author: Ben
*/
#ifndef INC_SETUP_FIELD_SETUPFIELD_H_
#define INC_SETUP_FIELD_SETUPFIELD_H_
#endif /* INC_SETUP_FIELD_SETUPFIELD_H_ */

View File

@ -0,0 +1,74 @@
/**
* @file ws2812.h
*
* @date 25.03.2025
* @author Benas Brazdziunas
*/
#ifndef WS2812_HPP_
#define WS2812_HPP_
#pragma once
#ifdef __cplusplus
extern "C"
{
#endif
#include "stm32f4xx_hal.h"
#define WS2812_LED_N 22 // Number of LEDs
#define WS2812_PORT GPIOA
#define WS2812_PIN 2
#define WS2812_TIM_N 2 // timer, 1-11
#define WS2812_TIM_CH 3 // timer channel, 0-3
#define WS2812_PWM_FREQUENCY (HAL_RCC_GetHCLKFreq() / 2) /**< Clock frequency of PWM, must be valid with respect to system clock! */
#define WS2812_PWM_PERIOD (WS2812_PWM_FREQUENCY / 800000)
#define WS2812_DUTYCYCLE_0 (WS2812_PWM_FREQUENCY / (1000000000 / 220))
#define WS2812_DUTYCYCLE_1 (WS2812_PWM_FREQUENCY / (1000000000 / 580))
#define CONCAT_SYMBOLS(s1, s2) s1##s2
#define CONCAT_EXPANDED_SYMBOLS(s1, s2) CONCAT_SYMBOLS(s1, s2)
#define WS2812_PWM_TIMER CONCAT_EXPANDED_SYMBOLS(TIM, WS2812_TIM_N)
#define WS2812_PWM_TIM_CH CONCAT_EXPANDED_SYMBOLS(TIM_CHANNEL_, WS2812_TIM_CH)
#define WS2812_PWM_DRIVER CONCAT_EXPANDED_SYMBOLS(htim, WS2812_TIM_N)
#define WS2812_PWM_PIN CONCAT_EXPANDED_SYMBOLS(GPIO_PIN_, WS2812_PIN)
#define WS2812_BUFLEN ((WS2812_LED_N + 4) * 24)
typedef struct {
uint8_t red;
uint8_t green;
uint8_t blue;
} WS2812_RGB_t;
void initWS2812();
void clearWS2812One(uint32_t num);
void clearWS2812All();
void setWS2812One(uint32_t num, WS2812_RGB_t rgb_col);
void setWS2812All(WS2812_RGB_t rgb_col);
void setWS2812Brightness(uint8_t num);
//void HAL_TIM_MspPostInit(TIM_HandleTypeDef *htim);
void DMA1_Stream1_IRQHandler(void);
void updateWS2812();
void ConfigureTimerPeripheral();
void ConfigureTimerGPIO(void);
void ConfigureTimerChannel(void);
void ConfigureDMA(void);
#ifdef __cplusplus
}
#endif
#endif /* WS2812_HPP_ */

View File

@ -1,43 +0,0 @@
#ifndef __WS2812_H
#define __WS2812_H
#pragma once
#include "extern.h"
#include "stm32f4xx_hal.h"
TIM_HandleTypeDef htim2;
#define WS2812_NUM_LEDS_CH1 LED_NUMBER
#define WS2812_TIM_PERIODE htim2.Instance->ARR //52 // F_PWM 84000000/800000 = 225 -> 800 kHz (1.25us)
#define WS2812_LO_TIME (WS2812_TIM_PERIODE / (1.25 / 0.22)) - 1 //(1.25 / 0.22) 0.220us - 0.380us
#define WS2812_HI_TIME (WS2812_TIM_PERIODE / (1.25 / 0.58)) - 1 //(1.25 / 0.58) 0.580us - 1us
//--------------------------------------------------------------
// RGB LED Farbdefinition (3 x 8bit)
//--------------------------------------------------------------
typedef struct {
uint8_t red; // 0...255 (als PWM-Wert)
uint8_t green; // 0...255 (als PWM-Wert)
uint8_t blue; // 0...255 (als PWM-Wert)
}WS2812_RGB_t;
WS2812_RGB_t WS2812_LED_BUF_CH1[WS2812_NUM_LEDS_CH1];
#define WS2812_BUFLEN (WS2812_NUM_LEDS_CH1+2)*24
//Interrupt Callback
void DMA_Callback(void);
//Library Interface
void WS2812_Refresh(void);
void WS2812_Clear(uint8_t refresh);
void WS2812_One_RGB(uint32_t nr, WS2812_RGB_t rgb_col, uint8_t refresh);
void WS2812_All_RGB(WS2812_RGB_t rgb_col, uint8_t refresh);
#endif // __WS2812_H

View File

@ -14,6 +14,8 @@ extern Statuses Current_Status;
extern FILE *FileBuffer;
extern uint8_t BufferIsSet;
extern uint8_t uartTransmitBufferSize;
extern uint8_t uartTransmitBuffer[128];

View File

@ -109,10 +109,6 @@ void show_neopixels();
#define HALL_OUT_GPIO_Port GPIOC
#define BRV_CPU_Pin GPIO_PIN_0
#define BRV_CPU_GPIO_Port GPIOA
#define LED_TIM2_CH2_PA1_Pin GPIO_PIN_1
#define LED_TIM2_CH2_PA1_GPIO_Port GPIOA
#define LED_TIM2_CH3_PA2_Pin GPIO_PIN_2
#define LED_TIM2_CH3_PA2_GPIO_Port GPIOA
#define I2C2_SCL_PH4_Pin GPIO_PIN_4
#define I2C2_SCL_PH4_GPIO_Port GPIOH
#define I2C2_SDA_PH5_Pin GPIO_PIN_5

View File

@ -52,7 +52,6 @@ void MemManage_Handler(void);
void BusFault_Handler(void);
void UsageFault_Handler(void);
void DebugMon_Handler(void);
void DMA1_Stream6_IRQHandler(void);
void CAN1_RX0_IRQHandler(void);
void FMC_IRQHandler(void);
void TIM6_DAC_IRQHandler(void);

View File

@ -0,0 +1,272 @@
/**
* @file WS2812.cpp
* @brief WS2812 RGB LED driver
*
* @date 25.03.2023
* @author Benas Brazdziunas
*/
#include "WS2812/WS2812.hpp"
static WS2812_RGB_t WS2812_LED_BUF[WS2812_LED_N];
static uint32_t WS2812_TIM_BUF[WS2812_BUFLEN];
static uint8_t WS2812_BRIGHTNESS = 5;
static bool WS2812_INVERT_ORDER = true;
TIM_HandleTypeDef WS2812_PWM_DRIVER;
DMA_HandleTypeDef WS2812_PWM_DMA;
extern void DMA1_Stream1_IRQHandler(void);
void initWS2812()
{
ConfigureTimerPeripheral();
ConfigureTimerGPIO();
ConfigureTimerChannel();
HAL_TIM_PWM_Start_DMA(&WS2812_PWM_DRIVER, WS2812_PWM_TIM_CH, (uint32_t *)WS2812_TIM_BUF, WS2812_BUFLEN);
//HAL_TIM_PWM_Start(&WS2812_PWM_DRIVER, WS2812_PWM_TIM_CH);
}
/**
* Set one LEDs to 0 (off)
*/
void clearWS2812One(uint32_t num)
{
if (num < WS2812_LED_N)
{
WS2812_LED_BUF[num] = (WS2812_RGB_t){0, 0, 0};
}
}
/**
* Set all LEDs to 0 (off)
*/
void clearWS2812All()
{
for (uint16_t num = 0; num < WS2812_LED_N; num++)
{
WS2812_LED_BUF[num] = (WS2812_RGB_t){0, 0, 0};
}
}
/**
* Set one LED (R, G, B values).
*/
void setWS2812One(uint32_t num, WS2812_RGB_t rgb_col)
{
if (num < WS2812_LED_N)
{
WS2812_LED_BUF[num] = rgb_col;
}
}
/**
* Set all LEDs (R, G, B values).
*/
void setWS2812All(WS2812_RGB_t rgb_col)
{
for (uint16_t num = 0; num < WS2812_LED_N; num++)
{
WS2812_LED_BUF[num] = rgb_col;
}
}
/**
* Set all LEDs Brightness.
*/
void setWS2812Brightness(uint8_t num)
{
num = num >= 100 ? 100 : num;
num = num <= 0 ? 0 : num;
WS2812_BRIGHTNESS = num;
}
/**
* Calculate Timer DMA buffer
*/
void updateWS2812()
{
uint32_t pos = WS2812_INVERT_ORDER ? (WS2812_LED_N * 24) : 0;
for (uint32_t num = 0; num < WS2812_LED_N; num++)
{
WS2812_RGB_t led = WS2812_LED_BUF[num];
float brightness = WS2812_BRIGHTNESS / 100.0;
led.red = (uint8_t)(led.red * brightness);
led.green = (uint8_t)(led.green * brightness);
led.blue = (uint8_t)(led.blue * brightness);
if(WS2812_INVERT_ORDER)
{
// Col:Blue , Bit:7..0
WS2812_TIM_BUF[pos--] = ((led.blue & 0x80) != 0) ? WS2812_DUTYCYCLE_1 : WS2812_DUTYCYCLE_0;
WS2812_TIM_BUF[pos--] = ((led.blue & 0x40) != 0) ? WS2812_DUTYCYCLE_1 : WS2812_DUTYCYCLE_0;
WS2812_TIM_BUF[pos--] = ((led.blue & 0x20) != 0) ? WS2812_DUTYCYCLE_1 : WS2812_DUTYCYCLE_0;
WS2812_TIM_BUF[pos--] = ((led.blue & 0x10) != 0) ? WS2812_DUTYCYCLE_1 : WS2812_DUTYCYCLE_0;
WS2812_TIM_BUF[pos--] = ((led.blue & 0x08) != 0) ? WS2812_DUTYCYCLE_1 : WS2812_DUTYCYCLE_0;
WS2812_TIM_BUF[pos--] = ((led.blue & 0x04) != 0) ? WS2812_DUTYCYCLE_1 : WS2812_DUTYCYCLE_0;
WS2812_TIM_BUF[pos--] = ((led.blue & 0x02) != 0) ? WS2812_DUTYCYCLE_1 : WS2812_DUTYCYCLE_0;
WS2812_TIM_BUF[pos--] = ((led.blue & 0x01) != 0) ? WS2812_DUTYCYCLE_1 : WS2812_DUTYCYCLE_0;
// Col:Red , Bit:7..0
WS2812_TIM_BUF[pos--] = ((led.red & 0x80) != 0) ? WS2812_DUTYCYCLE_1 : WS2812_DUTYCYCLE_0;
WS2812_TIM_BUF[pos--] = ((led.red & 0x40) != 0) ? WS2812_DUTYCYCLE_1 : WS2812_DUTYCYCLE_0;
WS2812_TIM_BUF[pos--] = ((led.red & 0x20) != 0) ? WS2812_DUTYCYCLE_1 : WS2812_DUTYCYCLE_0;
WS2812_TIM_BUF[pos--] = ((led.red & 0x10) != 0) ? WS2812_DUTYCYCLE_1 : WS2812_DUTYCYCLE_0;
WS2812_TIM_BUF[pos--] = ((led.red & 0x08) != 0) ? WS2812_DUTYCYCLE_1 : WS2812_DUTYCYCLE_0;
WS2812_TIM_BUF[pos--] = ((led.red & 0x04) != 0) ? WS2812_DUTYCYCLE_1 : WS2812_DUTYCYCLE_0;
WS2812_TIM_BUF[pos--] = ((led.red & 0x02) != 0) ? WS2812_DUTYCYCLE_1 : WS2812_DUTYCYCLE_0;
WS2812_TIM_BUF[pos--] = ((led.red & 0x01) != 0) ? WS2812_DUTYCYCLE_1 : WS2812_DUTYCYCLE_0;
// Col:Green , Bit:7..0
WS2812_TIM_BUF[pos--] = ((led.green & 0x80) != 0) ? WS2812_DUTYCYCLE_1 : WS2812_DUTYCYCLE_0;
WS2812_TIM_BUF[pos--] = ((led.green & 0x40) != 0) ? WS2812_DUTYCYCLE_1 : WS2812_DUTYCYCLE_0;
WS2812_TIM_BUF[pos--] = ((led.green & 0x20) != 0) ? WS2812_DUTYCYCLE_1 : WS2812_DUTYCYCLE_0;
WS2812_TIM_BUF[pos--] = ((led.green & 0x10) != 0) ? WS2812_DUTYCYCLE_1 : WS2812_DUTYCYCLE_0;
WS2812_TIM_BUF[pos--] = ((led.green & 0x08) != 0) ? WS2812_DUTYCYCLE_1 : WS2812_DUTYCYCLE_0;
WS2812_TIM_BUF[pos--] = ((led.green & 0x04) != 0) ? WS2812_DUTYCYCLE_1 : WS2812_DUTYCYCLE_0;
WS2812_TIM_BUF[pos--] = ((led.green & 0x02) != 0) ? WS2812_DUTYCYCLE_1 : WS2812_DUTYCYCLE_0;
WS2812_TIM_BUF[pos--] = ((led.green & 0x01) != 0) ? WS2812_DUTYCYCLE_1 : WS2812_DUTYCYCLE_0;
} else {
// Col:Green , Bit:7..0
WS2812_TIM_BUF[pos++] = ((led.green & 0x80) != 0) ? WS2812_DUTYCYCLE_1 : WS2812_DUTYCYCLE_0;
WS2812_TIM_BUF[pos++] = ((led.green & 0x40) != 0) ? WS2812_DUTYCYCLE_1 : WS2812_DUTYCYCLE_0;
WS2812_TIM_BUF[pos++] = ((led.green & 0x20) != 0) ? WS2812_DUTYCYCLE_1 : WS2812_DUTYCYCLE_0;
WS2812_TIM_BUF[pos++] = ((led.green & 0x10) != 0) ? WS2812_DUTYCYCLE_1 : WS2812_DUTYCYCLE_0;
WS2812_TIM_BUF[pos++] = ((led.green & 0x08) != 0) ? WS2812_DUTYCYCLE_1 : WS2812_DUTYCYCLE_0;
WS2812_TIM_BUF[pos++] = ((led.green & 0x04) != 0) ? WS2812_DUTYCYCLE_1 : WS2812_DUTYCYCLE_0;
WS2812_TIM_BUF[pos++] = ((led.green & 0x02) != 0) ? WS2812_DUTYCYCLE_1 : WS2812_DUTYCYCLE_0;
WS2812_TIM_BUF[pos++] = ((led.green & 0x01) != 0) ? WS2812_DUTYCYCLE_1 : WS2812_DUTYCYCLE_0;
// Col:Red , Bit:7..0
WS2812_TIM_BUF[pos++] = ((led.red & 0x80) != 0) ? WS2812_DUTYCYCLE_1 : WS2812_DUTYCYCLE_0;
WS2812_TIM_BUF[pos++] = ((led.red & 0x40) != 0) ? WS2812_DUTYCYCLE_1 : WS2812_DUTYCYCLE_0;
WS2812_TIM_BUF[pos++] = ((led.red & 0x20) != 0) ? WS2812_DUTYCYCLE_1 : WS2812_DUTYCYCLE_0;
WS2812_TIM_BUF[pos++] = ((led.red & 0x10) != 0) ? WS2812_DUTYCYCLE_1 : WS2812_DUTYCYCLE_0;
WS2812_TIM_BUF[pos++] = ((led.red & 0x08) != 0) ? WS2812_DUTYCYCLE_1 : WS2812_DUTYCYCLE_0;
WS2812_TIM_BUF[pos++] = ((led.red & 0x04) != 0) ? WS2812_DUTYCYCLE_1 : WS2812_DUTYCYCLE_0;
WS2812_TIM_BUF[pos++] = ((led.red & 0x02) != 0) ? WS2812_DUTYCYCLE_1 : WS2812_DUTYCYCLE_0;
WS2812_TIM_BUF[pos++] = ((led.red & 0x01) != 0) ? WS2812_DUTYCYCLE_1 : WS2812_DUTYCYCLE_0;
// Col:Blue , Bit:7..0
WS2812_TIM_BUF[pos++] = ((led.blue & 0x80) != 0) ? WS2812_DUTYCYCLE_1 : WS2812_DUTYCYCLE_0;
WS2812_TIM_BUF[pos++] = ((led.blue & 0x40) != 0) ? WS2812_DUTYCYCLE_1 : WS2812_DUTYCYCLE_0;
WS2812_TIM_BUF[pos++] = ((led.blue & 0x20) != 0) ? WS2812_DUTYCYCLE_1 : WS2812_DUTYCYCLE_0;
WS2812_TIM_BUF[pos++] = ((led.blue & 0x10) != 0) ? WS2812_DUTYCYCLE_1 : WS2812_DUTYCYCLE_0;
WS2812_TIM_BUF[pos++] = ((led.blue & 0x08) != 0) ? WS2812_DUTYCYCLE_1 : WS2812_DUTYCYCLE_0;
WS2812_TIM_BUF[pos++] = ((led.blue & 0x04) != 0) ? WS2812_DUTYCYCLE_1 : WS2812_DUTYCYCLE_0;
WS2812_TIM_BUF[pos++] = ((led.blue & 0x02) != 0) ? WS2812_DUTYCYCLE_1 : WS2812_DUTYCYCLE_0;
WS2812_TIM_BUF[pos++] = ((led.blue & 0x01) != 0) ? WS2812_DUTYCYCLE_1 : WS2812_DUTYCYCLE_0;
}
}
}
void ConfigureTimerPeripheral()
{
TIM_ClockConfigTypeDef sClockSourceConfig = {0};
TIM_MasterConfigTypeDef sMasterConfig = {0};
TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig = {0};
__HAL_RCC_TIM2_CLK_ENABLE();
WS2812_PWM_DRIVER.Instance = WS2812_PWM_TIMER;
WS2812_PWM_DRIVER.Init.CounterMode = TIM_COUNTERMODE_UP;
WS2812_PWM_DRIVER.Init.RepetitionCounter = 0;
WS2812_PWM_DRIVER.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
WS2812_PWM_DRIVER.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
WS2812_PWM_DRIVER.Init.Period = WS2812_PWM_PERIOD - 1;
WS2812_PWM_DRIVER.Init.Prescaler = 0;
if (HAL_TIM_Base_Init(&WS2812_PWM_DRIVER) != HAL_OK)
{
return;
}
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
if (HAL_TIM_ConfigClockSource(&WS2812_PWM_DRIVER, &sClockSourceConfig) != HAL_OK)
{
return;
}
ConfigureDMA();
if (HAL_TIM_PWM_Init(&WS2812_PWM_DRIVER) != HAL_OK)
{
return;
}
}
void ConfigureTimerGPIO(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_PULLDOWN;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
GPIO_InitStruct.Alternate = GPIO_AF1_TIM2;
__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_InitStruct.Pin = WS2812_PWM_PIN;
HAL_GPIO_Init(WS2812_PORT, &GPIO_InitStruct);
}
void ConfigureTimerChannel(void)
{
TIM_OC_InitTypeDef sConfigOC = {0};
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = 0;//WS2812_PWM_PERIOD / 2;
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;
sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;
// Configure channel
if (HAL_TIM_PWM_ConfigChannel(&WS2812_PWM_DRIVER, &sConfigOC, WS2812_PWM_TIM_CH) != HAL_OK)
{
return;
}
}
void ConfigureDMA(void)
{
// See DMA mapping on page 226 in Reference Manual
/* Enable DMA clock */
__HAL_RCC_DMA1_CLK_ENABLE();
/*##- 3- Configure DMA #####################################################*/
/*********************** Configure DMA parameters ***************************/
WS2812_PWM_DMA.Instance = DMA1_Stream1;
WS2812_PWM_DMA.Init.Channel = DMA_CHANNEL_3;
WS2812_PWM_DMA.Init.Direction = DMA_MEMORY_TO_PERIPH;
WS2812_PWM_DMA.Init.PeriphInc = DMA_PINC_DISABLE;
WS2812_PWM_DMA.Init.MemInc = DMA_MINC_ENABLE;
WS2812_PWM_DMA.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
WS2812_PWM_DMA.Init.MemDataAlignment = DMA_PDATAALIGN_WORD;
WS2812_PWM_DMA.Init.Mode = DMA_CIRCULAR;
WS2812_PWM_DMA.Init.Priority = DMA_PRIORITY_VERY_HIGH;
WS2812_PWM_DMA.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
/* Associate the DMA handle */
__HAL_LINKDMA(&WS2812_PWM_DRIVER, hdma[TIM_DMA_ID_CC3], WS2812_PWM_DMA);
/* Initialize DMA handle */
HAL_DMA_Init(WS2812_PWM_DRIVER.hdma[TIM_DMA_ID_CC3]);
/* NVIC configuration for DMA transfer complete interrupt */
HAL_NVIC_SetPriority(DMA1_Stream1_IRQn, 5, 0);
HAL_NVIC_EnableIRQ(DMA1_Stream1_IRQn);
}
void DMA1_Stream1_IRQHandler(void)
{
HAL_DMA_IRQHandler(WS2812_PWM_DRIVER.hdma[TIM_DMA_ID_CC3]);
}

View File

@ -1,126 +0,0 @@
/**
* WS2812 Neopixel LED driver for STM32
* Based upon the WS2812 Library for STM32F4 from Uwe Becker, http://mikrocontroller.bplaced.net/wordpress/?page_id=3665
*
* @Author: Nicolas Dammin, 2016
*/
#include "WS2812_Lib.h"
uint16_t WS2812_TIM_BUF[WS2812_BUFLEN];
uint8_t dma_ready = 1;
void DMA_Callback(void) {
dma_ready = 1;
}
/**
* Internal function, calculates the HI or LO values for the 800 kHz WS2812 signal and puts them into a buffer for the Timer-DMA
*
*/
void calcBuf(void)
{
uint32_t n;
uint32_t pos;
pos=0;
// set timings for all LEDs
for(n=0;n<WS2812_NUM_LEDS_CH1;n++) {
WS2812_RGB_t led = WS2812_LED_BUF_CH1[n];
float brightness = Current_Status.LED_BRIGHTNESS / 100.0;
led.red = (uint8_t)(led.red * brightness);
led.green = (uint8_t)(led.green * brightness);
led.blue = (uint8_t)(led.blue * brightness);
// Col:Red , Bit:7..0
WS2812_TIM_BUF[pos++]=((led.red&0x80) != 0)?WS2812_HI_TIME:WS2812_LO_TIME;
WS2812_TIM_BUF[pos++]=((led.red&0x40) != 0)?WS2812_HI_TIME:WS2812_LO_TIME;
WS2812_TIM_BUF[pos++]=((led.red&0x20) != 0)?WS2812_HI_TIME:WS2812_LO_TIME;
WS2812_TIM_BUF[pos++]=((led.red&0x10) != 0)?WS2812_HI_TIME:WS2812_LO_TIME;
WS2812_TIM_BUF[pos++]=((led.red&0x08) != 0)?WS2812_HI_TIME:WS2812_LO_TIME;
WS2812_TIM_BUF[pos++]=((led.red&0x04) != 0)?WS2812_HI_TIME:WS2812_LO_TIME;
WS2812_TIM_BUF[pos++]=((led.red&0x02) != 0)?WS2812_HI_TIME:WS2812_LO_TIME;
WS2812_TIM_BUF[pos++]=((led.red&0x01) != 0)?WS2812_HI_TIME:WS2812_LO_TIME;
// Col:Green , Bit:7..0
WS2812_TIM_BUF[pos++]=((led.green&0x80) != 0)?WS2812_HI_TIME:WS2812_LO_TIME;
WS2812_TIM_BUF[pos++]=((led.green&0x40) != 0)?WS2812_HI_TIME:WS2812_LO_TIME;
WS2812_TIM_BUF[pos++]=((led.green&0x20) != 0)?WS2812_HI_TIME:WS2812_LO_TIME;
WS2812_TIM_BUF[pos++]=((led.green&0x10) != 0)?WS2812_HI_TIME:WS2812_LO_TIME;
WS2812_TIM_BUF[pos++]=((led.green&0x08) != 0)?WS2812_HI_TIME:WS2812_LO_TIME;
WS2812_TIM_BUF[pos++]=((led.green&0x04) != 0)?WS2812_HI_TIME:WS2812_LO_TIME;
WS2812_TIM_BUF[pos++]=((led.green&0x02) != 0)?WS2812_HI_TIME:WS2812_LO_TIME;
WS2812_TIM_BUF[pos++]=((led.green&0x01) != 0)?WS2812_HI_TIME:WS2812_LO_TIME;
// Col:Blue , Bit:7..0
WS2812_TIM_BUF[pos++]=((led.blue&0x80) != 0)?WS2812_HI_TIME:WS2812_LO_TIME;
WS2812_TIM_BUF[pos++]=((led.blue&0x40) != 0)?WS2812_HI_TIME:WS2812_LO_TIME;
WS2812_TIM_BUF[pos++]=((led.blue&0x20) != 0)?WS2812_HI_TIME:WS2812_LO_TIME;
WS2812_TIM_BUF[pos++]=((led.blue&0x10) != 0)?WS2812_HI_TIME:WS2812_LO_TIME;
WS2812_TIM_BUF[pos++]=((led.blue&0x08) != 0)?WS2812_HI_TIME:WS2812_LO_TIME;
WS2812_TIM_BUF[pos++]=((led.blue&0x04) != 0)?WS2812_HI_TIME:WS2812_LO_TIME;
WS2812_TIM_BUF[pos++]=((led.blue&0x02) != 0)?WS2812_HI_TIME:WS2812_LO_TIME;
WS2812_TIM_BUF[pos++]=((led.blue&0x01) != 0)?WS2812_HI_TIME:WS2812_LO_TIME;
}
// short pause after all LEDs have been updated
// for(n=0;n<(WS2812_NUM_LEDS_CH1+2);n++) {
// WS2812_TIM_BUF[pos++]=0;
// }
}
/**
* Internal function; start DMA transfer
*/
void startDMA(void) {
dma_ready = 0;
if (HAL_TIM_PWM_Start_DMA(&htim2, TIM_CHANNEL_2, (uint32_t *)WS2812_TIM_BUF, WS2812_BUFLEN) != HAL_OK)
{
}
}
void WS2812_Refresh(void) {
while(!dma_ready);
calcBuf();
startDMA();
}
/**
* Set all LEDs to 0 (off) and update
*/
void WS2812_Clear(uint8_t refresh) {
uint16_t num;
for(num = 0; num < WS2812_NUM_LEDS_CH1; num++) {
WS2812_LED_BUF_CH1[num] = (WS2812_RGB_t){0,0,0};
}
if(refresh==1) WS2812_Refresh();
}
/**
* Set one LED (R, G, B values). If refresh == 1, update LEDs, otherwise just update buffer (if several function calls are to be done before refresh)
*/
void WS2812_One_RGB(uint32_t nr, WS2812_RGB_t rgb_col, uint8_t refresh)
{
if(nr<WS2812_NUM_LEDS_CH1) {
WS2812_LED_BUF_CH1[nr]=rgb_col;
if(refresh==1) WS2812_Refresh();
}
}
/**
* Set all LEDs (R, G, B values). If refresh == 1, update LEDs, otherwise just update buffer (if several function calls are to be done before refresh)
*/
void WS2812_All_RGB(WS2812_RGB_t rgb_col, uint8_t refresh)
{
uint32_t n;
for(n=0;n<WS2812_NUM_LEDS_CH1;n++) {
WS2812_LED_BUF_CH1[n]=rgb_col;
}
if(refresh==1) WS2812_Refresh();
}

View File

@ -30,7 +30,11 @@
#include "Globals.h"
#include "extern.h"
#include "sdram.h"
#include "WS2812_Lib.h"
#include "WS2812/WS2812.hpp"
//Setup
#include "Setup/Dash/setupDash.h"
#include "Setup/Field/setupField.h"
/* USER CODE END Includes */
@ -61,9 +65,7 @@ DMA2D_HandleTypeDef hdma2d;
LTDC_HandleTypeDef hltdc;
TIM_HandleTypeDef htim1;
TIM_HandleTypeDef htim2;
TIM_HandleTypeDef htim13;
DMA_HandleTypeDef hdma_tim2_ch2_ch4;
SDRAM_HandleTypeDef hsdram1;
@ -106,7 +108,7 @@ const osThreadAttr_t ALERT_Task_attributes = {
osThreadId_t RGB_TaskHandle;
const osThreadAttr_t RGB_Task_attributes = {
.name = "RGB_Task",
.stack_size = 128 * 4,
.stack_size = 512 * 4,
.priority = (osPriority_t) osPriorityLow,
};
/* USER CODE BEGIN PV */
@ -119,12 +121,14 @@ CAN_RxHeaderTypeDef RxHeader;
uint8_t TxData[8];
uint8_t RxData[8];
uint8_t uartTransmitBufferSize;
uint8_t uartTransmitBuffer[128];
/* USER CODE END PV */
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_DMA_Init(void);
static void MX_LTDC_Init(void);
static void MX_DMA2D_Init(void);
static void MX_FMC_Init(void);
@ -133,7 +137,6 @@ static void MX_TIM13_Init(void);
static void MX_CAN1_Init(void);
static void MX_ADC1_Init(void);
static void MX_TIM1_Init(void);
static void MX_TIM2_Init(void);
void Start_START_Task(void *argument);
void TouchGFX_Task(void *argument);
void Start_LED_Task(void *argument);
@ -176,7 +179,6 @@ int main(void)
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_DMA_Init();
MX_LTDC_Init();
MX_DMA2D_Init();
MX_FMC_Init();
@ -185,18 +187,13 @@ int main(void)
MX_CAN1_Init();
MX_ADC1_Init();
MX_TIM1_Init();
MX_TIM2_Init();
MX_TouchGFX_Init();
/* Call PreOsInit function */
MX_TouchGFX_PreOSInit();
/* USER CODE BEGIN 2 */
HAL_TIM_PWM_Start(&htim13, TIM_CHANNEL_1);
//BH1750_sensor = BH1750_init_dev_struct(&hi2c2, "BH1750 device", true);
//BH1750_init_dev(BH1750_sensor);
HAL_TIM_PWM_Start(&htim13, TIM_CHANNEL_1);
initWS2812();
/* USER CODE END 2 */
@ -599,65 +596,6 @@ static void MX_TIM1_Init(void)
}
/**
* @brief TIM2 Initialization Function
* @param None
* @retval None
*/
static void MX_TIM2_Init(void)
{
/* USER CODE BEGIN TIM2_Init 0 */
/* USER CODE END TIM2_Init 0 */
TIM_ClockConfigTypeDef sClockSourceConfig = {0};
TIM_MasterConfigTypeDef sMasterConfig = {0};
TIM_OC_InitTypeDef sConfigOC = {0};
/* USER CODE BEGIN TIM2_Init 1 */
/* USER CODE END TIM2_Init 1 */
htim2.Instance = TIM2;
htim2.Init.Prescaler = 0;
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
htim2.Init.Period = 210;
htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
if (HAL_TIM_Base_Init(&htim2) != HAL_OK)
{
Error_Handler();
}
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK)
{
Error_Handler();
}
if (HAL_TIM_PWM_Init(&htim2) != HAL_OK)
{
Error_Handler();
}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)
{
Error_Handler();
}
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = 0;
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_2) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN TIM2_Init 2 */
/* USER CODE END TIM2_Init 2 */
HAL_TIM_MspPostInit(&htim2);
}
/**
* @brief TIM13 Initialization Function
* @param None
@ -704,22 +642,6 @@ static void MX_TIM13_Init(void)
}
/**
* Enable DMA controller clock
*/
static void MX_DMA_Init(void)
{
/* DMA controller clock enable */
__HAL_RCC_DMA1_CLK_ENABLE();
/* DMA interrupt init */
/* DMA1_Stream6_IRQn interrupt configuration */
HAL_NVIC_SetPriority(DMA1_Stream6_IRQn, 5, 0);
HAL_NVIC_EnableIRQ(DMA1_Stream6_IRQn);
}
/* FMC initialization function */
static void MX_FMC_Init(void)
{
@ -1255,28 +1177,50 @@ void Start_CAN_Task(void *argument)
default:
break;
}
if(RxHeader.StdId == CAN_SETUP_ID)
{
switch (RxData[0]) {
case 0x00: //READ START
break;
case 0xA0: //SETUP DEVICE
break;
case 0xB0: //SETUP FIELD
//setAllFields(&RxData);
break;
case 0xC0: //SETUP CHANNEL
break;
case 0xD0: //SETUP ERROR
break;
}
}
Current_Status.RPM_100 = mapInt(Current_Status.RPM, 0,
LCD_RPM_HIGH, 0, 100);
PROTECTION_RPM_HIGH, 0, 100);
Current_Status.RPM_100 =
Current_Status.RPM_100 >= 100 ?
100 : Current_Status.RPM_100;
Current_Status.RPM_180 = mapInt(Current_Status.RPM, 0,
LCD_RPM_HIGH, 0, 180);
PROTECTION_RPM_HIGH, 0, 180);
Current_Status.RPM_180 =
Current_Status.RPM_180 >= 180 ?
810 : Current_Status.RPM_180;
Current_Status.RPM_270 = mapInt(Current_Status.RPM, 0,
LCD_RPM_HIGH, 0, 270);
PROTECTION_RPM_HIGH, 0, 270);
Current_Status.RPM_270 =
Current_Status.RPM_270 >= 270 ?
270 : Current_Status.RPM_270;
Current_Status.RPM_240 = mapInt(Current_Status.RPM, 0,
LCD_RPM_HIGH, 0, 240);
PROTECTION_RPM_HIGH, 0, 240);
Current_Status.RPM_240 =
Current_Status.RPM_240 >= 240 ?
240 : Current_Status.RPM_240;
Current_Status.RPM_360 = mapInt(Current_Status.RPM, 0,
LCD_RPM_HIGH, 0, 360);
PROTECTION_RPM_HIGH, 0, 360);
Current_Status.RPM_360 =
Current_Status.RPM_360 >= 360 ?
360 : Current_Status.RPM_360;
@ -1584,17 +1528,17 @@ void Start_ALERT_Task(void *argument)
void Start_RGB_Task(void *argument)
{
/* USER CODE BEGIN Start_RGB_Task */
Current_Status.LED_BRIGHTNESS = LED_DEFAULT_BRIGHTNESS;
/* Infinite loop */
for (;;) {
Current_Status.ENGINE_PROTECTION = Current_Status.RPM >= PROTECTION_RPM_HIGH ? 1 : 0;
if (RGB_ENABLED) {
Current_Status.RPM = Current_Status.RPM >= PROTECTION_RPM_HIGH ? 0 : Current_Status.RPM;
Current_Status.RPM = Current_Status.RPM + 100;
WS2812_Clear(0);
uint8_t RPMLED = LED_NUMBER;
Current_Status.ENGINE_PROTECTION = Current_Status.RPM >= PROTECTION_RPM_HIGH ? 1 : 0;
clearWS2812All();
uint8_t RPMLED = WS2812_LED_N;
uint16_t lowRange = mapInt(Current_Status.RPM, PROTECTION_RPM_LOW, 0, RPMLED - PROTECTION_RPM_LED, 1);
lowRange = lowRange > RPMLED - PROTECTION_RPM_LED ? RPMLED - PROTECTION_RPM_LED : lowRange;
@ -1611,7 +1555,7 @@ void Start_RGB_Task(void *argument)
color.green = 255;
color.blue = 0;
}
WS2812_One_RGB((RPMLED - i) + (LED_NUMBER - RPMLED), color, 0);
setWS2812One((RPMLED - i) + (WS2812_LED_N - RPMLED), color);
}
if (Current_Status.RPM > PROTECTION_RPM_LOW) {
@ -1622,10 +1566,10 @@ void Start_RGB_Task(void *argument)
color.green = 0;
color.blue = 0;
WS2812_One_RGB((PROTECTION_RPM_LED - i) + (LED_NUMBER - RPMLED), color, 0);
setWS2812One((PROTECTION_RPM_LED - i) + (WS2812_LED_N - RPMLED), color);
}
WS2812_Refresh();
updateWS2812();
osDelay(50);
for (int i = 1; i <= highRange; i++) {
@ -1634,11 +1578,12 @@ void Start_RGB_Task(void *argument)
color.green = 0;
color.blue = 0;
WS2812_One_RGB((PROTECTION_RPM_LED - i) + (LED_NUMBER - RPMLED), color, 0);
setWS2812One((PROTECTION_RPM_LED - i) + (WS2812_LED_N - RPMLED), color);
}
}
WS2812_Refresh();
updateWS2812();
osDelay(100);
}
}

View File

@ -23,7 +23,6 @@
/* USER CODE BEGIN Includes */
/* USER CODE END Includes */
extern DMA_HandleTypeDef hdma_tim2_ch2_ch4;
/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN TD */
@ -60,7 +59,7 @@ extern DMA_HandleTypeDef hdma_tim2_ch2_ch4;
/* USER CODE END 0 */
void HAL_TIM_MspPostInit(TIM_HandleTypeDef *htim);
/**
/**
* Initializes the Global MSP.
*/
void HAL_MspInit(void)
@ -510,7 +509,6 @@ void HAL_LTDC_MspDeInit(LTDC_HandleTypeDef* hltdc)
*/
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
if(htim_base->Instance==TIM1)
{
/* USER CODE BEGIN TIM1_MspInit 0 */
@ -522,54 +520,6 @@ void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base)
/* USER CODE END TIM1_MspInit 1 */
}
else if(htim_base->Instance==TIM2)
{
/* USER CODE BEGIN TIM2_MspInit 0 */
/* USER CODE END TIM2_MspInit 0 */
/* Peripheral clock enable */
__HAL_RCC_TIM2_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
/**TIM2 GPIO Configuration
PA2 ------> TIM2_CH3
*/
GPIO_InitStruct.Pin = LED_TIM2_CH3_PA2_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF1_TIM2;
HAL_GPIO_Init(LED_TIM2_CH3_PA2_GPIO_Port, &GPIO_InitStruct);
/* TIM2 DMA Init */
/* TIM2_CH2_CH4 Init */
hdma_tim2_ch2_ch4.Instance = DMA1_Stream6;
hdma_tim2_ch2_ch4.Init.Channel = DMA_CHANNEL_3;
hdma_tim2_ch2_ch4.Init.Direction = DMA_MEMORY_TO_PERIPH;
hdma_tim2_ch2_ch4.Init.PeriphInc = DMA_PINC_DISABLE;
hdma_tim2_ch2_ch4.Init.MemInc = DMA_MINC_ENABLE;
hdma_tim2_ch2_ch4.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
hdma_tim2_ch2_ch4.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
hdma_tim2_ch2_ch4.Init.Mode = DMA_NORMAL;
hdma_tim2_ch2_ch4.Init.Priority = DMA_PRIORITY_LOW;
hdma_tim2_ch2_ch4.Init.FIFOMode = DMA_FIFOMODE_ENABLE;
hdma_tim2_ch2_ch4.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL;
hdma_tim2_ch2_ch4.Init.MemBurst = DMA_MBURST_SINGLE;
hdma_tim2_ch2_ch4.Init.PeriphBurst = DMA_PBURST_SINGLE;
if (HAL_DMA_Init(&hdma_tim2_ch2_ch4) != HAL_OK)
{
Error_Handler();
}
/* Several peripheral DMA handle pointers point to the same DMA handle.
Be aware that there is only one stream to perform all the requested DMAs. */
__HAL_LINKDMA(htim_base,hdma[TIM_DMA_ID_CC2],hdma_tim2_ch2_ch4);
__HAL_LINKDMA(htim_base,hdma[TIM_DMA_ID_CC4],hdma_tim2_ch2_ch4);
/* USER CODE BEGIN TIM2_MspInit 1 */
/* USER CODE END TIM2_MspInit 1 */
}
else if(htim_base->Instance==TIM13)
{
/* USER CODE BEGIN TIM13_MspInit 0 */
@ -587,27 +537,7 @@ void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base)
void HAL_TIM_MspPostInit(TIM_HandleTypeDef* htim)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
if(htim->Instance==TIM2)
{
/* USER CODE BEGIN TIM2_MspPostInit 0 */
/* USER CODE END TIM2_MspPostInit 0 */
__HAL_RCC_GPIOA_CLK_ENABLE();
/**TIM2 GPIO Configuration
PA1 ------> TIM2_CH2
*/
GPIO_InitStruct.Pin = LED_TIM2_CH2_PA1_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF1_TIM2;
HAL_GPIO_Init(LED_TIM2_CH2_PA1_GPIO_Port, &GPIO_InitStruct);
/* USER CODE BEGIN TIM2_MspPostInit 1 */
/* USER CODE END TIM2_MspPostInit 1 */
}
else if(htim->Instance==TIM13)
if(htim->Instance==TIM13)
{
/* USER CODE BEGIN TIM13_MspPostInit 0 */
@ -649,27 +579,6 @@ void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* htim_base)
/* USER CODE END TIM1_MspDeInit 1 */
}
else if(htim_base->Instance==TIM2)
{
/* USER CODE BEGIN TIM2_MspDeInit 0 */
/* USER CODE END TIM2_MspDeInit 0 */
/* Peripheral clock disable */
__HAL_RCC_TIM2_CLK_DISABLE();
/**TIM2 GPIO Configuration
PA1 ------> TIM2_CH2
PA2 ------> TIM2_CH3
*/
HAL_GPIO_DeInit(GPIOA, LED_TIM2_CH2_PA1_Pin|LED_TIM2_CH3_PA2_Pin);
/* TIM2 DMA DeInit */
HAL_DMA_DeInit(htim_base->hdma[TIM_DMA_ID_CC2]);
HAL_DMA_DeInit(htim_base->hdma[TIM_DMA_ID_CC4]);
/* USER CODE BEGIN TIM2_MspDeInit 1 */
/* USER CODE END TIM2_MspDeInit 1 */
}
else if(htim_base->Instance==TIM13)
{
/* USER CODE BEGIN TIM13_MspDeInit 0 */

View File

@ -22,7 +22,6 @@
#include "stm32f4xx_it.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "WS2812_Lib.h"
/* USER CODE END Includes */
/* Private typedef -----------------------------------------------------------*/
@ -61,7 +60,6 @@ extern CAN_HandleTypeDef hcan1;
extern DMA2D_HandleTypeDef hdma2d;
extern SDRAM_HandleTypeDef hsdram1;
extern LTDC_HandleTypeDef hltdc;
extern DMA_HandleTypeDef hdma_tim2_ch2_ch4;
extern TIM_HandleTypeDef htim6;
/* USER CODE BEGIN EV */
@ -166,20 +164,6 @@ void DebugMon_Handler(void)
/* please refer to the startup file (startup_stm32f4xx.s). */
/******************************************************************************/
/**
* @brief This function handles DMA1 stream6 global interrupt.
*/
void DMA1_Stream6_IRQHandler(void)
{
/* USER CODE BEGIN DMA1_Stream6_IRQn 0 */
DMA_Callback();
/* USER CODE END DMA1_Stream6_IRQn 0 */
HAL_DMA_IRQHandler(&hdma_tim2_ch2_ch4);
/* USER CODE BEGIN DMA1_Stream6_IRQn 1 */
/* USER CODE END DMA1_Stream6_IRQn 1 */
}
/**
* @brief This function handles CAN1 RX0 interrupts.
*/

View File

@ -20,21 +20,6 @@ DMA2D.IPParameters=ColorMode,Mode,InputColorModeForeground,InputColorModeBackgro
DMA2D.InputColorModeBackground=DMA2D_INPUT_RGB565
DMA2D.InputColorModeForeground=DMA2D_INPUT_RGB565
DMA2D.Mode=DMA2D_M2M_BLEND
Dma.Request0=TIM2_CH2/CH4
Dma.RequestsNb=1
Dma.TIM2_CH2/CH4.0.Direction=DMA_MEMORY_TO_PERIPH
Dma.TIM2_CH2/CH4.0.FIFOMode=DMA_FIFOMODE_ENABLE
Dma.TIM2_CH2/CH4.0.FIFOThreshold=DMA_FIFO_THRESHOLD_FULL
Dma.TIM2_CH2/CH4.0.Instance=DMA1_Stream6
Dma.TIM2_CH2/CH4.0.MemBurst=DMA_MBURST_SINGLE
Dma.TIM2_CH2/CH4.0.MemDataAlignment=DMA_MDATAALIGN_BYTE
Dma.TIM2_CH2/CH4.0.MemInc=DMA_MINC_ENABLE
Dma.TIM2_CH2/CH4.0.Mode=DMA_NORMAL
Dma.TIM2_CH2/CH4.0.PeriphBurst=DMA_PBURST_SINGLE
Dma.TIM2_CH2/CH4.0.PeriphDataAlignment=DMA_PDATAALIGN_HALFWORD
Dma.TIM2_CH2/CH4.0.PeriphInc=DMA_PINC_DISABLE
Dma.TIM2_CH2/CH4.0.Priority=DMA_PRIORITY_LOW
Dma.TIM2_CH2/CH4.0.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority,FIFOMode,FIFOThreshold,MemBurst,PeriphBurst
FMC.CASLatency1=FMC_SDRAM_CAS_LATENCY_3
FMC.ColumnBitsNumber1=FMC_SDRAM_COLUMN_BITS_NUM_9
FMC.ExitSelfRefreshDelay1=8
@ -51,12 +36,12 @@ FMC.SelfRefreshTime1=6
FMC.WriteRecoveryTime1=5
FREERTOS.FootprintOK=true
FREERTOS.IPParameters=Tasks01,FootprintOK,configUSE_NEWLIB_REENTRANT,configPRIO_BITS,configASSERT( x ),configTIMER_QUEUE_LENGTH,configMINIMAL_STACK_SIZE,configTOTAL_HEAP_SIZE
FREERTOS.Tasks01=START_Task,24,128,Start_START_Task,Default,NULL,Dynamic,NULL,NULL;TouchGFXTask,40,2048,TouchGFX_Task,As weak,NULL,Dynamic,NULL,NULL;LED_Task,8,128,Start_LED_Task,Default,NULL,Dynamic,NULL,NULL;CAN_Task,8,128,Start_CAN_Task,Default,NULL,Dynamic,NULL,NULL;ALERT_Task,8,128,Start_ALERT_Task,Default,NULL,Dynamic,NULL,NULL;RGB_Task,8,128,Start_RGB_Task,Default,NULL,Dynamic,NULL,NULL
FREERTOS.Tasks01=START_Task,24,128,Start_START_Task,Default,NULL,Dynamic,NULL,NULL;TouchGFXTask,40,2048,TouchGFX_Task,As weak,NULL,Dynamic,NULL,NULL;LED_Task,8,128,Start_LED_Task,Default,NULL,Dynamic,NULL,NULL;CAN_Task,8,128,Start_CAN_Task,Default,NULL,Dynamic,NULL,NULL;ALERT_Task,8,128,Start_ALERT_Task,Default,NULL,Dynamic,NULL,NULL;RGB_Task,8,512,Start_RGB_Task,Default,NULL,Dynamic,NULL,NULL
FREERTOS.configASSERT(\ x\ )=if ((x) \=\= 0) {taskDISABLE_INTERRUPTS(); for( ;; );}
FREERTOS.configMINIMAL_STACK_SIZE=64
FREERTOS.configPRIO_BITS=4
FREERTOS.configTIMER_QUEUE_LENGTH=10
FREERTOS.configTOTAL_HEAP_SIZE=28360
FREERTOS.configTOTAL_HEAP_SIZE=128360
FREERTOS.configUSE_NEWLIB_REENTRANT=1
File.Version=6
GPIO.groupedBy=Show All
@ -102,49 +87,44 @@ Mcu.CPN=STM32F429IIT6
Mcu.Family=STM32F4
Mcu.IP0=ADC1
Mcu.IP1=CAN1
Mcu.IP10=SYS
Mcu.IP11=TIM1
Mcu.IP12=TIM2
Mcu.IP13=TIM13
Mcu.IP14=USB_DEVICE
Mcu.IP15=USB_OTG_FS
Mcu.IP10=TIM1
Mcu.IP11=TIM13
Mcu.IP12=USB_DEVICE
Mcu.IP13=USB_OTG_FS
Mcu.IP2=CRC
Mcu.IP3=DMA
Mcu.IP4=DMA2D
Mcu.IP5=FMC
Mcu.IP6=FREERTOS
Mcu.IP7=LTDC
Mcu.IP8=NVIC
Mcu.IP9=RCC
Mcu.IPNb=16
Mcu.IP3=DMA2D
Mcu.IP4=FMC
Mcu.IP5=FREERTOS
Mcu.IP6=LTDC
Mcu.IP7=NVIC
Mcu.IP8=RCC
Mcu.IP9=SYS
Mcu.IPNb=14
Mcu.Name=STM32F429IITx
Mcu.Package=LQFP176
Mcu.Pin0=PE2
Mcu.Pin1=PE3
Mcu.Pin10=PF2
Mcu.Pin100=PB3
Mcu.Pin101=PB4
Mcu.Pin102=PB5
Mcu.Pin103=PB7
Mcu.Pin104=PB8
Mcu.Pin105=PB9
Mcu.Pin106=PE0
Mcu.Pin107=PE1
Mcu.Pin108=PI4
Mcu.Pin109=PI5
Mcu.Pin100=PB5
Mcu.Pin101=PB7
Mcu.Pin102=PB8
Mcu.Pin103=PB9
Mcu.Pin104=PE0
Mcu.Pin105=PE1
Mcu.Pin106=PI4
Mcu.Pin107=PI5
Mcu.Pin108=PI6
Mcu.Pin109=PI7
Mcu.Pin11=PF3
Mcu.Pin110=PI6
Mcu.Pin111=PI7
Mcu.Pin112=VP_CRC_VS_CRC
Mcu.Pin113=VP_DMA2D_VS_DMA2D
Mcu.Pin114=VP_FREERTOS_VS_CMSIS_V2
Mcu.Pin115=VP_SYS_VS_tim6
Mcu.Pin116=VP_TIM1_VS_ClockSourceINT
Mcu.Pin117=VP_TIM2_VS_ClockSourceINT
Mcu.Pin118=VP_TIM13_VS_ClockSourceINT
Mcu.Pin119=VP_USB_DEVICE_VS_USB_DEVICE_CDC_FS
Mcu.Pin110=VP_CRC_VS_CRC
Mcu.Pin111=VP_DMA2D_VS_DMA2D
Mcu.Pin112=VP_FREERTOS_VS_CMSIS_V2
Mcu.Pin113=VP_SYS_VS_tim6
Mcu.Pin114=VP_TIM1_VS_ClockSourceINT
Mcu.Pin115=VP_TIM13_VS_ClockSourceINT
Mcu.Pin116=VP_USB_DEVICE_VS_USB_DEVICE_CDC_FS
Mcu.Pin117=VP_STMicroelectronics.X-CUBE-TOUCHGFX_VS_GraphicsJjApplication_4.21.1
Mcu.Pin12=PF4
Mcu.Pin120=VP_STMicroelectronics.X-CUBE-TOUCHGFX_VS_GraphicsJjApplication_4.21.1
Mcu.Pin13=PF5
Mcu.Pin14=PF6
Mcu.Pin15=PF7
@ -157,90 +137,90 @@ Mcu.Pin20=PC0
Mcu.Pin21=PC1
Mcu.Pin22=PC2
Mcu.Pin23=PA0/WKUP
Mcu.Pin24=PA1
Mcu.Pin25=PA2
Mcu.Pin26=PH4
Mcu.Pin27=PH5
Mcu.Pin28=PB1
Mcu.Pin29=PB2/BOOT1
Mcu.Pin24=PH4
Mcu.Pin25=PH5
Mcu.Pin26=PB1
Mcu.Pin27=PB2/BOOT1
Mcu.Pin28=PF11
Mcu.Pin29=PF12
Mcu.Pin3=PE5
Mcu.Pin30=PF11
Mcu.Pin31=PF12
Mcu.Pin32=PF13
Mcu.Pin33=PF14
Mcu.Pin34=PF15
Mcu.Pin35=PG0
Mcu.Pin36=PG1
Mcu.Pin37=PE7
Mcu.Pin38=PE8
Mcu.Pin39=PE9
Mcu.Pin30=PF13
Mcu.Pin31=PF14
Mcu.Pin32=PF15
Mcu.Pin33=PG0
Mcu.Pin34=PG1
Mcu.Pin35=PE7
Mcu.Pin36=PE8
Mcu.Pin37=PE9
Mcu.Pin38=PE10
Mcu.Pin39=PE11
Mcu.Pin4=PC13
Mcu.Pin40=PE10
Mcu.Pin41=PE11
Mcu.Pin42=PE12
Mcu.Pin43=PE13
Mcu.Pin44=PE14
Mcu.Pin45=PE15
Mcu.Pin46=PB10
Mcu.Pin47=PB11
Mcu.Pin48=PH6
Mcu.Pin49=PH7
Mcu.Pin40=PE12
Mcu.Pin41=PE13
Mcu.Pin42=PE14
Mcu.Pin43=PE15
Mcu.Pin44=PB10
Mcu.Pin45=PB11
Mcu.Pin46=PH6
Mcu.Pin47=PH7
Mcu.Pin48=PH8
Mcu.Pin49=PH9
Mcu.Pin5=PI9
Mcu.Pin50=PH8
Mcu.Pin51=PH9
Mcu.Pin52=PH10
Mcu.Pin53=PH11
Mcu.Pin54=PB12
Mcu.Pin55=PB13
Mcu.Pin56=PD8
Mcu.Pin57=PD9
Mcu.Pin58=PD10
Mcu.Pin59=PD14
Mcu.Pin50=PH10
Mcu.Pin51=PH11
Mcu.Pin52=PB12
Mcu.Pin53=PB13
Mcu.Pin54=PD8
Mcu.Pin55=PD9
Mcu.Pin56=PD10
Mcu.Pin57=PD14
Mcu.Pin58=PD15
Mcu.Pin59=PG2
Mcu.Pin6=PI10
Mcu.Pin60=PD15
Mcu.Pin61=PG2
Mcu.Pin62=PG4
Mcu.Pin63=PG5
Mcu.Pin64=PG6
Mcu.Pin65=PG7
Mcu.Pin66=PG8
Mcu.Pin67=PC6
Mcu.Pin68=PC7
Mcu.Pin69=PC8
Mcu.Pin60=PG4
Mcu.Pin61=PG5
Mcu.Pin62=PG6
Mcu.Pin63=PG7
Mcu.Pin64=PG8
Mcu.Pin65=PC6
Mcu.Pin66=PC7
Mcu.Pin67=PC8
Mcu.Pin68=PC9
Mcu.Pin69=PA8
Mcu.Pin7=PI11
Mcu.Pin70=PC9
Mcu.Pin71=PA8
Mcu.Pin72=PA11
Mcu.Pin73=PA12
Mcu.Pin74=PA13
Mcu.Pin75=PH13
Mcu.Pin76=PH14
Mcu.Pin77=PH15
Mcu.Pin78=PI0
Mcu.Pin79=PI1
Mcu.Pin70=PA11
Mcu.Pin71=PA12
Mcu.Pin72=PA13
Mcu.Pin73=PH13
Mcu.Pin74=PH14
Mcu.Pin75=PH15
Mcu.Pin76=PI0
Mcu.Pin77=PI1
Mcu.Pin78=PI2
Mcu.Pin79=PI3
Mcu.Pin8=PF0
Mcu.Pin80=PI2
Mcu.Pin81=PI3
Mcu.Pin82=PA14
Mcu.Pin83=PC10
Mcu.Pin84=PC11
Mcu.Pin85=PC12
Mcu.Pin86=PD0
Mcu.Pin87=PD1
Mcu.Pin88=PD2
Mcu.Pin89=PD3
Mcu.Pin80=PA14
Mcu.Pin81=PC10
Mcu.Pin82=PC11
Mcu.Pin83=PC12
Mcu.Pin84=PD0
Mcu.Pin85=PD1
Mcu.Pin86=PD2
Mcu.Pin87=PD3
Mcu.Pin88=PD4
Mcu.Pin89=PD6
Mcu.Pin9=PF1
Mcu.Pin90=PD4
Mcu.Pin91=PD6
Mcu.Pin92=PD7
Mcu.Pin93=PG9
Mcu.Pin94=PG10
Mcu.Pin95=PG11
Mcu.Pin96=PG12
Mcu.Pin97=PG13
Mcu.Pin98=PG14
Mcu.Pin99=PG15
Mcu.PinsNb=121
Mcu.Pin90=PD7
Mcu.Pin91=PG9
Mcu.Pin92=PG10
Mcu.Pin93=PG11
Mcu.Pin94=PG12
Mcu.Pin95=PG13
Mcu.Pin96=PG14
Mcu.Pin97=PG15
Mcu.Pin98=PB3
Mcu.Pin99=PB4
Mcu.PinsNb=118
Mcu.ThirdParty0=STMicroelectronics.X-CUBE-TOUCHGFX.4.21.1
Mcu.ThirdPartyNb=1
Mcu.UserConstants=
@ -249,7 +229,6 @@ MxCube.Version=6.6.1
MxDb.Version=DB.6.0.60
NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false\:false
NVIC.CAN1_RX0_IRQn=true\:5\:0\:false\:false\:true\:true\:true\:true\:true
NVIC.DMA1_Stream6_IRQn=true\:5\:0\:false\:false\:true\:true\:false\:true\:true
NVIC.DMA2D_IRQn=true\:5\:0\:false\:false\:true\:true\:true\:true\:true
NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false\:false
NVIC.FMC_IRQn=true\:5\:0\:false\:false\:true\:true\:true\:true\:true
@ -274,11 +253,6 @@ PA0/WKUP.GPIOParameters=GPIO_Label
PA0/WKUP.GPIO_Label=BRV_CPU
PA0/WKUP.Locked=true
PA0/WKUP.Signal=ADCx_IN0
PA1.GPIOParameters=GPIO_Speed,GPIO_Label
PA1.GPIO_Label=LED_TIM2_CH2_PA1
PA1.GPIO_Speed=GPIO_SPEED_FREQ_VERY_HIGH
PA1.Locked=true
PA1.Signal=S_TIM2_CH2
PA11.GPIOParameters=GPIO_Label
PA11.GPIO_Label=USB_OTG-
PA11.Locked=true
@ -299,11 +273,6 @@ PA14.GPIO_Label=SWCLK
PA14.Locked=true
PA14.Mode=Serial_Wire
PA14.Signal=SYS_JTCK-SWCLK
PA2.GPIOParameters=GPIO_Speed,GPIO_Label
PA2.GPIO_Label=LED_TIM2_CH3_PA2
PA2.GPIO_Speed=GPIO_SPEED_FREQ_VERY_HIGH
PA2.Locked=true
PA2.Signal=S_TIM2_CH3
PA8.Locked=true
PA8.Signal=GPIO_Input
PB1.GPIOParameters=GPIO_Speed,GPIO_PuPd,GPIO_Label,GPIO_Mode
@ -816,7 +785,7 @@ ProjectManager.StackSize=0x800
ProjectManager.TargetToolchain=STM32CubeIDE
ProjectManager.ToolChainLocation=
ProjectManager.UnderRoot=true
ProjectManager.functionlistsort=1-MX_GPIO_Init-GPIO-false-HAL-true,2-SystemClock_Config-RCC-false-HAL-false,3-MX_DMA_Init-DMA-false-HAL-true,4-MX_LTDC_Init-LTDC-false-HAL-true,5-MX_DMA2D_Init-DMA2D-false-HAL-true,6-MX_FMC_Init-FMC-false-HAL-true,7-MX_CRC_Init-CRC-false-HAL-true,8-MX_TIM13_Init-TIM13-false-HAL-true,9-MX_CAN1_Init-CAN1-false-HAL-true,10-MX_ADC1_Init-ADC1-false-HAL-true,11-MX_TIM1_Init-TIM1-false-HAL-true,12-MX_USB_DEVICE_Init-USB_DEVICE-false-HAL-false,13-MX_TIM2_Init-TIM2-false-HAL-true,14-MX_TouchGFX_Init-STMicroelectronics.X-CUBE-TOUCHGFX.4.21.1-false-HAL-false,15-MX_TouchGFX_Process-STMicroelectronics.X-CUBE-TOUCHGFX.4.21.1-false-HAL-false
ProjectManager.functionlistsort=1-MX_GPIO_Init-GPIO-false-HAL-true,2-SystemClock_Config-RCC-false-HAL-false,3-MX_LTDC_Init-LTDC-false-HAL-true,4-MX_DMA2D_Init-DMA2D-false-HAL-true,5-MX_FMC_Init-FMC-false-HAL-true,6-MX_CRC_Init-CRC-false-HAL-true,7-MX_TIM13_Init-TIM13-false-HAL-true,8-MX_CAN1_Init-CAN1-false-HAL-true,9-MX_ADC1_Init-ADC1-false-HAL-true,10-MX_TIM1_Init-TIM1-false-HAL-true,11-MX_USB_DEVICE_Init-USB_DEVICE-false-HAL-false,12-MX_TouchGFX_Init-STMicroelectronics.X-CUBE-TOUCHGFX.4.21.1-false-HAL-false,13-MX_TouchGFX_Process-STMicroelectronics.X-CUBE-TOUCHGFX.4.21.1-false-HAL-false
RCC.48MHZClocksFreq_Value=48000000
RCC.AHBFreq_Value=168000000
RCC.APB1CLKDivider=RCC_HCLK_DIV4
@ -950,10 +919,6 @@ SH.FMC_SDNWE.0=FMC_SDNWE,13b-sda1
SH.FMC_SDNWE.ConfNb=1
SH.S_TIM13_CH1.0=TIM13_CH1,PWM Generation1 CH1
SH.S_TIM13_CH1.ConfNb=1
SH.S_TIM2_CH2.0=TIM2_CH2,PWM Generation2 CH2
SH.S_TIM2_CH2.ConfNb=1
SH.S_TIM2_CH3.0=TIM2_CH3
SH.S_TIM2_CH3.ConfNb=1
STMicroelectronics.X-CUBE-TOUCHGFX.4.21.1.ApplicationCcGraphicsJjApplication=TouchGFXOoGenerator
STMicroelectronics.X-CUBE-TOUCHGFX.4.21.1.GraphicsJjApplication_Checked=true
STMicroelectronics.X-CUBE-TOUCHGFX.4.21.1.IPParameters=tgfx_display_interface,tgfx_vsync,tgfx_hardware_accelerator,tgfx_buffering_strategy,tgfx_location,tgfx_address1,tgfx_address2,ApplicationCcGraphicsJjApplication
@ -974,10 +939,6 @@ TIM13.Channel=TIM_CHANNEL_1
TIM13.IPParameters=Prescaler,Period,AutoReloadPreload,Channel
TIM13.Period=1000-1
TIM13.Prescaler=90-1
TIM2.Channel-PWM\ Generation2\ CH2=TIM_CHANNEL_2
TIM2.IPParameters=Channel-PWM Generation2 CH2,Period,OCFastMode_PWM-PWM Generation2 CH2
TIM2.OCFastMode_PWM-PWM\ Generation2\ CH2=TIM_OCFAST_DISABLE
TIM2.Period=210
USB_DEVICE.CLASS_NAME_FS=CDC
USB_DEVICE.IPParameters=VirtualModeFS,CLASS_NAME_FS,VirtualMode-CDC_FS,PID_CDC_FS,PRODUCT_STRING_CDC_FS
USB_DEVICE.PID_CDC_FS=57701
@ -1000,8 +961,6 @@ VP_TIM13_VS_ClockSourceINT.Mode=Enable_Timer
VP_TIM13_VS_ClockSourceINT.Signal=TIM13_VS_ClockSourceINT
VP_TIM1_VS_ClockSourceINT.Mode=Internal
VP_TIM1_VS_ClockSourceINT.Signal=TIM1_VS_ClockSourceINT
VP_TIM2_VS_ClockSourceINT.Mode=Internal
VP_TIM2_VS_ClockSourceINT.Signal=TIM2_VS_ClockSourceINT
VP_USB_DEVICE_VS_USB_DEVICE_CDC_FS.Mode=CDC_FS
VP_USB_DEVICE_VS_USB_DEVICE_CDC_FS.Signal=USB_DEVICE_VS_USB_DEVICE_CDC_FS
board=custom