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