OpenEdv-开源电子网

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

关于一个103到207 DMA移植的问题(207的DMA和407的DMA是一样的)

[复制链接]

48

主题

537

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
1369
金钱
1369
注册时间
2014-2-13
在线时间
169 小时
发表于 2014-10-17 16:06:14 | 显示全部楼层 |阅读模式
5金钱
实现功能:把外部SRAM数据用DMA送到LCD的RAM上
问题:在103上已经实现,现在要移植到207上(207与407的DMA相同)

[mw_shl_code=c,true]void GRAM_DMA_Init(void) { RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE);//使能DMA传输 DMA_DeInit(DMA2_Stream5);//将DMA的通道1寄存器重设为缺省值 DMA_InitStructure.DMA_Channel = DMA_Channel_5;//通道5 DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&GDRAM[0];//(u32)0X68000000;//SRAM DMA_InitStructure.DMA_Memory0BaseAddr = (u32)0x60020000;//LCD DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;//SRAM->LCD DMA_InitStructure.DMA_BufferSize = 38400;//DMA通道的DMA缓存的大小 DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Enable;//地址递增 DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;//不增 DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//半字 DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;//半字 DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;//不循环 DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;//DMA通道 x拥有中优先级 DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;//DMA_FIFOMode_Disable DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull; DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single; DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; DMA_Init(DMA2_Stream5, &DMA_InitStructure);//初始化DMA // DMA_ITConfig(DMA2_Stream5, DMA_IT_TC,ENABLE); }[/mw_shl_code]

320X480的屏数据分4次送,直到刷完一屏算一次。
[mw_shl_code=c,true]//开启一次LCD DMA传输 //x:其实传输地址编号(0~240) void LCD_DMA_Enable(void) { u16 len; len = 38400; DMA_Cmd(DMA2_Stream5,DISABLE); //关闭DMA传输 DMA_ClearFlag(DMA2_Stream5, DMA_IT_TCIF5);//清除上次的传输完成标记 DMA2_Stream5->NDTR=len; //传输的数据长度 DMA2_Stream5->AR=(u32)&GDRAM[0]; //DMA2,改变存储器地址 DMA_Cmd(DMA2_Stream5, ENABLE); //开启DMA传输 while(DMA_GetFlagStatus(DMA2_Stream5, DMA_IT_TCIF5)==RESET);//等着 /////////////////////////////////////////////////////////////////////////// DMA_ClearFlag(DMA2_Stream5, DMA_IT_TCIF5);//清除上次的传输完成标记 DMA2_Stream5->AR=(u32)&GDRAM[38400]; //DMA2,改变存储器地址 DMA_Cmd(DMA2_Stream5,DISABLE); //关闭DMA传输 DMA2_Stream5->NDTR=len; //传输的数据长度 DMA_Cmd(DMA2_Stream5, ENABLE); //开启DMA传输 while(DMA_GetFlagStatus(DMA2_Stream5, DMA_IT_TCIF5)==RESET);//等着 /////////////////////////////////////////////////////////////////////////// DMA_ClearFlag(DMA2_Stream5, DMA_IT_TCIF5);//清除上次的传输完成标记 DMA2_Stream5->AR=(u32)&GDRAM[76800]; //DMA2,改变存储器地址 DMA_Cmd(DMA2_Stream5,DISABLE); //关闭DMA传输 DMA2_Stream5->NDTR=len; //传输的数据长度 DMA_Cmd(DMA2_Stream5, ENABLE); //开启DMA传输 while(DMA_GetFlagStatus(DMA2_Stream5, DMA_IT_TCIF5)==RESET);//等着 /////////////////////////////////////////////////////////////////////////// DMA_ClearFlag(DMA2_Stream5, DMA_IT_TCIF5);//清除上次的传输完成标记 DMA2_Stream5->AR=(u32)&GDRAM[115200]; //DMA2,改变存储器地址 DMA_Cmd(DMA2_Stream5,DISABLE); //关闭DMA传输 DMA2_Stream5->NDTR=len; DMA_Cmd(DMA2_Stream5, ENABLE); //开启DMA传输 while(DMA_GetFlagStatus(DMA2_Stream5, DMA_IT_TCIF5)==RESET);//等着 }[/mw_shl_code]
上述代码问题:程序死在第一次等待查询上“while(DMA_GetFlagStatus(DMA2_Stream5, DMA_IT_TCIF5)==RESET);”,不知道哪个地方出现了问题。
外设基地址和内存基地址还是沿用之前的,在不启用DMA,直接FSMC+LCD测试已经通过了。

最佳答案

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

每次我都是怀着沉重的心情来自己结贴的,本身就对DMA一知半解,终于在反复看了n遍F4的书把问题解决了,总之心情很郁闷。 [mw_shl_code=c,true]void GRAM_DMA_Init(void) { RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE);//使能DMA传输 DMA_DeInit(DMA2_Stream0);//将DMA的通道1寄存器重设为缺省值 DMA_InitStructure.DMA_Channel = DMA_Channel_2;//通道5 DMA_InitStructure.DMA_Periphera ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

48

主题

537

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
1369
金钱
1369
注册时间
2014-2-13
在线时间
169 小时
 楼主| 发表于 2014-10-17 16:06:15 | 显示全部楼层
每次我都是怀着沉重的心情来自己结贴的,本身就对DMA一知半解,终于在反复看了n遍F4的书把问题解决了,总之心情很郁闷。

[mw_shl_code=c,true]void GRAM_DMA_Init(void) { RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE);//使能DMA传输 DMA_DeInit(DMA2_Stream0);//将DMA的通道1寄存器重设为缺省值 DMA_InitStructure.DMA_Channel = DMA_Channel_2;//通道5 DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&GDRAM[0];//(u32)0X68000000;//SRAM DMA_InitStructure.DMA_Memory0BaseAddr = (u32)0x60020000;//LCD DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToMemory;//DMA_DIR_PeripheralToMemory SRAM->LCD DMA_InitStructure.DMA_BufferSize = 38400;//DMA通道的DMA缓存的大小 DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Enable;//地址递增 DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;//不增 DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//半字 DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;//半字 DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;//不循环 DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;//DMA通道 x拥有中优先级 DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;//DMA_FIFOMode_Disable DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull; DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single; DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; DMA_Init(DMA2_Stream0, &DMA_InitStructure); } //开启一次LCD DMA传输 //x:其实传输地址编号(0~240) void LCD_DMA_Enable(void) { u16 len; len = 38400; DMA_Cmd(DMA2_Stream0,DISABLE); //关闭DMA传输 DMA_ClearFlag(DMA2_Stream0, DMA_IT_TCIF0);//清除上次的传输完成标记 DMA2_Stream0->NDTR=len; //传输的数据长度 DMA2_Stream0->AR=(u32)&GDRAM[0]; //DMA2,改变存储器地址 DMA_ITConfig(DMA2_Stream0, DMA_IT_TC,ENABLE); DMA_Cmd(DMA2_Stream0, ENABLE); //开启DMA传输 while(DMA_GetFlagStatus(DMA2_Stream0, DMA_IT_TCIF0)==RESET);//等着 /////////////////////////////////////////////////////////////////////////// DMA_Cmd(DMA2_Stream0,DISABLE); //关闭DMA传输 DMA_ClearFlag(DMA2_Stream0, DMA_IT_TCIF0);//清除上次的传输完成标记 DMA2_Stream0->AR=(u32)&GDRAM[38400]; //DMA2,改变存储器地址 DMA2_Stream0->NDTR=len; //传输的数据长度 DMA_ITConfig(DMA2_Stream0, DMA_IT_TC,ENABLE); DMA_Cmd(DMA2_Stream0, ENABLE); //开启DMA传输 while(DMA_GetFlagStatus(DMA2_Stream0, DMA_IT_TCIF0)==RESET);//等着 /////////////////////////////////////////////////////////////////////////// DMA_Cmd(DMA2_Stream0,DISABLE); //关闭DMA传输 DMA_ClearFlag(DMA2_Stream0, DMA_IT_TCIF0);//清除上次的传输完成标记 DMA2_Stream0->AR=(u32)&GDRAM[76800]; //DMA2,改变存储器地址 DMA2_Stream0->NDTR=len; //传输的数据长度 DMA_ITConfig(DMA2_Stream0, DMA_IT_TC,ENABLE); DMA_Cmd(DMA2_Stream0, ENABLE); //开启DMA传输 while(DMA_GetFlagStatus(DMA2_Stream0, DMA_IT_TCIF0)==RESET);//等着 /////////////////////////////////////////////////////////////////////////// DMA_Cmd(DMA2_Stream0,DISABLE); //关闭DMA传输 DMA_ClearFlag(DMA2_Stream0, DMA_IT_TCIF0);//清除上次的传输完成标记 DMA2_Stream0->AR=(u32)&GDRAM[115200]; //DMA2,改变存储器地址 DMA2_Stream0->NDTR=len; DMA_ITConfig(DMA2_Stream0, DMA_IT_TC,ENABLE); DMA_Cmd(DMA2_Stream0, ENABLE); //开启DMA传输 while(DMA_GetFlagStatus(DMA2_Stream0, DMA_IT_TCIF0)==RESET);//等着 }[/mw_shl_code]

总结:当你工作后你会发现根本没有解决不了的问题,因为解决不了问题你就没法进行项目,没法进行项目你就没法工作,没法工作你就没钱挣,没钱挣你就没饭吃。。。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-10-18 00:37:17 | 显示全部楼层
帮顶....
回复

使用道具 举报

48

主题

537

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
1369
金钱
1369
注册时间
2014-2-13
在线时间
169 小时
 楼主| 发表于 2014-10-18 08:47:13 | 显示全部楼层
自己顶顶...
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-30 06:36

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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