辨別STM32芯片引腳方向
划黃線的絲印下面那個小圓圈對應的引腳就是1號引腳,逆時針依次遞增如果沒有小圓圈,那么絲印正對着自己,左上角第一個引腳就是1號引腳,逆時針依次遞增
STM32構成
stm32由內核,Flash,SRAM,外設構成
外設包含:GPIO,USART,SPI,I2C,ADC,DAC等等
STM32的內存分配
1、STM32芯片在做出來的時候,內部內存已經被分配好了內存塊,每個內存塊儲存不同的東西
圖1
圖2
這兩個圖是一個完整的圖,截取於STM32f407數據手冊中。
關於STM32內存的講解
圖3
圖4
圖5
在STM32內部的每個內存塊存放不同的功能,而每個內存塊都有地址,假如我們要用GPIO外設,從上圖可知外設的首地址為0x4000 0000(如圖1)。在上圖的每個內存塊中又分為好幾個內存塊,每個內存塊有不同的寄存器,一個地址存放4個字節,在STM32內存中,1個地址存放32位的寄存器,有的寄存器有可能用不到32位(地址之間都相差4,比如第一個地址為0x00,那第二個地址為0x04),只用其中的低16位,那高16位將被保留(如圖3)。在圖2中我只列出外設內存塊中,GPIO的內存塊,在這個內存塊中又分為GPIOA內存塊,GPIOB內存塊等等,內存塊中存放的就是一些寄存器,每4個地址存放一個32位的寄存器,在圖2中我們會看到有一個偏移地址,這個偏移地址是基於每個最小內存塊(就是像GPIOA,GPIOB之類的內存塊)的首地址。每個最小內存塊都有地址范圍(如圖1),且GPIO內存塊的首地址就是GPIOA內存塊的首地址。
寄存器映射
學過C語言的同學都知道指針,我們要想取地址中的值必須利用指針,比如GPIOA_OTYPER寄存器的偏移地址為0x04,且GPIOA內存塊的首地址為0X4000 0000,那么我們就可以利用下面的方式來取寄存器中的值。
首先我們知道GPIOA_OTYPER寄存器的地址為(0x04+0x4000 0000),這樣寫還不夠,因為編譯器並不知道這是地址,所以我們利用指針將其轉成地址(unsigned int *)(0x04+0x4000 0000),最后我們再利用指針*(unsigned int *)(0x04+0x4000 0000)就可以讀寫寄存器了。
#define GPIOA_OTYPER *(unsigned int *)(0x04+0x4000 0000)這就是寄存器映射。
寄存器映射:給具有特殊功能的內存塊的首地址取一個具有特殊意義名稱的過程就叫做寄存器映射。
存儲器映射
定義:芯片在做的時候,內存並沒有地址,我們給內存分配地址的過程中就叫做寄存器映射。
內存大小計算
從圖1,2中我們可以知道每個大內存塊占512MB,所以芯片內存為32GB。
計算過程:以一個code內存塊為例,數字0也代表一個地址,0x1FFF FFFF-0x0000 0000=536 870 911十進制,由於0也是一個地址,則0x1FFF FFFF-0x0000 0000=536 870 911+1
,比如地址從0——》0xFF ,0xFF-0=15,而實際地址0也是一個內存,所以必須加1。一個地址中存放1Byte,(536 870 912Byte/1024)=524 288KB/1024=512MB。