c语言中flash函数,stm32f4xx_flash.c的函数FLASH_GetStatus是否有BUG ?

本文档详述了一次在STM32 Flash操作中遇到的问题,即在未启用中断的情况下,通过`FLASH_ITConfig`开启OPERR和EOP中断可能导致错误判断。作者怀疑这是库V1.1.0的一个bug,建议其他开发者验证并讨论解决方法。
摘要由CSDN通过智能技术生成

经过验证,确实是个BUG。在FLASH测试函数中打开OPERR和EOP中断,,但是NVIC中不使能,,这样不会响应FLASH中断,

但是FLASH操作结束后,会响应的设置OPERR和EOP标志位。

库的版本是V1.1.0,11-January-2013

不敢100%肯定,只敢99%确定是BUG,所以欢迎各位STM32er验证。

/*

Flash read and write test example

- 对扇区11进行擦除,然后写入1024字节的数据

*/

void Flash_Read_Write_Test(void)

{

uint32_t data, i, address ;

FLASH_Status status;

FlagStatus FStatus;

//查看扇区写保护状态

data = FLASH_OB_GetWRP();

while(USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET);

USART_SendData(USART3, data);

//查看扇区读保护级别状态

FStatus = FLASH_OB_GetRDP();

while(USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET);

USART_SendData(USART3, FStatus);

//清除扇区11的写保护

FLASH_OB_Unlock();

FLASH_OB_WRPConfig(OB_WRP_Sector_11, DISABLE);

status = FLASH_OB_Launch();

FLASH_OB_Lock();

if(FLASH_COMPLETE != status)

return;

//准备写数据

FLASH_Unlock();

//打开OPERR和EOP中断,FLASH_Status FLASH_GetStatus(void)函数将出现BUG

FLASH_ITConfig(FLASH_IT_ERR|FLASH_IT_EOP, ENABLE);

//擦除扇区11

FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR |

FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR|FLASH_FLAG_PGSERR);

status = FLASH_EraseSector(FLASH_Sector_11, VoltageRange_3);

if(FLASH_COMPLETE != status)

return;

//读数据,验证扇区11是否被擦除

address = 0x080E0000;//扇区11首地址

for(i=0; i<256*4; i++){

data = *((uint8_t*)address + i);

//输出到串口

while(USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET);

USART_SendData(USART3, data);

}

//写数据

address = 0x080E0000;//扇区11首地址

for(i=0; i<256; i++){

/* Clear pending flags (if any) */

FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR |

FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR|FLASH_FLAG_PGSERR);

data = i<<24 | i<<16 | i<<8 | i;

status = FLASH_ProgramWord(address + i*4, data);//写一个字

//status = FLASH_ProgramHalfWord(Address + i*2, uint16_t Data);//写一个半字

//status = FLASH_ProgramByte(Address + i, uint8_t Data);//写一个字节

if(FLASH_COMPLETE != status)

break;

}

FLASH_Lock();

//读数据,验证是否写正确

address = 0x080E0000;//扇区11首地址

for(i=0; i<256*4; i++){

data = *((uint8_t*)address + i);

//输出到串口

while(USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET);

USART_SendData(USART3, data);

}

}

修正的FLASH_GetStatus函数

/**

* @brief  Returns the FLASH Status.

* @param  None

* @retval FLASH Status: The returned value can be: FLASH_BUSY, FLASH_ERROR_PROGRAM,

*                       FLASH_ERROR_WRP, FLASH_ERROR_OPERATION or FLASH_COMPLETE.

*/

FLASH_Status FLASH_GetStatus(void)

{

FLASH_Status flashstatus = FLASH_COMPLETE;

if((FLASH->SR & FLASH_FLAG_BSY) == FLASH_FLAG_BSY)

{

flashstatus = FLASH_BUSY;

}

else

{

if((FLASH->SR & FLASH_FLAG_WRPERR) != (uint32_t)0x00)

{

flashstatus = FLASH_ERROR_WRP;

}

else

{

/*

此处是否有BUG?应该是if((FLASH->SR & (uint32_t)0xE0) != (uint32_t)0x00)

当PGSERR、PGPERR、PGAERR有至少1个不为0时,则表示FLASH_ERROR_PROGRAM

OPERR和EOP只有当ERRIE = 1,EOPIE =1时才会设置,并且OPERR表示操作错误,

EOP表示编程或擦除操作成功完成

在使能中断情况下,可能是个BUG,未使能中断时,没有问题

经过验证,通过FLASH_ITConfig(FLASH_IT_ERR|FLASH_IT_EOP, ENABLE)打开中断,

发现在EOP置1的情况下,此处返回FLASH_ERROR_PROGRAM

*/

if((FLASH->SR & (uint32_t)0xE0) != (uint32_t)0x00)

{

flashstatus = FLASH_ERROR_PROGRAM;

}

else

{

if((FLASH->SR & FLASH_FLAG_OPERR) != (uint32_t)0x00)

{

flashstatus = FLASH_ERROR_OPERATION;

}

else

{

flashstatus = FLASH_COMPLETE;

}

}

}

}

/* Return the FLASH Status */

return flashstatus;

}

### 回答1: stm32f4xx_cryp_des.c是一个STM32F4系列微控制器的加密功能驱动程序文件,用于实现DES(Data Encryption Standard)算法的数据加密和解密操作。 DES算法是一种对称加密算法,常被用于保护数据的机密性。它使用相同的密钥对数据进行加密和解密。stm32f4xx_cryp_des.c文件实现了DES算法的核心功能,包括密钥生成、轮加密和轮解密等。通过使用该驱动程序文件,开发者可以利用STM32F4系列微控制器的硬件加速模块来执行DES算法的加密和解密操作。 stm32f4xx_cryp_des.c文件的代码是针对STM32F4系列微控制器的特定硬件设计的,通过配置寄存器和调用硬件加速模块的API函数,实现了DES算法的高效加解密。该驱动程序文件还提供了一些用于用户接口的API函数,方便开发者进行DES算法的调用和数据的加解密操作。 stm32f4xx_cryp_des.c文件是一个重要的软件资源,对于需要在STM32F4系列微控制器上实现数据加解密功能的应用程序来说是非常重要的。通过使用该驱动程序文件,开发者可以简化开发过程,提高系统性能,并确保数据的安全性。 总而言之,stm32f4xx_cryp_des.c是一个用于STM32F4系列微控制器的加密功能驱动程序文件,提供了对DES算法的支持,通过使用该文件,开发者可以实现DES算法的数据加密和解密操作,提高系统性能并确保数据的安全性。 ### 回答2: stm32f4xx_cryp_des.c是一个用于实现数据加密算法DES的文件,适用于STM32F4系列的微控制器。 DES(Data Encryption Standard)是一种对称加密算法,广泛应用于数据保密方面。此文件实现了DES算法的各种功能,包括初始化加密参数、设置加密模式、加密和解密数据等。 该文件函数 stm32f4xx_cryp_des_init() 用于初始化加密参数,包括密钥、IV(初始化向量)和加密模式等。可以通过该函数设置DES算法所需的参数,以确保加密过程的安全性和准确性。 此外,该文件还提供了用于设置加密模式的函数 stm32f4xx_cryp_des_ecb_mode_enable() 和 stm32f4xx_cryp_des_cbc_mode_enable()。ECB(Electronic Codebook)模式和CBC(Cipher Block Chaining)模式是DES算法常用的加密模式,可以根据实际需求选择适合的模式。 在数据加密和解密方面,该文件提供了函数 stm32f4xx_cryp_des_encrypt() 和 stm32f4xx_cryp_des_decrypt()。这两个函数可以通过传入明文数据和密钥,进行数据的加密和解密操作。加密后的数据可以用于保护数据的传输和存储,解密后可以还原原始数据。 总之,stm32f4xx_cryp_des.c文件是STM32F4系列微控制器上实现DES加密算法的一个重要组件。通过该文件提供的函数,可以实现对数据的高效加密和解密操作,保护数据的安全性和完整性。 ### 回答3: stm32f4xx_cryp_des.c是一段用于STM32F4系列微控制器上的DES(Data Encryption Standard,数据加密标准)加密算法的C语言代码。 DES是一种对称加密算法,使用相同的密钥进行加密和解密。它将64位的明文分为左右两个32位的数据块,并经过16轮的迭代加密处理,最终得到64位的密文。DES算法包括了数据置换、Feistel轮函数、置换选择以及密钥置换等步骤。 stm32f4xx_cryp_des.c代码实现了DES算法的加密和解密功能,并适配了STM32F4系列微控制器的硬件资源。代码通过调用STM32F4的加密/解密模块来进行DES运算,实现了高效的加解密功能。 在代码,用户可以设置DES的加密/解密模式(ECB、CBC、CTR等)、填充模式(No padding、PKCS7等)、密钥长度以及密钥等参数。用户可以根据具体需求调用适当的函数进行加密和解密操作。 该代码的使用方便灵活,可以在STM32F4系列微控制器上进行数据加密和解密的开发。对于需要进行数据保护的应用场景,该代码可以提供一种可靠的加密解决方案。同时,由于代码是基于硬件加速的加密模块实现的,因此在性能上也有一定的优势。 总的来说,stm32f4xx_cryp_des.c是一段STM32F4系列芯片上实现DES加密算法的C语言代码,能够提供可靠、高效的数据加密解决方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值