最近用到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中我們往往需要操作的是整個暫存器,讀,修改,寫。繁...