打印
[技术问答]

[新唐nuc120] 十万火急 NUC120 如何flash读写

[复制链接]
2224|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
direrwind|  楼主 | 2015-7-29 12:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 direrwind 于 2015-7-29 14:51 编辑

最近在做专案,剩下FLASH问题还未解决,
以下是我的程式码:
透过uart 丟0x11给a变量并且往FLASH写入,接着主程式就会判断输出高电位,
但是呢断电后在上电发现a变量并没有保存下来(因为这时就变回输出低电位),
拜托高手可以帮个忙怎么使用flash读写吗??我看手册影片范例都不太懂... 真的很急呀
#include "NUC1xx.h"        
#include "Driver\DrvGPIO.h"  
#include "Driver\DrvFMC.h"        
#include "Driver\DrvSYS.h"
#define LDROM_BASE 0x00100000           
void Initsystem(void);
void UartInit(void);
void FMC_Init();
int a,data;
main(void)
{
Initsystem();
UartInit();
FMC_Init();
while(1)
{                  
                   DrvFMC_Read(LDROM_BASE+4,&data);
           a=data;

                        GPIOA->DOUT = 0x01;
                   while(1)
                   {
                   if(a==0x11)
                   {
                                   GPIOA->DOUT = 0x00;
                   }
                   }
}
}

void Initsystem()
{
   UNLOCKREG();
   SYSCLK->PWRCON.XTL12M_EN = 1;
   SYSCLK->CLKSEL0.HCLK_S = 0;
   LOCKREG();
}
void UartInit()
{
SYS->GPBMFP.UART0_TX=1;
SYS->GPBMFP.UART0_RX=1;

SYSCLK->APBCLK.UART0_EN = 1;
SYSCLK->CLKSEL1.UART_S = 3;
SYSCLK->CLKDIV.UART_N = 0;

UART0->FCR.TFR =1;
UART0->FCR.RFR =1;
UART0->FCR.RFITL = 0;
UART0->LCR.PBE = 0;
UART0->LCR.WLS = 3;
UART0->LCR.NSB = 0;

UART0->BAUD.DIV_X_EN=0;
UART0->BAUD.DIV_X_ONE=0;
UART0->BAUD.DIVIDER_X=0;
UART0->BAUD.BRD=22;

UART0->IER.RDA_IEN=1;
NVIC_EnableIRQ(UART0_IRQn);         
}

void UART0_IRQHandler()
{
while(UART0->ISR.RDA_IF==1)
{
  a=UART0->DATA;
  DrvFMC_Write(LDROM_BASE+4,a);
        
}
}         
  void FMC_Init()
{
  UNLOCKREG();
  DrvFMC_EnableISP();
  DrvFMC_EnableLDUpdate();
}


沙发
进击的ic| | 2015-7-29 15:26 | 只看该作者
1、你在串口中断那设个断点,看看串口接收有问题没
2、你在调试模式下看看你写的地址处写进去没
3、flash是块擦除的,所以每次改变数据都要先把那一块的数据都读出来放在缓存再更改,擦除整块后,再全部写入
4、你用的这个单片机flash可以一个字节写入?STM32最少就只能半字写入

使用特权

评论回复
板凳
direrwind|  楼主 | 2015-7-29 16:12 | 只看该作者
进击的ic 发表于 2015-7-29 15:26
1、你在串口中断那设个断点,看看串口接收有问题没
2、你在调试模式下看看你写的地址处写进去没
3、flash是 ...

1.确定uart有收到赋予a值没问题
2.出现这个状况,超出范围,我不懂为什麽???

3.像类似这个方法吗,我参考新唐影片范例的
for(i=0;i<4096;i+=PAGE_SIZE)
DrvFMC_Erase(LDROM_BASE+i);
for(i=0;i<4096;i+=4)
{
DrvFMC_Read(LDROM_BASE+i,&data);
if(data!=0xFFFFFFFF)
while(1);
}
for(i=0;i<4096;i+=4)
DrvFMC_Write(LDROM_BASE+i,i);
for(i=0;i<4096;i+=4)
{
DrvFMC_Read(LDROM_BASE+i,&data);
if(data!=i)       
while(1) ;
}
4.第一次写不太清楚

使用特权

评论回复
地板
进击的ic| | 2015-7-29 16:28 | 只看该作者
你这个程序地址是每次加4,所以是全字写入的,你定义的基地址是0x00100000不是0x01000000,还有你的地址0x00100000是怎么来得?

使用特权

评论回复
5
进击的ic| | 2015-7-29 16:34 | 只看该作者
如下图,STM32的flash地址是从0x0800 0000开始的,去除程序代码存放的地方,一般数据会放在30K以后,也就是0x0800 7800开始

QQ截图20150729163312.png (89.34 KB )

QQ截图20150729163312.png

使用特权

评论回复
6
direrwind|  楼主 | 2015-7-29 16:50 | 只看该作者
进击的ic 发表于 2015-7-29 16:34
如下图,STM32的flash地址是从0x0800 0000开始的,去除程序代码存放的地方,一般数据会放在30K以后,也就是 ...

改了我写在0x0001FC00,不过读到的数值全是FF FF FF FF....崩溃

使用特权

评论回复
7
进击的ic| | 2015-7-29 17:34 | 只看该作者
呵呵,一步步来,我算是比较幸运没有被flash坑过,给你个我写的stm32的flash驱动程序你参考下

dataflash.zip

2.21 KB

使用特权

评论回复
8
进击的ic| | 2015-7-29 17:45 | 只看该作者
还有flash有读写保护,写之前要打开写保护

使用特权

评论回复
9
direrwind|  楼主 | 2015-7-29 18:29 | 只看该作者
进击的ic 发表于 2015-7-29 17:45
还有flash有读写保护,写之前要打开写保护

感谢分享!! 我再努力看看~

使用特权

评论回复
10
捉虫天师| | 2015-7-29 20:16 | 只看该作者
感谢各位大神d讨论,让我学了很多啊。

使用特权

评论回复
11
direrwind|  楼主 | 2015-7-30 22:21 | 只看该作者
已成功 XDDD

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

23

帖子

1

粉丝