代码如下;写不进去FLASH中,没反应,求大佬们解答;写了半天,调了2天没反应
一.说明手册上写Flash编程/擦除配置编程参数:
1.解锁 Flash 配置寄存器 (FLASH_CR1/2) 并进行编程
2.解锁 Flash 选项配置寄存器 (FLASH_OPTCR)(未配置)
3.设置编程并行位数 (32)
4.设置编程延时
写入顺序: PG1/2 位置 1;检查目标存储区是否受保护;连续写入 32 个数据字节(Flash 字).
[C] 纯文本查看 复制代码 bool Flash_Write(uint32_t Address, uint8_t* pDat, uint32_t Size)
{
uint32_t i, *p;
uint8_t BlockSelec, row_index = 8; //块,扇区
if(FLASH_BLOCK2_BASE > Address && Address >= FLASH_BLOCK1_BASE)
{
BlockSelec = 1;
}
else if(ADDR_FLASH_SECTOR_7_BANK2 > Address && Address >= FLASH_BLOCK2_BASE)
{
BlockSelec = 2;
}
else
{
return false;
}
if(Address + Size > FLASH_ADDRESS_BASE + CPU_FLASH_SIZE) return false;
if(Size == 0)return true;
__set_PRIMASK(1);
Flash_Unlock();
FLASH->CR1 |= FLASH_CR_PSIZE_1;
FLASH->CR2 |= FLASH_CR_PSIZE_1;
FLASH->ACR |= FLASH_ACR_WRHIGHFREQ | FLASH_ACR_LATENCY_4WS;
for(i = 0; i < Size / 32; i++)
{
uint32_t FlashWorld[8] = {0};
memcpy((uint8_t*)FlashWorld, pDat, 32);
p = FlashWorld;
pDat += 32;
if(BlockSelec == 1)
{
while(FLASH->SR1 & FLASH_SR_QW);
FLASH->CR1 |= FLASH_CR_PG | FLASH_CR_START; //并行32位;FLASH->CCR1 = 0xFEF0000;
}
else if(BlockSelec == 2)
{
while(FLASH->SR2 & FLASH_SR_QW);
FLASH->CR2 |= FLASH_CR_PG | FLASH_CR_START;FLASH->CCR2 = 0xFEF0000;//写保护标志位清0
}
do
{
*(uint32_t*)Address++ = *p++;
row_index--; //4x8=32
}
while(row_index != 0U); //32字节
Address += 32;
}
if(Size % 32)
{
uint32_t FlashWorld[8] = {0, 0, 0, 0, 0, 0, 0, 0}; //256bit
memcpy((char*)FlashWorld, pDat, Size % 32);
p = FlashWorld;
// __ISB();
// __DSB();
if(BlockSelec == 1)
{
// FLASH->CCR1 = 0xFEF0000;
while(FLASH->SR1 & FLASH_SR_QW);
FLASH->CR1 |= FLASH_CR_PG;
}
else if(BlockSelec == 2)
{
// FLASH->CCR2 = 0xFEF0000;
while(FLASH->SR2 & FLASH_SR_QW);
FLASH->CR2 |= FLASH_CR_PG ;
}
do
{
*(uint32_t*)Address++ = *p++; //4
row_index--; //4x8=32
}
while(row_index != 0U); //32字节
while(FLASH->SR1 & FLASH_SR_BSY);
while(FLASH->SR2 & FLASH_SR_BSY);
// __ISB();
// __DSB();
}
Flash_lock();
__set_PRIMASK(0);
p = NULL;
return true;
}
|