13
13
* See the License for the specific language governing permissions and
14
14
* limitations under the License.
15
15
*/
16
-
16
+
17
17
#include "pwmout_api.h"
18
18
19
19
#if DEVICE_PWMOUT
@@ -47,20 +47,20 @@ static const struct nu_modinit_s pwm_modinit_tab[] = {
47
47
{PWM_0_3 , PWM0CH23_MODULE , CLK_CLKSEL2_PWM0CH23SEL_HIRC , 0 , PWM0_RST , PWM0CH3_IRQn , & pwm0_var },
48
48
{PWM_0_4 , PWM0CH45_MODULE , CLK_CLKSEL2_PWM0CH45SEL_HIRC , 0 , PWM0_RST , PWM0CH4_IRQn , & pwm0_var },
49
49
{PWM_0_5 , PWM0CH45_MODULE , CLK_CLKSEL2_PWM0CH45SEL_HIRC , 0 , PWM0_RST , PWM0CH5_IRQn , & pwm0_var },
50
-
50
+
51
51
{PWM_1_0 , PWM1CH01_MODULE , CLK_CLKSEL2_PWM1CH01SEL_HIRC , 0 , PWM1_RST , PWM1CH0_IRQn , & pwm1_var },
52
52
{PWM_1_1 , PWM1CH01_MODULE , CLK_CLKSEL2_PWM1CH01SEL_HIRC , 0 , PWM1_RST , PWM1CH1_IRQn , & pwm1_var },
53
53
{PWM_1_2 , PWM1CH23_MODULE , CLK_CLKSEL2_PWM1CH23SEL_HIRC , 0 , PWM1_RST , PWM1CH2_IRQn , & pwm1_var },
54
54
{PWM_1_3 , PWM1CH23_MODULE , CLK_CLKSEL2_PWM1CH23SEL_HIRC , 0 , PWM1_RST , PWM1CH3_IRQn , & pwm1_var },
55
55
{PWM_1_4 , PWM1CH45_MODULE , CLK_CLKSEL2_PWM1CH45SEL_HIRC , 0 , PWM1_RST , PWM1CH4_IRQn , & pwm1_var },
56
56
{PWM_1_5 , PWM1CH45_MODULE , CLK_CLKSEL2_PWM1CH45SEL_HIRC , 0 , PWM1_RST , PWM1CH5_IRQn , & pwm1_var },
57
-
57
+
58
58
{NC , 0 , 0 , 0 , 0 , (IRQn_Type ) 0 , NULL }
59
59
};
60
60
61
- static void pwmout_config (pwmout_t * obj );
61
+ static void pwmout_config (pwmout_t * obj );
62
62
63
- void pwmout_init (pwmout_t * obj , PinName pin )
63
+ void pwmout_init (pwmout_t * obj , PinName pin )
64
64
{
65
65
obj -> pwm = (PWMName ) pinmap_peripheral (pin , PinMap_PWM );
66
66
MBED_ASSERT ((int ) obj -> pwm != NC );
@@ -83,15 +83,15 @@ void pwmout_init(pwmout_t* obj, PinName pin)
83
83
84
84
// Enable clock of paired channels
85
85
CLK_EnableModuleClock (modinit -> clkidx );
86
-
86
+
87
87
// FIXME: PWM_1_2/3 design bug. PWM_1_2/3 also require PWM_1_0/1 clock enabled.
88
88
if (obj -> pwm == PWM_1_2 || obj -> pwm == PWM_1_3 ) {
89
89
CLK_EnableModuleClock (PWM1CH01_MODULE );
90
90
}
91
91
}
92
92
93
93
// NOTE: All channels (identified by PWMName) share a PWM module. This reset will also affect other channels of the same PWM module.
94
- if (! ((struct nu_pwm_var * ) modinit -> var )-> en_msk ) {
94
+ if (!((struct nu_pwm_var * ) modinit -> var )-> en_msk ) {
95
95
// Reset this module if no channel enabled
96
96
SYS_ResetModule (modinit -> rsetidx );
97
97
}
@@ -102,30 +102,30 @@ void pwmout_init(pwmout_t* obj, PinName pin)
102
102
obj -> period_us = 1000 * 10 ;
103
103
obj -> pulsewidth_us = 0 ;
104
104
pwmout_config (obj );
105
-
105
+
106
106
// Enable output of the specified PWM channel
107
107
PWM_EnableOutput (pwm_base , 1 << chn );
108
108
PWM_Start (pwm_base , 1 << chn );
109
-
109
+
110
110
((struct nu_pwm_var * ) modinit -> var )-> en_msk |= 1 << chn ;
111
-
111
+
112
112
// Mark this module to be inited.
113
113
int i = modinit - pwm_modinit_tab ;
114
114
pwm_modinit_mask |= 1 << i ;
115
115
}
116
116
117
- void pwmout_free (pwmout_t * obj )
117
+ void pwmout_free (pwmout_t * obj )
118
118
{
119
119
PWM_T * pwm_base = (PWM_T * ) NU_MODBASE (obj -> pwm );
120
120
uint32_t chn = NU_MODSUBINDEX (obj -> pwm );
121
121
PWM_ForceStop (pwm_base , 1 << chn );
122
-
122
+
123
123
const struct nu_modinit_s * modinit = get_modinit (obj -> pwm , pwm_modinit_tab );
124
124
MBED_ASSERT (modinit != NULL );
125
125
MBED_ASSERT (modinit -> modname == obj -> pwm );
126
126
((struct nu_pwm_var * ) modinit -> var )-> en_msk &= ~(1 << chn );
127
-
128
-
127
+
128
+
129
129
if ((((struct nu_pwm_var * ) modinit -> var )-> en_msk & (0x3 << (chn / 2 * 2 ))) == 0 ) {
130
130
// FIXME: PWM_1_2/3 design bug. PWM_1_2/3 also require PWM_1_0/1 clock enabled.
131
131
switch (obj -> pwm ) {
@@ -134,51 +134,51 @@ void pwmout_free(pwmout_t* obj)
134
134
if (pwm1_var .en_msk & 0xC ) {
135
135
break ;
136
136
}
137
-
137
+
138
138
case PWM_1_2 :
139
139
case PWM_1_3 :
140
- if (! (pwm1_var .en_msk & 0x3 )) {
140
+ if (!(pwm1_var .en_msk & 0x3 )) {
141
141
CLK_DisableModuleClock (PWM1CH01_MODULE );
142
142
}
143
-
143
+
144
144
default :
145
145
// Disable clock of paired channels
146
146
CLK_DisableModuleClock (modinit -> clkidx );
147
147
}
148
148
}
149
-
149
+
150
150
// Mark this module to be deinited.
151
151
int i = modinit - pwm_modinit_tab ;
152
152
pwm_modinit_mask &= ~(1 << i );
153
-
153
+
154
154
// Free up pins
155
155
gpio_set (obj -> pin );
156
156
obj -> pin = NC ;
157
157
}
158
158
159
- void pwmout_write (pwmout_t * obj , float value )
159
+ void pwmout_write (pwmout_t * obj , float value )
160
160
{
161
- obj -> pulsewidth_us = NU_CLAMP ((uint32_t ) (value * obj -> period_us ), 0 , obj -> period_us );
161
+ obj -> pulsewidth_us = NU_CLAMP ((uint32_t )(value * obj -> period_us ), 0 , obj -> period_us );
162
162
pwmout_config (obj );
163
163
}
164
164
165
- float pwmout_read (pwmout_t * obj )
165
+ float pwmout_read (pwmout_t * obj )
166
166
{
167
167
return NU_CLAMP ((((float ) obj -> pulsewidth_us ) / obj -> period_us ), 0.0f , 1.0f );
168
168
}
169
169
170
- void pwmout_period (pwmout_t * obj , float seconds )
170
+ void pwmout_period (pwmout_t * obj , float seconds )
171
171
{
172
172
pwmout_period_us (obj , seconds * 1000000.0f );
173
173
}
174
174
175
- void pwmout_period_ms (pwmout_t * obj , int ms )
175
+ void pwmout_period_ms (pwmout_t * obj , int ms )
176
176
{
177
177
pwmout_period_us (obj , ms * 1000 );
178
178
}
179
179
180
180
// Set the PWM period, keeping the duty cycle the same.
181
- void pwmout_period_us (pwmout_t * obj , int us )
181
+ void pwmout_period_us (pwmout_t * obj , int us )
182
182
{
183
183
uint32_t period_us_old = obj -> period_us ;
184
184
uint32_t pulsewidth_us_old = obj -> pulsewidth_us ;
@@ -187,23 +187,32 @@ void pwmout_period_us(pwmout_t* obj, int us)
187
187
pwmout_config (obj );
188
188
}
189
189
190
- void pwmout_pulsewidth (pwmout_t * obj , float seconds )
190
+ int pwmout_read_period_us (pwmout_t * obj )
191
+ {
192
+ return obj -> period_us ;
193
+ }
194
+
195
+ void pwmout_pulsewidth (pwmout_t * obj , float seconds )
191
196
{
192
197
pwmout_pulsewidth_us (obj , seconds * 1000000.0f );
193
198
}
194
199
195
- void pwmout_pulsewidth_ms (pwmout_t * obj , int ms )
200
+ void pwmout_pulsewidth_ms (pwmout_t * obj , int ms )
196
201
{
197
202
pwmout_pulsewidth_us (obj , ms * 1000 );
198
203
}
199
204
200
- void pwmout_pulsewidth_us (pwmout_t * obj , int us )
205
+ void pwmout_pulsewidth_us (pwmout_t * obj , int us )
201
206
{
202
207
obj -> pulsewidth_us = NU_CLAMP (us , 0 , obj -> period_us );
203
208
pwmout_config (obj );
204
209
}
205
210
206
- static void pwmout_config (pwmout_t * obj )
211
+ int pwmout_read_pulsewidth_us (pwmout_t * obj {
212
+ return obj -> pulsewidth_us ;
213
+ }
214
+
215
+ static void pwmout_config (pwmout_t * obj )
207
216
{
208
217
PWM_T * pwm_base = (PWM_T * ) NU_MODBASE (obj -> pwm );
209
218
uint32_t chn = NU_MODSUBINDEX (obj -> pwm );
0 commit comments