第50章 读写内部FLASH—零死角玩转STM32-F429系列
第50章 读写内部FLASH
全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn
野火视频教程优酷观看网址:http://i.youku.com/firege
本章参考资料:《STM32F4xx 中文参考手册》、《STM32F4xx规格书》、库说明文档《stm32f4xx_dsp_stdperiph_lib_um.chm》。
50.1 STM32的内部FLASH简介
在STM32芯片内部有一个FLASH存储器,它主要用于存储代码,我们在电脑上编写好应用程序后,使用下载器把编译后的代码文件烧录到该内部FLASH中,由于FLASH存储器的内容在掉电后不会丢失,芯片重新上电复位后,内核可从内部FLASH中加载代码并运行,见图 501。
图 501 STM32的内部框架图
除了使用外部的工具(如下载器)读写内部FLASH外,STM32芯片在运行的时候,也能对自身的内部FLASH进行读写,因此,若内部FLASH存储了应用程序后还有剩余的空间,我们可以把它像外部SPI-FLASH那样利用起来,存储一些程序运行时产生的需要掉电保存的数据。
由于访问内部FLASH的速度要比外部的SPI-FLASH快得多,所以在紧急状态下常常会使用内部FLASH存储关键记录;为了防止应用程序被抄袭,有的应用会禁止读写内部FLASH中的内容,或者在第一次运行时计算加密信息并记录到某些区域,然后删除自身的部分加密代码,这些应用都涉及到内部FLASH的操作。
1. 内部FLASH的构成
STM32的内部FLASH包含主存储器、系统存储器、OTP区域以及选项字节区域,它们的地址分布及大小见表 501。
表 501 STM32内部FLASH的构成
区域 |
块 |
名称 |
块地址 |
大小 |
主存储器 |
块1 |
扇区0 |
0x0800 0000 - 0x0800 3FFF |
16 Kbytes |
扇区1 |
0x0800 4000 - 0x0800 7FFF |
16 Kbytes |
||
扇区2 |
0x0800 8000 - 0x0800 BFFF |
16 Kbytes |
||
扇区3 |
0x0800 C000 - 0x0800 FFFF |
16 Kbyte |
||
扇区4 |
0x0801 0000 - 0x0801 FFFF |
64 Kbytes |
||
扇区5 |
0x0802 0000 - 0x0803 FFFF |
128 Kbytes |
||
扇区6 |
0x0804 0000 - 0x0805 FFFF |
128 Kbytes |
||
扇区7 |
0x0806 0000 - 0x0807 FFFF |
128 Kbytes |
||
扇区8 |
0x0808 0000 - 0x0809 FFFF |
128 Kbytes |
||
扇区9 |
0x080A 0000 - 0x080B FFFF |
128 Kbytes |
||
扇区10 |
0x080C 0000 - 0x080D FFFF |
128 Kbytes |
||
扇区11 |
0x080E 0000 - 0x080F FFFF |
128 Kbytes |
||
块2 |
扇区12 |
0x0810 0000 - 0x0810 3FFF |
16 Kbytes |
|
扇区13 |
0x0810 4000 - 0x0810 7FFF |
16 Kbytes |
||
扇区14 |
0x0810 8000 - 0x0810 BFFF |
16 Kbytes |
||
扇区15 |
0x0810 C000 - 0x0810 FFFF |
16 Kbyte |
||
扇区16 |
0x0811 0000 - 0x0811 FFFF |
64 Kbytes |
||
扇区17 |
0x0812 0000 - 0x0813 FFFF |
128 Kbytes |
||
扇区18 |
0x0814 0000 - 0x0815 FFFF |
128 Kbytes |
||
扇区19 |
0x0816 0000 - 0x0817 FFFF |
128 Kbytes |
||
扇区20 |
0x0818 0000 - 0x0819 FFFF |
128 Kbytes |
||
扇区21 |
0x081A 0000 - 0x081B FFFF |
128 Kbytes |
||
扇区22 |
0x081C 0000 - 0x081D FFFF |
128 Kbytes |
||
扇区23 |
0x081E 0000 - 0x081F FFFF |
128 Kbytes |
||
系统存储区 |
0x1FFF 0000 - 0x1FFF 77FF |
30 Kbytes |
||
OTP区域 |
0x1FFF 7800 - 0x1FFF 7A0F |
528 bytes |
||
选项字节 |
块1 |
0x1FFF C000 - 0x1FFF C00F |
16 bytes |
|
块2 |
0x1FFE C000 - 0x1FFE C00F |
16 bytes |
各个存储区域的说明如下:
主存储器
一般我们说STM32内部FLASH的时候,都是指这个主存储器区域,它是存储用户应用程序的空间,芯片型号说明中的1M FLASH、2M FLASH都是指这个区域的大小。主存储器分为两块,共2MB,每块内分12个扇区,其中包含4个16KB扇区、1个64KB扇区和7个128KB的扇区。如我们实验板中使用的STM32F429IGT6型号芯片,它的主存储区域大小为1MB,所以它只包含有表中的扇区0-扇区11。
与其它FLASH一样,在写入数据前,要先按扇区擦除,而有的时候我们希望能以小规格操纵存储单元,所以STM32针对1MB FLASH的产品还提供了一种双块的存储格式,见表 502。(2M的产品按表 501的格式)
表 502 1MB产品的双块存储格式
1M字节单块存储器的扇区分配(默认) |
1M字节双块存储器的扇区分配 |
||||
DB1M=0 |
DB1M=1 |
||||
主存储器 |
扇区号 |
扇区大小 |
主存储器 |
扇区号 |
扇区大小 |
1MB |
扇区0 |
16 Kbytes |
Bank 1 512KB |
扇区0 |
16 Kbytes |
扇区1 |
16 Kbytes |
扇区1 |
16 Kbytes |
||
扇区2 |
16 Kbytes |
扇区2 |
16 Kbytes |
||
扇区3 |
16 Kbytes |
扇区3 |
16 Kbytes |
||
扇区4 |
64 Kbytes |
扇区4 |
64 Kbytes |
||
扇区5 |
128 Kbytes |
扇区5 |
128 Kbytes |
||
扇区6 |
128 Kbytes |
扇区6 |
128 Kbytes |
||
扇区7 |
128 Kbytes |
扇区7 |
128 Kbytes |
||
扇区8 |
128 Kbytes |
Bank 2 512KB |
扇区12 |
16 Kbytes |
|
扇区9 |
128 Kbytes |
扇区13 |
16 Kbytes |
||
扇区10 |
128 Kbytes |
扇区14 |
16 Kbytes |
||
扇区11 |
128 Kbytes |
扇区15 |
16 Kbytes |
||
- |
- |
扇区16 |
64 Kbytes |
||
- |
- |
扇区17 |
128 Kbytes |
||
- |
- |
扇区18 |
128 Kbytes |
||
- |
- |
扇区19 |
128 Kbytes |
通过配置FLASH选项控制寄存器FLASH_OPTCR的DB1M位,可以切换这两种格式,切换成双块模式后,扇区8-11的空间被转移到扇区12-19中,扇区细分了,总容量不变。
注意如果您使用的是STM32F40x系列的芯片,它没有双块存储格式,也不存在扇区12-23,仅STM32F42x/43x系列产品才支持扇区12-23。
系统存储区
系统存储区是用户不能访问的区域,它在芯片出厂时已经固化了启动代码,它负责实现串口、USB以及CAN等ISP烧录功能。
OTP区域
OTP(One Time Program),指的是只能写入一次的存储区域,容量为512字节,写入后数据就无法再更改,OTP常用于存储应用程序的加密密钥。
选项字节
选项字节用于配置FLASH的读写保护、电源管理中的BOR级别、软件/硬件看门狗等功能,这部分共32字节。可以通过修改FLASH的选项控制寄存器修改。
50.2 对内部FLASH的写入过程
1. 解锁
由于内部FLASH空间主要存储的是应用程序,是非常关键的数据,为了防止误操作修改了这些内容,芯片复位后默认会结FLASH上锁,这个时候不允许设置FLASH的控制寄存器,并且不能对修改FLASH中的内容。
所以对FLASH写入数据前,需要先给它解锁。解锁的操作步骤如下:
(1) 往Flash 密钥寄存器 FLASH_KEYR中写入 KEY1 = 0x45670123
(2) 再往Flash 密钥寄存器 FLASH_KEYR中写入 KEY2 = 0xCDEF89AB
2. 数据操作位数
在内部FLASH进行擦除及写入操作时,电源电压会影响数据的最大操作位数,该电源电压可通过配置FLASH_CR 寄存器中的 PSIZE位改变,见表 503。
表 503 数据操作位数
电压范围 |
2.7 - 3.6 V (使用外部Vpp) |
2.7 - 3.6 V |
2.1 – 2.7 V |
1.8 – 2.1 V |
位数 |
64 |
32 |
16 |
8 |
PSIZE(1:0)配置 |
11b |
10b |
01b |
00b |
最大操作位数会影响擦除和写入的速度,其中64位宽度的操作除了配置寄存器位外,还需要在Vpp引脚外加一个8-9V的电压源,且其供电时间不得超过一小时,否则FLASH可能损坏,所以64位宽度的操作一般是在量产时对FLASH写入应用程序时才使用,大部分应用场合都是用32位的宽度。
3. 擦除扇区
在写入新的数据前,需要先擦除存储区域,STM32提供了扇区擦除指令和整个FLASH擦除(批量擦除)的指令,批量擦除指令仅针对主存储区。
扇区擦除的过程如下:
(1) 检查 FLASH_SR 寄存器中的"忙碌寄存器位 BSY",以确认当前未执行任何 Flash 操作;
(2) 在 FLASH_CR 寄存器中,将"激活扇区擦除寄存器位SER "置 1,并设置"扇区编号寄存器位SNB",选择要擦除的扇区;
(3) 将 FLASH_CR 寄存器中的"开始擦除寄存器位 STRT "置 1,开始擦除;
(4) 等待 BSY 位被清零时,表示擦除完成。
4. 写入数据
擦除完毕后即可写入数据,写入数据的过程并不是仅仅使用指针向地址赋值,赋值前还还需要配置一系列的寄存器,步骤如下:
(1) 检查 FLASH_SR 中的 BSY 位,以确认当前未执行任何其它的内部 Flash 操作;
(2) 将 FLASH_CR 寄存器中的 "激活编程寄存器位PG" 置 1;
(3) 针对所需存储器地址(主存储器块或 OTP 区域内)执行数据写入操作;
(4) 等待 BSY 位被清零时,表示写入完成。
50.3 查看工程的空间分布
由于内部FLASH本身存储有程序数据,若不是有意删除某段程序代码,一般不应修改程序空间的内容,所以在使用内部FLASH存储其它数据前需要了解哪一些空间已经写入了程序代码,存储了程序代码的扇区都不应作任何修改。通过查询应用程序编译时产生的"*.map"后缀文件,可以了解程序存储到了哪些区域,它在工程中的打开方式见图 502,也可以到工程目录中的"Listing"文件夹中找到。
图 502 打开工程的.map文件
打开map文件后,查看文件最后部分的区域,可以看到一段以"Memory Map of the image"开头的记录(若找不到可用查找功能定位),见代码清单 501。
代码清单 501 map文件中的存储映像分布说明
1 =======================================================================
2 Memory Map of the image //存储分布映像
3
4 Image Entry point : 0x080001ad
5
6 /*程序ROM加载空间*/
7 Load Region LR_IROM1 (Base: 0x08000000, Size: 0x00000b50, Max: 0x00100000, ABSOLUTE)
8
9 /*程序ROM执行空间*/
10 Execution Region ER_IROM1 (Base: 0x08000000, Size: 0x00000b3c, Max: 0x00100000, ABSOLUTE)
11
12 /*地址分布列表*/
13 Base Addr Size Type Attr Idx E Section Name Object
14
15 0x08000000 0x000001ac Data RO 3 RESET startup_stm32f429_439xx.o
16 0x080001ac 0x00000000 Code RO 5359 * .ARM.Collect$$$$00000000 mc_w.l(entry.o)
17 0x080001ac 0x00000004 Code RO 5622 .ARM.Collect$$$$00000001 mc_w.l(entry2.o)
18 0x080001b0 0x00000004 Code RO 5625 .ARM.Collect$$$$00000004 mc_w.l(entry5.o)
19 0x080001b4 0x00000000 Code RO 5627 .ARM.Collect$$$$00000008 mc_w.l(entry7b.o)
20 0x080001b4 0x00000000 Code RO 5629 .ARM.Collect$$$$0000000A mc_w.l(entry8b.o)
21 /*...此处省略大部分内容*/
22 0x08000948 0x0000000e Code RO 4910 i.USART_GetFlagStatus stm32f4xx_usart.o
23 0x08000956 0x00000002 PAD
24 0x08000958 0x000000bc Code RO 4914 i.USART_Init stm32f4xx_usart.o
25 0x08000a14 0x00000008 Code RO 4924 i.USART_SendData stm32f4xx_usart.o
26 0x08000a1c 0x00000002 Code RO 5206 i.UsageFault_Handler stm32f4xx_it.o
27 0x08000a1e 0x00000002 PAD
28 0x08000a20 0x00000010 Code RO 5363 i.__0printf$bare mc_w.l(printfb.o)
29 0x08000a30 0x0000000e Code RO 5664 i.__scatterload_copy mc_w.l(handlers.o)
30 0x08000a3e 0x00000002 Code RO 5665 i.__scatterload_null mc_w.l(handlers.o)
31 0x08000a40 0x0000000e Code RO 5666 i.__scatterload_zeroinit mc_w.l(handlers.o)
32 0x08000a4e 0x00000022 Code RO 5370 i._printf_core mc_w.l(printfb.o)
33 0x08000a70 0x00000024 Code RO 5275 i.fputc bsp_debug_usart.o
34 0x08000a94 0x00000088 Code RO 5161 i.main main.o
35 0x08000b1c 0x00000020 Data RO 5662 Region$$Table anon$$obj.o
36
这一段是某工程的ROM存储器分布映像,在STM32芯片中,ROM区域的内容就是指存储到内部FLASH的代码。
1. 程序ROM的加载与执行空间
上述说明中有两段分别以"Load Region LR_ROM1"及"Execution Region ER_IROM1"开头的内容,它们分别描述程序的加载及执行空间。在芯片刚上电运行时,会加载程序及数据,例如它会从程序的存储区域加载到程序的执行区域,还把一些已初始化的全局变量从ROM复制到RAM空间,以便程序运行时可以修改变量的内容。加载完成后,程序开始从执行区域开始执行。
在上面map文件的描述中,我们了解到加载及执行空间的基地址(Base)都是0x08000000,它正好是STM32内部FLASH的首地址,即STM32的程序存储空间就直接是执行空间;它们的大小(Size)分别为0x00000b50及0x00000b3c,执行空间的ROM比较小的原因就是因为部分RW-data类型的变量被拷贝到RAM空间了;它们的最大空间(Max)均为0x00100000,即1M字节,它指的是内部FLASH的最大空间。
计算程序占用的空间时,需要使用加载区域的大小进行计算,本例子中应用程序使用的内部FLASH是从0x08000000至(0x08000000+0x00000b50)地址的空间区域。
2. ROM空间分布表
在加载及执行空间总体描述之后,紧接着一个ROM详细地址分布表,它列出了工程中的各个段(如函数、常量数据)所在的地址Base Addr及占用的空间Size,列表中的Type说明了该段的类型,CODE表示代码,DATA表示数据,而PAD表示段之间的填充区域,它是无效的内容,PAD区域往往是为了解决地址对齐的问题。
观察表中的最后一项,它的基地址是0x08000b1c,大小为0x00000020,可知它占用的最高的地址空间为0x08000b3c,跟执行区域的最高地址0x00000b3c一样,但它们比加载区域说明中的最高地址0x8000b50要小,所以我们以加载区域的大小为准。对比表 501的内部FLASH扇区地址分布表,可知仅使用扇区0就可以完全存储本应用程序,所以从扇区1(地址0x08004000)后的存储空间都可以作其它用途,使用这些存储空间时不会篡改应用程序空间的数据。
50.4 操作内部FLASH的库函数
为简化编程,STM32标准库提供了一些库函数,它们封装了对内部FLASH写入数据操作寄存器的过程。
1. FLASH解锁、上锁函数
对内部FLASH解锁、上锁的函数见代码清单 502。
代码清单 502 FLASH解锁、上锁
1
2 #define FLASH_KEY1 ((uint32_t)0x45670123)
3 #define FLASH_KEY2 ((uint32_t)0xCDEF89AB)
4 /**
5 * @brief Unlocks the FLASH control register access
6 * @param None
7 * @retval None
8 */
9 void FLASH_Unlock(void)
10 {
11 if ((FLASH->CR & FLASH_CR_LOCK) != RESET) {
12 /* Authorize the FLASH Registers access */
13 FLASH->KEYR = FLASH_KEY1;
14 FLASH->KEYR = FLASH_KEY2;
15 }
16 }
17
18 /**
19 * @brief Locks the FLASH control register access
20 * @param None
21 * @retval None
22 */
23 void FLASH_Lock(void)
24 {
25 /* Set the LOCK Bit to lock the FLASH Registers access */
26 FLASH->CR |= FLASH_CR_LOCK;
27 }
解锁的时候,它对FLASH_KEYR寄存器写入两个解锁参数,上锁的时候,对FLASH_CR寄存器的FLASH_CR_LOCK位置1。
2. 设置操作位数及擦除扇区
解锁后擦除扇区时可调用FLASH_EraseSector完成,见代码清单 503。
代码清单 503 擦除扇区
1 /**
2 * @brief Erases a specified FLASH Sector.
3 *
4 * @note If an erase and a program operations are requested simultaneously,
5 * the erase operation is performed before the program one.
6 *
7 * @param FLASH_Sector: The Sector number to be erased.
8 *
9 * @note For STM32F42xxx/43xxx devices this parameter can be a value between
10 * FLASH_Sector_0 and FLASH_Sector_23.
11 *
12 * @param VoltageRange: The device voltage range which defines the erase parallelism.
13 * This parameter can be one of the following values:
14 * @arg VoltageRange_1: when the device voltage range is 1.8V to 2.1V,
15 * the operation will be done by byte (8-bit)
16 * @arg VoltageRange_2: when the device voltage range is 2.1V to 2.7V,
17 * the operation will be done by half word (16-bit)
18 * @arg VoltageRange_3: when the device voltage range is 2.7V to 3.6V,
19 * the operation will be done by word (32-bit)
20 * @arg VoltageRange_4: when the device voltage range is 2.7V to 3.6V + External Vpp,
21 * the operation will be done by double word (64-bit)
22 *
23 * @retval FLASH Status: The returned value can be: FLASH_BUSY, FLASH_ERROR_PROGRAM,
24 * FLASH_ERROR_WRP, FLASH_ERROR_OPERATION or FLASH_COMPLETE.
25 */
26 FLASH_Status FLASH_EraseSector(uint32_t FLASH_Sector, uint8_t VoltageRange)
27 {
28 uint32_t tmp_psize = 0x0;
29 FLASH_Status status = FLASH_COMPLETE;
30
31 /* Check the parameters */
32 assert_param(IS_FLASH_SECTOR(FLASH_Sector));
33 assert_param(IS_VOLTAGERANGE(VoltageRange));
34
35 if (VoltageRange == VoltageRange_1) {
36 tmp_psize = FLASH_PSIZE_BYTE;
37 } else if (VoltageRange == VoltageRange_2) {
38 tmp_psize = FLASH_PSIZE_HALF_WORD;
39 } else if (VoltageRange == VoltageRange_3) {
40 tmp_psize = FLASH_PSIZE_WORD;
41 } else {
42 tmp_psize = FLASH_PSIZE_DOUBLE_WORD;
43 }
44 /* Wait for last operation to be completed */
45 status = FLASH_WaitForLastOperation();
46
47 if (status == FLASH_COMPLETE) {
48 /* if the previous operation is completed, proceed to erase the sector */
49 FLASH->CR &= CR_PSIZE_MASK;
50 FLASH->CR |= tmp_psize;
51 FLASH->CR &= SECTOR_MASK;
52 FLASH->CR |= FLASH_CR_SER | FLASH_Sector;
53 FLASH->CR |= FLASH_CR_STRT;
54
55 /* Wait for last operation to be completed */
56 status = FLASH_WaitForLastOperation();
57
58 /* if the erase operation is completed, disable the SER Bit */
59 FLASH->CR &= (~FLASH_CR_SER);
60 FLASH->CR &= SECTOR_MASK;
61 }
62 /* Return the Erase Status */
63 return status;
64 }
本函数包含两个输入参数,分别是要擦除的扇区号和工作电压范围,选择不同电压时实质是选择不同的数据操作位数,参数中可输入的宏在注释里已经给出。函数根据输入参数配置PSIZE位,然后擦除扇区,擦除扇区的时候需要等待一段时间,它使用FLASH_WaitForLastOperation等待,擦除完成的时候才会退出FLASH_EraseSector函数。
3. 写入数据
对内部FLASH写入数据不像对SDRAM操作那样直接指针操作就完成了,还要设置一系列的寄存器,利用FLASH_ProgramWord、FLASH_ProgramHalfWord和FLASH_ProgramByte函数可按字、半字及字节单位写入数据,见代码清单 504。
代码清单 504 写入数据
1
2 /**
3 * @brief Programs a word (32-bit) at a specified address.
4 *
5 * @note This function must be used when the device voltage range is from 2.7V to 3.6V.
6 *
7 * @note If an erase and a program operations are requested simultaneously,
8 * the erase operation is performed before the program one.
9 *
10 * @param Address: specifies the address to be programmed.
11 * This parameter can be any address in Program memory zone or in OTP zone.
12 * @param Data: specifies the data to be programmed.
13 * @retval FLASH Status: The returned value can be: FLASH_BUSY, FLASH_ERROR_PROGRAM,
14 * FLASH_ERROR_WRP, FLASH_ERROR_OPERATION or FLASH_COMPLETE.
15 */
16 FLASH_Status FLASH_ProgramWord(uint32_t Address, uint32_t Data)
17 {
18 FLASH_Status status = FLASH_COMPLETE;
19
20 /* Check the parameters */
21 assert_param(IS_FLASH_ADDRESS(Address));
22
23 /* Wait for last operation to be completed */
24 status = FLASH_WaitForLastOperation();
25
26 if (status == FLASH_COMPLETE) {
27/* if the previous operation is completed, proceed to program the new data */
28 FLASH->CR &= CR_PSIZE_MASK;
29 FLASH->CR |= FLASH_PSIZE_WORD;
30 FLASH->CR |= FLASH_CR_PG;
31
32 *(__IO uint32_t*)Address = Data;
33
34 /* Wait for last operation to be completed */
35 status = FLASH_WaitForLastOperation();
36
37 /* if the program operation is completed, disable the PG Bit */
38 FLASH->CR &= (~FLASH_CR_PG);
39 }
40 /* Return the Program Status */
41 return status;
42 }
看函数代码可了解到,使用指针进行赋值操作前设置了数据操作宽度,并设置了PG寄存器位,在赋值操作后,调用了FLASH_WaitForLastOperation函数等待写操作完毕。HalfWord和Byte操作宽度的函数执行过程类似。
50.5 实验:读写内部FLASH
在本小节中我们以实例讲解如何使用内部FLASH存储数据。
50.5.1 硬件设计
本实验仅操作了STM32芯片内部的FLASH空间,无需额外的硬件。
50.5.2 软件设计
本小节讲解的是"内部FLASH编程"实验,请打开配套的代码工程阅读理解。为了方便展示及移植,我们把操作内部FLASH相关的代码都编写到"bsp_internalFlash.c"及"bsp_internalFlash.h"文件中,这些文件是我们自己编写的,不属于标准库的内容,可根据您的喜好命名文件。
1. 程序设计要点
(7) 对内部FLASH解锁;
(8) 找出空闲扇区,擦除目标扇区;
(9) 进行读写测试。
2. 代码分析
硬件定义
读写内部FLASH不需要用到任何外部硬件,不过在擦写时常常需要知道各个扇区的基地址,我们把这些基地址定义到bsp_internalFlash.h文件中,见代码清单 441。
代码清单 505 各个扇区的基地址(bsp_internalFlash.h文件)
1
2 /* 各个扇区的基地址 */
3 #define ADDR_FLASH_SECTOR_0 ((uint32_t)0x08000000)
4 #define ADDR_FLASH_SECTOR_1 ((uint32_t)0x08004000)
5 #define ADDR_FLASH_SECTOR_2 ((uint32_t)0x08008000)
6 #define ADDR_FLASH_SECTOR_3 ((uint32_t)0x0800C000)
7 #define ADDR_FLASH_SECTOR_4 ((uint32_t)0x08010000)
8 #define ADDR_FLASH_SECTOR_5 ((uint32_t)0x08020000)
9 #define ADDR_FLASH_SECTOR_6 ((uint32_t)0x08040000)
10 #define ADDR_FLASH_SECTOR_7 ((uint32_t)0x08060000)
11 #define ADDR_FLASH_SECTOR_8 ((uint32_t)0x08080000)
12 #define ADDR_FLASH_SECTOR_9 ((uint32_t)0x080A0000)
13 #define ADDR_FLASH_SECTOR_10 ((uint32_t)0x080C0000)
14 #define ADDR_FLASH_SECTOR_11 ((uint32_t)0x080E0000)
15
16 #define ADDR_FLASH_SECTOR_12 ((uint32_t)0x08100000)
17 #define ADDR_FLASH_SECTOR_13 ((uint32_t)0x08104000)
18 #define ADDR_FLASH_SECTOR_14 ((uint32_t)0x08108000)
19 #define ADDR_FLASH_SECTOR_15 ((uint32_t)0x0810C000)
20 #define ADDR_FLASH_SECTOR_16 ((uint32_t)0x08110000)
21 #define ADDR_FLASH_SECTOR_17 ((uint32_t)0x08120000)
22 #define ADDR_FLASH_SECTOR_18 ((uint32_t)0x08140000)
23 #define ADDR_FLASH_SECTOR_19 ((uint32_t)0x08160000)
24 #define ADDR_FLASH_SECTOR_20 ((uint32_t)0x08180000)
25 #define ADDR_FLASH_SECTOR_21 ((uint32_t)0x081A0000)
26 #define ADDR_FLASH_SECTOR_22 ((uint32_t)0x081C0000)
27 #define ADDR_FLASH_SECTOR_23 ((uint32_t)0x081E0000)
这些宏跟表 501中的地址说明一致。
根据扇区地址计算SNB寄存器的值
在擦除操作时,需要向FLASH控制寄存器FLASH_CR的SNB位写入要擦除的扇区号,固件库把各个扇区对应的寄存器值使用宏定义到了stm32f4xx_flash.h文件。为了便于使用,我们自定义了一个GetSector函数,根据输入的内部FLASH地址,找出其所在的扇区,并返回该扇区对应的SNB位寄存器值,见代码清单 442。
代码清单 506 写入到SNB寄存器位的值(stm32f4xx_flash.h及bsp_internalFlash.c文件)
1 /*固件库定义的用于扇区写入到SNB寄存器位的宏(stm32f4xx_flash.h文件)*/
2 #define FLASH_Sector_0 ((uint16_t)0x0000)
3 #define FLASH_Sector_1 ((uint16_t)0x0008)
4 #define FLASH_Sector_2 ((uint16_t)0x0010)
5 #define FLASH_Sector_3 ((uint16_t)0x0018)
6 #define FLASH_Sector_4 ((uint16_t)0x0020)
7 #define FLASH_Sector_5 ((uint16_t)0x0028)
8 #define FLASH_Sector_6 ((uint16_t)0x0030)
9 #define FLASH_Sector_7 ((uint16_t)0x0038)
10 #define FLASH_Sector_8 ((uint16_t)0x0040)
11 #define FLASH_Sector_9 ((uint16_t)0x0048)
12 #define FLASH_Sector_10 ((uint16_t)0x0050)
13 #define FLASH_Sector_11 ((uint16_t)0x0058)
14 #define FLASH_Sector_12 ((uint16_t)0x0080)
15 #define FLASH_Sector_13 ((uint16_t)0x0088)
16 #define FLASH_Sector_14 ((uint16_t)0x0090)
17 #define FLASH_Sector_15 ((uint16_t)0x0098)
18 #define FLASH_Sector_16 ((uint16_t)0x00A0)
19 #define FLASH_Sector_17 ((uint16_t)0x00A8)
20 #define FLASH_Sector_18 ((uint16_t)0x00B0)
21 #define FLASH_Sector_19 ((uint16_t)0x00B8)
22 #define FLASH_Sector_20 ((uint16_t)0x00C0)
23 #define FLASH_Sector_21 ((uint16_t)0x00C8)
24 #define FLASH_Sector_22 ((uint16_t)0x00D0)
25 #define FLASH_Sector_23 ((uint16_t)0x00D8)
26
27 /*定义在bsp_internalFlash.c文件中的函数*/
28 /**
29 * @brief 根据输入的地址给出它所在的sector
30 * 例如:
31 uwStartSector = GetSector(FLASH_USER_START_ADDR);
32 uwEndSector = GetSector(FLASH_USER_END_ADDR);
33 * @param Address:地址
34 * @retval 地址所在的sector
35 */
36 static uint32_t GetSector(uint32_t Address)
37 {
38
uint32_t sector = 0;
39
40
if ((Address < ADDR_FLASH_SECTOR_1) && (Address >= ADDR_FLASH_SECTOR_0)) {
41 sector = FLASH_Sector_0;
42 } else if ((Address < ADDR_FLASH_SECTOR_2) && (Address >= ADDR_FLASH_SECTOR_1)) {
43 sector = FLASH_Sector_1;
44 }
45
46
/*此处省略扇区2-扇区21的内容*/
47
48 else if ((Address < ADDR_FLASH_SECTOR_23) && (Address >= ADDR_FLASH_SECTOR_22)) {
49 sector = FLASH_Sector_22;
50 } else { /*(Address < FLASH_END_ADDR) && (Address >= ADDR_FLASH_SECTOR_23))*/
51 sector = FLASH_Sector_23;
52 }
53
return sector;
54 }
代码中固件库定义的宏FLASH_Sector_0-23对应的值是跟寄存器说明一致的,见图 503。
图 503 FLASH_CR寄存器的SNB位的值
GetSector函数根据输入的地址与各个扇区的基地址进行比较,找出它所在的扇区,并使用固件库中的宏,返回扇区对应的SNB值。
读写内部FLASH
一切准备就绪,可以开始对内部FLASH进行擦写,这个过程不需要初始化任何外设,只要按解锁、擦除及写入的流程走就可以了,见代码清单 443。
代码清单 507 对内部地FLASH进行读写测试(bsp_internalFlash.c文件)
1
2 /*准备写入的测试数据*/
3 #define DATA_32 ((uint32_t)0x00000000)
4 /* 要擦除内部FLASH的起始地址 */
5 #define FLASH_USER_START_ADDR ADDR_FLASH_SECTOR_8
6 /* 要擦除内部FLASH的结束地址 */
7 #define FLASH_USER_END_ADDR ADDR_FLASH_SECTOR_12
8
9 /**
10 * @brief InternalFlash_Test,对内部FLASH进行读写测试
11 * @param None
12 * @retval None
13 */
14 int InternalFlash_Test(void)
15 {
16 /*要擦除的起始扇区(包含)及结束扇区(不包含),如8-12,表示擦除8、9、10、11扇区*/
17 uint32_t uwStartSector = 0;
18 uint32_t uwEndSector = 0;
19
20 uint32_t uwAddress = 0;
21 uint32_t uwSectorCounter = 0;
22
23 __IO uint32_t uwData32 = 0;
24 __IO uint32_t uwMemoryProgramStatus = 0;
25
26 /* FLASH 解锁 ********************************/
27 /* 使能访问FLASH控制寄存器 */
28 FLASH_Unlock();
29
30 /* 擦除用户区域 (用户区域指程序本身没有使用的空间,可以自定义)**/
31 /* 清除各种FLASH的标志位 */
32 FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR |
33 FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR|FLASH_FLAG_PGSERR);
34
35
36 uwStartSector = GetSector(FLASH_USER_START_ADDR);
37 uwEndSector = GetSector(FLASH_USER_END_ADDR);
38
39 /* 开始擦除操作 */
40 uwSectorCounter = uwStartSector;
41 while (uwSectorCounter <= uwEndSector) {
42 /* VoltageRange_3 以"字"的大小进行操作 */
43 if (FLASH_EraseSector(uwSectorCounter, VoltageRange_3) != FLASH_COMPLETE) {
44 /*擦除出错,返回,实际应用中可加入处理 */
45 return -1;
46 }
47 /* 计数器指向下一个扇区 */
48 if (uwSectorCounter == FLASH_Sector_11) {
49 uwSectorCounter += 40;
50 } else {
51 uwSectorCounter += 8;
52 }
53 }
54
55 /* 以"字"的大小为单位写入数据 ********************************/
56 uwAddress = FLASH_USER_START_ADDR;
57
58 while (uwAddress < FLASH_USER_END_ADDR) {
59 if (FLASH_ProgramWord(uwAddress, DATA_32) == FLASH_COMPLETE) {
60 uwAddress = uwAddress + 4;
61 } else {
62 /*写入出错,返回,实际应用中可加入处理 */
63 return -1;
64 }
65 }
66
67
68 /* 给FLASH上锁,防止内容被篡改*/
69 FLASH_Lock();
70
71
72 /* 从FLASH中读取出数据进行校验***************************************/
73 /* MemoryProgramStatus = 0: 写入的数据正确
74 MemoryProgramStatus != 0: 写入的数据错误,其值为错误的个数 */
75 uwAddress = FLASH_USER_START_ADDR;
76 uwMemoryProgramStatus = 0;
77
78 while (uwAddress < FLASH_USER_END_ADDR) {
79 uwData32 = *(__IO uint32_t*)uwAddress;
80
81 if (uwData32 != DATA_32) {
82 uwMemoryProgramStatus++;
83 }
84
85 uwAddress = uwAddress + 4;
86 }
87 /* 数据校验不正确 */
88 if (uwMemoryProgramStatus) {
89 return -1;
90 } else { /*数据校验正确*/
91 return 0;
92 }
93 }
94
该函数的执行过程如下:
(1) 调用FLASH_Unlock解锁;
(2) 调用FLASH_ClearFlag清除各种标志位;
(3) 调用GetSector根据起始地址及结束地址计算要擦除的扇区;
(4) 调用FLASH_EraseSector擦除扇区,擦除时按字为单位进行操作;
(5) 调用FLASH_ProgramWord函数向起始地址至结束地址的存储区域都写入数值"DATA_32";
(6) 调用FLASH_Lock上锁;
(7) 使用指针读取数据内容并校验。
main函数
最后我们来看看main函数的执行流程,见代码清单 444。
代码清单 508 main函数(main.c文件)
1 /**
2 * @brief 主函数
3 * @param 无
4 * @retval 无
5 */
6 int main(void)
7 {
8
/*初始化USART,配置模式为 115200 8-N-1*/
9 Debug_USART_Config();
10 LED_GPIO_Config();
11
12 LED_BLUE;
13
/*调用printf函数,因为重定向了fputc,printf的内容会输出到串口*/
14 printf("this is a usart printf demo.
\r\n");
15 printf("\r\n欢迎使用秉火 STM32 F429 开发板。\r\n");
16 printf("正在进行读写内部FLASH实验,请耐心等待\r\n");
17
18
if (InternalFlash_Test()==0) {
19 LED_GREEN;
20 printf("读写内部FLASH测试成功\r\n");
21
22 } else {
23 printf("读写内部FLASH测试失败\r\n");
24 LED_RED;
25 }
26 }
main函数中初始化了用于指示调试信息的LED及串口后,直接调用了InternalFlash_Test函数,进行读写测试并根据测试结果输出调试信息。
50.5.3 下载验证
用USB线连接开发板"USB TO UART"接口跟电脑,在电脑端打开串口调试助手,把编译好的程序下载到开发板。在串口调试助手可看到擦写内部FLASH的调试信息。
50.6 每课一问
5. 尝试擦除应用程序所在的内部FLASH扇区,观察实验现象。
6. 使用C语言的"const uint8_t value;"和"volatile const uint8_t value"语句定义的变量value有什么区别?若定义后使用内部FLASH操作擦除value的存储空间,再读取value的值,哪种定义能正常读取?
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
相关文章
- SSH开源自动生成代码工具,可自动生成action、service、form、dao、model、vo、sqlmap.xml、.hbm.xml、test等
本人只是将最流行的代码生成工具rapid和自动建网站工具jeecms整合,形成了一套属于自己的从代码生成到建站自动化完成。该系统支持ssh,ssi,springmvc等十多种结构代码,可以自动,action、service、form、dao、model、vo、sqlmap.xml、.hbm.xml、test、Jsp、.html、.ftl、.php等…...
2024/4/21 8:42:51 - 语音算法笔记
[语音增强和语音识别网页书](https://legacy.gitbook.com/book/shichaog1/hand-book-of-speech-enhancement-and-recognition/details)语音处理算法一直处于研究和发展的阶段,随着人工智能的兴起,人工智能的两个入口:语音和视觉正变的越来越重要,这也是未来5~10年各个AI公司…...
2024/4/30 16:21:09 - 全国教育网DNS(转)
感觉学校 DNS 不稳定。找了几个教育网的。202.114.64.2武大DNS1 (一区) 202.114.96.1 武大DNS2 (二区) 202.114.96.2 武大DNS3 (二区) 202.114.112.13 武大DNS4 (三区) 202.114.0.242 server20.hust.edu.cn华工DNS 202.112.0.35 dns.hust.edu.cn 华工DNS2 202.112.20.1…...
2024/4/29 20:40:04 - A-Frame WebVR开发入门教程
WebVR和WebGL应用程序接口使得我们已经可以在浏览器上创建虚拟现实(VR)体验,但从工程化的角度而言,开发社区还需要更多方便强大的开发库来简化编程,Mozilla的 A-Frame 框架就是这样一个工具,提供了一个Web开发者所熟悉的标记语言来快速构建3D VR场景动画原型,而不需要编…...
2024/4/20 18:24:54 - 在消息栏内添加一个图标,通过自定义消息响应图标
1、在消息栏内添加一个图标很多时候我们要运行一个程序,希望在最小化时隐藏到消息栏内。就像QQ一样。那个这个很有意思的功能是怎么实现的呢? 在BCB中一个TNotifyIconData 类。通过设置这个类的属性,调用Shell_NotifyIcon();将图标显示在消息栏内。TNotifyIconData FData;TI…...
2024/4/29 0:24:23 - 利用UnityEditor实现自己的代码生成器
在写了不少代码之后,才发现以前写的很多代码都是重复性的,虽然这样的重复劳动让程序员形成了自己的代码风格,但一直这样下去并不是十分明智的方式。 -----------------------------------------------------写在前面 本文将利用unity的编辑器扩展功能,结合开源的Rotorz列表…...
2024/4/27 14:10:02 - 各地方DNS
2019独角兽企业重金招聘Python工程师标准>>> 只作为个人参考,备查。 ----------------------------------- 北京 ns.bta.net.cn 202.96.0.133 ns.spt.net.cn 202.96.199.133 ns.cn.net 202.97.16.195 广东 ns.guangzhou.gd.cn 202.96.128.143 dns.guangzhou.gd…...
2024/4/21 8:42:49 - 关于系统响应函数OnSysCommand及托盘Shell_NotifyIcon()等(转)
void CTestDlg::OnSysCommand(UINT nID, LPARAM lParam) 这个函数响应系统控制菜单的命令.(即左上角图标处)。 OnSysCommand:The framework calls this member function when the user selects a command from the Control menu, or when the user selects the Maximize or th…...
2024/4/25 23:16:21 - RDIFramework.NET平台代码生成器V3.0版本全新发布-更新于20160518(提供下载)
最新版本请转到:RDIFramework.NET平台代码生成器V3.1版本全新发布-更新于2016-10-08(提供下载) RDIFramework.NET代码生成器V3.0版本修改了针对3.0版本的框架部分做了大量的调整,同时支持生成Web部分的UI代码(WebForm,MVC),基础的工作交给工具,助力企业快速开发,真…...
2024/4/26 3:40:19 - DNS 服务器(一件值得深思的事情)
1.昨天下午,公司突然无法访问百度,其他网站能够访问。于是我固执的认为,那个垃圾百度又被黑了,可能又是域名解析的问题。可是昨天晚上回家,拨号上网,发现在家竟然能上,心中黯然~~~ 2.今天来到公司,第一件事情就是处理百度不能上的问题,还是老办法,却有新发现,我发现…...
2024/4/21 8:42:46 - 托盘图标在explorer.exe进程退出重启后图标消失(应用程序进程依然存在)的问题
杀掉explorer进程后,windows taskbar也就没有了,托盘图标也就跟着消失了。当explorer进程重启,taskbar将会被创建,taskbar创建后会使用字符串“TaskbarCreated”注册一个消息,然后将这个消息广播到它的所有top-level windows。因此我们可以去注册并捕获这个消息,然后在消…...
2024/4/28 17:59:01 - Flash处理外部XML文档数据详细教程
准备: 首先你得有台电脑.其次是要装上Windows系统和Flash8. XML基础: 既然是处理XML文档.就要先来了解下XML文档.下面是我所了解的,有些是在Flash中用不到的. XML扩展标记语言(Extensible Markup Language)是SGML(Structured Generalized Markup Language)的子集. XML是由World…...
2024/4/27 13:43:46 - MUSIC算法
** MUSIC算法仿真分析 一、DOA估计方法 波达方向(Direction of arrival, DOA)是指空间信号的到达方向(各个信号到达阵列参考阵元的方向角,简称波达方向)。它是空间谱估计理论的重要基础,而空间谱估计又是阵列信号处理的研究领域。空间谱估计主要研究空间多传感器阵列所构成的…...
2024/4/27 7:45:48 - 关于如何在同一个浏览器用不同的session登录同个系统
关于如何在同一个浏览器用不同的session登录同个系统首先我们写业务系统的时候经常会遇到需要登录多个不同的账号来进行整个业务流程的审批或者其他流程,这个时候我们都知道,一个账号登录之后,当你在访问这个系统的时候会自动登录,那么我们如何在一个浏览器登录多个账号呢,…...
2024/4/27 1:22:27 - mybatis-plus之代码生成器
当我们需要对数据库操作时,常规的做法是建立dao,service,controller,mapper.xml文件,一系列繁琐的操作让我们总在做无用功,以前可以用逆向工程生成,现在mybatis-plus也给我们提供了模板,而且功能更加的灵活和强大,我们只要配置好基本的参数,就可以自动生成了,下面正…...
2024/4/29 4:00:28 - 第51章 设置FLASH的读写保护及解除—零死角玩转STM32-F429系列
第51章 设置FLASH的读写保护及解除全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/firege 本章参考资料:《STM32F4xx 中文参考手册》、《STM32F4xx规格书》、库说明文档《stm32f4xx_dsp_stdperiph_l…...
2024/4/27 23:38:02 - spring boot 与 iview 前后端分离架构之前后端代码自动生成(番外篇)
spring boot 与 iview 前后端分离架构之开发环境基于docker的后端的部署的实现(番外篇)代码快速生成插件安装代码生成的maven插件到本地的仓库快速生成代码 代码快速生成插件 在前面三十六章我们已经讲解了如何编写一个前后端分离的权限架构,那么一个好的框架那一定要配套一…...
2024/4/20 16:42:14 - larbin解读(1) --安装
larbin的安装比较简单,直接按照使用说明就可以了。 在u8.10上安装的过程为: 1解压tar -xvzf larbin-2.6.3.tar.gz 2.生成配置文件/.configure这个时候出现错误: make[1]: Entering directory `/home/wei/larbin-2.6.3/srccp ../config.h .for d in utils interf fetch; do (…...
2024/4/21 8:42:38 - 声纹识别+语音识别,解决人机交互的痛点问题
01 人机交互的前世今生自从人类发明了计算机,就持续面临着一个问题:我们到底应该如何与机器交互?在计算机的发展历史上,随着技术的进步,发生过几次大的交互模式的演进:近年来的转变大致可以概括为以鼠标/键盘为主的交互模式转换为以触摸和语音为主的交互模式。由此,我们…...
2024/4/21 8:42:37 - Smarty实例教学 实例篇
Smarty实例教学 实例篇日期:2004年11月3日 作者: 人气: <script src="../Hits.asp?ArticleID=10441"></script>20 查看:[大字体 中字体 小字体] <script src="../hezuo/softview/read.js"></script> Smarty实例教学 实例篇(三…...
2024/4/21 8:42:37
最新文章
- 指标完成情况对比查询sql
指标完成情况对比查询sql 1. 需求 2. SQL select--部门dept.name as bm,--年度指标任务-新签(万元)ndzbwh.nxqndzbrw as nxqndzbrw,--年度指标任务-收入(万元)ndzbwh.nsrndzbrw as nsrndzbrw,--年度指标任务-回款(万…...
2024/4/30 17:44:33 - 梯度消失和梯度爆炸的一些处理方法
在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言,在此感激不尽。 权重和梯度的更新公式如下: w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...
2024/3/20 10:50:27 - audio_video_img图片音视频异步可视化加载
最近在做即时消息,消息类型除了文字还有音频、视频、图片展示,如果消息很多,在切换聊天框时,会有明显卡顿,后续做了懒加载,方案是只加载用户能看到的资源,看不到的先不加载; LazyAud…...
2024/4/30 3:29:40 - 【Easy云盘 | 第十三篇】分享模块(获取目录信息、获取文件信息、创建下载链接)
文章目录 4.4.7获取目录信息4.4.8获取文件信息4.4.9创建下载链接 4.4.7获取目录信息 明天做 4.4.8获取文件信息 明天做 4.4.9创建下载链接 明天做...
2024/4/30 1:48:29 - 【外汇早评】美通胀数据走低,美元调整
原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...
2024/4/29 23:16:47 - 【原油贵金属周评】原油多头拥挤,价格调整
原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...
2024/4/29 6:03:24 - 【外汇周评】靓丽非农不及疲软通胀影响
原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...
2024/4/29 2:29:43 - 【原油贵金属早评】库存继续增加,油价收跌
原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...
2024/4/29 14:21:50 - 【外汇早评】日本央行会议纪要不改日元强势
原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...
2024/4/27 17:58:04 - 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响
原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...
2024/4/27 14:22:49 - 【外汇早评】美欲与伊朗重谈协议
原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...
2024/4/28 1:28:33 - 【原油贵金属早评】波动率飙升,市场情绪动荡
原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...
2024/4/30 9:43:09 - 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试
原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...
2024/4/27 17:59:30 - 【原油贵金属早评】市场情绪继续恶化,黄金上破
原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...
2024/4/25 18:39:16 - 【外汇早评】美伊僵持,风险情绪继续升温
原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...
2024/4/28 1:34:08 - 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势
原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...
2024/4/26 19:03:37 - 氧生福地 玩美北湖(上)——为时光守候两千年
原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...
2024/4/29 20:46:55 - 氧生福地 玩美北湖(中)——永春梯田里的美与鲜
原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...
2024/4/25 18:39:14 - 氧生福地 玩美北湖(下)——奔跑吧骚年!
原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...
2024/4/26 23:04:58 - 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!
原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...
2024/4/27 23:24:42 - 「发现」铁皮石斛仙草之神奇功效用于医用面膜
原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...
2024/4/28 5:48:52 - 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者
原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...
2024/4/30 9:42:22 - 广州械字号面膜生产厂家OEM/ODM4项须知!
原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...
2024/4/30 9:43:22 - 械字号医用眼膜缓解用眼过度到底有无作用?
原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...
2024/4/30 9:42:49 - 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...
解析如下:1、长按电脑电源键直至关机,然后再按一次电源健重启电脑,按F8健进入安全模式2、安全模式下进入Windows系统桌面后,按住“winR”打开运行窗口,输入“services.msc”打开服务设置3、在服务界面,选中…...
2022/11/19 21:17:18 - 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。
%读入6幅图像(每一幅图像的大小是564*564) f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...
2022/11/19 21:17:16 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...
win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面,在等待界面中我们需要等待操作结束才能关机,虽然这比较麻烦,但是对系统进行配置和升级…...
2022/11/19 21:17:15 - 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...
有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows,请勿关闭计算机”的提示,要过很久才能进入系统,有的用户甚至几个小时也无法进入,下面就教大家这个问题的解决方法。第一种方法:我们首先在左下角的“开始…...
2022/11/19 21:17:14 - win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...
置信有很多用户都跟小编一样遇到过这样的问题,电脑时发现开机屏幕显现“正在配置Windows Update,请勿关机”(如下图所示),而且还需求等大约5分钟才干进入系统。这是怎样回事呢?一切都是正常操作的,为什么开时机呈现“正…...
2022/11/19 21:17:13 - 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...
Win7系统开机启动时总是出现“配置Windows请勿关机”的提示,没过几秒后电脑自动重启,每次开机都这样无法进入系统,此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一:开机按下F8,在出现的Windows高级启动选…...
2022/11/19 21:17:12 - 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...
有不少windows10系统用户反映说碰到这样一个情况,就是电脑提示正在准备windows请勿关闭计算机,碰到这样的问题该怎么解决呢,现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法:1、2、依次…...
2022/11/19 21:17:11 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...
今天和大家分享一下win7系统重装了Win7旗舰版系统后,每次关机的时候桌面上都会显示一个“配置Windows Update的界面,提示请勿关闭计算机”,每次停留好几分钟才能正常关机,导致什么情况引起的呢?出现配置Windows Update…...
2022/11/19 21:17:10 - 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...
只能是等着,别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚,只能是考虑备份数据后重装系统了。解决来方案一:管理员运行cmd:net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...
2022/11/19 21:17:09 - 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?
原标题:电脑提示“配置Windows Update请勿关闭计算机”怎么办?win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢?一般的方…...
2022/11/19 21:17:08 - 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...
关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!关机提示 windows7 正在配…...
2022/11/19 21:17:05 - 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...
钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...
2022/11/19 21:17:05 - 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...
前几天班里有位学生电脑(windows 7系统)出问题了,具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面,长时间没反应,无法进入系统。这个问题原来帮其他同学也解决过,网上搜了不少资料&#x…...
2022/11/19 21:17:04 - 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...
本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法,并在最后教给你1种保护系统安全的好方法,一起来看看!电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中,添加了1个新功能在“磁…...
2022/11/19 21:17:03 - 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...
许多用户在长期不使用电脑的时候,开启电脑发现电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机。。.这要怎么办呢?下面小编就带着大家一起看看吧!如果能够正常进入系统,建议您暂时移…...
2022/11/19 21:17:02 - 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...
配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!配置windows update失败 还原更改 请勿关闭计算机&#x…...
2022/11/19 21:17:01 - 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...
不知道大家有没有遇到过这样的一个问题,就是我们的win7系统在关机的时候,总是喜欢显示“准备配置windows,请勿关机”这样的一个页面,没有什么大碍,但是如果一直等着的话就要两个小时甚至更久都关不了机,非常…...
2022/11/19 21:17:00 - 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...
当电脑出现正在准备配置windows请勿关闭计算机时,一般是您正对windows进行升级,但是这个要是长时间没有反应,我们不能再傻等下去了。可能是电脑出了别的问题了,来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...
2022/11/19 21:16:59 - 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...
我们使用电脑的过程中有时会遇到这种情况,当我们打开电脑之后,发现一直停留在一个界面:“配置Windows Update失败,还原更改请勿关闭计算机”,等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢࿰…...
2022/11/19 21:16:58 - 如何在iPhone上关闭“请勿打扰”
Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...
2022/11/19 21:16:57