浙江大学微机原理DSP考试必背知识点及基本程序部分教学内容.docx
《浙江大学微机原理DSP考试必背知识点及基本程序部分教学内容.docx》由会员分享,可在线阅读,更多相关《浙江大学微机原理DSP考试必背知识点及基本程序部分教学内容.docx(17页珍藏版)》请在冰豆网上搜索。
浙江大学微机原理DSP考试必背知识点及基本程序部分教学内容
浙江大学微机原理(DSP)考试必背(知识点及基本程序部分)
第二章系统控制与中断+老师复习时专讲的中断内容
1、【强记】voidInitSysCtrl()
voidInitSysCtrl()
{EALLOW;
WDCR=0x0068;//屏蔽WatchDog
PLLCR=0xA;//锁相环设为10/2=5倍频(使系统时钟30MHz*5=150MHz)
//PLLCR可设0x0~0xA,其中0x0和0x1等效,均为1/2=0.5倍频
for(i=0;i<((131072/2)/12);i++){;}
HISPCP=1;//HISPCLK=SYSCLK/HISPCP*2,从而有75MHz
LOSPCP=2;//LOSPCLK=SYSCLK/LOSPCP*2,从而有37.5MHz
PCLKCR=0x0D0B;//写1开启部分外设,这里开启了SCIA/B,SPI,ADC,EVA/B
//0000110100001011
EDIS;
}
2、解释WatchDog(看门狗)工作原理(记住位域名称与功能)
片内振荡器时钟OSCCLK经过分频后进入8位看门狗计数器,当计数器上溢,则可输出中断或复位信号。
当看门狗使能,若系统正常运行,则需用户周期性地在看门狗计数器上溢前向复位寄存器WDKEY写入0x55+0xAA来清零计数器,若程序受干扰而跑飞,则看门狗的中断或复位信号可使系统恢复至正常状态,提高系统稳定性与可靠性。
补充——涉及寄存器:
系统控制和状态寄存器SCSR:
WDENINT指定看门狗输出复位信号还是中断信号;WDOVERRIDE指定是否允许用户修改控制寄存器WDCR的WDDIS位;
计数寄存器WDCNTR:
低8位连续加计数,可由复位寄存器WDKEY立即清零;
复位寄存器WDKEY:
连续写入0x55+0xAA可清零计数寄存器WDCNTR,写入其它序列则立即触发看门狗复位事件。
读该寄存器返回控制寄存器WDCR值;
控制寄存器WDCR:
WDFLAG为看门狗复位状态标志位,若复位事件由看门狗触发则置1,用户写1清零;WDDIS写1使能,写0屏蔽看门狗;WDCHK必须写101才能写WDCR寄存器;WDPS为看门狗计数器时钟相对于OSCCLK/512的分频系数。
3、解释PLL(锁相环)工作原理
PLL负责把片内振荡器时钟或外部时钟经过倍频转化为系统时钟SYSCLKOUT。
当引脚XF_XPLLDIS为低电平:
PLL被禁止,系统时钟直接引用外部时钟源。
当引脚XF_XPLLDIS为高电平:
若PLLCR为0,则PLL被旁路,片内振荡器时钟OSCCLK被二分频;若PLLCR为n(n=0x1~0xA),则PLL使能,OSCCLK被(n/2)倍频。
4、【强记】为了使CPU定时器工作在指定频率,应如何设置
voidInitSysCtrl();
voidInitCputimer(void)//定时器初始化,中断周期为1ms(1kHz)
{EALLOW;
TIMER0TPR=149;//CPU定时器分频寄存器,150MHz/(149+1)=1MHz的计时器时钟
TIMER0TPRH=0;//CPU定时器分频寄存器的高位置0
TIMER0PRD=(long)999;//设置CPU定时器周期寄存器,1MHz/(999+1)=1kHz
TIMER0TCR=0xF000;//CPU定时器0的启动与清除中断标志都是这句。
EDIS;
}
5、解释CPU定时器工作原理
系统时钟进入CPU定时器后,16位预定标计数器PSCH:
PSC会连续减计数,当经过(TDDRH:
TDDR+1)个SYSCLKOUT周期后下溢,预定标计数器重装TDDRH:
TDDR值,并使计数寄存器TIMH:
TIM减1。
当计数寄存器TIMH:
TIM下溢,则重装PRDH:
PRD值,并输出定时器中断信号。
补充——涉及寄存器:
TPRH:
TPR:
高8位组合成共16位的PSCH:
PSC,为预定标计数器;低8位组合成共16位的TDDRH:
TDDR,为分频寄存器,储存预定标计数器的周期;
TIMH:
TIM:
计数寄存器,下溢时输出中断信号;
PRDH:
PRD:
周期寄存器,储存计数寄存器的周期;
TCR:
控制寄存器,含中断标志位、中断使能位、定时器重载控制位、定时器使能/停止位。
启动与清除中断标志都是这句:
TIMER0TCR=0xF000;
6、PIE工作原理
PIE共有12组(m=1~12),每组控制8个中断(n=1~8),因此共控制96个外设中断。
要使外设的中断请求INTm.n被送入CPU,必先清零PIE标志位PIEIFRm(全部n=1~8都需清零),置一PIE使能位PIEIFRm.n,再向应答标志位PIEACKm写1清零。
当外设中断请求到来,相应PIE标志位和应答标志位都会置1。
当CPU转向中断服务函数,会自动清除PIE标志位PIEm.n,但还需用户软件向PIE应答标志位PIEACKm写1清零,并清零外设中断标志位。
7、CPU级中断寄存器的原理
CPU级中断INTm共有14个(m=1~14),其中前12个被PIE复用。
要使中断请求INTm被送入CPU,必先清零标志位IFR,置一使能位IFR,并使能全局中断控制位INTM(使能调用语句:
asm(“EINT”);屏蔽调用语句:
asm(“DINT”);)。
当中断请求到来,相应标志位IFR置一。
当CPU转向中断服务函数,会自动清除标志位IFR。
8、中断向量表工作原理
当中断请求到达CPU后,CPU会保存现场,并自动清除相应的CPU中断标志位和PIE中断标志位,再根据中断的来源按照优先级读取中断向量表的相应地址中存放的中断服务函数ISR地址,并跳转至该ISR。
ISR执行完毕后,CPU回到原现场继续执行。
对于中断向量INT_m_n(m=1~12,n=1~8),中断向量地址计算:
PIE_VECT_m_n=0x0D40+2*[8*(m-1)+(n-1)]
(0x0D40为INT1.1即第一组第一个中断向量的地址,每个地址长度为0x0002,以此类推,INT1.2地址为0x0D42,INT1.3地址为0x0D44……)
补充——老师考以下中断编程,其中断向量地址如下(但老师可能故意考上面的公式):
CPU定时器0的中断:
(INT_1_7)TINT0:
0x0D4C
EVA的通用定时器1、2的周期中断:
(INT_2_4)T1PINT:
0x0D56(INT_3_1)T2PINT:
0x0D60
EVB的通用定时器3、4的周期中断:
(INT_4_4)T3PINT:
0x0D76(INT_5_1)T4PINT:
0x0D80
9、中断向量表的赋值
写代码时严格执行这三句话:
(在所有函数外)typedefinterruptvoid(*PINT)(void);
(在所有函数外)interruptvoidINT_m_n(void);
(在main函数内)(*(PINT*)PIE_VECT_m_n)=&INT_m_n;
其它赋值方式(写代码时不用):
(在所有函数外)interruptvoidINT_m_n(void);
(在main函数内)InitPIE;
(在main函数内)PieVectTable.TINT0=&INT_m_n;
10、【强记】CPU定时器0中断程序,并使能PIE级与CPU级中断
voidInitSysCtrl(void)
{EALLOW;
WDCR=0x0068;
PLLCR=0xA;//锁相环设为10/2=5倍频(使系统时钟30MHz*5=150MHz)
for(i=0;i<((131072/2)/12);i++){;}
HISPCP=1;
LOSPCP=2;
EDIS;
}
voidInitCputimer0(void)
{EALLOW;
TIMER0TPR=149;//产生150MHz/(149+1)=1MHz的计时器时钟
TIMER0TPRH=0;//CPU定时器0预定标计数器的高位部分(置0)
TIMER0PRD=(long)999;//设置CPU定时器0中断周期,即1MHz/1000=1kHz
TIMER0TCR=0xF000;
EDIS;
}
voidInitGpioF(void)
{……}
typedefinterruptvoid(*PINT)(void);
interruptvoidINT_1_7(void);//CPU定时器0
voidmain(void)
{InitSysCtrl();
InitCputimer0();//CPU定时器0初始化,它确定了中断周期为1ms(1kHz)
InitGpioF();//GPIOF初始化
EALLOW;
PIEIFR1=0x0000;
PIEIER1=0x0040;
PIECTRL=0x1;//使能PIE
PIEACK=0x1;
(*(PINT*)0x0D4C)=&INT_1_7;
asm("andIFR,#00H");
asm("orIER,#01H");
asm("EINT");
LPMCR0=0x0;//设置低功耗模式为idle模式
EDIS;
for(;;){asm("IDLE");};
}
interruptvoidINT_1_7(void)
{……
PIEACK=0x1;
TIMER0TCR=0xF000;
}
11、【强记】T1定时器的中断程序(以T1PINT中断为例),并使能PIE级与CPU级中断
voidInitSysCtrl(void)
{EALLOW;
WDCR=0x0068;
PLLCR=0xA;//锁相环设为10/2=5倍频(使系统时钟30MHz*5=150MHz)
for(i=0;i<((131072/2)/12);i++){;}
HISPCP=1;
LOSPCP=2;
EDIS;
}
voidInitEV(void)//初始化EV
{EALLOW;
T1CON=0x1748;//T1连续增,时钟HSPCLK被128分频,使能T1,使用内部时钟源,禁止比较操作
/*
如此,TICON=0001011101001000,具体为:
TMODE1-TMODE0=10,使T1为连续增计数模式;
TPS2-TPS0=111,使外设高速时钟HSPCLK被128分频(2^7=128),使T1计时时钟频率为HSPCLK/128;
TENABLE=1,使能本定时器T1;
TCLKS1-TCLKS0=00,T1时钟源设为内部时钟,即HSPCLK(另外,上已设定它要被128分频才用作T1时钟);
TECMPR=0,禁止本定时器的比较操作;
*/
T1PR=586;//T1的周期寄存器赋值586
EVAIMRA=0x0080;//使能T1PINT
/*
如此,EVAIMRA=0000000010000000,从而使能T1PINT
*/
EVAIFRA=0xFFFF;//EVA中各中断标志写1清0
EDIS;
}
voidInitIO(void)
{……}
typedefinterruptvoid(*PINT)(void);
interruptvoideva_T1PINT_isr(void);//声明了通用定时器1的周期匹配中断
voidmain(void)
{InitSysCtrl();
InitIO();//初始化引脚
InitEV();//初始化EV
EALLOW;
PIEIFR1=0x0000;
PIEIER1=0x0040;
PIECTRL=0x1;//使能PIE
PIEACK=0x2;
(*(PINT*)0x0D56)=&INT_2_4;
asm("andIFR,#00H");
asm("orIER,#02H");//使能CPU级第2组中断通道
asm("EINT");
LPMCR0=0;//低功耗模式为idle
EDIS;
for(;;){asm("IDLE");}
}
interruptvoideva_T1PINT_isr(void)//T1周期中断服务函数
{……
EVAIFRA=0xFFFF;//EVA中相应中断标志清零
PIEACK=0x02;//PIE第2组中断通道的应答标志写1清0
}
关于TnPINT替换的说明:
T1PINTT1CONT1PREVAIMRA=0x0080EVAIFRA=0xFFFF0x0D56INT_2_402HPIEIFR2=0x0000PIEIER2=0x0008PIEACK=0x02
T2PINTT2CONT2PREVAIMRB=0x0001EVAIFRB=0xFFFF0x0D60INT_3_104HPIEIFR3=0x0000PIEIER3=0x0001PIEACK=0x04
T3PINTT3CONT3PREVBIMRA=0x0080EVBIFRA=0xFFFF0x0D76INT_4_408HPIEIFR4=0x0000PIEIER4=0x0008PIEACK=0x08
T4PINTT4CONT4PREVBIMRB=0x0001EVBIFRB=0xFFFF0x0D80INT_5_110HPIEIFR5=0x0000PIEIER5=0x0001PIEACK=0x10
第五章SPI(串行外设接口)
1、列举SPI模块的输入输出信号(有哪几根线)
SPI有四个外部引脚:
SPISOMI主输入从输出引脚;
SPISIMO主输出从输入引脚;
SPICLK串行时钟引脚,由主设备输出至从设备;
,发送使能引脚。
2、解释SPI工作原理(包括波形)
SPI接口有两种操作模式:
主控制器模式和从控制器模式,其中主控制器发送串行时钟给从控制器,实现两个控制器同时发送和接收数据。
SPI接口有三种数据传送模式:
全双工模式:
主从均发送数据;半双工模式:
主发送,从接收或主接收,从发送。
主控制器模式:
左对齐地写数据到寄存器SPIDAT或SPITXBUF,则自动地启动了SPISIMO引脚从数据高位开始发送(咦?
不用管SPICLK吗?
)。
接收到的数据则右对齐地储存在SPIRXBUF中。
当SPIDAT数据送出后,SPITXBUF数据会自动装载到SPIDAT发送。
所有数据发送完毕,SPICLK串行时钟会自动停止,并且在中断使能的前提下产生中断请求。
从控制器模式:
数据从SPISOMI移出,从SPISIMO移入,串行时钟由主控制器提供。
当设备收到SPICLK串行时钟有效边,则将已写入SPIDAT或SPITXBUF的数据从高位依次发送,而收到的数据存储在SPIRXBUF中。
如果在SPI发送数据期间突然清零数据发送使能TALK位,SPI也要完成当前数据发送才停止。
另外,当主控制器接多个从控制器时,任意时刻最多选通一个从控制器向主控制器发送数据。
波形:
SPI模块由两个时钟控制位配置SPICLK时钟模式。
其中时钟极性选择位设定时钟上升沿或下降沿有效,而时钟相位选择位设定时钟是否延时半周期。
总是先发送,后接收。
上升沿,无延迟:
上升沿发送,下降沿接收;
上升沿,有延迟:
上升沿前半周期发送,上升沿接收;
下降沿,无延迟:
下降沿发送,上升沿接收;
下降沿,有延迟:
下降沿前半周期发送,下降沿接收。
3、【计算】波特率
当波特率寄存器SPIBRR=0~2,SPICLK=LSOCLK/4;
当波特率寄存器SPIBRR=3~127,SPICLK=LSPCLK/(SPIBRR+1),所以SPIBRR=0~3都是一样的。
4、涉及寄存器的功能表
配置控制寄存器SPICCR:
复位控制、时钟极性、字符长度控制(0000:
1位~1111:
16位);
操作控制寄存器SPICTL:
使能超时中断(接收溢出中断)、时钟相位、主从模式、使能发送、使能SPI中断(接收/发送中断);
状态寄存器SPISTS:
接收溢出标志、SPI中断标志、发送缓冲器满标志;
波特率设置寄存器:
SPIBRR;
发送缓冲寄存器SPITXBUF:
写数据则立即触发发送(咦?
不用管SPICLK吗?
),左对齐。
接收缓存寄存器SPIRXBUF:
SPI接收到完整字符后数据装入本寄存器,右对齐。
串行数据寄存器SPIDAT:
若使能发送,则本寄存器数据将被发送到串行输出引脚;若处于主控制器模式,则按照设定的时钟模式开始发送数据。
左对齐。
第七章EV事件管理器
1、EVA/B时钟源:
1)高速外设时钟;
2)外部输入时钟(不超过内部时钟频率的1/4);
3)也可以由正交编码脉冲电路提供。
输出:
1、控制引脚电平;
2、输出中断标志;
3、启动A/D转换器。
2、通用定时器
每个EV包括两个通用定时器。
CPU定时器与EV通用定时器的区别:
1)CPU定时器为32位计数器,EV通用定时器为16位计数器;
2)CPU定时器只有一种工作模式,即计数寄存器根据CPU时钟SYSCLKOUT递减计数,当计数器为0时,定时器中断信号产生一个中断脉冲。
EV通用定时器有4种计数方式,分别为:
停止/保持模式,连续增减模式,连续增模式,定向增减模式。
通用定时器的作用:
1)用作通用定时器,在控制系统中产生采样周期;
2)为捕获单元和正交编码脉冲计数操作提供基准时钟;
3)为比较单元和相应的PWM产生电路提供基准时钟。
通用定时器的比较输出极性(由GPTCONA/B的TnPIN位控制):
1)强制低00
2)低有效01
3)高有效10
4)强制高11
通用定时器的中断:
中断
产生条件
下溢
计数器值为0x0000
上溢
计数器值为0Xffff
比较
计数寄存器的值与比较寄存器的值匹配
周期
计数寄存器的值与周期寄存器的值匹配
通用定时器的计数模式:
由定时器控制寄存器TxCON中的模式选择位(TMODE1:
TMODE0)决定,并由使能位TENABLE使能或禁止。
计数模式
TMODE1:
TMODE0
停止/保持模式
00
连续增减模式
01
连续增模式
10
定向增减模式
11
连续增模式的计数周期:
(TxPR+1)个定标后的时钟输入周期。
连续增/减模式的计数周期:
(2*TxPR)个定标后的时钟输入周期。
3、比较单元与PWM电路
PWM:
PWM信号是指周期和幅值固定,宽度可变的脉冲序列。
每个EV可以同时产生8路PWM波形输出:
2个通用定时器各独立1路;3个全比较器各一对(2路互补)。
用EV产生非对称PWM波形:
通用定时器1设置为连续增计数模式,其周期寄存器装入PWM载波周期值;
占空比为TxCMPR/(TxPR+1)。
用EV产生对称PWM波形:
通用定时器1设置为连续增/减计数模式,其周期寄存器装入PWM载波周期值;
占空比为TxCMPR/TxPR。
4、捕获单元:
两个EV共有6个捕获单元,每个捕获单元有一个对应的捕获输入引脚,通过捕获单元能够捕获这些输入引脚上的电平跳变并记录跳变时刻。
每个捕获单元有1个2级深度的16位FIFO堆栈。
跳变检测方式:
1)上升沿
2)下降沿
3)上升沿和下降沿
5、正交编码
作用:
用于角度位置判断、可以判断正、反。
工作于连续增减方式;
方向由QEP控制。
捕获单元和QEP电路的引脚是复用的。
6、EV中断编程
实例:
利用事件管理器GP定时器1在GPIOF8-13引脚上依次产生信号1,周期为0.2s,采用连续增计数。
要求系统时钟150MHz,高速外设时钟25MHz,128分频。
typedefinterruptvoid(*PINT)(void);
interruptvoidINT_2_4(void);
intk;
voidmain(void)
{
asm("EALLOW");
asm("DINT");
PLLCR=0xA;
WDCR=0x68;
GPFMUX=0xc0ff;
GPFDIR=0x3f00;
HISPCP=0x0003;//高速时钟预定标(150MHz/3*2)
PIEIFR2=0x0000;
PIEIER2=0x0008;//INT_2_4使能
PIECTRL=0x1;
PIEACK=0xff;
GPTCONA=0x0000;//初始化EVA
T1CON=0x1740;//连续增计数,128分频,打开定时器,128分频后定时器周期为5.12us。
连续增/减计数也要求掌握,我就不写了
T1CNT=0x0000;
T1PR=0x9895;//定时周期5.12us*(T1PR+1)=0.2s
(*(PINT*)0x0D56)=&INT_2_4;
EVAIERA=0x0080;//使能定时器1的周期中断
EVAIFRA=0x0080;//写1清除定时器1的周期中断标志
asm("andIFR,#00H");
asm("orIER,#02H");
asm("EINT");
asm("EDIS");
for(;;);
}
interruptvoidINT_2_4(void)
{
k+=1;
switch(k){
case1:
GPFDAT=0x01ff;break;
case2:
GPFDAT=0x02ff;break;
case3:
GPFDAT=0x04ff;break;
case4:
GPFDAT=0x08ff;break;
case5:
GPFDAT=0x10ff;break;
case6:
GPFDAT=0x20ff;k=0;break;
}
EVAIMRA=0x0080;
EVAIFRA=0x0080;
PIEACK=0xff;
}
第八章A/D(模/数)转换模块
1、解释ADC工作原理(基准电压、输出位数、A/D换算、启动过程、结果保存)
基准电压:
可以选择使用内部基准电路,也可以使用外部基准源(2V,1V分别引到引脚ADCEFP、ADCEFM)。
输出位数:
12位,ADCLO~3V,一般设ADCLO=0V。
A/D换算:
数字值(已右移4位)=4095*(模拟电压值-ADCLO)/3。
从结果寄存器读取的数值要右移4位(高位补0)才是数字值,同理,由模拟电压值换算出的数字指要左移4位(低位补0)才是结果寄存器值。
启动过程:
(1)设定采样窗口大小、排序器工作方式(双排序器/级联排序器、顺序采样/同步采样、连续排序模式/启动-停止模式)、每次转换通道数目、转换通道;
(2)转换模式、触发方式、中断使能、排序器复位;(3)时钟分频、电源控制。
结果保存:
结果依次保存在结果寄存器ADCRESULT0~15,所储存的结果均需右移4位才是数字值。
2、输入的模拟电压超过标准电压时,会发生什么情况?
输出11..1,即3V.当输入电压过高时,则模块烧坏。