关于MT7688中gpio控制led时的坑:

问题描述:

         前几天在做gpio点亮led灯的操作时,发现当使用gpio1单独控制led1或led2,控制功能正常。但使用gpio2控制led2时,若led1和led2对应gpio的复位控制寄存器为同一个寄存器的不同位,控制出现异常,现象为:gpio1控制led1熄灭后,gpio2点亮led2,此时led1也同时点亮。

问题分析:

         以下Datasheet中截取的部分寄存器资料:






控制步骤:

         以gpio#11控制led#1,gpio#18控制led#2为例,由于原理图中已指定gpio对应pin脚输出为low时,led点亮,

0.将对应gpio功能设置为gpio模式;

1.设置gpio#11和gpio#18为输出模式,write(read(GPIO_CTRL_0)| 0x81 << 11, GPIO_CTRL_0);

2.点亮led#1, write(read(GPIO_DCLR_0)| 1 << 11, GPIO_DCLR_0);

3.熄灭led#1,write(read(GPIO_DSET_0)| 1 << 11, GPIO_DSET_0);

4.点亮led#2,write(read(GPIO_DCLR_0)| 1 << 18, GPIO_DCLR_0);

5.熄灭led#2,write(read(GPIO_DSET_0)| 1 << 18, GPIO_DSET_0);

         看似合乎控制逻辑,但是异常的出现就在于步骤2和步骤4,因为对GPIO_DATA_0的控制是间接通过控制GPIO_DSET_0和GPIO_DCLR_0来实现的,步骤4在GPIO_DCLR_0的bit18写1时,并不能保证bit11不为1,所以在执行写操作的时候很有可能将寄存器GPIO_DATA_0对应的bit11和bit18数据清除,这样在点亮led#2的时候,同一寄存器控制的led#1也被点亮,熄灭时同样存在此问题。

 

解决方法:

将步骤2、3、4、5进行如下更改:

2.点亮led#1, write(1 << 11, GPIO_DCLR_0);

3.熄灭led#1,write(1 << 11, GPIO_DSET_0);

4.点亮led#2,write(1 << 18, GPIO_DCLR_0);

5.熄灭led#2,write(1 << 18, GPIO_DSET_0);

设置对应位时让其他位的控制无效,这样就可以单独设置一个gpio。

重新编译后运行,点灯功能正常。

(完)

--------------------------------------------------------------------------------------------------------------------------------

由于水平有限,文档中若发现有错误的地方,希望大家及时指出,谢谢!


猜你喜欢

转载自blog.csdn.net/qq_41605726/article/details/80290971
今日推荐