华北电力大学科技学院ARM课内实验二.docx
《华北电力大学科技学院ARM课内实验二.docx》由会员分享,可在线阅读,更多相关《华北电力大学科技学院ARM课内实验二.docx(16页珍藏版)》请在冰豆网上搜索。
华北电力大学科技学院ARM课内实验二
科技学院
课程设计报告
(2015--2016年度第二学期)
名称:
ARM试验定时器
题目:
院系:
科技学院
班级:
13k2
学号:
31
学生姓名:
指导教师:
张老师
设计周数:
成绩:
日期:
2016年5月10日
实验二:
定时器/计数器
(1)计数器
一:
实验现象
1.本次实验是使用LPC178/177x系列Cortex-M3中的定时/计数器的计数器的计数功能,让P0.23管脚输入5个下降沿,使用杜邦线连接Key1键和P0.23管脚,当按下Key1五次(即给了5个下降沿)后,LED3闪烁5次。
但是由于按键抖动的原因,观察到的现象可能有时不准确。
2.实验现象图片展示
二:
实验代码分析
#include"../LPC177x_8x/LPC177x_8x.h"
#include"../LPC177x_8x/type.h"
#defineLED(1UL<<31)
#defineLED_INIT()LPC_GPIO3->DIR|=LED,LED_OFF()//LED初始化
#defineLED_OFF()LPC_GPIO3->SET|=LED//LED灭
#defineLED_ON()LPC_GPIO3->CLR|=LED//LED亮
voidmyDelay(uint32_tulTime)
{
uint32_ti;
while(ulTime--){
for(i=0;i<19192;i++);
}
}
voidCounterInit(void)//定时器3作计算器初始化函数
{
LPC_IOCON->P0_23&=~0x07;//1111111111111000选择P0[23]管脚清零最低三位
LPC_IOCON->P0_23|=0x13;//0000000000010011书P160,选择T3_CPA0,Timer3_32CAP0
LPC_SC->PCONP|=1<<23;//打开定时器3的功率控制
LPC_TIM3->CTCR=(2<<0)|计数器模式,下降沿捕获
(0<<2);//0010,选择CAP3.0
LPC_TIM3->TC=0;//初始化计数器值为0
LPC_TIM3->TCR=0x01;//启动计数器
}
intmain(void)
{
uint32_ti;
SystemInit();
CounterInit();
LED_INIT();
while
(1){
if(LPC_TIM3->TC==5){
for(i=0;i<10;i++){
LED_ON();
myDelay(400);
LED_OFF();
myDelay(400);
}
LPC_TIM3->TC=0x00;
}
}
}
三:
通过修改某些语句从而使得LED的闪烁发生变化
1.通过修改voidCounterInit(void)子函数中的LPC_TIM3->CTCR=(1<<0)|
(0<<2);/*0001*/
这个语句,可以使得计数器模式中的下降沿捕获改成上升沿捕获。
2.通过修改主函数中的if(LPC_TIM3->TC==5){
for(i=0;i<10;i++)
这个语句中的TC的值可以改变计数上升沿或下降沿的个数,而改变i的值可以改变LED3闪烁的次数。
(2)捕获功能
一:
实验现象
1.本次实验是使用LPC178/177x系列Cortex-M3中的定时/计数器的计数器的捕获功能,可通过查询方式来实现定时器的捕获功能。
也可通过查看变量方式,观察m的值的变化。
使用杜邦线让P0.23管脚连接Key1,P3.31管脚连接LED3。
2.实验现象图片展示
说明:
m的值是变化的,根据按键的时间的不同而变化,下面就展示在实验中的一个实例,再此说明以免误会m值是不变的。
二:
实验代码分析
#include"../LPC177x_8x/LPC177x_8x.h"
#include"../LPC177x_8x/type.h"
#defineLED(1UL<<31)
#defineLED_INIT()LPC_GPIO3->DIR|=LED,LED_OFF()//LED初始化
#defineLED_OFF()LPC_GPIO3->SET|=LED//LED灭
#defineLED_ON()LPC_GPIO3->CLR|=LED//LED亮
voidmyDelay(uint32_tulTime)
{
uint32_ti;
while(ulTime--){
for(i=0;i<19192;i++);
}
}
voidtimer3Init(void)//定时器3初始化函数
{
LPC_IOCON->P0_23&=~0x07;
LPC_IOCON->P0_23|=0x03;//Timer3_32CAP0
LPC_SC->PCONP|=1<<23;//打开定时器3的功率控制
LPC_TIM3->PR=99;//预分频99经过100个PCLK周期TC+1
LPC_TIM3->CCR=2<<0;//0010,设置CAP3.0下降沿捕获
LPC_TIM3->TC=0;
LPC_TIM3->TCR=0x01;//启动定时器
}
intmain(void)
{
volatileuint32_tm=0;
SystemInit();//系统初始化
timer3Init();
LED_INIT();
while
(1){
m=(LPC_TIM3->CR0%1000);//读取捕获到的值,用作延时参数
LED_ON();
myDelay(m);//m的值合适才能体验到频率变化
LED_OFF();
myDelay(m);
}
}
(3)中断捕获
一:
实验现象
1.本次实验是使用LPC178/177x系列Cortex-M3中的定时/计数器的计数器的捕获功能,与上次的实验有所不同的是,这次实验虽然也是通过查询方式实现定时器的捕获功能,但是是利用定时/计数器中的中断功能,使得来一个中断(即捕获了一个数)LED闪烁一下。
也是使用杜邦线让P0.23管脚连接Key1,P3.31管脚连接LED3。
2.实验现象图片展示
由于和第二个实验是基本类似的功能,只是使用了中断来捕获,但是实验现象也是一样的,所以图片就和第二个是一样的。
二:
实验代码分析
#include"../LPC177x_8x/LPC177x_8x.h"
#include"../LPC177x_8x/type.h"
#defineLED(1UL<<31)
#defineLED_INIT()LPC_GPIO3->DIR|=LED,LED_OFF()//LED初始化
#defineLED_OFF()LPC_GPIO3->SET|=LED//LED灭
#defineLED_ON()LPC_GPIO3->CLR|=LED//LED亮
volatileuint32_tGuiCapFlag=0;//定时器捕获中断标志
voidmyDelay(uint32_tulTime)
{
uint32_ti;
while(ulTime--){
for(i=0;i<19192;i++);
}
}
voidTIMER3_IRQHandler(void)//TIMER3中断处理函数
{
LPC_TIM3->IR=1<<4;//清除CAP3.0中断标志
GuiCapFlag=1;
}
voidtimer3Init(void)//定时器3初始化函数
{
LPC_IOCON->P0_23&=~0x07;
LPC_IOCON->P0_23|=0x03;//Timer3_32CAP0
LPC_SC->PCONP|=1<<23;//打开定时器3的功率控制
//LPC_TIM3->CCR=6<<0;//0110,设置下降沿捕获
LPC_TIM3->CCR=5<<0;//0101设置上升沿捕获
NVIC_EnableIRQ(TIMER3_IRQn);//设置外部中断并使能
NVIC_SetPriority(TIMER3_IRQn,3);
}
intmain(void)
{
SystemInit();//系统初始化
timer3Init();//定时器3初始化
LED_INIT();
while
(1){
if(GuiCapFlag){
GuiCapFlag=0;//定时器捕获中断标志置0
LED_ON();
myDelay(500);
LED_OFF();
myDelay(500);
}
}
}
(4)匹配功能
一:
实验现象
1.本次实验是使用LPC178/177x系列Cortex-M3中的定时/计数器的定时器1匹配输出功能,让P3.30管脚输出一个周期为2ms,占空比为50%的方波。
2.实验现象图片展示
二:
实验代码分析
#include"../LPC177x_8x/LPC177x_8x.h"
#include"../LPC177x_8x/type.h"
#defineLED(1UL<<31)
#defineLED_INIT()LPC_GPIO3->DIR|=LED,LED_OFF()//LED初始化
#defineLED_OFF()LPC_GPIO3->SET|=LED//LED灭
#defineLED_ON()LPC_GPIO3->CLR|=LED//LED亮
volatileuint32_tGuiCapFlag=0;//定时器捕获中断标志
voidmyDelay(uint32_tulTime)
{
uint32_ti;
while(ulTime--){
for(i=0;i<19192;i++);
}
}
voidTimer1Init(void)//定时器匹配输出初始化
{
LPC_IOCON->P3_30&=~0x07;
LPC_IOCON->P3_30|=0x03;//Timer1_16MAT1
LPC_SC->PCONP|=1<<22;//打开定时器1的功率控制位
LPC_TIM1->PR=0;//不分频
LPC_TIM1->MCR=0x02<<3;//00000010->00010000设置T1MR1匹配后将T1TC复位
LPC_TIM1->EMR=0x03<<6;//00000011->11000000T1MR1匹配后MAT1.1输出翻转
LPC_TIM1->MR1=PeripheralClock/1000;//除完后=0.001s=1ms翻转一次,周期=2ms,频率控制,1毫秒后翻转输出占空比50%的方波
LPC_TIM1->TCR=0x01;//启动并复位T1TC
}
intmain(void)
{
SystemInit();//初始化目标板,切勿删除
Timer1Init();
while
(1);
}
三:
通过修改某些语句从而使得输出的方波的周期和占空比发生变化
通过改变voidTimer1Init(void)子函数中的
LPC_TIM1->EMR=0x03<<6;
LPC_TIM1->MR1=PeripheralClock/1000;语句,可使得输出的方波的周期和占空比发生变化。
若是只改变MR1的值,则是改变输出方波的周期,而占空比依旧不改变。
(5)中断功能
一:
实验现象
本次实验是使用LPC178/177x系列Cortex-M3中的定时/计数器的中断功能,每0.5秒产生一个中断,短接LED3和P3.31管脚,使得LED3每0.5s闪烁一次。
2.实验现象图片展示
由于本次实验和第二、三个实验是基本类似的功能,只是使用了中断来让LED闪烁,实验现象也只是0.5s闪烁一次,所以拍的图片就和第二个是一样的。
二:
实验代码分析
#include"../LPC177x_8x/LPC177x_8x.h"
#include"../LPC177x_8x/type.h"
#defineLED(1UL<<31)
#defineLED_INIT()LPC_GPIO3->DIR|=LED,LED_OFF()//LED初始化
#defineLED_OFF()LPC_GPIO3->SET|=LED//LED灭
#defineLED_ON()LPC_GPIO3->CLR|=LED//LED亮
voidmyDelay(uint32_tulTime)
{
uint32_ti;
while(ulTime--){
for(i=0;i<19192;i++);
}
}
voidTIMER0_IRQHandler(void)//TIMER0中断处理函数
{
LPC_TIM0->IR=0x01;//清除中断标志
if(LPC_GPIO3->SET&(1UL<<31)){
LED_ON();//原来的SET若是亮的(SET=0)则执行else会变灭;若是灭的(SET=1)则会执行亮
}else{
LED_OFF();//关闭LED/
}
}
voidtimer0Init(void)//定时器0初始化程序
{
LPC_TIM0->TCR=0x02;//00000010
LPC_TIM0->IR=1;//清除中断标志位
LPC_TIM0->CTCR=0;//定时器模式
LPC_TIM0->TC=0;
LPC_TIM0->PR=0;//预分频为1
LPC_TIM0->MR0=PeripheralClock;/除完后=1/2=0.5s,0.5S中断1次
LPC_TIM0->MCR=0x03;//00000011,匹配后产生中断
NVIC_EnableIRQ(TIMER0_IRQn);//设置中断并使能
NVIC_SetPriority(TIMER0_IRQn,3);
LPC_TIM0->TCR=0x01;//启动定时器
}
intmain(void)
{
SystemInit();//初始化目标板,切勿删除
timer0Init();//定时器0初始化
LED_INIT();
while
(1){
;
}
}
三:
通过修改某些语句从而使得定时的时间发生变化
通过改变voidtimer0Init(void)子函数中的
LPC_TIM0->MR0=PeripheralClock/2;语句,可使得定时时间发生变化,例如改成LPC_TIM0->MR0=PeripheralClock;则定时时间变为LED每1s闪烁一次。
(6)定时中断
一:
实验现象
1.本次实验是使用LPC178/177x系列Cortex-M3中的定时/计数器的定时产生中断功能,定时0.5秒产生一个中断,短接LED3和P3.31管脚,使得LED3每0.5s闪烁一次。
2.实验现象图片展示
由于本次实验和第二、三个实验是基本类似的功能,只是使用了定时产生中断来让LED闪烁,实验现象也只是0.5s闪烁一次,所以拍的图片就和第二个是一样的。
二:
实验代码分析
#include"../LPC177x_8x/LPC177x_8x.h"
#include"../LPC177x_8x/type.h"
#defineLED(1UL<<31)
#defineLED_INIT()LPC_GPIO3->DIR|=LED,LED_OFF()//LED初始化
#defineLED_OFF()LPC_GPIO3->SET|=LED//LED灭
#defineLED_ON()LPC_GPIO3->CLR|=LED//LED亮
voidmyDelay(uint32_tulTime)
{
uint32_ti;
while(ulTime--){
for(i=0;i<19192;i++);
}
}
voidTimerInit(void)//TimerInit定时器初始化
{
LPC_TIM0->TC=0;//定时器设置为0
LPC_TIM0->PR=0;//时钟不分频
LPC_TIM0->MCR=0x03;//设置T0MR0匹配后复位T0TC,并产生中断标志
LPC_TIM0->MR0=PeripheralClock/2;//0.5秒钟定时
LPC_TIM0->TCR=0x01;//启动定时器
}
intmain(void)
{
SystemInit();//系统初始化,切勿删除
LED_INIT();
TimerInit();
while
(1){
while((LPC_TIM0->IR&0x01)==0);//等待定时时间到
LPC_TIM0->IR=0x01;//清除中断标志
LED_ON();
myDelay(100);
LED_OFF();
myDelay(100);
}
}