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 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