OpenEdv-开源电子网

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

STM32的DMA出现了奇怪的问题。

[复制链接]

145

主题

445

帖子

0

精华

高级会员

Rank: 4

积分
823
金钱
823
注册时间
2014-1-15
在线时间
350 小时
发表于 2015-1-6 14:10:54 | 显示全部楼层 |阅读模式
5金钱
[mw_shl_code=c,true]/*********************************************************************************** ***********************************************************************************/ void DMA1_Channel2Config(void) { DMA_InitTypeDef DMA_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); //使能DMA传输 DMA_DeInit(DMA1_Channel2); //将DMA的通道4寄存器重设为缺省值 DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)(&USART3->DR); //DMA外设 DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; //数据传输方向,从内存读取发送到外设 DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外设地址寄存器不变 DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //内存地址寄存器递增 DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; //数据宽度为8位 DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; //数据宽度为8位 DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; //工作在正常缓存模式 DMA_InitStructure.DMA_Priority = DMA_Priority_Medium; //DMA通道 x拥有中优先级 DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //DMA通道x没有设置为内存到内存传输 DMA_Init(DMA1_Channel2, &DMA_InitStructure); //根据DMA_InitStruct中指定的参数初始化DMA的通道USART1_Tx_DMA_Channel所标识的寄存器 DMA_ITConfig(DMA1_Channel2,DMA_IT_TC,ENABLE); //发送完成中断 NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel2_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } /*********************************************************************************** ***********************************************************************************/ void USART3_DMATransmit(u8*dat,u8 datlen) { USART_DMACmd(USART3,USART_DMAReq_Tx,ENABLE); DMA_Cmd( DMA1_Channel2, DISABLE ); //USART1 TX DMA1 DMA1_Channel2->CMAR = (u32)dat; DMA1_Channel2->CNDTR = datlen; DMA_Cmd(DMA1_Channel2, ENABLE); } /*********************************************************************************** ***********************************************************************************/ void DMA1_Channel2_IRQHandler(void) { if(DMA1->ISR&(1<<5)) { DMA1->IFCR |= (1<<5); } } [/mw_shl_code]
以上是串口3的DMA配置,下面一个奇怪的问题出现了

当main函数是这样时
while
{

 lizhi();
}
void lizhi(void)
{
u8 eee[9]={1,2,3,4,5,6,7,8,9};
    USART1_DMATransmit(eee,9);  
    Delay_ms(1000); 
}
发送的数据完全正确。当我改成
while
{
 lizhi();
   Delay_ms(1000); 
}
void lizhi(void)
{
u8 eee[9]={1,2,3,4,5,6,7,8,9};
   USART1_DMATransmit(eee,9);  
}
时。事情就完全不一样了
输出:01 02 03 00 09 02 00 08 A2 
这有什么不一样吗?求大神出关



正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

145

主题

445

帖子

0

精华

高级会员

Rank: 4

积分
823
金钱
823
注册时间
2014-1-15
在线时间
350 小时
 楼主| 发表于 2015-1-6 14:13:16 | 显示全部楼层
第二种情况是不是lizhi()函数结束后释放了eee占的空间???
难道DMA只能用来发全局变量???
回复

使用道具 举报

164

主题

1230

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1477
金钱
1477
注册时间
2014-5-21
在线时间
342 小时
发表于 2015-1-6 14:17:30 | 显示全部楼层
帮顶》》》》
彼高丽者,边夷贱类,不足待以仁义,不可责以常礼。古来以鱼鳖畜之,宜从阔略。若必欲绝其种类,恐兽穷则搏。
回复

使用道具 举报

9

主题

1385

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
12081
金钱
12081
注册时间
2013-3-8
在线时间
1284 小时
发表于 2015-1-6 14:36:47 | 显示全部楼层
回复【2楼】Di诺:
---------------------------------
可是能函数退出后,eee空间释放所致。
回复

使用道具 举报

145

主题

445

帖子

0

精华

高级会员

Rank: 4

积分
823
金钱
823
注册时间
2014-1-15
在线时间
350 小时
 楼主| 发表于 2015-1-6 15:00:03 | 显示全部楼层
回复【4楼】augustedward:
---------------------------------
那我只能将要发送的数据放到全局数组里了?我本来想加快处理速度的,却需要空间来换。。。。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-27 06:02

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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