使用寄存器點亮LED(第2節)—寄存器映射代碼講解


       

       // 打開 GPIOB 端口的時鍾
       *( unsigned int * )0x40021018|=  ( 1 << 4 );
    
       // 配置PC2 IO口為通用推挽輸出,速度為10M

         *( unsigned int * )0x40011000 &=~ ( 0x0f << (4*2) );//GPIOC IO 4位清空
         *( unsigned int * )0x40011000 |= ( 1 << (4*2) );// 通用推挽輸出,速度為10M

      // 控制 ODR 寄存器
       *( unsigned int * )0x4001 100c &= ~(1<<2);

 

       我們在使用內存地址點亮LED燈中使用內存地址點亮,但是這種可讀性極差,外人根本不知道干什么的。下面我們介紹另外一種方法 給這些內存地址起別名。(稱為寄存器映射)

相當於我們在51單片機中頭文件中的內容的定義。(我們之所以能用P0=....;這是因為我們在reg52.h中已經寫好了映射 sfr P0=0x80)。

      現在我們打開STM32的中文參考手冊   2 存儲器和總線構架------>存儲器映像可以看多所以外設對應的地址單元。

 

 

這三張圖呢我們先說:

            第一張為STM32的系統架構圖,我們可以看見所有的外設(最外邊的紅線框)均掛在到AHB總線上,AHB總線再分四個,分別為SDIO RCC APB1 APB2.  

            第二張為掛載在AHB總線上的所有外設地址。其實AHB起地址為0x4000 0000(由底向上看,最開始的地址)。這樣我們在設計寄存器映射是可以定義AHB為基地址。

                       (小技巧:我們在定義RCC的基址是可以定義為DMA1,而不是定義為SDIO,因為DMA1的地址特別整齊,這樣好計算。只要將SDIO的地址單獨定義即可。事實上官             方也是這樣定義的。)

 

 

小燈PC2的電路圖:PC2含義GPIOC第二引腳

 

代碼:

Stm32f10x.h的內容:

// 用來存放STM32寄存器映射的代碼

// 外設  perirhral

#define  PERIPH_BASE               ((unsigned int)0x40000000)  //AHB
#define  APB1PERIPH_BASE           PERIPH_BASE
#define  APB2PERIPH_BASE          (PERIPH_BASE + 0x10000)
#define  AHBPERIPH_BASE           (PERIPH_BASE + 0x20000)//小技巧


#define  RCC_BASE                (AHBPERIPH_BASE + 0x1000)
#define  GPIOC_BASE              (APB2PERIPH_BASE + 0x1000)


#define  RCC_APB2ENR            *(unsigned int*)(RCC_BASE + 0x18)
    
#define  GPIOC_CRL              *(unsigned int*)(GPIOB_BASE + 0x00)
#define  GPIOC_CRH              *(unsigned int*)(GPIOB_BASE + 0x04)
#define  GPIOC_ODR              *(unsigned int*)(GPIOB_BASE + 0x0C)

 

main中的內容:

       // 打開 GPIOB 端口的時鍾
       RCC_APB2ENR|=  ( 1 << 4 );
      //配置PC2 IO口為通用推挽輸出,速度為10M
       GPIOC_CRL&=~ ( 0x0f << (4*2) );//GPIOC IO 4位清空
       GPIOC_CRL|=  ( 1 << (4*2) );// 通用推挽輸出,速度為10M
      // 控制 ODR 寄存器
       GPIOC_ODR&= ~(1<<2);//// GPIOC_ODR|= (1<<2);  //

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM