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
@@ -52,18 +52,18 @@ static const struct nu_modinit_s pwm_modinit_tab[] = {
52
52
{PWM_0_1 , PWM0_CH01_MODULE , CLK_CLKSEL1_PWM0_CH01_S_HCLK , 0 , PWM0_RST , PWM0_IRQn , & pwm0_01_var },
53
53
{PWM_0_2 , PWM0_CH23_MODULE , CLK_CLKSEL1_PWM0_CH23_S_HCLK , 0 , PWM0_RST , PWM0_IRQn , & pwm0_23_var },
54
54
{PWM_0_3 , PWM0_CH23_MODULE , CLK_CLKSEL1_PWM0_CH23_S_HCLK , 0 , PWM0_RST , PWM0_IRQn , & pwm0_23_var },
55
-
55
+
56
56
{PWM_1_0 , PWM1_CH01_MODULE , CLK_CLKSEL2_PWM1_CH01_S_HCLK , 0 , PWM1_RST , PWM1_IRQn , & pwm1_01_var },
57
57
{PWM_1_1 , PWM1_CH01_MODULE , CLK_CLKSEL2_PWM1_CH01_S_HCLK , 0 , PWM1_RST , PWM1_IRQn , & pwm1_01_var },
58
58
{PWM_1_2 , PWM1_CH23_MODULE , CLK_CLKSEL2_PWM1_CH23_S_HCLK , 0 , PWM1_RST , PWM1_IRQn , & pwm1_23_var },
59
59
{PWM_1_3 , PWM1_CH23_MODULE , CLK_CLKSEL2_PWM1_CH23_S_HCLK , 0 , PWM1_RST , PWM1_IRQn , & pwm1_23_var },
60
-
60
+
61
61
{NC , 0 , 0 , 0 , 0 , (IRQn_Type ) 0 , NULL }
62
62
};
63
63
64
- static void pwmout_config (pwmout_t * obj );
64
+ static void pwmout_config (pwmout_t * obj );
65
65
66
- void pwmout_init (pwmout_t * obj , PinName pin )
66
+ void pwmout_init (pwmout_t * obj , PinName pin )
67
67
{
68
68
obj -> pwm = (PWMName ) pinmap_peripheral (pin , PinMap_PWM );
69
69
MBED_ASSERT ((int ) obj -> pwm != NC );
@@ -108,22 +108,22 @@ void pwmout_init(pwmout_t* obj, PinName pin)
108
108
}
109
109
}
110
110
111
- void pwmout_free (pwmout_t * obj )
111
+ void pwmout_free (pwmout_t * obj )
112
112
{
113
113
PWM_T * pwm_base = (PWM_T * ) NU_MODBASE (obj -> pwm );
114
114
uint32_t chn = NU_MODSUBINDEX (obj -> pwm );
115
115
PWM_ForceStop (pwm_base , 1 << chn );
116
-
116
+
117
117
const struct nu_modinit_s * modinit = get_modinit (obj -> pwm , pwm_modinit_tab );
118
118
MBED_ASSERT (modinit != NULL );
119
119
MBED_ASSERT ((PWMName ) modinit -> modname == obj -> pwm );
120
120
((struct nu_pwm_var * ) modinit -> var )-> en_msk &= ~(1 << chn );
121
-
122
-
121
+
122
+
123
123
if ((((struct nu_pwm_var * ) modinit -> var )-> en_msk & 0xF ) == 0 ) {
124
124
CLK_DisableModuleClock (modinit -> clkidx );
125
125
}
126
-
126
+
127
127
if (((struct nu_pwm_var * ) modinit -> var )-> en_msk == 0 ) {
128
128
// Mark this module to be deinited.
129
129
int i = modinit - pwm_modinit_tab ;
@@ -135,29 +135,29 @@ void pwmout_free(pwmout_t* obj)
135
135
obj -> pin = NC ;
136
136
}
137
137
138
- void pwmout_write (pwmout_t * obj , float value )
138
+ void pwmout_write (pwmout_t * obj , float value )
139
139
{
140
- obj -> pulsewidth_us = NU_CLAMP ((uint32_t ) (value * obj -> period_us ), 0 , obj -> period_us );
140
+ obj -> pulsewidth_us = NU_CLAMP ((uint32_t )(value * obj -> period_us ), 0 , obj -> period_us );
141
141
pwmout_config (obj );
142
142
}
143
143
144
- float pwmout_read (pwmout_t * obj )
144
+ float pwmout_read (pwmout_t * obj )
145
145
{
146
146
return NU_CLAMP ((((float ) obj -> pulsewidth_us ) / obj -> period_us ), 0.0f , 1.0f );
147
147
}
148
148
149
- void pwmout_period (pwmout_t * obj , float seconds )
149
+ void pwmout_period (pwmout_t * obj , float seconds )
150
150
{
151
151
pwmout_period_us (obj , seconds * 1000000.0f );
152
152
}
153
153
154
- void pwmout_period_ms (pwmout_t * obj , int ms )
154
+ void pwmout_period_ms (pwmout_t * obj , int ms )
155
155
{
156
156
pwmout_period_us (obj , ms * 1000 );
157
157
}
158
158
159
159
// Set the PWM period, keeping the duty cycle the same.
160
- void pwmout_period_us (pwmout_t * obj , int us )
160
+ void pwmout_period_us (pwmout_t * obj , int us )
161
161
{
162
162
uint32_t period_us_old = obj -> period_us ;
163
163
uint32_t pulsewidth_us_old = obj -> pulsewidth_us ;
@@ -166,23 +166,32 @@ void pwmout_period_us(pwmout_t* obj, int us)
166
166
pwmout_config (obj );
167
167
}
168
168
169
- void pwmout_pulsewidth (pwmout_t * obj , float seconds )
169
+ int pwmout_read_period_us (pwmout_t * obj )
170
+ {
171
+ return obj -> period_us ;
172
+ }
173
+
174
+ void pwmout_pulsewidth (pwmout_t * obj , float seconds )
170
175
{
171
176
pwmout_pulsewidth_us (obj , seconds * 1000000.0f );
172
177
}
173
178
174
- void pwmout_pulsewidth_ms (pwmout_t * obj , int ms )
179
+ void pwmout_pulsewidth_ms (pwmout_t * obj , int ms )
175
180
{
176
181
pwmout_pulsewidth_us (obj , ms * 1000 );
177
182
}
178
183
179
- void pwmout_pulsewidth_us (pwmout_t * obj , int us )
184
+ void pwmout_pulsewidth_us (pwmout_t * obj , int us )
180
185
{
181
186
obj -> pulsewidth_us = NU_CLAMP (us , 0 , obj -> period_us );
182
187
pwmout_config (obj );
183
188
}
184
189
185
- static void pwmout_config (pwmout_t * obj )
190
+ int pwmout_read_pulsewidth_us (pwmout_t * obj {
191
+ return obj -> pulsewidth_us ;
192
+ }
193
+
194
+ static void pwmout_config (pwmout_t * obj )
186
195
{
187
196
PWM_T * pwm_base = (PWM_T * ) NU_MODBASE (obj -> pwm );
188
197
uint32_t chn = NU_MODSUBINDEX (obj -> pwm );
0 commit comments