智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 5102|回复: 1
打印 上一主题 下一主题

k60野火库DMA模块

[复制链接]

7

主题

15

帖子

0

精华

高级会员

Rank: 4

积分
596
威望
256
贡献
150
兑换币
155
注册时间
2013-4-24
在线时间
95 小时
毕业学校
安徽职业技术学院
跳转到指定楼层
1#
发表于 2013-5-24 21:09:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
例程《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

主题

5

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
253
威望
141
贡献
82
兑换币
92
注册时间
2013-2-19
在线时间
15 小时
推荐
发表于 2014-1-12 16:26:58 | 只看该作者
请教楼主个问题,DMA可以采集任意io口吗?还是需要连接指定的io口?
回复 支持 1 反对 0

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-7-8 05:10 , Processed in 0.067652 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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