4、现有LPC2000系列的ARM系统,需要利用其中的P0.3脚作为TIME0匹配功能,P0.4作为捕获功能。 1.写出引脚初始化程序。 2.写出定时器0在2分频的情况下MAT0.0输出0.5Khz频率、占空比为50%方波的程序。 3.写出定时器0在时钟不分频的情况下,完成定时器0上升沿捕获时产生中断的初始化程序。 4.假设定时器0中断分配为向量IRQ通道12,中断服务程序地址为Timer0_ISR,实现上述功能的VIC初始化程序。
时间: 2024-02-20 08:00:39 浏览: 95
1. 引脚初始化程序:
```c
#include <lpc21xx.h>
void Pin_Init(void)
{
PINSEL0 |= (1 << 6) | (1 << 8); // P0.3, P0.4选择功能2 (TIMER0)
IODIR0 |= (1 << 10); // P0.5设为输出
IOSET0 |= (1 << 10); // P0.5输出高电平
}
```
2. 定时器0在2分频的情况下MAT0.0输出0.5Khz频率、占空比为50%方波的程序:
```c
#include <lpc21xx.h>
void Timer_Init(void)
{
T0CTCR = 0x00; // Timer0为定时器模式
T0PR = 0x01; // Timer0时钟分频为2
T0MR0 = 2500 - 1; // 2分频下计数2500次为1ms
T0MCR = 0x02; // 当TC计数值等于MR0时产生中断
T0EMR = 0x22; // 当TC计数值等于MR0或MR1时,MAT0.0输出高电平,MAT0.1输出低电平
T0TCR = 0x01; // 启动Timer0
}
void Timer0_ISR(void) __irq
{
T0IR = 0x01; // 清除Timer0中断标志位
IOCLR0 = (1 << 10); // P0.5输出低电平
}
int main(void)
{
Pin_Init();
Timer_Init();
VICVectAddr12 = (unsigned int) Timer0_ISR; // 将中断服务程序Timer0_ISR的地址放入向量表中
VICVectPriority12 = 0x01; // 设置中断优先级
VICIntEnable = (1 << 4); // 允许Timer0中断
while (1);
return 0;
}
```
3. 定时器0在时钟不分频的情况下,完成定时器0上升沿捕获时产生中断的初始化程序:
```c
#include <lpc21xx.h>
void Capture_Init(void)
{
T0CTCR = 0x00; // Timer0为定时器模式
T0CCR = 0x01; // 当CAP0.0上升沿捕获时产生中断
T0TCR = 0x01; // 启动Timer0
}
void Timer0_ISR(void) __irq
{
if (T0IR & 0x04) // CAP0.0捕获中断
{
// 在此进行捕获处理
T0IR = 0x04; // 清除CAP0.0中断标志位
}
}
int main(void)
{
Pin_Init();
Capture_Init();
VICVectAddr12 = (unsigned int) Timer0_ISR;
VICVectPriority12 = 0x01;
VICIntEnable = (1 << 4);
while (1);
return 0;
}
```
4. 实现上述功能的VIC初始化程序:
```c
#include <lpc21xx.h>
void VIC_Init(void)
{
VICVectAddr = 0x00; // 初始化中断向量表
VICIntSelect &= ~(1 << 4); // Timer0中断为IRQ中断
VICVectCntl12 = (1 << 5) | 4; // 允许Timer0中断,中断优先级为4
VICIntEnable = (1 << 4); // 允许Timer0中断
}
int main(void)
{
Pin_Init();
Timer_Init();
VIC_Init();
while (1);
return 0;
}
```
阅读全文