STM32,仿照LL库,编写FLASH的LL库(内有完成代码)(STM32F0)
不知道为为什么,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)相关推荐
- Python语音合成-第三方库(gTTs/pyttsx3/speech)横评(内附使用代码)
Python文字转语音(调研&成品函数) 由于项目需要, 我需要将文字转换为语音, 那么第一步就要进行调研 什么是语音合成技术? 语音合成(text to speech),简称TTS.是将文字 ...
- 基于STM32移植U8g2图形库——OLED显示(HAL库)
前言:本文主要内容为将优秀的图形库U8g2移植到STM32单片机上,用于OLED显示精美UI.其实,目前GitHub上有需要优秀的开源GUI库,但是大部分的GUI解决方案并不适合0.96 OLED(1 ...
- STM32单片机-操作访问内部Flash
目录: 1.STM32 FLASH操作流程 2.Flash基本知识点 3.OK,上干货,上代码 ---------------------------------------------------- ...
- 基于Keil、STM32,用C++编写流水灯程序
关注+星标公众号,不错过精彩内容 作者 | strongerHuang 微信公众号 | 嵌入式专栏 通常来说,在单片机上编程,要么汇编,要么C语言,而用C++进行开发的很少,那么究竟能不能用C++开发 ...
- 基于 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 ...
- STM32 HAL库学习笔记2 HAL库介绍
STM32 HAL库学习笔记2 HAL库介绍 CMSIS标准 一.再次认识HAL库 HAL库设计思想 HAL库实现方式 以GPIO模块为例 GPIO外设数据类型 GPIO外设接口函数 二.使用HAL库 ...
- 【08】STM32·HAL库开发-HAL库介绍 | STM32Cube固件库介绍 | HAL库框架结构 | 如何使用HAL库及使用注意事项
目录 1.初识HAL库(了解) 1.1CMSIS简介 1.2HAL库简介 2.STM32Cube固件包浅析(了解) 2.1如何获取STM32Cube固件包? 2.2STM32Cube固件包文件夹简介 ...
- 在windows程序中嵌入Lua脚本引擎--编写自己的Lua库
在<在windows程序中嵌入Lua脚本引擎--建立一个简易的"云命令"执行的系统>一文中,我提到了使用Lua的ffi库,可以让我们像写C代码一样写lua程序.这是个非 ...
- FPGA之道(30)编写自己的vhdl库文件
文章目录 前言 编写自己的vhdl库文件 Work库 记录数据类型 子程序介绍 函数 过程 子程序使用总结 程序包 自定义程序包范例 前言 本文节选自<FPGA之道>来一起学习下高阶Ver ...
- 在编写flash游戏播放声音时的一个要注意的地方
在编写flash游戏播放声音时的一个要注意的地方 如果该机子没有装声卡,或是声卡有问题,或操作系统如win 2003 server禁用了声卡,或提示没有活动混音器设备可用 播放声音得不到channel ...
最新文章
- 一劳永逸关闭Windwos默认共享
- 任正非在“GTS云与终端云合作与融合进展”汇报会上的讲话
- iOS日常工作之常用宏定义大全
- mysql导入数据,涉及到时间转换,乱码问题解决
- ubuntu一般软件安装在什么目录
- 详细解析WSAAsyncSelect模型
- 培训课程第三期签到和意见发表
- Linux下Wireshark的Lua: Error during loading 和 couldn't run /usr/bin/dumpcap in child process 的解决方案
- php教程mvc,php.MVC教程
- linux利用位置参数数组,Shell编程1_变量、参数和数组
- CentOS安装CAS 5.3.4服务端
- Mentor工具简介
- 实战演习(九)——用python分析科比生涯数据
- torch.optim.SGD参数详解(除nesterov)
- 移动硬盘写入数据报错“MS-DOS功能无效”,或移动硬盘内新建文件夹报错0x8000FFFF灾难性错误
- Java 8:那些Java8的常见写法
- 如何读取或转换PCD点云文件
- Workgroup 协议
- UIPATH 浏览器在新标签页中执行操作
- Java 版植物大战僵尸思路和源码分享!