From d424d3a7d3d25372f93659615ea08337d6e9c69f Mon Sep 17 00:00:00 2001 From: Johnny Hsu Date: Sat, 9 Nov 2024 19:53:07 +0100 Subject: [PATCH] added LED code. Further Code restructure --- FT24-SLS/~FT24-SLS.kicad_pcb.lck | 1 + FT24-SLS/~FT24-SLS.kicad_sch.lck | 1 + Software/Core/Inc/farbe.h | 7 ++++ Software/Core/Inc/led.h | 11 +++++++ Software/Core/Inc/main.h | 2 +- Software/Core/Inc/stm32f0xx_hal_conf.h | 2 +- Software/Core/Inc/stm32f0xx_it.h | 1 + Software/Core/Src/adc.c | 9 +++++- Software/Core/Src/led.c | 45 ++++++++++++++++++++++++++ Software/Core/Src/main.c | 39 +++++++++++++--------- Software/Core/Src/stm32f0xx_hal_msp.c | 7 +++- Software/Core/Src/stm32f0xx_it.c | 16 ++++++++- Software/Makefile | 28 ++++++++-------- Software/SLS.ioc | 12 +++++-- 14 files changed, 145 insertions(+), 36 deletions(-) create mode 100644 FT24-SLS/~FT24-SLS.kicad_pcb.lck create mode 100644 FT24-SLS/~FT24-SLS.kicad_sch.lck create mode 100644 Software/Core/Inc/farbe.h create mode 100644 Software/Core/Inc/led.h create mode 100644 Software/Core/Src/led.c diff --git a/FT24-SLS/~FT24-SLS.kicad_pcb.lck b/FT24-SLS/~FT24-SLS.kicad_pcb.lck new file mode 100644 index 0000000..e15e945 --- /dev/null +++ b/FT24-SLS/~FT24-SLS.kicad_pcb.lck @@ -0,0 +1 @@ +{"hostname":"eggyhitsrock-fedora","username":"chiangni"} \ No newline at end of file diff --git a/FT24-SLS/~FT24-SLS.kicad_sch.lck b/FT24-SLS/~FT24-SLS.kicad_sch.lck new file mode 100644 index 0000000..e15e945 --- /dev/null +++ b/FT24-SLS/~FT24-SLS.kicad_sch.lck @@ -0,0 +1 @@ +{"hostname":"eggyhitsrock-fedora","username":"chiangni"} \ No newline at end of file diff --git a/Software/Core/Inc/farbe.h b/Software/Core/Inc/farbe.h new file mode 100644 index 0000000..53c7a62 --- /dev/null +++ b/Software/Core/Inc/farbe.h @@ -0,0 +1,7 @@ +#ifndef INC_FARBE +#define INC_FARBE + +#define HEART_BEAT 0x0000FFFF +#define SLSERROR 0x00FF0000 + +#endif \ No newline at end of file diff --git a/Software/Core/Inc/led.h b/Software/Core/Inc/led.h new file mode 100644 index 0000000..85bd9f9 --- /dev/null +++ b/Software/Core/Inc/led.h @@ -0,0 +1,11 @@ +#ifndef INC_LED +#define INC_LED + +#include + +#include "stm32f0xx_hal_tim.h" + +void led_init(TIM_HandleTypeDef* htim); +void blink(TIM_HandleTypeDef* htim, int32_t color); + +#endif \ No newline at end of file diff --git a/Software/Core/Inc/main.h b/Software/Core/Inc/main.h index 3d5fc63..e883cb9 100644 --- a/Software/Core/Inc/main.h +++ b/Software/Core/Inc/main.h @@ -68,4 +68,4 @@ void Error_Handler(void); } #endif -#endif /* __MAIN_H */ \ No newline at end of file +#endif /* __MAIN_H */ diff --git a/Software/Core/Inc/stm32f0xx_hal_conf.h b/Software/Core/Inc/stm32f0xx_hal_conf.h index 0babd97..9db9553 100644 --- a/Software/Core/Inc/stm32f0xx_hal_conf.h +++ b/Software/Core/Inc/stm32f0xx_hal_conf.h @@ -73,7 +73,7 @@ * (when HSE is used as system clock source, directly or through the PLL). */ #if !defined (HSE_VALUE) - #define HSE_VALUE ((uint32_t)8000000) /*!< Value of the External oscillator in Hz */ + #define HSE_VALUE ((uint32_t)12000000) /*!< Value of the External oscillator in Hz */ #endif /* HSE_VALUE */ /** diff --git a/Software/Core/Inc/stm32f0xx_it.h b/Software/Core/Inc/stm32f0xx_it.h index 29d1034..317e5aa 100644 --- a/Software/Core/Inc/stm32f0xx_it.h +++ b/Software/Core/Inc/stm32f0xx_it.h @@ -51,6 +51,7 @@ void HardFault_Handler(void); void SVC_Handler(void); void PendSV_Handler(void); void SysTick_Handler(void); +void ADC1_IRQHandler(void); /* USER CODE BEGIN EFP */ /* USER CODE END EFP */ diff --git a/Software/Core/Src/adc.c b/Software/Core/Src/adc.c index c9a8261..e164b98 100644 --- a/Software/Core/Src/adc.c +++ b/Software/Core/Src/adc.c @@ -1,9 +1,15 @@ #include #include "can-halal.h" +#include "led.h" +#include "farbe.h" #include "stm32f0xx_hal_adc.h" +#include "stm32f0xx_hal_tim.h" + +extern TIM_HandleTypeDef htim2; int16_t id = 0x200; +int32_t color = HEART_BEAT; int32_t adcRes = 0; void adc_init(ADC_HandleTypeDef* hadc){ @@ -15,7 +21,8 @@ void adc_loop(ADC_HandleTypeDef* hadc){ static uint8_t data[8]; ftcan_marshal_unsigned(data, adcRes, 4); ftcan_transmit(id, data, sizeof(data)); - HAL_Delay(5); + + blink(&htim2, color); } void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc){ diff --git a/Software/Core/Src/led.c b/Software/Core/Src/led.c new file mode 100644 index 0000000..8590082 --- /dev/null +++ b/Software/Core/Src/led.c @@ -0,0 +1,45 @@ +#include + +#include "farbe.h" +#include "stm32f042x6.h" +#include "stm32f0xx_hal.h" +#include "stm32f0xx_hal_tim.h" + +void led_init(TIM_HandleTypeDef* htim) { + HAL_TIM_PWM_Start(htim, TIM_CHANNEL_1); + HAL_TIM_PWM_Start(htim, TIM_CHANNEL_2); + HAL_TIM_PWM_Start(htim, TIM_CHANNEL_3); + + int32_t color = SLSERROR; + + int32_t Blue = color & 0x000000FF; + int32_t Green = (color & 0x0000FF00) >> 8; + int32_t Red = (color & 0x00FF0000) >> 16; + + TIM2->CCR1 = Green; + TIM2->CCR2 = Red; + TIM2->CCR3 = Blue; + HAL_Delay(1000); +} + +void blink(TIM_HandleTypeDef* htim, int32_t color) { + int32_t Blue = color & 0x000000FF; + int32_t Green = (color & 0x0000FF00) >> 8; + int32_t Red = (color & 0x00FF0000) >> 16; + + TIM2->CCR1 = Green; + TIM2->CCR2 = Red; + TIM2->CCR3 = Blue; + + HAL_TIM_PWM_Stop(htim, TIM_CHANNEL_1); + HAL_TIM_PWM_Stop(htim, TIM_CHANNEL_2); + HAL_TIM_PWM_Stop(htim, TIM_CHANNEL_3); + + HAL_Delay(500); + + HAL_TIM_PWM_Start(htim, TIM_CHANNEL_1); + HAL_TIM_PWM_Start(htim, TIM_CHANNEL_2); + HAL_TIM_PWM_Start(htim, TIM_CHANNEL_3); + + HAL_Delay(500); +} \ No newline at end of file diff --git a/Software/Core/Src/main.c b/Software/Core/Src/main.c index 023a9be..7568fd3 100644 --- a/Software/Core/Src/main.c +++ b/Software/Core/Src/main.c @@ -22,6 +22,9 @@ /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ #include "adc.h" +#include "led.h" +#include "can-halal.h" +#include "farbe.h" /* USER CODE END Includes */ /* Private typedef -----------------------------------------------------------*/ @@ -71,6 +74,7 @@ static void MX_TIM2_Init(void); */ int main(void) { + /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ @@ -98,8 +102,10 @@ int main(void) MX_TIM2_Init(); /* USER CODE BEGIN 2 */ adc_init(&hadc); + led_init(&htim2); + ftcan_init(&hcan); /* USER CODE END 2 */ - + /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) @@ -108,6 +114,7 @@ int main(void) /* USER CODE BEGIN 3 */ adc_loop(&hadc); + } /* USER CODE END 3 */ } @@ -124,12 +131,14 @@ void SystemClock_Config(void) /** Initializes the RCC Oscillators according to the specified parameters * in the RCC_OscInitTypeDef structure. */ - RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_HSI14; - RCC_OscInitStruct.HSIState = RCC_HSI_ON; + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI14|RCC_OSCILLATORTYPE_HSE; + RCC_OscInitStruct.HSEState = RCC_HSE_ON; RCC_OscInitStruct.HSI14State = RCC_HSI14_ON; - RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; RCC_OscInitStruct.HSI14CalibrationValue = 16; - RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; + RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL4; + RCC_OscInitStruct.PLL.PREDIV = RCC_PREDIV_DIV3; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); @@ -139,7 +148,7 @@ void SystemClock_Config(void) */ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK |RCC_CLOCKTYPE_PCLK1; - RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; @@ -227,15 +236,15 @@ static void MX_CAN_Init(void) /* USER CODE END CAN_Init 1 */ hcan.Instance = CAN; - hcan.Init.Prescaler = 16; + hcan.Init.Prescaler = 2; hcan.Init.Mode = CAN_MODE_NORMAL; hcan.Init.SyncJumpWidth = CAN_SJW_1TQ; - hcan.Init.TimeSeg1 = CAN_BS1_1TQ; - hcan.Init.TimeSeg2 = CAN_BS2_1TQ; + hcan.Init.TimeSeg1 = CAN_BS1_13TQ; + hcan.Init.TimeSeg2 = CAN_BS2_2TQ; hcan.Init.TimeTriggeredMode = DISABLE; - hcan.Init.AutoBusOff = DISABLE; + hcan.Init.AutoBusOff = ENABLE; hcan.Init.AutoWakeUp = DISABLE; - hcan.Init.AutoRetransmission = DISABLE; + hcan.Init.AutoRetransmission = ENABLE; hcan.Init.ReceiveFifoLocked = DISABLE; hcan.Init.TransmitFifoPriority = DISABLE; if (HAL_CAN_Init(&hcan) != HAL_OK) @@ -268,11 +277,11 @@ static void MX_TIM2_Init(void) /* USER CODE END TIM2_Init 1 */ htim2.Instance = TIM2; - htim2.Init.Prescaler = 0; + htim2.Init.Prescaler = 16-1; htim2.Init.CounterMode = TIM_COUNTERMODE_UP; - htim2.Init.Period = 4294967295; + htim2.Init.Period = 255; htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; - htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; + htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE; if (HAL_TIM_Base_Init(&htim2) != HAL_OK) { Error_Handler(); @@ -294,7 +303,7 @@ static void MX_TIM2_Init(void) } sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.Pulse = 0; - sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; + sConfigOC.OCPolarity = TIM_OCPOLARITY_LOW; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1) != HAL_OK) { diff --git a/Software/Core/Src/stm32f0xx_hal_msp.c b/Software/Core/Src/stm32f0xx_hal_msp.c index f04d789..f0d0afe 100644 --- a/Software/Core/Src/stm32f0xx_hal_msp.c +++ b/Software/Core/Src/stm32f0xx_hal_msp.c @@ -20,7 +20,6 @@ /* Includes ------------------------------------------------------------------*/ #include "main.h" - /* USER CODE BEGIN Includes */ /* USER CODE END Includes */ @@ -65,6 +64,7 @@ void HAL_TIM_MspPostInit(TIM_HandleTypeDef *htim); */ void HAL_MspInit(void) { + /* USER CODE BEGIN MspInit 0 */ /* USER CODE END MspInit 0 */ @@ -106,6 +106,9 @@ void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc) GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + /* ADC1 interrupt Init */ + HAL_NVIC_SetPriority(ADC1_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(ADC1_IRQn); /* USER CODE BEGIN ADC1_MspInit 1 */ /* USER CODE END ADC1_MspInit 1 */ @@ -135,6 +138,8 @@ void HAL_ADC_MspDeInit(ADC_HandleTypeDef* hadc) */ HAL_GPIO_DeInit(GPIOA, GPIO_PIN_0|GPIO_PIN_1); + /* ADC1 interrupt DeInit */ + HAL_NVIC_DisableIRQ(ADC1_IRQn); /* USER CODE BEGIN ADC1_MspDeInit 1 */ /* USER CODE END ADC1_MspDeInit 1 */ diff --git a/Software/Core/Src/stm32f0xx_it.c b/Software/Core/Src/stm32f0xx_it.c index db62670..0b67aee 100644 --- a/Software/Core/Src/stm32f0xx_it.c +++ b/Software/Core/Src/stm32f0xx_it.c @@ -55,7 +55,7 @@ /* USER CODE END 0 */ /* External variables --------------------------------------------------------*/ - +extern ADC_HandleTypeDef hadc; /* USER CODE BEGIN EV */ /* USER CODE END EV */ @@ -140,6 +140,20 @@ void SysTick_Handler(void) /* please refer to the startup file (startup_stm32f0xx.s). */ /******************************************************************************/ +/** + * @brief This function handles ADC interrupt. + */ +void ADC1_IRQHandler(void) +{ + /* USER CODE BEGIN ADC1_IRQn 0 */ + + /* USER CODE END ADC1_IRQn 0 */ + HAL_ADC_IRQHandler(&hadc); + /* USER CODE BEGIN ADC1_IRQn 1 */ + + /* USER CODE END ADC1_IRQn 1 */ +} + /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ diff --git a/Software/Makefile b/Software/Makefile index a49176f..6b4d4ec 100644 --- a/Software/Makefile +++ b/Software/Makefile @@ -1,5 +1,5 @@ ########################################################################################################################## -# File automatically-generated by tool: [projectgenerator] version: [4.3.0-B58] date: [Sun Nov 03 12:56:00 CET 2024] +# File automatically-generated by tool: [projectgenerator] version: [4.3.0-B58] date: [Sat Nov 09 19:46:36 CET 2024] ########################################################################################################################## # ------------------------------------------------ @@ -59,7 +59,8 @@ Drivers/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_tim.c \ Drivers/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_tim_ex.c \ Core/Src/system_stm32f0xx.c \ Core/Src/sysmem.c \ -Core/Src/syscalls.c +Core/Src/syscalls.c \ +Core/Lib/can-halal.c # ASM sources ASM_SOURCES = \ @@ -85,7 +86,7 @@ SZ = $(PREFIX)size endif HEX = $(CP) -O ihex BIN = $(CP) -O binary -S - + ####################################### # CFLAGS ####################################### @@ -103,7 +104,7 @@ MCU = $(CPU) -mthumb $(FPU) $(FLOAT-ABI) # macros for gcc # AS defines -AS_DEFS = +AS_DEFS = # C defines C_DEFS = \ @@ -112,11 +113,12 @@ C_DEFS = \ # AS includes -AS_INCLUDES = +AS_INCLUDES = # C includes C_INCLUDES = \ -ICore/Inc \ +-ICore/Lib/can-halal \ -IDrivers/STM32F0xx_HAL_Driver/Inc \ -IDrivers/STM32F0xx_HAL_Driver/Inc/Legacy \ -IDrivers/CMSIS/Device/ST/STM32F0xx/Include \ @@ -144,8 +146,8 @@ CFLAGS += -MMD -MP -MF"$(@:%.o=%.d)" LDSCRIPT = STM32F042K6Tx_FLASH.ld # libraries -LIBS = -lc -lm -lnosys -LIBDIR = +LIBS = -lc -lm -lnosys +LIBDIR = LDFLAGS = $(MCU) -specs=nano.specs -T$(LDSCRIPT) $(LIBDIR) $(LIBS) -Wl,-Map=$(BUILD_DIR)/$(TARGET).map,--cref -Wl,--gc-sections # default action: build all @@ -162,7 +164,7 @@ vpath %.c $(sort $(dir $(C_SOURCES))) OBJECTS += $(addprefix $(BUILD_DIR)/,$(notdir $(ASM_SOURCES:.s=.o))) vpath %.s $(sort $(dir $(ASM_SOURCES))) -$(BUILD_DIR)/%.o: %.c Makefile | $(BUILD_DIR) +$(BUILD_DIR)/%.o: %.c Makefile | $(BUILD_DIR) $(CC) -c $(CFLAGS) -Wa,-a,-ad,-alms=$(BUILD_DIR)/$(notdir $(<:.c=.lst)) $< -o $@ $(BUILD_DIR)/%.o: %.s Makefile | $(BUILD_DIR) @@ -174,19 +176,19 @@ $(BUILD_DIR)/$(TARGET).elf: $(OBJECTS) Makefile $(BUILD_DIR)/%.hex: $(BUILD_DIR)/%.elf | $(BUILD_DIR) $(HEX) $< $@ - + $(BUILD_DIR)/%.bin: $(BUILD_DIR)/%.elf | $(BUILD_DIR) - $(BIN) $< $@ - + $(BIN) $< $@ + $(BUILD_DIR): - mkdir $@ + mkdir $@ ####################################### # clean up ####################################### clean: -rm -fR $(BUILD_DIR) - + ####################################### # dependencies ####################################### diff --git a/Software/SLS.ioc b/Software/SLS.ioc index 7c0b712..7a06f0d 100644 --- a/Software/SLS.ioc +++ b/Software/SLS.ioc @@ -1,6 +1,6 @@ #MicroXplorer Configuration settings - do not modify -CAD.formats= -CAD.pinconfig= +CAD.formats=[] +CAD.pinconfig=Dual CAD.provider= CAN.ABOM=ENABLE CAN.BS1=CAN_BS1_13TQ @@ -130,10 +130,16 @@ SH.S_TIM2_CH2.0=TIM2_CH2,PWM Generation2 CH2 SH.S_TIM2_CH2.ConfNb=1 SH.S_TIM2_CH3.0=TIM2_CH3,PWM Generation3 CH3 SH.S_TIM2_CH3.ConfNb=1 +TIM2.AutoReloadPreload=TIM_AUTORELOAD_PRELOAD_ENABLE TIM2.Channel-PWM\ Generation1\ CH1=TIM_CHANNEL_1 TIM2.Channel-PWM\ Generation2\ CH2=TIM_CHANNEL_2 TIM2.Channel-PWM\ Generation3\ CH3=TIM_CHANNEL_3 -TIM2.IPParameters=Channel-PWM Generation1 CH1,Channel-PWM Generation2 CH2,Channel-PWM Generation3 CH3 +TIM2.IPParameters=Channel-PWM Generation1 CH1,Channel-PWM Generation2 CH2,Channel-PWM Generation3 CH3,Period,AutoReloadPreload,Prescaler,OCPolarity_1,OCPolarity_2,OCPolarity_3 +TIM2.OCPolarity_1=TIM_OCPOLARITY_LOW +TIM2.OCPolarity_2=TIM_OCPOLARITY_LOW +TIM2.OCPolarity_3=TIM_OCPOLARITY_LOW +TIM2.Period=255 +TIM2.Prescaler=16-1 VP_SYS_VS_Systick.Mode=SysTick VP_SYS_VS_Systick.Signal=SYS_VS_Systick VP_TIM2_VS_ClockSourceINT.Mode=Internal