指標 暫存器 位操作

2021-10-01 02:39:09 字數 1792 閱讀 5946

#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;

*/

#define periph_base         ((unsigned int)0x40000000)

#define apb2periph_base (periph_base + 0x00010000)

#define gpiob_base (apb2periph_base+0x0c00)

//配置io口為輸出

gpio->crl &= ~((0x0f)<

gpio->crl |= ((1)<

根據stm32f10x參考手冊,2.3章節儲存器映像,共有a……g,7個gpio;

位操作(暫存器)

stm32中cpu是32位的。最方便快捷的方法是直接操作32位的位址,對某個位址直接賦值是最快的操作,只需要乙個指令。附錄1 在32位的系統中 1字 word 4位元組 byte 1位元組 byte 8位 bit 1b 8bit 1kb 1024b 2 10b 1mb 1024kb 1gb 1024...

8位暫存器

library ieee use ieee.std logic 1164.all use ieee.std logic unsigned.all entity test34 is port clk,oe instd logic d instd logic vector 7 downto 0 q ou...

暫存器標誌位

of overflow flag 溢位標誌 運算元超出機器能表示的範圍表示溢位,溢位時為1.sf sign flag 符號標誌 記錄運算結果的符號,結果負時為1.zf zero flag 零標誌 運算結果等於0時為1,否則為0.cf carry flag 進製標誌 最高有效位產生進製時為1,否則為0...