你還在為看懂數據手冊而苦惱嗎,從零開始學單片機
本章節白勺數據手冊閱讀技巧是綜合多種晶片白勺數據手冊來描述白勺。通用於多種晶片白勺數據手冊閱讀技巧通過本章節,有c語言基礎白勺人都可以做出點亮LED燈這樣白勺簡單操作了
前置知識
開始確定查詢CPU內核確定CPU的機器周期
這個信息可能在晶片數據手冊上有提供,可能需要去找這個晶片的內核的用戶手冊查找
查不到可以詢問晶片提供方(注意區分晶片數據手冊和內核用戶手冊是兩個東西)
時鐘周期:1/FOSC(單位是時間,ns,us,ms,s) //最小的時間單位
FOSC的單位--->1/FOSC的單位
Mhz---->us
Khz---->ms
Hz---->s
機器周期
一般查看CPU內核概述或內核用戶手冊就可以知道
例如一個晶片的機器周期是2個時鐘周期,而這個晶片的FOSC=4Mhz
那麼這個晶片的機器周期t=2*(1/FOSC)=2/FOSC=2/4=0.5us=500ns
FOSC的單位是Hz,那麼獲得的周期單位為s
1Mhz=1000000Hz
1Khz=1000hz
指令周期:指一條指令所花費的機器周期
單指令:指令周期=機器周期(注意在一些流水線設計的內核中一個指令周期等於多個機器周期)
雙指令:指令周期=2*機器周期
1.查看開頭部分的晶片特性
其大概包括如下信息
1.晶片架構
2.支持外設白勺種類和特性
3.支持最大時鐘頻率
4.有些手冊會將待機功耗(一般說白勺是待機電流)和正常功耗寫在這,
有些需要去查電氣信息才能了解
5.單片機白勺相關特性
...等等
查看該手冊支持哪些晶片
一般在支持哪些晶片就會畫上支持晶片白勺管腳圖
手冊一般會有選型表描述支持的晶片型號
2.數據手冊查詢信息步驟
第一步:
1.(直接Ctrl+F查找,或者通過目錄查找)找到晶片的基本型模塊框圖(或者結構框圖)
英文文檔可查詢如下關鍵字:block diagram、
結構框圖可以大概了解晶片的如下信息
IO引腳
外部時鐘源引腳
電源引腳
各種總線
有一個大概的了解
查詢時鐘來源,查看時鐘樹圖
2.第二步
找到單片機的時鐘源來源
(查詢關鍵字:時鐘源、系統時鐘、時鐘源框圖、或時鐘樹框圖/震盪器配置)配置時鐘源
英文文檔可查詢如下關鍵字:
Clocks、oscillator、 Clocks and startup、Clock tree、OSC、Oscillator Configurations
注意有些單片機沒有時鐘配置,也就是它只有一個內部時鐘,並沒有分頻和倍頻電路,
也就不會有時鐘樹圖
還有一些因為時鐘源配置簡單而沒有時鐘樹圖說明,碰到這樣的查詢技巧是找到該晶片的
OSC相關管腳,然後找該管腳相關的寄存器(通過Registers查找到寄存器表)
單片機的時鐘來源有三個
1 HSE OSC外部高速OSC時鐘
2 LSI RC 內部低速RC時鐘
3 PLL
如下圖是東軟某款晶片的時鐘源框圖
圖標含義:
梯形圖:選擇分支(梯形底部為分支來源,頂部為選擇結果輸出)
一般矩形圖:功能名稱
DIV矩形:分頻器除法除以後面的數字
小矩形內部有交叉線:引腳
指向圖形的箭頭:寄存器配置位
看框圖配置時鐘源
注意查看FOSC的配置來源從右往左看,配置的時候最好從左往右配置(注意)
配置後的時鐘源就是上圖中最後的FOSC這條線
1從這條線往左走,碰到第一個連接點連接到了DIV16,
這表示CLKO輸出的是FOSC/16的頻率
2繼續往左走,碰到一個CLKSS的箭頭指向的矩形
這表示CLKSS這個配置位,作用是時鐘切換,並且受到前面的OSCS這個配置位的影響
0:表示低速時鐘
1:表示高速時鐘
3繼續往左走,有分支,具體走那個分支還受到OSCS這個配置位的影響
如果CLKSS選擇的是低速時鐘,
OSCS沒有選擇外部低速時鐘的話則往下走到INTOSCL
OSCS選擇了外部低速時鐘的話,那麼則往最上面的路通過OSCS走向XTAL
那麼此時只需要從左往右配置OSCS和CLKSS這倆個配置位就可以完成FOSC的配置了
如果CLKSS選擇高速時鍾,並且OSCS選擇的非外部時鐘源
那麼走的就是走上面的線並通過OSCS這個梯形走下面的線到達Foscs這個梯形
然後Foscs這個梯形可以選擇預分頻,到達INTOSCH
上面的步驟是從結果逆推,更容易看懂時鐘的來源
而一般配置我們從左往右配置,比如開始用戶就知道自己是要用高頻時鐘還是低頻時鐘
外部時鐘還是內部時鐘
例如
我們需要一個8Mhz頻率的時鐘源
從手冊上查到可知
INTOSCH提供的是16Mhz
INTOSCL提供的是32Khz
好像上面的都不符合我們的要求,但是手裡又沒有8Mhz的外部振蕩器
我們的策略是選擇INTOSCH,通過預分頻來達到目的
所以從上面的框圖我們選擇從INTOSCH開始到FOSC結束這條路線
FOSCS選擇FHIOSC/2預分頻就可以獲得16Mhz/2=8MHz的頻率了
然後再配置OSCS和CLKSS這兩個配置位就可以了
3.查看關鍵配置和外設功能復用引腳
第三步:
查看引腳,以及引腳的涉及的功能和配置
從下面可以看到晶片相關引腳的功能
上圖是晶片的引腳排列以及功能
引腳從晶片帶圓點的位置逆時鐘從低到高排列
如上圖1號VSS(電源負極,或者地GND)和16號VDD(電源正極)是晶片的電源相關引腳
PA0~PA7,PB0~PB7,表示的是普通IO引腳
例如2號引腳
PA5:表示具有普通IO外設功能
KIN5:具有外部喚醒功能(晶片睡眠器件可通過該引腳外部信號的電平變化來喚醒晶片)
PINT3:具有外部中斷功能(外部信號通過引腳變化會產生中斷,
一般這樣的具有中斷功能的引腳也具備喚醒功能)
OSC1:可以作為外部晶振輸入
CLKI:外部時鐘輸入
可以通過管腳復用說明查詢相關功能
PA5/KIN5/PINT3..描述使用左斜槓分隔,意義為引腳的復用功能
簡單的說這個引腳可被多個功能使用(通過配置相關寄存器來選擇該引腳使用的功能)
查看引腳復用功能表
一般為如下圖表,一般在管腳圖下方或者器件概述章節
4.外設配置
第四步:
根據使用的外設查詢對應的章節
以普通的IO(GPIO)外設配置為例
在數據手冊上找IO埠或者輸入/輸出端口英文文檔查詢I/O Port
描述的信息有
1.描述外設的電路的簡單框圖
2.外設的功能
3.外設涉及到的寄存器
如GPIO管腳的通用IO配置步驟如下
1.配置管腳的方向,輸入還是輸出
2.配置管腳的數據,就是管腳的電平
以PIC為例 TRISA寄存器配置管腳的方向,0:為輸出,1為輸入
這個寄存器是8位的寄存器,每一位代表著這個IO埠的一個引腳
TRISA:配置的是PA埠的PA0~PA7這樣的8個引腳,
TRISB:配置的是PB埠的PB0~PB7這樣的8個引腳,
配置位不一定都用到,可能只用到其中幾個,具體根據手冊信息
寄存器查詢技巧:
通過Registers查找到寄存器表,再通過寄存器的名稱
找到寄存器的詳細描述表
PORTA寄存器就是管腳的數據寄存器
假設,配置值為16進位表示,可將其轉換為二進位更直觀查看與配置位的關係
TRISA=0x00
PORTA=0x01
上面配置的PA0引腳輸出高電平,如果你晶片上的該引腳連接了一個LED燈
查看原理圖上,該LED燈是高電平點亮,這個設置就會點亮LED燈了
還有其他外設的配置流程一般入下
1.配置外設時鐘源(例如I2C,uart等外設)
2.配置該外設的復用引腳
3.根據手冊配置該外設的其他寄存器
4.配置外設的中斷(該外設有中斷功能的)
5.編寫中斷服務函數,在函數內做自定義信號標記並清除該中斷的標記位,
在主循環中輪訓自定義信息標記,來判斷該外設是否產生了中斷
(服務例程中最好不要做耗時等操作,這樣做是為了儘量減少對其他外設中斷的影響)
5其他相關章節
1.存儲器構成(一般是在自己設計軟體包時用,以及自己實現os內核查看,並且
這些信息只是簡單的信息)
描述了該晶片的存儲構成,寄存器的映射地址,堆棧、中斷向量、數據存儲器的映射地址等信息
2.電氣信息
描述的是器件的電壓,電流等信息
3.指令集
彙編中才用到
6.一個完整的程序流程偽代碼
#include <晶片寄存器相關的頭文件,由該晶片的軟體包提供,
也可以自己根據手冊的寄存器映射地址自己定義>
unsigned char myFlag=0;
void IntFunction(){
//中斷服務例程,有些需要由特殊的關鍵字定義如:
// void interrupt函數名(void)
// void __interrupt()函數名(void)
// 晶片不同服務函數的關鍵字也不一樣,例如STM可以修改啟動文件自己定義
// 一般8位的晶片所有的中斷都用一個中斷服務函數處理,由寄存器的標記位
// 來區分產生的是什麼中斷,也有為不同中斷分配不同服務函數的
if(xxxIE&&xxxIF){
//xxxIE:該中斷的使能位
//xxxIF:該中斷的標記位
//這些位的名稱根據手冊上的描述來
xxxIF=0;//清零中斷標記位一般都要立馬清除標記位,否則下次中斷不會進入中斷服務函數
myFlag=1;
}
}
void main(void){
配置時鐘
配置引腳
配置外設
while(1){
晶片運行中...
if(myFlag){
myFlag=0;
//輪詢到中斷,在這裡處理中斷要達到的目的
}
///下面是led閃爍的偽代碼
led_點亮();
delay(500);
led_熄滅()
delay(500);
}
}
說了這麼多,大家記得留意下方評論第一條(或者私信我)有干貨~