1# PWM接口介绍 2| API名称 | 说明 | 3| ------------------------------------------------------------ | ----------------- | 4| unsigned int IoTPwmInit(WifiIotPwmPort port); | PWM模块初始化 | 5| unsigned int IoTPwmStart(WifiIotPwmPort port, unsigned short duty, unsigned short freq); | 开始输出PWM信号 | 6| unsigned int IoTPwmStop(WifiIotPwmPort port); | 停止输出PWM信号 | 7| unsigned int IoTPwmDeinit(WifiIotPwmPort port); | 解除PWM模块初始化 | 8| unsigned int PwmSetClock(WifiIotPwmClkSource clkSource); | 设置PWM模块时钟源 | 9- 将GPIO复用为PWM模式。Hi3861上一共有6路PWM。由于PWM通道太多就不一一列举了,PWM复用功能在SDK的hi_io.h中,详情用户可查阅该文件。使用交通灯板上的蜂鸣器,本案例复用GPIO5为PWM模式,使用前PWM初始化,包括通道选择,频率选择。 10 ``` 11 IoTGpioInit(IOT_PWM_BEEP); 12 IoSetFunc(IOT_PWM_BEEP, 5); /* 设置IO5的功能 */ 13 IoTGpioSetDir(IOT_PWM_BEEP, IOT_GPIO_DIR_OUT); 14 IoTPwmInit(IOT_PWM_PORT_PWM0); 15 ``` 16 17- PWM启动,包括通道选择,duty设置,分频系数设置。 18 ``` 19 IoTPwmStart(IOT_PWM_PORT_PWM0, PWM_LOW_DUTY, PWM_FULL_DUTY); 20 ``` 21 22- 上图中的IOT_PWM_PORT_PWM0为复用通道,PWM_LOW_DUTY为占空比,范围(1-99),PWM_FULL_DUTY为频率,范围为(大于2442HZ),计算公式如下。 23 24 25 26- 上面步骤完成后还无法使用PWM,需要修改.device/soc/hisilicon/hi3861v100/sdk_liteos/build/config/usr_config.mk文件。在这个配置文件中打开I2C驱动宏。搜索字段CONFIG_PWM_SUPPORT ,并打开PWM。配置如下: 27 ``` 28 # CONFIG_PWM_SUPPORT is not set 29 CONFIG_PWM_SUPPORT=y 30 ``` 31 32- 创建一个任务线程,单独处理PWM控制蜂鸣器任务,串口通信的具体任务实现。 33 ``` 34 static void PWMDemo(void) 35 { 36 osThreadAttr_t attr; 37 attr.name = "PWMDemoTask"; 38 attr.attr_bits = 0U; 39 attr.cb_mem = NULL; 40 attr.cb_size = 0U; 41 attr.stack_mem = NULL; 42 attr.stack_size = 4096; /* 任务大小4096 */ 43 attr.priority = osPriorityNormal; 44 if (osThreadNew(PWMDemoTask, NULL, &attr) == NULL) { 45 printf("[PWMDemo] Failed to create PWMDemoTask!\n"); 46 } 47 } 48 SYS_RUN(PWMDemo); 49 ``` 50