Test application for getting the Nucleo F0 30 board to work with Evan's prototype LED board.

Dependencies:   mbed

Files at this revision

API Documentation at this revision

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