From 6151b968a5e85325e1e6c7786be84762ddfb6f1f Mon Sep 17 00:00:00 2001 From: Wolfgang Hottgenroth Date: Mon, 24 Oct 2016 17:07:50 +0200 Subject: [PATCH] sine works --- cubemx/output/inverter2/Inc/mxconstants.h | 4 + .../output/inverter2/Inc/stm32f1xx_hal_conf.h | 2 +- cubemx/output/inverter2/Inc/stm32f1xx_it.h | 2 + cubemx/output/inverter2/Src/main.c | 165 ++++++++++++++--- .../output/inverter2/Src/stm32f1xx_hal_msp.c | 118 +++++++++++- cubemx/output/inverter2/Src/stm32f1xx_it.c | 30 ++++ cubemx/output/inverter2/inverter2.ioc | 104 +++++++---- include/mxconstants.h | 4 + include/stm32f1xx_hal_conf.h | 2 +- include/stm32f1xx_it.h | 2 + my_src/main2.c | 68 +++++-- my_src/main2.h | 1 + src/main.c | 168 +++++++++++++++--- src/main.c-bak | 165 ++++++++++++++--- src/stm32f1xx_hal_msp.c | 118 +++++++++++- src/stm32f1xx_it.c | 30 ++++ tools/insertMyCode.pl | 1 + 17 files changed, 864 insertions(+), 120 deletions(-) diff --git a/cubemx/output/inverter2/Inc/mxconstants.h b/cubemx/output/inverter2/Inc/mxconstants.h index ff1a158..56c883d 100644 --- a/cubemx/output/inverter2/Inc/mxconstants.h +++ b/cubemx/output/inverter2/Inc/mxconstants.h @@ -49,6 +49,10 @@ #define LED4_PIN_GPIO_Port GPIOE #define LED_PIN_Pin GPIO_PIN_13 #define LED_PIN_GPIO_Port GPIOC +#define BridgePolarity_Pin GPIO_PIN_0 +#define BridgePolarity_GPIO_Port GPIOC +#define ERROR_PIN_Pin GPIO_PIN_10 +#define ERROR_PIN_GPIO_Port GPIOB /* USER CODE BEGIN Private defines */ /* USER CODE END Private defines */ diff --git a/cubemx/output/inverter2/Inc/stm32f1xx_hal_conf.h b/cubemx/output/inverter2/Inc/stm32f1xx_hal_conf.h index a3c1293..180f1d8 100644 --- a/cubemx/output/inverter2/Inc/stm32f1xx_hal_conf.h +++ b/cubemx/output/inverter2/Inc/stm32f1xx_hal_conf.h @@ -56,7 +56,7 @@ /*#define HAL_CORTEX_MODULE_ENABLED */ /*#define HAL_CRC_MODULE_ENABLED */ /*#define HAL_DAC_MODULE_ENABLED */ -/*#define HAL_DMA_MODULE_ENABLED */ +#define HAL_DMA_MODULE_ENABLED /*#define HAL_ETH_MODULE_ENABLED */ /*#define HAL_FLASH_MODULE_ENABLED */ #define HAL_GPIO_MODULE_ENABLED diff --git a/cubemx/output/inverter2/Inc/stm32f1xx_it.h b/cubemx/output/inverter2/Inc/stm32f1xx_it.h index 8b7b204..4fd5431 100644 --- a/cubemx/output/inverter2/Inc/stm32f1xx_it.h +++ b/cubemx/output/inverter2/Inc/stm32f1xx_it.h @@ -54,7 +54,9 @@ void SVC_Handler(void); void DebugMon_Handler(void); void PendSV_Handler(void); void SysTick_Handler(void); +void DMA1_Channel5_IRQHandler(void); void TIM1_CC_IRQHandler(void); +void TIM2_IRQHandler(void); #ifdef __cplusplus } diff --git a/cubemx/output/inverter2/Src/main.c b/cubemx/output/inverter2/Src/main.c index 593b997..d4b2000 100644 --- a/cubemx/output/inverter2/Src/main.c +++ b/cubemx/output/inverter2/Src/main.c @@ -42,6 +42,9 @@ RTC_HandleTypeDef hrtc; TIM_HandleTypeDef htim1; TIM_HandleTypeDef htim2; +TIM_HandleTypeDef htim3; +TIM_HandleTypeDef htim4; +DMA_HandleTypeDef hdma_tim2_ch1; /* USER CODE BEGIN PV */ /* Private variables ---------------------------------------------------------*/ @@ -52,9 +55,12 @@ TIM_HandleTypeDef htim2; void SystemClock_Config(void); void Error_Handler(void); static void MX_GPIO_Init(void); +static void MX_DMA_Init(void); static void MX_RTC_Init(void); static void MX_TIM1_Init(void); static void MX_TIM2_Init(void); +static void MX_TIM3_Init(void); +static void MX_TIM4_Init(void); void HAL_TIM_MspPostInit(TIM_HandleTypeDef *htim); @@ -85,9 +91,12 @@ int main(void) /* Initialize all configured peripherals */ MX_GPIO_Init(); + MX_DMA_Init(); MX_RTC_Init(); MX_TIM1_Init(); MX_TIM2_Init(); + MX_TIM3_Init(); + MX_TIM4_Init(); /* USER CODE BEGIN 2 */ @@ -241,7 +250,7 @@ static void MX_TIM1_Init(void) Error_Handler(); } - sConfigOC.OCMode = TIM_OCMODE_TIMING; + sConfigOC.OCMode = TIM_OCMODE_TOGGLE; sConfigOC.Pulse = 1000; sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH; @@ -280,7 +289,7 @@ static void MX_TIM2_Init(void) htim2.Instance = TIM2; htim2.Init.Prescaler = 72; htim2.Init.CounterMode = TIM_COUNTERMODE_UP; - htim2.Init.Period = 1000; + htim2.Init.Period = 5000; htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; if (HAL_TIM_Base_Init(&htim2) != HAL_OK) { @@ -293,7 +302,7 @@ static void MX_TIM2_Init(void) Error_Handler(); } - if (HAL_TIM_OC_Init(&htim2) != HAL_OK) + if (HAL_TIM_PWM_Init(&htim2) != HAL_OK) { Error_Handler(); } @@ -305,23 +314,11 @@ static void MX_TIM2_Init(void) Error_Handler(); } - sConfigOC.OCMode = TIM_OCMODE_TIMING; - sConfigOC.Pulse = 0; + sConfigOC.OCMode = TIM_OCMODE_PWM1; + sConfigOC.Pulse = 1000; sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; - if (HAL_TIM_OC_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1) != HAL_OK) - { - Error_Handler(); - } - - sConfigOC.OCMode = TIM_OCMODE_FORCED_ACTIVE; - if (HAL_TIM_OC_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_2) != HAL_OK) - { - Error_Handler(); - } - - sConfigOC.OCMode = TIM_OCMODE_FORCED_INACTIVE; - if (HAL_TIM_OC_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_3) != HAL_OK) + if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1) != HAL_OK) { Error_Handler(); } @@ -330,6 +327,119 @@ static void MX_TIM2_Init(void) } +/* TIM3 init function */ +static void MX_TIM3_Init(void) +{ + + TIM_ClockConfigTypeDef sClockSourceConfig; + TIM_MasterConfigTypeDef sMasterConfig; + TIM_OC_InitTypeDef sConfigOC; + + htim3.Instance = TIM3; + htim3.Init.Prescaler = 72; + htim3.Init.CounterMode = TIM_COUNTERMODE_UP; + htim3.Init.Period = 5000; + htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; + if (HAL_TIM_Base_Init(&htim3) != HAL_OK) + { + Error_Handler(); + } + + sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; + if (HAL_TIM_ConfigClockSource(&htim3, &sClockSourceConfig) != HAL_OK) + { + Error_Handler(); + } + + if (HAL_TIM_PWM_Init(&htim3) != HAL_OK) + { + Error_Handler(); + } + + sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; + sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; + if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK) + { + Error_Handler(); + } + + sConfigOC.OCMode = TIM_OCMODE_PWM1; + sConfigOC.Pulse = 2000; + sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; + sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; + if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1) != HAL_OK) + { + Error_Handler(); + } + + HAL_TIM_MspPostInit(&htim3); + +} + +/* TIM4 init function */ +static void MX_TIM4_Init(void) +{ + + TIM_ClockConfigTypeDef sClockSourceConfig; + TIM_MasterConfigTypeDef sMasterConfig; + TIM_OC_InitTypeDef sConfigOC; + + htim4.Instance = TIM4; + htim4.Init.Prescaler = 72; + htim4.Init.CounterMode = TIM_COUNTERMODE_UP; + htim4.Init.Period = 5000; + htim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; + if (HAL_TIM_Base_Init(&htim4) != HAL_OK) + { + Error_Handler(); + } + + sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; + if (HAL_TIM_ConfigClockSource(&htim4, &sClockSourceConfig) != HAL_OK) + { + Error_Handler(); + } + + if (HAL_TIM_PWM_Init(&htim4) != HAL_OK) + { + Error_Handler(); + } + + sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; + sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; + if (HAL_TIMEx_MasterConfigSynchronization(&htim4, &sMasterConfig) != HAL_OK) + { + Error_Handler(); + } + + sConfigOC.OCMode = TIM_OCMODE_PWM1; + sConfigOC.Pulse = 3000; + sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; + sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; + if (HAL_TIM_PWM_ConfigChannel(&htim4, &sConfigOC, TIM_CHANNEL_1) != HAL_OK) + { + Error_Handler(); + } + + HAL_TIM_MspPostInit(&htim4); + +} + +/** + * Enable DMA controller clock + */ +static void MX_DMA_Init(void) +{ + /* DMA controller clock enable */ + __HAL_RCC_DMA1_CLK_ENABLE(); + + /* DMA interrupt init */ + /* DMA1_Channel5_IRQn interrupt configuration */ + HAL_NVIC_SetPriority(DMA1_Channel5_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(DMA1_Channel5_IRQn); + +} + /** Configure pins as * Analog * Input @@ -346,12 +456,17 @@ static void MX_GPIO_Init(void) __HAL_RCC_GPIOE_CLK_ENABLE(); __HAL_RCC_GPIOC_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); + __HAL_RCC_GPIOB_CLK_ENABLE(); + __HAL_RCC_GPIOD_CLK_ENABLE(); /*Configure GPIO pin Output Level */ HAL_GPIO_WritePin(GPIOE, LED2_PIN_Pin|LED3_PIN_Pin|LED4_PIN_Pin, GPIO_PIN_RESET); /*Configure GPIO pin Output Level */ - HAL_GPIO_WritePin(LED_PIN_GPIO_Port, LED_PIN_Pin, GPIO_PIN_RESET); + HAL_GPIO_WritePin(GPIOC, LED_PIN_Pin|BridgePolarity_Pin, GPIO_PIN_RESET); + + /*Configure GPIO pin Output Level */ + HAL_GPIO_WritePin(ERROR_PIN_GPIO_Port, ERROR_PIN_Pin, GPIO_PIN_RESET); /*Configure GPIO pins : LED2_PIN_Pin LED3_PIN_Pin LED4_PIN_Pin */ GPIO_InitStruct.Pin = LED2_PIN_Pin|LED3_PIN_Pin|LED4_PIN_Pin; @@ -359,11 +474,17 @@ static void MX_GPIO_Init(void) GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOE, &GPIO_InitStruct); - /*Configure GPIO pin : LED_PIN_Pin */ - GPIO_InitStruct.Pin = LED_PIN_Pin; + /*Configure GPIO pins : LED_PIN_Pin BridgePolarity_Pin */ + GPIO_InitStruct.Pin = LED_PIN_Pin|BridgePolarity_Pin; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - HAL_GPIO_Init(LED_PIN_GPIO_Port, &GPIO_InitStruct); + HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); + + /*Configure GPIO pin : ERROR_PIN_Pin */ + GPIO_InitStruct.Pin = ERROR_PIN_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + HAL_GPIO_Init(ERROR_PIN_GPIO_Port, &GPIO_InitStruct); } diff --git a/cubemx/output/inverter2/Src/stm32f1xx_hal_msp.c b/cubemx/output/inverter2/Src/stm32f1xx_hal_msp.c index c458d56..375a46e 100644 --- a/cubemx/output/inverter2/Src/stm32f1xx_hal_msp.c +++ b/cubemx/output/inverter2/Src/stm32f1xx_hal_msp.c @@ -34,6 +34,8 @@ /* Includes ------------------------------------------------------------------*/ #include "stm32f1xx_hal.h" +extern DMA_HandleTypeDef hdma_tim2_ch1; + extern void Error_Handler(void); /* USER CODE BEGIN 0 */ @@ -138,10 +140,53 @@ void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base) /* USER CODE END TIM2_MspInit 0 */ /* Peripheral clock enable */ __HAL_RCC_TIM2_CLK_ENABLE(); + + /* Peripheral DMA init*/ + + hdma_tim2_ch1.Instance = DMA1_Channel5; + hdma_tim2_ch1.Init.Direction = DMA_MEMORY_TO_PERIPH; + hdma_tim2_ch1.Init.PeriphInc = DMA_PINC_DISABLE; + hdma_tim2_ch1.Init.MemInc = DMA_MINC_ENABLE; + hdma_tim2_ch1.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD; + hdma_tim2_ch1.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD; + hdma_tim2_ch1.Init.Mode = DMA_CIRCULAR; + hdma_tim2_ch1.Init.Priority = DMA_PRIORITY_LOW; + if (HAL_DMA_Init(&hdma_tim2_ch1) != HAL_OK) + { + Error_Handler(); + } + + __HAL_LINKDMA(htim_base,hdma[TIM_DMA_ID_CC1],hdma_tim2_ch1); + + /* Peripheral interrupt init */ + HAL_NVIC_SetPriority(TIM2_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(TIM2_IRQn); /* USER CODE BEGIN TIM2_MspInit 1 */ /* USER CODE END TIM2_MspInit 1 */ } + else if(htim_base->Instance==TIM3) + { + /* USER CODE BEGIN TIM3_MspInit 0 */ + + /* USER CODE END TIM3_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_TIM3_CLK_ENABLE(); + /* USER CODE BEGIN TIM3_MspInit 1 */ + + /* USER CODE END TIM3_MspInit 1 */ + } + else if(htim_base->Instance==TIM4) + { + /* USER CODE BEGIN TIM4_MspInit 0 */ + + /* USER CODE END TIM4_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_TIM4_CLK_ENABLE(); + /* USER CODE BEGIN TIM4_MspInit 1 */ + + /* USER CODE END TIM4_MspInit 1 */ + } } @@ -177,11 +222,9 @@ void HAL_TIM_MspPostInit(TIM_HandleTypeDef* htim) /* USER CODE END TIM2_MspPostInit 0 */ /**TIM2 GPIO Configuration - PA0-WKUP ------> TIM2_CH1 - PA1 ------> TIM2_CH2 - PA2 ------> TIM2_CH3 + PA0-WKUP ------> TIM2_CH1 */ - GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2; + GPIO_InitStruct.Pin = GPIO_PIN_0; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); @@ -190,6 +233,44 @@ void HAL_TIM_MspPostInit(TIM_HandleTypeDef* htim) /* USER CODE END TIM2_MspPostInit 1 */ } + else if(htim->Instance==TIM3) + { + /* USER CODE BEGIN TIM3_MspPostInit 0 */ + + /* USER CODE END TIM3_MspPostInit 0 */ + + /**TIM3 GPIO Configuration + PA6 ------> TIM3_CH1 + */ + GPIO_InitStruct.Pin = GPIO_PIN_6; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /* USER CODE BEGIN TIM3_MspPostInit 1 */ + + /* USER CODE END TIM3_MspPostInit 1 */ + } + else if(htim->Instance==TIM4) + { + /* USER CODE BEGIN TIM4_MspPostInit 0 */ + + /* USER CODE END TIM4_MspPostInit 0 */ + + /**TIM4 GPIO Configuration + PD12 ------> TIM4_CH1 + */ + GPIO_InitStruct.Pin = GPIO_PIN_12; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + HAL_GPIO_Init(GPIOD, &GPIO_InitStruct); + + __HAL_AFIO_REMAP_TIM4_ENABLE(); + + /* USER CODE BEGIN TIM4_MspPostInit 1 */ + + /* USER CODE END TIM4_MspPostInit 1 */ + } } @@ -218,10 +299,39 @@ void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* htim_base) /* USER CODE END TIM2_MspDeInit 0 */ /* Peripheral clock disable */ __HAL_RCC_TIM2_CLK_DISABLE(); + + /* Peripheral DMA DeInit*/ + HAL_DMA_DeInit(htim_base->hdma[TIM_DMA_ID_CC1]); + + /* Peripheral interrupt DeInit*/ + HAL_NVIC_DisableIRQ(TIM2_IRQn); + /* USER CODE BEGIN TIM2_MspDeInit 1 */ /* USER CODE END TIM2_MspDeInit 1 */ } + else if(htim_base->Instance==TIM3) + { + /* USER CODE BEGIN TIM3_MspDeInit 0 */ + + /* USER CODE END TIM3_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_TIM3_CLK_DISABLE(); + /* USER CODE BEGIN TIM3_MspDeInit 1 */ + + /* USER CODE END TIM3_MspDeInit 1 */ + } + else if(htim_base->Instance==TIM4) + { + /* USER CODE BEGIN TIM4_MspDeInit 0 */ + + /* USER CODE END TIM4_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_TIM4_CLK_DISABLE(); + /* USER CODE BEGIN TIM4_MspDeInit 1 */ + + /* USER CODE END TIM4_MspDeInit 1 */ + } } diff --git a/cubemx/output/inverter2/Src/stm32f1xx_it.c b/cubemx/output/inverter2/Src/stm32f1xx_it.c index 5380e5b..97c547f 100644 --- a/cubemx/output/inverter2/Src/stm32f1xx_it.c +++ b/cubemx/output/inverter2/Src/stm32f1xx_it.c @@ -40,7 +40,9 @@ /* USER CODE END 0 */ /* External variables --------------------------------------------------------*/ +extern DMA_HandleTypeDef hdma_tim2_ch1; extern TIM_HandleTypeDef htim1; +extern TIM_HandleTypeDef htim2; /******************************************************************************/ /* Cortex-M3 Processor Interruption and Exception Handlers */ @@ -184,6 +186,20 @@ void SysTick_Handler(void) /* please refer to the startup file (startup_stm32f1xx.s). */ /******************************************************************************/ +/** +* @brief This function handles DMA1 channel5 global interrupt. +*/ +void DMA1_Channel5_IRQHandler(void) +{ + /* USER CODE BEGIN DMA1_Channel5_IRQn 0 */ + + /* USER CODE END DMA1_Channel5_IRQn 0 */ + HAL_DMA_IRQHandler(&hdma_tim2_ch1); + /* USER CODE BEGIN DMA1_Channel5_IRQn 1 */ + + /* USER CODE END DMA1_Channel5_IRQn 1 */ +} + /** * @brief This function handles TIM1 capture compare interrupt. */ @@ -198,6 +214,20 @@ void TIM1_CC_IRQHandler(void) /* USER CODE END TIM1_CC_IRQn 1 */ } +/** +* @brief This function handles TIM2 global interrupt. +*/ +void TIM2_IRQHandler(void) +{ + /* USER CODE BEGIN TIM2_IRQn 0 */ + + /* USER CODE END TIM2_IRQn 0 */ + HAL_TIM_IRQHandler(&htim2); + /* USER CODE BEGIN TIM2_IRQn 1 */ + + /* USER CODE END TIM2_IRQn 1 */ +} + /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ diff --git a/cubemx/output/inverter2/inverter2.ioc b/cubemx/output/inverter2/inverter2.ioc index 0df615a..f71432a 100644 --- a/cubemx/output/inverter2/inverter2.ioc +++ b/cubemx/output/inverter2/inverter2.ioc @@ -1,40 +1,59 @@ #MicroXplorer Configuration settings - do not modify +Dma.Request0=TIM2_CH1 +Dma.RequestsNb=1 +Dma.TIM2_CH1.0.Direction=DMA_MEMORY_TO_PERIPH +Dma.TIM2_CH1.0.Instance=DMA1_Channel5 +Dma.TIM2_CH1.0.MemDataAlignment=DMA_MDATAALIGN_HALFWORD +Dma.TIM2_CH1.0.MemInc=DMA_MINC_ENABLE +Dma.TIM2_CH1.0.Mode=DMA_CIRCULAR +Dma.TIM2_CH1.0.PeriphDataAlignment=DMA_PDATAALIGN_HALFWORD +Dma.TIM2_CH1.0.PeriphInc=DMA_PINC_DISABLE +Dma.TIM2_CH1.0.Priority=DMA_PRIORITY_LOW +Dma.TIM2_CH1.0.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority File.Version=6 KeepUserPlacement=false Mcu.Family=STM32F1 -Mcu.IP0=NVIC -Mcu.IP1=RCC -Mcu.IP2=RTC -Mcu.IP3=SYS -Mcu.IP4=TIM1 -Mcu.IP5=TIM2 -Mcu.IPNb=6 +Mcu.IP0=DMA +Mcu.IP1=NVIC +Mcu.IP2=RCC +Mcu.IP3=RTC +Mcu.IP4=SYS +Mcu.IP5=TIM1 +Mcu.IP6=TIM2 +Mcu.IP7=TIM3 +Mcu.IP8=TIM4 +Mcu.IPNb=9 Mcu.Name=STM32F103V(C-D-E)Tx Mcu.Package=LQFP100 Mcu.Pin0=PE4 Mcu.Pin1=PE5 Mcu.Pin10=PE11 Mcu.Pin11=PE13 -Mcu.Pin12=PA13 -Mcu.Pin13=PA14 -Mcu.Pin14=VP_RTC_No_RTC_Output -Mcu.Pin15=VP_SYS_VS_Systick -Mcu.Pin16=VP_TIM1_VS_ClockSourceINT -Mcu.Pin17=VP_TIM2_VS_ClockSourceINT +Mcu.Pin12=PB10 +Mcu.Pin13=PD12 +Mcu.Pin14=PA13 +Mcu.Pin15=PA14 +Mcu.Pin16=VP_RTC_No_RTC_Output +Mcu.Pin17=VP_SYS_VS_Systick +Mcu.Pin18=VP_TIM1_VS_ClockSourceINT +Mcu.Pin19=VP_TIM2_VS_ClockSourceINT Mcu.Pin2=PE6 +Mcu.Pin20=VP_TIM3_VS_ClockSourceINT +Mcu.Pin21=VP_TIM4_VS_ClockSourceINT Mcu.Pin3=PC13-TAMPER-RTC Mcu.Pin4=OSC_IN Mcu.Pin5=OSC_OUT -Mcu.Pin6=PA0-WKUP -Mcu.Pin7=PA1 -Mcu.Pin8=PA2 +Mcu.Pin6=PC0 +Mcu.Pin7=PA0-WKUP +Mcu.Pin8=PA6 Mcu.Pin9=PE9 -Mcu.PinsNb=18 +Mcu.PinsNb=22 Mcu.UserConstants= Mcu.UserName=STM32F103VCTx MxCube.Version=4.16.1 MxDb.Version=DB.4.0.161 NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true +NVIC.DMA1_Channel5_IRQn=true\:0\:0\:false\:false\:true NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true NVIC.MemoryManagement_IRQn=true\:0\:0\:false\:false\:true @@ -44,6 +63,7 @@ NVIC.PriorityGroup=NVIC_PRIORITYGROUP_4 NVIC.SVCall_IRQn=true\:0\:0\:false\:false\:true NVIC.SysTick_IRQn=true\:0\:0\:false\:false\:true NVIC.TIM1_CC_IRQn=true\:0\:0\:false\:false\:true +NVIC.TIM2_IRQn=true\:0\:0\:false\:false\:true NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true OSC_IN.Mode=HSE-External-Oscillator OSC_IN.Signal=RCC_OSC_IN @@ -51,12 +71,19 @@ OSC_OUT.Mode=HSE-External-Oscillator OSC_OUT.Signal=RCC_OSC_OUT PA0-WKUP.Locked=true PA0-WKUP.Signal=S_TIM2_CH1_ETR -PA1.Signal=S_TIM2_CH2 PA13.Mode=Serial_Wire PA13.Signal=SYS_JTMS-SWDIO PA14.Mode=Serial_Wire PA14.Signal=SYS_JTCK-SWCLK -PA2.Signal=S_TIM2_CH3 +PA6.Signal=S_TIM3_CH1 +PB10.GPIOParameters=GPIO_Label +PB10.GPIO_Label=ERROR_PIN +PB10.Locked=true +PB10.Signal=GPIO_Output +PC0.GPIOParameters=GPIO_Label +PC0.GPIO_Label=BridgePolarity +PC0.Locked=true +PC0.Signal=GPIO_Output PC13-TAMPER-RTC.GPIOParameters=GPIO_Label PC13-TAMPER-RTC.GPIO_Label=LED_PIN PC13-TAMPER-RTC.Locked=true @@ -70,6 +97,7 @@ PCC.Seq0=0 PCC.Series=STM32F1 PCC.Temperature=25 PCC.Vdd=3.3 +PD12.Signal=S_TIM4_CH1 PE11.Signal=S_TIM1_CH2 PE13.Signal=S_TIM1_CH3 PE4.GPIOParameters=GPIO_Label @@ -107,7 +135,7 @@ ProjectManager.StackSize=0x400 ProjectManager.TargetToolchain=SW4STM32 ProjectManager.ToolChainLocation=/home/wn/workspace-stm32/inverter2/cubemx/output/inverter2 ProjectManager.UnderRoot=true -ProjectManager.functionlistsort=1-MX_GPIO_Init-GPIO-false,2-MX_RTC_Init-RTC-false,3-MX_TIM1_Init-TIM1-false,4-MX_TIM2_Init-TIM2-false +ProjectManager.functionlistsort=1-MX_GPIO_Init-GPIO-false,2-MX_DMA_Init-DMA-false,3-MX_RTC_Init-RTC-false,4-MX_TIM1_Init-TIM1-false,5-MX_TIM2_Init-TIM2-false,6-MX_TIM3_Init-TIM3-false,7-MX_TIM4_Init-TIM4-false RCC.ADCFreqValue=36000000 RCC.AHBFreq_Value=72000000 RCC.APB1CLKDivider=RCC_HCLK_DIV2 @@ -143,18 +171,18 @@ SH.S_TIM1_CH2.0=TIM1_CH2,Output Compare2 CH2 SH.S_TIM1_CH2.ConfNb=1 SH.S_TIM1_CH3.0=TIM1_CH3,Output Compare3 CH3 SH.S_TIM1_CH3.ConfNb=1 -SH.S_TIM2_CH1_ETR.0=TIM2_CH1,Output Compare1 CH1 +SH.S_TIM2_CH1_ETR.0=TIM2_CH1,PWM Generation1 CH1 SH.S_TIM2_CH1_ETR.ConfNb=1 -SH.S_TIM2_CH2.0=TIM2_CH2,Forced Output2 CH2 -SH.S_TIM2_CH2.ConfNb=1 -SH.S_TIM2_CH3.0=TIM2_CH3,Forced Output3 CH3 -SH.S_TIM2_CH3.ConfNb=1 +SH.S_TIM3_CH1.0=TIM3_CH1,PWM Generation1 CH1 +SH.S_TIM3_CH1.ConfNb=1 +SH.S_TIM4_CH1.0=TIM4_CH1,PWM Generation1 CH1 +SH.S_TIM4_CH1.ConfNb=1 TIM1.Channel-Output\ Compare2\ CH2=TIM_CHANNEL_2 TIM1.Channel-Output\ Compare3\ CH3=TIM_CHANNEL_3 TIM1.IPParameters=TIM_MasterOutputTrigger,TIM_MasterSlaveMode,Channel-Output Compare2 CH2,Channel-Output Compare3 CH3,Prescaler,Period,OCMode_1,Pulse-Output Compare1 CH1,OCMode_2,Pulse-Output Compare2 CH2,OCMode_3,Pulse-Output Compare3 CH3 -TIM1.OCMode_1=TIM_OCMODE_TIMING -TIM1.OCMode_2=TIM_OCMODE_TIMING -TIM1.OCMode_3=TIM_OCMODE_TIMING +TIM1.OCMode_1=TIM_OCMODE_TOGGLE +TIM1.OCMode_2=TIM_OCMODE_TOGGLE +TIM1.OCMode_3=TIM_OCMODE_TOGGLE TIM1.Period=10000 TIM1.Prescaler=36 TIM1.Pulse-Output\ Compare1\ CH1=1000 @@ -162,12 +190,18 @@ TIM1.Pulse-Output\ Compare2\ CH2=2000 TIM1.Pulse-Output\ Compare3\ CH3=3000 TIM1.TIM_MasterOutputTrigger=TIM_TRGO_RESET TIM1.TIM_MasterSlaveMode=TIM_MASTERSLAVEMODE_DISABLE -TIM2.Channel-Forced\ Output2\ CH2=TIM_CHANNEL_2 -TIM2.Channel-Forced\ Output3\ CH3=TIM_CHANNEL_3 -TIM2.IPParameters=Channel-Forced Output2 CH2,Prescaler,Period,Channel-Forced Output3 CH3,OCMode_forced-Forced Output3 CH3 -TIM2.OCMode_forced-Forced\ Output3\ CH3=TIM_OCMODE_FORCED_INACTIVE -TIM2.Period=1000 +TIM2.IPParameters=Prescaler,Period,Pulse-PWM Generation1 CH1 +TIM2.Period=5000 TIM2.Prescaler=72 +TIM2.Pulse-PWM\ Generation1\ CH1=1000 +TIM3.IPParameters=Prescaler,Period,Pulse-PWM Generation1 CH1 +TIM3.Period=5000 +TIM3.Prescaler=72 +TIM3.Pulse-PWM\ Generation1\ CH1=2000 +TIM4.IPParameters=Prescaler,Period,Pulse-PWM Generation1 CH1 +TIM4.Period=5000 +TIM4.Prescaler=72 +TIM4.Pulse-PWM\ Generation1\ CH1=3000 VP_RTC_No_RTC_Output.Mode=RTC_OUT_NO VP_RTC_No_RTC_Output.Signal=RTC_No_RTC_Output VP_SYS_VS_Systick.Mode=SysTick @@ -176,4 +210,8 @@ VP_TIM1_VS_ClockSourceINT.Mode=Internal VP_TIM1_VS_ClockSourceINT.Signal=TIM1_VS_ClockSourceINT VP_TIM2_VS_ClockSourceINT.Mode=Internal VP_TIM2_VS_ClockSourceINT.Signal=TIM2_VS_ClockSourceINT +VP_TIM3_VS_ClockSourceINT.Mode=Internal +VP_TIM3_VS_ClockSourceINT.Signal=TIM3_VS_ClockSourceINT +VP_TIM4_VS_ClockSourceINT.Mode=Internal +VP_TIM4_VS_ClockSourceINT.Signal=TIM4_VS_ClockSourceINT board=inverter2 diff --git a/include/mxconstants.h b/include/mxconstants.h index ff1a158..56c883d 100644 --- a/include/mxconstants.h +++ b/include/mxconstants.h @@ -49,6 +49,10 @@ #define LED4_PIN_GPIO_Port GPIOE #define LED_PIN_Pin GPIO_PIN_13 #define LED_PIN_GPIO_Port GPIOC +#define BridgePolarity_Pin GPIO_PIN_0 +#define BridgePolarity_GPIO_Port GPIOC +#define ERROR_PIN_Pin GPIO_PIN_10 +#define ERROR_PIN_GPIO_Port GPIOB /* USER CODE BEGIN Private defines */ /* USER CODE END Private defines */ diff --git a/include/stm32f1xx_hal_conf.h b/include/stm32f1xx_hal_conf.h index a3c1293..180f1d8 100644 --- a/include/stm32f1xx_hal_conf.h +++ b/include/stm32f1xx_hal_conf.h @@ -56,7 +56,7 @@ /*#define HAL_CORTEX_MODULE_ENABLED */ /*#define HAL_CRC_MODULE_ENABLED */ /*#define HAL_DAC_MODULE_ENABLED */ -/*#define HAL_DMA_MODULE_ENABLED */ +#define HAL_DMA_MODULE_ENABLED /*#define HAL_ETH_MODULE_ENABLED */ /*#define HAL_FLASH_MODULE_ENABLED */ #define HAL_GPIO_MODULE_ENABLED diff --git a/include/stm32f1xx_it.h b/include/stm32f1xx_it.h index 8b7b204..4fd5431 100644 --- a/include/stm32f1xx_it.h +++ b/include/stm32f1xx_it.h @@ -54,7 +54,9 @@ void SVC_Handler(void); void DebugMon_Handler(void); void PendSV_Handler(void); void SysTick_Handler(void); +void DMA1_Channel5_IRQHandler(void); void TIM1_CC_IRQHandler(void); +void TIM2_IRQHandler(void); #ifdef __cplusplus } diff --git a/my_src/main2.c b/my_src/main2.c index c06b060..dfce584 100644 --- a/my_src/main2.c +++ b/my_src/main2.c @@ -15,35 +15,74 @@ #include +#include #include #include "stm32f1xx_hal.h" extern TIM_HandleTypeDef htim1; extern TIM_HandleTypeDef htim2; +extern TIM_HandleTypeDef htim3; +extern TIM_HandleTypeDef htim4; +#define NUM_OF_SINE_SLOT 30 +uint16_t freqOut = 100; +const uint32_t FREQ_IN = 72E6; +const float PI = 3.14159; +float slotAngle = 180.0 / NUM_OF_SINE_SLOT; +float sineValues[NUM_OF_SINE_SLOT]; +uint16_t IV[NUM_OF_SINE_SLOT]; +volatile uint8_t slotCnt; + void blink(void *handle) { HAL_GPIO_TogglePin(LED_PIN_GPIO_Port, LED_PIN_Pin); - } void my_setup_1() { + for (uint8_t i = 0; i < NUM_OF_SINE_SLOT; i++) { + float angle = i * slotAngle; + sineValues[i] = sinf(angle / 180 * PI); + } + schInit(); schAdd(blink, NULL, 0, 100); } + + void my_setup_2() { - HAL_TIM_OC_Start_IT(&htim1, TIM_CHANNEL_1); - HAL_TIM_OC_Start_IT(&htim1, TIM_CHANNEL_2); - HAL_TIM_OC_Start_IT(&htim1, TIM_CHANNEL_3); + uint16_t myArr = (FREQ_IN / (freqOut * NUM_OF_SINE_SLOT * 4)); - HAL_TIM_OC_Start(&htim2, TIM_CHANNEL_1); - HAL_TIM_OC_Start(&htim2, TIM_CHANNEL_2); - HAL_TIM_OC_Start(&htim2, TIM_CHANNEL_3); + HAL_TIM_OC_Start_IT(&htim1, TIM_CHANNEL_1); + HAL_TIM_OC_Start_IT(&htim1, TIM_CHANNEL_2); + HAL_TIM_OC_Start_IT(&htim1, TIM_CHANNEL_3); - HAL_NVIC_SetPriority(TIM1_CC_IRQn, 0, 0); - HAL_NVIC_EnableIRQ(TIM1_CC_IRQn); + HAL_NVIC_SetPriority(TIM1_CC_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(TIM1_CC_IRQn); + + __HAL_TIM_SET_AUTORELOAD(&htim3, myArr); + HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1); + HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_1); + + + uint16_t slotWidth = __HAL_TIM_GET_AUTORELOAD(&htim2); + for (uint8_t i = 0; i < NUM_OF_SINE_SLOT; i++) { + IV[i] = (uint16_t)(sineValues[i] * 0.9 * slotWidth); + } + slotCnt = 0; + __HAL_TIM_SET_AUTORELOAD(&htim2, myArr); + HAL_GPIO_WritePin(BridgePolarity_GPIO_Port, BridgePolarity_Pin, GPIO_PIN_RESET); + HAL_TIM_PWM_Start_DMA(&htim2, TIM_CHANNEL_1, (uint32_t*)IV, NUM_OF_SINE_SLOT); + + __HAL_TIM_ENABLE_IT(&htim2, TIM_IT_UPDATE); + HAL_NVIC_SetPriority(TIM2_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(TIM2_IRQn); + +} + +void my_errorHandler() { + HAL_GPIO_WritePin(ERROR_PIN_GPIO_Port, ERROR_PIN_Pin, GPIO_PIN_SET); } void my_loop() { @@ -52,10 +91,19 @@ void my_loop() { void HAL_SYSTICK_Callback() { - //HAL_GPIO_TogglePin(LED_PIN_GPIO_Port, LED_PIN_Pin); schUpdate(); } +void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { + if (htim->Instance == TIM2) { + slotCnt++; + if (slotCnt == NUM_OF_SINE_SLOT + 2) { + slotCnt = 2; + HAL_GPIO_TogglePin(BridgePolarity_GPIO_Port, BridgePolarity_Pin); + } + } +} + void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef * htim) { if (htim->Instance == TIM1) { if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1) { diff --git a/my_src/main2.h b/my_src/main2.h index cc0f2e1..b40184e 100644 --- a/my_src/main2.h +++ b/my_src/main2.h @@ -12,6 +12,7 @@ void my_setup_1(); void my_setup_2(); void my_loop(); +void my_errorHandler(); #endif /* MAIN2_H_ */ diff --git a/src/main.c b/src/main.c index 9655cb9..7860a47 100644 --- a/src/main.c +++ b/src/main.c @@ -43,6 +43,9 @@ RTC_HandleTypeDef hrtc; TIM_HandleTypeDef htim1; TIM_HandleTypeDef htim2; +TIM_HandleTypeDef htim3; +TIM_HandleTypeDef htim4; +DMA_HandleTypeDef hdma_tim2_ch1; /* USER CODE BEGIN PV */ /* Private variables ---------------------------------------------------------*/ @@ -53,9 +56,12 @@ TIM_HandleTypeDef htim2; void SystemClock_Config(void); void Error_Handler(void); static void MX_GPIO_Init(void); +static void MX_DMA_Init(void); static void MX_RTC_Init(void); static void MX_TIM1_Init(void); static void MX_TIM2_Init(void); +static void MX_TIM3_Init(void); +static void MX_TIM4_Init(void); void HAL_TIM_MspPostInit(TIM_HandleTypeDef *htim); @@ -87,9 +93,12 @@ int main(void) /* Initialize all configured peripherals */ MX_GPIO_Init(); + MX_DMA_Init(); MX_RTC_Init(); MX_TIM1_Init(); MX_TIM2_Init(); + MX_TIM3_Init(); + MX_TIM4_Init(); /* USER CODE BEGIN 2 */ my_setup_2(); @@ -245,7 +254,7 @@ static void MX_TIM1_Init(void) Error_Handler(); } - sConfigOC.OCMode = TIM_OCMODE_TIMING; + sConfigOC.OCMode = TIM_OCMODE_TOGGLE; sConfigOC.Pulse = 1000; sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH; @@ -282,9 +291,9 @@ static void MX_TIM2_Init(void) TIM_OC_InitTypeDef sConfigOC; htim2.Instance = TIM2; - htim2.Init.Prescaler = 72; + htim2.Init.Prescaler = 1; htim2.Init.CounterMode = TIM_COUNTERMODE_UP; - htim2.Init.Period = 1000; + htim2.Init.Period = 5000; htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; if (HAL_TIM_Base_Init(&htim2) != HAL_OK) { @@ -297,7 +306,7 @@ static void MX_TIM2_Init(void) Error_Handler(); } - if (HAL_TIM_OC_Init(&htim2) != HAL_OK) + if (HAL_TIM_PWM_Init(&htim2) != HAL_OK) { Error_Handler(); } @@ -309,23 +318,11 @@ static void MX_TIM2_Init(void) Error_Handler(); } - sConfigOC.OCMode = TIM_OCMODE_TIMING; - sConfigOC.Pulse = 0; + sConfigOC.OCMode = TIM_OCMODE_PWM1; + sConfigOC.Pulse = 1000; sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; - if (HAL_TIM_OC_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1) != HAL_OK) - { - Error_Handler(); - } - - sConfigOC.OCMode = TIM_OCMODE_FORCED_ACTIVE; - if (HAL_TIM_OC_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_2) != HAL_OK) - { - Error_Handler(); - } - - sConfigOC.OCMode = TIM_OCMODE_FORCED_INACTIVE; - if (HAL_TIM_OC_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_3) != HAL_OK) + if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1) != HAL_OK) { Error_Handler(); } @@ -334,6 +331,119 @@ static void MX_TIM2_Init(void) } +/* TIM3 init function */ +static void MX_TIM3_Init(void) +{ + + TIM_ClockConfigTypeDef sClockSourceConfig; + TIM_MasterConfigTypeDef sMasterConfig; + TIM_OC_InitTypeDef sConfigOC; + + htim3.Instance = TIM3; + htim3.Init.Prescaler = 1; + htim3.Init.CounterMode = TIM_COUNTERMODE_UP; + htim3.Init.Period = 5000; + htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; + if (HAL_TIM_Base_Init(&htim3) != HAL_OK) + { + Error_Handler(); + } + + sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; + if (HAL_TIM_ConfigClockSource(&htim3, &sClockSourceConfig) != HAL_OK) + { + Error_Handler(); + } + + if (HAL_TIM_PWM_Init(&htim3) != HAL_OK) + { + Error_Handler(); + } + + sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; + sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; + if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK) + { + Error_Handler(); + } + + sConfigOC.OCMode = TIM_OCMODE_PWM1; + sConfigOC.Pulse = 2000; + sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; + sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; + if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1) != HAL_OK) + { + Error_Handler(); + } + + HAL_TIM_MspPostInit(&htim3); + +} + +/* TIM4 init function */ +static void MX_TIM4_Init(void) +{ + + TIM_ClockConfigTypeDef sClockSourceConfig; + TIM_MasterConfigTypeDef sMasterConfig; + TIM_OC_InitTypeDef sConfigOC; + + htim4.Instance = TIM4; + htim4.Init.Prescaler = 72; + htim4.Init.CounterMode = TIM_COUNTERMODE_UP; + htim4.Init.Period = 5000; + htim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; + if (HAL_TIM_Base_Init(&htim4) != HAL_OK) + { + Error_Handler(); + } + + sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; + if (HAL_TIM_ConfigClockSource(&htim4, &sClockSourceConfig) != HAL_OK) + { + Error_Handler(); + } + + if (HAL_TIM_PWM_Init(&htim4) != HAL_OK) + { + Error_Handler(); + } + + sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; + sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; + if (HAL_TIMEx_MasterConfigSynchronization(&htim4, &sMasterConfig) != HAL_OK) + { + Error_Handler(); + } + + sConfigOC.OCMode = TIM_OCMODE_PWM1; + sConfigOC.Pulse = 3000; + sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; + sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; + if (HAL_TIM_PWM_ConfigChannel(&htim4, &sConfigOC, TIM_CHANNEL_1) != HAL_OK) + { + Error_Handler(); + } + + HAL_TIM_MspPostInit(&htim4); + +} + +/** + * Enable DMA controller clock + */ +static void MX_DMA_Init(void) +{ + /* DMA controller clock enable */ + __HAL_RCC_DMA1_CLK_ENABLE(); + + /* DMA interrupt init */ + /* DMA1_Channel5_IRQn interrupt configuration */ + HAL_NVIC_SetPriority(DMA1_Channel5_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(DMA1_Channel5_IRQn); + +} + /** Configure pins as * Analog * Input @@ -350,12 +460,17 @@ static void MX_GPIO_Init(void) __HAL_RCC_GPIOE_CLK_ENABLE(); __HAL_RCC_GPIOC_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); + __HAL_RCC_GPIOB_CLK_ENABLE(); + __HAL_RCC_GPIOD_CLK_ENABLE(); /*Configure GPIO pin Output Level */ HAL_GPIO_WritePin(GPIOE, LED2_PIN_Pin|LED3_PIN_Pin|LED4_PIN_Pin, GPIO_PIN_RESET); /*Configure GPIO pin Output Level */ - HAL_GPIO_WritePin(LED_PIN_GPIO_Port, LED_PIN_Pin, GPIO_PIN_RESET); + HAL_GPIO_WritePin(GPIOC, LED_PIN_Pin|BridgePolarity_Pin, GPIO_PIN_RESET); + + /*Configure GPIO pin Output Level */ + HAL_GPIO_WritePin(ERROR_PIN_GPIO_Port, ERROR_PIN_Pin, GPIO_PIN_RESET); /*Configure GPIO pins : LED2_PIN_Pin LED3_PIN_Pin LED4_PIN_Pin */ GPIO_InitStruct.Pin = LED2_PIN_Pin|LED3_PIN_Pin|LED4_PIN_Pin; @@ -363,11 +478,17 @@ static void MX_GPIO_Init(void) GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOE, &GPIO_InitStruct); - /*Configure GPIO pin : LED_PIN_Pin */ - GPIO_InitStruct.Pin = LED_PIN_Pin; + /*Configure GPIO pins : LED_PIN_Pin BridgePolarity_Pin */ + GPIO_InitStruct.Pin = LED_PIN_Pin|BridgePolarity_Pin; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - HAL_GPIO_Init(LED_PIN_GPIO_Port, &GPIO_InitStruct); + HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); + + /*Configure GPIO pin : ERROR_PIN_Pin */ + GPIO_InitStruct.Pin = ERROR_PIN_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + HAL_GPIO_Init(ERROR_PIN_GPIO_Port, &GPIO_InitStruct); } @@ -383,6 +504,7 @@ static void MX_GPIO_Init(void) void Error_Handler(void) { /* USER CODE BEGIN Error_Handler */ + my_errorHandler(); /* User can add his own implementation to report the HAL error return state */ while(1) { diff --git a/src/main.c-bak b/src/main.c-bak index 593b997..d4b2000 100644 --- a/src/main.c-bak +++ b/src/main.c-bak @@ -42,6 +42,9 @@ RTC_HandleTypeDef hrtc; TIM_HandleTypeDef htim1; TIM_HandleTypeDef htim2; +TIM_HandleTypeDef htim3; +TIM_HandleTypeDef htim4; +DMA_HandleTypeDef hdma_tim2_ch1; /* USER CODE BEGIN PV */ /* Private variables ---------------------------------------------------------*/ @@ -52,9 +55,12 @@ TIM_HandleTypeDef htim2; void SystemClock_Config(void); void Error_Handler(void); static void MX_GPIO_Init(void); +static void MX_DMA_Init(void); static void MX_RTC_Init(void); static void MX_TIM1_Init(void); static void MX_TIM2_Init(void); +static void MX_TIM3_Init(void); +static void MX_TIM4_Init(void); void HAL_TIM_MspPostInit(TIM_HandleTypeDef *htim); @@ -85,9 +91,12 @@ int main(void) /* Initialize all configured peripherals */ MX_GPIO_Init(); + MX_DMA_Init(); MX_RTC_Init(); MX_TIM1_Init(); MX_TIM2_Init(); + MX_TIM3_Init(); + MX_TIM4_Init(); /* USER CODE BEGIN 2 */ @@ -241,7 +250,7 @@ static void MX_TIM1_Init(void) Error_Handler(); } - sConfigOC.OCMode = TIM_OCMODE_TIMING; + sConfigOC.OCMode = TIM_OCMODE_TOGGLE; sConfigOC.Pulse = 1000; sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH; @@ -280,7 +289,7 @@ static void MX_TIM2_Init(void) htim2.Instance = TIM2; htim2.Init.Prescaler = 72; htim2.Init.CounterMode = TIM_COUNTERMODE_UP; - htim2.Init.Period = 1000; + htim2.Init.Period = 5000; htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; if (HAL_TIM_Base_Init(&htim2) != HAL_OK) { @@ -293,7 +302,7 @@ static void MX_TIM2_Init(void) Error_Handler(); } - if (HAL_TIM_OC_Init(&htim2) != HAL_OK) + if (HAL_TIM_PWM_Init(&htim2) != HAL_OK) { Error_Handler(); } @@ -305,23 +314,11 @@ static void MX_TIM2_Init(void) Error_Handler(); } - sConfigOC.OCMode = TIM_OCMODE_TIMING; - sConfigOC.Pulse = 0; + sConfigOC.OCMode = TIM_OCMODE_PWM1; + sConfigOC.Pulse = 1000; sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; - if (HAL_TIM_OC_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1) != HAL_OK) - { - Error_Handler(); - } - - sConfigOC.OCMode = TIM_OCMODE_FORCED_ACTIVE; - if (HAL_TIM_OC_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_2) != HAL_OK) - { - Error_Handler(); - } - - sConfigOC.OCMode = TIM_OCMODE_FORCED_INACTIVE; - if (HAL_TIM_OC_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_3) != HAL_OK) + if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1) != HAL_OK) { Error_Handler(); } @@ -330,6 +327,119 @@ static void MX_TIM2_Init(void) } +/* TIM3 init function */ +static void MX_TIM3_Init(void) +{ + + TIM_ClockConfigTypeDef sClockSourceConfig; + TIM_MasterConfigTypeDef sMasterConfig; + TIM_OC_InitTypeDef sConfigOC; + + htim3.Instance = TIM3; + htim3.Init.Prescaler = 72; + htim3.Init.CounterMode = TIM_COUNTERMODE_UP; + htim3.Init.Period = 5000; + htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; + if (HAL_TIM_Base_Init(&htim3) != HAL_OK) + { + Error_Handler(); + } + + sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; + if (HAL_TIM_ConfigClockSource(&htim3, &sClockSourceConfig) != HAL_OK) + { + Error_Handler(); + } + + if (HAL_TIM_PWM_Init(&htim3) != HAL_OK) + { + Error_Handler(); + } + + sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; + sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; + if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK) + { + Error_Handler(); + } + + sConfigOC.OCMode = TIM_OCMODE_PWM1; + sConfigOC.Pulse = 2000; + sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; + sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; + if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1) != HAL_OK) + { + Error_Handler(); + } + + HAL_TIM_MspPostInit(&htim3); + +} + +/* TIM4 init function */ +static void MX_TIM4_Init(void) +{ + + TIM_ClockConfigTypeDef sClockSourceConfig; + TIM_MasterConfigTypeDef sMasterConfig; + TIM_OC_InitTypeDef sConfigOC; + + htim4.Instance = TIM4; + htim4.Init.Prescaler = 72; + htim4.Init.CounterMode = TIM_COUNTERMODE_UP; + htim4.Init.Period = 5000; + htim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; + if (HAL_TIM_Base_Init(&htim4) != HAL_OK) + { + Error_Handler(); + } + + sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; + if (HAL_TIM_ConfigClockSource(&htim4, &sClockSourceConfig) != HAL_OK) + { + Error_Handler(); + } + + if (HAL_TIM_PWM_Init(&htim4) != HAL_OK) + { + Error_Handler(); + } + + sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; + sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; + if (HAL_TIMEx_MasterConfigSynchronization(&htim4, &sMasterConfig) != HAL_OK) + { + Error_Handler(); + } + + sConfigOC.OCMode = TIM_OCMODE_PWM1; + sConfigOC.Pulse = 3000; + sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; + sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; + if (HAL_TIM_PWM_ConfigChannel(&htim4, &sConfigOC, TIM_CHANNEL_1) != HAL_OK) + { + Error_Handler(); + } + + HAL_TIM_MspPostInit(&htim4); + +} + +/** + * Enable DMA controller clock + */ +static void MX_DMA_Init(void) +{ + /* DMA controller clock enable */ + __HAL_RCC_DMA1_CLK_ENABLE(); + + /* DMA interrupt init */ + /* DMA1_Channel5_IRQn interrupt configuration */ + HAL_NVIC_SetPriority(DMA1_Channel5_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(DMA1_Channel5_IRQn); + +} + /** Configure pins as * Analog * Input @@ -346,12 +456,17 @@ static void MX_GPIO_Init(void) __HAL_RCC_GPIOE_CLK_ENABLE(); __HAL_RCC_GPIOC_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); + __HAL_RCC_GPIOB_CLK_ENABLE(); + __HAL_RCC_GPIOD_CLK_ENABLE(); /*Configure GPIO pin Output Level */ HAL_GPIO_WritePin(GPIOE, LED2_PIN_Pin|LED3_PIN_Pin|LED4_PIN_Pin, GPIO_PIN_RESET); /*Configure GPIO pin Output Level */ - HAL_GPIO_WritePin(LED_PIN_GPIO_Port, LED_PIN_Pin, GPIO_PIN_RESET); + HAL_GPIO_WritePin(GPIOC, LED_PIN_Pin|BridgePolarity_Pin, GPIO_PIN_RESET); + + /*Configure GPIO pin Output Level */ + HAL_GPIO_WritePin(ERROR_PIN_GPIO_Port, ERROR_PIN_Pin, GPIO_PIN_RESET); /*Configure GPIO pins : LED2_PIN_Pin LED3_PIN_Pin LED4_PIN_Pin */ GPIO_InitStruct.Pin = LED2_PIN_Pin|LED3_PIN_Pin|LED4_PIN_Pin; @@ -359,11 +474,17 @@ static void MX_GPIO_Init(void) GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOE, &GPIO_InitStruct); - /*Configure GPIO pin : LED_PIN_Pin */ - GPIO_InitStruct.Pin = LED_PIN_Pin; + /*Configure GPIO pins : LED_PIN_Pin BridgePolarity_Pin */ + GPIO_InitStruct.Pin = LED_PIN_Pin|BridgePolarity_Pin; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - HAL_GPIO_Init(LED_PIN_GPIO_Port, &GPIO_InitStruct); + HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); + + /*Configure GPIO pin : ERROR_PIN_Pin */ + GPIO_InitStruct.Pin = ERROR_PIN_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + HAL_GPIO_Init(ERROR_PIN_GPIO_Port, &GPIO_InitStruct); } diff --git a/src/stm32f1xx_hal_msp.c b/src/stm32f1xx_hal_msp.c index c458d56..375a46e 100644 --- a/src/stm32f1xx_hal_msp.c +++ b/src/stm32f1xx_hal_msp.c @@ -34,6 +34,8 @@ /* Includes ------------------------------------------------------------------*/ #include "stm32f1xx_hal.h" +extern DMA_HandleTypeDef hdma_tim2_ch1; + extern void Error_Handler(void); /* USER CODE BEGIN 0 */ @@ -138,10 +140,53 @@ void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base) /* USER CODE END TIM2_MspInit 0 */ /* Peripheral clock enable */ __HAL_RCC_TIM2_CLK_ENABLE(); + + /* Peripheral DMA init*/ + + hdma_tim2_ch1.Instance = DMA1_Channel5; + hdma_tim2_ch1.Init.Direction = DMA_MEMORY_TO_PERIPH; + hdma_tim2_ch1.Init.PeriphInc = DMA_PINC_DISABLE; + hdma_tim2_ch1.Init.MemInc = DMA_MINC_ENABLE; + hdma_tim2_ch1.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD; + hdma_tim2_ch1.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD; + hdma_tim2_ch1.Init.Mode = DMA_CIRCULAR; + hdma_tim2_ch1.Init.Priority = DMA_PRIORITY_LOW; + if (HAL_DMA_Init(&hdma_tim2_ch1) != HAL_OK) + { + Error_Handler(); + } + + __HAL_LINKDMA(htim_base,hdma[TIM_DMA_ID_CC1],hdma_tim2_ch1); + + /* Peripheral interrupt init */ + HAL_NVIC_SetPriority(TIM2_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(TIM2_IRQn); /* USER CODE BEGIN TIM2_MspInit 1 */ /* USER CODE END TIM2_MspInit 1 */ } + else if(htim_base->Instance==TIM3) + { + /* USER CODE BEGIN TIM3_MspInit 0 */ + + /* USER CODE END TIM3_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_TIM3_CLK_ENABLE(); + /* USER CODE BEGIN TIM3_MspInit 1 */ + + /* USER CODE END TIM3_MspInit 1 */ + } + else if(htim_base->Instance==TIM4) + { + /* USER CODE BEGIN TIM4_MspInit 0 */ + + /* USER CODE END TIM4_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_TIM4_CLK_ENABLE(); + /* USER CODE BEGIN TIM4_MspInit 1 */ + + /* USER CODE END TIM4_MspInit 1 */ + } } @@ -177,11 +222,9 @@ void HAL_TIM_MspPostInit(TIM_HandleTypeDef* htim) /* USER CODE END TIM2_MspPostInit 0 */ /**TIM2 GPIO Configuration - PA0-WKUP ------> TIM2_CH1 - PA1 ------> TIM2_CH2 - PA2 ------> TIM2_CH3 + PA0-WKUP ------> TIM2_CH1 */ - GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2; + GPIO_InitStruct.Pin = GPIO_PIN_0; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); @@ -190,6 +233,44 @@ void HAL_TIM_MspPostInit(TIM_HandleTypeDef* htim) /* USER CODE END TIM2_MspPostInit 1 */ } + else if(htim->Instance==TIM3) + { + /* USER CODE BEGIN TIM3_MspPostInit 0 */ + + /* USER CODE END TIM3_MspPostInit 0 */ + + /**TIM3 GPIO Configuration + PA6 ------> TIM3_CH1 + */ + GPIO_InitStruct.Pin = GPIO_PIN_6; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /* USER CODE BEGIN TIM3_MspPostInit 1 */ + + /* USER CODE END TIM3_MspPostInit 1 */ + } + else if(htim->Instance==TIM4) + { + /* USER CODE BEGIN TIM4_MspPostInit 0 */ + + /* USER CODE END TIM4_MspPostInit 0 */ + + /**TIM4 GPIO Configuration + PD12 ------> TIM4_CH1 + */ + GPIO_InitStruct.Pin = GPIO_PIN_12; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + HAL_GPIO_Init(GPIOD, &GPIO_InitStruct); + + __HAL_AFIO_REMAP_TIM4_ENABLE(); + + /* USER CODE BEGIN TIM4_MspPostInit 1 */ + + /* USER CODE END TIM4_MspPostInit 1 */ + } } @@ -218,10 +299,39 @@ void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* htim_base) /* USER CODE END TIM2_MspDeInit 0 */ /* Peripheral clock disable */ __HAL_RCC_TIM2_CLK_DISABLE(); + + /* Peripheral DMA DeInit*/ + HAL_DMA_DeInit(htim_base->hdma[TIM_DMA_ID_CC1]); + + /* Peripheral interrupt DeInit*/ + HAL_NVIC_DisableIRQ(TIM2_IRQn); + /* USER CODE BEGIN TIM2_MspDeInit 1 */ /* USER CODE END TIM2_MspDeInit 1 */ } + else if(htim_base->Instance==TIM3) + { + /* USER CODE BEGIN TIM3_MspDeInit 0 */ + + /* USER CODE END TIM3_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_TIM3_CLK_DISABLE(); + /* USER CODE BEGIN TIM3_MspDeInit 1 */ + + /* USER CODE END TIM3_MspDeInit 1 */ + } + else if(htim_base->Instance==TIM4) + { + /* USER CODE BEGIN TIM4_MspDeInit 0 */ + + /* USER CODE END TIM4_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_TIM4_CLK_DISABLE(); + /* USER CODE BEGIN TIM4_MspDeInit 1 */ + + /* USER CODE END TIM4_MspDeInit 1 */ + } } diff --git a/src/stm32f1xx_it.c b/src/stm32f1xx_it.c index 5380e5b..97c547f 100644 --- a/src/stm32f1xx_it.c +++ b/src/stm32f1xx_it.c @@ -40,7 +40,9 @@ /* USER CODE END 0 */ /* External variables --------------------------------------------------------*/ +extern DMA_HandleTypeDef hdma_tim2_ch1; extern TIM_HandleTypeDef htim1; +extern TIM_HandleTypeDef htim2; /******************************************************************************/ /* Cortex-M3 Processor Interruption and Exception Handlers */ @@ -184,6 +186,20 @@ void SysTick_Handler(void) /* please refer to the startup file (startup_stm32f1xx.s). */ /******************************************************************************/ +/** +* @brief This function handles DMA1 channel5 global interrupt. +*/ +void DMA1_Channel5_IRQHandler(void) +{ + /* USER CODE BEGIN DMA1_Channel5_IRQn 0 */ + + /* USER CODE END DMA1_Channel5_IRQn 0 */ + HAL_DMA_IRQHandler(&hdma_tim2_ch1); + /* USER CODE BEGIN DMA1_Channel5_IRQn 1 */ + + /* USER CODE END DMA1_Channel5_IRQn 1 */ +} + /** * @brief This function handles TIM1 capture compare interrupt. */ @@ -198,6 +214,20 @@ void TIM1_CC_IRQHandler(void) /* USER CODE END TIM1_CC_IRQn 1 */ } +/** +* @brief This function handles TIM2 global interrupt. +*/ +void TIM2_IRQHandler(void) +{ + /* USER CODE BEGIN TIM2_IRQn 0 */ + + /* USER CODE END TIM2_IRQn 0 */ + HAL_TIM_IRQHandler(&htim2); + /* USER CODE BEGIN TIM2_IRQn 1 */ + + /* USER CODE END TIM2_IRQn 1 */ +} + /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ diff --git a/tools/insertMyCode.pl b/tools/insertMyCode.pl index 83949bc..fccdeb4 100755 --- a/tools/insertMyCode.pl +++ b/tools/insertMyCode.pl @@ -6,6 +6,7 @@ while (<>) { print " my_setup_1();\n" if m/USER CODE BEGIN 1/; print " my_setup_2();\n" if m/USER CODE BEGIN 2/; print " my_loop();\n" if m/USER CODE BEGIN 3/; + print " my_errorHandler();\n" if m/USER CODE BEGIN Error_Handler/; }