1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
|
# FPWM 驱动程序
## 1. 概述
PWM(Pulse Width Modulation)简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在测量、通信、工控等方面。
## 2. 功能
pwm控制器驱动提供了pwm的控制访问方法,
- 初始化pwm控制器,配置相关参数,如时钟分频,周期,占空比,输出极性等
- 计数中断与FIFO_EMPTY中断的触发等
- E2000共有8个PWM模块(控制器),每个模块集成了两个子模块pwm0和pwm1,我们习惯性的称为channel0和channel1,在死区输出模式配置为bypass时,这两个channel可以作为两路独立的pwm输出使用,在非bypass模式下,则输出为死区配置,此时需要选择输入源是channel0还是channel1,然后配置对应项即可
驱动相关的源文件包括
```
.
├── fpwm_g.c
├── fpwm_hw.c
├── fpwm_hw.h
├── fpwm_intr.c
├── fpwm_sinit.c
├── fpwm.c
└── fpwm.h
```
## 3. 配置方法
以下部分将指导您完成 fpwm 驱动的软件配置:
- 初始化pwm控制器
- 配置pwm的两个通道的输出模式,以及是否死区输出等
- 注册中断处理函数,使能中断
- pwm的周期,频率,占空比设置方法如下:

e2000的参考时钟是50M,freq为频率,duty为占空比,1/freq就是周期;
perioad对应寄存器FPWM_PERIOD_OFFSET,div对应FPWM_TIM_CTRL_OFFSET寄存器中的DIV,ccr对应寄存器FPWM_CCR_OFFSET;
## 4 应用示例
### [pwm波形输出](../../../baremetal/example/peripheral/pwm)
## 5. API参考
### 5.1. 用户数据结构
- fpwm控制数据
```c
typedef struct
{
FPwmConfig config;/* Pwm配置 */
u32 is_ready;/* Pwm初始化完成标志 */
u8 channel_ctrl_enable[2]; /* pwm channel ctrl enable state */
FPwmIntrEventHandler event_handler[FPWM_INTR_EVENT_NUM]; /* event handler for interrupt */
void *event_param[FPWM_INTR_EVENT_NUM]; /* parameters ptr of event handler */
} FPwmCtrl;
```
- fpwm配置数据,FPwmConfig主要是pwm控制器id、基地址和中断号,FPwmDbVariableConfig主要包括用户可配置的死区参数,包括死区输出模式、输出极性、输入源选择、上下沿延迟等,FPwmVariableConfig主要包含pwm的输出参数,包括分频、周期、占空比、极性等
```c
typedef struct
{
u8 instance_id;/* pwm id */
uintptr db_base_addr;
uintptr pwm_base_addr;
u64 base_clk;
u32 irq_num; /* pwm irq num*/
u32 irq_prority; /* pwm irq priority */
const char *instance_name;/* instance name */
}FPwmConfig;/* Pwm配置 */;
typedef struct
{
FPwmDbPolarity db_polarity_sel;
FPwmDbOutMode db_out_mode;
FPwmDbInMode db_in_mode;
u16 db_fall_cycle;
u16 db_rise_cycle;
}FPwmDbVariableConfig;
typedef struct
{
u8 tim_ctrl_enable;/* pwm time ctrl enable state */
FPwmTimCtrlMode tim_ctrl_mode;
u16 tim_ctrl_div;
u16 pwm_period;
FPwmCtrlMode pwm_mode;
FPwmPolarity pwm_polarity;
FPwmDutySourceMode pwm_duty_source_mode;
u16 pwm_pulse;
}FPwmVariableConfig;
```
- 死区输出模式
```c
typedef enum
{
FPWM_DB_OUT_MODE_BYPASS = 0b00,
FPWM_DB_OUT_MODE_FORBID_RISE = 0b01,
FPWM_DB_OUT_MODE_FORBID_FALL = 0b10,
FPWM_DB_OUT_MODE_ENABLE_RISE_FALL = 0b11,
FPWM_DB_OUT_MODE_NUM
} FPwmDbOutMode;
```
- fpwm duty比较值来源选择
```c
typedef enum
{
FPWM_DUTY_CCR = 0,
FPWM_DUTY_FIFO = 1,
FPWM_DUTY_SEL_MODE_NUM
} FPwmDutySourceMode;;
```
- fpwm中断事件类型
```c
typedef enum
{
FPWM_INTR_EVENT_COUNTER = 0, /**< Handler type for counter interrupt */
FPWM_INTR_EVENT_FIFO_EMPTY = 1, /**< Handler type for fifo empty interrupt*/
FPWM_INTR_EVENT_NUM
} FPwmIntrEventType;
```
### 5.2 错误码定义
- FPWM_SUCCESS 执行成功
- FPWM_ERR_INVAL_PARM 参数无效
- FPWM_ERR_NOT_READY 驱动未初始化
- FPWM_ERR_TIMEOUT 超时
- FPWM_ERR_NOT_SUPPORT 不支持
- FPWM_ERR_CMD_FAILED 执行失败
### 5.3. 用户API接口
#### FPwmLookupConfig
- 获取Fata控制器默认配置
```c
const FPwmConfig *FPwmLookupConfig(FPwmInstance instance_id);
```
Note:
- 获取默认配置参数,包括基地址、中断号等
Input:
- {FPwmInstance} instance_id,pwm控制器id号
Return:
- {const FPwmConfig *} pwm默认配置,返回NULL如果找不到默认配置
#### FPwmCfgInitialize
- 初始化fpwm控制器, 使之可以使用
```c
FError FPwmCfgInitialize(FPwmCtrl *pctrl, const FPwmConfig *input_config_p);
```
Note:
- 输入配置通过FPwmLookupConfig获取,用户按照需要修改后传入此函数
Input:
- {FPwmCtrl} *pctrl,pwm驱动控制数据
- {FPwmConfig} *input_config_p,pwm用户输入配置
Return:
- {FError} 驱动初始化的错误码信息,FPWM_SUCCESS 表示初始化成功,其它返回值表示初始化失败
#### FPwmDbVariableSet
- 设置pwm死区输出的配置参数
```c
FError FPwmDbVariableSet(FPwmCtrl *pctrl, FPwmDbVariableConfig *db_cfg);
```
Note:
- 设置指定pwm控制器的死区可配置参数,包括死区输出模式、输出极性、输入源选择、上下沿延迟等
Input:
- {FPwmCtrl} *pctrl,pwm驱动控制数据
- {FPwmDbVariableConfig} *db_cfg,pwm死区参数配置
Return:
- {FError} 驱动初始化的错误码信息,FPWM_SUCCESS 表示初始化成功,其它返回值表示初始化失败
#### FPwmVariableSet
- 设置pwm通道的参数,使能该通道
```c
FError FPwmVariableSet(FPwmCtrl *pctrl, u32 channel, FPwmVariableConfig *pwm_cfg);
```
Note:
- 设置指定pwm控制器的指定通道的分频、周期、占空比、极性,使能该通道
Input:
- {FPwmCtrl} *pctrl,pwm驱动控制数据
- {u32} channel,pwm通道号
- {FPwmVariableConfig} *pwm_cfg,pwm通道配置
Return:
- {FError} 驱动初始化的错误码信息,FPWM_SUCCESS 表示初始化成功,其它返回值表示初始化失败
#### FPwmPulseSet
- 设置pwm通道的占空比比较值
```c
FError FPwmPulseSet(FPwmCtrl *pctrl, u32 channel, u16 pwm_ccr);
```
Note:
- 设置指定pwm控制器的指定通道的占空比比较值
Input:
- {FPwmCtrl} *pctrl,pwm驱动控制数据
- {u32} channel,pwm通道号
- {u16} pwm_ccr,占空比比较值
Return:
- {FError} 驱动初始化的错误码信息,FPWM_SUCCESS 表示初始化成功,其它返回值表示初始化失败
#### FPwmEnable
- 使能pwm控制器
```c
void FPwmEnable(FPwmCtrl *pctrl, u32 channel);
```
Note:
- 使能指定pwm控制器的指定通道
Input:
- {FPwmCtrl} *pctrl,pwm驱动控制数据
- {u32} channel,pwm通道号
Return:
- {FError} 驱动初始化的错误码信息,FPWM_SUCCESS 表示初始化成功,其它返回值表示初始化失败
#### FPwmRegisterInterruptHandler
- 注册pwm中断事件函数
```c
void FPwmRegisterInterruptHandler(FPwmCtrl *instance_p, FPwmIntrEventType event_type,
FPwmIntrEventHandler handler, void *param);
```
Note:
- 无
Input:
- {FPwmCtrl} *instance_p,fpwm驱动控制数据
- {FPwmIntrEventType} event_type,中断事件类型
- {FPwmIntrEventHandler} handler,中断事件回调函数
- {void} *param,回调函数参数
Return:
- 无
#### FPwmIntrHandler
- pwm中断处理函数入口
```c
void FPwmIntrHandler(s32 vector, void *args);
```
Note:
- 根据中断类型,设置对应的回调函数和参数传入
Input:
- {s32} vector
- {void} *param, 输入参数,指向fpwm驱动控制数据
Return:
- 无
|