红色--GPIO10_PWM1
绿色--GPIO11_PWM2
蓝色--GPIO12_PWM3
核心板的LED1--GPIO9
接下来的修改就是直接在SDK中的ap/iothardware/led_example.c中进行修改了。里面已经有了GPIO的初始化以及调用了,这里只是增加和修改引脚而已。注意:例程里面用的GPIO9,也就是核心板上的LED1.如果插上的是RGB灯板,则LED1始终亮,不会随引脚改变而改变。这一点让我怀疑代码怀疑了很久,后来查电路图才发现RGB灯板GPIO9引脚接了红外检测引脚。这个引脚是上拉的,也就是说就是主控下拉让LED1灭,实际上也不会灭。到这里操作GPIO就完成了,很简单,就在官方的例程里面修改就行了。但是,还没结束,上面也说了,RGB这三个引脚是复用功能,可以复用PWM输出功能,这里继续将代码改为PWM控制。首先初始化GPIO,然后将这3个引脚设为PWM复用输出功能,并指定PWM的时钟。#defineLED_REDWIFI_IOT_IO_NAME_GPIO_10#defineLED_GREENWIFI_IOT_IO_NAME_GPIO_11#defineLED_BLUEWIFI_IOT_IO_NAME_GPIO_12GpioInit();IoSetFunc(LED_RED,WIFI_IOT_IO_FUNC_GPIO_10_PWM1_OUT);GpioSetDir(LED_RED,WIFI_IOT_GPIO_DIR_OUT);IoSetFunc(LED_GREEN,WIFI_IOT_IO_FUNC_GPIO_11_PWM2_OUT);GpioSetDir(LED_GREEN,WIFI_IOT_GPIO_DIR_OUT);IoSetFunc(LED_BLUE,WIFI_IOT_IO_FUNC_GPIO_12_PWM3_OUT);GpioSetDir(LED_BLUE,WIFI_IOT_GPIO_DIR_OUT);hi_pwm_init(HI_PWM_PORT_PWM1);hi_pwm_init(HI_PWM_PORT_PWM2);hi_pwm_init(HI_PWM_PORT_PWM3);hi_pwm_set_clock(PWM_CLK_M);完成初始化后就是功能了,控制pwm占空比调节led亮度。
voidLedPWM(uint16pwm_r,uint16pwm_g,uint16pwm_b){hi_pwm_start(HI_PWM_PORT_PWM1,pwm_r,0);hi_pwm_start(HI_PWM_PORT_PWM2,pwm_g,0);hi_pwm_start(HI_PWM_PORT_PWM3,pwm_b,0);}这一段在while(1)里面循环执行,改变PWM占空比的值。
switch(sta){case0:if(pwm_R)pwm_R+=5;else{sta=1;pwm_R=2;pwm_G=2;pwm_B=2;}break;case1:if(pwm_G)pwm_G+=5;else{sta=2;pwm_R=2;pwm_G=2;pwm_B=2;}break;case2:if(pwm_B)pwm_B+=5;else{sta=0;pwm_R=2;pwm_G=2;pwm_B=2;}break;}LedPWM(pwm_R,pwm_G,pwm_B);usleep(2);PWM相关的函数都是在hi_PWM.h中定义的,所以要引用这个头文件,另外这个例子所在的BUILD.gn文件中也要新增其所在的位置:"//vendor/hisi/hi/hi//include".在app所在的BUILD.gn里面的features项目中加入新增的led_example.c所在的路径:"iothardware:led_example",到这里貌似都完成了设置以及实现。但是编译的时候直接报错:undefinedreferencetohi_PWM_start以及其他几个函数的错误。这个问题纠结了我好久。后来还是看连志安的ole驱动中的IIC操作才知道要在hi驱动中配置打开PWM功能才会编译PWM部分进代码,不然始终找不到具体的实现。编译通不过。具体在vendor/hisi/hi/hi/build/config/usr_config.mk文件中新增CONFIG_PWM_SUPPORT=y才行。不熟悉整个框架遇到问题并不好处理。另外调试PWM过程中发现hi_PWM_start函数中的duty参数不要设置为0。在调试3色时候两色设为0,实际上是白色,都亮了。后来设置为2就ok,三色互不影响。