ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Понедельник
20 мая
1390704
Eddy_Em (07.01.2024 23:22, просмотров: 1686)
"Зависон" во время стирания флеша на STM32F303CBT6. 

Сразу говорю - МК "китайский", и, судя по тому, что был вначале залочен (так что пришлось первую прошивку делать через USART), БУшный.

Возникает странная штука: когда у меня включен отладчик (даже breakpoints не ставлю), флеш стирается. А как только пробую это без отладчика сделать - фигвам: одну-две странички стирает и стопорится.

Может, кто натыкался на подобное странное поведение?

Если что, вот такой код:

static int erase_pageN(int N){
    int ret = 0;
    FLASH-›AR = (uint32_t)Flash_Data + N*FLASH_blocksize;
    FLASH-›CR |= FLASH_CR_STRT;
    uint32_t xx = 100000;
    while((FLASH-›SR & FLASH_SR_BSY) && --xx) IWDG-›KR = IWDG_REFRESH;
    if(xx == 0) return 1;
    FLASH-›SR = FLASH_SR_EOP;
    if(FLASH-›SR & FLASH_SR_WRPERR){ /* Check Write protection error */
        ret = 1;
        FLASH-›SR = FLASH_SR_WRPERR; /* Clear the flag by software by writing it at 1*/
    }
    return ret;
}
int erase_storage(int npage){ int ret = 0; uint32_t end = 1, start = 0, flsz = 0; if(FLASH_SIZE › 0 && FLASH_SIZE ‹ 20000){ flsz = FLASH_SIZE * 1024; // size in bytes flsz -= (uint32_t)Flash_Data - FLASH_BASE; } DBG("total free blocks: "); printu(flsz / FLASH_blocksize); end = flsz / FLASH_blocksize; if(end == 0) return 1; if(npage › -1){ // erase only one page if((uint32_t)npage ›= end) return 1; start = npage; end = start + 1; } if((FLASH-›CR & FLASH_CR_LOCK) != 0){ FLASH-›KEYR = FLASH_KEY1; FLASH-›KEYR = FLASH_KEY2; } while(FLASH-›SR & FLASH_SR_BSY) IWDG-›KR = IWDG_REFRESH; FLASH-›SR = FLASH_SR_EOP | FLASH_SR_PGERR | FLASH_SR_WRPERR; FLASH-›CR |= FLASH_CR_PER; __disable_irq(); for(uint32_t i = start; i ‹ end; ++i){ if(erase_pageN(i)){ ret = 1; break; } } __enable_irq(); FLASH-›CR &= ~FLASH_CR_PER; return ret; }

На 100-ногом эти же функции нормально отрабатывали и без disable_irq, я это добавил в надежде, что поможет - а фигвам.

Питается МК от 12В через импульсник на 5В, от него через набор резисторов подзаряжается ионистор, а уже оттуда напруга идет на обычный LM1117 (китайского кондера на 4Ф с жутким саморазрядом хватает, чтобы МК около полуминуты работал - с нормальным ионистором будет несколько минут!).

Если кому интересно, вот эта железяка (там pdf можно глянуть, чтобы не грузить все и тыкать кикадом). Я по ее поводу недавно вздыхал, какой же убогий даташит у ADUM4160. Вот, USB у меня заработал, CAN заработал, протокол понемногу начал отлаживать - фигня какая-то. Текущие изменения еще не сделал коммитом, от кода по ссылке отличается достаточно.

eddy-em.livejournal.com github.com/eddyem