Jump to content

    

pvo125

Участник
  • Content Count

    44
  • Joined

  • Last visited

Community Reputation

0 Обычный

About pvo125

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

Контакты

  • Сайт
    http://
  • ICQ
    0

Информация

  • Город
    Черногорск Хакасия

Recent Profile Visitors

1384 profile views
  1. Прошивка QSPI из Keil.

    Нашел я и у себя ошибку. команда 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.
  2. Прошивка QSPI из Keil.

    Почему при включении тактирования qspi у Вас висло все? Решили эту проблему?
  3. Прошивка QSPI из Keil.

    В том то и затык у меня. Эти же две функции запись страницы и очистки сектора хорошои срабатывают в самом проекте который используют эту же spi flash. Но вот в этом алгоритме для загрузки и стирания почему то не работают. Видимо нужно отлаживать сам проект алгоритиа. Делать какие то флаги и светодиода и моргать чтоб понять что вызывается и как. И да у меня сама флэшка qspi но используется старый контроллер который работает в режиме spu.
  4. Прошивка QSPI из Keil.

    В проекте все функции записи страницы стирания сектора и инит прописаны. Они же в основной прошивке корректно работают.
  5. Прошивка QSPI из Keil.

    Не пробовал собрать мой проект и получить FLM. Отправлял в личных сообщениях? Там без HAL. Ошибку кейл не выдает при заливке. Правда на самом деле и не заливает
  6. Про это действие можно подробнее? Как исключить? Файл инит править для отладки? (в настройках есть возможность его подключать.)Потому что на данном этапе думаю мне это как раз и нужно.
  7. Приветствую всех! Нужно все массивы с картинками(битмапы) собрать в один бинарный файл. Далее этот файл будет загружаться отдельно в внешнюю 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) получается ошибка. Далее завершается с ошибкой. Как мне настроить проект или секцию эту чтобы отладчик не пытался прошивать при старте отладки.
  8. STM32f429 Stop режим c under-drive

    Здравия Всем! Хочу отправить данный МК в 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 мка. Получается ни по току ни по флагу режим не активируется. Подскажите кто разобрался с этим!
  9. STM32F091 CAN filters init

    ЦитатаCAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask; Не знаю в какой режим Вы пытаетесь настроить фильтры но строчка выше говорит что в режиме Id Mask. Т е пропускать все сообщения если они по маске проходят а нужно в режиме списка идентификаторов ID List.В SPL есть такой параметр CAN_FilterMode_IdList может быть надо так писать CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdList; Не уверен на SPL инициализацию не делал. Главное отладчиком посмотрите чтобы в регистре CAN1_FB1M были установлены биты FBM0 FBM1 которые и показывают что банки 0 и 1 в режиме списка идентификаторов.
  10. STM32F091 CAN filters init

    Выбираете 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
  11. Обновление прошивки через CAN

    ЦитатаА Вы вообще проверили запись по 8 байт? Что-то мне подсказывает, что это возможно не будет работать. Да проверял. я же писал выше что вся прошивка записывается и даже crc32 всего массива по окончанию записи совпадает. Меня интересовал вопрос в вычислении CRC дополнительно т е программно при принятии каждого пакета(8 байт). В stm можно писать от 1 - до 4 байт за раз( можно еще 8 но там вроде нужен внешний источник). (В stm32f10 вроде минимум 4 байта двумя посылками по 2 байта может и наврал пока до них не дошел).
  12. Обновление прошивки через CAN

    ЦитатаУж не запись ли с ожиданием завершения сделали внутри ISR? wacko.gif Да так и сделал Специально не считал но думал что запись 2 слов по 4 байта за раз во флэш не займет много времени. Тем более что в это время все равно останавливается выполнение инструкций из основной (рабочей ) части флэш. В stm32f429 можно флэш разбить на 2 части с выполнинием кода из одной из записи стирания другой. Но так не сделал потому что в сети есть stm32f10x контроллер и у них такой фичи нет потому решил делать общий алгоритм чтобы на оба типа можно было перенести. А в таком общем виде вторая половина и первая физически одно целое и выполниние инструкций останавливается.(последнюю фразу хочу уточнить у участников форума).
  13. Обновление прошивки через CAN

    Цитатавсё так, но от потери сообщения это не спасет Поясните пожалуйста. Как я понял в кан сети сообщение не может потеряться. Ведь если никто не принял сообщение передатчик также будет перепосылать последнее сообщение. Или Вы имеете ввиду случай когда кабель физически поврежден?
  14. Обновление прошивки через CAN

    Принимаю прошивку во вторую половину флэш. После принятия ресет контроллера и запуск бутлоадера который перепишет со второй половины в первую (рабочую) и затем снова ресет и запуск обновленного приложения (из первой половины). Может это конечно и лишнее переписывать с одного в другое но вторая часть все равно не используется прошивки меньше половины. Пишу по 8 байт так как сама функция записи находится в обработчике прерывания для CAN и считаю 8 байт быстро записываются. И действительно если при записи выполнение останавливается то оно останавливается "не на долго". Можно конечно и буфер в озу сделать и писать во флэш например по сектору 1-16 кб но решил делать так. Не знаю время покажет может быть и переделаю. Кстати нашел подтверждения для своего заключения в первом посте. На сайте https://www.can-cia.org/can-knowledge/can/crc/ нашел описание этого механизма. ЦитатаThe receivers use the same polynomial to calculate the check sum from the bits as seen on the bus-lines. The self-calculated check sum is compared with the received on. If it matches, the frame is regarded as correctly received and the receiving node transmits a dominant state in the ACK slot bit, overwriting the recessive state of the transmitter. In case of a mismatch, the receiving node sends an Error Frame after the ACK delimiter. Если правильно перевел то сообщение сохраняется в FIFO и генерируется прерывание если crc аппаратно проверенное совпадает. Если нет то приемный узел начинает передавать Eror Frame и передатчик перепосылает сообщение. Все это без участия ядра контроллера и значит считать программно CRC каждого принятого пакет не стоит он уже проверен и можно писать во flash.
  15. Обновление прошивки через CAN

    ЦитатаНа принимающей стороне исходный пакет собирается и анализируется, в том числе производится проверка CRC исходного пакета. Про это я и спрашивал. Понятно что можно каждое сообщение проверять на CRC и если не совпадает то заново просить переотправить. Но хотел использовать аппаратную функцию модуля CAN если он действительно работает как я думаю и описал выше тогда мне просто надо писать во флэш принятое сообщение так как оно уже прошло фильтрацию и проверку CRC. А если не прошло то ведущий повторит автоматически. Сейчас у меня все работает "на столе" и обновление происходит и CRC32 всей новой прошивки по окончанию всей передачи совпадает. Но для меня надо понять это происходит просто пока на столе или потому что модули CAN сами отбрасывают и переотправляют сообщения и в итоге во флэш получается корректная CRC. Т.е сейчас алгоритм такой пишу во флэш все что приходит когда я попадаю в прерывание от CAN и в конце CRC32 всего массива если не совпало то заново процесс обновления. Но так не очень правильно потому что нужно опять стирать флэш. Лучше уж сначала проверить пришедший пакет и потом записать.