OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4183|回复: 7

老生常谈的DMA中断还是进入不了,求解,谢谢!!!!

[复制链接]

106

主题

418

帖子

0

精华

高级会员

Rank: 4

积分
764
金钱
764
注册时间
2016-7-26
在线时间
123 小时
发表于 2016-11-11 22:38:55 | 显示全部楼层 |阅读模式
1金钱
_01_~D`T7ZHU_PPMQ0W7~87.png
这样还需要哪些配置??情况是总是进入不了中断

DMA全配置成功程序如下:

void DMA_INIT()
{
RCC_Configuration();
GPIO_Configure();
UsartConfigureRefunction();
KeyInit();
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);
DMA1_Channel4->CCR |=   1<<1;    //允许传输完成中断
DMA1_Channel4->CCR |=   1<<4;    //从存储器读
DMA1_Channel4->CCR &= ~(1<<5);   //不执行循环模式
DMA1_Channel4->CCR &= ~(1<<6);   //外设地址不增加
DMA1_Channel4->CCR |=   1<<7;    //存储器地址增加
       
DMA1_Channel4->CCR &= ~(1<<8);   //外设数据宽度是8,因为是u8
DMA1_Channel4->CCR &= ~(1<<9);
       
DMA1_Channel4->CCR &= ~(1<<10);  //存储器的地址是8位,因为是u8
DMA1_Channel4->CCR &= ~(1<<11);
       
DMA1_Channel4->CCR        &= ~(1<<12);  //通道优先级是低
DMA1_Channel4->CCR &= ~(1<<13);
       
DMA1_Channel4->CCR &= ~(1<<14);  //非存储器到存储器

DMA1_Channel4->CNDTR= 8;         //8个字节
DMA1_Channel4->CMAR = (u32)T_table;
DMA1_Channel4->CPAR = (u32)&(USART1->DR);
USART_DMACmd(USART1,USART_DMAReq_Tx,ENABLE);

最佳答案

查看完整内容[请看2#楼]

用中断,还外部判断,你逗我么,判断也是中断更改标记位,外部判断自己定义的标记,
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

30

主题

1170

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1993
金钱
1993
注册时间
2016-2-16
在线时间
527 小时
发表于 2016-11-11 22:38:56 | 显示全部楼层
用中断,还外部判断,你逗我么,判断也是中断更改标记位,外部判断自己定义的标记,
回复

使用道具 举报

106

主题

418

帖子

0

精华

高级会员

Rank: 4

积分
764
金钱
764
注册时间
2016-7-26
在线时间
123 小时
 楼主| 发表于 2016-11-11 22:42:09 | 显示全部楼层
本帖最后由 慕名兰 于 2016-11-11 22:44 编辑

请问还需要哪些配置?DMA是把数组的字符串传到USART_TX的DR,用按键没按下一次串口就打印一次(数据能打印出来),由于我设置的是非循环模式,所以我想用中断重新转载,结果进入不了中断??
回复

使用道具 举报

106

主题

418

帖子

0

精华

高级会员

Rank: 4

积分
764
金钱
764
注册时间
2016-7-26
在线时间
123 小时
 楼主| 发表于 2016-11-11 23:47:16 | 显示全部楼层
刚刚发现要改变CNTDR的值要先关闭通道,但还是进入不了中断,唉!!!!
回复

使用道具 举报

30

主题

1170

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1993
金钱
1993
注册时间
2016-2-16
在线时间
527 小时
发表于 2016-11-12 12:30:55 | 显示全部楼层
慕名兰 发表于 2016-11-11 23:47
刚刚发现要改变CNTDR的值要先关闭通道,但还是进入不了中断,唉!!!!

我一般用库函数配置,你先硬件调试,看看你传送计数的寄存器的数组改变没,或者看设置的缓存地址有没有有效数据,首先得确定他工作了
回复

使用道具 举报

106

主题

418

帖子

0

精华

高级会员

Rank: 4

积分
764
金钱
764
注册时间
2016-7-26
在线时间
123 小时
 楼主| 发表于 2016-11-12 13:19:46 | 显示全部楼层
憨厚诚实大叔 发表于 2016-11-12 12:30
我一般用库函数配置,你先硬件调试,看看你传送计数的寄存器的数组改变没,或者看设置的缓存地址有没有有 ...

嗯,我继续试试
回复

使用道具 举报

106

主题

418

帖子

0

精华

高级会员

Rank: 4

积分
764
金钱
764
注册时间
2016-7-26
在线时间
123 小时
 楼主| 发表于 2016-11-12 14:27:05 | 显示全部楼层
本帖最后由 慕名兰 于 2016-11-12 14:30 编辑
憨厚诚实大叔 发表于 2016-11-12 12:30
我一般用库函数配置,你先硬件调试,看看你传送计数的寄存器的数组改变没,或者看设置的缓存地址有没有有 ...

我找到问题了,我是这样写的程序:
void Key_Control()
{
  if(KeyLed0 == 0)  
  {
    Delay_Ms(10);
        if(KeyLed0 == 0)  
        {
                DMA1_Channel4->CCR |= 1<<0;    //开启通道
        }

        while((DMA1->ISR&(1<<13)) == 0);  //判断传输是否完成

  }
  else                DMA1_Channel4->CCR &= ~(1<<0);  //关闭通道
}
我在调试时候发现 (DMA1_Channel4->CCR |= 1<<0;  //开启通道),一开始数据就传输完了,然后进入中断,并没执行(while((DMA1->ISR&(1<<13)) == 0);  //判断传输是否完成),由于我中断直接清除标志位,导致一直死循环在while((DMA1->ISR&(1<<13)) == 0);里面,以上是调试发现的问题。

我的疑问是,这DMA传输的也太快了吧,这比CPU执行程序还要快啊!!!那我要判断DMA是否传输完,用while的话怎么做??有什么其他的好办法吗?我的数据就是几个字符,是不是我数据太少了????????
回复

使用道具 举报

106

主题

418

帖子

0

精华

高级会员

Rank: 4

积分
764
金钱
764
注册时间
2016-7-26
在线时间
123 小时
 楼主| 发表于 2016-11-12 23:39:37 | 显示全部楼层
憨厚诚实大叔 发表于 2016-11-12 15:24
用中断,还外部判断,你逗我么,判断也是中断更改标记位,外部判断自己定义的标记,

怎么用中断?能再详细点吗。。。。
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-25 05:13

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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