新闻中心

EEPW首页>嵌入式系统>设计应用> ARM9基础教程lessen2—定时器

ARM9基础教程lessen2—定时器

作者: 时间:2016-11-24 来源:网络 收藏


♥ 定时器计数观察计数器(TCNTOn)
定时器计数观察计数器保存定时器计数器值(只读)。

► S3C2440定时器操作
定时器启动后,TCNTn开始减一计数,当TCNTn 等于TCMPn时,TOUTn 反转,TCNTn继续减数。当TCNTn= 0 时,TOUTn 再次反转,并触发中断(中断已经使能)。若TCON 设为自动加载,TNCTn/TCMPNn 的值被重装。

图中步骤如下:
1、使能自动重载功能。设置TCNTBn为160,TCMPBn为110。设置手动更新位且配置反相器位(开/关)。手动更行位将TCNTBn和TCMPBn的值分别给TCNTn和TCMPn寄存器,然后设置TCNTBn=80和TCMPBn=40,决定下一个重载值;
2、设置开始位,手动更新位为0,手动更新关闭且自动重载开启,定时器开始倒数计数;
3、当TCNTn的值和TCMPn的值相同,TOUTn的逻辑电平从低变高;
4、当TCNTn为0,中断请求生成且TCNTBn的值装载到一个临时寄存器中。在下一个定时器周期,TCNTn会用该临时寄存器的值重载;
5、在中断服务程序中,TCNTBn和TCMPBn为下一个周期分别设置为80和60;
6、当TCNTn的值和TCMPn的值相同,TOUTn的逻辑电平从低变高;
7、当TCNTn为0,TCNTn用TCNTBn的值自动重载,并触发中断请求;
8、在中断服务程序中,自动重载和自动请求被设无效以停止定时器;
10、就算TCNTn为0,因为自动重载被设为无效,TCNTn不再重载且定时器停止;
11、没有其他的自动请求生成。

► S3C2440定时器初始化
以定时器0为例,启动定时器操作步骤大致如下:
1、设置TCMPB0和TCNTB0寄存器;
2、设置TCON寄存器,计数值进行装载;
3、启动定时器;
4、计数器重新被装载。
  1. void Timer0_init()
  2. {
  3. TCFG0 = 119;//配置定时器0,1的预分频值
  4. TCFG1 = 0x03;//配置定时器0分频值
  5. TCNTB0 = 3125;//计数缓存寄存器
  6. TCMPB0 = 0;//比较缓存寄存器
  7. TCON |= (1<<1);//手动更新位且配置反相器位(开/关)(手动更行位将TCNTBn和TCMPBn的值分别给TCNTn和TCMPn寄存器)
  8. TCON = 0x09;//定时器使能并自动重载
  9. }
复制代码
► 定时器报警实验
♥ 实验设备
硬件:PC机一台
YX-AIO嵌入式综合创新设计平台一台
ARM9核心板一块
软件:Windows操作系统,ADS1.2集成开发环境,H-JTAG下载环境

♥ 实验内容
使用定时器延时方式控制YX-AIO嵌入式综合创新设计平台上的蜂鸣器报警。

♥ 实验步骤
① 在ADS开发环境中使用ARM9_S3C2440工程模版创建一个工程,并将程序代码添加到该工程;
② 在ADS开发环境中编译链接并生成目标文件;
③ 将JTAG下载器连接YX-AIO嵌入式综合创新设计平台,并将该平台通电;
④ 开启H-JTAG软件检测处理器与NOR-Flash;
⑤ 使用H-JTAG软件将目标文件(.bin)下载到YX-AIO嵌入式综合创新设计平台上;
⑥ 复位平台。

源代码:
  1. voidDelayMS(U32dly)
  2. {
  3. U32time_val;
  4. rTCFG0 = 3;//配置定时器0,1的预分频值
  5. rTCFG1 = 0<<4;//配置定时器1分频值
  6. time_val = PCLK/ (3+1) / 2 / 1000 - 1;// 1ms = PCLK / prescaler / divider / 1000
  7. rTCNTB1 = time_val;//计数缓存寄存器
  8. rTCMPB1 = time_val>>1;// 50%
  9. rTCON &= ~(0xf<<8);//手动更新位且配置反相器位(开/关)
  10. rTCON |= 0xb<<8;//定时器使能并自动重载
  11. rTCON &= ~(2<<8);//clear manual update bit
  12. while(dly--)
  13. {
  14. while(rTCNTO1>=time_val>>1);
  15. while(rTCNTO1 >1);
  16. }
  17. }
  18. void Main(void)
  19. {
  20. //----------------添加自己的代码-------------------
  21. rGPACON &= ~(1<<16);
  22. while (1)
  23. {
  24. rGPADAT |= (1<<16);
  25. DelayMS(1000);
  26. rGPADAT &= ~(1<<16);
  27. DelayMS(500);
  28. }
  29. }


上一页 1 2 下一页

评论


技术专区

关闭