高级会员
- 积分
- 596
- 威望
- 256
- 贡献
- 150
- 兑换币
- 155
- 注册时间
- 2013-4-24
- 在线时间
- 95 小时
- 毕业学校
- 安徽职业技术学院
|
例程《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的中断。这是什么问题?
|
|