Skip to content

Commit e059f65

Browse files
committed
pwm mbed HAL
- using jusst ftm hal from KPSDK, not yet functional
1 parent b784278 commit e059f65

File tree

4 files changed

+73
-14
lines changed

4 files changed

+73
-14
lines changed

libraries/mbed/targets/hal/TARGET_Freescale/TARGET_KPSDK_MCUS/TARGET_K64F/PeripheralNames.h

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,20 @@ typedef enum {
4848
PWM_8 = (0 << TPM_SHIFT) | (7), // FTM0 CH7
4949
PWM_9 = (1 << TPM_SHIFT) | (0), // FTM1 CH0
5050
PWM_10 = (1 << TPM_SHIFT) | (1), // FTM1 CH1
51+
PWM_11 = (1 << TPM_SHIFT) | (2), // FTM1 CH2
52+
PWM_12 = (1 << TPM_SHIFT) | (3), // FTM1 CH3
53+
PWM_13 = (1 << TPM_SHIFT) | (4), // FTM1 CH4
54+
PWM_14 = (1 << TPM_SHIFT) | (5), // FTM1 CH5
55+
PWM_15 = (1 << TPM_SHIFT) | (6), // FTM1 CH6
56+
PWM_16 = (1 << TPM_SHIFT) | (7), // FTM1 CH7
57+
PWM_17 = (2 << TPM_SHIFT) | (0), // FTM2 CH0
58+
PWM_18 = (2 << TPM_SHIFT) | (1), // FTM2 CH1
59+
PWM_19 = (2 << TPM_SHIFT) | (2), // FTM2 CH2
60+
PWM_20 = (2 << TPM_SHIFT) | (3), // FTM2 CH3
61+
PWM_21 = (2 << TPM_SHIFT) | (4), // FTM2 CH4
62+
PWM_22 = (2 << TPM_SHIFT) | (5), // FTM2 CH5
63+
PWM_23 = (2 << TPM_SHIFT) | (6), // FTM2 CH6
64+
PWM_24 = (2 << TPM_SHIFT) | (7), // FTM2 CH7
5165
} PWMName;
5266

5367
#define ADC_SHIFT 8

libraries/mbed/targets/hal/TARGET_Freescale/TARGET_KPSDK_MCUS/TARGET_K64F/objects.h

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,7 @@ struct port_s {
3838
};
3939

4040
struct pwmout_s {
41-
__IO uint32_t *MOD;
42-
__IO uint32_t *CNT;
43-
__IO uint32_t *CnV;
44-
__IO uint32_t *SYNC;
41+
PWMName pwm_name;
4542
};
4643

4744
struct serial_s {

libraries/mbed/targets/hal/TARGET_Freescale/TARGET_KPSDK_MCUS/TARGET_K64F/pwmout_api.c

Lines changed: 57 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -18,45 +18,93 @@
1818
#include "cmsis.h"
1919
#include "pinmap.h"
2020
#include "error.h"
21+
#include "fsl_ftm_hal.h"
22+
#include "fsl_mcg_hal.h"
23+
#include "fsl_clock_manager.h"
2124

2225
static const PinMap PinMap_PWM[] = {
23-
{NC , NC , 0}
26+
{PTB18, PWM_17, 3},
27+
{NC , NC , 0}
2428
};
2529

26-
#define PWM_CLOCK_MHZ (0.75) // (48)MHz / 64 = (0.75)MHz
30+
static float pwm_clock;
2731

2832
void pwmout_init(pwmout_t* obj, PinName pin) {
29-
33+
PWMName pwm = (PWMName)pinmap_peripheral(pin, PinMap_PWM);
34+
if (pwm == (PWMName)NC) {
35+
error("PwmOut pin mapping failed");
36+
}
37+
obj->pwm_name = pwm;
38+
39+
float clkval = clock_hal_get_fllclk() / 1000000.0f;
40+
uint32_t clkdiv = 0;
41+
while (clkval > 1) {
42+
clkdiv++;
43+
clkval /= 2.0f;
44+
if (clkdiv == 7)
45+
break;
46+
}
47+
uint32_t channel = pwm & 0xF;
48+
uint32_t instance = pwm >> TPM_SHIFT;
49+
clock_manager_set_gate(kClockModuleFTM, instance, true);
50+
ftm_hal_set_clock_ps(instance, (ftm_clock_ps_t)clkdiv);
51+
ftm_hal_set_clock_source(instance, kClock_source_FTM_SystemClk);
52+
ftm_hal_set_channel_edge_level(instance, channel, 2);
53+
// default to 20ms: standard for servos, and fine for e.g. brightness control
54+
pwmout_period_ms(obj, 20);
55+
pwmout_write (obj, 0);
56+
57+
// Wire pinout
58+
pinmap_pinout(pin, PinMap_PWM);
3059
}
3160

32-
void pwmout_free(pwmout_t* obj) {}
61+
void pwmout_free(pwmout_t* obj) {
62+
}
3363

3464
void pwmout_write(pwmout_t* obj, float value) {
35-
65+
if (value < 0.0f) {
66+
value = 0.0f;
67+
} else if (value > 1.0f) {
68+
value = 1.0f;
69+
}
70+
uint16_t mod = ftm_hal_get_mod(obj->pwm_name >> TPM_SHIFT);
71+
uint32_t new_count = (uint32_t)((float)(mod) * value);
72+
ftm_hal_set_channel_count_value(obj->pwm_name >> TPM_SHIFT, obj->pwm_name & 0xF, new_count);
73+
// *obj->CNT = 0;
3674
}
3775

3876
float pwmout_read(pwmout_t* obj) {
39-
return 1;
77+
uint16_t count = ftm_hal_get_channel_count_value(obj->pwm_name >> TPM_SHIFT, obj->pwm_name & 0xF, 0);
78+
uint16_t mod = ftm_hal_get_mod(obj->pwm_name >> TPM_SHIFT);
79+
float v = (float)(count) / (float)(mod);
80+
return (v > 1.0f) ? (1.0f) : (v);
4081
}
4182

4283
void pwmout_period(pwmout_t* obj, float seconds) {
43-
84+
pwmout_period_us(obj, seconds * 1000000.0f);
4485
}
4586

4687
void pwmout_period_ms(pwmout_t* obj, int ms) {
88+
pwmout_period_us(obj, ms * 1000);
4789
}
4890

4991
// Set the PWM period, keeping the duty cycle the same.
5092
void pwmout_period_us(pwmout_t* obj, int us) {
93+
float dc = pwmout_read(obj);
94+
ftm_hal_set_mod(obj->pwm_name >> TPM_SHIFT, (uint32_t)(pwm_clock * (float)us));
95+
pwmout_write(obj, dc);
96+
5197
}
5298

5399
void pwmout_pulsewidth(pwmout_t* obj, float seconds) {
54-
100+
pwmout_pulsewidth_us(obj, seconds * 1000000.0f);
55101
}
56102

57103
void pwmout_pulsewidth_ms(pwmout_t* obj, int ms) {
104+
pwmout_pulsewidth_us(obj, ms * 1000);
58105
}
59106

60107
void pwmout_pulsewidth_us(pwmout_t* obj, int us) {
61-
108+
uint32_t value = (uint32_t)(pwm_clock * (float)us);
109+
ftm_hal_set_channel_count_value(obj->pwm_name >> TPM_SHIFT, obj->pwm_name & 0xF, value);
62110
}

libraries/mbed/targets/hal/TARGET_Freescale/TARGET_KPSDK_MCUS/TARGET_KPSDK_CODE/hal/sim/fsl_sim_clock_module_names_K64F12.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ const sim_clock_gate_module_config_t kSimClockGateModuleConfigTable [] = {
8282
{kSimClockModulePDB, 0, HW_SIM_SCGC6_ADDR, SIM_SCGC6_PDB_MASK},
8383
{kSimClockModuleFTM, 0, HW_SIM_SCGC6_ADDR, SIM_SCGC6_FTM0_MASK},
8484
{kSimClockModuleFTM, 1, HW_SIM_SCGC6_ADDR, SIM_SCGC6_FTM1_MASK},
85-
{kSimClockModuleFTM, 2, HW_SIM_SCGC3_ADDR, SIM_SCGC3_FTM2_MASK},
85+
{kSimClockModuleFTM, 2, HW_SIM_SCGC6_ADDR, SIM_SCGC6_FTM2_MASK},
8686
{kSimClockModuleFTM, 3, HW_SIM_SCGC3_ADDR, SIM_SCGC3_FTM3_MASK},
8787
{kSimClockModulePIT, 0, HW_SIM_SCGC6_ADDR, SIM_SCGC6_PIT_MASK},
8888
{kSimClockModuleLPTIMER, 0, HW_SIM_SCGC5_ADDR, SIM_SCGC5_LPTMR_MASK},

0 commit comments

Comments
 (0)