Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed
Diff: main.cpp
- Revision:
- 6:e4da8955cf65
- Parent:
- 5:9a662dec2ddb
--- 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