阅读以下资料,请编写五个函数完成LED6的接口初始化,LED6的点亮和熄灭操作。假设定时器时钟源PCLK频率为200MHz,请用6818芯片定时器2进行计时,并用中断的方式完成LED6(亮1秒)-(灭1秒)-(亮1秒)的循环状态指示程序。  (1)完成LED初始化函数 void led_init(void) { ;} (2)完成led点亮函数 void led_on(void) { ; } (3)完成led熄灭函数 void led_off(void) { ;; } (4)完成定时器1初始化函数 void Timer_init(void) { // 1. Timer1,作定时器中断 // 2. 设置一级预分频值,设置TIMER0通道,设置TCFG0[7:0]位,设置为199 //f = 200M / (199+1) = 2MHz TCFG0 = ; // 3. 设置二级与分频值,设置TCFG1[3:80]位,设置为0100,进行16分频 //f =2MHz / 16 =125KHz TCFG1 = ;; // 4. 设置PTIMER1的最终周期1S,设置TCNTB1, 设置125000 TCNTB1 = ; // // 6. 打开手动加载 TCON = // 7. 关闭手动加载 TCON = ; // 8. 打开自动加载 TCON = ; TINT_CSTAT ; // 9. 使能TIMER定时器 TCON = ; } (5)完成中断处理函数 Int led_flag =0; void do_irq(void) { unsigned int num_irq; static unsigned int irq_cnt=0; num_irq = ;// 获取中断号 if(num_irq == ) {//补充代码 } GICC_EOIR = GICC_EOIR & (~(0x3FF << 0)) | num_irq;// 清除所有中断 }
时间: 2024-02-14 07:17:51 浏览: 16
以下是五个函数的实现代码:
1. LED初始化函数
```
void led_init(void) {
GPC3CON |= 0x1 << 12; // 将GPC3CON第12位设置为1,使能LED6的GPIO控制
GPC3DAT |= 0x1 << 3; // 将GPC3DAT第3位设置为1,熄灭LED6
}
```
2. LED点亮函数
```
void led_on(void) {
GPC3DAT &= ~(0x1 << 3); // 将GPC3DAT第3位设置为0,点亮LED6
}
```
3. LED熄灭函数
```
void led_off(void) {
GPC3DAT |= 0x1 << 3; // 将GPC3DAT第3位设置为1,熄灭LED6
}
```
4. 定时器初始化函数
```
void Timer_init(void) {
// 1. Timer1,作定时器中断
// 2. 设置一级预分频值,设置TIMER0通道,设置TCFG0[7:0]位,设置为199
// f = 200M / (199+1) = 2MHz
TCFG0 &= ~(0xFF << 0);
TCFG0 |= 0xC7 << 0;
// 3. 设置二级与分频值,设置TCFG1[3:0]位,设置为0100,进行16分频
// f = 2MHz / 16 = 125KHz
TCFG1 &= ~(0xF << 0);
TCFG1 |= 0x4 << 0;
// 4. 设置PTIMER1的最终周期1S,设置TCNTB1,设置125000
TCNTB1 = 125000;
// 5. 打开手动加载
TCON |= 0x1 << 1;
// 6. 关闭手动加载
TCON &= ~(0x1 << 1);
// 7. 打开自动加载
TCON &= ~(0x1 << 0);
// 8. 清除中断状态寄存器
TINT_CSTAT |= 0x1 << 5;
// 9. 使能TIMER定时器
TCON |= 0x1 << 0;
}
```
5. 中断处理函数
```
Int led_flag = 0;
void do_irq(void) {
unsigned int num_irq;
static unsigned int irq_cnt = 0;
num_irq = INTOFFSET;
if (num_irq == 46) { // 判断是否为定时器1的中断
irq_cnt++;
if (irq_cnt == 2000000) { // 1秒钟
irq_cnt = 0;
if (led_flag == 0) {
led_on();
led_flag = 1;
} else {
led_off();
led_flag = 0;
}
}
}
GICC_EOIR = GICC_EOIR & (~(0x3FF << 0)) | num_irq; // 清除所有中断
}
```