嵌入式控制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 )

);

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

展开阅读全文

没有更多推荐了,返回首页