1. 程式人生 > >存儲器與寄存器介紹

存儲器與寄存器介紹

程序 eight wid 分享圖片 內容 還需要 通過 端口 語言

本講主要內容 1.什麽是存儲器映射
2.什麽是寄存器及寄存器映射
3.如何訪問STM32寄存器內容 1.什麽是存儲器映射
存儲器本身不具有地址信息,它的地址是由芯片廠商或
用戶分配,給存儲器分配地址的過程稱為存儲器映射,如果
再分配一個地址就叫重映射(具體地址分配參考芯片數據手
冊及中文參考手冊) 技術分享圖片

技術分享圖片

2.什麽是寄存器及寄存器映射
通過給有特定功能的內存單元起一個別名,這個別名就是
我們所說的寄存器。給已經分配好地址的有特定功能的內存
單元起別名的過程就叫寄存器映射

3.如何訪問STM32寄存器內容
我們知道寄存器就是一些有特定功能的內存單元,所以要

訪問STM32寄存器也就是操作STM32的內存單元,根據C語言
指針的特點,可以使用指針來操作STM32的內存單元。
假如我們要讓STM32的GPIOC的第0管腳輸出低電平,我
們怎麽使用C語言來處理?
首先我們要知道GPIOC掛接在哪個總線上,需要知道其地
址,STM32總線地址如下:

技術分享圖片

技術分享圖片

所以使用C語言宏可以定義外設基地址:
#define PERIPH_BASE ((unsigned int)0x40000000)
然後分別定義APB2總線基地址:
#define APB2PERIPH_BASE (PERIPH_BASE + 0x00010000) 然後還需要知道端口外設地址,
同樣使用C語言宏定義其端口地址:
#define GPIOC_BASE (APB2PERIPH_BASE + 0x1000)

有了外設端口地址後,還需要知道GPIOC端口的寄存器地址,
如下表格:

技術分享圖片

同樣使用C語言宏定義其端口寄存器地址:

#define GPIOC_CRL           *(unsigned int*)(GPIOC_BASE+0x00)
#define GPIOC_CRH           *(unsigned int*)(GPIOC_BASE+0x04)
#define GPIOC_IDR           *(unsigned int*)(GPIOC_BASE+0x08)
#define
GPIOC_ODR *(unsigned int*)(GPIOC_BASE+0x0C) #define GPIOC_BSRR *(unsigned int*)(GPIOC_BASE+0x10) #define GPIOC_BRR *(unsigned int*)(GPIOC_BASE+0x14) #define GPIOC_LCKR *(unsigned int*)(GPIOC_BASE+0x18)

控制 GPIOC 引腳 0 輸出低電平(即通過BSRR 寄存器的 BR0
置 1)
GPIOC_BSRR = (0x01<<(16+0));
控制 GPIOC 引腳 0 輸出高電平(即通過BSRR 寄存器的 BS0
置 1)
GPIOC_BSRR = 0x01<<0; 讀取GPIOC端口所有引腳的電平(讀 IDR 寄存器)
unsigned int temp;
temp = GPIOC_IDR; 我們這裏僅僅以GPIO這個外設為例,給大家講解了如何
使用C語言對寄存器封裝的,對於其他的外設也是使用同樣
方法。其實到了後面的實驗程序的編寫時,我們都是使用ST
公司提供的固件庫,他把STM32所有外設都已經封裝好了,
我們這裏分析這個封裝過程只是想讓大家更加清楚理解如何
使用C來封裝寄存器的。

存儲器與寄存器介紹