日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

0基础自学stm32(野火)——什么是寄存器?

發布時間:2024/3/26 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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為例

# include <stdio.h>sbit LED = P0^0;void main (void) {P0 = 0xfe;LED =0;}

注意看我們使用的P0,就包含在頭文件當中,而頭文件使用了sfr關鍵字讓P0與對應的寄存器的地址相互對應。

而在stm32中讓GPIOB端口的16個引腳輸出高電平,要怎么實現??
通過絕對地址訪問內存單元
//GPIOB 端口全部輸出 高電平

*(unsigned int*(0x40010C0C) = 0xFFFF;

我們找到GPIOB的寄存器起始地址


我們查看ODR的地址偏移:0x0C,這里的偏移是相對于剛才找到的寄存器基地址的偏移。因為GPIOB的寄存器不止這一個。
那么GPIOB端口的地址是:GPIOB的基地址+地址偏移
我們就可以對IO進行操作

*(unsigned int*(0x40010C0C) = 0xFFFF;

其中0x40010C0C就是寄存器的地址
對于以上我們需要抓住幾個重點:
1:0x40010C0C作為GPIOB輸出數據寄存器ODR的地址是人如何找到的?
2:(unsigned int)的作用是什么?
3:學會使用c語言的“*”號*

*(unsigned int*(0x40010C0C) = 0xFFFF;

我們先強制轉換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(野火)——什么是寄存器?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。