OpenEdv-开源电子网

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

103ZET6内部flash读写参考原子老师的例程序,只能读写64K。其他的像是被写保护了,我该怎么做了?谢谢大家。

[复制链接]

17

主题

73

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
238
金钱
238
注册时间
2013-9-4
在线时间
18 小时
发表于 2013-9-25 20:27:18 | 显示全部楼层 |阅读模式
#define FLASH_SAVE_ADDR 0X08008000//32K //设置FLASH 保存地址(必须为偶数,且其值要大于本代码所占用FLASH的大小+0X08000000)<0X0807FFFF
前面32K存程序



#define BMP_SAVE_ADDR   0X08009000 //设置FLASH 保存地址(必须为偶数,且其值要大于本代码所占用FLASH的大小+0X08000000)
每幅图最多4096字节
从  0X08009000 开始写一些图片数据到内部flash,能放12幅图片。


从  0X08010000 开始写一些图片数据到内部flash,能放3幅图片。
从  0X08020000 开始写一些图片数据到内部flash,写不进去。 

是不是写保护了?

原子老师是从这里开始写的 64K
#define FLASH_SAVE_ADDR  0X08070000  //设置FLASH 保存地址(必须为偶数,且其值要大于本代码所占用FLASH的大+0X08000000)


 求指点。谢谢大家




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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-9-25 22:58:26 | 显示全部楼层
回复【楼主位】oooiou:
---------------------------------
老版本代码有个小bug,新例程已经改正了。你用的是不是最新例程?
void STMFLASH_Write(u32 WriteAddr,u16 *pBuffer,u16 NumToWrite)
{
u32 secpos;    //扇区地址
u16 secoff;    //扇区内偏移地址(16位字计算)
u16 secremain; //扇区内剩余地址(16位字计算)    
  u16 i;    
u32 offaddr;   //去掉0X08000000后的地址
if(WriteAddr<STM32_FLASH_BASE||(WriteAddr>=(STM32_FLASH_BASE+1024*STM32_FLASH_SIZE)))return;//非法地址
STMFLASH_Unlock(); //解锁
offaddr=WriteAddr-STM32_FLASH_BASE; //实际偏移地址.
secpos=offaddr/STM_SECTOR_SIZE; //扇区地址  0~127 for STM32F103RBT6
secoff=(offaddr%STM_SECTOR_SIZE)/2; //在扇区内的偏移(2个字节为基本单位.)
secremain=STM_SECTOR_SIZE/2-secoff; //扇区剩余空间大小   
if(NumToWrite<=secremain)secremain=NumToWrite;//不大于该扇区范围
while(1) 
{
STMFLASH_Read(secpos*STM_SECTOR_SIZE+STM32_FLASH_BASE,STMFLASH_BUF,STM_SECTOR_SIZE/2);//读出整个扇区的内容
for(i=0;i<secremain;i++)//校验数据
{
if(STMFLASH_BUF[secoff+i]!=0XFFFF)break;//需要擦除     
}
if(i><secremain)//需要擦除
{
STMFLASH_ErasePage(secpos*STM_SECTOR_SIZE+STM32_FLASH_BASE);//擦除这个扇区
for(i=0;i<secremain;i++)//复制
{
STMFLASH_BUF[i+secoff]=pBuffer;   
}
STMFLASH_Write_NoCheck(secpos*STM_SECTOR_SIZE+STM32_FLASH_BASE,STMFLASH_BUF,STM_SECTOR_SIZE/2);//写入整个扇区  
}else STMFLASH_Write_NoCheck(WriteAddr,pBuffer,secremain);//写已经擦除了的,直接写入扇区剩余区间.     
if(NumToWrite==secremain)break;//写入结束了
else//写入未结束
{
secpos++; //扇区地址增1
secoff=0; //偏移位置为0   
    pBuffer+=secremain;   //指针偏移
WriteAddr+=secremain*2; //写地址偏移(16位数据地址,需要*2)    
    NumToWrite-=secremain; //字节(16位)数递减
if(NumToWrite>(STM_SECTOR_SIZE/2))secremain=STM_SECTOR_SIZE/2;//下一个扇区还是写不完
else secremain=NumToWrite;//下一个扇区可以写完了
}  
};
STMFLASH_Lock();//上锁
}
注意这里:WriteAddr+=secremain*2; //写地址偏移(16位数据地址,需要*2)
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

17

主题

73

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
238
金钱
238
注册时间
2013-9-4
在线时间
18 小时
 楼主| 发表于 2013-9-26 11:23:19 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
谢谢原子老师。我先消化一下程序。
我用的是旧版的例程序,不是全部不能写入,感觉像是到了某个地址就没法写入,像是这些页的某些开关没打开。

新版本的程序 WriteAddr+=secremain*2; //写地址偏移(16位数据地址,需要*2)
更新了,在坛子里也看见有朋友提出来 ,还是有点理解不能。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-9-26 16:19:33 | 显示全部楼层
回复【3楼】oooiou:
---------------------------------
因为是16位数据,所以这里必须乘以2.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

17

主题

73

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
238
金钱
238
注册时间
2013-9-4
在线时间
18 小时
 楼主| 发表于 2013-9-26 16:29:02 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
谢谢。再问一个问题,
ZE的串口5收发10幅图没问题,然后我开了一个 串口1,通过cp2102连接到A口,发送10幅图,每个4096字节,发完一副之后,怎么也发不进去了,像是串口1死掉了,用助手也发不进去。复位一下单片机,又开始重复。
uart1_init(72,19200);   //COM1,PCLK2---72M,19200
float temp;
u16 mantissa;
u16 fraction;    
temp=(float)(pclk2*1000000)/(bound*16); //得到USARTDIV
mantissa=temp;   //得到整数部分
fraction=(temp-mantissa)*16;  //得到小数部分  
    mantissa<<=4;
mantissa+=fraction; 
RCC->APB2ENR|=1<<2;    //使能PORTA口时钟  

RCC->APB2ENR|=1<<14;    //使能串口时钟
GPIOA->CRH&=0XFFFFF00F; //IO状态设置PA9-TX,10-RX
GPIOA->CRH|=0X000008B0; //IO状态设置,0XB表示复用输出
  
RCC->APB2RSTR|=1<<14;    //复位串口5
RCC->APB2RSTR&=~(1<<14); //停止复位5        
//波特率设置
  USART1->BRR=mantissa; // 波特率设置  
USART1->CR1|=0X2004;  //1位停止,无校验位

//使能接收中断
USART1->CR1|=1<<8;    //PE中断使能
USART1->CR1|=1<<5;    //接收缓冲区非空中断使能     
MY_NVIC_Init(1,1,USART1_IRQChannel,2);//抢占1,响应1,组2


有什么要特别注意的吗?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-9-26 22:40:13 | 显示全部楼层
回复【5楼】oooiou:
---------------------------------
得看看死在哪里,这个时候,jtag的威力就显示出来了,呵呵。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

17

主题

73

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
238
金钱
238
注册时间
2013-9-4
在线时间
18 小时
 楼主| 发表于 2013-9-27 20:13:20 | 显示全部楼层
回复【6楼】正点原子:
---------------------------------
en 谢谢。是我缓存区 大小不对。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-12 07:19

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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