F3不能用位帶操作GPIO之原由

2021-06-26 18:57:47 字數 1181 閱讀 6811

最近用到stm32f303,在修改io的時候,覺得用庫操作太麻煩了,要自己乙個乙個修改,用巨集定義也不解決,自然就會想到用位帶操作。查m4的手冊知道m4也是支援位帶操作,f3系列也是屬於m4核心,而且在405也是用位帶操作,覺得f303也是一樣可以做位帶操作。直接先修改乙個io,除錯卻發現在,io電平始終沒有變化。查io,初始化沒有問題。再查位帶巨集定義:

#define bitband(addr, bitnum) ((addr & 0xf0000000)+0x2000000+((addr &0xfffff)<<5)+(bitnum<<2)) 

#define mem_addr(addr)  *((volatile unsigned long  *)(addr)) 

#define bit_addr(addr, bitnum)   mem_addr(bitband(addr, bitnum)) 

//io口位址對映

#define gpioa_odr_addr    (gpioa_base+20)

#define gpiob_odr_addr    (gpiob_base+20)

#define gpioc_odr_addr    (gpioc_base+20)

_io uint16_t odr;          /*!< gpio port output data register,                           address offset: 0x14 */

odr的位址偏移了0x14,也就是20,也是對的。f4都可以用位帶操作,f3卻用不了,就覺得很奇怪。放了一段時間,不死心,繼續查詢問題。除錯,看彙編**,在位帶操作io那裡打斷點

可以看到,操作暫存器的位址是0x42010290,查m3的gpio位址,

#define gpioc_base            (ahb2periph_base + 0x0800)

#define ahb2periph_base       (periph_base + 0x08000000)

#define periph_base           ((uint32_t)0x40000000) /*!< peripheral base address in the alias region */

也就是gpioc的位址是0x48000800。這明顯就對不上,位帶操作的位址都不是對應gpio的odr,當然操作不了gpio的電平,這下死心了。

GPIO 位帶操作

gpio 位帶操作 本章參考資料 stm32f4xx 中文參考手冊 儲存器和匯流排構架章節 gpio 章節,cortex m4 核心程式設計手冊 2.2.5 bit banding。學習本章時,配套這些參考資料學習效果 會更佳。位操作就是可以單獨的對乙個位元位讀和寫,這個在 51 微控制器中非常常見...

位帶操作 GPIO輸出和輸入

gpioc odr 0 2 匯流排操作,即操作整個暫存器.在51微控制器中 p0 0xfe 匯流排操作.sbit led1 p0 0 位操作,即操作暫存器中的某一位.led1 0 在stm32中並沒有sbit這樣的關鍵字.但是我們可以用位帶操作實現位操作.位帶操作 在 stm32 中,有兩個地方實現...

STM32F429位帶操作

stm32的m3和m4晶元支援位帶操作。那什麼是位帶操作呢?位帶操作就是可以單獨的對乙個位 bit 進行讀寫操作。咦?這麼一說好像有種似曾相識的感覺,在 見過呢?沒錯,是c51。在c51中操作io口是不是很方便,直接操作某一位就ok了。而在stm32中我們往往需要操作的是整個暫存器,讀,修改,寫。繁...