ws2812 rgb driver

This commit is contained in:
benas-gavea 2023-03-15 16:59:22 +00:00
parent e477f9694e
commit da60f919ac
9 changed files with 537 additions and 68 deletions

View File

@ -24,7 +24,7 @@
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.floatabi.1645855301" name="Floating-point ABI" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.floatabi" useByScannerDiscovery="true" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.floatabi.value.hard" valueType="enumerated"/>
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_board.583575672" name="Board" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_board" useByScannerDiscovery="false" value="genericBoard" valueType="string"/>
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.defaults.299661417" name="Defaults" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.defaults" useByScannerDiscovery="false" value="com.st.stm32cube.ide.common.services.build.inputs.revA.1.0.6 || Debug || true || Executable || com.st.stm32cube.ide.mcu.gnu.managedbuild.option.toolchain.value.workspace || STM32F429IITx || 0 || 0 || arm-none-eabi- || ${gnu_tools_for_stm32_compiler_path} || ../Middlewares/Third_Party/FreeRTOS/Source/include | ../USB_DEVICE/Target | ../Drivers/STM32F4xx_HAL_Driver/Inc | ../Drivers/CMSIS/Device/ST/STM32F4xx/Include | ../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2 | ../Middlewares/ST/STM32_USB_Device_Library/Core/Inc | ../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy | ../TouchGFX/target/generated | ../Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F | ../Drivers/CMSIS/Include | ../Core/Inc | ../Middlewares/ST/STM32_USB_Device_Library/Class/CDC/Inc | ../USB_DEVICE/App | ../TouchGFX/App | ../TouchGFX/target || || || USE_HAL_DRIVER | STM32F429xx || || Drivers | TouchGFX | Core/Startup | Middlewares | Core | USB_DEVICE || || || ${workspace_loc:/${ProjName}/STM32F429IITX_FLASH.ld} || true || NonSecure || || secure_nsclib.o || || None || || || " valueType="string"/>
<option id="com.st.stm32cube.ide.mcu.debug.option.cpuclock.1562523366" superClass="com.st.stm32cube.ide.mcu.debug.option.cpuclock" useByScannerDiscovery="false" value="120" valueType="string"/>
<option id="com.st.stm32cube.ide.mcu.debug.option.cpuclock.1562523366" superClass="com.st.stm32cube.ide.mcu.debug.option.cpuclock" useByScannerDiscovery="false" value="168" valueType="string"/>
<targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.targetplatform.1346822476" isAbstract="false" osList="all" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.targetplatform"/>
<builder buildPath="${workspace_loc:/429IG_LCD}/Debug" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.builder.205742149" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" parallelBuildOn="true" parallelizationNumber="optimal" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.builder"/>
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.1242849919" name="MCU GCC Assembler" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler">
@ -167,7 +167,7 @@
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.floatabi.1064435165" name="Floating-point ABI" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.floatabi" useByScannerDiscovery="true" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.floatabi.value.hard" valueType="enumerated"/>
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_board.239568253" name="Board" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_board" useByScannerDiscovery="false" value="genericBoard" valueType="string"/>
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.defaults.297494156" name="Defaults" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.defaults" useByScannerDiscovery="false" value="com.st.stm32cube.ide.common.services.build.inputs.revA.1.0.6 || Release || false || Executable || com.st.stm32cube.ide.mcu.gnu.managedbuild.option.toolchain.value.workspace || STM32F429IITx || 0 || 0 || arm-none-eabi- || ${gnu_tools_for_stm32_compiler_path} || ../Middlewares/Third_Party/FreeRTOS/Source/include | ../USB_DEVICE/Target | ../Drivers/STM32F4xx_HAL_Driver/Inc | ../Drivers/CMSIS/Device/ST/STM32F4xx/Include | ../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2 | ../Middlewares/ST/STM32_USB_Device_Library/Core/Inc | ../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy | ../TouchGFX/target/generated | ../Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F | ../Drivers/CMSIS/Include | ../Core/Inc | ../Middlewares/ST/STM32_USB_Device_Library/Class/CDC/Inc | ../USB_DEVICE/App | ../TouchGFX/App | ../TouchGFX/target || || || USE_HAL_DRIVER | STM32F429xx || || Drivers | TouchGFX | Core/Startup | Middlewares | Core | USB_DEVICE || || || ${workspace_loc:/${ProjName}/STM32F429IITX_FLASH.ld} || true || NonSecure || || secure_nsclib.o || || None || || || " valueType="string"/>
<option id="com.st.stm32cube.ide.mcu.debug.option.cpuclock.929872597" superClass="com.st.stm32cube.ide.mcu.debug.option.cpuclock" useByScannerDiscovery="false" value="120" valueType="string"/>
<option id="com.st.stm32cube.ide.mcu.debug.option.cpuclock.929872597" superClass="com.st.stm32cube.ide.mcu.debug.option.cpuclock" useByScannerDiscovery="false" value="168" valueType="string"/>
<targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.targetplatform.1225329587" isAbstract="false" osList="all" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.targetplatform"/>
<builder buildPath="${workspace_loc:/429IG_LCD}/Release" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.builder.1637861446" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" parallelBuildOn="true" parallelizationNumber="optimal" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.builder"/>
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.1093854374" name="MCU GCC Assembler" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler">

View File

@ -15,7 +15,7 @@ extern "C" {
#define BH1750_ENABLED 0
#define GPS_ENABLED 1
#define GPS_ENABLED 0
#define CAN_ENABLED 1
#define RGB_ENABLED 1
#define UART_ENABLED 0
@ -24,7 +24,7 @@ extern "C" {
#define DEMO 0
#define LED_NUMBER 24
#define LED_DEFAULT_BRIGHTNESS 2
#define LED_DEFAULT_BRIGHTNESS 50
#define LCD_DEFAULT_BRIGHTNESS 400

View File

@ -0,0 +1,43 @@
#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

@ -52,6 +52,7 @@ 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,126 @@
/**
* 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,6 +30,7 @@
#include "Globals.h"
#include "extern.h"
#include "sdram.h"
#include "WS2812_Lib.h"
/* USER CODE END Includes */
@ -60,7 +61,9 @@ DMA2D_HandleTypeDef hdma2d;
LTDC_HandleTypeDef hltdc;
TIM_HandleTypeDef htim1;
TIM_HandleTypeDef htim2;
TIM_HandleTypeDef htim13;
DMA_HandleTypeDef hdma_tim2_ch2_ch4;
SDRAM_HandleTypeDef hsdram1;
@ -76,7 +79,7 @@ osThreadId_t TouchGFXTaskHandle;
const osThreadAttr_t TouchGFXTask_attributes = {
.name = "TouchGFXTask",
.stack_size = 2048 * 4,
.priority = (osPriority_t) osPriorityLow,
.priority = (osPriority_t) osPriorityHigh,
};
/* Definitions for LED_Task */
osThreadId_t LED_TaskHandle;
@ -99,6 +102,13 @@ const osThreadAttr_t ALERT_Task_attributes = {
.stack_size = 128 * 4,
.priority = (osPriority_t) osPriorityLow,
};
/* Definitions for RGB_Task */
osThreadId_t RGB_TaskHandle;
const osThreadAttr_t RGB_Task_attributes = {
.name = "RGB_Task",
.stack_size = 128 * 4,
.priority = (osPriority_t) osPriorityLow,
};
/* USER CODE BEGIN PV */
FMC_SDRAM_CommandTypeDef command;
@ -114,6 +124,7 @@ uint8_t RxData[8];
/* 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);
@ -122,11 +133,13 @@ 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);
void Start_CAN_Task(void *argument);
void Start_ALERT_Task(void *argument);
void Start_RGB_Task(void *argument);
/* USER CODE BEGIN PFP */
@ -163,6 +176,7 @@ int main(void)
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_DMA_Init();
MX_LTDC_Init();
MX_DMA2D_Init();
MX_FMC_Init();
@ -171,6 +185,7 @@ int main(void)
MX_CAN1_Init();
MX_ADC1_Init();
MX_TIM1_Init();
MX_TIM2_Init();
MX_TouchGFX_Init();
/* Call PreOsInit function */
MX_TouchGFX_PreOSInit();
@ -220,6 +235,9 @@ int main(void)
/* creation of ALERT_Task */
ALERT_TaskHandle = osThreadNew(Start_ALERT_Task, NULL, &ALERT_Task_attributes);
/* creation of RGB_Task */
RGB_TaskHandle = osThreadNew(Start_RGB_Task, NULL, &RGB_Task_attributes);
/* USER CODE BEGIN RTOS_THREADS */
/* add threads, ... */
/* USER CODE END RTOS_THREADS */
@ -255,7 +273,7 @@ void SystemClock_Config(void)
/** Configure the main internal regulator output voltage
*/
__HAL_RCC_PWR_CLK_ENABLE();
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE3);
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
/** Initializes the RCC Oscillators according to the specified parameters
* in the RCC_OscInitTypeDef structure.
@ -265,9 +283,9 @@ void SystemClock_Config(void)
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLM = 6;
RCC_OscInitStruct.PLL.PLLN = 120;
RCC_OscInitStruct.PLL.PLLN = 168;
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
RCC_OscInitStruct.PLL.PLLQ = 5;
RCC_OscInitStruct.PLL.PLLQ = 7;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
Error_Handler();
@ -282,7 +300,7 @@ void SystemClock_Config(void)
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_3) != HAL_OK)
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK)
{
Error_Handler();
}
@ -313,7 +331,7 @@ static void MX_ADC1_Init(void)
/** Configure the global features of the ADC (Clock, Resolution, Data Alignment and number of conversion)
*/
hadc1.Instance = ADC1;
hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV2;
hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;
hadc1.Init.Resolution = ADC_RESOLUTION_12B;
hadc1.Init.ScanConvMode = DISABLE;
hadc1.Init.ContinuousConvMode = DISABLE;
@ -364,7 +382,7 @@ static void MX_CAN1_Init(void)
hcan1.Init.Prescaler = 12;
hcan1.Init.Mode = CAN_MODE_NORMAL;
hcan1.Init.SyncJumpWidth = CAN_SJW_1TQ;
hcan1.Init.TimeSeg1 = CAN_BS1_2TQ;
hcan1.Init.TimeSeg1 = CAN_BS1_4TQ;
hcan1.Init.TimeSeg2 = CAN_BS2_2TQ;
hcan1.Init.TimeTriggeredMode = DISABLE;
hcan1.Init.AutoBusOff = DISABLE;
@ -581,6 +599,65 @@ 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
@ -627,6 +704,22 @@ 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)
{
@ -742,7 +835,7 @@ static void MX_GPIO_Init(void)
/*Configure GPIO pins : CAN1_S0_Pin CAN2_S0_Pin */
GPIO_InitStruct.Pin = CAN1_S0_Pin|CAN2_S0_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOF, &GPIO_InitStruct);
@ -754,14 +847,6 @@ static void MX_GPIO_Init(void)
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
/*Configure GPIO pins : LED_TIM2_CH2_PA1_Pin LED_TIM2_CH3_PA2_Pin */
GPIO_InitStruct.Pin = LED_TIM2_CH2_PA1_Pin|LED_TIM2_CH3_PA2_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
GPIO_InitStruct.Alternate = GPIO_AF1_TIM2;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/*Configure GPIO pins : I2C2_SCL_PH4_Pin I2C2_SDA_PH5_Pin */
GPIO_InitStruct.Pin = I2C2_SCL_PH4_Pin|I2C2_SDA_PH5_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
@ -915,10 +1000,10 @@ void Start_LED_Task(void *argument)
osDelay(100);
HAL_GPIO_TogglePin(LED_ALERT_GPIO_Port, LED_ALERT_Pin);
osDelay(100);
HAL_GPIO_TogglePin(LED_CAN1_GPIO_Port, LED_CAN1_Pin);
osDelay(100);
HAL_GPIO_TogglePin(LED_CAN2_GPIO_Port, LED_CAN2_Pin);
osDelay(100);
// HAL_GPIO_TogglePin(CAN1_S0_GPIO_Port, CAN1_S0_Pin);
// osDelay(100);
// HAL_GPIO_TogglePin(CAN2_S0_GPIO_Port, CAN2_S0_Pin);
// osDelay(100);
}
/* USER CODE END Start_LED_Task */
@ -939,6 +1024,10 @@ void Start_CAN_Task(void *argument)
Current_Status.PRES_UNIT = kPa;
Current_Status.TEMP_UNIT = C;
Current_Status.SPEED_UNIT = Kmh;
HAL_GPIO_WritePin(CAN1_S0_GPIO_Port, CAN1_S0_Pin, SET);
HAL_GPIO_WritePin(CAN2_S0_GPIO_Port, CAN2_S0_Pin, SET);
//HAL_GPIO_WritePin(LED_CAN1_GPIO_Port, LED_CAN1_Pin, SET);
for (;;) {
if (CAN_ENABLED) {
@ -1196,7 +1285,6 @@ void Start_CAN_Task(void *argument)
else {
}
osDelay(1);
} else {
osDelay(60000);
}
@ -1486,6 +1574,77 @@ void Start_ALERT_Task(void *argument)
/* USER CODE END Start_ALERT_Task */
}
/* USER CODE BEGIN Header_Start_RGB_Task */
/**
* @brief Function implementing the RGB_Task thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_Start_RGB_Task */
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) {
WS2812_Clear(0);
uint8_t RPMLED = LED_NUMBER;
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;
lowRange = lowRange < 1 ? 1 : lowRange;
for (int i = 1; i <= lowRange; i++) {
WS2812_RGB_t color;
if (Current_Status.ENGINE_PROTECTION == 1) {
color.red = 0;
color.green = 255;
color.blue = 0;
} else {
color.red = 0;
color.green = 255;
color.blue = 0;
}
WS2812_One_RGB((RPMLED - i) + (LED_NUMBER - RPMLED), color, 0);
}
if (Current_Status.RPM > PROTECTION_RPM_LOW) {
uint16_t highRange = mapInt(Current_Status.RPM, PROTECTION_RPM_HIGH, PROTECTION_RPM_LOW, PROTECTION_RPM_LED, 1);
for (int i = 1; i <= highRange; i++) {
WS2812_RGB_t color;
color.red = 255;
color.green = 0;
color.blue = 0;
WS2812_One_RGB((PROTECTION_RPM_LED - i) + (LED_NUMBER - RPMLED), color, 0);
}
WS2812_Refresh();
osDelay(50);
for (int i = 1; i <= highRange; i++) {
WS2812_RGB_t color;
color.red = 0;
color.green = 0;
color.blue = 0;
WS2812_One_RGB((PROTECTION_RPM_LED - i) + (LED_NUMBER - RPMLED), color, 0);
}
}
WS2812_Refresh();
osDelay(100);
}
}
/* USER CODE END Start_RGB_Task */
}
/**
* @brief Period elapsed callback in non blocking mode
* @note This function is called when TIM6 interrupt took place, inside

View File

@ -23,6 +23,7 @@
/* USER CODE BEGIN Includes */
/* USER CODE END Includes */
extern DMA_HandleTypeDef hdma_tim2_ch2_ch4;
/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN TD */
@ -59,7 +60,7 @@
/* USER CODE END 0 */
void HAL_TIM_MspPostInit(TIM_HandleTypeDef *htim);
/**
/**
* Initializes the Global MSP.
*/
void HAL_MspInit(void)
@ -509,6 +510,7 @@ 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 */
@ -520,6 +522,54 @@ 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 */
@ -537,7 +587,27 @@ void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base)
void HAL_TIM_MspPostInit(TIM_HandleTypeDef* htim)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
if(htim->Instance==TIM13)
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)
{
/* USER CODE BEGIN TIM13_MspPostInit 0 */
@ -579,6 +649,27 @@ 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,6 +22,7 @@
#include "stm32f4xx_it.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "WS2812_Lib.h"
/* USER CODE END Includes */
/* Private typedef -----------------------------------------------------------*/
@ -60,6 +61,7 @@ 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 */
@ -164,6 +166,20 @@ 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

@ -8,11 +8,11 @@ ADC1.master=1
CAD.formats=
CAD.pinconfig=
CAD.provider=
CAN1.BS1=CAN_BS1_2TQ
CAN1.BS1=CAN_BS1_4TQ
CAN1.BS2=CAN_BS2_2TQ
CAN1.CalculateBaudRate=500000
CAN1.CalculateTimeBit=2000
CAN1.CalculateTimeQuantum=400.0
CAN1.CalculateTimeQuantum=285.7142857142857
CAN1.IPParameters=CalculateTimeQuantum,CalculateTimeBit,CalculateBaudRate,Prescaler,BS1,BS2
CAN1.Prescaler=12
DMA2D.ColorMode=DMA2D_OUTPUT_RGB565
@ -20,6 +20,21 @@ 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
@ -36,7 +51,7 @@ 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,8,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
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.configASSERT(\ x\ )=if ((x) \=\= 0) {taskDISABLE_INTERRUPTS(); for( ;; );}
FREERTOS.configMINIMAL_STACK_SIZE=64
FREERTOS.configPRIO_BITS=4
@ -87,19 +102,21 @@ Mcu.CPN=STM32F429IIT6
Mcu.Family=STM32F4
Mcu.IP0=ADC1
Mcu.IP1=CAN1
Mcu.IP10=TIM1
Mcu.IP11=TIM13
Mcu.IP12=USB_DEVICE
Mcu.IP13=USB_OTG_FS
Mcu.IP10=SYS
Mcu.IP11=TIM1
Mcu.IP12=TIM2
Mcu.IP13=TIM13
Mcu.IP14=USB_DEVICE
Mcu.IP15=USB_OTG_FS
Mcu.IP2=CRC
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.IP3=DMA
Mcu.IP4=DMA2D
Mcu.IP5=FMC
Mcu.IP6=FREERTOS
Mcu.IP7=LTDC
Mcu.IP8=NVIC
Mcu.IP9=RCC
Mcu.IPNb=16
Mcu.Name=STM32F429IITx
Mcu.Package=LQFP176
Mcu.Pin0=PE2
@ -123,10 +140,11 @@ 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_TIM13_VS_ClockSourceINT
Mcu.Pin118=VP_USB_DEVICE_VS_USB_DEVICE_CDC_FS
Mcu.Pin119=VP_STMicroelectronics.X-CUBE-TOUCHGFX_VS_GraphicsJjApplication_4.21.1
Mcu.Pin117=VP_TIM2_VS_ClockSourceINT
Mcu.Pin118=VP_TIM13_VS_ClockSourceINT
Mcu.Pin119=VP_USB_DEVICE_VS_USB_DEVICE_CDC_FS
Mcu.Pin12=PF4
Mcu.Pin120=VP_STMicroelectronics.X-CUBE-TOUCHGFX_VS_GraphicsJjApplication_4.21.1
Mcu.Pin13=PF5
Mcu.Pin14=PF6
Mcu.Pin15=PF7
@ -222,7 +240,7 @@ Mcu.Pin96=PG12
Mcu.Pin97=PG13
Mcu.Pin98=PG14
Mcu.Pin99=PG15
Mcu.PinsNb=120
Mcu.PinsNb=121
Mcu.ThirdParty0=STMicroelectronics.X-CUBE-TOUCHGFX.4.21.1
Mcu.ThirdPartyNb=1
Mcu.UserConstants=
@ -231,6 +249,7 @@ 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
@ -255,8 +274,9 @@ PA0/WKUP.GPIOParameters=GPIO_Label
PA0/WKUP.GPIO_Label=BRV_CPU
PA0/WKUP.Locked=true
PA0/WKUP.Signal=ADCx_IN0
PA1.GPIOParameters=GPIO_Label
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
@ -279,8 +299,9 @@ PA14.GPIO_Label=SWCLK
PA14.Locked=true
PA14.Mode=Serial_Wire
PA14.Signal=SYS_JTCK-SWCLK
PA2.GPIOParameters=GPIO_Label
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
@ -520,13 +541,19 @@ PF5.GPIOParameters=GPIO_Label
PF5.GPIO_Label=SDRAM_A5_PF5
PF5.Locked=true
PF5.Signal=FMC_A5
PF6.GPIOParameters=GPIO_Label
PF6.GPIOParameters=PinState,GPIO_PuPd,GPIO_Label,GPIO_ModeDefaultOutputPP
PF6.GPIO_Label=CAN1_S0
PF6.GPIO_ModeDefaultOutputPP=GPIO_MODE_OUTPUT_PP
PF6.GPIO_PuPd=GPIO_PULLUP
PF6.Locked=true
PF6.PinState=GPIO_PIN_RESET
PF6.Signal=GPIO_Output
PF7.GPIOParameters=GPIO_Label
PF7.GPIOParameters=PinState,GPIO_PuPd,GPIO_Label,GPIO_ModeDefaultOutputPP
PF7.GPIO_Label=CAN2_S0
PF7.GPIO_ModeDefaultOutputPP=GPIO_MODE_OUTPUT_PP
PF7.GPIO_PuPd=GPIO_PULLUP
PF7.Locked=true
PF7.PinState=GPIO_PIN_RESET
PF7.Signal=GPIO_Output
PF8.GPIOParameters=GPIO_Label
PF8.GPIO_Label=LCD_BL_PF8
@ -789,23 +816,23 @@ 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_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_TIM2_Init-TIM2-false-HAL-true,13-MX_TouchGFX_Init-STMicroelectronics.X-CUBE-TOUCHGFX.4.21.1-false-HAL-false,14-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_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
RCC.48MHZClocksFreq_Value=48000000
RCC.AHBFreq_Value=120000000
RCC.AHBFreq_Value=168000000
RCC.APB1CLKDivider=RCC_HCLK_DIV4
RCC.APB1Freq_Value=30000000
RCC.APB1TimFreq_Value=60000000
RCC.APB1Freq_Value=42000000
RCC.APB1TimFreq_Value=84000000
RCC.APB2CLKDivider=RCC_HCLK_DIV2
RCC.APB2Freq_Value=60000000
RCC.APB2TimFreq_Value=120000000
RCC.CortexFreq_Value=120000000
RCC.APB2Freq_Value=84000000
RCC.APB2TimFreq_Value=168000000
RCC.CortexFreq_Value=168000000
RCC.EXTERNAL_CLOCK_VALUE=12288000
RCC.EnbaleCSS=true
RCC.EthernetFreq_Value=120000000
RCC.FCLKCortexFreq_Value=120000000
RCC.FLatency-AdvancedSettings=FLASH_LATENCY_3
RCC.EthernetFreq_Value=168000000
RCC.FCLKCortexFreq_Value=168000000
RCC.FLatency-AdvancedSettings=FLASH_LATENCY_5
RCC.FamilyName=M
RCC.HCLKFreq_Value=120000000
RCC.HCLKFreq_Value=168000000
RCC.HSEUsed=1
RCC.HSE_VALUE=12000000
RCC.HSI_VALUE=16000000
@ -818,11 +845,11 @@ RCC.LSE_VALUE=32768
RCC.LSIUsed=0
RCC.LSI_VALUE=32000
RCC.MCO1PinFreq_Value=16000000
RCC.MCO2PinFreq_Value=120000000
RCC.PLLCLKFreq_Value=120000000
RCC.MCO2PinFreq_Value=168000000
RCC.PLLCLKFreq_Value=168000000
RCC.PLLM=6
RCC.PLLN=120
RCC.PLLQ=5
RCC.PLLN=168
RCC.PLLQ=7
RCC.PLLQCLKFreq_Value=48000000
RCC.PLLSAIN=50
RCC.PLLUsed=1
@ -832,11 +859,11 @@ RCC.SAIClockSource_BlockA=SAI_CLKSOURCE_PLLSAI
RCC.SAIClockSource_BlockB=SAI_CLKSOURCE_PLLSAI
RCC.SAI_AClocksFreq_Value=25000000
RCC.SAI_BClocksFreq_Value=25000000
RCC.SYSCLKFreq_VALUE=120000000
RCC.SYSCLKFreq_VALUE=168000000
RCC.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK
RCC.VCOI2SOutputFreq_Value=384000000
RCC.VCOInputFreq_Value=2000000
RCC.VCOOutputFreq_Value=240000000
RCC.VCOOutputFreq_Value=336000000
RCC.VCOSAIOutputFreq_Value=100000000
RCC.VCOSAIOutputFreq_ValueQ=25000000
RCC.VCOSAIOutputFreq_ValueR=50000000
@ -923,7 +950,7 @@ 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
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
@ -947,6 +974,10 @@ 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
@ -969,6 +1000,8 @@ 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