Added LampArray control.

Signed-off-by: Yilin Sun <imi415@imi.moe>
This commit is contained in:
Yilin Sun 2023-10-29 14:30:45 +08:00
parent fb3fe339dc
commit bc76fc1c3f
Signed by: imi415
GPG Key ID: 17F01E106F9F5E0A
32 changed files with 2115 additions and 71 deletions

9
.gitmodules vendored
View File

@ -1,3 +1,12 @@
[submodule "SDK"]
path = SDK
url = https://github.com/STMicroelectronics/STM32CubeL4.git
[submodule "lib/tinyusb"]
path = lib/tinyusb
url = https://github.com/hathach/tinyusb.git
[submodule "lib/freertos"]
path = lib/freertos
url = https://github.com/FreeRTOS/FreeRTOS-Kernel.git
[submodule "lib/lcd"]
path = lib/lcd
url = https://git.minori.work/Embedded_Drivers/epd-spi.git

View File

@ -9,31 +9,54 @@ enable_language(ASM)
set(TARGET_LDSCRIPT_FLASH "${CMAKE_SOURCE_DIR}/MX_Generated/STM32L496VGTx_FLASH.ld")
set(TARGET_SOURCES
"lib/tinyusb/src/class/cdc/cdc_device.c"
"lib/tinyusb/src/class/hid/hid_device.c"
"lib/tinyusb/src/device/usbd.c"
"lib/tinyusb/src/device/usbd_control.c"
"lib/tinyusb/src/tusb.c"
"lib/tinyusb/src/common/tusb_fifo.c"
"lib/tinyusb/src/portable/synopsys/dwc2/dcd_dwc2.c"
"MX_Generated/Core/Src/dma.c"
"MX_Generated/Core/Src/gpio.c"
"MX_Generated/Core/Src/main.c"
"MX_Generated/Core/Src/spi.c"
"MX_Generated/Core/Src/stm32l4xx_hal_msp.c"
"MX_Generated/Core/Src/stm32l4xx_hal_timebase_tim.c"
"MX_Generated/Core/Src/stm32l4xx_it.c"
"MX_Generated/Core/Src/system_stm32l4xx.c"
"MX_Generated/Core/Src/usart.c"
"MX_Generated/startup_stm32l496xx.s"
"SDK/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal.c"
"SDK/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_cortex.c"
"SDK/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_dma.c"
"SDK/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_dma_ex.c"
"SDK/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_gpio.c"
"SDK/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pcd.c"
"SDK/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pcd_ex.c"
"SDK/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pwr.c"
"SDK/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pwr_ex.c"
"SDK/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rcc.c"
"SDK/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rcc_ex.c"
"SDK/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_spi.c"
"SDK/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_spi_ex.c"
"SDK/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_tim.c"
"SDK/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_tim_ex.c"
"SDK/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_uart.c"
"SDK/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_uart_ex.c"
"src/app_lcd_impl.c"
"src/app_lighting.c"
"src/app_syscalls.c"
"src/app_tusb.c"
"src/main.c"
)
set(TARGET_C_DEFINES
"CFG_TUSB_MCU=OPT_MCU_STM32L4"
"STM32L496xx"
"USE_HAL_DRIVER"
"USE_FULL_LL_DRIVER"
)
set(TARGET_C_INCLUDES
"lib/tinyusb/src"
"MX_Generated/Core/Inc"
"SDK/Drivers/CMSIS/Core/Include"
"SDK/Drivers/CMSIS/Device/ST/STM32L4xx/Include"
@ -46,6 +69,8 @@ set(TARGET_LIBS
"c"
"m"
"nosys"
"freertos_kernel"
"epd-spi"
)
# Shared library and linker script search paths
@ -71,6 +96,18 @@ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -fno-common -fno-builtin -f
set(CMAKE_ASM_FLAGS "${CMAKE_C_FLAGS} -x assembler-with-cpp")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--gc-sections")
# FreeRTOS
set(FREERTOS_PORT "GCC_ARM_CM4F" CACHE STRING "")
set(FREERTOS_HEAP "4" CACHE STRING "")
add_library(freertos_config INTERFACE)
target_include_directories(freertos_config SYSTEM INTERFACE include)
add_subdirectory(lib/freertos)
add_subdirectory(lib/lcd)
# Shared sources, includes and definitions
add_compile_definitions(${TARGET_C_DEFINES})
include_directories(${TARGET_C_INCLUDES})

View File

@ -0,0 +1,53 @@
/* USER CODE BEGIN Header */
/**
******************************************************************************
* @file dma.h
* @brief This file contains all the function prototypes for
* the dma.c file
******************************************************************************
* @attention
*
* Copyright (c) 2023 STMicroelectronics.
* All rights reserved.
*
* This software is licensed under terms that can be found in the LICENSE file
* in the root directory of this software component.
* If no LICENSE file comes with this software, it is provided AS-IS.
*
******************************************************************************
*/
/* USER CODE END Header */
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __DMA_H__
#define __DMA_H__
#ifdef __cplusplus
extern "C" {
#endif
/* Includes ------------------------------------------------------------------*/
#include "main.h"
/* DMA memory to memory transfer handles -------------------------------------*/
extern DMA_HandleTypeDef hdma_memtomem_dma1_channel4;
/* USER CODE BEGIN Includes */
/* USER CODE END Includes */
/* USER CODE BEGIN Private defines */
/* USER CODE END Private defines */
void MX_DMA_Init(void);
/* USER CODE BEGIN Prototypes */
/* USER CODE END Prototypes */
#ifdef __cplusplus
}
#endif
#endif /* __DMA_H__ */

View File

@ -57,6 +57,24 @@ void Error_Handler(void);
/* USER CODE END EFP */
/* Private defines -----------------------------------------------------------*/
#define LCD_CS_Pin GPIO_PIN_4
#define LCD_CS_GPIO_Port GPIOA
#define LCD_SCK_Pin GPIO_PIN_5
#define LCD_SCK_GPIO_Port GPIOA
#define LCD_DC_Pin GPIO_PIN_6
#define LCD_DC_GPIO_Port GPIOA
#define LCD_DI_Pin GPIO_PIN_7
#define LCD_DI_GPIO_Port GPIOA
#define LCD_RST_Pin GPIO_PIN_2
#define LCD_RST_GPIO_Port GPIOB
#define LCD_BLK_Pin GPIO_PIN_7
#define LCD_BLK_GPIO_Port GPIOE
#define STLK_RX_Pin GPIO_PIN_10
#define STLK_RX_GPIO_Port GPIOB
#define STLK_TX_Pin GPIO_PIN_11
#define STLK_TX_GPIO_Port GPIOB
#define USB_SW_Pin GPIO_PIN_5
#define USB_SW_GPIO_Port GPIOB
#define LED1_Pin GPIO_PIN_6
#define LED1_GPIO_Port GPIOB

View File

@ -0,0 +1,52 @@
/* USER CODE BEGIN Header */
/**
******************************************************************************
* @file spi.h
* @brief This file contains all the function prototypes for
* the spi.c file
******************************************************************************
* @attention
*
* Copyright (c) 2023 STMicroelectronics.
* All rights reserved.
*
* This software is licensed under terms that can be found in the LICENSE file
* in the root directory of this software component.
* If no LICENSE file comes with this software, it is provided AS-IS.
*
******************************************************************************
*/
/* USER CODE END Header */
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __SPI_H__
#define __SPI_H__
#ifdef __cplusplus
extern "C" {
#endif
/* Includes ------------------------------------------------------------------*/
#include "main.h"
/* USER CODE BEGIN Includes */
/* USER CODE END Includes */
extern SPI_HandleTypeDef hspi1;
/* USER CODE BEGIN Private defines */
/* USER CODE END Private defines */
void MX_SPI1_Init(void);
/* USER CODE BEGIN Prototypes */
/* USER CODE END Prototypes */
#ifdef __cplusplus
}
#endif
#endif /* __SPI_H__ */

View File

@ -74,12 +74,12 @@
/*#define HAL_SD_MODULE_ENABLED */
/*#define HAL_SMBUS_MODULE_ENABLED */
/*#define HAL_SMARTCARD_MODULE_ENABLED */
/*#define HAL_SPI_MODULE_ENABLED */
#define HAL_SPI_MODULE_ENABLED
/*#define HAL_SRAM_MODULE_ENABLED */
/*#define HAL_SWPMI_MODULE_ENABLED */
/*#define HAL_TIM_MODULE_ENABLED */
#define HAL_TIM_MODULE_ENABLED
/*#define HAL_TSC_MODULE_ENABLED */
/*#define HAL_UART_MODULE_ENABLED */
#define HAL_UART_MODULE_ENABLED
/*#define HAL_USART_MODULE_ENABLED */
/*#define HAL_WWDG_MODULE_ENABLED */
/*#define HAL_EXTI_MODULE_ENABLED */
@ -232,7 +232,7 @@
#define USE_HAL_SD_REGISTER_CALLBACKS 0U
#define USE_HAL_SMARTCARD_REGISTER_CALLBACKS 0U
#define USE_HAL_SMBUS_REGISTER_CALLBACKS 0U
#define USE_HAL_SPI_REGISTER_CALLBACKS 0U
#define USE_HAL_SPI_REGISTER_CALLBACKS 1U
#define USE_HAL_SWPMI_REGISTER_CALLBACKS 0U
#define USE_HAL_TIM_REGISTER_CALLBACKS 0U
#define USE_HAL_TSC_REGISTER_CALLBACKS 0U

View File

@ -51,10 +51,10 @@ void HardFault_Handler(void);
void MemManage_Handler(void);
void BusFault_Handler(void);
void UsageFault_Handler(void);
void SVC_Handler(void);
void DebugMon_Handler(void);
void PendSV_Handler(void);
void SysTick_Handler(void);
void DMA1_Channel3_IRQHandler(void);
void DMA1_Channel4_IRQHandler(void);
void TIM7_IRQHandler(void);
/* USER CODE BEGIN EFP */
/* USER CODE END EFP */

View File

@ -0,0 +1,52 @@
/* USER CODE BEGIN Header */
/**
******************************************************************************
* @file usart.h
* @brief This file contains all the function prototypes for
* the usart.c file
******************************************************************************
* @attention
*
* Copyright (c) 2023 STMicroelectronics.
* All rights reserved.
*
* This software is licensed under terms that can be found in the LICENSE file
* in the root directory of this software component.
* If no LICENSE file comes with this software, it is provided AS-IS.
*
******************************************************************************
*/
/* USER CODE END Header */
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __USART_H__
#define __USART_H__
#ifdef __cplusplus
extern "C" {
#endif
/* Includes ------------------------------------------------------------------*/
#include "main.h"
/* USER CODE BEGIN Includes */
/* USER CODE END Includes */
extern UART_HandleTypeDef hlpuart1;
/* USER CODE BEGIN Private defines */
/* USER CODE END Private defines */
void MX_LPUART1_UART_Init(void);
/* USER CODE BEGIN Prototypes */
/* USER CODE END Prototypes */
#ifdef __cplusplus
}
#endif
#endif /* __USART_H__ */

View File

@ -0,0 +1,76 @@
/* USER CODE BEGIN Header */
/**
******************************************************************************
* @file dma.c
* @brief This file provides code for the configuration
* of all the requested memory to memory DMA transfers.
******************************************************************************
* @attention
*
* Copyright (c) 2023 STMicroelectronics.
* All rights reserved.
*
* This software is licensed under terms that can be found in the LICENSE file
* in the root directory of this software component.
* If no LICENSE file comes with this software, it is provided AS-IS.
*
******************************************************************************
*/
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "dma.h"
/* USER CODE BEGIN 0 */
/* USER CODE END 0 */
/*----------------------------------------------------------------------------*/
/* Configure DMA */
/*----------------------------------------------------------------------------*/
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
DMA_HandleTypeDef hdma_memtomem_dma1_channel4;
/**
* Enable DMA controller clock
* Configure DMA for memory to memory transfers
* hdma_memtomem_dma1_channel4
*/
void MX_DMA_Init(void)
{
/* DMA controller clock enable */
__HAL_RCC_DMA1_CLK_ENABLE();
/* Configure DMA request hdma_memtomem_dma1_channel4 on DMA1_Channel4 */
hdma_memtomem_dma1_channel4.Instance = DMA1_Channel4;
hdma_memtomem_dma1_channel4.Init.Request = DMA_REQUEST_0;
hdma_memtomem_dma1_channel4.Init.Direction = DMA_MEMORY_TO_MEMORY;
hdma_memtomem_dma1_channel4.Init.PeriphInc = DMA_PINC_DISABLE;
hdma_memtomem_dma1_channel4.Init.MemInc = DMA_MINC_ENABLE;
hdma_memtomem_dma1_channel4.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
hdma_memtomem_dma1_channel4.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
hdma_memtomem_dma1_channel4.Init.Mode = DMA_NORMAL;
hdma_memtomem_dma1_channel4.Init.Priority = DMA_PRIORITY_LOW;
if (HAL_DMA_Init(&hdma_memtomem_dma1_channel4) != HAL_OK)
{
Error_Handler();
}
/* DMA interrupt init */
/* DMA1_Channel3_IRQn interrupt configuration */
HAL_NVIC_SetPriority(DMA1_Channel3_IRQn, 6, 0);
HAL_NVIC_EnableIRQ(DMA1_Channel3_IRQn);
/* DMA1_Channel4_IRQn interrupt configuration */
HAL_NVIC_SetPriority(DMA1_Channel4_IRQn, 6, 0);
HAL_NVIC_EnableIRQ(DMA1_Channel4_IRQn);
}
/* USER CODE BEGIN 2 */
/* USER CODE END 2 */

View File

@ -40,10 +40,42 @@ void MX_GPIO_Init(void)
GPIO_InitTypeDef GPIO_InitStruct = {0};
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
__HAL_RCC_GPIOE_CLK_ENABLE();
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(LCD_DC_GPIO_Port, LCD_DC_Pin, GPIO_PIN_RESET);
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(LCD_RST_GPIO_Port, LCD_RST_Pin, GPIO_PIN_RESET);
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(LCD_BLK_GPIO_Port, LCD_BLK_Pin, GPIO_PIN_RESET);
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOB, USB_SW_Pin|LED1_Pin, GPIO_PIN_SET);
/*Configure GPIO pin : PtPin */
GPIO_InitStruct.Pin = LCD_DC_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(LCD_DC_GPIO_Port, &GPIO_InitStruct);
/*Configure GPIO pins : PBPin PBPin */
GPIO_InitStruct.Pin = LCD_RST_Pin|USB_SW_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
/*Configure GPIO pin : PtPin */
GPIO_InitStruct.Pin = LCD_BLK_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(LCD_BLK_GPIO_Port, &GPIO_InitStruct);
/*Configure GPIO pin : PtPin */
GPIO_InitStruct.Pin = LED1_Pin;

View File

@ -18,6 +18,9 @@
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "dma.h"
#include "usart.h"
#include "spi.h"
#include "gpio.h"
/* Private includes ----------------------------------------------------------*/
@ -116,6 +119,27 @@ void SystemClock_Config(void)
/* USER CODE END 4 */
/**
* @brief Period elapsed callback in non blocking mode
* @note This function is called when TIM7 interrupt took place, inside
* HAL_TIM_IRQHandler(). It makes a direct call to HAL_IncTick() to increment
* a global variable "uwTick" used as application time base.
* @param htim : TIM handle
* @retval None
*/
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
/* USER CODE BEGIN Callback 0 */
/* USER CODE END Callback 0 */
if (htim->Instance == TIM7) {
HAL_IncTick();
}
/* USER CODE BEGIN Callback 1 */
/* USER CODE END Callback 1 */
}
/**
* @brief This function is executed in case of error occurrence.
* @retval None

142
MX_Generated/Core/Src/spi.c Normal file
View File

@ -0,0 +1,142 @@
/* USER CODE BEGIN Header */
/**
******************************************************************************
* @file spi.c
* @brief This file provides code for the configuration
* of the SPI instances.
******************************************************************************
* @attention
*
* Copyright (c) 2023 STMicroelectronics.
* All rights reserved.
*
* This software is licensed under terms that can be found in the LICENSE file
* in the root directory of this software component.
* If no LICENSE file comes with this software, it is provided AS-IS.
*
******************************************************************************
*/
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "spi.h"
/* USER CODE BEGIN 0 */
/* USER CODE END 0 */
SPI_HandleTypeDef hspi1;
DMA_HandleTypeDef hdma_spi1_tx;
/* SPI1 init function */
void MX_SPI1_Init(void)
{
/* USER CODE BEGIN SPI1_Init 0 */
/* USER CODE END SPI1_Init 0 */
/* USER CODE BEGIN SPI1_Init 1 */
/* USER CODE END SPI1_Init 1 */
hspi1.Instance = SPI1;
hspi1.Init.Mode = SPI_MODE_MASTER;
hspi1.Init.Direction = SPI_DIRECTION_2LINES;
hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
hspi1.Init.NSS = SPI_NSS_HARD_OUTPUT;
hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_4;
hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
hspi1.Init.CRCPolynomial = 7;
hspi1.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE;
hspi1.Init.NSSPMode = SPI_NSS_PULSE_ENABLE;
if (HAL_SPI_Init(&hspi1) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN SPI1_Init 2 */
/* USER CODE END SPI1_Init 2 */
}
void HAL_SPI_MspInit(SPI_HandleTypeDef* spiHandle)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
if(spiHandle->Instance==SPI1)
{
/* USER CODE BEGIN SPI1_MspInit 0 */
/* USER CODE END SPI1_MspInit 0 */
/* SPI1 clock enable */
__HAL_RCC_SPI1_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
/**SPI1 GPIO Configuration
PA4 ------> SPI1_NSS
PA5 ------> SPI1_SCK
PA7 ------> SPI1_MOSI
*/
GPIO_InitStruct.Pin = LCD_CS_Pin|LCD_SCK_Pin|LCD_DI_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_AF5_SPI1;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* SPI1 DMA Init */
/* SPI1_TX Init */
hdma_spi1_tx.Instance = DMA1_Channel3;
hdma_spi1_tx.Init.Request = DMA_REQUEST_1;
hdma_spi1_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
hdma_spi1_tx.Init.PeriphInc = DMA_PINC_DISABLE;
hdma_spi1_tx.Init.MemInc = DMA_MINC_ENABLE;
hdma_spi1_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
hdma_spi1_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
hdma_spi1_tx.Init.Mode = DMA_NORMAL;
hdma_spi1_tx.Init.Priority = DMA_PRIORITY_LOW;
if (HAL_DMA_Init(&hdma_spi1_tx) != HAL_OK)
{
Error_Handler();
}
__HAL_LINKDMA(spiHandle,hdmatx,hdma_spi1_tx);
/* USER CODE BEGIN SPI1_MspInit 1 */
/* USER CODE END SPI1_MspInit 1 */
}
}
void HAL_SPI_MspDeInit(SPI_HandleTypeDef* spiHandle)
{
if(spiHandle->Instance==SPI1)
{
/* USER CODE BEGIN SPI1_MspDeInit 0 */
/* USER CODE END SPI1_MspDeInit 0 */
/* Peripheral clock disable */
__HAL_RCC_SPI1_CLK_DISABLE();
/**SPI1 GPIO Configuration
PA4 ------> SPI1_NSS
PA5 ------> SPI1_SCK
PA7 ------> SPI1_MOSI
*/
HAL_GPIO_DeInit(GPIOA, LCD_CS_Pin|LCD_SCK_Pin|LCD_DI_Pin);
/* SPI1 DMA DeInit */
HAL_DMA_DeInit(spiHandle->hdmatx);
/* USER CODE BEGIN SPI1_MspDeInit 1 */
/* USER CODE END SPI1_MspDeInit 1 */
}
}
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */

View File

@ -0,0 +1,137 @@
/* USER CODE BEGIN Header */
/**
******************************************************************************
* @file stm32l4xx_hal_timebase_tim.c
* @brief HAL time base based on the hardware TIM.
******************************************************************************
* @attention
*
* Copyright (c) 2023 STMicroelectronics.
* All rights reserved.
*
* This software is licensed under terms that can be found in the LICENSE file
* in the root directory of this software component.
* If no LICENSE file comes with this software, it is provided AS-IS.
*
******************************************************************************
*/
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "stm32l4xx_hal.h"
#include "stm32l4xx_hal_tim.h"
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
TIM_HandleTypeDef htim7;
/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/
/**
* @brief This function configures the TIM7 as a time base source.
* The time source is configured to have 1ms time base with a dedicated
* Tick interrupt priority.
* @note This function is called automatically at the beginning of program after
* reset by HAL_Init() or at any time when clock is configured, by HAL_RCC_ClockConfig().
* @param TickPriority: Tick interrupt priority.
* @retval HAL status
*/
HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority)
{
RCC_ClkInitTypeDef clkconfig;
uint32_t uwTimclock, uwAPB1Prescaler;
uint32_t uwPrescalerValue;
uint32_t pFLatency;
HAL_StatusTypeDef status = HAL_OK;
/* Enable TIM7 clock */
__HAL_RCC_TIM7_CLK_ENABLE();
/* Get clock configuration */
HAL_RCC_GetClockConfig(&clkconfig, &pFLatency);
/* Get APB1 prescaler */
uwAPB1Prescaler = clkconfig.APB1CLKDivider;
/* Compute TIM7 clock */
if (uwAPB1Prescaler == RCC_HCLK_DIV1)
{
uwTimclock = HAL_RCC_GetPCLK1Freq();
}
else
{
uwTimclock = 2UL * HAL_RCC_GetPCLK1Freq();
}
/* Compute the prescaler value to have TIM7 counter clock equal to 1MHz */
uwPrescalerValue = (uint32_t) ((uwTimclock / 1000000U) - 1U);
/* Initialize TIM7 */
htim7.Instance = TIM7;
/* Initialize TIMx peripheral as follow:
+ Period = [(TIM7CLK/1000) - 1]. to have a (1/1000) s time base.
+ Prescaler = (uwTimclock/1000000 - 1) to have a 1MHz counter clock.
+ ClockDivision = 0
+ Counter direction = Up
*/
htim7.Init.Period = (1000000U / 1000U) - 1U;
htim7.Init.Prescaler = uwPrescalerValue;
htim7.Init.ClockDivision = 0;
htim7.Init.CounterMode = TIM_COUNTERMODE_UP;
htim7.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
status = HAL_TIM_Base_Init(&htim7);
if (status == HAL_OK)
{
/* Start the TIM time Base generation in interrupt mode */
status = HAL_TIM_Base_Start_IT(&htim7);
if (status == HAL_OK)
{
/* Enable the TIM7 global Interrupt */
HAL_NVIC_EnableIRQ(TIM7_IRQn);
/* Configure the SysTick IRQ priority */
if (TickPriority < (1UL << __NVIC_PRIO_BITS))
{
/* Configure the TIM IRQ priority */
HAL_NVIC_SetPriority(TIM7_IRQn, TickPriority, 0U);
uwTickPrio = TickPriority;
}
else
{
status = HAL_ERROR;
}
}
}
/* Return function status */
return status;
}
/**
* @brief Suspend Tick increment.
* @note Disable the tick increment by disabling TIM7 update interrupt.
* @param None
* @retval None
*/
void HAL_SuspendTick(void)
{
/* Disable TIM7 update Interrupt */
__HAL_TIM_DISABLE_IT(&htim7, TIM_IT_UPDATE);
}
/**
* @brief Resume Tick increment.
* @note Enable the tick increment by Enabling TIM7 update interrupt.
* @param None
* @retval None
*/
void HAL_ResumeTick(void)
{
/* Enable TIM7 Update interrupt */
__HAL_TIM_ENABLE_IT(&htim7, TIM_IT_UPDATE);
}

View File

@ -47,6 +47,8 @@
/* Private function prototypes -----------------------------------------------*/
/* USER CODE BEGIN PFP */
void app_tusb_irq_handler(void);
/* USER CODE END PFP */
/* Private user code ---------------------------------------------------------*/
@ -55,6 +57,9 @@
/* USER CODE END 0 */
/* External variables --------------------------------------------------------*/
extern DMA_HandleTypeDef hdma_memtomem_dma1_channel4;
extern DMA_HandleTypeDef hdma_spi1_tx;
extern TIM_HandleTypeDef htim7;
/* USER CODE BEGIN EV */
@ -138,19 +143,6 @@ void UsageFault_Handler(void)
}
}
/**
* @brief This function handles System service call via SWI instruction.
*/
void SVC_Handler(void)
{
/* USER CODE BEGIN SVCall_IRQn 0 */
/* USER CODE END SVCall_IRQn 0 */
/* USER CODE BEGIN SVCall_IRQn 1 */
/* USER CODE END SVCall_IRQn 1 */
}
/**
* @brief This function handles Debug monitor.
*/
@ -164,33 +156,6 @@ void DebugMon_Handler(void)
/* USER CODE END DebugMonitor_IRQn 1 */
}
/**
* @brief This function handles Pendable request for system service.
*/
void PendSV_Handler(void)
{
/* USER CODE BEGIN PendSV_IRQn 0 */
/* USER CODE END PendSV_IRQn 0 */
/* USER CODE BEGIN PendSV_IRQn 1 */
/* USER CODE END PendSV_IRQn 1 */
}
/**
* @brief This function handles System tick timer.
*/
void SysTick_Handler(void)
{
/* USER CODE BEGIN SysTick_IRQn 0 */
/* USER CODE END SysTick_IRQn 0 */
HAL_IncTick();
/* USER CODE BEGIN SysTick_IRQn 1 */
/* USER CODE END SysTick_IRQn 1 */
}
/******************************************************************************/
/* STM32L4xx Peripheral Interrupt Handlers */
/* Add here the Interrupt Handlers for the used peripherals. */
@ -198,6 +163,52 @@ void SysTick_Handler(void)
/* please refer to the startup file (startup_stm32l4xx.s). */
/******************************************************************************/
/**
* @brief This function handles DMA1 channel3 global interrupt.
*/
void DMA1_Channel3_IRQHandler(void)
{
/* USER CODE BEGIN DMA1_Channel3_IRQn 0 */
/* USER CODE END DMA1_Channel3_IRQn 0 */
HAL_DMA_IRQHandler(&hdma_spi1_tx);
/* USER CODE BEGIN DMA1_Channel3_IRQn 1 */
/* USER CODE END DMA1_Channel3_IRQn 1 */
}
/**
* @brief This function handles DMA1 channel4 global interrupt.
*/
void DMA1_Channel4_IRQHandler(void)
{
/* USER CODE BEGIN DMA1_Channel4_IRQn 0 */
/* USER CODE END DMA1_Channel4_IRQn 0 */
HAL_DMA_IRQHandler(&hdma_memtomem_dma1_channel4);
/* USER CODE BEGIN DMA1_Channel4_IRQn 1 */
/* USER CODE END DMA1_Channel4_IRQn 1 */
}
/**
* @brief This function handles TIM7 global interrupt.
*/
void TIM7_IRQHandler(void)
{
/* USER CODE BEGIN TIM7_IRQn 0 */
/* USER CODE END TIM7_IRQn 0 */
HAL_TIM_IRQHandler(&htim7);
/* USER CODE BEGIN TIM7_IRQn 1 */
/* USER CODE END TIM7_IRQn 1 */
}
/* USER CODE BEGIN 1 */
void OTG_FS_IRQHandler(void) {
app_tusb_irq_handler();
}
/* USER CODE END 1 */

View File

@ -0,0 +1,126 @@
/* USER CODE BEGIN Header */
/**
******************************************************************************
* @file usart.c
* @brief This file provides code for the configuration
* of the USART instances.
******************************************************************************
* @attention
*
* Copyright (c) 2023 STMicroelectronics.
* All rights reserved.
*
* This software is licensed under terms that can be found in the LICENSE file
* in the root directory of this software component.
* If no LICENSE file comes with this software, it is provided AS-IS.
*
******************************************************************************
*/
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "usart.h"
/* USER CODE BEGIN 0 */
/* USER CODE END 0 */
UART_HandleTypeDef hlpuart1;
/* LPUART1 init function */
void MX_LPUART1_UART_Init(void)
{
/* USER CODE BEGIN LPUART1_Init 0 */
/* USER CODE END LPUART1_Init 0 */
/* USER CODE BEGIN LPUART1_Init 1 */
/* USER CODE END LPUART1_Init 1 */
hlpuart1.Instance = LPUART1;
hlpuart1.Init.BaudRate = 460800;
hlpuart1.Init.WordLength = UART_WORDLENGTH_8B;
hlpuart1.Init.StopBits = UART_STOPBITS_1;
hlpuart1.Init.Parity = UART_PARITY_NONE;
hlpuart1.Init.Mode = UART_MODE_TX_RX;
hlpuart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
hlpuart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
hlpuart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
if (HAL_UART_Init(&hlpuart1) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN LPUART1_Init 2 */
/* USER CODE END LPUART1_Init 2 */
}
void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
if(uartHandle->Instance==LPUART1)
{
/* USER CODE BEGIN LPUART1_MspInit 0 */
/* USER CODE END LPUART1_MspInit 0 */
/** Initializes the peripherals clock
*/
PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_LPUART1;
PeriphClkInit.Lpuart1ClockSelection = RCC_LPUART1CLKSOURCE_PCLK1;
if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
{
Error_Handler();
}
/* LPUART1 clock enable */
__HAL_RCC_LPUART1_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
/**LPUART1 GPIO Configuration
PB10 ------> LPUART1_RX
PB11 ------> LPUART1_TX
*/
GPIO_InitStruct.Pin = STLK_RX_Pin|STLK_TX_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_AF8_LPUART1;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
/* USER CODE BEGIN LPUART1_MspInit 1 */
/* USER CODE END LPUART1_MspInit 1 */
}
}
void HAL_UART_MspDeInit(UART_HandleTypeDef* uartHandle)
{
if(uartHandle->Instance==LPUART1)
{
/* USER CODE BEGIN LPUART1_MspDeInit 0 */
/* USER CODE END LPUART1_MspDeInit 0 */
/* Peripheral clock disable */
__HAL_RCC_LPUART1_CLK_DISABLE();
/**LPUART1 GPIO Configuration
PB10 ------> LPUART1_RX
PB11 ------> LPUART1_TX
*/
HAL_GPIO_DeInit(GPIOB, STLK_RX_Pin|STLK_TX_Pin);
/* USER CODE BEGIN LPUART1_MspDeInit 1 */
/* USER CODE END LPUART1_MspDeInit 1 */
}
}
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */

View File

@ -2,36 +2,113 @@
CAD.formats=[]
CAD.pinconfig=Project naming
CAD.provider=
Dma.MEMTOMEM.1.Direction=DMA_MEMORY_TO_MEMORY
Dma.MEMTOMEM.1.Instance=DMA1_Channel4
Dma.MEMTOMEM.1.MemDataAlignment=DMA_MDATAALIGN_HALFWORD
Dma.MEMTOMEM.1.MemInc=DMA_MINC_ENABLE
Dma.MEMTOMEM.1.Mode=DMA_NORMAL
Dma.MEMTOMEM.1.PeriphDataAlignment=DMA_PDATAALIGN_HALFWORD
Dma.MEMTOMEM.1.PeriphInc=DMA_PINC_DISABLE
Dma.MEMTOMEM.1.Priority=DMA_PRIORITY_LOW
Dma.MEMTOMEM.1.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority
Dma.Request0=SPI1_TX
Dma.Request1=MEMTOMEM
Dma.RequestsNb=2
Dma.SPI1_TX.0.Direction=DMA_MEMORY_TO_PERIPH
Dma.SPI1_TX.0.Instance=DMA1_Channel3
Dma.SPI1_TX.0.MemDataAlignment=DMA_MDATAALIGN_BYTE
Dma.SPI1_TX.0.MemInc=DMA_MINC_ENABLE
Dma.SPI1_TX.0.Mode=DMA_NORMAL
Dma.SPI1_TX.0.PeriphDataAlignment=DMA_PDATAALIGN_BYTE
Dma.SPI1_TX.0.PeriphInc=DMA_PINC_DISABLE
Dma.SPI1_TX.0.Priority=DMA_PRIORITY_LOW
Dma.SPI1_TX.0.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority
File.Version=6
GPIO.groupedBy=
GPIO.groupedBy=Group By Peripherals
KeepUserPlacement=false
LPUART1.BaudRate=460800
LPUART1.IPParameters=BaudRate,WordLength
LPUART1.WordLength=UART_WORDLENGTH_8B
Mcu.CPN=STM32L496VGT6
Mcu.Family=STM32L4
Mcu.IP0=NVIC
Mcu.IP1=RCC
Mcu.IP2=SYS
Mcu.IPNb=3
Mcu.IP0=DMA
Mcu.IP1=LPUART1
Mcu.IP2=NVIC
Mcu.IP3=RCC
Mcu.IP4=SPI1
Mcu.IP5=SYS
Mcu.IPNb=6
Mcu.Name=STM32L496V(E-G)Tx
Mcu.Package=LQFP100
Mcu.Pin0=PB6
Mcu.Pin1=VP_SYS_VS_Systick
Mcu.PinsNb=2
Mcu.Pin0=PA4
Mcu.Pin1=PA5
Mcu.Pin10=VP_SYS_VS_tim7
Mcu.Pin2=PA6
Mcu.Pin3=PA7
Mcu.Pin4=PB2
Mcu.Pin5=PE7
Mcu.Pin6=PB10
Mcu.Pin7=PB11
Mcu.Pin8=PB5
Mcu.Pin9=PB6
Mcu.PinsNb=11
Mcu.ThirdPartyNb=0
Mcu.UserConstants=
Mcu.UserName=STM32L496VGTx
MxCube.Version=6.9.2
MxDb.Version=DB.6.0.92
NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
NVIC.DMA1_Channel3_IRQn=true\:6\:0\:true\:false\:true\:false\:true\:true
NVIC.DMA1_Channel4_IRQn=true\:6\:0\:true\:false\:true\:true\:true\:true
NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
NVIC.ForceEnableDMAVector=true
NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
NVIC.MemoryManagement_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
NVIC.NonMaskableInt_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
NVIC.PendSV_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
NVIC.PendSV_IRQn=true\:0\:0\:false\:false\:false\:false\:false\:false
NVIC.PriorityGroup=NVIC_PRIORITYGROUP_4
NVIC.SVCall_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
NVIC.SysTick_IRQn=true\:15\:0\:false\:false\:true\:false\:true\:false
NVIC.SVCall_IRQn=true\:0\:0\:false\:false\:false\:false\:false\:false
NVIC.SysTick_IRQn=true\:15\:0\:false\:false\:false\:false\:true\:false
NVIC.TIM7_IRQn=true\:15\:0\:false\:false\:true\:false\:true\:true
NVIC.TimeBase=TIM7_IRQn
NVIC.TimeBaseIP=TIM7
NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
PA4.GPIOParameters=GPIO_Label
PA4.GPIO_Label=LCD_CS
PA4.Mode=NSS_Signal_Hard_Output
PA4.Signal=SPI1_NSS
PA5.GPIOParameters=GPIO_Label
PA5.GPIO_Label=LCD_SCK
PA5.Locked=true
PA5.Mode=TX_Only_Simplex_Unidirect_Master
PA5.Signal=SPI1_SCK
PA6.GPIOParameters=GPIO_Label
PA6.GPIO_Label=LCD_DC
PA6.Locked=true
PA6.Signal=GPIO_Output
PA7.GPIOParameters=GPIO_Label
PA7.GPIO_Label=LCD_DI
PA7.Mode=TX_Only_Simplex_Unidirect_Master
PA7.Signal=SPI1_MOSI
PB10.GPIOParameters=GPIO_Label
PB10.GPIO_Label=STLK_RX
PB10.Locked=true
PB10.Mode=Asynchronous
PB10.Signal=LPUART1_RX
PB11.GPIOParameters=GPIO_Label
PB11.GPIO_Label=STLK_TX
PB11.Locked=true
PB11.Mode=Asynchronous
PB11.Signal=LPUART1_TX
PB2.GPIOParameters=GPIO_Label
PB2.GPIO_Label=LCD_RST
PB2.Locked=true
PB2.Signal=GPIO_Output
PB5.GPIOParameters=PinState,GPIO_Label
PB5.GPIO_Label=USB_SW
PB5.Locked=true
PB5.PinState=GPIO_PIN_SET
PB5.Signal=GPIO_Output
PB6.GPIOParameters=PinState,GPIO_PuPd,GPIO_Label,GPIO_ModeDefaultOutputPP
PB6.GPIO_Label=LED1
PB6.GPIO_ModeDefaultOutputPP=GPIO_MODE_OUTPUT_OD
@ -39,6 +116,10 @@ PB6.GPIO_PuPd=GPIO_NOPULL
PB6.Locked=true
PB6.PinState=GPIO_PIN_SET
PB6.Signal=GPIO_Output
PE7.GPIOParameters=GPIO_Label
PE7.GPIO_Label=LCD_BLK
PE7.Locked=true
PE7.Signal=GPIO_Output
PinOutPanel.RotationAngle=0
ProjectManager.AskForMigrate=true
ProjectManager.BackupPrevious=false
@ -63,20 +144,21 @@ ProjectManager.ProjectBuild=false
ProjectManager.ProjectFileName=STM32L496VGTx.ioc
ProjectManager.ProjectName=STM32L496VGTx
ProjectManager.ProjectStructure=
ProjectManager.RegisterCallBack=
ProjectManager.RegisterCallBack=SPI
ProjectManager.StackSize=0x400
ProjectManager.TargetToolchain=Makefile
ProjectManager.ToolChainLocation=
ProjectManager.UAScriptAfterPath=
ProjectManager.UAScriptBeforePath=
ProjectManager.UnderRoot=false
ProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-HAL-false,2-MX_GPIO_Init-GPIO-false-HAL-true
ProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-HAL-false,2-MX_GPIO_Init-GPIO-false-HAL-true,3-MX_DMA_Init-DMA-false-HAL-true,4-MX_LPUART1_UART_Init-LPUART1-false-HAL-true,5-MX_SPI1_Init-SPI1-false-HAL-true
RCC.ADCFreq_Value=16000000
RCC.AHBFreq_Value=80000000
RCC.APB1Freq_Value=80000000
RCC.APB1TimFreq_Value=80000000
RCC.APB2Freq_Value=80000000
RCC.APB2TimFreq_Value=80000000
RCC.CK48CLockSelection=RCC_USBCLKSOURCE_HSI48
RCC.CortexFreq_Value=80000000
RCC.DFSDMFreq_Value=80000000
RCC.FCLKCortexFreq_Value=80000000
@ -89,7 +171,7 @@ RCC.I2C1Freq_Value=80000000
RCC.I2C2Freq_Value=80000000
RCC.I2C3Freq_Value=80000000
RCC.I2C4Freq_Value=80000000
RCC.IPParameters=ADCFreq_Value,AHBFreq_Value,APB1Freq_Value,APB1TimFreq_Value,APB2Freq_Value,APB2TimFreq_Value,CortexFreq_Value,DFSDMFreq_Value,FCLKCortexFreq_Value,FamilyName,HCLKFreq_Value,HSE_VALUE,HSI48_VALUE,HSI_VALUE,I2C1Freq_Value,I2C2Freq_Value,I2C3Freq_Value,I2C4Freq_Value,LPTIM1Freq_Value,LPTIM2Freq_Value,LPUART1Freq_Value,LSCOPinFreq_Value,LSE_VALUE,LSI_VALUE,MCO1PinFreq_Value,MSI_VALUE,PLLN,PLLPoutputFreq_Value,PLLQoutputFreq_Value,PLLRCLKFreq_Value,PLLSAI1PoutputFreq_Value,PLLSAI1QoutputFreq_Value,PLLSAI1RoutputFreq_Value,PLLSAI2PoutputFreq_Value,PLLSAI2RoutputFreq_Value,PWRFreq_Value,RNGFreq_Value,SAI1Freq_Value,SAI2Freq_Value,SDMMCFreq_Value,SWPMI1Freq_Value,SYSCLKFreq_VALUE,SYSCLKSource,UART4Freq_Value,UART5Freq_Value,USART1Freq_Value,USART2Freq_Value,USART3Freq_Value,USBFreq_Value,VCOInputFreq_Value,VCOOutputFreq_Value,VCOSAI1OutputFreq_Value,VCOSAI2OutputFreq_Value
RCC.IPParameters=ADCFreq_Value,AHBFreq_Value,APB1Freq_Value,APB1TimFreq_Value,APB2Freq_Value,APB2TimFreq_Value,CK48CLockSelection,CortexFreq_Value,DFSDMFreq_Value,FCLKCortexFreq_Value,FamilyName,HCLKFreq_Value,HSE_VALUE,HSI48_VALUE,HSI_VALUE,I2C1Freq_Value,I2C2Freq_Value,I2C3Freq_Value,I2C4Freq_Value,LPTIM1Freq_Value,LPTIM2Freq_Value,LPUART1Freq_Value,LSCOPinFreq_Value,LSE_VALUE,LSI_VALUE,MCO1PinFreq_Value,MSI_VALUE,PLLN,PLLPoutputFreq_Value,PLLQoutputFreq_Value,PLLRCLKFreq_Value,PLLSAI1PoutputFreq_Value,PLLSAI1QoutputFreq_Value,PLLSAI1RoutputFreq_Value,PLLSAI2PoutputFreq_Value,PLLSAI2RoutputFreq_Value,PWRFreq_Value,RNGFreq_Value,SAI1Freq_Value,SAI2Freq_Value,SDMMCFreq_Value,SWPMI1Freq_Value,SYSCLKFreq_VALUE,SYSCLKSource,UART4Freq_Value,UART5Freq_Value,USART1Freq_Value,USART2Freq_Value,USART3Freq_Value,USBFreq_Value,VCOInputFreq_Value,VCOOutputFreq_Value,VCOSAI1OutputFreq_Value,VCOSAI2OutputFreq_Value
RCC.LPTIM1Freq_Value=80000000
RCC.LPTIM2Freq_Value=80000000
RCC.LPUART1Freq_Value=80000000
@ -108,10 +190,10 @@ RCC.PLLSAI1RoutputFreq_Value=16000000
RCC.PLLSAI2PoutputFreq_Value=16000000
RCC.PLLSAI2RoutputFreq_Value=16000000
RCC.PWRFreq_Value=80000000
RCC.RNGFreq_Value=16000000
RCC.RNGFreq_Value=48000000
RCC.SAI1Freq_Value=16000000
RCC.SAI2Freq_Value=16000000
RCC.SDMMCFreq_Value=16000000
RCC.SDMMCFreq_Value=48000000
RCC.SWPMI1Freq_Value=80000000
RCC.SYSCLKFreq_VALUE=80000000
RCC.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK
@ -120,11 +202,19 @@ RCC.UART5Freq_Value=80000000
RCC.USART1Freq_Value=80000000
RCC.USART2Freq_Value=80000000
RCC.USART3Freq_Value=80000000
RCC.USBFreq_Value=16000000
RCC.USBFreq_Value=48000000
RCC.VCOInputFreq_Value=4000000
RCC.VCOOutputFreq_Value=160000000
RCC.VCOSAI1OutputFreq_Value=32000000
RCC.VCOSAI2OutputFreq_Value=32000000
VP_SYS_VS_Systick.Mode=SysTick
VP_SYS_VS_Systick.Signal=SYS_VS_Systick
SPI1.BaudRatePrescaler=SPI_BAUDRATEPRESCALER_4
SPI1.CalculateBaudRate=20.0 MBits/s
SPI1.DataSize=SPI_DATASIZE_8BIT
SPI1.Direction=SPI_DIRECTION_2LINES
SPI1.IPParameters=VirtualType,Mode,Direction,CalculateBaudRate,BaudRatePrescaler,DataSize,VirtualNSS
SPI1.Mode=SPI_MODE_MASTER
SPI1.VirtualNSS=VM_NSSHARD
SPI1.VirtualType=VM_MASTER
VP_SYS_VS_tim7.Mode=TIM7
VP_SYS_VS_tim7.Signal=SYS_VS_tim7
board=custom

1
SDK Submodule

@ -0,0 +1 @@
Subproject commit 0c633e6b9fa1abb6947f989c974cf5c24a0ee361

113
include/FreeRTOSConfig.h Normal file
View File

@ -0,0 +1,113 @@
#ifndef FREERTOS_CONFIG_H
#define FREERTOS_CONFIG_H
/* Ensure stdint is only used by the compiler, and not the assembler. */
#if defined(__ICCARM__) || defined(__CC_ARM) || defined(__GNUC__)
#include <stdint.h>
extern uint32_t SystemCoreClock;
#endif
/* General configuration */
#define configUSE_PREEMPTION 1
#define configUSE_PORT_OPTIMISED_TASK_SELECTION 0
#define configCPU_CLOCK_HZ (SystemCoreClock)
#define configTICK_RATE_HZ 1000
#define configMAX_PRIORITIES 8
#define configMINIMAL_STACK_SIZE 128
#define configMAX_TASK_NAME_LEN 16
#define configUSE_16_BIT_TICKS 0
#define configIDLE_SHOULD_YIELD 1
#define configUSE_TASK_NOTIFICATIONS 1
#define configTASK_NOTIFICATION_ARRAY_ENTRIES 3
#define configUSE_MUTEXES 1
#define configUSE_RECURSIVE_MUTEXES 1
#define configUSE_COUNTING_SEMAPHORES 0
#define configUSE_ALTERNATIVE_API 0 /* Deprecated! */
#define configQUEUE_REGISTRY_SIZE 10
#define configUSE_QUEUE_SETS 0
#define configUSE_TIME_SLICING 0
#define configUSE_NEWLIB_REENTRANT 1
#define configENABLE_BACKWARD_COMPATIBILITY 0
#define configNUM_THREAD_LOCAL_STORAGE_POINTERS 5
#define configSTACK_DEPTH_TYPE uint16_t
#define configMESSAGE_BUFFER_LENGTH_TYPE size_t
#ifdef NDEBUG
#define configUSE_TICKLESS_IDLE 1
#else
#define configUSE_TICKLESS_IDLE 0
#endif
/* Memory allocation related definitions. */
#define configSUPPORT_STATIC_ALLOCATION 0
#define configSUPPORT_DYNAMIC_ALLOCATION 1
#define configTOTAL_HEAP_SIZE (32 * 1024)
#define configAPPLICATION_ALLOCATED_HEAP 0
#define configSTACK_ALLOCATION_FROM_SEPARATE_HEAP 0
/* Hook function related definitions. */
#define configUSE_IDLE_HOOK 0
#define configUSE_TICK_HOOK 0
#define configCHECK_FOR_STACK_OVERFLOW 0
#define configUSE_MALLOC_FAILED_HOOK 0
#define configUSE_DAEMON_TASK_STARTUP_HOOK 0
/* Run time and task stats gathering related definitions. */
#define configGENERATE_RUN_TIME_STATS 0
#define configUSE_TRACE_FACILITY 0
#define configUSE_STATS_FORMATTING_FUNCTIONS 0
/* Co-routine related definitions. */
#define configUSE_CO_ROUTINES 0
#define configMAX_CO_ROUTINE_PRIORITIES 1
/* Software timer related definitions. */
#define configUSE_TIMERS 1
#define configTIMER_TASK_PRIORITY 3
#define configTIMER_QUEUE_LENGTH 10
#define configTIMER_TASK_STACK_DEPTH configMINIMAL_STACK_SIZE
/* Define to trap errors during development. */
#define configASSERT( x ) if( ( x ) == 0 ) for(;;) { }
/* Optional functions - most linkers will remove unused functions anyway. */
#define INCLUDE_vTaskPrioritySet 1
#define INCLUDE_uxTaskPriorityGet 1
#define INCLUDE_vTaskDelete 1
#define INCLUDE_vTaskSuspend 1
#define INCLUDE_xResumeFromISR 1
#define INCLUDE_vTaskDelayUntil 1
#define INCLUDE_vTaskDelay 1
#define INCLUDE_xTaskGetSchedulerState 1
#define INCLUDE_xTaskGetCurrentTaskHandle 1
#define INCLUDE_uxTaskGetStackHighWaterMark 0
#define INCLUDE_xTaskGetIdleTaskHandle 0
#define INCLUDE_eTaskGetState 0
#define INCLUDE_xEventGroupSetBitFromISR 1
#define INCLUDE_xTimerPendFunctionCall 0
#define INCLUDE_xTaskAbortDelay 0
#define INCLUDE_xTaskGetHandle 0
#define INCLUDE_xTaskResumeFromISR 1
/* Port-specific settings */
#ifdef __NVIC_PRIO_BITS
/* __BVIC_PRIO_BITS will be specified when CMSIS is being used. */
#define configPRIO_BITS __NVIC_PRIO_BITS
#else
#define configPRIO_BITS 4 /* 16 priority levels */
#endif
#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY 15
#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 5
#define configKERNEL_INTERRUPT_PRIORITY ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )
#define configMAX_SYSCALL_INTERRUPT_PRIORITY ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )
#define vPortSVCHandler SVC_Handler
#define xPortPendSVHandler PendSV_Handler
#define xPortSysTickHandler SysTick_Handler
/* A header file that defines trace macro can be included here. */
#endif /* FREERTOS_CONFIG_H */

13
include/app_lcd_impl.h Normal file
View File

@ -0,0 +1,13 @@
#ifndef APP_LCD_IMPL_H
#define APP_LCD_IMPL_H
#include "epd-spi/epd_common.h"
int app_lcd_impl_init(void);
epd_ret_t app_lcd_impl_write_command(void *handle, uint8_t *command, uint32_t len);
epd_ret_t app_lcd_impl_write_data(void *handle, const uint8_t *data, uint32_t len);
epd_ret_t app_lcd_impl_reset(void *handle);
epd_ret_t app_lcd_impl_delay(void *handle, uint32_t msec);
epd_ret_t app_lcd_impl_backlight(void *handle, uint8_t on);
#endif // APP_LCD_IMPL_H

14
include/app_lighting.h Normal file
View File

@ -0,0 +1,14 @@
#ifndef APP_LIGHTING_H
#define APP_LIGHTING_H
#include <stdint.h>
int app_lighting_init(void);
uint16_t app_lighting_get_array_attributes(uint8_t *buffer);
uint16_t app_lighting_get_lamp_attributes(uint8_t *buffer);
void app_lighting_set_lamp_attributes_req(const uint8_t *buffer);
void app_lighting_set_lamp_multi_update(const uint8_t *buffer);
void app_lighting_set_lamp_range_update(const uint8_t *buffer);
void app_lighting_set_lamp_array_control(const uint8_t *buffer);
#endif // APP_LIGHTING_H

6
include/app_tusb.h Normal file
View File

@ -0,0 +1,6 @@
#ifndef APP_TUSB_H
#define APP_TUSB_H
int app_tusb_init(void);
#endif // APP_TUSB_H

View File

@ -0,0 +1,317 @@
#ifndef APP_TUSB_DESCRIPTORS_H
#define APP_TUSB_DESCRIPTORS_H
#define APP_TUSB_VID (0x1FC9U)
#define APP_TUSB_PID (0xAFFFU)
#define APP_TUSB_STRING_ID_LANG (0x00U)
#define APP_TUSB_STRING_ID_MFG (0x01U)
#define APP_TUSB_STRING_ID_PRODUCT (0x02U)
#define APP_TUSB_STRING_ID_SERIAL (0x03U)
#define HID_USAGE_PAGE_LIGHTING_AND_ILLUMINATION (0x59U)
enum {
HID_USAGE_LIGHTING_LAMP_ARRAY = 0x01,
HID_USAGE_LIGHTING_LAMP_ARRAY_ATTRIBUTES_REPORT = 0x02,
HID_USAGE_LIGHTING_LAMP_COUNT = 0x03,
HID_USAGE_LIGHTING_BOUNDING_BOX_WIDTH_IN_MICROMETERS = 0x04,
HID_USAGE_LIGHTING_BOUNDING_BOX_HEIGHT_IN_MICROMETERS = 0x05,
HID_USAGE_LIGHTING_BOUNDING_BOX_DEPTH_IN_MICROMETERS = 0x06,
HID_USAGE_LIGHTING_LAMP_ARRAY_KIND = 0x07,
HID_USAGE_LIGHTING_MIN_UPDATE_INTERVAL_IN_MICROSECONDS = 0x08,
HID_USAGE_LIGHTING_LAMP_ATTRIBUTES_REQUEST_REPORT = 0x20,
HID_USAGE_LIGHTING_LAMP_ID = 0x21,
HID_USAGE_LIGHTING_LAMP_ATTRIBUTES_RESPONSE_REPORT = 0x22,
HID_USAGE_LIGHTING_POSITION_X_IN_MICROMETERS = 0x23,
HID_USAGE_LIGHTING_POSITION_Y_IN_MICROMETERS = 0x24,
HID_USAGE_LIGHTING_POSITION_Z_IN_MICROMETERS = 0x25,
HID_USAGE_LIGHTING_LAMP_PURPOSES = 0x26,
HID_USAGE_LIGHTING_UPDATE_LATENCY_IN_MICROSECONDS = 0x27,
HID_USAGE_LIGHTING_RED_LEVEL_COUNT = 0x28,
HID_USAGE_LIGHTING_GREEN_LEVEL_COUNT = 0x29,
HID_USAGE_LIGHTING_BLUE_LEVEL_COUNT = 0x2A,
HID_USAGE_LIGHTING_INTENSITY_LEVEL_COUNT = 0x2B,
HID_USAGE_LIGHTING_IS_PROGRAMMABLE = 0x2C,
HID_USAGE_LIGHTING_INPUT_BINDING = 0x2D,
HID_USAGE_LIGHTING_LAMP_MULTI_UPDATE_REPORT = 0x50,
HID_USAGE_LIGHTING_RED_UPDATE_CHANNEL = 0x51,
HID_USAGE_LIGHTING_GREEN_UPDATE_CHANNEL = 0x52,
HID_USAGE_LIGHTING_BLUE_UPDATE_CHANNEL = 0x53,
HID_USAGE_LIGHTING_INTENSITY_UPDATE_CHANNEL = 0x54,
HID_USAGE_LIGHTING_LAMP_UPDATE_FLAGS = 0x55,
HID_USAGE_LIGHTING_LAMP_RANGE_UPDATE_REPORT = 0x60,
HID_USAGE_LIGHTING_LAMP_ID_START = 0x61,
HID_USAGE_LIGHTING_LAMP_ID_END = 0x62,
HID_USAGE_LIGHTING_LAMP_ARRAY_CONTROL_REPORT = 0x70,
HID_USAGE_LIGHTING_AUTONOMOUS_MODE = 0x71,
};
/* clang-format off */
// HID Lighting and Illumination Report Descriptor Template
// - 1st parameter is report id (required)
// Creates 6 report ids for lighting HID usages in the following order:
// report_id+0: HID_USAGE_LIGHTING_LAMP_ARRAY_ATTRIBUTES_REPORT
// report_id+1: HID_USAGE_LIGHTING_LAMP_ATTRIBUTES_REQUEST_REPORT
// report_id+2: HID_USAGE_LIGHTING_LAMP_ATTRIBUTES_RESPONSE_REPORT
// report_id+3: HID_USAGE_LIGHTING_LAMP_MULTI_UPDATE_REPORT
// report_id+4: HID_USAGE_LIGHTING_LAMP_RANGE_UPDATE_REPORT
// report_id+5: HID_USAGE_LIGHTING_LAMP_ARRAY_CONTROL_REPORT
#define TUD_HID_REPORT_DESC_LIGHTING(report_id) \
HID_USAGE_PAGE ( HID_USAGE_PAGE_LIGHTING_AND_ILLUMINATION ),\
HID_USAGE ( HID_USAGE_LIGHTING_LAMP_ARRAY ),\
HID_COLLECTION ( HID_COLLECTION_APPLICATION ), /* Lamp Array Attributes Report */ \
HID_REPORT_ID (report_id ) \
HID_USAGE ( HID_USAGE_LIGHTING_LAMP_ARRAY_ATTRIBUTES_REPORT ),\
HID_COLLECTION ( HID_COLLECTION_LOGICAL ),\
HID_USAGE ( HID_USAGE_LIGHTING_LAMP_COUNT ),\
HID_LOGICAL_MIN ( 0 ),\
HID_LOGICAL_MAX_N ( 65535, 3 ),\
HID_REPORT_SIZE ( 16 ),\
HID_REPORT_COUNT ( 1 ),\
HID_FEATURE ( HID_CONSTANT | HID_VARIABLE | HID_ABSOLUTE ),\
HID_USAGE ( HID_USAGE_LIGHTING_BOUNDING_BOX_WIDTH_IN_MICROMETERS ),\
HID_USAGE ( HID_USAGE_LIGHTING_BOUNDING_BOX_HEIGHT_IN_MICROMETERS ),\
HID_USAGE ( HID_USAGE_LIGHTING_BOUNDING_BOX_DEPTH_IN_MICROMETERS ),\
HID_USAGE ( HID_USAGE_LIGHTING_LAMP_ARRAY_KIND ),\
HID_USAGE ( HID_USAGE_LIGHTING_MIN_UPDATE_INTERVAL_IN_MICROSECONDS ),\
HID_LOGICAL_MIN ( 0 ),\
HID_LOGICAL_MAX_N ( 2147483647, 3 ),\
HID_REPORT_SIZE ( 32 ),\
HID_REPORT_COUNT ( 5 ),\
HID_FEATURE ( HID_CONSTANT | HID_VARIABLE | HID_ABSOLUTE ),\
HID_COLLECTION_END , /* Lamp Attributes Request Report */ \
HID_REPORT_ID ( report_id + 1 ) \
HID_USAGE ( HID_USAGE_LIGHTING_LAMP_ATTRIBUTES_REQUEST_REPORT ),\
HID_COLLECTION ( HID_COLLECTION_LOGICAL ),\
HID_USAGE ( HID_USAGE_LIGHTING_LAMP_ID ),\
HID_LOGICAL_MIN ( 0 ),\
HID_LOGICAL_MAX_N ( 65535, 3 ),\
HID_REPORT_SIZE ( 16 ),\
HID_REPORT_COUNT ( 1 ),\
HID_FEATURE ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE ),\
HID_COLLECTION_END , /* Lamp Attributes Response Report */ \
HID_REPORT_ID ( report_id + 2 ) \
HID_USAGE ( HID_USAGE_LIGHTING_LAMP_ATTRIBUTES_RESPONSE_REPORT ),\
HID_COLLECTION ( HID_COLLECTION_LOGICAL ),\
HID_USAGE ( HID_USAGE_LIGHTING_LAMP_ID ),\
HID_LOGICAL_MIN ( 0 ),\
HID_LOGICAL_MAX_N ( 65535, 3 ),\
HID_REPORT_SIZE ( 16 ),\
HID_REPORT_COUNT ( 1 ),\
HID_FEATURE ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE ),\
HID_USAGE ( HID_USAGE_LIGHTING_POSITION_X_IN_MICROMETERS ),\
HID_USAGE ( HID_USAGE_LIGHTING_POSITION_Y_IN_MICROMETERS ),\
HID_USAGE ( HID_USAGE_LIGHTING_POSITION_Z_IN_MICROMETERS ),\
HID_USAGE ( HID_USAGE_LIGHTING_UPDATE_LATENCY_IN_MICROSECONDS ),\
HID_USAGE ( HID_USAGE_LIGHTING_LAMP_PURPOSES ),\
HID_LOGICAL_MIN ( 0 ),\
HID_LOGICAL_MAX_N ( 2147483647, 3 ),\
HID_REPORT_SIZE ( 32 ),\
HID_REPORT_COUNT ( 5 ),\
HID_FEATURE ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE ),\
HID_USAGE ( HID_USAGE_LIGHTING_RED_LEVEL_COUNT ),\
HID_USAGE ( HID_USAGE_LIGHTING_GREEN_LEVEL_COUNT ),\
HID_USAGE ( HID_USAGE_LIGHTING_BLUE_LEVEL_COUNT ),\
HID_USAGE ( HID_USAGE_LIGHTING_INTENSITY_LEVEL_COUNT ),\
HID_USAGE ( HID_USAGE_LIGHTING_IS_PROGRAMMABLE ),\
HID_USAGE ( HID_USAGE_LIGHTING_INPUT_BINDING ),\
HID_LOGICAL_MIN ( 0 ),\
HID_LOGICAL_MAX_N ( 255, 2 ),\
HID_REPORT_SIZE ( 8 ),\
HID_REPORT_COUNT ( 6 ),\
HID_FEATURE ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE ),\
HID_COLLECTION_END , /* Lamp Multi-Update Report */ \
HID_REPORT_ID ( report_id + 3 ) \
HID_USAGE ( HID_USAGE_LIGHTING_LAMP_MULTI_UPDATE_REPORT ),\
HID_COLLECTION ( HID_COLLECTION_LOGICAL ),\
HID_USAGE ( HID_USAGE_LIGHTING_LAMP_COUNT ),\
HID_USAGE ( HID_USAGE_LIGHTING_LAMP_UPDATE_FLAGS ),\
HID_LOGICAL_MIN ( 0 ),\
HID_LOGICAL_MAX ( 8 ),\
HID_REPORT_SIZE ( 8 ),\
HID_REPORT_COUNT ( 2 ),\
HID_FEATURE ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE ),\
HID_USAGE ( HID_USAGE_LIGHTING_LAMP_ID ),\
HID_LOGICAL_MIN ( 0 ),\
HID_LOGICAL_MAX_N ( 65535, 3 ),\
HID_REPORT_SIZE ( 16 ),\
HID_REPORT_COUNT ( 8 ),\
HID_FEATURE ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE ),\
HID_USAGE ( HID_USAGE_LIGHTING_RED_UPDATE_CHANNEL ),\
HID_USAGE ( HID_USAGE_LIGHTING_GREEN_UPDATE_CHANNEL ),\
HID_USAGE ( HID_USAGE_LIGHTING_BLUE_UPDATE_CHANNEL ),\
HID_USAGE ( HID_USAGE_LIGHTING_INTENSITY_UPDATE_CHANNEL ),\
HID_USAGE ( HID_USAGE_LIGHTING_RED_UPDATE_CHANNEL ),\
HID_USAGE ( HID_USAGE_LIGHTING_GREEN_UPDATE_CHANNEL ),\
HID_USAGE ( HID_USAGE_LIGHTING_BLUE_UPDATE_CHANNEL ),\
HID_USAGE ( HID_USAGE_LIGHTING_INTENSITY_UPDATE_CHANNEL ),\
HID_USAGE ( HID_USAGE_LIGHTING_RED_UPDATE_CHANNEL ),\
HID_USAGE ( HID_USAGE_LIGHTING_GREEN_UPDATE_CHANNEL ),\
HID_USAGE ( HID_USAGE_LIGHTING_BLUE_UPDATE_CHANNEL ),\
HID_USAGE ( HID_USAGE_LIGHTING_INTENSITY_UPDATE_CHANNEL ),\
HID_USAGE ( HID_USAGE_LIGHTING_RED_UPDATE_CHANNEL ),\
HID_USAGE ( HID_USAGE_LIGHTING_GREEN_UPDATE_CHANNEL ),\
HID_USAGE ( HID_USAGE_LIGHTING_BLUE_UPDATE_CHANNEL ),\
HID_USAGE ( HID_USAGE_LIGHTING_INTENSITY_UPDATE_CHANNEL ),\
HID_USAGE ( HID_USAGE_LIGHTING_RED_UPDATE_CHANNEL ),\
HID_USAGE ( HID_USAGE_LIGHTING_GREEN_UPDATE_CHANNEL ),\
HID_USAGE ( HID_USAGE_LIGHTING_BLUE_UPDATE_CHANNEL ),\
HID_USAGE ( HID_USAGE_LIGHTING_INTENSITY_UPDATE_CHANNEL ),\
HID_USAGE ( HID_USAGE_LIGHTING_RED_UPDATE_CHANNEL ),\
HID_USAGE ( HID_USAGE_LIGHTING_GREEN_UPDATE_CHANNEL ),\
HID_USAGE ( HID_USAGE_LIGHTING_BLUE_UPDATE_CHANNEL ),\
HID_USAGE ( HID_USAGE_LIGHTING_INTENSITY_UPDATE_CHANNEL ),\
HID_USAGE ( HID_USAGE_LIGHTING_RED_UPDATE_CHANNEL ),\
HID_USAGE ( HID_USAGE_LIGHTING_GREEN_UPDATE_CHANNEL ),\
HID_USAGE ( HID_USAGE_LIGHTING_BLUE_UPDATE_CHANNEL ),\
HID_USAGE ( HID_USAGE_LIGHTING_INTENSITY_UPDATE_CHANNEL ),\
HID_USAGE ( HID_USAGE_LIGHTING_RED_UPDATE_CHANNEL ),\
HID_USAGE ( HID_USAGE_LIGHTING_GREEN_UPDATE_CHANNEL ),\
HID_USAGE ( HID_USAGE_LIGHTING_BLUE_UPDATE_CHANNEL ),\
HID_USAGE ( HID_USAGE_LIGHTING_INTENSITY_UPDATE_CHANNEL ),\
HID_LOGICAL_MIN ( 0 ),\
HID_LOGICAL_MAX_N ( 255, 2 ),\
HID_REPORT_SIZE ( 8 ),\
HID_REPORT_COUNT ( 32 ),\
HID_FEATURE ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE ),\
HID_COLLECTION_END , /* Lamp Range Update Report */ \
HID_REPORT_ID ( report_id + 4 ) \
HID_USAGE ( HID_USAGE_LIGHTING_LAMP_RANGE_UPDATE_REPORT ),\
HID_COLLECTION ( HID_COLLECTION_LOGICAL ),\
HID_USAGE ( HID_USAGE_LIGHTING_LAMP_UPDATE_FLAGS ),\
HID_LOGICAL_MIN ( 0 ),\
HID_LOGICAL_MAX ( 8 ),\
HID_REPORT_SIZE ( 8 ),\
HID_REPORT_COUNT ( 1 ),\
HID_FEATURE ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE ),\
HID_USAGE ( HID_USAGE_LIGHTING_LAMP_ID_START ),\
HID_USAGE ( HID_USAGE_LIGHTING_LAMP_ID_END ),\
HID_LOGICAL_MIN ( 0 ),\
HID_LOGICAL_MAX_N ( 65535, 3 ),\
HID_REPORT_SIZE ( 16 ),\
HID_REPORT_COUNT ( 2 ),\
HID_FEATURE ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE ),\
HID_USAGE ( HID_USAGE_LIGHTING_RED_UPDATE_CHANNEL ),\
HID_USAGE ( HID_USAGE_LIGHTING_GREEN_UPDATE_CHANNEL ),\
HID_USAGE ( HID_USAGE_LIGHTING_BLUE_UPDATE_CHANNEL ),\
HID_USAGE ( HID_USAGE_LIGHTING_INTENSITY_UPDATE_CHANNEL ),\
HID_LOGICAL_MIN ( 0 ),\
HID_LOGICAL_MAX_N ( 255, 2 ),\
HID_REPORT_SIZE ( 8 ),\
HID_REPORT_COUNT ( 4 ),\
HID_FEATURE ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE ),\
HID_COLLECTION_END , /* Lamp Array Control Report */ \
HID_REPORT_ID ( report_id + 5 ) \
HID_USAGE ( HID_USAGE_LIGHTING_LAMP_ARRAY_CONTROL_REPORT ),\
HID_COLLECTION ( HID_COLLECTION_LOGICAL ),\
HID_USAGE ( HID_USAGE_LIGHTING_AUTONOMOUS_MODE ),\
HID_LOGICAL_MIN ( 0 ),\
HID_LOGICAL_MAX ( 1 ),\
HID_REPORT_SIZE ( 8 ),\
HID_REPORT_COUNT ( 1 ),\
HID_FEATURE ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE ),\
HID_COLLECTION_END ,\
HID_COLLECTION_END
/* clang-format on */
enum {
REPORT_ID_CONSUMER = 1,
REPORT_ID_LIGHTING_LAMP_ARRAY_ATTRIBUTES, // 2
REPORT_ID_LIGHTING_LAMP_ATTRIBUTES_REQUEST, // 3
REPORT_ID_LIGHTING_LAMP_ATTRIBUTES_RESPONSE, // 4
REPORT_ID_LIGHTING_LAMP_MULTI_UPDATE, // 5
REPORT_ID_LIGHTING_LAMP_RANGE_UPDATE, // 6
REPORT_ID_LIGHTING_LAMP_ARRAY_CONTROL, // 7
REPORT_ID_COUNT,
};
static const tusb_desc_device_t s_tud_desc_dev = {
.bLength = sizeof(tusb_desc_device_t),
.bDescriptorType = TUSB_DESC_DEVICE,
.bcdUSB = 0x0200,
.bDeviceClass = 0x00,
.bDeviceSubClass = 0x00,
.bDeviceProtocol = 0x00,
.bMaxPacketSize0 = CFG_TUD_ENDPOINT0_SIZE,
.idVendor = APP_TUSB_VID,
.idProduct = APP_TUSB_PID,
.bcdDevice = 0x0100,
.iManufacturer = 0x01,
.iProduct = 0x02,
.iSerialNumber = 0x03,
.bNumConfigurations = 0x01,
};
static const uint8_t s_tud_desc_hid_report[] = {
TUD_HID_REPORT_DESC_CONSUMER(HID_REPORT_ID(1)),
TUD_HID_REPORT_DESC_LIGHTING(REPORT_ID_LIGHTING_LAMP_ARRAY_ATTRIBUTES),
};
static const uint8_t s_tud_desc_configuration[] = {
TUD_CONFIG_DESCRIPTOR(1, 1, 0, (TUD_CONFIG_DESC_LEN + TUD_HID_DESC_LEN), 0x00, 500),
TUD_HID_DESCRIPTOR(0, 0, HID_ITF_PROTOCOL_NONE, sizeof(s_tud_desc_hid_report), 0x81, CFG_TUD_HID_EP_BUFSIZE, 5),
};
static const uint16_t s_tud_desc_string_lang[] = {
((TUSB_DESC_STRING << 8U) | 4), /* 1 * 2 + 2 */
0x0409U,
};
static const uint16_t s_tud_desc_string_mfg[] = {
((TUSB_DESC_STRING << 8U) | 16), /* 7 * 2 + 2 */
'T',
'i',
'n',
'y',
'U',
'S',
'B',
};
static const uint16_t s_tud_desc_string_product[] = {
((TUSB_DESC_STRING << 8U) | 30), /* 14 * 2 + 2 */
'T',
'i',
'n',
'y',
'U',
'S',
'B',
' ',
'D',
'e',
'v',
'i',
'c',
'e',
};
static const uint16_t s_tud_desc_string_serial[] = {
((TUSB_DESC_STRING << 8U) | 30), /* 14 * 2 + 2 */
'A',
'B',
'C',
'D',
'E',
'F',
'G',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
};
static const uint16_t s_tud_desc_string_unknown[] = {
((TUSB_DESC_STRING << 8U) | 2),
};
#endif // APP_TUSB_DESCRIPTORS_H

View File

@ -0,0 +1,79 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
#ifndef LAMP_ARRAY_HID_STRUCTS_H
#define LAMP_ARRAY_HID_STRUCTS_H
typedef struct {
uint8_t red;
uint8_t green;
uint8_t blue;
uint8_t intensity;
} __attribute__((packed, aligned(1))) LampColor;
typedef struct {
uint32_t x;
uint32_t y;
uint32_t z;
} __attribute__((packed, aligned(1))) Position;
typedef struct {
uint16_t lampCount;
uint32_t width;
uint32_t height;
uint32_t depth;
uint32_t lampArrayKind;
uint32_t minUpdateInterval;
} __attribute__((packed, aligned(1))) LampArrayAttributesReport;
typedef struct {
uint16_t lampId;
} __attribute__((packed, aligned(1))) LampAttributesRequestReport;
#define LAMP_PURPOSE_CONTROL 0x01
#define LAMP_PURPOSE_ACCENT 0x02
#define LAMP_PURPOSE_BRANDING 0x04
#define LAMP_PURPOSE_STATUS 0x08
#define LAMP_PURPOSE_ILLUMINATION 0x10
#define LAMP_PURPOSE_PRESENTATION 0x20
typedef struct {
uint16_t lampId;
Position lampPosition;
uint32_t updateLatency;
uint32_t lampPurposes;
uint8_t redLevelCount;
uint8_t greenLevelCount;
uint8_t blueLevelCount;
uint8_t intensityLevelCount;
uint8_t isProgrammable;
uint8_t inputBinding;
} __attribute__((packed, aligned(1))) LampAttributesResponseReport;
typedef struct {
uint8_t lampCount;
uint8_t flags;
uint16_t lampIds[8];
LampColor colors[8];
} __attribute__((packed, aligned(1))) LampMultiUpdateReport;
typedef struct {
uint8_t flags;
uint16_t lampIdStart;
uint16_t lampIdEnd;
LampColor color;
} __attribute__((packed, aligned(1))) LampRangeUpdateReport;
typedef struct {
uint8_t autonomousMode;
} __attribute__((packed, aligned(1))) LampArrayControlReport;
#endif

112
include/tusb_config.h Normal file
View File

@ -0,0 +1,112 @@
/*
* The MIT License (MIT)
*
* Copyright (c) 2019 Ha Thach (tinyusb.org)
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*
*/
#ifndef _TUSB_CONFIG_H_
#define _TUSB_CONFIG_H_
#ifdef __cplusplus
extern "C" {
#endif
//--------------------------------------------------------------------+
// Board Specific Configuration
//--------------------------------------------------------------------+
// RHPort number used for device can be defined by board.mk, default to port 0
#ifndef BOARD_TUD_RHPORT
#define BOARD_TUD_RHPORT 0
#endif
// RHPort max operational speed can defined by board.mk
#ifndef BOARD_TUD_MAX_SPEED
#define BOARD_TUD_MAX_SPEED OPT_MODE_DEFAULT_SPEED
#endif
//--------------------------------------------------------------------
// COMMON CONFIGURATION
//--------------------------------------------------------------------
// defined by compiler flags for flexibility
#ifndef CFG_TUSB_MCU
#error CFG_TUSB_MCU must be defined
#endif
#ifndef CFG_TUSB_OS
#define CFG_TUSB_OS OPT_OS_FREERTOS
#endif
#ifndef CFG_TUSB_DEBUG
#define CFG_TUSB_DEBUG 0
#endif
// Enable Device stack
#define CFG_TUD_ENABLED 1
// Default is max speed that hardware controller could support with on-chip PHY
#define CFG_TUD_MAX_SPEED BOARD_TUD_MAX_SPEED
/* USB DMA on some MCUs can only access a specific SRAM region with restriction on alignment.
* Tinyusb use follows macros to declare transferring memory so that they can be put
* into those specific section.
* e.g
* - CFG_TUSB_MEM SECTION : __attribute__ (( section(".usb_ram") ))
* - CFG_TUSB_MEM_ALIGN : __attribute__ ((aligned(4)))
*/
#ifndef CFG_TUSB_MEM_SECTION
#define CFG_TUSB_MEM_SECTION
#endif
#ifndef CFG_TUSB_MEM_ALIGN
#define CFG_TUSB_MEM_ALIGN __attribute__ ((aligned(4)))
#endif
//--------------------------------------------------------------------
// DEVICE CONFIGURATION
//--------------------------------------------------------------------
#ifndef CFG_TUD_ENDPOINT0_SIZE
#define CFG_TUD_ENDPOINT0_SIZE 64
#endif
//------------- CLASS -------------//
#define CFG_TUD_CDC 0
#define CFG_TUD_MSC 0
#define CFG_TUD_HID 1
#define CFG_TUD_MIDI 0
#define CFG_TUD_VENDOR 0
//------------ CDC --------------//
#define CFG_TUD_CDC_RX_BUFSIZE 64
#define CFG_TUD_CDC_TX_BUFSIZE 64
// HID buffer size Should be sufficient to hold ID (if any) + Data
#define CFG_TUD_HID_EP_BUFSIZE 64
#ifdef __cplusplus
}
#endif
#endif /* _TUSB_CONFIG_H_ */

1
lib/freertos Submodule

@ -0,0 +1 @@
Subproject commit 0264280230aa6a828247b5f05bf57e33f1994581

1
lib/lcd Submodule

@ -0,0 +1 @@
Subproject commit 7d0de59c3bba1766cc7d2417e5ae11d5a0f82372

1
lib/tinyusb Submodule

@ -0,0 +1 @@
Subproject commit 10558acac6658d1480a6a6c025e006f2a6f4e212

102
src/app_lcd_impl.c Normal file
View File

@ -0,0 +1,102 @@
/* FreeRTOS */
#include "FreeRTOS.h"
#include "semphr.h"
#include "task.h"
/* HAL */
#include "stm32l4xx_hal.h"
/* MX */
#include "dma.h"
#include "gpio.h"
#include "spi.h"
/* LCD */
#include "epd-spi/driver/lcd_st7789.h"
#define SET_DC(x) HAL_GPIO_WritePin(LCD_DC_GPIO_Port, LCD_DC_Pin, x)
#define SET_RST(x) HAL_GPIO_WritePin(LCD_RST_GPIO_Port, LCD_RST_Pin, x)
#define SET_BLK(x) HAL_GPIO_WritePin(LCD_BLK_GPIO_Port, LCD_BLK_Pin, x)
static SemaphoreHandle_t s_spi_dma_semaphore = NULL;
static void app_lcd_spi_evt_callback(SPI_HandleTypeDef *hspi);
int app_lcd_impl_init(void) {
SET_BLK(GPIO_PIN_RESET);
SET_DC(GPIO_PIN_SET);
SET_RST(GPIO_PIN_SET);
HAL_SPI_RegisterCallback(&hspi1, HAL_SPI_TX_COMPLETE_CB_ID, app_lcd_spi_evt_callback);
s_spi_dma_semaphore = xSemaphoreCreateBinary();
if (s_spi_dma_semaphore == NULL) {
return -1;
}
return 0;
}
epd_ret_t app_lcd_impl_write_command(void *handle, uint8_t *command, uint32_t len) {
HAL_StatusTypeDef ret;
SET_DC(GPIO_PIN_RESET);
ret = HAL_SPI_Transmit(&hspi1, command, 0x01, 1000);
if (ret != HAL_OK) {
return EPD_FAIL;
}
if (len > 1) {
SET_DC(GPIO_PIN_SET);
ret = HAL_SPI_Transmit(&hspi1, &command[1], len - 1, 1000);
if (ret != HAL_OK) {
return EPD_FAIL;
}
}
return EPD_OK;
}
epd_ret_t app_lcd_impl_write_data(void *handle, const uint8_t *data, uint32_t len) {
HAL_StatusTypeDef ret;
SET_DC(GPIO_PIN_SET);
ret = HAL_SPI_Transmit_DMA(&hspi1, (uint8_t *)data, len);
if (ret != HAL_OK) {
return EPD_FAIL;
}
xSemaphoreTake(s_spi_dma_semaphore, portMAX_DELAY);
return EPD_OK;
}
epd_ret_t app_lcd_impl_reset(void *handle) {
SET_RST(GPIO_PIN_RESET);
vTaskDelay(pdMS_TO_TICKS(100));
SET_RST(GPIO_PIN_SET);
return EPD_OK;
}
epd_ret_t app_lcd_impl_delay(void *handle, uint32_t msec) {
vTaskDelay(pdMS_TO_TICKS(msec));
return EPD_OK;
}
epd_ret_t app_lcd_impl_backlight(void *handle, uint8_t on) {
if (on) {
SET_BLK(GPIO_PIN_SET);
} else {
SET_BLK(GPIO_PIN_RESET);
}
return EPD_OK;
}
static void app_lcd_spi_evt_callback(SPI_HandleTypeDef *hspi) {
BaseType_t hp_woken = pdFALSE;
xSemaphoreGiveFromISR(s_spi_dma_semaphore, &hp_woken);
portYIELD_FROM_ISR(hp_woken);
}

224
src/app_lighting.c Normal file
View File

@ -0,0 +1,224 @@
#include <stdint.h>
#include <stdio.h>
#include <string.h>
/* FreeRTOS */
#include "FreeRTOS.h"
#include "queue.h"
#include "semphr.h"
#include "task.h"
/* HAL */
#include "stm32l4xx_hal.h"
/* MX */
#include "dma.h"
/* LCD */
#include "epd-spi/panel/lcd_h144c121d.h"
/* App */
#include "app_lcd_impl.h"
#include "illumination/LampArrayHidStructs.h"
#define APP_LAMP_COUNT 64
#define APP_LAMP_QUEUE_LENGTH 64
#define APP_LCD_BUF_WIDTH 30
#define APP_LCD_BUF_HEIGHT 30
typedef enum {
APP_LAMP_UPDATE_SINGLE,
APP_LAMP_UPDATE_MULTI,
} app_lighting_update_cmd_t;
typedef struct {
app_lighting_update_cmd_t cmd;
uint8_t lamp_id_start;
uint8_t lamp_id_end;
uint16_t color_565;
} app_lighting_q_item_t;
static uint16_t s_active_lamp_id = 0U;
static Position s_lamp_pos[APP_LAMP_COUNT];
static uint8_t s_lamp_buf[APP_LCD_BUF_WIDTH * APP_LCD_BUF_HEIGHT * 2];
static QueueHandle_t s_lamp_update_queue = NULL;
static SemaphoreHandle_t s_memory_fill_semaphore = NULL;
static lcd_st7789_t s_lcd = {
.cb =
{
.write_command_cb = app_lcd_impl_write_command,
.write_data_cb = app_lcd_impl_write_data,
.reset_cb = app_lcd_impl_reset,
.backlight_cb = app_lcd_impl_backlight,
.delay_cb = app_lcd_impl_delay,
},
.user_data = NULL,
};
static void app_lighting_fill_callback(DMA_HandleTypeDef *hdma);
static void app_lighting_control_task(void *parameters);
int app_lighting_init(void) {
if (app_lcd_impl_init() < 0) {
return -1;
}
if (lcd_st7789_init(&s_lcd, &lcd_h144c121d_panel_config) != EPD_OK) {
return -2;
}
s_lamp_update_queue = xQueueCreate(APP_LAMP_QUEUE_LENGTH, sizeof(app_lighting_q_item_t));
if (s_lamp_update_queue == NULL) {
return -3;
}
s_memory_fill_semaphore = xSemaphoreCreateBinary();
if (s_memory_fill_semaphore == NULL) {
return -4;
}
for (uint8_t i = 0; i < APP_LAMP_COUNT; i++) {
s_lamp_pos[i].x = (i % 8) * 10000;
s_lamp_pos[i].y = (i / 8) * 10000;
s_lamp_pos[i].z = 2500;
}
HAL_DMA_RegisterCallback(&hdma_memtomem_dma1_channel4, HAL_DMA_XFER_CPLT_CB_ID, app_lighting_fill_callback);
if (xTaskCreate(app_lighting_control_task, "LC", 512, NULL, 3, NULL) != pdPASS) {
return -5;
}
return 0;
}
uint16_t app_lighting_get_array_attributes(uint8_t *buffer) {
LampArrayAttributesReport report = {
.lampCount = APP_LAMP_COUNT,
.width = 80000,
.height = 80000,
.depth = 5000,
.lampArrayKind = 0x0A,
};
memcpy(buffer, &report, sizeof(LampArrayAttributesReport));
return sizeof(report);
}
uint16_t app_lighting_get_lamp_attributes(uint8_t *buffer) {
LampAttributesResponseReport report = {
.lampId = s_active_lamp_id, // LampId
.lampPosition = s_lamp_pos[s_active_lamp_id], // Lamp position
.updateLatency = 33000, // Lamp update interval
.lampPurposes = LAMP_PURPOSE_ACCENT, // Lamp purpose
.redLevelCount = 255, // Red level count
.blueLevelCount = 255, // Blue level count
.greenLevelCount = 255, // Green level count
.intensityLevelCount = 1, // Intensity
.isProgrammable = 1, // Is Programmable
};
memcpy(buffer, &report, sizeof(LampAttributesResponseReport));
s_active_lamp_id++;
if (s_active_lamp_id == APP_LAMP_COUNT) {
s_active_lamp_id = 0;
}
return sizeof(report);
}
void app_lighting_set_lamp_attributes_req(const uint8_t *buffer) {
LampAttributesRequestReport *report = (LampAttributesRequestReport *)buffer;
s_active_lamp_id = report->lampId;
}
void app_lighting_set_lamp_multi_update(const uint8_t *buffer) {
LampMultiUpdateReport *report = (LampMultiUpdateReport *)buffer;
for (int i = 0; i < report->lampCount; i++) {
uint16_t color_565 = 0U;
color_565 |= ((report->colors[i].red >> 3) & 0x1F) << 11U;
color_565 |= ((report->colors[i].green >> 2) & 0x3F) << 5U;
color_565 |= ((report->colors[i].blue) >> 3) & 0x1F;
app_lighting_q_item_t lc_qi = {
.cmd = APP_LAMP_UPDATE_SINGLE,
.color_565 = color_565,
.lamp_id_start = report->lampIds[i],
};
xQueueSend(s_lamp_update_queue, &lc_qi, pdMS_TO_TICKS(20));
}
}
void app_lighting_set_lamp_range_update(const uint8_t *buffer) {
LampRangeUpdateReport *report = (LampRangeUpdateReport *)buffer;
uint16_t color_565 = 0U;
color_565 |= ((report->color.red >> 3) & 0x1F) << 11U;
color_565 |= ((report->color.green >> 2) & 0x3F) << 5U;
color_565 |= ((report->color.blue) >> 3) & 0x1F;
app_lighting_q_item_t lc_qi = {
.cmd = APP_LAMP_UPDATE_MULTI,
.color_565 = color_565,
.lamp_id_start = report->lampIdStart,
.lamp_id_end = report->lampIdEnd,
};
xQueueSend(s_lamp_update_queue, &lc_qi, pdMS_TO_TICKS(20));
}
void app_lighting_set_lamp_array_control(const uint8_t *buffer) {
}
static void app_lighting_fill_lcd_block(uint16_t color, uint8_t *buf) {
uint16_t color_swapped = ((color & 0xFFU) << 8U) | (color >> 8U);
HAL_DMA_Start_IT(&hdma_memtomem_dma1_channel4, (uint32_t)&color_swapped, (uint32_t)buf,
(APP_LCD_BUF_WIDTH * APP_LCD_BUF_HEIGHT));
xSemaphoreTake(s_memory_fill_semaphore, portMAX_DELAY);
}
static void app_lighting_update_lamp(uint8_t id, const uint8_t *buf) {
epd_coord_t coord = {
.x_start = (id % 8) * APP_LCD_BUF_WIDTH,
.x_end = ((id % 8) * APP_LCD_BUF_WIDTH + APP_LCD_BUF_WIDTH - 1),
.y_start = (id / 8) * APP_LCD_BUF_HEIGHT,
.y_end = ((id / 8) * APP_LCD_BUF_HEIGHT + APP_LCD_BUF_HEIGHT - 1),
};
lcd_st7789_load(&s_lcd, &coord, buf);
}
static void app_lighting_fill_callback(DMA_HandleTypeDef *hdma) {
BaseType_t hp_woken = pdFALSE;
xSemaphoreGiveFromISR(s_memory_fill_semaphore, &hp_woken);
portYIELD_FROM_ISR(hp_woken);
}
static void app_lighting_control_task(void *parameters) {
app_lighting_q_item_t lc_qi;
lcd_st7789_enable_display(&s_lcd, true);
for (;;) {
xQueueReceive(s_lamp_update_queue, &lc_qi, portMAX_DELAY);
app_lighting_fill_lcd_block(lc_qi.color_565, s_lamp_buf);
HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin);
if (lc_qi.cmd == APP_LAMP_UPDATE_SINGLE) {
app_lighting_update_lamp(lc_qi.lamp_id_start, s_lamp_buf);
} else {
for (int i = lc_qi.lamp_id_start; i < (lc_qi.lamp_id_end + 1); i++) {
app_lighting_update_lamp(i, s_lamp_buf);
}
}
}
}

9
src/app_syscalls.c Normal file
View File

@ -0,0 +1,9 @@
#include <stdio.h>
#include "usart.h"
int _write(int fd, char *buf, int count) {
HAL_UART_Transmit(&hlpuart1, (uint8_t *)buf, count, 1000);
return count;
}

155
src/app_tusb.c Normal file
View File

@ -0,0 +1,155 @@
#include "tusb.h"
/* HAL */
#include "stm32l4xx_hal.h"
/* App */
#include "app_lighting.h"
#include "app_tusb.h"
#include "app_tusb_descriptors.h"
static void app_tusb_task(void *parameters);
static int app_tusb_peripheral_init(void);
int app_tusb_init(void) {
if (app_tusb_peripheral_init() < 0) {
return -1;
}
NVIC_SetPriority(OTG_FS_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY + 1);
NVIC_EnableIRQ(OTG_FS_IRQn);
if (tud_init(BOARD_TUD_RHPORT) == false) {
return -2;
}
if (xTaskCreate(app_tusb_task, "TU", 1024, NULL, 4, NULL) != pdPASS) {
return -3;
}
return 0;
}
void app_tusb_irq_handler(void) {
tud_int_handler(BOARD_TUD_RHPORT);
}
static void app_tusb_task(void *parameters) {
for (;;) {
tud_task();
}
}
static int app_tusb_peripheral_init(void) {
RCC_OscInitTypeDef osc_init = {0};
osc_init.OscillatorType = RCC_OSCILLATORTYPE_HSI48;
osc_init.HSI48State = RCC_HSI48_ON;
if (HAL_RCC_OscConfig(&osc_init) != HAL_OK) {
return -1;
}
RCC_PeriphCLKInitTypeDef peri_clk_init = {0};
peri_clk_init.PeriphClockSelection = RCC_PERIPHCLK_USB;
peri_clk_init.UsbClockSelection = RCC_USBCLKSOURCE_HSI48;
if (HAL_RCCEx_PeriphCLKConfig(&peri_clk_init) != HAL_OK) {
return -2;
}
__HAL_RCC_USB_OTG_FS_CLK_ENABLE();
HAL_PWREx_EnableVddUSB();
GPIO_InitTypeDef gpio_init = {0};
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
/* USB DP/DM pins */
gpio_init.Pin = GPIO_PIN_11 | GPIO_PIN_12;
gpio_init.Mode = GPIO_MODE_AF_PP;
gpio_init.Pull = GPIO_NOPULL;
gpio_init.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
gpio_init.Alternate = GPIO_AF10_OTG_FS;
HAL_GPIO_Init(GPIOA, &gpio_init);
return 0;
}
/* TinyUSB Descriptor Callbacks */
uint8_t const *tud_descriptor_device_cb(void) {
return (const uint8_t *)&s_tud_desc_dev;
}
uint8_t const *tud_descriptor_configuration_cb(uint8_t index) {
return s_tud_desc_configuration;
}
uint16_t const *tud_descriptor_string_cb(uint8_t index, uint16_t langid) {
switch (index) {
case APP_TUSB_STRING_ID_LANG:
return s_tud_desc_string_lang;
break;
case APP_TUSB_STRING_ID_MFG:
return s_tud_desc_string_mfg;
break;
case APP_TUSB_STRING_ID_PRODUCT:
return s_tud_desc_string_product;
break;
case APP_TUSB_STRING_ID_SERIAL:
return s_tud_desc_string_serial;
break;
default:
return s_tud_desc_string_unknown;
break;
}
}
uint8_t const *tud_hid_descriptor_report_cb(uint8_t instance) {
return s_tud_desc_hid_report;
}
uint16_t tud_hid_get_report_cb(uint8_t instance, uint8_t report_id, hid_report_type_t report_type, uint8_t *buffer,
uint16_t reqlen) {
switch (report_id) {
case REPORT_ID_LIGHTING_LAMP_ARRAY_ATTRIBUTES: {
return app_lighting_get_array_attributes(buffer);
break;
}
case REPORT_ID_LIGHTING_LAMP_ATTRIBUTES_RESPONSE: {
return app_lighting_get_lamp_attributes(buffer);
break;
}
default: {
break;
}
}
return 0;
}
void tud_hid_set_report_cb(uint8_t instance, uint8_t report_id, hid_report_type_t report_type, uint8_t const *buffer,
uint16_t bufsize) {
switch (report_id) {
case REPORT_ID_LIGHTING_LAMP_ATTRIBUTES_REQUEST: {
app_lighting_set_lamp_attributes_req(buffer);
break;
}
case REPORT_ID_LIGHTING_LAMP_MULTI_UPDATE: {
app_lighting_set_lamp_multi_update(buffer);
break;
}
case REPORT_ID_LIGHTING_LAMP_RANGE_UPDATE: {
app_lighting_set_lamp_range_update(buffer);
}
case REPORT_ID_LIGHTING_LAMP_ARRAY_CONTROL: {
app_lighting_set_lamp_array_control(buffer);
break;
}
default: {
break;
}
}
}

View File

@ -1,19 +1,56 @@
#include <stdint.h>
#include <stdio.h>
/* FreeRTOS */
#include "FreeRTOS.h"
#include "task.h"
#include "timers.h"
/* MX */
#include "dma.h"
#include "gpio.h"
#include "main.h"
#include "spi.h"
#include "usart.h"
/* App */
#include "app_lighting.h"
#include "app_tusb.h"
void SystemClock_Config(void);
static void app_delayed_start(TimerHandle_t tmr_handle);
int main(void) {
/* HAL */
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_LPUART1_UART_Init();
MX_DMA_Init();
MX_SPI1_Init();
TimerHandle_t tmr = xTimerCreate("INIT_T", pdMS_TO_TICKS(50), pdFALSE, NULL, app_delayed_start);
if (tmr == NULL) {
goto dead_loop;
}
xTimerStart(tmr, 0);
vTaskStartScheduler();
dead_loop:
for (;;) {
HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin);
HAL_Delay(500);
__WFI();
}
}
static void app_delayed_start(TimerHandle_t tmr_handle) {
if (app_lighting_init() < 0) {
return;
}
if (app_tusb_init() < 0) {
return;
}
}