README.md
1# BearPi-HM_Nano开发板基础外设开发——PWM输出
2本示例将演示如何在BearPi-HM_Nano开发板上使用GPIO的PWM功能实现呼吸灯的效果。
3
4
5## PWM API分析
6本案例主要使用了以下几个API通过GPIO的PWM功能实现呼吸灯效果。
7### IoTGpioInit()
8```c
9unsigned int IoTGpioInit(unsigned int id);
10```
11 **描述:**
12
13初始化GPIO外设。
14
15**参数:**
16
17|参数名|描述|
18|:--|:------|
19| id | 表示GPIO引脚号。 |
20
21### IoTGpioSetFunc()
22```c
23unsigned int IoTGpioSetFunc(unsigned int id, unsigned char val);
24```
25**描述:**
26
27设置GPIO引脚复用的功能。
28
29**参数:**
30
31|参数名|描述|
32|:--|:------|
33| id | 表示GPIO引脚号。 |
34| val | 表示GPIO复用的功能。 |
35
36### IoTGpioSetDir()
37```c
38unsigned int IoTGpioSetDir(unsigned int id, IotGpioDir dir);
39```
40**描述:**
41
42设置GPIO的方向。
43
44**参数:**
45
46|参数名|描述|
47|:--|:------|
48| id | 表示GPIO引脚号。 |
49| dir | 表示GPIO方向为输入还是输出。 |
50
51
52### IoTPwmInit()
53```c
54unsigned int IoTPwmInit(unsigned int port);
55```
56**描述:**
57初始化PWM功能。
58
59**参数:**
60
61|参数名|描述|
62|:--|:------|
63| port | 表示PWM设备端口号。 |
64
65
66
67## IoTPwmStart()
68```c
69unsigned int IoTPwmStart(unsigned int port, unsigned short duty, unsigned int freq);
70```
71**描述:**
72
73根据输入参数输出PWM信号。
74
75**参数:**
76
77|参数名|描述|
78|:--|:------|
79| port | PWM端口号。 |
80| duty | PWM信号输出占空比。 |
81| freq | PWM信号输出频率。 |
82
83
84## 硬件设计
85本案例将使用板载的LED来验证GPIO的PWM功能,在BearPi-HM_Nano开发板上LED的连接电路图如下图所示,LED的控制引脚与主控芯片的GPIO_2连接,所以需要编写软件去控制GPIO_2输出PWM波实现呼吸灯的效果。
86
87
88
89## 软件设计
90
91**主要代码分析**
92
93PWMTask()为PWM测试主任务,该任务先调用 IoTGpioInit()初始化GPIO,因为LED灯的控制引脚接在GPIO_2上,所以通过调用IoTGpioSetFunc()将GPIO_2复用为PWM功能,并通过IoTPwmInit()初始化PWM2端口,最后在死循环里面间隔10us输出不同占空比的PWM波,实现呼吸灯的效果。
94```c
95/**
96 * @brief pwm task output PWM with different duty cycle
97 *
98 */
99static void PwmTask(void)
100{
101 unsigned int i;
102
103 // init gpio of LED
104 IoTGpioInit(LED_GPIO);
105
106 // set the GPIO_2 multiplexing function to PWM
107 IoTGpioSetFunc(LED_GPIO, IOT_GPIO_FUNC_GPIO_2_PWM2_OUT);
108
109 // set GPIO_2 is output mode
110 IoTGpioSetDir(LED_GPIO, IOT_GPIO_DIR_OUT);
111
112 // init PWM2
113 IoTPwmInit(LED_GPIO);
114
115 while (1) {
116 for (i = 0; i < PWM_CHANGE_TIMES; i++) {
117 // output PWM with different duty cycle
118 IoTPwmStart(LED_GPIO, i, PWM_FREQ);
119 usleep(PWM_DELAY_10US);
120 }
121 i = 0;
122 }
123}
124```
125
126## 编译调试
127
128### 修改 BUILD.gn 文件
129
130
131修改`device\board\bearpi\bearpi_hm_nano\app` 路径下 BUILD.gn 文件,指定 `pwm_example` 参与编译。
132
133```r
134#"B1_basic_led_blink:led_example",
135#"B2_basic_button:button_example",
136"B3_basic_pwm_led:pwm_example",
137#"B4_basic_adc:adc_example",
138#"B5_basic_i2c_nfc:i2c_example",
139#"B6_basic_uart:uart_example",
140```
141
142
143### 运行结果
144
145示例代码编译烧录后,按下开发板的RESET按键,开发板开始正常工作,LED开始不断变化亮度,实现呼吸灯的效果。
146
147