3731|2

1071

帖子

7

TA的资源

纯净的硅(中级)

楼主
 

ADuc7026学习-Time [复制链接]

本帖最后由 dj狂人 于 2015-1-13 18:04 编辑

                                                                                ADuc7026学习-Time2


     今天拿定时器开撸,开撸之前同样先预热下。
1、void (* tyVctHndlr) (void);
上面定义了一个名为“tyVctHndlr”的函数指针变量,再看下面这个。
2、typedef void (* tyVctHndlr) (void);
首先这里定义了一个名为“tyVctHndlr”的函数指针变量,然后经“typedef”之后“tyVctHndlr”已经是一个类型符号了,如同int 是个整型符一样。 他们不同之处在于,第一条语句定义的“tyVctHndlr”只是一个函数指针变量,我们可以把一个函数的地址赋给它,但却不能用他来定义新的和他同类型的变量。如void fun (void);void (* tyVctHndlr) (void); tyVctHndlr = fun;//正确的用法tyVctHndlr tun;  //错误的用法
而第二条语句中定义的“tyVctHndlr”经过 typedef 之后他变成了一个类型符,所以我们可以用他来定义函数指针变量。用法如下
tyVctHndlr  IRQ = (tyVctHndlr)0x0;//定义一个函数指针变量并赋初值
那么下面我们再来看ADI公司在keil中提供的的一些关于中断函数的定义就很容易理解是什么意思了
typedef void (* tyVctHndlr)(void);//定义一个名为“tyVctHndlr”的类型符
tyVctHndlr IRQ     =(tyVctHndlr)0x0;/*定义一个名为“IRQ”的函数指针并赋初值,以下同理*/
tyVctHndlr SWI     = (tyVctHndlr)0x0;
tyVctHndlr FIQ     = (tyVctHndlr)0x0;
tyVctHndlr UNDEF   = (tyVctHndlr)0x0;
tyVctHndlr PABORT  = (tyVctHndlr)0x0;
tyVctHndlr DABORT  = (tyVctHndlr)0x0;
void   IRQ_Handler   (void) __irq;/*声明一个名为“IRQ_Handler”的函数,__irq是一个关键字,用来声明IRQ中断服务程序,如果用__irq来声明一个函数,那么该函数表示一个IRQ中断服务程序,编译器会自动在该函数内部增加中断现场保护的代码,下同*/
void   SWI_Handler   (void) __irq;
void   FIQ_Handler   (void) __irq;
void   Undef_Handler (void) __irq;
void   PAbt_Handler  (void) __irq;
void   DAbt_Handler  (void) __irq;
/*下面是编写IRQ_Handler函数*/
void   IRQ_Handler(void)__irq
{
    if ( *IRQ !=0x00)//判断IRQ函数指针是否使用
    {
       IRQ();//若使用,通过IRQ中保存的函数地址调用该函数
    }
}
…………
ADuc7026在使能某个中断(比如定时器中断)在触发中断进入中断服务程序,然后通过一个函数指针变量调用一个函数,这个函数由我们编写,比如我们编写好定时器的中断服务函数后,把这个函数的地址赋值给IRQ就可以了。当然,我们可以直接在void   IRQ_Handler(void) __irq 中编写中断服务程序这里我只是想把我所理解的东西说一下。好下面进入今天的主题

点赞 关注
 
 

回复
举报

1071

帖子

7

TA的资源

纯净的硅(中级)

沙发
 
本帖最后由 dj狂人 于 2015-1-13 18:03 编辑


        首先,要使用定时器,使能定时器中断肯定是需要的,那么我们就就先来看看该怎么样使能中断。
        ADuC7026共有23个中断源,它们都由中断控制器控制。大多数中断都是由片内外围设备产生,例如ADC和UART。四个额外的中断源由外部中断请求引脚
IRQ0、IRQ1、IRQ2和IRQ3产生。跟中断有关的寄存器有好几个,这里我就简单介绍下我们下面要用到的IRQEN寄存器。他是一个32位的寄存器,用来使能或屏蔽中断源。他的每个位对应的中断如下
   0 所有中断“或逻辑” ( 只用于 FIQ) 。
   1 SWI
   2 定时器 0 。
   3 定时器 1 。
   4 唤醒定时器 ( 定时器 2) 。
   5 看门狗定时器 ( 定时器 3) 。
   6 闪存控制。
   7 ADC 通道。
   8 锁相环锁定。
   9 I2C0 从机。
   10 I2C0 主机。
   11 I2C1 主机。
   12 SPI 从机。
   13 SPI 主机。
   14 UART
   15 外部 IRQ0 。
   16 比较器。
   17 PSM
   18 外部 IRQ1 。
   19 PLA IRQ0
   20 PLA IRQ1
   21 外部 IRQ2 。
   22 外部 IRQ3 。
   23 PWM 触发 ( 只用于 IRQ)/PWM 同步 ( 只用于 FIQ) 。
所以,我们想要使能定时器2的话,需要这样
IRQEN = 0x10;
   那么接下来我们来看看如何进行配置定时器2。使用定时器2我们需要用到T2LD、
T2CON、T2CLRI寄存器,当然还有一个T2VAL寄存器,这是个只读寄存器,我们可以从他里面读出计数器当前的状态。
T2LD是一个32位装载寄存器,我们由计时时间算得计数值就装载给他。
T2CON 定时器2的配置寄存器
31~11  保留。
10~9  时钟源。
        00 外部晶振。
        01 外部晶振。
        10 内部振荡器。
        11 内核时钟 (41MHz/2 CD ) 。
8 递增计数。置 1 ,定时器 2 递增计数。清 0 ,定时器 2 递减计数(默认)。7定时器 2 使能位。置 1 ,使能定时器 2 。 清 0 ,禁用定时器 2 (默认)。
6 定时器 2 工作模式。置 1 ,选择周期模式。清0 ,选择自由模式。默认模式。
5~4 数据格式。
       00 二进制。
       01 保留。
       10 时 : 分 : 秒 : 百分之一秒 (23 小时至 0 小时 ) 。
       11 时 : 分 : 秒 : 百分之一秒 (255 小时至 0 小时 ) 。
3~0 预分频选择位。
       0000  时钟源 /1 (默认)。
       0100  时钟源 /16 。
       1000  时钟源 /256 (预计用于数据格式 2 和 3 )。
       1111  时钟源 /32,768 。
T2CLRI是一个8位寄存器。 向其中写入任意一个值就可以清除定时器2的中断请求。中断服务程序执行完之后需要向其写入任意值方能退出中断

 
 
 

回复

1071

帖子

7

TA的资源

纯净的硅(中级)

板凳
 
本帖最后由 dj狂人 于 2015-1-13 18:06 编辑

好,下面我们进行程序编写
#include
unsigned char i=0;
void IRQ_Handler(void) __irq;
int main(void)
{
    PLLKEY1=0xAA;
    PLLCON=0x21;   //PLL配置,选择内部振荡器
    PLLKEY2=0x55;
    POWKEY1=0x01;
    POWCON=0x00;   //不分频,CPU时钟配置为41.78MHz
    POWKEY2=0xF4;
   
    T2LD  = 0x0280DE80;//装入计数初值
    T2CON = 0x000006C0;/*定时器时钟源选择内部振荡器,选择递减工作模式,使能定时器2,选择周期模式,二进制数据格式,不分频*/
/*我们的定时器有两种工作模式,自由模式和周期模式。当工作在自由模式时,计数器将从最大值递减计数一直到零,并且在达到最小值后重新递增计数。(它也可以从最小值开始递增计数直到满量程并且在达到最大值后重新开始递减计
数。)当工作在周期模式时,定时器以装载寄存器TxLD中的值为起始值开始递减或递增计数,一直到零或满量程后再以TxLD寄存器中的值为起始值重新开始计数。*/
    IRQEN = 0x10;        //只能定时器2中断
    GP2DAT = 0xFFFF0000; //把P2.5、P2.6配置为输出并置为高电平
    while(1);            //死循环,定时器溢出时进入中断
}
void IRQ_Handler(void) __irq
{
    i++;
    if(i%2)//这里我实现的功能是两个LED灯以1S的时间间隔闪烁
       GP2CLR = 0x00600000;
    else
       GP2SET = 0x00600000;
    if(i>220)
       i = 0;
    T2CLRI = 1; //记得一定要向 T2CLRI写入一个数据,不然不会退出中断
}


这是定时器2的使用,ADuc7026共有四个定时器,使用方法差不多的。

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表