查看: 7172|回复: 17

[已解决] 求一个KEA64操作EEPROM的例子

[复制链接]

该用户从未签到

4

主题

24

帖子

0

注册会员

Rank: 2

积分
154
最后登录
1970-1-1
发表于 2016-7-21 10:31:10 | 显示全部楼层 |阅读模式
想使用KEAZN64自带的EEPROM来保存一些数据,但是官方找不到相关的例程,在这里希望做过这个的朋友给个例程我参考一下,谢谢!

最佳答案

别拿青春赌明天@ 发表于 2018-12-17 14:01 请问一下,大神您有EEPROM数据读取的程序吗? 读取很简单,直接读地址取数据就行了。 我给你的例程里面就有,比如: *((uint8_t *)(i*16+ch+EEPROM_START_ADDRESS)) ...
回复

使用道具 举报

该用户从未签到

656

主题

6312

帖子

0

超级版主

Rank: 8Rank: 8

积分
20039
最后登录
2024-4-26
发表于 2016-7-21 14:10:57 | 显示全部楼层
如下:
  1. #define EEPROM_START_ADDRESS                0x10000000                        /*!< EEPRON start address*/

  2. /********************************************************************/
  3. int main (void)
  4. {
  5.         char ch;  
  6.     uint32_t i;
  7.     uint8_t  u8DataBuff[512];

  8.                 sysinit();
  9.           printf("\nRunning the EEPROM_demo project.\n");
  10.     LED0_Init();  
  11.     LED2_Init();
  12.     FLASH_Init(BUS_CLK_HZ);
  13.    
  14.     /* Erase 99th sector */
  15.     for( i=0;i<128;i++)
  16.     {
  17.         EEPROM_EraseSector( i*2 + EEPROM_START_ADDRESS);
  18.     }
  19.    
  20.     for(i=0;i<512;i++)
  21.     {
  22.         u8DataBuff[i] = (uint8_t)i;
  23.     }
  24.    
  25.     /* write data to erased sector */
  26.     EEPROM_Program( EEPROM_START_ADDRESS,&u8DataBuff[0],256 );
  27.    
  28.     for( i=0;i<256/16;i++ )
  29.     {
  30.         for(ch =0;ch<16;ch++)
  31.         {
  32.             printf("0x%x,",*((uint8_t *)(i*16+ch+EEPROM_START_ADDRESS)));
  33.         }
  34.         printf("\r\n");
  35.     }
  36.     while(1)
  37.     {
  38.         ch = in_char();
  39.         out_char(ch);
  40.    
  41.     }
  42. }

  43. /*****************************************************************************//*!
  44. +FUNCTION----------------------------------------------------------------
  45. * @function name: RTC_Task
  46. *
  47. * @brief callback routine of RTC driver which does what you want to do at
  48. *        every RTC period.
  49. *        
  50. * @param  none
  51. *
  52. * @return none
  53. *
  54. * @ Pass/ Fail criteria: none
  55. *****************************************************************************/

  56. void RTC_Task(void)
  57. {
  58.     /* toggle LED1 */
  59.     LED0_Toggle();
  60. }
  61. /********************************************************************/
复制代码


回复 支持 反对

使用道具 举报

  • TA的每日心情

    2017-1-4 08:05
  • 签到天数: 11 天

    [LV.3]偶尔看看II

    85

    主题

    1629

    帖子

    1

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    2569

    优秀版主

    最后登录
    2019-3-28
    发表于 2016-7-21 14:31:40 | 显示全部楼层

    现在小恩GG都直接贴代码了,霸气侧漏
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    4

    主题

    24

    帖子

    0

    注册会员

    Rank: 2

    积分
    154
    最后登录
    1970-1-1
     楼主| 发表于 2016-7-21 18:53:40 | 显示全部楼层

    你这个代码不完整啊,相关API函数如何实现?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2016-10-20 09:45
  • 签到天数: 1 天

    [LV.1]初来乍到

    80

    主题

    1038

    帖子

    5

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    2223
    最后登录
    2023-11-20
    发表于 2016-7-22 09:25:46 | 显示全部楼层
    物我两相忘 发表于 2016-7-21 18:53
    你这个代码不完整啊,相关API函数如何实现?

    API函数是官方库里面的,库里面有的
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    4

    主题

    24

    帖子

    0

    注册会员

    Rank: 2

    积分
    154
    最后登录
    1970-1-1
     楼主| 发表于 2016-7-22 09:47:24 | 显示全部楼层
    花溪村长 发表于 2016-7-22 09:25
    API函数是官方库里面的,库里面有的

    请明示哪个官方库?我找了一圈没找到
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    656

    主题

    6312

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    20039
    最后登录
    2024-4-26
    发表于 2016-7-22 10:26:32 | 显示全部楼层
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    4

    主题

    24

    帖子

    0

    注册会员

    Rank: 2

    积分
    154
    最后登录
    1970-1-1
     楼主| 发表于 2016-7-22 23:16:02 | 显示全部楼层
    小恩GG 发表于 2016-7-22 10:26
    http://www.nxp.com/zh-Hans/products/software-and-tools/hardware-development-tools/freedom-developm ...

    现在在RTC中断里实现EEPROM数据擦除并编程后,程序总是会莫名其妙重启,经检查重启的原因是core lockup,请问这个是怎么回事啊?
    我用的程序如下:
    1. void RTC_IRQHandler()
    2. {
    3.         if(++usRegInputBuf[14]>6)
    4.         {
    5.                 usRegInputBuf[14]=0;
    6.                 usRegInputBuf[15]++;
    7.         }
    8.         RTC->SC |= RTC_SC_RTIF_MASK;// clear RTC interrupt flag
    9.         ENTER_CRITICAL_SECTION( );
    10.         FLASH_EraseBlock_NoWait(0,1);
    11.         EEPROM_Program1Byte_NoWait(EEPROM_START_ADDRESS,usRegInputBuf[14]>>8);
    12.         EEPROM_Program1Byte_NoWait(EEPROM_START_ADDRESS+1,usRegInputBuf[14]);
    13.         EEPROM_Program1Byte_NoWait(EEPROM_START_ADDRESS+2,usRegInputBuf[15]>>8);
    14.         EEPROM_Program1Byte_NoWait(EEPROM_START_ADDRESS+3,usRegInputBuf[15]);
    15.         EXIT_CRITICAL_SECTION( );
    16. }
    复制代码


    回复 支持 反对

    使用道具 举报

    该用户从未签到

    656

    主题

    6312

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    20039
    最后登录
    2024-4-26
    发表于 2016-7-25 09:37:02 | 显示全部楼层
    物我两相忘 发表于 2016-7-22 23:16
    现在在RTC中断里实现EEPROM数据擦除并编程后,程序总是会莫名其妙重启,经检查重启的原因是core lockup, ...

    建议你可以先单步调试一下看看是否有找出让MCU reset的规律,同时我想知道ENTER_CRITICAL_SECTION( )和EXIT_CRITICAL_SECTION( );函数具体做了哪些操作
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    4

    主题

    24

    帖子

    0

    注册会员

    Rank: 2

    积分
    154
    最后登录
    1970-1-1
     楼主| 发表于 2016-7-25 22:55:33 | 显示全部楼层
    小恩GG 发表于 2016-7-25 09:37
    建议你可以先单步调试一下看看是否有找出让MCU reset的规律,同时我想知道ENTER_CRITICAL_SECTION( )和EX ...

    试过了,就是RTC中断里对EEPROM的操作导致了程序的复位,将该部分注释后就可以正常运行。
    我目前是打开RTC计时,每隔一段时间后就在RTC中断中对EEPROM擦除并写入四个字节数据,不清楚为何会导致core lockup复位。
    至于ENTER_CRITICAL_SECTION( )和EXIT_CRITICAL_SECTION( )就是关闭总中断和开启总中断,程序里是这样的:
    #define ENTER_CRITICAL_SECTION( ) __disable_irq()
    #define EXIT_CRITICAL_SECTION( )  __enable_irq()

    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-4-28 00:46 , Processed in 0.157247 second(s), 32 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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