嵌入式控制K60考试复习
嵌入式控制K60考試復習
專業術語英文縮寫
RISC Reduced Instruction Set Computer精簡指令集計算機
IIC Inter-Integrated Circuit Bus 內部集成電路總線
IDE Integrated Development Environment 集成開發環境
SIM System Integration Module 系統集成模塊
CRG Clock and Reset Generator 時鐘與復位發生器
SPI Serial Peripheral Interface同步串行外設接口
VCO Voltage Controlled Oscillator 壓控振蕩器
DMA Direct Memory Access,直接內存存取
MPU Memory Protection Unit 存儲器保護單元
ARM Advanced RISC Machine進階精簡指令集機器
PIT Periodic Interrupt Timer 周期中斷定時器
SPSR Saved Program Status Register 備份的程序狀態寄存器(用于在程序異常中斷時保存被中斷的程序狀態)
JTAG Joint Test Action Group 聯合測試行動組織 邊界掃描測試協議
CAN Controller Area Network 控制器局域網絡
PLL Phase-Locked Loop鎖相環
FLL Frequency-Locked Loop 頻率鎖定環
DCO Digitally-Controlled Oscillator數字控制振蕩器
PWM Pulse-Width Modulation 脈寬調制
FTM Flex Timer Module 柔性定時器模塊
NVIC Nested Vectored Interrupt Controller嵌套矢量中斷控制器
UART Universal Asynchronous Receiver And Transmitter 通用異步發送和接收器
RTOS Real Time Operation System 實時操作系統
ISR Interrupt Service Routines中斷服務程序
FPU Floating Point Unit 浮點運算單元
TCD Transfer Control Descriptor 轉移控制描述符
TSI Touch Sense Input 觸摸感應輸入
GPIO General Purpose Input/Output 通用輸入輸出
CRC Cyclic Redundancy Check 循環冗余檢查
RTC Real Time Clock 實時鐘
NVIC Nested Vectored Interrupt Controller嵌套矢量中斷控制器
UART Universal Asynchronous Receiver And Transmitter 通用異步發送和接收器
RTOS Real Time Operation System 實時操作系統
ISR Interrupt Service Routines中斷服務程序
FPU Floating Point Unit 浮點運算單元
TCD Transfer Control Descriptor 轉移控制描述符
TSI Touch Sense Input 觸摸感應輸入
GPIO General Purpose Input/Output 通用輸入輸出
CRC Cyclic Redundancy Check 循環冗余檢查
RTC Real Time Clock 實時鐘
?
大端和小端:
大端模式:高位字節存放內存的低地址端,低位字節放在內存的高地址端
小端模式:高位字節放在內存的高地址端,低位字節放在內存的低地址端
32bit寬的數0x12345678在Little-endian模式以及Big-endian模式)CPU內存中的存放方式(假設從地址0x4000開始存放)為:
| 內存地址 | 小端模式存放內容 | 大端模式存放內容 |
| 0x4000 | 0x78 | 0x12 |
| 0x4001 | 0x56 | 0x34 |
| 0x4002 | 0x34 | 0x56 |
| 0x4003 | 0x12 | 0x78 |
大端模式看上去很舒服,就是從上到下很順利地存儲進去,小端模式看上去有點兒奇怪.
?
ARM Corex-M4 的主要寄存器
32位寄存器:
13個通用寄存器,R0-R12
堆棧指針SP, R13寄存器的別名,也被稱為棧指針寄存器,用于在SP_process 和 SP_main之間的切換.
連接寄存器LR,R14,
程序計數器PC,R15
特殊功能寄存器(xPSR)
高位寄存器R8-R12可由指定通用寄存器的所有32位指令訪問,不能被16位指令訪問.
R13,R14,R15有如下功能:
堆棧指針R13:寄存器R13用作堆棧指針(SP)。由于SP忽略對位[1:0]的寫入,因此它會自動對齊到一個字,即為四字節邊界。在處理器為Handler模式下,使用的是SP_main(主棧),在Thread模式下,既可以使用SP_Process也可以使用SP_main
鏈接寄存器R14:寄存器R14是子程序寄存器(LR),當執行帶鏈接的跳轉指令BL或者帶鏈接以及狀態切換的跳轉指令BLX時候,LR將保存PC作為返回地址.LR也用于異常返回,在其他的時候,可以把R14當做通用寄存器使用.
程序計數器為寄存器R15
ARM Cortex-M4 MCU數據處理指令是對通用寄存器R0~R7進行操作,在大多數情況下,操作的結果放入其中一個操作數寄存器中,而不是放入第3個寄存器中;訪問寄存器R8~R15受到一定的限制,除MOV、ADD指令訪問R8~R15外,其他數據處理指令總是更新CPSR中ALU狀態標志,訪問寄存器R8~R15的Thumb數據處理指令不能更新CPSR中的ALU狀態指示。
R13作為基址標志操作。R14被稱為“鏈接寄存器”(Link Register,LR)
ARM 處理器中使用R15 作為PC,它總是指向取指單元,并且ARM 處理器中只有一個PC 寄存器,被各模式共用。R15 有32 位寬度(下述標記為R15[31:0],表示R15 的‘第31位’到‘第0位'),ARM 處理器可以直接尋址4GB的地址空間(2^32 = 4G )。
?
MK60DN512是以ARMv7 Cortex-M4內核的微控制器芯片
MK60DN512的通信模塊:
---具有MII和RMII接口的以太網控制器,用于外部PHY和硬件IEEE 1588功能
---片上收發的USB全速/低速控制器
---兩路CAN(控制器局域網絡)模塊
---三個SPI
---兩個I2C
---六個串口(UART)
---SDHC(安全數字主機控制器)
---I2S
?
MK60DN512的定時器:
---可編程延遲模塊
---8路電機控制/pwm定時器/普通定時器
---兩路正交解碼器/普通定時器
---IEEE 1588定時器
---周期性中斷定時器
---16位低功耗定時器
---載波調制發射器
---實時時鐘
?
連續轉換使能外設時鐘= 50 MHz,ADC時鐘= 12 MHz,ADLSMP = 1,ADLST = 01,ADHSC = 1
它具有250 Ksps轉換速度(250Ksps即為250KHz的采樣率)
現代88鍵的基頻赫茲列表十六音平等的關鍵標準或108鍵擴展鋼琴,第49個鍵,第五個A(稱為A4),調到440赫茲(簡稱A440)。每個連續的音高是通過將前一個乘以(遞增)或除以(遞減)2的十二次方(大約= 1.059463)得到的。例如,要使頻率從A4(A?4)上升到半音,將440乘以2的12次方。從A4到B4(整個音調,或兩個半音),將兩倍乘以2的十二根次方(或者僅僅是2的六次方,大約= 1.122462)。
非可屏蔽中斷(Non Maskable interrupt), 是除復位之外的最高優先級異常。它是永久啟用的,具有-2的固定優先級。
多用途時鐘發生器(MCG)模塊,包含由內部或外部時鐘發生源控制的鎖頻環(FLL)和鎖相環(PLL)。
?
?
MK60DN512 UART具有多個狀態中斷請求源(發送數據為空,發送完成,空閑,接收數據滿,LIN中斷檢測,RxD引腳有效邊沿,初始字符檢測)。UART狀態源的共享一個單中斷向量。
向量數(vector number)-當中斷被觸發時存儲在堆棧上的值。非核心中斷源計數,即向量數減去16.
?
MK60DN512ZV MCU只有Port A(0-19,24-29), Port B(1-11,16-23), Port C(0-15,16-19), Port D(0-15)和Port E(0-12,24-28) 5個通用對外端口提供給用戶可用,每個端口有不同數量的引腳,經過編程選擇,端口A-E均可以由外部脈沖信號檢測(脈沖邊沿及電平)引起中斷.
MK60DN512 MCU的ADC0(ADC1)轉換結果,不管是什么格式(單端8,10,12,16bit;差分9,11,13,16bit),要么放在ADC0_RA(ADC1_RA),要么放在ADC0_RB(ADC1_RB)中,一次轉換結束(包括多次后平均)只能存放一個結果。
?
MK60DN512(144引腳)的MCU包含4個PIT(周期中斷定時器模塊)模塊(PIT0-PIT3),所有的定時器都支持中斷的方式.中斷數分別對應84-87,定時器中斷可以通過使能TCTRLn中的[TIE]位來實現.當相關定時器發生超時時,定時器中斷標志(TIF)設置為1,并通過向相應的TFLGn [TIF]寫1來清除為0。
???????? 1.Addition
ADD Rd, Rn, <op2> 1 Cycles
2.Long signed accumulate Multiply
SMLAL RdLo, RdHi, Rn, Rm 1 Cycles
3.Signed Divide
SDIV Rd, Rn, Rm 2 to 12 Cycles
?
除法運算的使用是提前終止的,以根據輸入操作數中前導1和0的數量最小化所需的周期數.
?
?
處理器實現高級異常和中斷。
為了減少中斷延遲,處理器實現了中斷延遲到達和中斷尾鏈機制:
?當被訪問的內存沒有應用等待狀態時 ,從激發中斷到執行ISR的第一條指令,最多有12個周期延遲。要執行的第一條指令與堆棧進棧并行獲取。
?類似地,中斷返回需要12個周期,其中返回的指令與堆棧出棧并行獲取。
?使用零等待狀態存儲器時,尾鏈需要6個周期。不執行堆棧進棧或出棧,僅獲取下一個ISR的指令。
?
除了體系結構定義的異常行為外,處理器的異常模式還對以下的應用定義為異常:
?在NMI優先級下從HardFault堆疊到NMI鎖定的異常
?在HardFault優先級從NMI拆分到HardFault鎖定的例外。
?
為了最大限度地減少中斷延遲,處理器放棄任何分片指令來接收任何掛起的中斷。從中斷處理程序返回時,處理器從頭開始重新執行分片指令,處理器執行中斷可繼續指令字段。加載多個(LDM)操作和存儲多個(STM)操作是可中斷的, EPSR(程序狀態寄存器中的一種xPSR)保存從中斷發生點繼續加載或存儲多個所需的信息。
這意味著軟件不得使用加載多個或存儲多個指令來訪問設備或訪問讀取敏感的內存區域或對重復寫入敏感的區域。在任何重復讀取或寫入可能導致結果不一致或不良副作用的情況下,軟件不得使用這些說明。
| #include "common.h" #include "MK60_adc.h” ADC_MemMapPtr ADCN[2] = {ADC0_BASE_PTR, ADC1_BASE_PTR}; //定義兩個指針數組保存 ADCN 的址 static void adc_start (ADCn_Ch_e, ADC_nbit); //開始adc轉換 /* brief ADC初始化; param ADCn_Ch_e ADC通道; Sample usage: adc_init (ADC0_SE10 ); //初始化 ADC0_SE10 ,使用 PTA7 管腳 */ void adc_init(ADCn_Ch_e adcn_ch) { uint8 adcn = adcn_ch >> 5 ; //uint8 ch = adcn_ch & 0x1F; switch(adcn) { case ADC0: /* ADC0 */ SIM_SCGC6 |= (SIM_SCGC6_ADC0_MASK ); //開啟ADC0時鐘 SIM_SOPT7 &= ~(SIM_SOPT7_ADC0ALTTRGEN_MASK | SIM_SOPT7_ADC0PRETRGSEL_MASK); SIM_SOPT7 |= SIM_SOPT7_ADC0TRGSEL(0); break; case ADC1: /* ADC1 */ SIM_SCGC3 |= (SIM_SCGC3_ADC1_MASK ); SIM_SOPT7 &= ~(SIM_SOPT7_ADC1ALTTRGEN_MASK | SIM_SOPT7_ADC1PRETRGSEL_MASK) ; SIM_SOPT7 |= SIM_SOPT7_ADC1TRGSEL(0); break; default: ASSERT(0); } switch(adcn_ch) { case ADC0_SE8: // PTB0 port_init(PTB0, ALT0); break; case ADC0_SE18: // PTE25 port_init(PTE25, ALT0); break; case ADC0_DP0: case ADC0_DP1: case ADC0_DP3: case ADC0_DM0: // ADC0_DM0 case ADC0_DM1: // ADC0_DM1 case ADC0_SE16: // ADC0_SE16 case Temp0_Sensor: // Temperature Sensor,內部溫度測量,可用ADC函數 case VREFH0: // 參考高電壓,可用ADC函數 ,結果恒為 2^n-1 case VREFL0: // 參考低電壓,可用ADC函數 ,結果恒為 0 break; //這部分管腳不用配置復用 ? default: ASSERT(0); //斷言,傳遞的管腳不支持 ADC 單端軟件觸發,請換 其他管腳 break; } } ? /* brief 獲取ADC采樣值(不支持B通道) param ADCn_Ch_e ADC通道 param ADC_nbit ADC精度(ADC_8bit,ADC_12bit, ADC_10bit, ADC_16bit ) return 采樣值 Sample usage: uint16 var = adc_once(ADC0_SE10, ADC_8bit); */ uint16 adc_once(ADCn_Ch_e adcn_ch, ADC_nbit bit) //采集某路模擬量的AD值 { ADCn_e adcn = (ADCn_e)(adcn_ch >> 5) ; uint16 result = 0; adc_start(adcn_ch, bit); //啟動ADC轉換 while (( ADC_SC1_REG(ADCN[adcn], 0 ) & ADC_SC1_COCO_MASK ) != ADC_SC1_COCO_MASK); //只支持 A通道 result = ADC_R_REG(ADCN[adcn], 0); ADC_SC1_REG(ADCN[adcn], 0) &= ~ADC_SC1_COCO_MASK; return result; } ? void adc_start(ADCn_Ch_e adcn_ch, ADC_nbit bit) /* Sample usage: adc_start(ADC0_SE10, ADC_8bit); */ { ADCn_e adcn = (ADCn_e)(adcn_ch >> 5) ; uint8 ch = (uint8)(adcn_ch & 0x1F); //初始化ADC默認配置 ADC_CFG1_REG(ADCN[adcn]) = (0 //| ADC_CFG1_ADLPC_MASK //ADC功耗配置,0為正常功耗,1為低功耗 | ADC_CFG1_ADIV(2) //時鐘分頻選擇,分頻系數為 2^n,2bit | ADC_CFG1_ADLSMP_MASK //采樣時間配置,0為短采樣時間,1 為長采樣時間 | ADC_CFG1_MODE(bit) | ADC_CFG1_ADICLK(0) //0為總線時鐘,1為總線時鐘/2,2為交替時鐘(ALTCLK),3為步時鐘(ADACK) ); ADC_CFG2_REG(ADCN[adcn]) = (0 //| ADC_CFG2_MUXSEL_MASK //ADC復用選擇,0為a通道,1為b通道. //| ADC_CFG2_ADACKEN_MASK //異步時鐘輸出使能,0為禁止,1為使能. | ADC_CFG2_ADHSC_MASK //高速配置,0為正常轉換序列.1為高速轉換序列 | ADC_CFG2_ADLSTS(0) //長采樣時間選擇.ADCK為4+n個額外循環.額外循環.0為20.1為12.2為6.3為2 ); //寫入 SC1A 啟動轉換 ADC_SC1_REG(ADCN[adcn], 0 ) = (0 | ADC_SC1_AIEN_MASK // 轉換完成中斷,0為禁止,1為使能 //| ADC_SC1_DIFF_MASK // 差分模式使能,0為單端,1為差分 | ADC_SC1_ADCH( ch ) ); } ? ? ? ? |
?
?
?
?
?
?
?
?
?
?
?
?
總結
以上是生活随笔為你收集整理的嵌入式控制K60考试复习的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: react(84)--多张图片
- 下一篇: Taro+react开发(29)引入固定