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-28 09:55:04 浏览: 128
1. 引脚初始化程序:
```
PINSEL0 &= ~(0xF << 6); // 将P0.3和P0.4引脚功能设为GPIO模式
PINSEL0 &= ~(0xF << 8);
IO0DIR |= (1 << 3); // 将P0.3引脚设置为输出模式
IO0DIR &= ~(1 << 4); // 将P0.4引脚设置为输入模式
```
2. MAT0.0输出0.5KHz频率、占空比为50%方波的程序:
```
#include <lpc214x.h>
int main(void) {
// 定时器0初始化
T0CTCR = 0x0; // 计数器模式
T0PR = 59; // 时钟2分频,使定时器时钟为1MHz
T0MCR = (1 << 1); // 当计数器匹配MR0时,清零计数器
T0MR0 = 1000; // 计数器上限为1000,使计数器周期为1ms
T0EMR = (1 << 6); // 当计数器匹配MR0时,MAT0.0输出电平翻转
T0TCR = (1 << 1); // 复位定时器0
IO0SET = (1 << 3); // 初始化P0.3引脚为高电平
while (1) {}
}
```
3. 定时器0在时钟不分频的情况下,完成定时器0上升沿捕获时产生中断的初始化程序:
```
#include <lpc214x.h>
void Timer0_ISR(void) __attribute__ ((interrupt("IRQ")));
int main(void) {
// 定时器0初始化
T0CTCR = 0x0; // 计数器模式
T0MCR = (1 << 2) | // 当计数器匹配MR0时,产生中断
(1 << 1); // 当计数器匹配MR0时,清零计数器
T0MR0 = 1000000 - 1; // 计数器上限为999999,使计数器周期为1s
T0CCR = (1 << 4); // 上升沿捕获模式
T0TCR = (1 << 1); // 复位定时器0
VICVectAddr12 = (unsigned int)Timer0_ISR; // 将中断服务程序地址保存到向量表中
VICVectCntl12 = (1 << 5) | 12; // 将IRQ通道12分配给定时器0中断
VICIntEnable = (1 << 4); // 使能定时器0中断
while (1) {}
}
void Timer0_ISR(void) {
unsigned int captureValue = T0CR0; // 获取捕获值
// 处理捕获值
}
```
4. 实现上述功能的VIC初始化程序:
```
#include <lpc214x.h>
void Timer0_ISR(void) __attribute__ ((interrupt("IRQ")));
int main(void) {
// 定时器0初始化
T0CTCR = 0x0; // 计数器模式
T0MCR = (1 << 2) | // 当计数器匹配MR0时,产生中断
(1 << 1); // 当计数器匹配MR0时,清零计数器
T0MR0 = 1000000 - 1; // 计数器上限为999999,使计数器周期为1s
T0CCR = (1 << 4); // 上升沿捕获模式
T0TCR = (1 << 1); // 复位定时器0
// VIC初始化
VICVectAddr12 = (unsigned int)Timer0_ISR; // 将中断服务程序地址保存到向量表中
VICVectCntl12 = (1 << 5) | 12; // 将IRQ通道12分配给定时器0中断
VICIntEnable = (1 << 4); // 使能定时器0中断
// 引脚初始化
PINSEL0 &= ~(0xF << 6); // 将P0.3和P0.4引脚功能设为GPIO模式
PINSEL0 &= ~(0xF << 8);
IO0DIR |= (1 << 3); // 将P0.3引脚设置为输出模式
IO0DIR &= ~(1 << 4); // 将P0.4引脚设置为输入模式
while (1) {}
}
void Timer0_ISR(void) {
unsigned int captureValue = T0CR0; // 获取捕获值
// 处理捕获值
}
```
阅读全文