首先,要进行实现定时功能,选择没有输出管教的内部定时器 timer 4
timer 4 定时功能实现
一、首先由规格书可知,定时器4是需要先进行8位的 prescaler 和 4位的 clock divider 的分频设定,其相应的寄存器分别为TCFG0 和 TCFG1
二、根据之上分频器计算出的频率,因本模块取1ms产生一次中断,所以可求得总共所需的次数,赋值给TCNTB4
三、在启动定时器之前,要进行手动更新操作,设置寄存器 TCON,在启动时,要进行清除手动更新位,配置 TCON寄存器
注意点:当赋值给TCNTB4时,该值也将拷贝到 TCNT4中,TCNT4的值每次减1,当其值为0时,产生一次中断,另外在进行启动定时器之前,要进行中断的相应寄存器的设置
利用定时器功能实现音乐播放
一、选择定时器1进行操作,在开发板上找到蜂鸣器LS1,在电路板上找到其位置,然后在核心板上找到其端口GPB1,设置为时钟TCOUT1
二、在初始化操作时,根据参数传进的频率来进行设置 TCNTB1寄存器的值,TCMPB1的值可由自己手动设置,同样地,TCNTB1和TCMPB1的值会分别拷贝给TCNT1和TCMP1,当TCNT1的值减为0或TCNT1的值和TCMP1相等时,产生电平转换
三、定时器的启动步骤,和定时器4一样
四、利用函数的调用来实现时间调用的功能
五、根据传递进来音调的不同和持续时间的长短可以谱写出美妙的音乐
因定时器与音乐播放紧密相关,将代码合成一个模块,便于操作
TIMER.C
- #include "2440addr.h"
- #include "uart.h"
- #include "key.h"
- #include "led.h"
- #include "timer.h"
- #include "song.h"
- static int div2ms, div10ms;
- static volatile unsigned int timer1mscnt,timer10mscnt;
- /*
- Function name : Timer4_Handle
- Description : deal with the interrruption of Timer 4
- Input parameter : none
- Return : none
- Others : none
- */
- static void __irq Timer4_Handle()
- {
- rSRCPND |= (1<<14);
- rINTPND |= (1<<14);
- if(timer1mscnt)
- {
- timer1mscnt--;
- }
- div2ms++;
- switch(div2ms&1) // 2个事情隔1毫秒交替执行
- {
- case 0:
- {
- //checkkey(); // 2 毫秒执行一次
- break;
- }
- case 1:
- {
- set10mstimer(); // 2 毫秒执行一次
- break;
- }
- default:
- {
- break;
- }
- }
- }
- /*
- Function name : delay1ms
- Description : delay the time ,1ms
- Input parameter : one unsigned int vlaue --- waits
- Return : none
- Others : none
- */
- void delay1ms(unsigned int waits)
- {
- timer1mscnt = waits;
- while(1)
- {
- if(0==timer1mscnt)
- {
- //Uart_Printf("1s delay/n");
- break;
- }
- }
- }
- /*
- Function name : delay10ms
- Description : delay the time ,10ms
- Input parameter : one unsigned int vlaue --- wait1ms
- Return : none
- Others : none
- */
- void delay10ms(unsigned int<