首页 > 其他分享 >CH32F103C8T6修改HAL库实现内部FLASH快速读写

CH32F103C8T6修改HAL库实现内部FLASH快速读写

时间:2023-07-26 09:49:36浏览次数:35  
标签:CH32F103C8T6 HAL FLASH Fast Address CR uint32 define

1、在stm32f103xe.h 文件中,在FLASH_TypeDef 结构体中,增加MODEKEYR 成员定义。
修改后如下图所示:

2、目前CH32F103 的FLASH 最大为64K,在chflash.c文件中,修改ValidAddrEnd。
修改后如下图所示:

注:大容量芯片可以相应修改ValidAddrEnd的“0x10000”数据即可

3、上述步骤完成后,即可执行单次128字节的编程,编写Flash_Test_Fast()函数,测试单次128字节编程。

备注:
chflash.c文件

  
#include "chflash.h"
#include "delay.h"
#include "usart.h"

define ACR_LATENCY_Mask ((uint32_t)0x00000038)

define ACR_HLFCYA_Mask ((uint32_t)0xFFFFFFF7)

define ACR_PRFTBE_Mask ((uint32_t)0xFFFFFFEF)

/* Flash Access Control Register bits */

define ACR_PRFTBS_Mask ((uint32_t)0x00000020)

/* Flash Control Register bits */

define CR_PG_Set ((uint32_t)0x00000001)

define CR_PG_Reset ((uint32_t)0x00001FFE)

define CR_PER_Set ((uint32_t)0x00000002)

define CR_PER_Reset ((uint32_t)0x00001FFD)

define CR_MER_Set ((uint32_t)0x00000004)

define CR_MER_Reset ((uint32_t)0x00001FFB)

define CR_OPTPG_Set ((uint32_t)0x00000010)

define CR_OPTPG_Reset ((uint32_t)0x00001FEF)

define CR_OPTER_Set ((uint32_t)0x00000020)

define CR_OPTER_Reset ((uint32_t)0x00001FDF)

define CR_STRT_Set ((uint32_t)0x00000040)

define CR_LOCK_Set ((uint32_t)0x00000080)

define CR_PAGE_PG ((uint32_t)0x00010000)

define CR_PAGE_ER ((uint32_t)0x00020000)

define CR_BUF_LOAD ((uint32_t)0x00040000)

define CR_BUF_RST ((uint32_t)0x00080000)

/* FLASH Status Register bits */

define SR_BSY ((uint32_t)0x00000001)

define SR_PGERR ((uint32_t)0x00000004)

define SR_WRPRTERR ((uint32_t)0x00000010)

define SR_EOP ((uint32_t)0x00000020)

/* FLASH Mask */

define RDPRT_Mask ((uint32_t)0x00000002)

define WRP0_Mask ((uint32_t)0x000000FF)

define WRP1_Mask ((uint32_t)0x0000FF00)

define WRP2_Mask ((uint32_t)0x00FF0000)

define WRP3_Mask ((uint32_t)0xFF000000)

define OB_USER_BFB2 ((uint16_t)0x0008)

/* FLASH Keys */

define RDP_Key ((uint16_t)0x00A5)

//#define FLASH_KEY1 ((uint32_t)0x45670123)
//#define FLASH_KEY2 ((uint32_t)0xCDEF89AB)

/* FLASH BANK address */

define FLASH_BANK1_END_ADDRESS ((uint32_t)0x807FFFF)

/* Delay definition */

define EraseTimeout ((uint32_t)0x000B0000)

define ProgramTimeout ((uint32_t)0x00002000)

/* Flash Program Vaild Address */

define ValidAddrStart (FLASH_BASE)

define ValidAddrEnd (FLASH_BASE + 0x10000)

/*********************************************************************

  • @fn FLASH_Unlock_Fast

  • @brief Unlocks the Fast Program Erase Mode.

  • @return none
    /
    void FLASH_Unlock_Fast( void )
    {
    /
    Authorize the FPEC of Bank1 Access */
    FLASH->KEYR = FLASH_KEY1;
    FLASH->KEYR = FLASH_KEY2;

    /* Fast program mode unlock */
    FLASH->MODEKEYR = FLASH_KEY1;
    FLASH->MODEKEYR = FLASH_KEY2;
    }

/*********************************************************************

  • @fn FLASH_Lock_Fast
  • @brief Locks the Fast Program Erase Mode.
  • @return none
    */
    void FLASH_Lock_Fast( void )
    {
    FLASH->CR |= CR_LOCK_Set;
    }

/*********************************************************************

  • @fn FLASH_Unlock_Fast
  • @brief Unlocks the Fast Program Erase Mode.
  • @return none
    */
    void FLASH_BufReset( void )
    {
    FLASH->CR |= CR_PAGE_PG;
    FLASH->CR |= CR_BUF_RST;
    while( FLASH->SR & SR_BSY );
    FLASH->CR &= ~CR_PAGE_PG;
    }

/*********************************************************************

  • @fn FLASH_BufLoad

  • @brief Flash Buffer load(128 bit).

  • @param Address - specifies the address to be programmed.

  •      Data0 - specifies the data0 to be programmed.
    
  •      Data1 - specifies the data1 to be programmed.
    
  •      Data2 - specifies the data2 to be programmed.
    
  •      Data3 - specifies the data3 to be programmed.
    
  • @return none
    */
    void FLASH_BufLoad( uint32_t Address, uint32_t Data0, uint32_t Data1, uint32_t Data2, uint32_t Data3 )
    {
    if( ( Address >= ValidAddrStart ) && ( Address < ValidAddrEnd ) )
    {
    FLASH->CR |= CR_PAGE_PG;
    *( __IO uint32_t * )( Address + 0x00 ) = Data0;
    *( __IO uint32_t * )( Address + 0x04 ) = Data1;
    *( __IO uint32_t * )( Address + 0x08 ) = Data2;
    *( __IO uint32_t * )( Address + 0x0C ) = Data3;
    FLASH->CR |= CR_BUF_LOAD;
    while( FLASH->SR & SR_BSY );
    FLASH->CR &= ~CR_PAGE_PG;

     *( __IO uint32_t * )0x40022034 = *( __IO uint32_t * )( Address ^ 0x00000100 );
    

    }
    }

/*********************************************************************

  • @fn FLASH_ErasePage_Fast

  • @brief Erases a specified FLASH page (1page = 256Byte).

  • @param Page_Address - The page address to be erased.

  • @return none
    */
    void FLASH_ErasePage_Fast( uint32_t Page_Address )
    {
    if( ( Page_Address >= ValidAddrStart ) && ( Page_Address < ValidAddrEnd ) )
    {
    FLASH->CR |= CR_PAGE_ER;
    FLASH->AR = Page_Address;
    FLASH->CR |= CR_STRT_Set;
    while( FLASH->SR & SR_BSY );
    FLASH->CR &= ~CR_PAGE_ER;

     *( __IO uint32_t * )0x40022034 = *( __IO uint32_t * )( Page_Address ^ 0x00000100 );
    

    }
    }

/*********************************************************************

  • @fn FLASH_ProgramPage_Fast

  • @brief Program a specified FLASH page (1page = 256Byte).

  • @param Page_Address - The page address to be programed.

  • @return none
    */
    void FLASH_ProgramPage_Fast( uint32_t Page_Address )
    {
    if( ( Page_Address >= ValidAddrStart ) && ( Page_Address < ValidAddrEnd ) )
    {
    FLASH->CR |= CR_PAGE_PG;
    FLASH->AR = Page_Address;
    FLASH->CR |= CR_STRT_Set;
    while( FLASH->SR & SR_BSY );
    FLASH->CR &= ~CR_PAGE_PG;

     *( __IO uint32_t * )0x40022034 = *( __IO uint32_t * )( Page_Address ^ 0x00000100 );
    

    }
    }

chflash.h文件

    
#ifndef __CHFLASH_H__
#define __CHFLASH_H__
#include "sys.h"  

define FLASH_SAVE_ADDR 0x0800FC00 //ÉèÖÃFLASH ±£´æµØÖ·(±ØÐëΪżÊý£¬ÇÒÆäÖµÒª´óÓÚ±¾´úÂëËùÕ¼ÓÃFLASHµÄ´óС+0X08000000)

void Flash_Test_Fast( void );

endif

标签:CH32F103C8T6,HAL,FLASH,Fast,Address,CR,uint32,define
From: https://www.cnblogs.com/SymPny/p/17581603.html

相关文章

  • 基于32位Cortex®-M4内核MK26FN2M0VMI18、MK22FN256VMP12、MK22FN512VLL12 180MHz/120
    一、MK26FN2M0VMI18KinetisK2032位微控制器是一款低功耗MCU,通过智能片上集成节省了大量BOM。该MCU基于Arm®Cortex®-M4核心,提供完整和可选的高速USB2.0(OTG控制器),包括无晶器件功能选项。此器件具有2MB的闪存,256KB的SRAM和多达2个USB控制器。详细描述:ARM®Cortex®-M4Kine......
  • Moon-halo简谱-歌词
    title:Moonhalo简谱+歌词author:枷锁云-星尘avatar:https://pic.rmb.bdstatic.com/bjh/4d0bc5251b0b8744c872e9021acea141.pngcomments:truedate:2023-05-0815:11:36categories:心晴日迹tags:心晴日迹top_img:cover:最近有点小感伤,或许是因为父母的,也或许是......
  • calico报错son: cannot unmarshal string into Go struct field NetConf.mtu of type
     于是describe查看宿主机的配置文件查看日志没有相关日志查看calico的相关配置文件值找到于是想着直接去修改calico的Configmap发现修改不成功便去查询宿主机映射的calico挂载文件把标记部分的string给成int去掉双引号,然后重启calico然后通过ansible分发到每台机器上an......
  • XILINX SDK烧录FLASH报错不支持旧版hw_server
    最近频繁遇到SDK报错,说是不支持hw_server旧版本,此时打开vivado识别的时候也是一样报错,可能原因是我电脑安装了多个版本的VIVADO导致的,那么怎么解决呢?打开任务管理器,killhw_server即可。......
  • 和鲸 ModelWhale 与麒麟系统适配认证,打造自主安全、性能可靠的信创 AI 基础软件
    发展信创,解决核心技术的自主可控问题,是我国产业升级和数字经济发展过程中的重要命题。信创产业链主要由基础硬件、基础软件、应用软件、信息安全及云计算平台等几部分组成,拥抱信创国产化需要各厂商聚力共创生态,增强自身产品的兼容性,实现上下游有效连接。而和鲸科技作为国内领先的数......
  • Datawhale
    第一期科大讯飞锂离子电池生产参数调控及生产温度预测挑战赛1.赛题介绍1.1任务要求初赛任务:初赛提供了电炉17个温区的实际生产数据,分别是电炉上部17组加热棒设定温度T1-1~T1-17,电炉下部17组加热棒设定温度T2-1~T2-17,底部17组进气口的设定进气流量V1-V17,选手需要根据提......
  • python 调用halcon
    Python调用HalconHalcon是一种功能强大的机器视觉库,提供了丰富的图像处理和分析工具。在本文中,我们将介绍如何使用Python调用Halcon库,并展示一些常见的图像处理任务的示例代码。安装Halcon库在开始之前,我们需要先安装Halcon库。Halcon提供了Python的接口,可以通过pip命令进行安装......
  • STM32F103内部FLASH及地址表
    在我们应用开发时,经常会有一些程序运行参数需要保存,如一些修正系数。这些数据的特点是:数量少而且不需要经常修改,但又不能定义为常量,因为每台设备可能不一样而且在以后还有修改的可能。将这类数据存在指定的位置,需要修改时直接修改存储位置的数值,需要使用时则直接读取,会是一种......
  • STM32HAL库使用SPI驱动1.44寸TFTLCD
      关于STM32F4单片机,使用HAL库自带的SPI,驱动TFTLCD屏幕的资料网上好像不太多,正好最近我做了这项工作,把成果分享给大家。我的代码实现了这些功能:任意坐标画点,指定首尾坐标画线,画方框,指定区域显示彩图,显示16*16或者12*12的汉字、ASCII码,并附带ASCII码表与少量的汉字字库。......
  • 斯坦福博士一己之力让Attention提速9倍!FlashAttention燃爆显存,Transformer上下文长度
    前言 FlashAttention新升级!斯坦福博士一人重写算法,第二代实现了最高9倍速提升。本文转载自新智元仅用于学术分享,若侵权请联系删除欢迎关注公众号CV技术指南,专注于计算机视觉的技术总结、最新技术跟踪、经典论文解读、CV招聘信息。CV各大方向专栏与各个部署框架最全教程整理......