K60學(xué)習(xí)打卡之GPIO初始化

上次我們說到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è)樣子

Paste_Image.png

那句話的意思就是,將其中的第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ù)手冊之后就可以知道到底是做什么的了!

Paste_Image.png

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一、代碼分析本次分析的代碼非常簡短 這句代碼的意思也和單一,就是將GPIOE模塊的第6引腳配置為推挽輸出方式。但是...
    Cheer_up閱讀 2,412評論 0 1
  • 今天把最后的配置講完,不過可能要分兩次。首先是下面的函數(shù): 表示將上面的寄存器的相應(yīng)位設(shè)置為0或是1,在實(shí)際的功能...
    Cheer_up閱讀 636評論 0 1
  • 今天要探究的是下面的函數(shù) 第一句代碼昨天我已經(jīng)研究過了,這里又出現(xiàn)了一次,可見寫這個(gè)函數(shù)的人,為了保證每一個(gè)函數(shù)的...
    Cheer_up閱讀 295評論 0 1
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,506評論 19 139
  • 1 綜述 1.1 時(shí)鐘源 在STM32中,一共有5個(gè)時(shí)鐘源,分別是HSI、HSE、LSI、LSE、PLL。 HSI...
    hackvilin閱讀 3,763評論 0 6

友情鏈接更多精彩內(nèi)容