________
| |_____
0.5s 0.1s
1. 定时器定时方法(查询)
void Time0Init(void)
{
T0PR = 9; // 设置定时器0分频为10分频,得110592Hz
T0MCR = 0x03; // 匹配通道0匹配中断并复位T0TC
T0MR0 = 110592; // 比较值(0.1S定时值)
T0TCR = 0x01;
}
int main(void)
{
int i=0;
PINSEL0 = 0x00000000; // 设置管脚连接GPIO
IO0DIR = 1<<9; // 设置I/O为输出
Time0Init(); // 初始化定时器0
while(1)
{
while( (T0IR&0x01) == 0 ); // 等待定时时间到
T0IR = 0x01; // 清除中断标志
i++;
if(i<=5)
{
IO0SET = 1<<9;
}
else
{
i=0;
IO0CLR = 1<<9;
}
}
return(0);
}
定时器定时方法(中断)
void __irq IRQ_Timer0(void)
{
T0IR = 0x01; // 清除中断标志
i++;
if(i<=5) { IO0SET = 1<<9; }
else {
i=0;
IO0CLR = 1<<9;
}
VICVectAddr = 0; // 向量中断结束
}
void INT_Init(void)
{
VICIntSelect = 0x00000000;
VICVectCntl0 = 0x20|4;
VICVectAddr0 = (int)IRQ_Timer0;
VICIntEnable = 1<<4;
}
void Time0Init(void)
{
T0PR = 9; // 设置定时器0分频为100分频,得110592Hz
T0MCR = 0x03; // 匹配通道0匹配中断并复位T0TC
T0MR0 = 110592; // 比较值(0.1S定时值)
T0TCR = 0x01;
}
int i;
int main(void)
{
IRQEnable();
PINSEL0 = 0x00000000; // 设置管脚连接GPIO
IO0DIR = 1<<9; // 设置I/O为输出
Time0Init(); // 初始化定时器0
INT_Init();
while(1);
return(0);
}
七、P236 请用程序实现通过P0.0口测量图中低电平脉冲的宽度。
T0TC = 0;
T0PR = 0;
while((IO0PIN & 0x01) != 0);
T0TCR = 0x01;
while((IO0PIN & 0x01) == 0);
T0TCR = 0x00;
time = T0TC;
八(1)、要求在P0.9引脚输出如图周期信号,已知Fpclk=11.0592M,请用PWM方法实现代码。
________
| |_____
0.5s 0.1s
int main(void){
PINSEL0 = 2<<18; // 设置PWM6连接到P0.9管脚
PWMPR = 0x00; // 不分频,计数频率为Fpclk
PWMPCR = (0<<6)|(1<<14); // 允许PWM6输出,单边PWM
PWMMCR = 0x02; // 设置PWMMR0匹配时复位PWMTC
PWMMR0 = Fpclk*0.6 ; // 设置PWM周期
PWMMR6 = Fpclk*0.5 ; // 设置PWM占空比
PWMLER = 1|(1<<6); // PWMMR0、PWMMR6锁存
PWMTCR = 0x09; // 启动定时器,PWM使能
While(1);
return(0);
}
八(2)、要求在P0.9引脚输出如图周期信号,已知Fpclk=11.0592M,信号频率为5 Hz,请用PWM方法实现代码。
_____________________
______ | |_______
% 20 %60 %20
int main(void){
PINSEL0 = 2<<18; // 设置PWM6连接到P0.9管脚
PWMPR = 0x00; // 不分频,计数频率为Fpclk
PWMPCR = (1<<6)|(1<<14); // 允许PWM6输出,双边PWM
PWMMCR = 0x02; // 设置PWMMR0匹配时复位PWMTC
PWMMR0 = Fpclk/5 ; // 设置PWM周期
PWMMR5 = (Fpclk/5)*0.2 ;
PWMMR6 = (Fpclk/5)*0.8 ;
PWMLER = 1|(1<<5)|(1<<6); // PWMMR0、PWMMR5、PWMMR6锁存
PWMTCR = 0x09; // 启动定时器,PWM使能
while(1);
return(0);
}
九、一个工程为了让LED常年不断闪烁引入了看门狗。看门狗的工程一般应用方法:用定时器产生一个固定中断时间,在中断服务程序里喂狗。
定时器初始化:
void Time0Init(void)
{
T0PR = 99; // 设置定时器0分频为100分频,得110592Hz
T0MCR = 0x03; // 匹配通道0匹配中断并复位T0TC
T0MR0 = 3*110592; // 比较值(3S定时值)
T0TCR = 0x03; // 启动并复位T0TC
T0TCR = 0x01;
VICIntSelect = 0x00; // 所有中断通道设置为IRQ中断
VICVectCntl0 = 0x24;
VICVectAddr0 = (uint32)ISR_Time; // 设置中断服务程序地址向量
VICIntEnable = 0x00000010; // 使能定时器0中断
}
看门狗初始化:
void WDT_INI()
{
WDTC = Fpclk ; // 设置WDTC,喂狗重装值
WDMOD = 0x03; // 复位并启动WDT
WdtFeed(); // 进行喂狗操作
}
中断里定时喂狗:
void __irq ISR_Time(void)
{
WdtFeed();
T0IR = 0x01; // 清除中断标志
VICVectAddr = 0x00; // 通知VIC中断处理结束
}
主功能函数;
int main(void)
{
PINSEL0 = 0x00000000; // 设置管脚连接GPIO
IRQEnable();
IO2DIR = LEDCON;
Time0Init(); // 初始化定时器0及使能中断
WDT_INI();
while(1){
if( (IO2SET&LEDCON) == 0 ) { IO2SET =LEDCON; }
else { IO2CLR =LEDCON; }
DelayNS(50);
}
return(0);
}