通过对stm32内部的flash的读写可以实现对stm32的编程操作。
stm32 的内置可编程Flash在许多场合具有十分重要的意义。如其支持ICP特性使得开发人员对stm32可以警醒调试开发,可以通过JTAG和SWD接口对stm32进行程序烧写;支持IAP特性使得开发人员可以在stm32运行程序的时候对其内部程序进行更新操作。对一些对数据安全有要求的场合,可编程FLASH可以结合stm32内部唯一的身份标识实现各种各样的防破解方案。并且stm32的FLASH在一些轻量级的防掉电存储方案中也有立足之地。
stm32的FLASH分为主存储块和信息块。主存储块用于保存具体的程序代码和用户数据,信息块用于负责由stm32出厂是放置2KB的启动程序(Bootloader)和512B的用户配置信息区。
主存储块是以页为单位划分的,一页大小为1KB。范围为从地址0x08000000开始的128KB内。
对Flash 的写入操作要 “先擦除后写入”的原则;
stm32的内置flash 编程操作都是以页为单位写入的,而写入的操作必须要以16位半字宽度数据位单位,允许跨页写,写入非16位数据时将导致stm32内部总线错误。
进行内置flash读写时,必须要打开内部Rc振荡器。
main.c:
001 | #include
"stm32f10x.h" |
006 | void RCC_Configuration(void); |
007 | void GPIO_Configuration(void); |
008 | void USART_Configuration(void); |
012 | u16
data[5]={0x0001,0x0002,0x0003,0x0004,0x0005}; |
017 | GPIO_Configuration(); |
018 | USART_Configuration(); |
024 | FLASH_ClearFlag(FLASH_FLAG_EOP|FLASH_FLAG_PGERR|FLASH_FLAG_WRPRTERR); |
026 | FLASH_ErasePage(0x8002000); |
030 | FLASH_ProgramHalfWord((0x8002000
+count*2),data[count]); //flash
为一个字节存储,16位数据必须地址加2 |
040 | printf("\r\n
The Five Data Is : \r\n"); |
045 | printf("\r
%d \r",*(u8
*)(0x8002000 + count*2)); //读取方法 |
056 | void GPIO_Configuration(void) |
058 | GPIO_InitTypeDef
GPIO_InitStructure; |
060 | GPIO_InitStructure.GPIO_Speed
= GPIO_Speed_50MHz; |
062 | GPIO_InitStructure.GPIO_Pin
= GPIO_Pin_9; |
063 | GPIO_InitStructure.GPIO_Mode
= GPIO_Mode_AF_PP; |
064 | GPIO_Init(GPIOA
, &GPIO_InitStructure); |
066 | GPIO_InitStructure.GPIO_Pin
= GPIO_Pin_10; |
067 | GPIO_InitStructure.GPIO_Mode
= GPIO_Mode_IN_FLOATING; |
068 | GPIO_Init(GPIOA
, &GPIO_InitStructure); |
071 | void RCC_Configuration(void) |
073 | /*
定义枚举类型变量 HSEStartUpStatus */ |
074 | ErrorStatus
HSEStartUpStatus; |
079 | RCC_HSEConfig(RCC_HSE_ON); |
081 | HSEStartUpStatus
= RCC_WaitForHSEStartUp(); |
082 | /*
判断HSE起是否振成功,是则进入if()内部 */ |
083 | if(HSEStartUpStatus
== SUCCESS) |
085 | /*
选择HCLK(AHB)时钟源为SYSCLK 1分频 */ |
086 | RCC_HCLKConfig(RCC_SYSCLK_Div1); |
087 | /*
选择PCLK2时钟源为 HCLK(AHB) 1分频 */ |
088 | RCC_PCLK2Config(RCC_HCLK_Div1); |
089 | /*
选择PCLK1时钟源为 HCLK(AHB) 2分频 */ |
090 | RCC_PCLK1Config(RCC_HCLK_Div2); |
092 | FLASH_SetLatency(FLASH_Latency_2); |
094 | FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); |
095 | /*
选择锁相环(PLL)时钟源为HSE 1分频,倍频数为9,则PLL输出频率为 8MHz * 9 = 72MHz */ |
096 | RCC_PLLConfig(RCC_PLLSource_HSE_Div1,
RCC_PLLMul_9); |
100 | while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)
== RESET); |
101 | /*
选择SYSCLK时钟源为PLL */ |
102 | RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); |
103 | /*
等待PLL成为SYSCLK时钟源 */ |
104 | while(RCC_GetSYSCLKSource()
!= 0x08); |
106 | /*
打开APB2总线上的GPIOA时钟*/ |
107 | RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1,
ENABLE); |
109 | //RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,
ENABLE); |
111 | //RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE); |
112 | //RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR|RCC_APB1Periph_BKP|RCC_APB1Periph_WWDG,
ENABLE); |
117 | void USART_Configuration(void) |
119 | USART_InitTypeDef
USART_InitStructure; |
120 | USART_ClockInitTypeDef
USART_ClockInitStructure; |
122 | USART_ClockInitStructure.USART_Clock
= USART_Clock_Disable; |
123 | USART_ClockInitStructure.USART_CPOL
= USART_CPOL_Low; |
124 | USART_ClockInitStructure.USART_CPHA
= USART_CPHA_2Edge; |
125 | USART_ClockInitStructure.USART_LastBit
= USART_LastBit_Disable; |
126 | USART_ClockInit(USART1
, &USART_ClockInitStructure); |
128 | USART_InitStructure.USART_BaudRate
= 9600; |
129 | USART_InitStructure.USART_WordLength
= USART_WordLength_8b; |
130 | USART_InitStructure.USART_StopBits
= USART_StopBits_1; |
131 | USART_InitStructure.USART_Parity
= USART_Parity_No; |
132 | USART_InitStructure.USART_HardwareFlowControl
= USART_HardwareFlowControl_None; |
133 | USART_InitStructure.USART_Mode
= USART_Mode_Rx|USART_Mode_Tx; |
134 | USART_Init(USART1,&USART_InitStructure); |
136 | USART_Cmd(USART1,ENABLE); |
141 | int fputc(int ch,FILE *f) |
143 | USART_SendData(USART1,(u8)
ch); |
144 | while(USART_GetFlagStatus(USART1,USART_FLAG_TC)
== RESET); |
关键字:stm32 Flash读写 库函数
引用地址:
stm32 Flash读写[库函数]
推荐阅读最新更新时间:2024-03-16 16:15
STM32开发板学习日记-[5]TIM的PMW模式
脉冲宽度调制模式可以产生一个由TIMx_ARR寄存器确定频率、由TIMx_CCRx寄存器确定占空比的信号。 在TIMx_CCMRx寄存器中的OCxM位写入 110 (PWM模式1)或 111 (PWM模式2),能够独立地设置每个OCx输出通道产生一路PWM。必须设置TIMx_CCMRx寄存器OCxPE位以使能相应的预装载寄存器,最后还要设置TIMx_CR1寄存器的ARPE位使能自动重装载的预装载寄存器(在向上计数或中心对称模式中)。 因为仅当发生一个更新事件的时候,预装载寄存器才能被传送到影子寄存器,因此在计数器开始计数之前,必须通过设置TIMx_EGR寄存器中的UG位来初始化所有的寄存器。 OCx的极性可以通过软件在TIMx_C
[单片机]
STM32生态系统工具和软件介绍
STM32能被这么多开发者认可,它的强大生态系统起了关键作用。本文围绕STM32生态各软件工具进行相关描述,其中包含一些技术细节。 一、STM32生态系统总预览STM32提供了全套开发工具,以及开发所需的软件包,下面看一张图,从全局来了解STM32生态系统工具和软件: 主要分为两大类:1.软件工具:即左边部分的STM32CubeMX、 CubeIDE、 CubeProgrammer、 CubeMontor等。 2.嵌入式软件包:STM32CubeMCU Packages 和 扩展软件包CubeExpansions. STM32Cube生态系统几个特点: 免费自由使用; 接口一致,方便移植 可裁剪、可扩展 易使用和理解 节约
[单片机]
STM32标准库、HAL库和LL库介绍
引言 我们在进行STM32开发的时候,使用寄存器进行开发的终究是少数,大多数人还是习惯用库函数进行开发。到目前为止,有标准外设库、HAL库、LL库 三种。本文将分别介绍以下三种库,便于大家区分。 介绍 标准库 标准库(Standard Peripheral Library)是STMicroelectronics提供的最基本的库。它提供了对STM32微控制器的底层寄存器和外设的直接访问。标准库的设计目标是提供高度灵活性和低层次的硬件控制,以满足对性能和资源的严格要求。使用标准库,开发人员可以直接操作寄存器来配置和控制微控制器的功能,但需要手动编写大量的底层代码。标准库适用于对性能要求较高的应用和对代码大小和效率有严格要求的项目。
[单片机]
STM32的RCC配置流程
在STM32中有5个时钟源: ①、HSI是高速内部时钟,RC震荡器,频率为 8MHz。 ②、HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~16MHz。 ③、LSI是低速内部时钟,RC振荡器,频率为40kHz。 ④、LSE是低速外部时钟,接频率为32.768kHz的石英晶体。 ⑤、PLL为锁相环倍频输出,其时钟输入源可选择为HIS/2、HSE或HSE/2。倍频可选择为2~16倍,但其输出频率最大不得超过72MHz。 系统时钟SYSCLK,它是供STM32中绝大部分器件工作的时钟源,系统时钟可选择为PLL输出、HSI或者HSE。系统时钟的做大频率为72MHz,它通过AHB分
[单片机]
stm32快速学习1——环境的建立
安装keil for arm 下载stm32固件库3.4 解压,勿乱移动解压文件内的文件,因为项目内使用的都是相对路径。 进入 STM32F10x_StdPeriph_Lib_V3.4.0\Project\STM32F10x_StdPeriph_Template\MDK-ARM 打开keil文件,修改一下这个项目模板 删除左侧的stm32_eval文件夹、doc文件夹、使用的是stm32f103RBT6(中等容量的芯片)然后MDK-ARM下的文件除了 startup_stm32f10x_md.s(根据芯片类型),其他都删除 startup_stm32f10x_md.s右键,选中include in target build 左侧最
[单片机]
STM32产生异相方波
这几天一直在做蓝桥杯嵌入式开发历年的题目 在第七届决赛的模拟题中 有一个要求PA6和PA7产生两个异相并且频率可调的方波 后来我研究了一下STM32的Output comare mode, 因为要调节频率 所以选择了toggle 模式 使方波产生异相在中断中设置就行 先上手册的图 那 这是张老图了 在来看一下 官方StdLib3.5的OCToggle模式下的中断函数 void TIM1_BRK_TIM9_IRQHandler(void) { /* TIM9_CH1 toggling with frequency = 366.2 Hz */ if (TIM_GetITStatus(TIM9, TIM_IT_
[单片机]
使用proteus仿真STM32单片机的注意事项
第1点: 我们用户编写的代码,必须放在 user code begin 和 end 之间;否则,当我们修改stm32cubemx 项目的 配置时,再次生成代码,就会删除之前的代码;正确做法如下图所示: 我们用户编写的代码,必须放在 user code begin 和 end 之间 第2点: 在proteus中,电源需要更改成3.3V,VDDA添加到电源VCC/GND中去;VSSA添加到GND中去;如下图所示: 电源需要改成3.3V 第3点: HAL_Delay(__IO uint32_t Delay)延时函数在stm32f1xx_hal.c里面,该函数能实现ms级别的延时;该函数体前面有一个关键字__weak,该关键字简
[单片机]
142条STM32遇到的坑,你知道几个?
1、AHB系统总线分为APB1(36MHz)和APB2(72MHz),其中2 1,意思是APB2接高速设备。 2、Stm32f10x.h相当于reg52.h(里面有基本的位操作定义),另一个为stm32f10x_conf.h专门控制外围器件的配置,也就是开关头文件的作用 3、HSE Osc(High Speed External Oscillator)高速外部晶振,一般为8MHz,HSI RC(High Speed InternalRC)高速内部RC,8MHz 4、LSE Osc(Low Speed External Oscillator)低速外部晶振,一般为32.768KHz,LSI RC(Low Speed InternalR
[单片机]