ZHCADD5A November 2023 – April 2024 TMS320F28P650DH , TMS320F28P650DK , TMS320F28P650SH , TMS320F28P650SK , TMS320F28P659DH-Q1 , TMS320F28P659DK-Q1 , TMS320F28P659SH-Q1
Configure_Protection_Masks 提供了为选择用于 EEPROM 仿真的任何扇区禁用写入/擦除保护的功能。这是通过计算要传递到 Fapi_setupBankSectorEnable 函数的适当掩码来完成的。该函数需要两个参数,即指向所选闪存扇区编号的指针和要仿真的闪存扇区的数量。有关 Fapi_setupBankSectorEnable 函数实现的更多详细信息,请参阅 TMS320F28P65x 闪存 API 版本 3.02.00.00 参考指南。
该函数的返回值用于禁用为 EEPROM 仿真选择的闪存扇区中的写入/擦除保护。
// Initialize a variable to store the bits indicating which sectors
// need to have write/erase protection disabled.
// The first lower 32 bits will represent CMDWEPROTA and the upper 32
// bits will represent CMDWEPROTB.
uint64 Protection_Mask_Sectors = 0;
// If we have more than one Flash Sector
if (Num_EEPROM_Sectors > 1)
{
uint64 Unshifted_Sectors;
uint16 Shift_Amount;
// If all sectors use Mask A
if (Sector_Numbers[0] < 32 && Sector_Numbers[1] < 32)
{
// Configure Mask A
Unshifted_Sectors = (uint64) 1 << Num_EEPROM_Sectors;
Unshifted_Sectors -= 1;
Protection_Mask_Sectors |= (Unshifted_Sectors << Sector_Numbers[0]);
}// If all sectors use Mask B
else if (Sector_Numbers[0] > 31 && Sector_Numbers[1] > 31)
{
// Configure Mask B
Shift_Amount = ((Sector_Numbers[1] - 32)/8) - ((Sector_Numbers[0] - 32)/8) + 1;
Unshifted_Sectors = (uint64) 1 << Shift_Amount;
Unshifted_Sectors -= 1;
Protection_Mask_Sectors |= (Unshifted_Sectors << ((Sector_Numbers[0] - 32)/8));
Protection_Mask_Sectors = Protection_Mask_Sectors << 32;
} else // If both Masks A and B need to be configured
{
// Configure Mask B
Shift_Amount = ((Sector_Numbers[1] - 32)/8) + 1;
Unshifted_Sectors = (uint64) 1 << Shift_Amount;
Unshifted_Sectors -= 1;
Protection_Mask_Sectors |= Unshifted_Sectors;
Protection_Mask_Sectors = Protection_Mask_Sectors << 32;
// Configure Mask A
Unshifted_Sectors = (uint64) 1 << ((32 - Sector_Numbers[0]) + 1);
Unshifted_Sectors -= 1;
Protection_Mask_Sectors |= (Unshifted_Sectors << Sector_Numbers[0]);
}
} else { // If only using 1 Flash Sector
if(Sector_Numbers[0] < 32)
{
Protection_Mask_Sectors |= ((uint64) 1 << Sector_Numbers[0]);
} else
{
Protection_Mask_Sectors |= ((uint64) 1 << ((Sector_Numbers[0] - 32)/8));
Protection_Mask_Sectors = Protection_Mask_Sectors << 32;
}
}
return Protection_Mask_Sectors;
为了进行比较,F28003x EEPROM 示例工程 Configure_Protection_Masks 的功能与 F28P65x EEPROM 示例工程的功能不同,后者有一定量的扇区可用于保护。写入/擦除保护掩码中的每个位表示它自己的扇区。// Initialize a variable to store the bits indicating which sectors need to have write/erase
// protection disabled.
uint16 Protection_Mask_Sectors = 0;
uint16 Unshifted_Sectors;
// If we have more than one Flash Sector
if (Num_EEPROM_Sectors > 1)
{
// Configure mask
Unshifted_Sectors = (uint16) 1 << Num_EEPROM_Sectors;
Unshifted_Sectors -= 1;
Protection_Mask_Sectors |= (Unshifted_Sectors << Sector_Numbers[0]);
} else { // If only using 1 Flash Sector
if(Sector_Numbers[0] < 16)
{
Unshifted_Sectors = (uint16) 1 << Sector_Numbers[0];
Protection_Mask_Sectors |= Unshifted_Sectors;
}
}
return Protection_Mask_Sectors;