Compare commits

...

2 Commits

Author SHA1 Message Date
Jasper Blanckenburg 57c94b2423 Add LED animatinos 2023-03-25 00:36:56 +01:00
Jasper Blanckenburg 3b2dac7240 SPIPWM the LEDs 2023-03-24 21:16:45 +01:00
15 changed files with 637 additions and 37 deletions

View File

@ -21,6 +21,7 @@
/* Includes ------------------------------------------------------------------*/
#include "app_azure_rtos.h"
#include "leds.h"
#include "stm32h7xx.h"
/* Private includes ----------------------------------------------------------*/
@ -68,6 +69,7 @@ static TX_BYTE_POOL tx_app_byte_pool;
TX_THREAD app_thread;
TX_THREAD ui_thread;
TX_THREAD vehicle_thread;
TX_THREAD led_thread;
TX_QUEUE gui_button_queue;
TX_EVENT_FLAGS_GROUP gui_update_events;
/* USER CODE END PV */
@ -198,6 +200,17 @@ VOID tx_application_define(VOID *first_unused_memory) {
Error_Handler();
}
void *led_thread_stack = mem;
mem += THREAD_STACK_SIZE;
void *led_child_thread_stack = mem;
mem += THREAD_STACK_SIZE;
if (tx_thread_create(&led_thread, "LED Thread", led_thread_entry,
(ULONG)led_child_thread_stack, led_thread_stack,
THREAD_STACK_SIZE, THREAD_PRIO_LED, THREAD_PRIO_LED, 0,
TX_AUTO_START) != TX_SUCCESS) {
Error_Handler();
}
if (MX_TouchGFX_Init(mem) != TX_SUCCESS) {
Error_Handler();
}

View File

@ -46,6 +46,8 @@ extern "C" {
#define THREAD_PRIO_APP 10
#define THREAD_PRIO_UI 6
#define THREAD_PRIO_VEHICLE 7
#define THREAD_PRIO_LED 11
#define THREAD_PRIO_LED_CHILD 12
#define UI_QUEUE_SIZE 10
#define VEHICLE_UPDATE_QUEUE_SIZE 100
/* USER CODE END EC */

42
Core/Inc/leds.h Normal file
View File

@ -0,0 +1,42 @@
#ifndef INC_LEDS_H
#define INC_LEDS_H
#ifdef __cplusplus
extern "C" {
#endif
#include "stm32h7xx_hal.h"
#include "tx_port.h"
#define N_LEDS 9
#define PWM_CHANNEL_R TIM_CHANNEL_1
#define PWM_CHANNEL_G TIM_CHANNEL_2
#define PWM_CHANNEL_B TIM_CHANNEL_3
void led_init(SPI_HandleTypeDef *spi, TIM_HandleTypeDef *pwmtim);
void led_set(size_t idx, uint8_t r, uint8_t g, uint8_t b);
void led_all_off();
void led_thread_entry(ULONG child_thread_stack_addr);
typedef enum {
ANIM_TE_STARTUP,
ANIM_FT_STARTUP,
ANIM_KNIGHT_RIDER,
} LEDAnimation;
void led_start_animation(LEDAnimation anim);
void led_anim_te_startup(ULONG _);
void led_anim_ft_startup(ULONG _);
void led_anim_knight_rider(ULONG _);
void led_anim_blinker(uint8_t r, uint8_t g, uint8_t b,
uint32_t brightness_steps, uint32_t next_led_steps,
uint32_t delay);
#ifdef __cplusplus
}
#endif
#endif // INC_LEDS_H

View File

@ -54,9 +54,11 @@ void UsageFault_Handler(void);
void DebugMon_Handler(void);
void EXTI3_IRQHandler(void);
void EXTI4_IRQHandler(void);
void DMA1_Stream0_IRQHandler(void);
void FDCAN1_IT0_IRQHandler(void);
void FDCAN1_IT1_IRQHandler(void);
void EXTI9_5_IRQHandler(void);
void SPI3_IRQHandler(void);
void TIM6_DAC_IRQHandler(void);
void LTDC_IRQHandler(void);
void TIM17_IRQHandler(void);

221
Core/Src/leds.c Normal file
View File

@ -0,0 +1,221 @@
#include "leds.h"
#include "app_azure_rtos.h"
#include "main.h"
#include "stm32h7xx_hal_dma.h"
#include "stm32h7xx_hal_gpio.h"
#include "stm32h7xx_hal_spi.h"
#include "stm32h7xx_hal_tim.h"
#include "tx_api.h"
SPI_HandleTypeDef *hspi;
TIM_HandleTypeDef *htim;
extern uint16_t led_buf[256][3];
static size_t led_buf_idx = 0;
static TX_THREAD child_thread;
static void *child_thread_stack;
void led_init(SPI_HandleTypeDef *spi, TIM_HandleTypeDef *pwmtim) {
hspi = spi;
htim = pwmtim;
HAL_GPIO_WritePin(LED_LE_GPIO_Port, LED_LE_Pin, GPIO_PIN_RESET);
memset(led_buf, 0, sizeof(led_buf));
if (HAL_SPI_Transmit_DMA(hspi, (const uint8_t *)&led_buf[led_buf_idx], 3) !=
HAL_OK) {
Error_Handler();
}
__HAL_TIM_SET_COMPARE(htim, PWM_CHANNEL_R, 0x3FFF);
__HAL_TIM_SET_COMPARE(htim, PWM_CHANNEL_G, 0x13FF);
__HAL_TIM_SET_COMPARE(htim, PWM_CHANNEL_B, 0x1FFF);
if (HAL_TIM_PWM_Start(htim, PWM_CHANNEL_R) != HAL_OK) {
Error_Handler();
}
if (HAL_TIM_PWM_Start(htim, PWM_CHANNEL_G) != HAL_OK) {
Error_Handler();
}
if (HAL_TIM_PWM_Start(htim, PWM_CHANNEL_B) != HAL_OK) {
Error_Handler();
}
}
void led_set(size_t idx, uint8_t r, uint8_t g, uint8_t b) {
uint16_t led_set = (1 << idx);
uint16_t led_unset = ~led_set;
uint8_t rgb[] = {b, g, r};
for (size_t time = 0; time < 256; time++) {
// TODO: Shouldn't time only go up to 254?
for (size_t i = 0; i < 3; i++) {
if (time < rgb[i]) {
led_buf[time][i] |= led_set;
} else {
led_buf[time][i] &= led_unset;
}
}
}
}
void led_all_off() { memset(led_buf, 0, sizeof(led_buf)); }
void led_thread_entry(ULONG child_thread_stack_addr) {
child_thread_stack = (void *)child_thread_stack_addr;
led_start_animation(ANIM_KNIGHT_RIDER);
while (1) {
tx_thread_sleep(10);
if (child_thread.tx_thread_state == TX_COMPLETED) {
tx_thread_sleep(20);
led_start_animation(ANIM_FT_STARTUP);
}
}
}
void led_start_animation(LEDAnimation anim) {
if (child_thread.tx_thread_stack_start && // Check if any thread was started
// previously
child_thread.tx_thread_state != TX_COMPLETED &&
child_thread.tx_thread_state != TX_TERMINATED) {
if (tx_thread_terminate(&child_thread) != TX_SUCCESS) {
Error_Handler();
}
}
if (child_thread.tx_thread_stack_start && // Check if any thread was started
// previously
tx_thread_delete(&child_thread) != TX_SUCCESS) {
Error_Handler();
}
void (*animation_entry)(ULONG);
switch (anim) {
case ANIM_TE_STARTUP:
animation_entry = led_anim_te_startup;
break;
case ANIM_FT_STARTUP:
animation_entry = led_anim_ft_startup;
break;
case ANIM_KNIGHT_RIDER:
animation_entry = led_anim_knight_rider;
break;
default:
return;
}
led_all_off();
if (tx_thread_create(&child_thread, "LED Animation Thread", animation_entry,
0, child_thread_stack, THREAD_STACK_SIZE,
THREAD_PRIO_LED_CHILD, THREAD_PRIO_LED_CHILD, 0,
TX_AUTO_START) != TX_SUCCESS) {
Error_Handler();
}
}
void led_anim_te_startup(ULONG _) {
led_anim_blinker(0xF2, 0x8B, 0x00, 20, 7, 2);
}
void led_anim_ft_startup(ULONG _) { led_anim_blinker(0xC5, 0, 0, 20, 7, 2); }
void led_anim_knight_rider(ULONG _) {
const size_t num_leds = 5;
int tail_right = 1;
size_t tail = 0;
while (1) {
size_t x = tail;
int x_right = tail_right;
uint8_t red = 0;
for (size_t i = 0; i < num_leds + 1; i++) {
led_set(x, red, 0, 0);
if (x == 8) {
x_right = 0;
} else if (x == 0) {
x_right = 1;
}
if (x_right) {
x++;
} else {
x--;
}
red += 0xFF / num_leds;
}
if (tail == 8) {
tail_right = 0;
} else if (tail == 0) {
tail_right = 1;
}
if (tail_right) {
tail++;
} else {
tail--;
}
tx_thread_sleep(5);
}
}
void led_anim_blinker(uint8_t r, uint8_t g, uint8_t b,
uint32_t brightness_steps, uint32_t next_led_steps,
uint32_t delay) {
uint8_t colors[brightness_steps][3];
for (int i = brightness_steps - 1; i >= 0; i--) {
colors[i][0] = r * i / (brightness_steps - 1);
colors[i][1] = g * i / (brightness_steps - 1);
colors[i][2] = b * i / (brightness_steps - 1);
}
size_t simultaneous_leds = brightness_steps / next_led_steps;
if (simultaneous_leds * next_led_steps != brightness_steps) {
simultaneous_leds++;
}
int inc = 1;
for (int i = 0; i < 2; i++) {
int32_t furthest = 0;
size_t color_idx = 0;
while (furthest < 5 + simultaneous_leds) {
for (size_t offset = 0; offset < simultaneous_leds; offset++) {
int32_t diff = furthest - offset;
size_t led_color_idx = color_idx + offset * next_led_steps;
if (diff < 0 || diff > 4 || led_color_idx >= brightness_steps) {
continue;
}
if (!inc) {
led_color_idx = brightness_steps - led_color_idx - 1;
}
uint8_t *color = colors[led_color_idx];
led_set(4 + diff, color[0], color[1], color[2]);
led_set(4 - diff, color[0], color[1], color[2]);
}
color_idx++;
if (color_idx == next_led_steps) {
color_idx = 0;
furthest++;
}
tx_thread_sleep(delay);
}
inc = !inc;
}
}
void HAL_SPI_TxCpltCallback(SPI_HandleTypeDef *handle) {
if (handle != hspi) {
return;
}
led_buf_idx = (led_buf_idx + 1) % 256;
HAL_GPIO_WritePin(LED_LE_GPIO_Port, LED_LE_Pin, GPIO_PIN_SET);
for (size_t i = 0; i < 10; i++) {
asm("nop" ::: "memory");
}
HAL_GPIO_WritePin(LED_LE_GPIO_Port, LED_LE_Pin, GPIO_PIN_RESET);
for (size_t i = 0; i < 10; i++) {
asm("nop" ::: "memory");
}
HAL_SPI_Transmit_DMA(hspi, (const uint8_t *)&led_buf[led_buf_idx], 3);
}
void HAL_SPI_ErrorCallback(SPI_HandleTypeDef *handle) {
if (handle != hspi) {
return;
}
volatile uint32_t err = HAL_DMA_GetError(hspi->hdmatx);
err = err;
}

View File

@ -26,6 +26,7 @@
#include "ft_logo_orange_rgb565.h"
#include "ft_logo_rainbow_rgb565.h"
#include "hx8357d.h"
#include "leds.h"
#include "shorttimer.h"
#include <stdint.h>
@ -61,6 +62,7 @@ LTDC_HandleTypeDef hltdc;
OSPI_HandleTypeDef hospi1;
SPI_HandleTypeDef hspi3;
DMA_HandleTypeDef hdma_spi3_tx;
TIM_HandleTypeDef htim1;
TIM_HandleTypeDef htim2;
@ -75,7 +77,7 @@ volatile int ltdc_cb_triggered;
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_DMA2D_Init(void);
static void MX_DMA_Init(void);
static void MX_FDCAN1_Init(void);
static void MX_LTDC_Init(void);
static void MX_JPEG_Init(void);
@ -86,6 +88,7 @@ static void MX_TIM2_Init(void);
static void MX_TIM4_Init(void);
static void MX_CRC_Init(void);
static void MX_TIM17_Init(void);
static void MX_DMA2D_Init(void);
/* USER CODE BEGIN PFP */
/* USER CODE END PFP */
@ -123,7 +126,7 @@ int main(void) {
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_DMA2D_Init();
MX_DMA_Init();
MX_FDCAN1_Init();
MX_LTDC_Init();
MX_JPEG_Init();
@ -134,6 +137,7 @@ int main(void) {
MX_TIM4_Init();
MX_CRC_Init();
MX_TIM17_Init();
MX_DMA2D_Init();
/* Call PreOsInit function */
MX_TouchGFX_PreOSInit();
/* USER CODE BEGIN 2 */
@ -141,6 +145,7 @@ int main(void) {
Error_Handler();
}
shorttimer_init(htim_us);
led_init(&hspi3, &htim1);
HX8357D_Init();
@ -480,7 +485,7 @@ static void MX_SPI3_Init(void) {
hspi3.Instance = SPI3;
hspi3.Init.Mode = SPI_MODE_MASTER;
hspi3.Init.Direction = SPI_DIRECTION_2LINES_TXONLY;
hspi3.Init.DataSize = SPI_DATASIZE_4BIT;
hspi3.Init.DataSize = SPI_DATASIZE_12BIT;
hspi3.Init.CLKPolarity = SPI_POLARITY_LOW;
hspi3.Init.CLKPhase = SPI_PHASE_1EDGE;
hspi3.Init.NSS = SPI_NSS_SOFT;
@ -715,6 +720,20 @@ static void MX_TIM17_Init(void) {
/* USER CODE END TIM17_Init 2 */
}
/**
* Enable DMA controller clock
*/
static void MX_DMA_Init(void) {
/* DMA controller clock enable */
__HAL_RCC_DMA1_CLK_ENABLE();
/* DMA interrupt init */
/* DMA1_Stream0_IRQn interrupt configuration */
HAL_NVIC_SetPriority(DMA1_Stream0_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(DMA1_Stream0_IRQn);
}
/**
* @brief GPIO Initialization Function
* @param None

View File

@ -23,6 +23,7 @@
/* USER CODE BEGIN Includes */
/* USER CODE END Includes */
extern DMA_HandleTypeDef hdma_spi3_tx;
/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN TD */
@ -627,7 +628,15 @@ void HAL_SPI_MspInit(SPI_HandleTypeDef* hspi)
/** Initializes the peripherals clock
*/
PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_SPI3;
PeriphClkInitStruct.Spi123ClockSelection = RCC_SPI123CLKSOURCE_PLL;
PeriphClkInitStruct.PLL2.PLL2M = 2;
PeriphClkInitStruct.PLL2.PLL2N = 11;
PeriphClkInitStruct.PLL2.PLL2P = 66;
PeriphClkInitStruct.PLL2.PLL2Q = 3;
PeriphClkInitStruct.PLL2.PLL2R = 2;
PeriphClkInitStruct.PLL2.PLL2RGE = RCC_PLL2VCIRANGE_3;
PeriphClkInitStruct.PLL2.PLL2VCOSEL = RCC_PLL2VCOWIDE;
PeriphClkInitStruct.PLL2.PLL2FRACN = 0;
PeriphClkInitStruct.Spi123ClockSelection = RCC_SPI123CLKSOURCE_PLL2;
if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
{
Error_Handler();
@ -648,6 +657,28 @@ void HAL_SPI_MspInit(SPI_HandleTypeDef* hspi)
GPIO_InitStruct.Alternate = GPIO_AF6_SPI3;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
/* SPI3 DMA Init */
/* SPI3_TX Init */
hdma_spi3_tx.Instance = DMA1_Stream0;
hdma_spi3_tx.Init.Request = DMA_REQUEST_SPI3_TX;
hdma_spi3_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
hdma_spi3_tx.Init.PeriphInc = DMA_PINC_DISABLE;
hdma_spi3_tx.Init.MemInc = DMA_MINC_ENABLE;
hdma_spi3_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
hdma_spi3_tx.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
hdma_spi3_tx.Init.Mode = DMA_NORMAL;
hdma_spi3_tx.Init.Priority = DMA_PRIORITY_LOW;
hdma_spi3_tx.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
if (HAL_DMA_Init(&hdma_spi3_tx) != HAL_OK)
{
Error_Handler();
}
__HAL_LINKDMA(hspi,hdmatx,hdma_spi3_tx);
/* SPI3 interrupt Init */
HAL_NVIC_SetPriority(SPI3_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(SPI3_IRQn);
/* USER CODE BEGIN SPI3_MspInit 1 */
/* USER CODE END SPI3_MspInit 1 */
@ -677,6 +708,11 @@ void HAL_SPI_MspDeInit(SPI_HandleTypeDef* hspi)
*/
HAL_GPIO_DeInit(GPIOC, LED_CP_Pin|LED_D_Pin);
/* SPI3 DMA DeInit */
HAL_DMA_DeInit(hspi->hdmatx);
/* SPI3 interrupt DeInit */
HAL_NVIC_DisableIRQ(SPI3_IRQn);
/* USER CODE BEGIN SPI3_MspDeInit 1 */
/* USER CODE END SPI3_MspDeInit 1 */

View File

@ -57,6 +57,8 @@
/* External variables --------------------------------------------------------*/
extern FDCAN_HandleTypeDef hfdcan1;
extern LTDC_HandleTypeDef hltdc;
extern DMA_HandleTypeDef hdma_spi3_tx;
extern SPI_HandleTypeDef hspi3;
extern TIM_HandleTypeDef htim17;
extern TIM_HandleTypeDef htim6;
@ -190,6 +192,20 @@ void EXTI4_IRQHandler(void)
/* USER CODE END EXTI4_IRQn 1 */
}
/**
* @brief This function handles DMA1 stream0 global interrupt.
*/
void DMA1_Stream0_IRQHandler(void)
{
/* USER CODE BEGIN DMA1_Stream0_IRQn 0 */
/* USER CODE END DMA1_Stream0_IRQn 0 */
HAL_DMA_IRQHandler(&hdma_spi3_tx);
/* USER CODE BEGIN DMA1_Stream0_IRQn 1 */
/* USER CODE END DMA1_Stream0_IRQn 1 */
}
/**
* @brief This function handles FDCAN1 interrupt 0.
*/
@ -233,6 +249,20 @@ void EXTI9_5_IRQHandler(void)
/* USER CODE END EXTI9_5_IRQn 1 */
}
/**
* @brief This function handles SPI3 global interrupt.
*/
void SPI3_IRQHandler(void)
{
/* USER CODE BEGIN SPI3_IRQn 0 */
/* USER CODE END SPI3_IRQn 0 */
HAL_SPI_IRQHandler(&hspi3);
/* USER CODE BEGIN SPI3_IRQn 1 */
/* USER CODE END SPI3_IRQn 1 */
}
/**
* @brief This function handles TIM6 global interrupt, DAC1_CH1 and DAC1_CH2 underrun error interrupts.
*/

View File

@ -1,5 +1,5 @@
##########################################################################################################################
# File automatically-generated by tool: [projectgenerator] version: [3.19.2] date: [Fri Mar 17 18:17:40 CET 2023]
# File automatically-generated by tool: [projectgenerator] version: [3.19.2] date: [Fri Mar 24 19:11:35 CET 2023]
##########################################################################################################################
# ------------------------------------------------

View File

@ -17,7 +17,7 @@ targetMCU: stm32h7x
cpu: cortex-m7 # type of cpu e.g. cortex-m4
fpu: fpv5-d16 # Defines how floating points are defined. Can be left empty.
floatAbi: -mfloat-abi=hard
ldscript: STM32H7A3ZITx_FLASH.ld # linker script
ldscript: STM32H7A3ZITx_FLASH_nocube.ld # linker script
# Compiler definitions. The -D prefix for the compiler will be automatically added.
cDefinitions:

View File

@ -0,0 +1,208 @@
/*
******************************************************************************
**
** File : LinkerScript.ld
**
** Author : STM32CubeMX
**
** Abstract : Linker script for STM32H7A3ZITx series
** 2048Kbytes FLASH and 1216Kbytes RAM
**
** Set heap size, stack size and stack location according
** to application requirements.
**
** Set memory bank area and size if external memory is used.
**
** Target : STMicroelectronics STM32
**
** Distribution: The file is distributed “as is,” without any warranty
** of any kind.
**
*****************************************************************************
** @attention
**
** <h2><center>&copy; COPYRIGHT(c) 2019 STMicroelectronics</center></h2>
**
** Redistribution and use in source and binary forms, with or without modification,
** are permitted provided that the following conditions are met:
** 1. Redistributions of source code must retain the above copyright notice,
** this list of conditions and the following disclaimer.
** 2. Redistributions in binary form must reproduce the above copyright notice,
** this list of conditions and the following disclaimer in the documentation
** and/or other materials provided with the distribution.
** 3. Neither the name of STMicroelectronics nor the names of its contributors
** may be used to endorse or promote products derived from this software
** without specific prior written permission.
**
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
** FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
** SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
** CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
**
*****************************************************************************
*/
/* Entry Point */
ENTRY(Reset_Handler)
/* Highest address of the user mode stack */
_estack = ORIGIN(DTCMRAM) + LENGTH(DTCMRAM); /* end of RAM */
/* Generate a link error if heap and stack don't fit into RAM */
_Min_Heap_Size = 0x200; /* required amount of heap */
_Min_Stack_Size = 0x400; /* required amount of stack */
/* Specify the memory areas */
MEMORY
{
DTCMRAM (xrw) : ORIGIN = 0x20000000, LENGTH = 128K
RAM (xrw) : ORIGIN = 0x24000000, LENGTH = 1024K
AHBSRAM (xrw) : ORIGIN = 0x30000000, LENGTH = 128K
ITCMRAM (xrw) : ORIGIN = 0x00000000, LENGTH = 64K
FLASH (rx) : ORIGIN = 0x8000000, LENGTH = 2048K
}
/* Define output sections */
SECTIONS
{
/* The startup code goes first into FLASH */
.isr_vector :
{
. = ALIGN(4);
KEEP(*(.isr_vector)) /* Startup code */
. = ALIGN(4);
} >FLASH
/* The program code and other data goes into FLASH */
.text :
{
. = ALIGN(4);
*(.text) /* .text sections (code) */
*(.text*) /* .text* sections (code) */
*(.glue_7) /* glue arm to thumb code */
*(.glue_7t) /* glue thumb to arm code */
*(.eh_frame)
KEEP (*(.init))
KEEP (*(.fini))
. = ALIGN(4);
_etext = .; /* define a global symbols at end of code */
} >FLASH
/* Constant data goes into FLASH */
.rodata :
{
. = ALIGN(4);
*(.rodata) /* .rodata sections (constants, strings, etc.) */
*(.rodata*) /* .rodata* sections (constants, strings, etc.) */
. = ALIGN(4);
} >FLASH
.ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH
.ARM : {
__exidx_start = .;
*(.ARM.exidx*)
__exidx_end = .;
} >FLASH
.preinit_array :
{
PROVIDE_HIDDEN (__preinit_array_start = .);
KEEP (*(.preinit_array*))
PROVIDE_HIDDEN (__preinit_array_end = .);
} >FLASH
.init_array :
{
PROVIDE_HIDDEN (__init_array_start = .);
KEEP (*(SORT(.init_array.*)))
KEEP (*(.init_array*))
PROVIDE_HIDDEN (__init_array_end = .);
} >FLASH
.fini_array :
{
PROVIDE_HIDDEN (__fini_array_start = .);
KEEP (*(SORT(.fini_array.*)))
KEEP (*(.fini_array*))
PROVIDE_HIDDEN (__fini_array_end = .);
} >FLASH
/* used by the startup to initialize data */
_sidata = LOADADDR(.data);
/* Initialized data sections goes into RAM, load LMA copy after code */
.data :
{
. = ALIGN(4);
_sdata = .; /* create a global symbol at data start */
*(.data) /* .data sections */
*(.data*) /* .data* sections */
. = ALIGN(4);
_edata = .; /* define a global symbol at data end */
} >DTCMRAM AT> FLASH
/* Uninitialized data section */
. = ALIGN(4);
.bss :
{
/* This is used by the startup in order to initialize the .bss secion */
_sbss = .; /* define a global symbol at bss start */
__bss_start__ = _sbss;
*(.bss)
*(.bss*)
*(COMMON)
. = ALIGN(4);
_ebss = .; /* define a global symbol at bss end */
__bss_end__ = _ebss;
} >DTCMRAM
._threadx_heap :
{
. = ALIGN(8);
__RAM_segment_used_end__ = .;
. = . + 64K;
. = ALIGN(8);
} >RAM_D1 AT> RAM_D1
/* User_heap_stack section, used to check that there is enough RAM left */
._user_heap_stack :
{
. = ALIGN(8);
PROVIDE ( end = . );
PROVIDE ( _end = . );
. = . + _Min_Heap_Size;
. = . + _Min_Stack_Size;
. = ALIGN(8);
} >DTCMRAM
._led_dma_buf :
{
. = ALIGN(4);
led_buf = .;
. = . + 768;
. = ALIGN(4);
} >AHBSRAM
/* Remove information from the standard libraries */
/DISCARD/ :
{
libc.a ( * )
libm.a ( * )
libgcc.a ( * )
}
.ARM.attributes 0 : { *(.ARM.attributes) }
}

View File

@ -41,6 +41,7 @@ Core/Lib/can-halal/can-halal.c \
Core/Src/app.c \
Core/Src/app_threadx.c \
Core/Src/hx8357d.c \
Core/Src/leds.c \
Core/Src/shorttimer.c \
Core/Src/stm32h7xx_hal_msp.c \
Core/Src/stm32h7xx_hal_timebase_tim.c \
@ -528,7 +529,7 @@ CXXFLAGS += -MMD -MP -MF"$(@:%.o=%.d)"
# LDFLAGS
#######################################
# link script
LDSCRIPT = STM32H7A3ZITx_FLASH.ld
LDSCRIPT = STM32H7A3ZITx_FLASH_nocube.ld
# libraries
LIBS = -lc -lm -lnosys -ltouchgfx-float-abi-hard

View File

@ -122,7 +122,7 @@ DriverViewViewBase::DriverViewViewBase() :
prechargeProgress.setRange(0, 100);
prechargeProgress.setDirection(touchgfx::AbstractDirectionProgress::RIGHT);
prechargeProgress.setBackground(touchgfx::Bitmap(BITMAP_PRECHARGE_BG_ID));
prechargeProgress.setColor(touchgfx::Color::getColorFromRGB(136, 255, 0));
prechargeProgress.setColor(touchgfx::Color::getColorFromRGB(99, 186, 0));
prechargeProgress.setValue(0);
prechargeProgress.setVisible(false);
add(prechargeProgress);

View File

@ -440,8 +440,8 @@
"Height": 55,
"Visible": false,
"Color": {
"Red": 136,
"Green": 255
"Red": 99,
"Green": 186
},
"Direction": "Right",
"FileNameBackground": "precharge_bg.png",

View File

@ -5,6 +5,26 @@ CAD.pinconfig=
CAD.provider=
DMA2D.ColorMode=DMA2D_OUTPUT_RGB888
DMA2D.IPParameters=ColorMode
Dma.Request0=SPI3_TX
Dma.RequestsNb=1
Dma.SPI3_TX.0.Direction=DMA_MEMORY_TO_PERIPH
Dma.SPI3_TX.0.EventEnable=DISABLE
Dma.SPI3_TX.0.FIFOMode=DMA_FIFOMODE_DISABLE
Dma.SPI3_TX.0.Instance=DMA1_Stream0
Dma.SPI3_TX.0.MemDataAlignment=DMA_MDATAALIGN_HALFWORD
Dma.SPI3_TX.0.MemInc=DMA_MINC_ENABLE
Dma.SPI3_TX.0.Mode=DMA_NORMAL
Dma.SPI3_TX.0.PeriphDataAlignment=DMA_PDATAALIGN_HALFWORD
Dma.SPI3_TX.0.PeriphInc=DMA_PINC_DISABLE
Dma.SPI3_TX.0.Polarity=HAL_DMAMUX_REQ_GEN_RISING
Dma.SPI3_TX.0.Priority=DMA_PRIORITY_LOW
Dma.SPI3_TX.0.RequestNumber=1
Dma.SPI3_TX.0.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority,FIFOMode,SignalID,Polarity,RequestNumber,SyncSignalID,SyncPolarity,SyncEnable,EventEnable,SyncRequestNumber
Dma.SPI3_TX.0.SignalID=NONE
Dma.SPI3_TX.0.SyncEnable=DISABLE
Dma.SPI3_TX.0.SyncPolarity=HAL_DMAMUX_SYNC_NO_EVENT
Dma.SPI3_TX.0.SyncRequestNumber=1
Dma.SPI3_TX.0.SyncSignalID=NONE
FDCAN1.CalculateBaudRateNominal=500000
FDCAN1.CalculateTimeBitNominal=2000
FDCAN1.CalculateTimeQuantumNominal=25.0
@ -43,21 +63,22 @@ Mcu.CPN=STM32H7A3ZIT6
Mcu.Family=STM32H7
Mcu.IP0=CORTEX_M7
Mcu.IP1=CRC
Mcu.IP10=SPI3
Mcu.IP11=SYS
Mcu.IP12=TIM1
Mcu.IP13=TIM2
Mcu.IP14=TIM4
Mcu.IP15=TIM17
Mcu.IP10=RCC
Mcu.IP11=SPI3
Mcu.IP12=SYS
Mcu.IP13=TIM1
Mcu.IP14=TIM2
Mcu.IP15=TIM4
Mcu.IP16=TIM17
Mcu.IP2=DEBUG
Mcu.IP3=DMA2D
Mcu.IP4=FDCAN1
Mcu.IP5=JPEG
Mcu.IP6=LTDC
Mcu.IP7=NVIC
Mcu.IP8=OCTOSPI1
Mcu.IP9=RCC
Mcu.IPNb=16
Mcu.IP3=DMA
Mcu.IP4=DMA2D
Mcu.IP5=FDCAN1
Mcu.IP6=JPEG
Mcu.IP7=LTDC
Mcu.IP8=NVIC
Mcu.IP9=OCTOSPI1
Mcu.IPNb=17
Mcu.Name=STM32H7A3Z(G-I)Tx
Mcu.Package=LQFP144
Mcu.Pin0=PE2
@ -145,6 +166,7 @@ MxCube.Version=6.8.0
MxDb.Version=DB.6.0.80
NRST.Locked=true
NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false\:false
NVIC.DMA1_Stream0_IRQn=true\:0\:0\:false\:false\:true\:true\:false\:true\:true
NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false\:false
NVIC.EXTI3_IRQn=true\:0\:0\:false\:false\:true\:false\:true\:true\:true
NVIC.EXTI4_IRQn=true\:0\:0\:false\:false\:true\:false\:true\:true\:true
@ -158,6 +180,7 @@ NVIC.MemoryManagement_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false\:
NVIC.NonMaskableInt_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false\:false
NVIC.PendSV_IRQn=true\:0\:0\:false\:false\:false\:false\:false\:false\:false
NVIC.PriorityGroup=NVIC_PRIORITYGROUP_4
NVIC.SPI3_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:true\:true
NVIC.SVCall_IRQn=true\:0\:0\:false\:false\:false\:false\:false\:false\:false
NVIC.SavedPendsvIrqHandlerGenerated=true
NVIC.SavedSvcallIrqHandlerGenerated=true
@ -423,8 +446,8 @@ ProjectManager.StackSize=0x400
ProjectManager.TargetToolchain=Makefile
ProjectManager.ToolChainLocation=
ProjectManager.UnderRoot=false
ProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-HAL-false,2-MX_GPIO_Init-GPIO-false-HAL-true,3-MX_DMA2D_Init-DMA2D-false-HAL-true,4-MX_FDCAN1_Init-FDCAN1-false-HAL-true,5-MX_LTDC_Init-LTDC-false-HAL-true,6-MX_JPEG_Init-JPEG-false-HAL-true,7-MX_OCTOSPI1_Init-OCTOSPI1-false-HAL-true,8-MX_SPI3_Init-SPI3-false-HAL-true,9-MX_TIM1_Init-TIM1-false-HAL-true,10-MX_TIM2_Init-TIM2-false-HAL-true,11-MX_TIM4_Init-TIM4-false-HAL-true,12-MX_CRC_Init-CRC-false-HAL-true,13-MX_TouchGFX_Init-STMicroelectronics.X-CUBE-TOUCHGFX.4.21.2-false-HAL-false,14-MX_TouchGFX_Process-STMicroelectronics.X-CUBE-TOUCHGFX.4.21.2-false-HAL-false,0-MX_CORTEX_M7_Init-CORTEX_M7-false-HAL-true
RCC.ADCFreq_Value=24000000
ProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-HAL-false,2-MX_GPIO_Init-GPIO-false-HAL-true,4-MX_DMA_Init-DMA-false-HAL-true,5-MX_FDCAN1_Init-FDCAN1-false-HAL-true,6-MX_LTDC_Init-LTDC-false-HAL-true,7-MX_JPEG_Init-JPEG-false-HAL-true,8-MX_OCTOSPI1_Init-OCTOSPI1-false-HAL-true,9-MX_SPI3_Init-SPI3-false-HAL-true,10-MX_TIM1_Init-TIM1-false-HAL-true,11-MX_TIM2_Init-TIM2-false-HAL-true,12-MX_TIM4_Init-TIM4-false-HAL-true,13-MX_CRC_Init-CRC-false-HAL-true,14-MX_TIM17_Init-TIM17-false-HAL-true,15-MX_DMA2D_Init-DMA2D-false-HAL-true,17-MX_TouchGFX_Init-STMicroelectronics.X-CUBE-TOUCHGFX.4.21.2-false-HAL-false,18-MX_TouchGFX_Process-STMicroelectronics.X-CUBE-TOUCHGFX.4.21.2-false-HAL-false,0-MX_CORTEX_M7_Init-CORTEX_M7-false-HAL-true
RCC.ADCFreq_Value=2000000
RCC.AHB12Freq_Value=160000000
RCC.AHB4Freq_Value=160000000
RCC.APB1Freq_Value=80000000
@ -447,21 +470,22 @@ RCC.DFSDM2Freq_Value=80000000
RCC.DFSDMACLkFreq_Value=80000000
RCC.DFSDMFreq_Value=80000000
RCC.DIVM1=3
RCC.DIVM2=4
RCC.DIVM2=2
RCC.DIVM3=2
RCC.DIVN1=40
RCC.DIVN2=8
RCC.DIVN2=11
RCC.DIVN3=15
RCC.DIVP1Freq_Value=160000000
RCC.DIVP2Freq_Value=24000000
RCC.DIVP2=66
RCC.DIVP2Freq_Value=2000000
RCC.DIVP3Freq_Value=90000000
RCC.DIVQ1=4
RCC.DIVQ1Freq_Value=80000000
RCC.DIVQ2=3
RCC.DIVQ2Freq_Value=16000000
RCC.DIVQ2Freq_Value=44000000
RCC.DIVQ3Freq_Value=90000000
RCC.DIVR1Freq_Value=160000000
RCC.DIVR2Freq_Value=24000000
RCC.DIVR2Freq_Value=66000000
RCC.DIVR3=18
RCC.DIVR3Freq_Value=10000000
RCC.FDCANFreq_Value=80000000
@ -472,7 +496,7 @@ RCC.HCLKFreq_Value=160000000
RCC.HSE_VALUE=24000000
RCC.I2C123Freq_Value=80000000
RCC.I2C4Freq_Value=80000000
RCC.IPParameters=ADCFreq_Value,AHB12Freq_Value,AHB4Freq_Value,APB1Freq_Value,APB2Freq_Value,APB3Freq_Value,APB4Freq_Value,AXIClockFreq_Value,CDCPREFreq_Value,CDPPRE,CDPPRE1,CDPPRE2,CECFreq_Value,CKPERFreq_Value,CortexFreq_Value,CpuClockFreq_Value,DAC1Freq_Value,DAC2Freq_Value,DFSDM2ACLkFreq_Value,DFSDM2Freq_Value,DFSDMACLkFreq_Value,DFSDMFreq_Value,DIVM1,DIVM2,DIVM3,DIVN1,DIVN2,DIVN3,DIVP1Freq_Value,DIVP2Freq_Value,DIVP3Freq_Value,DIVQ1,DIVQ1Freq_Value,DIVQ2,DIVQ2Freq_Value,DIVQ3Freq_Value,DIVR1Freq_Value,DIVR2Freq_Value,DIVR3,DIVR3Freq_Value,FDCANFreq_Value,FMCFreq_Value,FamilyName,HCLK3ClockFreq_Value,HCLKFreq_Value,HSE_VALUE,I2C123Freq_Value,I2C4Freq_Value,LPTIM1Freq_Value,LPTIM2Freq_Value,LPTIM345Freq_Value,LPUART1Freq_Value,LTDCFreq_Value,MCO1PinFreq_Value,MCO2PinFreq_Value,PLLSourceVirtual,QSPIFreq_Value,RNGFreq_Value,RTCFreq_Value,SAI1Freq_Value,SAI2AFreq_Value,SAI2BFreq_Value,SDMMCFreq_Value,SPDIFRXFreq_Value,SPI123Freq_Value,SPI45Freq_Value,SPI6Freq_Value,SRDPPRE,SWPMI1Freq_Value,SYSCLKFreq_VALUE,SYSCLKSource,Tim1OutputFreq_Value,Tim2OutputFreq_Value,TraceFreq_Value,USART16Freq_Value,USART234578Freq_Value,USBFreq_Value,VCO1OutputFreq_Value,VCO2OutputFreq_Value,VCO3OutputFreq_Value,VCOInput1Freq_Value,VCOInput2Freq_Value,VCOInput3Freq_Value
RCC.IPParameters=ADCFreq_Value,AHB12Freq_Value,AHB4Freq_Value,APB1Freq_Value,APB2Freq_Value,APB3Freq_Value,APB4Freq_Value,AXIClockFreq_Value,CDCPREFreq_Value,CDPPRE,CDPPRE1,CDPPRE2,CECFreq_Value,CKPERFreq_Value,CortexFreq_Value,CpuClockFreq_Value,DAC1Freq_Value,DAC2Freq_Value,DFSDM2ACLkFreq_Value,DFSDM2Freq_Value,DFSDMACLkFreq_Value,DFSDMFreq_Value,DIVM1,DIVM2,DIVM3,DIVN1,DIVN2,DIVN3,DIVP1Freq_Value,DIVP2,DIVP2Freq_Value,DIVP3Freq_Value,DIVQ1,DIVQ1Freq_Value,DIVQ2,DIVQ2Freq_Value,DIVQ3Freq_Value,DIVR1Freq_Value,DIVR2Freq_Value,DIVR3,DIVR3Freq_Value,FDCANFreq_Value,FMCFreq_Value,FamilyName,HCLK3ClockFreq_Value,HCLKFreq_Value,HSE_VALUE,I2C123Freq_Value,I2C4Freq_Value,LPTIM1Freq_Value,LPTIM2Freq_Value,LPTIM345Freq_Value,LPUART1Freq_Value,LTDCFreq_Value,MCO1PinFreq_Value,MCO2PinFreq_Value,PLLSourceVirtual,QSPIFreq_Value,RNGFreq_Value,RTCFreq_Value,SAI1Freq_Value,SAI2AFreq_Value,SAI2BFreq_Value,SDMMCFreq_Value,SPDIFRXFreq_Value,SPI123CLockSelection,SPI123Freq_Value,SPI45Freq_Value,SPI6Freq_Value,SRDPPRE,SWPMI1Freq_Value,SYSCLKFreq_VALUE,SYSCLKSource,Tim1OutputFreq_Value,Tim2OutputFreq_Value,TraceFreq_Value,USART16Freq_Value,USART234578Freq_Value,USBFreq_Value,VCO1OutputFreq_Value,VCO2OutputFreq_Value,VCO3OutputFreq_Value,VCOInput1Freq_Value,VCOInput2Freq_Value,VCOInput3Freq_Value
RCC.LPTIM1Freq_Value=80000000
RCC.LPTIM2Freq_Value=80000000
RCC.LPTIM345Freq_Value=80000000
@ -489,7 +513,8 @@ RCC.SAI2AFreq_Value=80000000
RCC.SAI2BFreq_Value=80000000
RCC.SDMMCFreq_Value=80000000
RCC.SPDIFRXFreq_Value=80000000
RCC.SPI123Freq_Value=80000000
RCC.SPI123CLockSelection=RCC_SPI123CLKSOURCE_PLL2
RCC.SPI123Freq_Value=2000000
RCC.SPI45Freq_Value=80000000
RCC.SPI6Freq_Value=80000000
RCC.SRDPPRE=RCC_APB4_DIV2
@ -503,10 +528,10 @@ RCC.USART16Freq_Value=80000000
RCC.USART234578Freq_Value=80000000
RCC.USBFreq_Value=80000000
RCC.VCO1OutputFreq_Value=320000000
RCC.VCO2OutputFreq_Value=48000000
RCC.VCO2OutputFreq_Value=132000000
RCC.VCO3OutputFreq_Value=180000000
RCC.VCOInput1Freq_Value=8000000
RCC.VCOInput2Freq_Value=6000000
RCC.VCOInput2Freq_Value=12000000
RCC.VCOInput3Freq_Value=12000000
SH.GPXTI3.0=GPIO_EXTI3
SH.GPXTI3.ConfNb=1
@ -529,9 +554,10 @@ SH.S_TIM4_CH1.ConfNb=1
SH.S_TIM4_CH2.0=TIM4_CH2,PWM Generation2 CH2
SH.S_TIM4_CH2.ConfNb=1
SPI3.BaudRatePrescaler=SPI_BAUDRATEPRESCALER_2
SPI3.CalculateBaudRate=40.0 MBits/s
SPI3.CalculateBaudRate=1000.0 KBits/s
SPI3.DataSize=SPI_DATASIZE_12BIT
SPI3.Direction=SPI_DIRECTION_2LINES_TXONLY
SPI3.IPParameters=VirtualType,Mode,Direction,CalculateBaudRate,BaudRatePrescaler
SPI3.IPParameters=VirtualType,Mode,Direction,CalculateBaudRate,BaudRatePrescaler,DataSize
SPI3.Mode=SPI_MODE_MASTER
SPI3.VirtualType=VM_MASTER
STMicroelectronics.X-CUBE-AZRTOS-H7.3.0.0.AZRTOS_APP_MEM_ALLOCATION_METHOD=0