问题描述:
前几天在做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。
重新编译后运行,点灯功能正常。
(完)
--------------------------------------------------------------------------------------------------------------------------------
由于水平有限,文档中若发现有错误的地方,希望大家及时指出,谢谢!