华北电力大学科技学院ARM课内实验二.docx

上传人:b****8 文档编号:30682299 上传时间:2023-08-19 格式:DOCX 页数:16 大小:268.10KB
下载 相关 举报
华北电力大学科技学院ARM课内实验二.docx_第1页
第1页 / 共16页
华北电力大学科技学院ARM课内实验二.docx_第2页
第2页 / 共16页
华北电力大学科技学院ARM课内实验二.docx_第3页
第3页 / 共16页
华北电力大学科技学院ARM课内实验二.docx_第4页
第4页 / 共16页
华北电力大学科技学院ARM课内实验二.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

华北电力大学科技学院ARM课内实验二.docx

《华北电力大学科技学院ARM课内实验二.docx》由会员分享,可在线阅读,更多相关《华北电力大学科技学院ARM课内实验二.docx(16页珍藏版)》请在冰豆网上搜索。

华北电力大学科技学院ARM课内实验二.docx

华北电力大学科技学院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);

}

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 设计艺术

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1