STM32暫存器對映

2021-10-02 08:06:13 字數 3090 閱讀 7287

1.  對映即將記憶體的某段位址與某一暫存器對應,微控制器對函式的操作底層是操作暫存器,而暫存器最終是操作記憶體上對應的單元,

2.  各個暫存器對應的位址都是在st定義的起始位址上層層偏移得到

3.  想要實現某功能可直接對此段記憶體寫進相應的值,即可賦予某一功能

4.  stm32底層實際是先定義出外設基位址,然後由基位址進行偏移得到不同的外設位址

5.  因為stm32的暫存器大多數是32bit位,且某一功能外設的暫存器位址常常是連貫的,因此只需要定義出暫存器基位址,然後強制轉       換為某一結構體型別,此結構體內包含一組暫存器,即可定義一組外設的功能

6.  庫函式內部呼叫暫存器

7.  stm32庫函式解析:

定義記憶體基位址 -> 將記憶體基位址轉換為想要的指標型別,如gpio結構體型別

8.  操作記憶體,操作暫存器,操作庫函式實現gpio輸出低示例

main檔案:

include "stm32f10x.h"

#include "stm32f10x_gpio.h"

int main(void)

void systeminit(void)

記憶體位址對映檔案:

#ifndef __stm32f10x_h

#define __stm32f10x_h

typedef unsigned int uint32_t;

typedef unsigned short int uint16_t;

#define __io volatile

typedef struct

gpio_typedef;

typedef struct

rcc_typedefinit;

#define periph_base (0x40000000u)//外設基位址

#define apb1periph_base periph_base//apb1基位址

#define apb2periph_base (periph_base + 0x10000u)//apb2基位址

#define ahbperiph_base (periph_base + 0x20000u)

#define rcc_base (periph_base + 0x20000u)

#define gpioa ((gpio_typedef *)(periph_base + 0x10800u))

#define gpiob ((gpio_typedef *)(periph_base + 0x10c00u))

#define gpioc ((gpio_typedef *)(periph_base + 0x11000u))

#define gpiod ((gpio_typedef *)(periph_base + 0x11400u))

#define gpioe ((gpio_typedef *)(periph_base + 0x11800u))

#define rcc ((rcc_typedefinit *)rcc_base)

#define rcc_apb2clk_enr (rcc->apb2enr |= 1 << 3)

#endif

gpio初始化標頭檔案

#ifndef __stm32f10x_gpio_h

#define __stm32f10x_gpio_h

#include "stm32f10x.h"

#define gpio_pin_0 ((uint16_t)0x0001u)

#define gpio_pin_1 ((uint16_t)0x0002u)

#define gpio_pin_2 ((uint16_t)0x0003u)

#define gpio_pin_3 ((uint16_t)0x0004u)

#define gpio_pin_5 ((uint16_t)0x0005u)

#define gpio_pin_6 ((uint16_t)0x0006u)

#define gpio_pin_7 ((uint16_t)0x0007u)

#define gpio_pin_8 ((uint16_t)0x0008u)

#define gpio_pin_9 ((uint16_t)0x0009u)

#define gpio_pin_10 ((uint16_t)0x000au)

#define gpio_pin_11 ((uint16_t)0x000bu)

#define gpio_pin_12 ((uint16_t)0x000cu)

#define gpio_pin_13 ((uint16_t)0x000du)

#define gpio_pin_14 ((uint16_t)0x000eu)

#define gpio_pin_15 ((uint16_t)0x000fu)

typedef enum

gpiospeed_typedef;

typedef enum

gpiomode_typedef;

typedef struct

gpio_inittypedef;

void gpio_init(gpio_typedef* gpiox, gpio_inittypedef* gpio_initstruct);

void gpio_resetbit(gpio_typedef *gpiox, uint16_t gpio_pin);

void gpio_setbit(gpio_typedef *gpiox, uint16_t gpio_pin);

#endif

STM32儲存器對映和暫存器對映

對於cortex m3來講,有一塊4g大小的儲存器空間。儲存器對映指的是晶元廠商為這個空間分配位址的操作。這4g空間被均勻地劃分為8個大小為512mb的儲存塊 block 並且每個塊都各具特色。下面主要介紹block1 block2。flash 起始位址為0x0800 0000,存放使用者程式和掉電...

筆記 STM32暫存器位址對映

例如 struct student p p可以指向struct student 型別的變數或陣列元素 例題 main stu1 pstu stu1 讀取結構體成員的值 printf s的學號是 d,年齡是 d,在 c組,今年的成績是 1f!n pstu name,pstu num,pstu age,...

STM32蜂鳴器 暫存器

這次實驗犯了個笑話,竟然在巨集定義後面加分號.就像這樣 define 大家千萬不要學我,結果報錯expected expression,還苦惱半天,想為啥操作不了暫存器了?我真愚蠢!剛開始我也不會寫這些東西,其實摸清套路就好,rcc時鐘使能 gpio初始化 相關暫存器初始化 延時函式 串列埠等初始化...