上次我們說到SCGC5,也就是系統(tǒng)門控時(shí)鐘5,這個(gè)是SIM模塊里面的寄存器。那么今天我們就來看看,這個(gè)SIM模塊究竟是干什么的?
在技術(shù)手冊的第12章詳細(xì)地描述了這個(gè)模塊
SIM(System Integartion Module)
開宗明義,這個(gè)模塊提供了系統(tǒng)控制和芯片配置寄存器。
它的特性包括了:
1、系統(tǒng)時(shí)鐘配置:系統(tǒng)時(shí)鐘分頻值;Architectural clock gating control(這個(gè)不太懂);USB時(shí)鐘選擇和分頻值;SDHC 時(shí)鐘源選擇;1588以太網(wǎng)時(shí)間戳和RMII的時(shí)鐘源選擇
2、Flash和RAM的大小設(shè)置
3、USB校準(zhǔn)配置
4、靈活計(jì)數(shù)器,硬件觸發(fā)器和錯(cuò)誤源的選擇
5、UART0(UART1)的發(fā)送(接收)源的選擇和配置
SIM模塊有許多的域來控制和配置不同模塊的時(shí)鐘源和分頻值,關(guān)于這一點(diǎn),在時(shí)鐘配置章節(jié)有更詳盡的描述。其實(shí)也沒有詳盡多少,只是有些點(diǎn)還是值得一提的。
1、由于SIM,使得芯片時(shí)鐘可以依據(jù)模塊,部分啟動(dòng)和關(guān)閉
2、基本的時(shí)鐘是源于MCGOUTCLK,但是通過時(shí)鐘發(fā)生器可以讓不同的模塊有不同的時(shí)鐘頻率,來滿足低功耗的要求
3、還有一部分的時(shí)鐘源自于MCGPLLCLK和MCGFLLCLK,并且還有備用的時(shí)鐘源,并且這些模塊都有SIM模塊的SOPT寄存器控制
那么接下來的更為細(xì)致的寄存器描述就不一 一看了。根據(jù)我們寫的代碼。我們拶指只看我們要使用的寄存器和相應(yīng)的位就好。
這次我們要解析下面的函數(shù)
void PORT_PinPullConfig(uint32_t instance, uint8_t pin, PORT_Pull_Type pull){
SIM->SCGC5 |= SIM_GPIOClockGateTable[instance];
switch(pull)
{
case kPullDisabled:
PORT_InstanceTable[instance]->PCR[pin] &= ~PORT_PCR_PE_MASK;
break;
......
default:
break;
}}
上次已知的代碼是這樣的:
#define SIM_BASE 0x40047000u
#define SIM (SIM_Type *)SIM_BASE
__IO uint32_t SCGC5; /**< System Clock Gating Control Register 5, offset: 0x1038 */
那么我們要關(guān)注的寄存器地址是0x40047000u+0x1038 =0x40048038。讓我們在技術(shù)手冊中查找一下。正好是SIM_SCGC5寄存器,那么要對這個(gè)寄存器操作做什么事情呢?嗯,看代碼:
SIM->SCGC5 |= SIM_GPIOClockGateTable[instance];
關(guān)于SIM_GPIOClockGateTable在gpio.c文件中有定義:
static const uint32_t SIM_GPIOClockGateTable[] =
{
SIM_SCGC5_PORTA_MASK,
SIM_SCGC5_PORTB_MASK,
SIM_SCGC5_PORTC_MASK,
SIM_SCGC5_PORTD_MASK,
SIM_SCGC5_PORTE_MASK,
};
那個(gè)instance在本次代碼中表示的是0x04。之前說過的通過#define定義的。也就是說這句代碼的意思是將SIM_SCGC5_PORTE_MASK賦給地址為0x40048038的寄存器,那么這個(gè)SIM_SCGC5_PORTE_MASK值又是多少呢?查定義,追蹤一下就ok。
#define SIM_SCGC5_PORTE_MASK 0x2000u
好了到了這里,這句話的意思就很清楚了
將0x2000這個(gè)值賦給寄存器SIM_SCGC5.
那么問題來了,這句話又表示什么意思?
查...手...冊......
關(guān)于SIM_SCGC5的寄存器,它長這個(gè)樣子

那句話的意思就是,將其中的第13位設(shè)置為1!
好了,說了這么多。一層又一層的,其實(shí)說白了。就是設(shè)了一個(gè)1.是不是感覺收到了嚴(yán)重的欺騙!我就是這種感覺!
昨天晚上一高興就忘記自己還沒有寫完了。以后不會這樣了!現(xiàn)在不需哦天沒有寫完的補(bǔ)上。
然后就是這句代碼了!
PORT_InstanceTable[instance]->PCR[pin] &= ~PORT_PCR_PE_MASK;
關(guān)于PORT_InstanceTable[],這個(gè)定義比較復(fù)雜,單獨(dú)說一下,定義如下:
static PORT_Type * const PORT_InstanceTable[] = PORT_BASES;
解析:首先,這個(gè)static,靜態(tài)的;PORT_Type* 表示PORT_Type類型的結(jié)構(gòu)體指針;const 表示常量類型,不可更改;PORT_BASES是地址0x4004D000。這個(gè)定義表示將PORT_InstanceTable定義為指向PORT_Type結(jié)構(gòu)體的指針的指針這個(gè)指針的值是0x4004D000。蠻復(fù)雜的還是!
言歸正傳!地址解析如下:
首先展示與代碼有關(guān)的定義:
#define PORTE_BASE (0x4004D000u)
/** Peripheral PORTE base pointer */
#define PORTE ((PORT_Type *)PORTE_BASE)
/** Array initializer of PORT peripheral base pointers */
#define PORT_BASES { PORTA, PORTB, PORTC, PORTD, PORTE }
__IO uint32_t PCR[32]; /**< Pin Control Register n, array offset: 0x0, array step: 0x4 */
#define PORT_PCR_PE_MASK 0x2u
接下來計(jì)算一下就好了
左邊的地址是0x4004D000+0x4*6右邊的值是0x2,這樣,再參閱相關(guān)的技術(shù)手冊之后就可以知道到底是做什么的了!

上圖就是相關(guān)的寄存器了。結(jié)合代碼,表示將PE位清零。那么實(shí)際的意義需要閱讀相關(guān)的章節(jié)才行,下次吧!
好了今天的就補(bǔ)完了!