OpenEdv-开源电子网

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

2530 FLASH的DMA读写问题

[复制链接]

7

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2015-8-15
在线时间
0 小时
发表于 2015-11-5 14:38:49 | 显示全部楼层 |阅读模式
5金钱
[mw_shl_code=c,true]void Flash_PageErase( int pg) { FADDRH = pg<<1; FCTL |= 0x01; //启动页面擦除 while (FCTL & 0x80); //等待擦除完成 }[/mw_shl_code]
我用这段代码擦除35页的数据,但是在XDATA窗口看到的和读取出来放到数组里看到的都是0x00,并没有擦除,这是为什么啊?
而且我用DMA传输内存到flash的4字节数据,怎么都写不进去,底下是我的写函数,有没有高手指教一下。
[mw_shl_code=c,true]void WriteFlashDMA( uint16 saddr, uint16 length, uint16 flashadr) //Write Flash, DMA Method //Length Must be Divisible by 4 or last bytes fail to write { uint16 tmp = 0; //配置DMA通道每次传送一个字节 DMA_DESC dmaConfig0;//定义DMA通道 //MEMCTR|=0X07;//将bank 7 映射到Xdata区 dmaConfig0.SRCADDRH = (saddr >> 8) & 0x00FF; //XData - To Be Written to Flash - Gets Incremented;存储data的高8位; dmaConfig0.SRCADDRL = saddr & 0x00FF;//存储data地址的低8位; dmaConfig0.DESTADDRH = (((int)&FWDATA) >> 8) & 0x00FF; //Flash Controller Data Address - Flash Controller Writes Data//存储写寄存器的地址的高8位 dmaConfig0.DESTADDRL = ((int)&FWDATA) & 0x00FF;//存储写寄存器的低8位; dmaConfig0.VLEN = 0; //Variable Length Transfer - 0=Fixed LEN Transfer//采用LEN作为传送长度 dmaConfig0.LENH = (length>>8) & 0x00FF; //Number of WORDSZIE in Transfer - Must be Divisible by 4 - NET_ADDR_SIZE=4//存储传送长度高5位 dmaConfig0.LENL = length & 0x00FF;//存储长度低8位; dmaConfig0.WORDSIZE = 0; //Size of Each Transfer - 0=8 Bit;每个DMA传送采用8位传送 dmaConfig0.TMODE = 0; //Transfer Mode - 1=Block, 0=Single,传送模式为单一模式 dmaConfig0.TRIG = 18; //DMA Trigger - 0=Manual Via DMAREQ, 18=Flash;flash触发 dmaConfig0.SRCINC = 0; //Source Address Increment - 1=1 Byte//源地址增量模式为1字节/字 dmaConfig0.DESTINC = 1; //Destination Address Increment - 0=0 Bytes (Always Write to FWDATA, No Need to Increment)目标地址增量模式0字节/字 dmaConfig0.IRQMASK = 0; //Interrupt Mask - 0=Disable Interrupts//禁止通道完成中断产生 dmaConfig0.M8 = 0; //8th Bit Mode - 0=Use All 8 Bits使用全部8位作为传送长度 dmaConfig0.PRIORITY = 2; //Priority - 10(2)=High Priority优先级为DMA优先 //DMA模式写 while (FCTL & 0x80); //Wait Until DMA Controller is Available - Busy Bit 7//等待写或擦除状态被激活 /********* 存储写入flash页地址 ***********************************************/ FADDRH =(flashadr >> 8) & 0x00FF; // page size: 2048; select the flash page via FADDRH[7:1] bits//由于写入flash时是字(4字节)寻址的,所以存储高位需要右移2位; FADDRL =(flashadr >> 0) & 0x00FF; //4字节寻址,存储要写入flash地址的低字节需要右移2位 //通道0配置地址 DMA0CFGH = (((int)&dmaConfig0) >> 8) & 0x00FF; //Pass DmaConfig0 DMA0CFGL = ((int)&dmaConfig0) & 0x00FF; DMAARM |= 0x01; //Arm the DMA Channel//通道0进去工作状态 FCTL |= 0x02; //Start Write //while (!(DMAIRQ & 0x01)); //Wait Until Write Complete //DMAIRQ &= 0xFE; //Clear Any DMA IRQ on Channel 0 - Bit 0 while (FCTL & (0x80)); //Wait Until Flash Controller is Not Busy - Busy Bit 7//等待或者擦除状态激活 }[/mw_shl_code]

不要怂!就是干!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2015-11-5 23:33:15 | 显示全部楼层
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

7

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2015-8-15
在线时间
0 小时
 楼主| 发表于 2015-11-9 14:23:45 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
原子哥你好,请问下,裸机下的2530可以配置DMA直接把串口接收寄存器的数据直接扔到FLASH吗?就不需要把接收的数据先读到内存再写入FLASH。
不要怂!就是干!
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2015-11-9 22:44:49 | 显示全部楼层
回复【3楼】小李飞砖:
---------------------------------
没搞过啊。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-23 12:37

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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