• Home
Name Date Size #Lines LOC

..--

BUILD.gnD12-May-2024860 2421

README.mdD12-May-20243.2 KiB14099

pwm_example.cD12-May-20242 KiB8543

README.md

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