指針、寄存器、位操作

定義寄存器的絕對地址,並轉換爲指針進行位操作

1、位操作示例一

#define PERIPH_BASE         ((unsigned int)0x40000000)
#define APB2PERIPH_BASE     (PERIPH_BASE + 0x00010000)
#define GPIOB_BASE           (APB2PERIPH_BASE+0x0C00)
// (unsigned int*)的作用是強制轉換
// * (unsigned int*)則是轉換後
#define GPIO_ODR            * (unsigned int*)(GPIO_BASE+0x0c)

//PB0輸出低電平
GPIO_ODR &= ~ (1<<0);

//解析:
//(1<<0):1左移0位,即第0位是1,其餘位都是0
//~ (1<<0):上一步基礎上取反,即第0位是0,其餘位都是1;
// &=~ (1<<0):上一步基礎上“與”運算,最終結果是將GPIO_ODR的第0位置0,其餘位不影響


//PB0輸出高電平
GPIO_ODR |=  (1<<0);

//解析:
//(1<<0):1左移0位,即第0位是1,其餘位都是0
//|=(1<<0):上一步基礎上“或”運算,最終結果是將GPIO_ODR的第0位置1,其餘位不影響

/*備註:
單純的GPIO_ODR=(1<<0)會將除了0位置1,其餘位都會置0;
單純的GPIO_ODR=1,則會將寄存器所有位全部置1;
同理GPIO_ODR=0,則會將寄存器所有位全部置0;
*/


GPIO_ODR &= ~ (1<<0);
//解析:
// (1<<0):1左移0位,即第0位是1,其餘位都是0
//~ (1<<0):上一步基礎上取反,即第0位是0,其餘位都是1;
// &=~ (1<<0):上一步基礎上“與”運算,最終結果是將GPIO_ODR的第0位置0,其餘位不影響



GPIO_ODR |=  (1<<0);
//解析:
//(1<<0):1左移0位,即第0位是1,其餘位都是0
//|=(1<<0):上一步基礎上“或”運算,最終結果是將GPIO_ODR的第0位置1,其餘位不影響

/*備註:
單純的GPIO_ODR=(1<<0)會將除了0位置1,其餘位都會置0;
單純的GPIO_ODR=1,則會將寄存器所有位全部置1;
同理GPIO_ODR=0,則會將寄存器所有位全部置0;
*/

2、位操作示例二

#define PERIPH_BASE         ((unsigned int)0x40000000)
#define APB2PERIPH_BASE     (PERIPH_BASE + 0x00010000)
#define GPIOB_BASE           (APB2PERIPH_BASE+0x0C00)

//配置IO口爲輸出

GPIO->CRL &= ~((0x0f)<<(4*0))

GPIO->CRL |= ((1)<<(4*0))

根據STM32F10x參考手冊,2.3章節存儲器映像,共有A……G,7個GPIO;

GPIO_B,即GPIO端口B的寄存器地址爲:0X4001 0C00 - 0x4001 0FFF,屬於APB2總線(0x4001 0000起始)

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章