当前位置: 代码迷 >> 单片机 >> LPC1768 GPIO 寄存器有关问题
  详细解决方案

LPC1768 GPIO 寄存器有关问题

热度:244   发布时间:2016-04-28 15:23:23.0
LPC1768 GPIO 寄存器问题
FIOPIN能实现 高低电平的输出 
为什么 还要加两个只能实现单独电平输出的  FIOSET 和 FIOCLR呢?
求教
LPC1768 单片机 嵌入式

------解决方案--------------------
为了更方便的访问,使得设置IO口某个引脚电平的操作变为原子操作

原子操作是指连中断都无法打断的操作,最基本的原子操作就是一条汇编指令

比如说一个读存储器的操作,一般是第一个时钟周期送出地址,延时一个或多个周期,然后采样数据,这一过程不会被中断打断,即使在送出地址的那个时钟周期中断信号来了,中断也至少要等到这个指令执行完才能触发

当你用FIOPIN来改变某个引脚的状态时,比如Px.0设置为高电平,你得这样写才行,FIOPINx 
------解决方案--------------------
= 0x01;分解城汇编大致就是先是一条加载指令将FIOPINx内容督导寄存器中;然后是一条逻辑运算指令将寄存器中值与0x01做异或,然后是一条存储指令将寄存器中值写到FIOPINx中

而使用FIOSET时,可以用FIOSETx=0x01; 这样可以用一条指令,而单条指令是原子操作

不仅仅是因为多了两条指令,而是前者不是原子操作,在某些情况下如果你不加额外的措施保护会有问题,比如,你的程序前台程序中有个条件发生时置FIOPINx
------解决方案--------------------
=0x01(PX.0口置高电平);而在某个中断发生时你置FIOPINx
------解决方案--------------------
=0x02(PX.1口置高电平),假设前台程序刚好执行到FIOPINx
------解决方案--------------------
=0x01的第一步时发生中断,剩下的我懒得分析了,你自己分析吧

虽然可以用在FIOPINx
------解决方案--------------------
=0x01;执行前关中断,在执行后打开中断的方式避免上述问题,但是。。。