韌體庫程式設計(3) 位帶操作

2021-10-01 18:31:44 字數 3286 閱讀 7279

位線操作是把暫存器中的某個位單獨拿出來,放在位帶區,並且在位帶別名區重新膨脹為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的某位進行操作。於是引入了 位帶操作的概念 什麼事位帶操作?標準的定義是 通過訪問位帶別名區來實現,即通過將每個位元位膨脹成乙...