[APM32F0] 操作APM32F030片内FLASH,提高自己的LEVEL。

[复制链接]
 楼主| BDW杜兰特 发表于 2022-8-2 17:08 | 显示全部楼层 |阅读模式
#技术资源# #申请原创# #有奖活动# 我们操作单片机的片内FLASH,我们需要首先要知道FLASH是什么。FLASH闪存 闪存的英文名称是"Flash Memory",一般简称为"Flash",它属于内存器件的一种,是一种不挥发性( Non-Volatile )内存。闪存的物理特性与常见的内存有根本性的差异:目前各类 DDR 、 SDRAM 或者 RDRAM 都属于挥发性内存,只要停止电流供应内存中的数据便无法保持,因此每次电脑开机都需要把数据重新载入内存;闪存在没有电流供应的条件下也能够长久地保持数据,其存储特性相当于硬盘,这项特性正是闪存得以成为各类便携型数字设备的存储介质的基础。
操作flash步骤如下:先将FLASH解锁-->清除相关标志位-->擦除页地址-->清除相关标志位-->写入数据-->清除相关标志位-->flash上锁
相关代码如下:
  1. #include "Board.h"
  2. #include "stdio.h"
  3. #include "apm32f0xx_fmc.h"

  4. /** printf function configs to USART2*/
  5. #define DEBUG_USART  USART2
  6. uint32_t testValue_ROM __attribute__((at(0x8001800)))=10;//定义了32位的变量在ROM当中
  7. uint32_t temp;

  8. /** Delay */
  9. void Delay(void);

  10. /*!
  11. * [url=home.php?mod=space&uid=247401]@brief[/url]       Main program
  12. *
  13. * @param       None
  14. *
  15. * @retval      None
  16. *
  17. * @note
  18. */
  19. int main(void)
  20. {
  21.           testValue_ROM++;
  22.     uint32_t addr ;//定义32位的地址数据
  23.    
  24.     APM_MINI_COMInit(COM2);

  25.     /** Unlock Flash for Clear or Write*/
  26.     FMC_Unlock();//解锁FLASH
  27.          
  28.      temp=0x08001800;
  29.            temp++;
  30.    
  31.         FMC_ClearStatusFlag(FMC_FLAG_OC);//清除这些标志位
  32.         FMC_ClearStatusFlag(FMC_FLAG_WPE);
  33.         FMC_ClearStatusFlag(FMC_FLAG_PE);
  34.     addr = 0x08001850;

  35.    
  36.     while(FMC_STATE_BUSY==FMC_ErasePage(addr));//擦除页地址,返回BUSY,等待擦除完成
  37.            FMC_ClearStatusFlag(FMC_FLAG_OC);//再次清理相关标志位
  38.            FMC_ClearStatusFlag(FMC_FLAG_WPE);
  39.            FMC_ClearStatusFlag(FMC_FLAG_PE);

  40.    
  41.     while(FMC_STATE_BUSY==FMC_ProgramWord(0x08001800, temp));//写入32位地址数据,返回BUSY,等待操作完成
  42.                 FMC_ClearStatusFlag(FMC_FLAG_OC);//清除标志位
  43.           FMC_ClearStatusFlag(FMC_FLAG_WPE);
  44.            FMC_ClearStatusFlag(FMC_FLAG_PE);
  45.    
  46.     FMC_Lock();//锁上FLASH

  47.     for (;;)
  48.     {

  49.     }
  50. }

  51. /*!
  52. * @brief       Delay
  53. *
  54. * @param       None
  55. *
  56. * @retval      None
  57. *
  58. * @note
  59. */
  60. void Delay(void)
  61. {
  62.     volatile uint32_t delay = 0xff5;

  63.     while (delay--);
  64. }
  65. /*!
  66. * @brief       Redirect C Library function printf to serial port.
  67. *              After Redirection, you can use printf function.
  68. *
  69. * @param       ch:  The characters that need to be send.
  70. *
  71. * @param       *f:  pointer to a FILE that can recording all information
  72. *              needed to control a stream
  73. *
  74. * @retval      The characters that need to be send.
  75. *
  76. * @note
  77. */
  78. int fputc(int ch, FILE* f)
  79. {
  80.     /** send a byte of data to the serial port */
  81.     USART_TxData(DEBUG_USART, (uint8_t)ch);

  82.     /** wait for the data to be send  */
  83.     while (USART_ReadStatusFlag(DEBUG_USART, USART_FLAG_TXBE) == RESET);

  84.     return (ch);
  85. }

该代码是我改写官方提供的DEMO写的。大家可以参考一下。
最后可以用DEBUG进行调试查找上面代码中0x08001800的地址可以找到,该地址的值已经变为了11,这说明我们已经操作FLASH成功
友情提示一下各位:有些小伙伴会碰见写入FLASH字节出现卡死的现象,单字节写入正常,双字节写入和多字节写入导致MCU死机,复位也没有效果,需要重新上电才会恢复正常。导致这种问题的原因是写入的地址没有对齐,导致FLASH卡死。

caigang13 发表于 2022-8-2 19:29 来自手机 | 显示全部楼层
学习了,谢谢分享经验。
daichaodai 发表于 2022-8-4 19:41 来自手机 | 显示全部楼层
这个算不算提高呢?
chenqianqian 发表于 2022-8-5 08:09 来自手机 | 显示全部楼层
能不能提高不知道
麻花油条 发表于 2022-8-5 11:31 来自手机 | 显示全部楼层
提没提高自己的level不知道
MessageRing 发表于 2022-10-4 20:51 | 显示全部楼层
不知道算不算提高
jackcat 发表于 2022-11-1 09:42 | 显示全部楼层
换APM32的另一个型号的芯片 APM32E103VCT6
wangdezhi 发表于 2022-11-1 16:59 | 显示全部楼层
如何将APM32F072变量存储到片内flash的指定位置
alvpeg 发表于 2022-11-1 17:44 | 显示全部楼层
会触发HardFault,怎么解决   
bartonalfred 发表于 2022-11-1 18:12 | 显示全部楼层
https://download.csdn.net/download/wenjie2017/85911120
ccook11 发表于 2022-11-1 20:12 | 显示全部楼层
改写芯片内部Flash函数:写前关闭总中断,写后再打开总中断
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

22

帖子

0

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

8

主题

22

帖子

0

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