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
@@ -46,20 +46,20 @@ static const struct nu_modinit_s pwm_modinit_tab[] = {
46
46
{PWM_0_3 , PWM0_MODULE , CLK_CLKSEL2_PWM0SEL_PCLK0 , 0 , PWM0_RST , PWM0P1_IRQn , & pwm0_var },
47
47
{PWM_0_4 , PWM0_MODULE , CLK_CLKSEL2_PWM0SEL_PCLK0 , 0 , PWM0_RST , PWM0P2_IRQn , & pwm0_var },
48
48
{PWM_0_5 , PWM0_MODULE , CLK_CLKSEL2_PWM0SEL_PCLK0 , 0 , PWM0_RST , PWM0P2_IRQn , & pwm0_var },
49
-
49
+
50
50
{PWM_1_0 , PWM1_MODULE , CLK_CLKSEL2_PWM1SEL_PCLK1 , 0 , PWM1_RST , PWM1P0_IRQn , & pwm1_var },
51
51
{PWM_1_1 , PWM1_MODULE , CLK_CLKSEL2_PWM1SEL_PCLK1 , 0 , PWM1_RST , PWM1P0_IRQn , & pwm1_var },
52
52
{PWM_1_2 , PWM1_MODULE , CLK_CLKSEL2_PWM1SEL_PCLK1 , 0 , PWM1_RST , PWM1P1_IRQn , & pwm1_var },
53
53
{PWM_1_3 , PWM1_MODULE , CLK_CLKSEL2_PWM1SEL_PCLK1 , 0 , PWM1_RST , PWM1P1_IRQn , & pwm1_var },
54
54
{PWM_1_4 , PWM1_MODULE , CLK_CLKSEL2_PWM1SEL_PCLK1 , 0 , PWM1_RST , PWM1P2_IRQn , & pwm1_var },
55
55
{PWM_1_5 , PWM1_MODULE , CLK_CLKSEL2_PWM1SEL_PCLK1 , 0 , PWM1_RST , PWM1P2_IRQn , & pwm1_var },
56
-
56
+
57
57
{NC , 0 , 0 , 0 , 0 , (IRQn_Type ) 0 , NULL }
58
58
};
59
59
60
- static void pwmout_config (pwmout_t * obj );
60
+ static void pwmout_config (pwmout_t * obj );
61
61
62
- void pwmout_init (pwmout_t * obj , PinName pin )
62
+ void pwmout_init (pwmout_t * obj , PinName pin )
63
63
{
64
64
obj -> pwm = (PWMName ) pinmap_peripheral (pin , PinMap_PWM );
65
65
MBED_ASSERT ((int ) obj -> pwm != NC );
@@ -83,7 +83,7 @@ void pwmout_init(pwmout_t* obj, PinName pin)
83
83
}
84
84
85
85
// NOTE: All channels (identified by PWMName) share a PWM module. This reset will also affect other channels of the same PWM module.
86
- if (! ((struct nu_pwm_var * ) modinit -> var )-> en_msk ) {
86
+ if (!((struct nu_pwm_var * ) modinit -> var )-> en_msk ) {
87
87
// Reset this module if no channel enabled
88
88
SYS_ResetModule (modinit -> rsetidx );
89
89
}
@@ -107,22 +107,22 @@ void pwmout_init(pwmout_t* obj, PinName pin)
107
107
pwm_modinit_mask |= 1 << i ;
108
108
}
109
109
110
- void pwmout_free (pwmout_t * obj )
110
+ void pwmout_free (pwmout_t * obj )
111
111
{
112
112
PWM_T * pwm_base = (PWM_T * ) NU_MODBASE (obj -> pwm );
113
113
uint32_t chn = NU_MODSUBINDEX (obj -> pwm );
114
114
PWM_ForceStop (pwm_base , 1 << chn );
115
-
115
+
116
116
const struct nu_modinit_s * modinit = get_modinit (obj -> pwm , pwm_modinit_tab );
117
117
MBED_ASSERT (modinit != NULL );
118
118
MBED_ASSERT (modinit -> modname == obj -> pwm );
119
119
((struct nu_pwm_var * ) modinit -> var )-> en_msk &= ~(1 << chn );
120
-
121
-
120
+
121
+
122
122
if ((((struct nu_pwm_var * ) modinit -> var )-> en_msk & 0x3F ) == 0 ) {
123
123
CLK_DisableModuleClock (modinit -> clkidx );
124
124
}
125
-
125
+
126
126
// Mark this module to be deinited.
127
127
int i = modinit - pwm_modinit_tab ;
128
128
pwm_modinit_mask &= ~(1 << i );
@@ -132,29 +132,29 @@ void pwmout_free(pwmout_t* obj)
132
132
obj -> pin = NC ;
133
133
}
134
134
135
- void pwmout_write (pwmout_t * obj , float value )
135
+ void pwmout_write (pwmout_t * obj , float value )
136
136
{
137
- obj -> pulsewidth_us = NU_CLAMP ((uint32_t ) (value * obj -> period_us ), 0 , obj -> period_us );
137
+ obj -> pulsewidth_us = NU_CLAMP ((uint32_t )(value * obj -> period_us ), 0 , obj -> period_us );
138
138
pwmout_config (obj );
139
139
}
140
140
141
- float pwmout_read (pwmout_t * obj )
141
+ float pwmout_read (pwmout_t * obj )
142
142
{
143
143
return NU_CLAMP ((((float ) obj -> pulsewidth_us ) / obj -> period_us ), 0.0f , 1.0f );
144
144
}
145
145
146
- void pwmout_period (pwmout_t * obj , float seconds )
146
+ void pwmout_period (pwmout_t * obj , float seconds )
147
147
{
148
148
pwmout_period_us (obj , seconds * 1000000.0f );
149
149
}
150
150
151
- void pwmout_period_ms (pwmout_t * obj , int ms )
151
+ void pwmout_period_ms (pwmout_t * obj , int ms )
152
152
{
153
153
pwmout_period_us (obj , ms * 1000 );
154
154
}
155
155
156
156
// Set the PWM period, keeping the duty cycle the same.
157
- void pwmout_period_us (pwmout_t * obj , int us )
157
+ void pwmout_period_us (pwmout_t * obj , int us )
158
158
{
159
159
uint32_t period_us_old = obj -> period_us ;
160
160
uint32_t pulsewidth_us_old = obj -> pulsewidth_us ;
@@ -163,23 +163,32 @@ void pwmout_period_us(pwmout_t* obj, int us)
163
163
pwmout_config (obj );
164
164
}
165
165
166
- void pwmout_pulsewidth (pwmout_t * obj , float seconds )
166
+ int pwmout_read_period_us (pwmout_t * obj )
167
+ {
168
+ return obj -> period_us ;
169
+ }
170
+
171
+ void pwmout_pulsewidth (pwmout_t * obj , float seconds )
167
172
{
168
173
pwmout_pulsewidth_us (obj , seconds * 1000000.0f );
169
174
}
170
175
171
- void pwmout_pulsewidth_ms (pwmout_t * obj , int ms )
176
+ void pwmout_pulsewidth_ms (pwmout_t * obj , int ms )
172
177
{
173
178
pwmout_pulsewidth_us (obj , ms * 1000 );
174
179
}
175
180
176
- void pwmout_pulsewidth_us (pwmout_t * obj , int us )
181
+ void pwmout_pulsewidth_us (pwmout_t * obj , int us )
177
182
{
178
183
obj -> pulsewidth_us = NU_CLAMP (us , 0 , obj -> period_us );
179
184
pwmout_config (obj );
180
185
}
181
186
182
- static void pwmout_config (pwmout_t * obj )
187
+ int pwmout_read_pulsewidth_us (pwmout_t * obj {
188
+ return obj -> pulsewidth_us ;
189
+ }
190
+
191
+ static void pwmout_config (pwmout_t * obj )
183
192
{
184
193
PWM_T * pwm_base = (PWM_T * ) NU_MODBASE (obj -> pwm );
185
194
uint32_t chn = NU_MODSUBINDEX (obj -> pwm );
0 commit comments