请选择 进入手机版 | 继续访问电脑版

硬汉嵌入式论坛

 找回密码
 立即注册
查看: 536|回复: 4
收起左侧

[有问必答] 在编程的时怎么将字库文件/图片(BIN文件)写到FLASH中(W25QXX)

[复制链接]

21

主题

55

回帖

118

积分

初级会员

积分
118
发表于 2023-5-14 12:55:37 | 显示全部楼层 |阅读模式








以上截图来自网上的一篇文章。看着有些疑问

1.这么大的数组是直接定义在单片机内部?

2.这一段代码,看着像把单片机内部已有的数组再搬到FLASH中去,既然单片机内部都能放下这么大的数据,那再搬到外部SPI FLASH意思不大吧。
原地址






回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
105917
QQ
发表于 2023-5-16 00:26:36 | 显示全部楼层
这个我有写过教程,看下就明白了

https://www.armbbs.cn/forum.php?mod=viewthread&tid=93255


下载 (2).png
回复

使用道具 举报

0

主题

6

回帖

6

积分

新手上路

积分
6
发表于 2023-5-18 16:09:18 | 显示全部楼层
可以用串口下载,先发送BIN文件要写在FLASH里的地址和BIN文件的具体容量(不是占用量),然后用串口工具发送BIN文件,由于W25QXX一次只能写256字节,编程还要40MS,串口工具发送文件要每256字节延时50MS。
参考代码:
[C] 纯文本查看 复制代码
void USART1_IRQHandler(void)                	//串口1中断服务程序
{
	u8 Res;
	u32 saddrs;
	u16 slen;
	u16 i;
	PDownConfig UartDownConfig;					  //4字节数据长度,2字节开始扇区地址
	if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾)
	{
		Res =USART_ReceiveData(USART1);//(USART1->DR);	//读取接收到的数据
		if(flashdown)
		{
			UartBuf[UartCount]=Res;
			if(RevFlag==0)
			{
				if(++UartCount>=6)						//首先接收配置参数
				{
					UartCount=0;
					RevFlag=1;
					UartDownConfig=(PDownConfig)UartBuf;
					Capacity_vel=UartDownConfig->Capacity;
					addrs=UartDownConfig->Sector*256;
					Printf(USART1,"The total capacity is %d Byte,The starting ADDRs is %6X \r\n",Capacity_vel,addrs);
					saddrs=addrs>>12;
					slen=Capacity_vel>>12;
					if(Capacity_vel%4096!=0) slen+=1;
					Printf(USART1,"Erase Sector adds:%X nums:%d\r\n",saddrs,slen);
					for(u16 i=0;i<slen;i++)
					{
						W25QXX_Erase_Sector(saddrs);
						Delay_Ms(50);
						saddrs++;
					}
					Printf(USART1,"Erase OK!\r\n");
				}
			}
			else  					//收完头信息后接收数据
			{
				if(++UartCount>255 )//满256个或者传完了
				{
					UartCount = 0;
					FullFlag=0;									//没有完呢
					UartComp=1;									//满256个启动DMA
					for(i=0;i<=255;i++)
					{
						CopyBuf[i]=UartBuf[i];		//转存在CopyBuf[]中倒出缓冲区
					}
				}
				else if(Capacity_vel<256)       //传完了
				{
					FullFlag=1;					//传完整页了剩的数据
					UartComp=1;
					datacnt=Capacity_vel;			//剩的数据
					for(i=0;i<=datacnt;i++)
					{
						CopyBuf[i]=UartBuf[i];
					}
				}
			}
		}
		else
		{
			if((USART1_RX_STA&0x8000)==0)//接收未完成
			{
				if(USART1_RX_STA&0x4000)//接收到了0x0d
				{
					if(Res!=0x0a)USART1_RX_STA=0;//接收错误,重新开始
					else 
					{	
						USART1_RX_STA|=0x8000;	//接收完成了
                        Copy_len=USART1_RX_STA&0x3fff;          //接收长度
                        for(i=0;i<Copy_len;i++)
                        {
                            CopyBuf[i]=USART1_RX_BUF[i];        //转存
                        }
                        Usart1_Flag=1;                          //标志接收完
                        USART1_RX_STA=0;        //重新开始接收新数据
					}	
				}
				else //还没收到0X0D
				{	
					if(Res==0x0d)USART1_RX_STA|=0x4000;
					else
					{
						USART1_RX_BUF[USART1_RX_STA&0X3FFF]=Res ;
						USART1_RX_STA++;
						if(USART1_RX_STA>(USART_REC_LEN-1))USART1_RX_STA=0;//接收数据错误,重新开始接收	  
					}		 
				}
			}	   		 
		}
	}		
	USART_ClearITPendingBit(USART1, USART_IT_RXNE);   // 清除串口接受中断	
} 
回复

使用道具 举报

21

主题

55

回帖

118

积分

初级会员

积分
118
 楼主| 发表于 2023-5-19 15:39:06 | 显示全部楼层
eric2013 发表于 2023-5-16 00:26
这个我有写过教程,看下就明白了

https://www.armbbs.cn/forum.php?mod=viewthread&tid=93255

看了一下,个人理解是在MCU的RAM中运行W25Q64的写操作,将定义在外部FLASH的数据写在W25Q64中。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
105917
QQ
发表于 2023-5-20 09:26:59 | 显示全部楼层
Y1ng 发表于 2023-5-19 15:39
看了一下,个人理解是在MCU的RAM中运行W25Q64的写操作,将定义在外部FLASH的数据写在W25Q64中。

就跟下载器给芯片内部Flash下载程序一个道理。MDK通过下载器将读写操作动态API加载的芯片RAM里面,然后控制芯片内部Flash和外部Flash执行擦写操作。
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-3-29 07:05 , Processed in 0.451032 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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