位線操作是把暫存器中的某個位單獨拿出來,放在位帶區,並且在位帶別名區重新膨脹為1個字,但只能對這個位進行操作。通過訪問位帶別名區來訪問某個單獨的位。
位帶區的每乙個位都是通過對位帶別名區的位址來訪問。位帶區乙個位,對應位帶別名區乙個字(即4個位元組)
在 cm3中,有兩個區中實現了位帶。其中乙個是 sram 區的最低 1mb 範圍,第二個則是片內外設區的最低 1mb 範圍。但st公司設計的晶元只使用了64kb。
通過檢視儲存器印象表,我們發現外設位址是0x00000000到0x4002 9fff,其餘是保留的。所以,可以認為,我們以前操作的都是位帶區,現在,我們把每乙個位都變成1個字,膨脹了32倍之後,放到位帶別名區,這樣,訪問乙個別名區的位址,就是在訪問乙個位的位址。
**是在上乙個的基礎上改的,所以不寫注釋了,見前乙個文章的注釋
main.c
#include "stm32f10x.h"
#include "led.h"
#include "key.h"
int main()
#elif 1
while(1)
if(key1_2_gpio_in(8)==key_on)
if(key3_4_gpio_in(1)==key_on)
if(key3_4_gpio_in(2)==key_on)
}#endif
}
led.h
#ifndef _led_h
#define _led_h
#include "stm32f10x.h"
#define on 0
#define off 1
#define led_g(a) if(a) \
gpio_setbits(led0_gpio_port,led0_gpio_pin);\
else gpio_resetbits(led0_gpio_port,led0_gpio_pin);
#define led0_gpio_pin gpio_pin_8
#define led1_gpio_pin gpio_pin_9
#define led2_gpio_pin gpio_pin_10
#define led3_gpio_pin gpio_pin_11
#define led0_gpio_port gpioc
#define led1_gpio_port gpioc
#define led2_gpio_port gpioc
#define led3_gpio_port gpioc
#define led_gh1 (led0_gpio_port->odr^=led0_gpio_pin)
#define led_gh2 (led1_gpio_port->odr^=led1_gpio_pin)
#define led_gh3 (led2_gpio_port->odr^=led2_gpio_pin)
#define led_gh4 (led3_gpio_port->odr^=led3_gpio_pin)
#define led0_gpio_clk rcc_apb2periph_gpioc
#define led_gpio_out(n) *(unsigned int*)(0x42000000+0x1100c*32+n*4)//基址+(外設偏移+暫存器偏移)*32+位偏移*4
#define led1 led_gpio_out(8)
#define led2 led_gpio_out(9)
#define led3 led_gpio_out(10)
#define led4 led_gpio_out(11)
void led_gpio_config(void);
void delay(uint32_t time);
#endif
led.c
#include "led.h"
void led_gpio_config(void)
void delay(uint32_t time)
key.h
#ifndef _key_h
#define _key_h
#include "stm32f10x.h"
#include "led.h"
#define key_on 0
#define key_off 1
#define key1_gpio_pin gpio_pin_0
#define key2_gpio_pin gpio_pin_8
#define key3_gpio_pin gpio_pin_1
#define key4_gpio_pin gpio_pin_2
#define key1_gpio_port gpioa
#define key2_gpio_port gpioa
#define key3_gpio_port gpiob
#define key4_gpio_port gpiob
#define key1_2_gpio_clk rcc_apb2periph_gpioa
#define key3_4_gpio_clk rcc_apb2periph_gpiob
#define key1_2_gpio_in(n) *(unsigned int*)(0x42000000+0x10808*32+n*4)
#define key3_4_gpio_in(n) *(unsigned int*)(0x42000000+0x10c08*32+n*4)
//基址+(外設偏移+暫存器偏移)*32+位偏移*4
void key_gpio_config(void);
#endif
key.c
#include"key.h"
void key_gpio_config(void)
GPIO 位帶操作
gpio 位帶操作 本章參考資料 stm32f4xx 中文參考手冊 儲存器和匯流排構架章節 gpio 章節,cortex m4 核心程式設計手冊 2.2.5 bit banding。學習本章時,配套這些參考資料學習效果 會更佳。位操作就是可以單獨的對乙個位元位讀和寫,這個在 51 微控制器中非常常見...
Cortex M3中的位帶操作bit band
cortex m3核心的arm晶元,支援位帶 bit band 操作。位帶操作就是使用普通的載入 儲存指令來對單一的位元進行讀寫。在cm3中,有兩個區中實現了位帶。其中乙個是sram區的最低1mb範圍,第二個則是片內外設區的最低1mb範圍。這兩個區中的位址除了可以像普通的ram一樣使用外,它們還都有...
stm32之位帶操作
stm32相對於8位微控制cpu來說實在強大的不得了,依稀記得51控制i o空的時候是 sbit led1 p0 0 然而我們在32卻沒有想 sbit 類似的關鍵字進行i o的某位進行操作。於是引入了 位帶操作的概念 什麼事位帶操作?標準的定義是 通過訪問位帶別名區來實現,即通過將每個位元位膨脹成乙...