[文档下载] 新唐MCU读写EEPROM的程序

[复制链接]
8314|13
 楼主| yangxincq 发表于 2014-3-21 14:55 | 显示全部楼层 |阅读模式
最近写了个关于新唐MCU读写EEPROM的程序,给大伙分享一下。

EEPROM演示程序.rar

2.59 KB, 下载次数: 178

clyu 发表于 2014-3-21 15:23 | 显示全部楼层
zxf0168 发表于 2014-3-21 18:50 | 显示全部楼层
这样的帖子要顶,下来看看
niuyaliang 发表于 2014-3-22 07:56 | 显示全部楼层
  1. /*---------------------------------------------------------------------------------------------------------*/
  2. /*                                                                                                         */
  3. /* Copyright(c) 2009 Nuvoton Technology Corp. All rights reserved.                                         */
  4. /* EEPROM演示程序.c                                                                                        */
  5. /*---------------------------------------------------------------------------------------------------------*/
  6. #include <stdio.h>
  7. #include <string.h>
  8. #include "NUC1xx.h"
  9. #include "Driver\DrvGPIO.h"
  10. #include "Driver\DrvSYS.h"
  11. #include "Driver\DrvUART.h"
  12. #include "Driver\DrvADC.h"
  13. #include "Driver/DrvFMC.h"


  14. #ifndef                REGISTER_H


  15. #define                REGISTER_H



  16. //  定时器相关的宏
  17. #define                M_TIMER_TDR0                        (*((volatile unsigned long *)(0x4001000c)))
  18. #define                M_TIMER_TDR1                        (*((volatile unsigned long *)(0x4001002c)))


  19. //  系统时钟相关宏
  20. #define                M_CLKSEL1                        (*((volatile unsigned long *)(0x50000214)))
  21. #define                M_APBCLK                        (*((volatile unsigned long *)(0x50000208)))


  22. //  PWM寄存器相关宏
  23. #define                M_PWM_PPRA                        (*((volatile unsigned long *)(0x40040000)))
  24. #define                M_PWM_CSRA                        (*((volatile unsigned long *)(0x40040004)))
  25. #define                M_PWM_PCRA                        (*((volatile unsigned long *)(0x40040008)))
  26. #define                M_PWM_CNR0                        (*((volatile unsigned long *)(0x4004000C)))
  27. #define                M_PWM_CMR0                        (*((volatile unsigned long *)(0x40040010)))
  28. #define                M_PWM_PDR0                        (*((volatile unsigned long *)(0x40040014)))
  29. #define                M_PWM_CNR1                        (*((volatile unsigned long *)(0x40040018)))
  30. #define                M_PWM_CMR1                        (*((volatile unsigned long *)(0x4004001c)))
  31. #define                M_PWM_PDR1                        (*((volatile unsigned long *)(0x40040020)))
  32. #define                M_PWM_PIERA                        (*((volatile unsigned long *)(0x40040040)))
  33. #define                M_PWM_PIIRA                        (*((volatile unsigned long *)(0x40040044)))
  34. #define                M_PWM_POEA                        (*((volatile unsigned long *)(0x4004007C)))

  35. #define                M_PWM_CCR0A                        (*((volatile unsigned long *)(0x40040050)))
  36. #define                M_PWM_CCR2A                        (*((volatile unsigned long *)(0x40040054)))
  37. #define                M_PWM_CRLR0                        (*((volatile unsigned long *)(0x40040058)))
  38. #define                M_PWM_CRLR1                        (*((volatile unsigned long *)(0x40040060)))
  39. #define                M_PWM_CRLR2                        (*((volatile unsigned long *)(0x40040068)))
  40. #define                M_PWM_CRLR3                        (*((volatile unsigned long *)(0x40040070)))
  41. #define                M_PWM_CFLR0                        (*((volatile unsigned long *)(0x4004005C)))
  42. #define                M_PWM_CFLR1                        (*((volatile unsigned long *)(0x40040064)))
  43. #define                M_PWM_CFLR2                        (*((volatile unsigned long *)(0x4004006C)))
  44. #define                M_PWM_CFLR3                        (*((volatile unsigned long *)(0x40040074)))
  45. #define                M_PWM_CAPENRA                (*((volatile unsigned long *)(0x40040078)))


  46. //  IO口相关宏
  47. #define                M_GPIOA_DOUT                (*((volatile unsigned long *)(0x50004008)))
  48. #define                M_GPIOA_PIN                        (*((volatile unsigned long *)(0x50004010)))
  49. #define                M_GPIOB_DOUT                (*((volatile unsigned long *)(0x50004048)))
  50. #define                M_GPIOB_PIN                        (*((volatile unsigned long *)(0x50004050)))
  51. #define                M_GPIOC_DOUT                (*((volatile unsigned long *)(0x50004088)))
  52. #define                M_GPIOC_PIN                        (*((volatile unsigned long *)(0x50004090)))
  53. #define                M_GPIOD_DOUT                (*((volatile unsigned long *)(0x500040C8)))
  54. #define                M_GPIOD_PIN                        (*((volatile unsigned long *)(0x500040D0)))
  55. #define                M_GPIOE_DOUT                (*((volatile unsigned long *)(0x50004108)))
  56. #define                M_GPIOE_PIN                        (*((volatile unsigned long *)(0x50004110)))


  57. //  串口相关宏
  58. #define                M_UA_FCR_0                        (*((volatile unsigned long *)(0x40050008)))
  59. #define                M_UA_FCR_1                        (*((volatile unsigned long *)(0x40150008)))

  60. //AD相关宏
  61. #define                ADCHER              (*((volatile unsigned long *)(0x400E0024)))      


  62. #endif

  63. uint32_t isp[16];  //用于存放充EEPROM中读取的数据
  64. ////////////////////////////////////////////////////////////////////////////////////////////////////



  65. void SYS_INIT(void)
  66. {
  67.         UNLOCKREG();
  68.         SYSCLK->PWRCON.XTL12M_EN = 1;
  69.         DrvSYS_Delay(100000);

  70.         //设置端口模式
  71.         DrvGPIO_InitFunction(E_FUNC_GPIO);                //设置所有IO为GPIO
  72.        
  73.         DrvGPIO_Open (E_GPA, 0, E_IO_INPUT);        //输入
  74.         DrvGPIO_Open (E_GPA, 1, E_IO_INPUT);        //输入
  75.         DrvGPIO_Open (E_GPA, 2, E_IO_INPUT);        //输入
  76.         DrvGPIO_Open (E_GPA, 3, E_IO_INPUT);        //输入
  77.         DrvGPIO_Open (E_GPA, 4, E_IO_INPUT);        //输入
  78.         DrvGPIO_Open (E_GPA, 5, E_IO_INPUT);        //输入        
  79.         DrvGPIO_Open (E_GPA, 6, E_IO_INPUT);        //输入
  80.         DrvGPIO_Open (E_GPA, 7, E_IO_INPUT);        //输入
  81.         DrvGPIO_Open (E_GPA, 8, E_IO_INPUT);        //输入   
  82.         DrvGPIO_Open (E_GPA, 9, E_IO_INPUT);        //输入
  83.         DrvGPIO_Open (E_GPA, 10, E_IO_INPUT);        //输入
  84.         DrvGPIO_Open (E_GPA, 11, E_IO_INPUT);        //输入
  85.         DrvGPIO_Open (E_GPA, 12, E_IO_INPUT);        //输入
  86.         DrvGPIO_Open (E_GPA, 13, E_IO_INPUT);         //输入           
  87.         DrvGPIO_Open (E_GPA, 14, E_IO_INPUT);         //输入   
  88.         DrvGPIO_Open (E_GPA, 15, E_IO_INPUT);        //输入
  89.        
  90. //        DrvGPIO_Open (E_GPB, 0, E_IO_OUTPUT);
  91. //        DrvGPIO_Open (E_GPB, 1, E_IO_OUTPUT);       
  92.         DrvGPIO_Open (E_GPB, 2, E_IO_OUTPUT);
  93.         DrvGPIO_Open (E_GPB, 3, E_IO_OUTPUT);   
  94. //        DrvGPIO_Open (E_GPB, 4, E_IO_OUTPUT);
  95. //        DrvGPIO_Open (E_GPB, 5, E_IO_OUTPUT);       
  96.         DrvGPIO_Open (E_GPB, 6, E_IO_INPUT);        //输入   
  97.         DrvGPIO_Open (E_GPB, 7, E_IO_INPUT);           //输入
  98.         DrvGPIO_Open (E_GPB, 8, E_IO_INPUT);          //输入
  99.         DrvGPIO_Open (E_GPB, 9, E_IO_OUTPUT);       
  100.         DrvGPIO_Open (E_GPB, 10, E_IO_OUTPUT);   
  101.         DrvGPIO_Open (E_GPB, 11, E_IO_OUTPUT);  
  102.         DrvGPIO_Open (E_GPB, 12, E_IO_INPUT);         //输入
  103.         DrvGPIO_Open (E_GPB, 13, E_IO_INPUT);        //输入        
  104.         DrvGPIO_Open (E_GPB, 14, E_IO_INPUT);        //输入
  105.         DrvGPIO_Open (E_GPB, 15, E_IO_OUTPUT);

  106.         DrvGPIO_Open (E_GPC, 0, E_IO_OUTPUT);   
  107.         DrvGPIO_Open (E_GPC, 1, E_IO_OUTPUT);  
  108.         DrvGPIO_Open (E_GPC, 2, E_IO_OUTPUT);   
  109.         DrvGPIO_Open (E_GPC, 3, E_IO_OUTPUT);   
  110.         DrvGPIO_Open (E_GPC, 4, E_IO_OUTPUT);
  111.         DrvGPIO_Open (E_GPC, 5, E_IO_OUTPUT);       
  112.         DrvGPIO_Open (E_GPC, 6, E_IO_INPUT);        //输入
  113.         DrvGPIO_Open (E_GPC, 7, E_IO_INPUT);        //输入
  114.         DrvGPIO_Open (E_GPC, 8, E_IO_INPUT);        //输入
  115.         DrvGPIO_Open (E_GPC, 9, E_IO_INPUT);        //输入        
  116.         DrvGPIO_Open (E_GPC, 10, E_IO_INPUT);   //输入        
  117.         DrvGPIO_Open (E_GPC, 11, E_IO_OUTPUT);  
  118.         DrvGPIO_Open (E_GPC, 12, E_IO_OUTPUT);
  119.         DrvGPIO_Open (E_GPC, 13, E_IO_OUTPUT);       
  120.         DrvGPIO_Open (E_GPC, 14, E_IO_OUTPUT);
  121.         DrvGPIO_Open (E_GPC, 15, E_IO_OUTPUT);

  122.         DrvGPIO_Open (E_GPE, 0, E_IO_OUTPUT);
  123.         DrvGPIO_Open (E_GPE, 1, E_IO_OUTPUT);       
  124.         DrvGPIO_Open (E_GPE, 2, E_IO_OUTPUT);
  125.         DrvGPIO_Open (E_GPE, 3, E_IO_OUTPUT);
  126.         DrvGPIO_Open (E_GPE, 4, E_IO_OUTPUT);
  127.         DrvGPIO_Open (E_GPE, 5, E_IO_OUTPUT);   

  128. }          


  129. void delay_ms(int16_t i)  
  130. {
  131.         int16_t y;
  132.         for(y=i;y>0;y--)
  133.         {
  134.                 DrvSYS_Delay(1000);           //延迟1ms
  135.         }       
  136. }


  137. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  138. //函数作用: 执行EEPROM的指定页位置的擦除操作   
  139. //函数介绍:    当所在页的相应地址中写过数据时,要再次向该地址写数据时必须擦除该地址所在页;注意只能整体擦除该页
  140. //函数使用:擦除地址u32addr位置为0-127    ,第零页(大小512K);页u32page为0
  141. //                        擦除地址u32addr位置为128-255  ,第一页(大小512K);页u32page为1
  142. //                        擦除地址u32addr位置为256-383  ,第二页(大小512K);页u32page为2
  143. //                        擦除地址u32addr位置为384-511  ,第三页(大小512K);页u32page为3
  144. //                        擦除地址u32addr位置为512-639  ,第四页(大小512K);页u32page为4
  145. //                        擦除地址u32addr位置为640-767  ,第五页(大小512K);页u32page为5
  146. //                        擦除地址u32addr位置为768-895  ,第六页(大小512K);页u32page为6
  147. //                        擦除地址u32addr位置为896-1023 ,第七页(大小512K);页u32page为7
  148. //函数返回值:  无
  149. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  150. void DATA_FLASH_Erase(uint32_t u8page)
  151. {
  152.         __set_PRIMASK(1);//关闭全局中断
  153.         UNLOCKREG();
  154.         DrvFMC_EnableISP();                //使能ISP功能       
  155.         switch(u8page)
  156.         {
  157.                 case 0:        DrvFMC_Erase (0x1F000);break;//擦除第零页, 0x1F000 to 0x1F1FF
  158.                 case 1:        DrvFMC_Erase (0x1F200);break;//擦除第一页, 0x1F200 to 0x1F3FF
  159.                 case 2:        DrvFMC_Erase (0x1F400);break;//擦除第二页, 0x1F400 to 0x1F5FF
  160.                 case 3:        DrvFMC_Erase (0x1F600);break;//擦除第三页, 0x1F600 to 0x1F7FF
  161.                 case 4:        DrvFMC_Erase (0x1F800);break;//擦除第四页, 0x1F800 to 0x1F9FF
  162.                 case 5:        DrvFMC_Erase (0x1FA00);break;//擦除第五页, 0x1FA00 to 0x1FBFF
  163.                 case 6:        DrvFMC_Erase (0x1FC00);break;//擦除第六页, 0x1FC00 to 0x1FDFF
  164.                 case 7:        DrvFMC_Erase (0x1FE00);break;//擦除第七页, 0x1FE00 to 0x1FFFF
  165.                 default:break;
  166.         }       
  167.         DrvFMC_DisableISP();                //禁止ISP功能
  168.         LOCKREG();
  169.         __set_PRIMASK(0);//打开全局中断
  170. }


  171. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  172. //函数作用:执行EEPROM的写操作
  173. //函数介绍:使用该功能之前,先必须将AP ROM中的空间0x0001F000---0x0001FFFF(4k*8BIT)刷为EEPROM用(只针对128K芯片),
  174. //                        页写之前要先将该页全部擦除,共8页。数据分为8*512B(数据为32位128*32)=4096B
  175. //函数使用:写地址u32addr位置为0-127    ,写在第零页0x1F000 to 0x1F1FF (大小512K);数据u32data为32位;
  176. //                        写地址u32addr位置为128-255  ,写在第一页0x1F200 to 0x1F3FF (大小512K);数据u32data为32位;
  177. //                        写地址u32addr位置为256-383  ,写在第二页0x1F400 to 0x1F5FF (大小512K);数据u32data为32位;
  178. //                        写地址u32addr位置为384-511  ,写在第三页0x1F600 to 0x1F7FF (大小512K);数据u32data为32位;
  179. //                        写地址u32addr位置为512-639  ,写在第四页0x1F800 to 0x1F9FF (大小512K);数据u32data为32位;
  180. //                        写地址u32addr位置为640-767  ,写在第五页0x1FA00 to 0x1FBFF (大小512K);数据u32data为32位;
  181. //                        写地址u32addr位置为768-895  ,写在第六页0x1FC00 to 0x1FDFF (大小512K) ;数据u32data为32位;
  182. //                        写地址u32addr位置为896-1023 ,写在第七页0x1FE00 to 0x1FFFF (大小512K) ;数据u32data为32位;
  183. //函数返回值:无
  184. //  
  185. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  186. void DATA_FLASH_Write(uint32_t u32addr,uint32_t u32data)
  187. {          
  188.            __set_PRIMASK(1);//关闭全局中断
  189.            UNLOCKREG();
  190.        DrvFMC_EnableISP();                //使能ISP功能
  191.            DrvFMC_Write ((0x1F000+u32addr*4), u32data);        //写入数据      
  192.        DrvFMC_DisableISP();                //禁止ISP功能
  193.            LOCKREG();
  194.            __set_PRIMASK(0);//打开全局中断
  195. }

  196. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  197. //函数作用: 执行EEPROM的读操作   
  198. //函数介绍: 读取指定位置的数据
  199. //函数使用:u32addr读取地址位置为0-127    ,第零页0x1F000 to 0x1F1FF (大小512K);数据为32位;
  200. //                        u32addr读取地址位置为128-255  ,第一页0x1F200 to 0x1F3FF (大小512K);数据为32位;
  201. //                        u32addr读取地址位置为256-383  ,第二页0x1F400 to 0x1F5FF (大小512K);数据为32位;
  202. //                        u32addr读取地址位置为384-511  ,第三页0x1F600 to 0x1F7FF (大小512K);数据为32位;
  203. //                        u32addr读取地址位置为512-639  ,第四页0x1F800 to 0x1F9FF (大小512K);数据为32位;
  204. //                        u32addr读取地址位置为640-767  ,第五页0x1FA00 to 0x1FBFF (大小512K);数据为32位;
  205. //                        u32addr读取地址位置为768-895  ,第六页0x1FC00 to 0x1FDFF (大小512K) ;数据为32位;
  206. //                        u32addr读取地址位置为896-1023 ,第七页0x1FE00 to 0x1FFFF (大小512K) ;数据为32位;
  207. //函数返回值:  uint32_t  指定位置的数据
  208. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  209. uint32_t DATA_FLASH_Read(uint32_t u32addr)
  210. {
  211.        uint32_t u32data;
  212.            __set_PRIMASK(1);//关闭全局中断
  213.        UNLOCKREG();
  214.        DrvFMC_EnableISP();         //使能ISP功能
  215.        DrvFMC_Read((0x1F000+u32addr*4), &u32data);
  216.        DrvFMC_DisableISP();          //禁止ISP功能
  217.            LOCKREG();
  218.            __set_PRIMASK(0);//打开全局中断
  219.        return u32data;
  220. }


  221. /* EEPROM演示程序 */
  222. int main (void)
  223. {
  224.         SYS_INIT();  
  225.         delay_ms(500);
  226.        
  227.         /*擦除0--7页数据,写之前必须擦除,不然数据会出错*/
  228.         DATA_FLASH_Erase(0);
  229.         DATA_FLASH_Erase(1);
  230.         DATA_FLASH_Erase(2);
  231.         DATA_FLASH_Erase(3);
  232.         DATA_FLASH_Erase(4);
  233.         DATA_FLASH_Erase(5);
  234.         DATA_FLASH_Erase(6);
  235.         DATA_FLASH_Erase(7);
  236.        
  237.         /*向0--7页写数据,每页写头两个,32位*/
  238.         DATA_FLASH_Write(0,1);
  239.         DATA_FLASH_Write(1,2);
  240.        
  241.         DATA_FLASH_Write(128,3);
  242.         DATA_FLASH_Write(129,4);
  243.        
  244.         DATA_FLASH_Write(256,5);
  245.         DATA_FLASH_Write(257,6);
  246.        
  247.         DATA_FLASH_Write(384,1);
  248.         DATA_FLASH_Write(385,2);
  249.        
  250.         DATA_FLASH_Write(512,3);
  251.         DATA_FLASH_Write(513,4);
  252.        
  253.         DATA_FLASH_Write(640,5);
  254.         DATA_FLASH_Write(641,6);
  255.        
  256.         DATA_FLASH_Write(768,3);
  257.         DATA_FLASH_Write(769,4);
  258.        
  259.         DATA_FLASH_Write(896,5);
  260.         DATA_FLASH_Write(897,6);
  261.        
  262.         /*读到isp[]数组中*/
  263.         isp[0]=DATA_FLASH_Read(0);
  264.         isp[1]=DATA_FLASH_Read(1);
  265.        
  266.         isp[2]=DATA_FLASH_Read(128);
  267.         isp[3]=DATA_FLASH_Read(129);

  268.         isp[4]=DATA_FLASH_Read(256);
  269.         isp[5]=DATA_FLASH_Read(257);
  270.        
  271.         isp[6]=DATA_FLASH_Read(384);
  272.         isp[7]=DATA_FLASH_Read(385);
  273.        
  274.         isp[8]=DATA_FLASH_Read(512);
  275.         isp[9]=DATA_FLASH_Read(513);
  276.        
  277.         isp[10]=DATA_FLASH_Read(640);
  278.         isp[11]=DATA_FLASH_Read(641);

  279.         isp[12]=DATA_FLASH_Read(768);
  280.         isp[13]=DATA_FLASH_Read(769);
  281.        
  282.         isp[14]=DATA_FLASH_Read(896);
  283.         isp[15]=DATA_FLASH_Read(897);
  284.        
  285.         while(1);
  286.        
  287. }
niuyaliang 发表于 2014-3-22 07:57 | 显示全部楼层
发现楼主思路很清晰,代码给贴出来,另外楼主还没说用的什么MCU呢
 楼主| yangxincq 发表于 2014-3-22 09:31 | 显示全部楼层
niuyaliang 发表于 2014-3-22 07:57
发现楼主思路很清晰,代码给贴出来,另外楼主还没说用的什么MCU呢

NUC120RE3AN,过奖了,互相学习:)
honda_xio 发表于 2014-4-11 09:27 | 显示全部楼层
详细!!!!棒
szjosun 发表于 2014-4-28 17:22 | 显示全部楼层
顶一个!
2445128978 发表于 2018-6-26 18:17 | 显示全部楼层
怎么用的?
Michael1026 发表于 2021-9-27 00:29 | 显示全部楼层
感谢分享
carpsnow 发表于 2021-10-27 16:46 | 显示全部楼层
那个型号?应该不通用吧~
嵌入小菜菜 发表于 2021-10-27 17:39 | 显示全部楼层
这个确实不错,很棒的帖子,型号是通用的吧。
便携手到老 发表于 2021-10-27 18:31 | 显示全部楼层
这个代码的通用性很强的,不错的。很好,很强大的。
sadicy 发表于 2021-11-11 10:28 | 显示全部楼层
好分享~~感谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

34

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部