智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 2771|回复: 2
打印 上一主题 下一主题

k60野火库DMA模块

[复制链接]

7

主题

15

帖子

0

精华

高级会员

Rank: 4

积分
596
威望
256
贡献
150
兑换币
155
注册时间
2013-4-24
在线时间
95 小时
毕业学校
安徽职业技术学院
跳转到指定楼层
1#
发表于 2013-5-24 16:09:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
例程《DMA脉冲计数 && FTM产生PWM脉冲 && PIT定时中断》里的DMA中断好像没有被触发。
主程序:
#include "common.h"
#include "include.h"

/*************************************************************************
*                             野火嵌入式开发工作室
*                 DMA脉冲计数 && FTM产生PWM脉冲 && PIT定时中断
*
*  实验说明:FTM产生脉冲,DMA脉冲计数,PIT定时打印计数值,并清0。
*
*  实验操作:短接PTA8和PTC5 ,串口查看计数
*
*  实验效果:在串口里可以看到脉冲计数
*
*  实验目的:综合使用DMA 和 FTM、PIT
*
*  修改时间:2012-3-24     已测试
*
*************************************************************************/

extern volatile u8  pit_flag ;
extern volatile u32 dma_int_count;
extern volatile u32 LPT_INT_count;
#define INT_COUNT  100

u8 BUFF[];

void main()
{
    u16 count;

    DisableInterrupts;    //禁止总中断
    LED_init();                                                         

    FTM_PWM_init(FTM1, CH0, 200, 50);//FTM_PWM_init(FTM1, CH0, 100, 50);                                             //FTM模块产生PWM,用 FTM1_CH0 ,即 PTA8 ,频率为 200

    //lptmr_counter_init(LPT0_ALT2,INT_COUNT,2,LPT_Rising);                         //初始化脉冲计数器,用LPT0_ALT2,即PTC5输入,每隔INT_COUNT产生中断,延时2个时钟滤波,上升沿触发
    DMA_count_Init(DMA_CH4, PTC5 ,0x7FFF, DMA_rising);

    pit_init_ms(PIT0, 1000);                                                        //定时 1秒 中断

    EnableInterrupts;                                                               //开总中断

    while(1)
    {
        if( dma_int_count > 0 )//if( pit_flag > 0 )                                                           /*   1 秒中断了  */
        {
            LED_turn(LED0);
            //count=LPTMR0_CNR;                                                       //保存脉冲计数器计算值
            //lptmr_counter_clean();                                                  //清空脉冲计数器计算值(马上清空,这样才能保证计数值准确)
            count = DMA_count_get(DMA_CH4);
            DMA_count_reset(DMA_CH4);
            //printf("1秒钟LPT读取脉冲:%d个\n",LPT_INT_count*INT_COUNT +  count);     //读取间隔1秒的脉冲次数
            printf("1秒钟LPT读取脉冲:%d个\n", count);     //读取间隔1秒的脉冲次数
            //LPT_INT_count=0;                                                        //清空LPT中断次数
            dma_int_count = 0;
            pit_flag = 0;                                                            //清空pit中断标志位
        }
    }
}

LED0一直都没有亮。

isr.c部分程序:

void DMA_CH4_Handler(void)
{
    //DMA通道4
    DMA_IRQ_CLEAN(DMA_CH4);                             //清除通道传输中断标志位    (这样才能再次进入中断)
    DMA_EN(DMA_CH4);                                    //使能通道CHn 硬件请求      (这样才能继续触发DMA传输)
    LED_turn(LED1);
    dma_int_count++;
}

void PIT0_IRQHandler()
{
    LED_turn(LED2);
    //printf("PIT0_IRQHandler\n");
    pit_flag = 1;               //标记进入PIT中断
    PIT_Flag_Clear(PIT0);       //清中断标志位
    PIT_MCR = 0;  // add for correcting PIT bug
}

如果将主程序中 if( dma_int_count > 0 )改为if( pit_flag > 0 ) ,则只有LED0,LED2亮,LED1不亮,即没进DMA的中断。这是什么问题?

0

主题

4

帖子

0

精华

注册会员

Rank: 2

积分
174
威望
90
贡献
46
兑换币
47
注册时间
2015-5-14
在线时间
19 小时
毕业学校
2#
发表于 2015-8-19 09:48:05 | 只看该作者
解决没???
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

注册会员

Rank: 2

积分
174
威望
90
贡献
46
兑换币
47
注册时间
2015-5-14
在线时间
19 小时
毕业学校
3#
发表于 2015-8-19 09:48:28 | 只看该作者
这个问题困扰我几个月了

回复 支持 反对

使用道具 举报

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

本版积分规则

关于我们|联系我们|小黑屋|亿加合和智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-5-4 22:19 , Processed in 0.145235 second(s), 35 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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