不知道为为什么,STM32 LL库并没有FLASH的库函数,于是决定写一个

LL库的特色,就是一个函数,只占用一个指令周期,比如,设置GPIO输出的状态,就是LL_GPIO_SetOutputPin();

__STATIC_INLINE void LL_GPIO_SetOutputPin(GPIO_TypeDef *GPIOx, uint32_t PinMask)
{WRITE_REG(GPIOx->BSRR, PinMask);
}

于是我根据这种风格,已经常用的操作写了一个.h和.c文件

头文件代码

#ifndef __STM32F0xx_LL_FLASH_EX_H
#define __STM32F0xx_LL_FLASH_EX_H#include "stm32f0xx.h"#define FLASH_FLAG_BSY             FLASH_SR_BSY            /*!< FLASH Busy flag                           */
#define FLASH_FLAG_PGERR           FLASH_SR_PGERR          /*!< FLASH Programming error flag    */
#define FLASH_FLAG_WRPERR          FLASH_SR_WRPERR         /*!< FLASH Write protected error flag          */
#define FLASH_FLAG_EOP             FLASH_SR_EOP            /*!< FLASH End of Operation flag               */#define FLASH_TYPEERASE_PAGES          FLASH_CR_PER         /*!< FLASH_CR_PER          */
#define FLASH_TYPEERASE_MASSERASE      FLASH_CR_MER            /*!< MASSERASE              */#if defined(STM32F030x6) || defined(STM32F030x8) || defined(STM32F031x6) || defined(STM32F038xx) \|| defined(STM32F051x8) || defined(STM32F042x6) || defined(STM32F048xx) || defined(STM32F058xx) || defined(STM32F070x6)
#define FLASH_PAGE_SIZE          0x400U
#endif /* STM32F030x6 || STM32F030x8 || STM32F031x6 || STM32F051x8 || STM32F042x6 || STM32F048xx || STM32F058xx || STM32F070x6 */#if defined(STM32F071xB) || defined(STM32F072xB) || defined(STM32F078xx) || defined(STM32F070xB) \|| defined(STM32F091xC) || defined(STM32F098xx) || defined(STM32F030xC)
#define FLASH_PAGE_SIZE          0x800U
#endif /* STM32F071xB || STM32F072xB || STM32F078xx || STM32F091xC || STM32F098xx || STM32F030xC */typedef enum {ProgaraType_DATA64,ProgaraType_DATA32,ProgaraType_DATA16
}ProgaramDataType;typedef enum {\FLASH_Lock=1U,Flash_Unlock=!FLASH_Lock\
}FlashStates;/* Set the OBL_Launch bit to launch the option byte loading */
__STATIC_INLINE void LL_FLASH_SET_OBL_Launch(FLASH_TypeDef *FLASHx)
{SET_BIT(FLASHx->CR, FLASH_CR_OBL_LAUNCH);
}
__STATIC_INLINE void LL_FLASH_Lock(FLASH_TypeDef *FLASHx)
{SET_BIT(FLASHx->CR, FLASH_CR_LOCK);
}/* @brief  Set flash erase type.* @param  FLASH_TYPEERASE specifies the FLASH flags to clear.*          This parameter can be any combination of the following values:*            @arg @ref FLASH_TYPEERASE_PAGES         PAGES Erase*            @arg @ref FLASH_TYPEERASE_MASSERASE      FLASH Write protected error flag * @retval none*/__STATIC_INLINE void LL_FLASH_SetTypeErase(FLASH_TypeDef *FLASHx,uint32_t FLASH_TYPEERASE)
{SET_BIT(FLASHx->CR, FLASH_TYPEERASE);
}/* @brief  Set flash erase ADDR.*          This parameter can be any combination of the following values:*            @arg @ref EraseADDR         uint32_t value* @retval none*/__STATIC_INLINE void LL_FLASH_SetEraseADDR(FLASH_TypeDef *FLASHx,uint32_t EraseADDR)
{WRITE_REG(FLASHx->AR, EraseADDR);
}/* @brief  Set flash erase ADDR.*          This parameter can be any combination of the following values:*            @arg @ref EraseADDR         uint32_t value* @retval none*/__STATIC_INLINE void LL_FLASH_StartErase(FLASH_TypeDef *FLASHx)
{SET_BIT(FLASHx->CR, FLASH_CR_STRT);
}/* @brief  Clear the specified FLASH flag.* @param  __FLAG__ specifies the FLASH flags to clear.*          This parameter can be any combination of the following values:*            @arg @ref FLASH_FLAG_EOP         FLASH End of Operation flag *            @arg @ref FLASH_FLAG_WRPERR      FLASH Write protected error flag *            @arg @ref FLASH_FLAG_PGERR       FLASH Programming error flag* @retval none*/__STATIC_INLINE void LL_FLASH_ClearFlag(FLASH_TypeDef *FLASHx,uint32_t STATE_FLAG)
{WRITE_REG(FLASHx->SR, STATE_FLAG);
}/*get bit flash bsy*/
__STATIC_INLINE uint32_t LL_FLASH_IsActiveFlag_BSY(FLASH_TypeDef *FLASHx)
{return (READ_BIT(FLASHx->SR, FLASH_SR_BSY) == (FLASH_SR_BSY));
}
/*get end of operation bilt*/
__STATIC_INLINE uint32_t LL_FLASH_IsActiveFlag_EOP(FLASH_TypeDef *FLASHx)
{return (READ_BIT(FLASHx->SR, FLASH_SR_EOP) == (FLASH_SR_EOP));
}
/*clear end of operation bilt*/
__STATIC_INLINE void LL_FLASH_ClearFlag_EOP(FLASH_TypeDef *FLASHx)
{SET_BIT(FLASHx->SR, FLASH_SR_EOP);//EOP bit Set clear
}/* @brief  Set flash erase type.* @param  FLASH_TYPEERASE specifies the FLASH flags to clear.*          This parameter can be any combination of the following values:*            @arg @ref FLASH_TYPEERASE_PAGES         PAGES Erase*            @arg @ref FLASH_TYPEERASE_MASSERASE      FLASH Write protected error flag * @retval none*/
__STATIC_INLINE void LL_FLASH_DisenableErase(FLASH_TypeDef *FLASHx,uint32_t FLASH_TYPEERASE)
{CLEAR_BIT(FLASHx->CR, FLASH_TYPEERASE);
}/*EnableProgram*/
__STATIC_INLINE void LL_FLASH_EnableProgram(FLASH_TypeDef *FLASHx)
{SET_BIT(FLASHx->CR,FLASH_CR_PG);
}
/*DisenableProgram*/
__STATIC_INLINE void LL_FLASH_DisenableProgram(FLASH_TypeDef *FLASHx)
{CLEAR_BIT(FLASHx->CR,FLASH_CR_PG);
}
/*read flash's states of lock or unlock*/
__STATIC_INLINE FlashStates LL_FLASH_LockState(FLASH_TypeDef *FLASHx)
{return (FlashStates)(READ_BIT(FLASHx->CR,FLASH_CR_LOCK));
}
/*set key for flash*/
__STATIC_INLINE void LL_FLASh_SetKey(FLASH_TypeDef *FLASHx,uint32_t key)
{WRITE_REG(FLASH->KEYR,key);
}LL_StatusTypeDef LL_Flash_Unlock(void);
LL_StatusTypeDef LL_Flash_PageErase(uint32_t page_addr,uint16_t NbPages);
LL_StatusTypeDef LL_FLASH_Program(ProgaramDataType ProgramType,uint32_t flash_addr,uint64_t data);
#endif

C文件代码

#include "stm32f0xx_ll_flash_ex.h"void static LL_FLASH_Program_TwoBtye(uint32_t flash_addr,uint16_t data)
{LL_FLASH_EnableProgram(FLASH);*(__IO uint16_t*)(flash_addr) = data;
}LL_StatusTypeDef LL_Flash_Unlock(void)
{while (LL_FLASH_IsActiveFlag_BSY(FLASH))  {} if (LL_FLASH_LockState(FLASH)) { LL_FLASh_SetKey(FLASH,FLASH_KEY1);LL_FLASh_SetKey(FLASH,FLASH_KEY2);}return LL_OK;
}LL_StatusTypeDef LL_Flash_PageErase(uint32_t page_addr,uint16_t Nb)
{uint32_t End_addr =  10* FLASH_PAGE_SIZE +page_addr;uint32_t Start_addr = page_addr;for(;Start_addr < End_addr;(Start_addr += FLASH_PAGE_SIZE)){LL_FLASH_SetTypeErase(FLASH,FLASH_TYPEERASE_PAGES);LL_FLASH_SetEraseADDR(FLASH,Start_addr);LL_FLASH_StartErase(FLASH); while (LL_FLASH_IsActiveFlag_BSY(FLASH)) { } if (LL_FLASH_IsActiveFlag_EOP(FLASH)) { LL_FLASH_ClearFlag_EOP(FLASH);; } else{ return LL_ERROR;}LL_FLASH_DisenableErase(FLASH,FLASH_TYPEERASE_PAGES);}return LL_OK;
}LL_StatusTypeDef LL_FLASH_Program(ProgaramDataType ProgramType,uint32_t flash_addr,uint64_t data)
{uint8_t index = 0U;uint8_t nbiterations = 0U;if(ProgramType == ProgaraType_DATA16)nbiterations = 1U;else if(ProgramType == ProgaraType_DATA32)nbiterations = 2U;elsenbiterations = 4U;for(index = 0U; index < nbiterations; index++){LL_FLASH_Program_TwoBtye((flash_addr + (2U*index)), (uint16_t)(data >> (16U*index)));}while (LL_FLASH_IsActiveFlag_BSY(FLASH)) {}if (LL_FLASH_IsActiveFlag_EOP(FLASH))  {LL_FLASH_ClearFlag_EOP(FLASH);}else{return LL_ERROR;}LL_FLASH_DisenableProgram(FLASH);return LL_OK;
}

STM32,仿照LL库,编写FLASH的LL库(内有完成代码)(STM32F0)相关推荐

  1. Python语音合成-第三方库(gTTs/pyttsx3/speech)横评(内附使用代码)

    Python文字转语音(调研&成品函数) 由于项目需要, 我需要将文字转换为语音, 那么第一步就要进行调研 什么是语音合成技术? 语音合成(text to speech),简称TTS.是将文字 ...

  2. 基于STM32移植U8g2图形库——OLED显示(HAL库)

    前言:本文主要内容为将优秀的图形库U8g2移植到STM32单片机上,用于OLED显示精美UI.其实,目前GitHub上有需要优秀的开源GUI库,但是大部分的GUI解决方案并不适合0.96 OLED(1 ...

  3. STM32单片机-操作访问内部Flash

    目录: 1.STM32 FLASH操作流程 2.Flash基本知识点 3.OK,上干货,上代码 ---------------------------------------------------- ...

  4. 基于Keil、STM32,用C++编写流水灯程序

    关注+星标公众号,不错过精彩内容 作者 | strongerHuang 微信公众号 | 嵌入式专栏 通常来说,在单片机上编程,要么汇编,要么C语言,而用C++进行开发的很少,那么究竟能不能用C++开发 ...

  5. 基于 STM32对音频数据的 Flash 读取与 DAC 播放

    目录 1 项目准备1.1 具体要求 1.2 项目环境 2 原理简介 2.1 STM32 的内部 FLASH 2.2 STM32 的 DAC 通道2.2.1 何为 DAC 2.2.2 STM32 的 D ...

  6. STM32 HAL库学习笔记2 HAL库介绍

    STM32 HAL库学习笔记2 HAL库介绍 CMSIS标准 一.再次认识HAL库 HAL库设计思想 HAL库实现方式 以GPIO模块为例 GPIO外设数据类型 GPIO外设接口函数 二.使用HAL库 ...

  7. 【08】STM32·HAL库开发-HAL库介绍 | STM32Cube固件库介绍 | HAL库框架结构 | 如何使用HAL库及使用注意事项

    目录 1.初识HAL库(了解) 1.1CMSIS简介 1.2HAL库简介 2.STM32Cube固件包浅析(了解) 2.1如何获取STM32Cube固件包? 2.2STM32Cube固件包文件夹简介 ...

  8. 在windows程序中嵌入Lua脚本引擎--编写自己的Lua库

    在<在windows程序中嵌入Lua脚本引擎--建立一个简易的"云命令"执行的系统>一文中,我提到了使用Lua的ffi库,可以让我们像写C代码一样写lua程序.这是个非 ...

  9. FPGA之道(30)编写自己的vhdl库文件

    文章目录 前言 编写自己的vhdl库文件 Work库 记录数据类型 子程序介绍 函数 过程 子程序使用总结 程序包 自定义程序包范例 前言 本文节选自<FPGA之道>来一起学习下高阶Ver ...

  10. 在编写flash游戏播放声音时的一个要注意的地方

    在编写flash游戏播放声音时的一个要注意的地方 如果该机子没有装声卡,或是声卡有问题,或操作系统如win 2003 server禁用了声卡,或提示没有活动混音器设备可用 播放声音得不到channel ...

最新文章

  1. 一劳永逸关闭Windwos默认共享
  2. 任正非在“GTS云与终端云合作与融合进展”汇报会上的讲话
  3. iOS日常工作之常用宏定义大全
  4. mysql导入数据,涉及到时间转换,乱码问题解决
  5. ubuntu一般软件安装在什么目录
  6. 详细解析WSAAsyncSelect模型
  7. 培训课程第三期签到和意见发表
  8. Linux下Wireshark的Lua: Error during loading 和 couldn't run /usr/bin/dumpcap in child process 的解决方案
  9. php教程mvc,php.MVC教程
  10. linux利用位置参数数组,Shell编程1_变量、参数和数组
  11. CentOS安装CAS 5.3.4服务端
  12. Mentor工具简介
  13. 实战演习(九)——用python分析科比生涯数据
  14. torch.optim.SGD参数详解(除nesterov)
  15. 移动硬盘写入数据报错“MS-DOS功能无效”,或移动硬盘内新建文件夹报错0x8000FFFF灾难性错误
  16. Java 8:那些Java8的常见写法
  17. 如何读取或转换PCD点云文件
  18. Workgroup 协议
  19. UIPATH 浏览器在新标签页中执行操作
  20. Java 版植物大战僵尸思路和源码分享!

热门文章

  1. gulp在工作中的应用
  2. Qt网络文件加密处理断点续传多文件下载器bt开源种子下载器分析附下载
  3. 游戏开发bug解决思路
  4. 做数据分析,一定会用到的12类实用图表
  5. 工作组计算机设置网络密码,设置访问工作组计算机需要密码问题
  6. android stop 服务,当调用stopService方法时服务不会停止
  7. 利用Python创建一个游戏窗口
  8. 国内多家视频下载网站关闭:或为暂避风头
  9. 中兴java笔试题_中兴Java 笔试题.doc
  10. 剖析锂电池的工作原理