1. 程式人生 > >一種暫存器操作指定位翻轉方法

一種暫存器操作指定位翻轉方法

通常情況,很多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; }