Jump to content

    

pvo125

Участник
  • Content Count

    46
  • Joined

  • Last visited

Community Reputation

0 Обычный

About pvo125

  • Rank
    Участник
  • Birthday 06/30/1980

Контакты

  • Сайт
    Array
  • ICQ
    Array

Информация

  • Город
    Array

Recent Profile Visitors

1467 profile views
  1. SDIO на STM32F723

    Можно не искать макрос а просто в месте где удобно в прерывания после чтения или в потоке но главное перед тем как будете проверять последние 2 байта считанного сектора через dma сделать анулирование кэша SCB_InvalidateCache иначе для процессора не видны новые записанные через dma в память данные сектора карты. Ядро видит старые данные в кэше. И его надо анулирование.
  2. SDIO на STM32F723

    Если включён кэш данных то нужно делать clean и invalidate кэша после чтения сектора dma в память. По моему при чтении с карты через, dma нужно в прерывания от dma или sdio в конце чтения вызывать cmsis функцию CleanDCache или что то похожее не помню точно как нащывается
  3. Нашел я и у себя ошибку. команда write enable посланная spi флэшке не срабатывала. А не срабатывала она из за того что была описана так static void WriteEnable(void) { CS_LOW(); SPI1->DR=WREN; //WREN=0x06 while((SPI1->SR&SPI_SR_BSY)==SPI_SR_BSY) {} CS_HIGH(); } а нужно так static void WriteEnable(void){ CS_LOW(); SPI1->DR=WREN; //WREN=0x06 while(!(SPI1->SR&SPI_SR_TXE)) {} while((SPI1->SR&SPI_SR_BSY)==SPI_SR_BSY) {} CS_HIGH(); } Этот бит BSY не сразу ставиться при записи очередного байта в регистр DR. 2 такта шины APB нужно. Но в проекте у меня это срабатывала. А когда кейлу эти функции подсовывал то нет. В итоге когда собрал проект с оптимизацией 3 то и в проекте перестало работать с этого места начал копать и набрел на эту задержку флага. Видимо без оптимизации успевал устанавливаться. Короче в любом случае если один байт посылается сначала проверять флаг TXE и следом за ним уже BSY.
  4. Почему при включении тактирования qspi у Вас висло все? Решили эту проблему?
  5. В том то и затык у меня. Эти же две функции запись страницы и очистки сектора хорошои срабатывают в самом проекте который используют эту же spi flash. Но вот в этом алгоритме для загрузки и стирания почему то не работают. Видимо нужно отлаживать сам проект алгоритиа. Делать какие то флаги и светодиода и моргать чтоб понять что вызывается и как. И да у меня сама флэшка qspi но используется старый контроллер который работает в режиме spu.
  6. В проекте все функции записи страницы стирания сектора и инит прописаны. Они же в основной прошивке корректно работают.
  7. Не пробовал собрать мой проект и получить FLM. Отправлял в личных сообщениях? Там без HAL. Ошибку кейл не выдает при заливке. Правда на самом деле и не заливает
  8. Про это действие можно подробнее? Как исключить? Файл инит править для отладки? (в настройках есть возможность его подключать.)Потому что на данном этапе думаю мне это как раз и нужно.
  9. Приветствую всех! Нужно все массивы с картинками(битмапы) собрать в один бинарный файл. Далее этот файл будет загружаться отдельно в внешнюю spi flash. Делаю так Создал в scatter файле регион и секцию extrom LR_IROM1 0x08004000 0x00040000 { ; load region size_region ER_IROM1 0x08004000 0x00040000 { ; load address = execution address *.o (RESET, +First) *(InRoot$$Sections) .ANY (+RO) } RW_IRAM1 0x20000000 0x00010000 { ; RW data .ANY (+RW +ZI) } } LR_ROM1 0x00010000 0x00010000 { ER_ROM1 0x00010000 0x00010000 { *(extrom) } } Далее перед всеми массивами с битмапами добавил строчку. __attribute__((section("extrom"))) const char bitmap[]={.........}; Собираю проект и далее с помошью утилиты fromelf делаю бинарник из axf файла. Вернее fromelf делает 2 файла обзывает их ER_ROM1 - 150 KB бинарник с кодом ER_ROM2 -10 KB бинарник с картинками. На этом этапе все четко и именно то чего добивался. Далее я пытаюсь запустить отладку и отладчик пытается прошить сначала ER_ROM2 по адресу 0x0001 0000 ('этот адрес может быть и 0x0 или 0x1000 он во внешней spi flash) получается ошибка. Далее завершается с ошибкой. Как мне настроить проект или секцию эту чтобы отладчик не пытался прошивать при старте отладки.
  10. Здравия Всем! Хочу отправить данный МК в Stop режим с меньшим потреблением. Делаю следующее: PWR->CR |=PWR_CR_LPDS; //В Stop-mode работает low-power regulator PWR->CR |=PWR_CR_FPDS; //Flash в power-down в Stop режиме PWR->CR |=PWR_CR_LPUDS; // low-power regulator в режим under-drive; PWR->CR |=PWR_CR_UDEN; // Включаю собственно сам режим under-drive while(!(PWR->CSR & PWR_CSR_UDSWRDY)) {} Программа зависает на ожидании флага PWR_CSR_UDSWRDY который должен выставиться если режим активируется но этого не происходит. Сами биты UDEN устанавливаются. Ток потребления должен снизиться больше чем в 2 раза. Если просто Stop-mode когда флеш не выключена, регулятор выбран основной и режим under-drive не активирован --- 400 мка. И когда флэш в power down, выбран low-power регулятор и еще активирован режим under-drive ---120 мка. Получается ни по току ни по флагу режим не активируется. Подскажите кто разобрался с этим!
  11. Не знаю в какой режим Вы пытаетесь настроить фильтры но строчка выше говорит что в режиме Id Mask. Т е пропускать все сообщения если они по маске проходят а нужно в режиме списка идентификаторов ID List.В SPL есть такой параметр CAN_FilterMode_IdList может быть надо так писать CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdList; Не уверен на SPL инициализацию не делал. Главное отладчиком посмотрите чтобы в регистре CAN1_FB1M были установлены биты FBM0 FBM1 которые и показывают что банки 0 и 1 в режиме списка идентификаторов.
  12. Выбираете 11 битный идентификатор. Далее в режиме ID List чтоб только полное совпадение ID пропускалось фильтром. Далее 16 битный режим фильтров. Получится на один банк например первый настроить 4 фильтра ( для сообщений 0x434 0x3b3 0x171 0x42f) для пятого ID нужно будет задействовать второй банк. Далее пример с записью в регистры CAN. Если на SPL будете делать все равно отладчиком надо сравнить значения самих фильтров со значением ниже. Как мапятся показано ниже STDID[10:3] STDID[2:0] RTR IDE EXID[17:15] CAN1->FM1R |= CAN_FM1R_FBM1; //Filters bank 1 mode ID List CAN1->FS1R&=~CAN_FS1R_FSC1 // Filters bank 1 scale 16 bits CAN1->FFA1R|=CAN_FFA1R_FFA1; // Filters bank 1 FIFO1 4 3 4 RTR IDE EXTID 1 0 0 | 0 0 1 1 | 0 1 0 0 | 0 | 0 | 000 1 0 0 0 | 01 1 0|1 0 0 0| 0 000 = 0x 8680 3 b 3 RTR IDE EXTID 0 1 1 |1 0 1 1 | 0 0 1 1 | 0 | 0 | 000 0 1 1 1| 0 1 1 0 |0 1 1 0 | 0 000 = 0x7660 CAN1->sFilterRegister[1].FR1=0x76608680; //Filters bank 1 fmi=00 ID=0x434 IDE=0 RTR=0 data_frame ( 11 bit ID ) //Filters bank 1 fmi=01 ID=0x3b3 IDE=0 RTR=0 data_frame 1 7 1 RTR IDE EXTID 0 0 1| 0 1 1 1 | 0 0 0 1 | 0 | 0 | 000 0 0 1 0 |1 1 1 0 |0 0 1 0 | 0 000 = 0x 2E20 4 2 f RTR IDE EXTID 1 0 0| 0 0 1 0 | 1 1 1 1 | 0 | 0 | 000 1 0 0 0 |0 1 0 1| 1 1 1 0 | 0 000 = 0x85E0 CAN1->sFilterRegister[1].FR2=0x85E0 2E20; //Filters bank 1 fmi=02 ID=0x171 IDE=0 RTR=0 data_frame //Filters bank 1 fmi=03 ID=0x42f IDE=0 RTR=0 data_frame
  13. Да проверял. я же писал выше что вся прошивка записывается и даже crc32 всего массива по окончанию записи совпадает. Меня интересовал вопрос в вычислении CRC дополнительно т е программно при принятии каждого пакета(8 байт). В stm можно писать от 1 - до 4 байт за раз( можно еще 8 но там вроде нужен внешний источник). (В stm32f10 вроде минимум 4 байта двумя посылками по 2 байта может и наврал пока до них не дошел).
  14. Да так и сделал :crying: Специально не считал но думал что запись 2 слов по 4 байта за раз во флэш не займет много времени. Тем более что в это время все равно останавливается выполнение инструкций из основной (рабочей ) части флэш. В stm32f429 можно флэш разбить на 2 части с выполнинием кода из одной из записи стирания другой. Но так не сделал потому что в сети есть stm32f10x контроллер и у них такой фичи нет потому решил делать общий алгоритм чтобы на оба типа можно было перенести. А в таком общем виде вторая половина и первая физически одно целое и выполниние инструкций останавливается.(последнюю фразу хочу уточнить у участников форума).
  15. Поясните пожалуйста. Как я понял в кан сети сообщение не может потеряться. Ведь если никто не принял сообщение передатчик также будет перепосылать последнее сообщение. Или Вы имеете ввиду случай когда кабель физически поврежден?