注册 登录
查看: 386|回复: 13

中断程序怎么写呢?这样写了芯片不能工作,

[复制链接]
发表于 2014-6-29 23:40:50 | 显示全部楼层 |阅读模式

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2014-6-29 23:41:39 | 显示全部楼层
enable_irq 这个不能省的,这个是开中断
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-6-29 23:50:25 | 显示全部楼层
山外メ雲ジ 发表于 2014-6-29 23:41
enable_irq 这个不能省的,这个是开中断

我用的是KL26,是EnableInterrupts;吗?
回复 支持 反对

使用道具 举报

发表于 2014-6-29 23:52:04 | 显示全部楼层
专注~独立 发表于 2014-6-29 23:50
我用的是KL26,是EnableInterrupts;吗?

EnableInterrupts;  是使能总中断 (类似于家里的总开关)

每个中断都需要调用 enable_irq  来使能中断(类似于每个电器的开关)
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-6-29 23:53:16 | 显示全部楼层
专注~独立 发表于 2014-6-29 23:50
我用的是KL26,是EnableInterrupts;吗?

不是默认的开中断吗?
#include "include.h"

#undef PIT_VECTORn
#define PIT_VECTORn PIT_IRQHandler

extern void PIT_IRQHandler();
这是我在MKL_it.h里面写的函数,不知道中断向量表映射对不对
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-6-29 23:55:33 | 显示全部楼层
山外メ雲ジ 发表于 2014-6-29 23:52
EnableInterrupts;  是使能总中断 (类似于家里的总开关)

每个中断都需要调用 enable_irq  来使能中断 ...

他写在main.c里面吗?我想把它写在MKL_it.c里面
回复 支持 反对

使用道具 举报

发表于 2014-6-29 23:56:30 | 显示全部楼层
专注~独立 发表于 2014-6-29 23:53
不是默认的开中断吗?
#include "include.h"

默认开了总中断,但每个中断都需要单独开中断。

另外,重定向需要参考这里的内容:
  1. /*                          重新定义中断向量表
  2. *  先取消默认的中断向量元素宏定义        #undef  VECTOR_xxx
  3. *  在重新定义到自己编写的中断函数      #define VECTOR_xxx    xxx_IRQHandler
  4. *  例如:
  5. *       #undef  VECTOR_003                         先取消映射到中断向量表里的中断函数地址宏定义
  6. *       #define VECTOR_003    HardFault_Handler    重新定义硬件上访中断服务函数
  7. */
你的是 PIT ,用的是这个:VECTOR_038 ,而不是用 PIT_VECTORn。
回复 支持 反对

使用道具 举报

发表于 2014-6-29 23:57:59 | 显示全部楼层
专注~独立 发表于 2014-6-29 23:55
他写在main.c里面吗?我想把它写在MKL_it.c里面

enable_irq 必须要在程序里调用的,不能省的!!

你要写入到 在MKL_it.c里面 ,也是要调用enable_irq 来开中断。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-6-30 00:04:45 | 显示全部楼层
山外メ雲ジ 发表于 2014-6-29 23:56
默认开了总中断,但每个中断都需要单独开中断。

另外,重定向需要参考这里的内容:你的是 PIT ,用的是 ...

#include "common.h"
#include "include.h"
void main()
{
    led_init(LED0);                                         //初始化LED0,PIT0中断用到LED0
     EnableInterrupts;
     enable_irq (PIT_IRQn);
    pit_init_ms(PIT0, 1000);                                //初始化PIT0,定时时间为: 1000ms
   
    /* set_vector_handler(PIT_VECTORn ,PIT_IRQHandler);      //设置PIT0的中断服务函数为 PIT0_IRQHandler
    enable_irq (PIT_IRQn); */                                //使能PIT0中断

    while(1)
    {
        //这里不需要执行任务,等待中断来闪烁LED0
    }
}
上面是main.c写的
#ifndef __MK60_IT_H__
#define __MK60_IT_H__

/*                          重新定义中断向量表
*  先取消默认的中断向量元素宏定义        #undef  VECTOR_xxx
*  在重新定义到自己编写的中断函数      #define VECTOR_xxx    xxx_IRQHandler
*  例如:
*       #undef  VECTOR_003                         先取消映射到中断向量表里的中断函数地址宏定义
*       #define VECTOR_003    HardFault_Handler    重新定义硬件上访中断服务函数
*/
#include "include.h"

#undef PIT_VECTOR_038
#define PIT_VECTOR_038 HardFault_Handler

extern void PIT_IRQHandler();
这是在MKL_it.h写的
#include    "MKL_it.h"
#include "common.h"
#include    "include.h"
void PIT_IRQHandler(void)
{
    if(PIT_TFLG(PIT0) == 1 )        //判断是否 PIT0 进入中断
    {
        led_turn(LED0);             //闪烁 LED0

        PIT_Flag_Clear(PIT0);       //清中断标志位
    }
}
这是MKL_it.c写的。
灯还是还不亮啊
回复 支持 反对

使用道具 举报

发表于 2014-6-30 00:06:57 | 显示全部楼层
专注~独立 发表于 2014-6-30 00:04
#include "common.h"
#include "include.h"
void main()

改为:
  1. #undef VECTOR_038
  2. #define VECTOR_038 HardFault_Handler
VECTOR_038 这些都是定义好的宏定义,你可以跳到定义处看注释的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-6-30 00:19:38 | 显示全部楼层
山外メ雲ジ 发表于 2014-6-30 00:06
改为:VECTOR_038 这些都是定义好的宏定义,你可以跳到定义处看注释的

可以了谢谢哥了
但我想问问PIT_VECTORn和VECTOR_038有什么区别呢。为什么在main.c写中断程序就用PIT_VECTORn,并且中断只能写在main前面,而在MKL_it.c就用VECTOR_038。
回复 支持 反对

使用道具 举报

发表于 2014-6-30 00:21:07 | 显示全部楼层
专注~独立 发表于 2014-6-30 00:19
可以了谢谢哥了
但我想问问PIT_VECTORn和VECTOR_038有什么区别呢。为什么在main.c写中断程序就用PIT_VEC ...

PIT_VECTORn 是 枚举编号,对 中断号进行编号

VECTOR_038 是 定义 相应中断号的中断函数入口。

回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-6-30 00:26:24 | 显示全部楼层
谢谢哥哥了,注意身体这么晚了还在解答问题,辛苦了。早点睡哈,
回复 支持 反对

使用道具 举报

发表于 2014-6-30 00:27:38 | 显示全部楼层
专注~独立 发表于 2014-6-30 00:26
谢谢哥哥了,注意身体这么晚了还在解答问题,辛苦了。早点睡哈,

嗯嗯,准备睡觉的啦
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回列表 返回顶部