(基于ARM的)微機原理與接口技術(shù)筆記合集(7-14)
我是北航儀光低檔垃圾暴斃貨劍人,曾經(jīng)是航C豬腳.咕了兩個月,馬上要烤期了,各位的破防水準備好了嗎?現(xiàn)在是12月11號,再過3周就要考試了,之前一直想更新但是一直拖,但是再拖下去就暴斃了.現(xiàn)在我決定不繼續(xù)拖了,于是有了這個合集,2個月來的R710F的上路歷程.
首先是匯編語言雜記
(真的是筆記)如果配合ARM手冊食用效果更佳.考試如果考一車匯編我必然掛科,不是開玩笑.



注意R710F是不帶FPU的 所有的float和double都是軟件處理.
R710F好像也沒有硬件除法器......



匯編和C相互調(diào)用
ATPCS規(guī)定了:小于4個參數(shù):寄存器r0
到r3
傳參數(shù)
import CFunc
C調(diào)用匯編:使用export把程序段導出給C語言調(diào)用
比如說下面的匯編程序段要實現(xiàn)復制字符串的功能:

在C里面寫個函數(shù):
就可以調(diào)用上面的匯編程序了
嵌入式高級語言編程簡介
像str71x.s
這樣的匯編文件是啟動代碼()
不光r710f有啟動代碼 其他的板子,比如說樹莓派pico(2個cortex-m0+核)或者stm32f103c8t6(1個cortex-m3核)都需要對應的啟動文件,這個匯編文件和編譯器相關.也有的編譯器支持用C語言寫啟動文件.
啟動代碼需要做的:
建立棧區(qū),堆區(qū),向量表,硬件地址等,初始化C運行時
運行
main
函數(shù)捕獲異常
r710f芯片大概結(jié)構(gòu)(這個開發(fā)板的生產(chǎn)廠家現(xiàn)在好像已經(jīng)寄了)
native總線:
FLASH
,SRAM
,調(diào)試口JTAG
,PRCCU
,
apb2總線(慢速):
模數(shù)轉(zhuǎn)換ADC
,增強型中斷控制器EIC
,定時器TIM
,實時時鐘RTC
,外部中斷XTI
,看門狗WDG
,3組GPIO
apb1總線:(快速)
2組IIC
,2組帶緩沖區(qū)的SPI
,4組UART
,1個USB
,1個CAN
,1個HDLC

存儲空間(對于別的板子,例如stm32,存儲空間地址配置有差異.可以查手冊獲得這些信息)
r710f的地址范圍:0x00000000
到0xffffffff
0x00000000
BOOT區(qū)
0x20000000
SRAM
r710fz2
64KB SRAM
0x40000000
FLASH
256KB Bank0
16KB Bank1
EMI 最大可以擴展4個16MB的FLASH(16位的)需要配置寄存器
0xa0000000
PRCCU(復位和時鐘控制器)
0xc0000000
APB1外設
0xe0000000
APB2外設
0xfffffb00
R710F的啟動模式

R710F供電模式和時鐘
PRCCU
power,reset,clock control unit(供電,復位,時鐘控制器)
對于CPU兩個重要的事情:第一個是復位的狀態(tài)一定要確定 第二個是時鐘
RESET是復位到最初始的狀態(tài),是后面所有事情的基礎.
上電復位,軟件指令復位,看門狗復位
上電復位:RAM的東西不確定的
軟件復位/看門狗復位:RAM的東西不丟失
CPU必會死機(躲不掉的).看門狗:一種硬件定時器,當核心死機了或者跑飛了復位.
上電和掉電的順序很重要!
需要電源管理模塊.可以做功耗管理,低功耗模式.
R710F集成2個穩(wěn)壓模塊.只用3.3V供電就OK了

如果是電池供電,全速工作會非常費電.

R710F的時鐘樹(重點)

CK是時鐘源(有源晶振)
選擇時鐘源用配置寄存器
32768無源晶振是低功耗時用的
USB有專用時鐘

上手一個板子,理解時鐘樹很重要.R710F主頻最大48MHz,引8MHz時鐘源,過PLL(鎖相環(huán))倍頻12分頻2得48MHz,然后1分頻給MCLK就是48MHz.如果是16MHz的時鐘源就需要修改PLL配置寄存器,時序亂了CPU就不能正常工作.外設如果需要24M的時鐘在PCLK處開2分頻.
下面這個圖是從CSDN搬的.STM32有4個時鐘源,時鐘樹也更加復雜,但是順著找順著配置就能做出來開單片機必然先配置時鐘,有的時候是人家SDK替你做了,自己做的時候需要看時鐘樹.

I/O接口技術(shù)簡介
IO口的作用:解決速度匹配問題,信號轉(zhuǎn)換,輸入輸出控制
CPU與IO之間信息:數(shù)據(jù),狀態(tài)信息,控制信息
IO口的編地址方式:統(tǒng)一編址(存儲器映像),獨立編址(有專門的指令訪問外設)
GPIO的硬件結(jié)構(gòu)
外設通過寄存器和處理器連接
寄存器組包括:配置寄存器(CFGR) 狀態(tài)寄存器(SR) 數(shù)據(jù)寄存器(DR)
CPU與IO之間信息:數(shù)據(jù),狀態(tài)信息,控制信息
ARM對IO口進行了統(tǒng)一編址,不用I/O指令(通過ARM庫的結(jié)構(gòu)指針訪問)
并行傳輸:一次傳輸多位(可以是一個數(shù))需要多根線 用并口
并口速度快了可能有速度的微小差異(導致傳輸出錯),干擾大
串行傳輸:一次傳輸一位(按順序走) 用串口
80x86的外設有專門的指令去訪問(不占存儲空間)
GPIO功能:讀引腳的高低電平/輸出高低電平 切忌直接用GPIO接在電機等大電流器件上
配置IO口:一個GPIO有3個配置寄存器

8個模式:
輸入:高阻(模擬)輸入,TTL輸入 CMOS輸入 帶上拉和下拉的輸入(注意不是單獨配置上拉和下拉)TTL和CMOS是檢測1的電平不一樣.AIN是模擬輸入
輸出:推拉輸出/開漏輸出(OUT模式或者復用模式)
下面是STM32的IO口結(jié)構(gòu)(網(wǎng)上找的圖,不放我手繪的了),和R710F的類似.但是
更復雜,有更舒適的庫函數(shù)可以用,而且可以單獨配置上拉或下拉.

串行接口
UART
: Universal Asynchronous Receiver Transmitter 通用異步收發(fā)器
串口 一次發(fā)一個bit 必須從bit0開始(LSBFIRST
)
和并行對應 并行可以一次可以發(fā)一個字節(jié)
USB
:Universal Serial Bus也是一種串行接口協(xié)議
高電平空閑,一般1個起始位,8個數(shù)據(jù)位(最常見的),[1個可選的校驗位],1個(或2個)停止位
起始位低電平,然后是原始數(shù)據(jù),校驗位,停止位.
速度問題 baudrate
baudrate高的時候傳輸快,但是時鐘偏差容易導致通信失敗.
工業(yè)控制不能輕易的用藍牙或WIFI因為不可靠,有可能丟幀
3.3V或5V的串口可以通過RS232模塊轉(zhuǎn)成大的電壓 -12V(低) +12V(高)可以傳輸100米
為保證抗干擾 baudrate需要調(diào)低
常用于遠程有線傳輸?shù)倪€有RS485/RS422模塊

R710F
的UART配置方式
配置 baudrate寄存器 baudrate=PCLK1/(16*BaudReg)
配置控制寄存器
緩沖寄存器(RX和TX)
CPU和外設之前的傳送數(shù)據(jù)方式
1.無條件傳送(點燈就是這樣的)
外設簡單,要求速度快/兩次傳送
需要buffer/latch
2.查詢(輪詢)方式
先查詢再傳送
至少2個端口(數(shù)據(jù)/狀態(tài))
3.中斷方式
外設向CPU發(fā)中斷(IRQ)->CPU中斷當前工作進入IRQ函數(shù)->辦完了返回
協(xié)調(diào)快速CPU和慢速外設
4.DMA方式
Direct Memory Access 直接從外設到存儲器 省得CPU去搬磚 也可以外設搬到外設比如說把AD的結(jié)果搬到SPI
最先進的方式(硬件DMA) 用于大塊數(shù)據(jù)傳輸/快速數(shù)據(jù)
需要CPU讓開一些總線給DMA用 代價是CPU訪問變慢
可以配合中斷使用
使用流程:配置,傳送,傳送完了怎么辦

中斷技術(shù)
定義:CPU暫時中止當前的程序切換到中斷處理程序(IRQHANDLER)
意義:CPU和IO并行工作,處理故障,提高實時性
中斷系統(tǒng):
早期的板子沒有自帶NVIC(nested vectored interrupt controller)
中斷源:
分類:
按產(chǎn)生方式:強迫中斷/非強迫中斷
按中斷位置:內(nèi)部/外部
按進入handler方式:向量中斷/非向量中斷
中斷優(yōu)先級/中斷嵌套:在中斷處理函數(shù)里面可以再來中斷,硬件處理(stm32或者樹莓派pico的硬件NVIC/ r710f的EIC)
寄存器配置:查找datasheet
EIC把ARM7TDMI的2個中斷(IRQ/FIQ)擴成32個中斷
工作流程:EIC接受中斷(ICR打開相應中斷),更新IVR拼一個向量表
編程:初始化,配置,打開中斷
設置IRQ中斷優(yōu)先級,打開中斷,EIC負責配置
直接打開FIQ.在硬件上FIQ可以保證比IRQ優(yōu)先處理

如何進入異常:
入口放跳轉(zhuǎn)指令
b exception_handler
注意跳轉(zhuǎn)范圍限制文字池 32位的地址
ldr pc,=handler_addr
如何初始化 IVR和32個SIR
用地址初始化:缺點:32個子程的地址高16位必須相同
在EIC_IVR生成跳轉(zhuǎn)指令
中斷服務子程(ISR)是一種特殊的子程序
中斷的步驟:
第一步:別的硬件發(fā)送中斷請求

第三步:處理中斷
保護現(xiàn)場(硬件可以做),保護斷點(可能需要軟件做,否則寄存器的關鍵數(shù)據(jù)變了,程序跑飛了)
開中斷,處理,關中斷,恢復現(xiàn)場.
哪些事情是硬件做或者SDK軟件實現(xiàn)好了的,哪些是需要手寫的 看不同的CPU和SDK手冊
R710F的中斷向量表:


向量表決定了FIQ可以打斷IRQ
ARM7TDMI的異常(和中斷有關,但是它們是兩個概念)
直接異常:軟中斷/undefined instruction/預取指異常
間接異常:數(shù)據(jù)終止
外部產(chǎn)生的: RESET/IRQ/FIQ
RESET是最高級的 強制重開.

出現(xiàn)異常的時候R710F核心自動做的:

為什么是PC-4因為涉及流水線,設置PC為跳轉(zhuǎn)到IRQ地址

R710F只有2個中斷(IRQ和FIQ)通過EIC和XTI(外部中斷控制器)實現(xiàn)中斷的擴展
新一些的ARM Cortex-M板子普遍用核心自帶的NVIC(nested vectored interrupt controller)處理中斷

定時器(TIMER)


計數(shù)器:對誰計數(shù) 怎么變 復位?
R710F
的定時器16位
counter初始化為0xfffc
這點極不友好,重置就是0xfffc,不是任意的數(shù)

注:STM32是可以指定定時器重置后裝載的數(shù)的,也能控制向上/向下計數(shù),使用更加靈活,而且還有SYSTICK定時器可以用.
5個中斷(溢出中斷,2個比較中斷,2個捕獲中斷)
輸入->邊沿檢測電路ICAP變化,把計數(shù)器的值copy到ICAR/ICBR
可以測量引腳的脈沖寬度(PWM)太快的和太慢的都不能測.
輸出引腳可以用于定時/中斷,產(chǎn)生硬件PWM輸出
OCAR用于控制脈寬:計數(shù)器與OCAR一致 OCMPA置OLVLA
OCBR用于控制周期:計數(shù)器與OCBR一致 OCMPA置OLVLB同時復位
OCAR<OCBR:PWM
OCAR=OCBR:方波
OCAR>OCBR:無輸出

寄存器手冊(純寄存器開發(fā)要用,庫函數(shù)開發(fā)可以不那么care)



r710F:板載12位ADC
輸入0-2.5V 4個通道->4個寄存器(STM32f103c8t6和樹莓派pico都是0-3.3V的AD模塊)
可以出中斷
配置時鐘(PRESCALER=APB2FREQ/(SAMPLEFREQ*512*4))

配置過程:
模式:round robin(連續(xù)出多個)/single channel operation
初始化:
配置AD模塊
ADC12_Init()
配置GPIO模擬輸入
GPIO_Config(GPIO1,1,GPIO_HI_AIN_TRI)
配置prescaler(低7位有效)
ADC12_PrescalerConfig
配置轉(zhuǎn)換模式
配置通道
輪詢等待轉(zhuǎn)換結(jié)果
取結(jié)果
關閉轉(zhuǎn)換