主题中讨论的其他器件: SEGGER
您好!
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
您好!
来自 Matt 的代码:
而(bytes_left > 0){
if (isSectorStart ((uint32_t) flash_address)))
{
taskENTER_critical ();
//在发出擦除命令之前确保 FSM 不忙。
while (FAPI_CHECK_FSM_READY_BUSY = Fapi_Status_FsmBusy);
//数据在 bank1开始时首先将其擦除
Fapi_status = Fapi_issueODE19 CommandWithAddress (Fapi_EraseSector、(uint32_t *) flash_address);
while (FAPI_CHECK_FSM_READY_BUSY = Fapi_Status_FsmBusy);
Fapi_status =(Fapi_StatusType) FAPI_GET_FSM_STATUS;
if (fapi_status!= fapi_Status_Success){
//HealthMonitor::SetFault (flash_programming_failure);
BootMonitor::Set_ddownload_state (flash_failure);
适用于(;);
}
taskEXIT_critical ();
}
/*如果要使用 Fapi_AutoEccGeneration 选项,则必须设置要编程的数据大小
* 8或16字节、因为 ECC 是基于64位(8字节)计算的。 *
uint32_t write_bytes =(bytes_left > flash_page_size? flash_page_size:bytes_left);
taskENTER_critical ();
Fapi_status = Fapi_issueProgrammingCommand ((uint32_t *) flash_address、
source_ptr、
Write_Bytes、
0、
0、
Fapi_AutoEccGeneration);
flashLoader.num_Bytes_write= write_bytes;
while (FAPI_CHECK_FSM_READY_BUSY = Fapi_Status_FsmBusy);
Fapi_status =(Fapi_StatusType) FAPI_GET_FSM_STATUS;
if (fapi_status!= fapi_Status_Success){
//HealthMonitor::SetFault (flash_programming_failure);
BootMonitor::Set_ddownload_state (flash_failure);
适用于(;);
}
taskEXIT_critical ();
bytes_left -= FLASH_PAGE_SIZE;
FLASH_ADDRESS += FLASH_PAGE_SIZE;
source_ptr += flash_page_size;
if (bytes_left <=(byte_printion_count -(16 * 1024))
{
_debug.Syslog (log_info、"在地址%d 中刷写%d 个字节 %d 字节剩余"、WRITE_Bytes、FLASH_ADDRESS、bytes_left);
xTaskDelay (10);
byte_prints_count = bytes_left;
}
//xTaskDelay (1);
}
bool FlashLoader:isSectorStart (uint32_t 地址)
{
uint32_t sec_size = 0x020000;
uint32_t small_sec_size = 0x08000;
if (地址> 0x0001FFFF)
{
if (address % sec_size = 0)
{
返回 true;
}
}
其他
{
if (address % small_sec_size = 0)
{
返回 true;
}
}
返回 false;
}
谢谢、
Gabe Garza
TI 支持
此时、我使用的是 BL_FLASH.c 中的示例代码、但未进行任何修改、因此我非常确信闪存代码正常(它仍可在不包含引导加载程序的其他地址工作)。
我尝试禁用中断、但遇到了阻碍
我注意 到、尽管调用_disable_FIQ_interrupt_、但 CPSR 中的相关位并未更改。 我进行了一些挖掘、由于 SCTLR 寄存器中的 NMFI 位置位、它看起来无法通过软件进行更改。 该位似乎是通过硬件置位的、不能简单地通过代码进行更改。
您是否知道禁用快速中断的任何其他方法? 计时器中断是否计为快速中断?
此外、我在异常矢量中放置了断点、以查看我获得的异常类型(这是在它们被擦除之后、因此在这里它将持续失败)。
它在0x0C 处停止、此地址为预取中止地址。 我尝试禁用中止只是为了查看发生了什么、但也无法像 FIQ 位那样更改 CPSR 中的 ABORT 位。
是否可以禁用中止? 我应该如何处理这一问题?