0基础自学stm32(野火)——什么是寄存器?
重點:
存儲器映射
寄存器映射
首先學會分辨器件的1號引腳,注意是逆時針旋轉。
##先搞清楚芯片內部結構
“AHB,是Advanced High performance Bus的縮寫,高級高性能總線;
APB,是Advanced Peripheral Bus的縮寫,高級外設總線。”
驅動單元:
被動單元:
接下來查看官方數據手冊(英文版)
ARM的內核是32位,那就是2的32次方,也就是4294967296byte(字節),1kb=1024byte,也就是那么就是4194304kB,1mb =1024kb,也就是4096mb,而1gb=1024mb ,最終就是4gb
所以arm內核可以訪問4gb內容,arm則將這4g內存分為八塊。
512mb*8=4096mb=4g
flash就在第一塊里面
我們能夠從芯片的外部封裝上看出來野火采用的芯片是stm32f103zet6
其中的e代表了512k的flash
顯然只用了一小部分
重點在于block2外設部分
存儲器映射(重點)
什么是存儲器映射?
存儲器本身不具備地址信息,他的地址游戲片廠商或者用戶分配,給存儲器分配地址的過程就是存儲器映射
寄存器映射
以stc51為例
注意看我們使用的P0,就包含在頭文件當中,而頭文件使用了sfr關鍵字讓P0與對應的寄存器的地址相互對應。
而在stm32中讓GPIOB端口的16個引腳輸出高電平,要怎么實現??
通過絕對地址訪問內存單元
//GPIOB 端口全部輸出 高電平
我們找到GPIOB的寄存器起始地址
我們查看ODR的地址偏移:0x0C,這里的偏移是相對于剛才找到的寄存器基地址的偏移。因為GPIOB的寄存器不止這一個。
那么GPIOB端口的地址是:GPIOB的基地址+地址偏移
我們就可以對IO進行操作
其中0x40010C0C就是寄存器的地址
對于以上我們需要抓住幾個重點:
1:0x40010C0C作為GPIOB輸出數據寄存器ODR的地址是人如何找到的?
2:(unsigned int)的作用是什么?
3:學會使用c語言的“*”號*
我們先強制轉換0x40010C0C作為地址。
如果我們直接寫成0x40010C0C = 0xFFFF;編譯器并不知道0x40010C0C是地址,所以沒法使用。我們就需要強制轉換。
顯然上面的方法比較麻煩。
通過寄存器別名方式訪問內存單元:
//GPIOB端口全部輸出高電平 # define GPIOB_ODR (unsigned int*)(0x40010C0C) ; * GPIOB_ODR = 0xFF;為了操作方便還可以將“*”也定義到寄存器的別名里
//GPIOB端口全部輸出高電平 # define GPIOB_ODR *(unsigned int*)(0x40010C0C) ; GPIOB_ODR = 0xFF;總結
以上是生活随笔為你收集整理的0基础自学stm32(野火)——什么是寄存器?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 信息时代电子阅览室服务
- 下一篇: 【体系】Kubernetes容器管理