一種暫存器操作指定位翻轉方法
阿新 • • 發佈:2019-01-09
通常情況,很多CPU暫存器是不可以進行單獨的位操作的,比如32位ARM,若要改變暫存器某位,那就有可能影響到其它的31位。
平時開發中會經常遇到,以平時開發中遇到的LED為例,如果要實現指定的LED翻轉時,其它的LED狀態不變,那麼就要操作暫存器對指定位進行翻轉,下面是筆者採用的一種方法,可以提供各位借鑑,如有更好的方法可以留言,一起交流探討哈^_^。
例項說明:
以S3C2440為例,翻轉GPFDAT 暫存器的GPIO_Pin4 和GPIO_Pin5 引腳,並且保持其他位不變,程式碼如下:
#define GPIO_Pin4 (1<<4)
#define GPIO_Pin5 (1<<5)
volatile unsigned long *GPFDAT = (unsigned long *)0x56000054;
Uint32 turn_bit()
{
Uint32 data = *GPFDAT;
*GPFDAT |= GPIO_Pin4 | GPIO_Pin5;
*GPFDAT &= ~(data & (GPIO_Pin4 | GPIO_Pin5)); //反轉指定位電平同時其他的不影響
return *GPFDAT;
}