打印

求教STM32模拟EEPROM的问题

[复制链接]
3061|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
clz918|  楼主 | 2011-3-30 16:11 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
我用STM32F103RB模拟模拟EEPROM,主函数部分代码如下:
int  main (void)
{
uint8_t i;
uint16_t value=0,index;
u16      data_write=0;
     RCC_Configuration();

  FLASH_Unlock();
  EE_Init();
  for (VarValue = 0; VarValue < 1000; VarValue++)
  {EE_WriteVariable(VirtAddVarTab[0], 6);}

   delay1ms(100);

for(i=0; i<20; i++)
{
    EE_ReadVariable(VirtAddVarTab[0]+i, &testtab1[i]);
}

   RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOC, ENABLE);
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOG, ENABLE);

     NVIC_Configuration();
    Stm32_Gpio_Init();
     UART_Configuration();
   
     for(i=0;i<20;i++)
     {
    usart1_send16bit(testtab1[i]);
    }
while(1)
{
      
}
}

我发现程序在执行EE_WriteVariable或EE_ReadVariable函数时,在两个函数中的
  ValidPage = EE_FindValidPage(WRITE_IN_VALID_PAGE);
  if (ValidPage == NO_VALID_PAGE)
  {
    return  NO_VALID_PAGE;
  }
ValidPage = NO_VALID_PAGE,从而导致函数没有继续执行,也就没有进行读写操作,这是怎么回事啊。
沙发
clz918|  楼主 | 2011-3-31 10:25 | 只看该作者
怎么没人说两句啊,自己顶一下

使用特权

评论回复
板凳
clz918|  楼主 | 2011-4-2 13:34 | 只看该作者
已经解决,最后没用库函数

使用特权

评论回复
地板
Periodic| | 2012-6-8 21:27 | 只看该作者
我也碰到 一样的 问题  感觉函数库有问题

使用特权

评论回复
5
Periodic| | 2012-6-8 21:36 | 只看该作者
static unsigned short EE_FindValidPage(unsigned char Operation)
{
          unsigned short PageStatus0 = 6, PageStatus1 = 6;

         
          PageStatus0 = (*(volatile unsigned short*)PAGE0_BASE_ADDRESS);//获取PAGE0实际状态
          PageStatus1 = (*(volatile unsigned short*)PAGE1_BASE_ADDRESS);//获取PAGE1实际状态

          //读或写操作
          switch (Operation)
          {
            case WRITE_IN_VALID_PAGE:   //写操作
              if (PageStatus1 == VALID_PAGE)//错误在这里//#define VALID_PAGE              ((unsigned short)0x0000)     /* PAGE containing valid data */
              {
                /* 第0页接收数据 */
                if (PageStatus0 == RECEIVE_DATA)
                {
                          return PAGE0;         //PAGE0有效
                }
                else
                {
                          return PAGE1;         //PAGE1有效
                }
              }
              else if (PageStatus0 == VALID_PAGE)
              {
                /* 第1页接收数据 */
                if (PageStatus1 == RECEIVE_DATA)
                {
                          return PAGE1;         //PAGE1有效
                }
                else
                {
                          return PAGE0;         //PAGE0有效
                }
              }
              else
              {
                return NO_VALID_PAGE;   //没有有效的页
              }
//-----------------------------------------------------------------------------------------
                case READ_FROM_VALID_PAGE:  //读操作
              if (PageStatus0 == VALID_PAGE)
              {
                return PAGE0;           //PAGE0有效
              }
              else if (PageStatus1 == VALID_PAGE)
              {
                return PAGE1;           //PAGE1有效
              }
              else
              {
                return NO_VALID_PAGE ;  //没有有效的页
              }
//-----------------------------------------------------------------------------------------
            default:
              return PAGE0;             //PAGE0有效
        }
}

使用特权

评论回复
6
Periodic| | 2012-6-8 21:36 | 只看该作者
static unsigned short EE_FindValidPage(unsigned char Operation)
{
          unsigned short PageStatus0 = 6, PageStatus1 = 6;

         
          PageStatus0 = (*(volatile unsigned short*)PAGE0_BASE_ADDRESS);//获取PAGE0实际状态
          PageStatus1 = (*(volatile unsigned short*)PAGE1_BASE_ADDRESS);//获取PAGE1实际状态

          //读或写操作
          switch (Operation)
          {
            case WRITE_IN_VALID_PAGE:   //写操作
              if (PageStatus1 == VALID_PAGE)//错误在这里//#define VALID_PAGE              ((unsigned short)0x0000)     /* PAGE containing valid data */
              {
                /* 第0页接收数据 */
                if (PageStatus0 == RECEIVE_DATA)
                {
                          return PAGE0;         //PAGE0有效
                }
                else
                {
                          return PAGE1;         //PAGE1有效
                }
              }
              else if (PageStatus0 == VALID_PAGE)
              {
                /* 第1页接收数据 */
                if (PageStatus1 == RECEIVE_DATA)
                {
                          return PAGE1;         //PAGE1有效
                }
                else
                {
                          return PAGE0;         //PAGE0有效
                }
              }
              else
              {
                return NO_VALID_PAGE;   //没有有效的页
              }
//-----------------------------------------------------------------------------------------
                case READ_FROM_VALID_PAGE:  //读操作
              if (PageStatus0 == VALID_PAGE)
              {
                return PAGE0;           //PAGE0有效
              }
              else if (PageStatus1 == VALID_PAGE)
              {
                return PAGE1;           //PAGE1有效
              }
              else
              {
                return NO_VALID_PAGE ;  //没有有效的页
              }
//-----------------------------------------------------------------------------------------
            default:
              return PAGE0;             //PAGE0有效
        }
}

使用特权

评论回复
7
Periodic| | 2012-6-8 21:38 | 只看该作者
本帖最后由 Periodic 于 2012-6-8 21:40 编辑

#define ERASED                  ((unsigned short)0xFFFF)     /* PAGE is empty */
#define RECEIVE_DATA            ((unsigned short)0xEEEE)     /* PAGE is marked to receive data */
#define VALID_PAGE              ((unsigned short)0x0000)     /* PAGE containing valid data */

            case WRITE_IN_VALID_PAGE:   //写操作
              if (PageStatus1 == VALID_PAGE)//错误
              {
                /* 第0页接收数据 */
                if (PageStatus0 == RECEIVE_DATA)
                {
                          return PAGE0;         //PAGE0有效
                }
                else
                {
                          return PAGE1;         //PAGE1有效
                }
              }
              else if (PageStatus0 == VALID_PAGE)//错误
              {
                /* 第1页接收数据 */
                if (PageStatus1 == RECEIVE_DATA)
                {
                          return PAGE1;         //PAGE1有效
                }
                else
                {
                          return PAGE0;         //PAGE0有效
                }
              }
              else
              {
                return NO_VALID_PAGE;   //没有有效的页
              }

使用特权

评论回复
8
Periodic| | 2012-6-8 21:42 | 只看该作者
应该 改成
if (PageStatus1 == ERASED)//正确

这个 库出了那么久 官方没有发现么?:L

使用特权

评论回复
9
Periodic| | 2012-6-8 21:49 | 只看该作者
#define ERASED                  ((unsigned short)0xFFFF)     /* PAGE is empty */

FLASH  默认应该是0XFFFF
#define RECEIVE_DATA            ((unsigned short)0xEEEE)  /* PAGE is marked to receive data */
#define VALID_PAGE              ((unsigned short)0x0000)     /* PAGE containing valid data */

使用特权

评论回复
10
Periodic| | 2012-6-8 21:55 | 只看该作者

使用特权

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

本版积分规则

111

主题

336

帖子

3

粉丝