Test application for getting the Nucleo F0 30 board to work with Evan's prototype LED board.
Dependencies: mbed
Revision 6:e4da8955cf65, committed 2014-08-08
- Comitter:
- bgrissom
- Date:
- Fri Aug 08 16:58:46 2014 +0000
- Parent:
- 5:9a662dec2ddb
- Commit message:
- Support for a faster PWM on the STM32 F072 chip (was running much slower previously).
Changed in this revision
main.cpp | Show annotated file Show diff for this revision Revisions of this file |
--- a/main.cpp Tue Aug 05 23:53:59 2014 +0000 +++ b/main.cpp Fri Aug 08 16:58:46 2014 +0000 @@ -50,9 +50,9 @@ // PWMCLK pwmout_t outs; pwmout_init(&outs, PB_4); - //pwmout_period_ns(&outs, 2); // 24 MHz (not very clean on the scope) + pwmout_period_ns(&outs, 2); // 24 MHz (not very clean on the scope) // pwmout_period_ns(&outs, 40); // 1.2 MHz on the scope - pwmout_period_us(&outs, 2); // 1.2 MHz on the scope + // Very slow! pwmout_period_us(&outs, 2); pwmout_write(&outs, 0.5f); int ret = OK; // Return value @@ -172,33 +172,110 @@ */ +static TIM_HandleTypeDef TimHandleBAG; -/* HAVE NOT GOTTEN THIS WORKNIG FOR THE F072 -// This code is based off: -// mbed/libraries/mbed/targets/hal/TARGET_STM/TARGET_NUCLEO_F072* /pwmout_api.c pwmout_period_us() +void pwmout_write_BAG(pwmout_t* obj, float value) { + TIM_OC_InitTypeDef sConfig; + int channel = 0; + int complementary_channel = 0; + + TimHandleBAG.Instance = (TIM_TypeDef *)(obj->pwm); + + if (value < (float)0.0) { + value = 0.0; + } else if (value > (float)1.0) { + value = 1.0; + } + + obj->pulse = (uint32_t)((float)obj->period * value); + + // Configure channels + sConfig.OCMode = TIM_OCMODE_PWM1; + sConfig.Pulse = obj->pulse; + sConfig.OCPolarity = TIM_OCPOLARITY_HIGH; + sConfig.OCNPolarity = TIM_OCNPOLARITY_HIGH; + sConfig.OCFastMode = TIM_OCFAST_DISABLE; + sConfig.OCIdleState = TIM_OCIDLESTATE_RESET; + sConfig.OCNIdleState = TIM_OCNIDLESTATE_RESET; + + switch (obj->pin) { + // Channels 1 + case PA_2: + case PA_4: + case PA_6: + case PA_7: + case PA_8: + case PB_1: + case PB_4: + case PB_8: + case PB_9: + case PB_14: + case PC_6: + channel = TIM_CHANNEL_1; + break; + // Channels 1N + case PA_1: + case PB_6: + case PB_7: + case PB_13: + channel = TIM_CHANNEL_1; + complementary_channel = 1; + break; + // Channels 2 + case PA_3: + case PA_9: + case PB_5: + case PB_15: + case PC_7: + channel = TIM_CHANNEL_2; + break; + // Channels 3 + case PA_10: + case PB_0: + case PC_8: + channel = TIM_CHANNEL_3; + break; + // Channels 4 + case PA_11: + case PC_9: + channel = TIM_CHANNEL_4; + break; + default: + return; + } + + HAL_TIM_PWM_ConfigChannel(&TimHandleBAG, &sConfig, channel); + + if (complementary_channel) { + HAL_TIMEx_PWMN_Start(&TimHandleBAG, channel); + } else { + HAL_TIM_PWM_Start(&TimHandleBAG, channel); + } +} + + void pwmout_period_ns(pwmout_t* obj, int us) { - TimHandle.Instance = (TIM_TypeDef *)(obj->pwm); + TimHandleBAG.Instance = (TIM_TypeDef *)(obj->pwm); float dc = pwmout_read(obj); - __HAL_TIM_DISABLE(&TimHandle); + __HAL_TIM_DISABLE(&TimHandleBAG); // Update the SystemCoreClock variable SystemCoreClockUpdate(); - TimHandle.Init.Period = us - 1; - // TimHandle.Init.Prescaler = (uint16_t)(SystemCoreClock / 1000000) - 1; // 1 µs tick - TimHandle.Init.Prescaler = 0; // BAG 1 ns tick (?) - TimHandle.Init.ClockDivision = 0; - TimHandle.Init.CounterMode = TIM_COUNTERMODE_UP; - HAL_TIM_PWM_Init(&TimHandle); + TimHandleBAG.Init.Period = us - 1; + // BAG Orig: TimHandle.Init.Prescaler = (uint16_t)(SystemCoreClock / 1000000) - 1; // 1 µs tick + TimHandleBAG.Init.Prescaler = 0; // BAG 1 ns tick (?) + TimHandleBAG.Init.ClockDivision = 0; + TimHandleBAG.Init.CounterMode = TIM_COUNTERMODE_UP; + HAL_TIM_PWM_Init(&TimHandleBAG); // Set duty cycle again - pwmout_write(obj, dc); + pwmout_write_BAG(obj, dc); // Save for future use obj->period = us; - __HAL_TIM_ENABLE(&TimHandle); + __HAL_TIM_ENABLE(&TimHandleBAG); } -*/ \ No newline at end of file