Jump to content

    

owl

Свой
  • Content Count

    90
  • Joined

  • Last visited

Community Reputation

0 Обычный

About owl

  • Rank
    Частый гость
  • Birthday 10/02/1979

Контакты

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

Информация

  • Город
    Смоленск
  1. Всем здравствуйте. Немного повторюсь по теме. Теже симптомы, но на STM32F429.(Обращение к внешней SDRAM, используемой для памяти дисплея и внешней памяти вызывает дерганье экрана) Существует ли доступ к управлению приоритетам AHB для STM?
  2. stm32cube + RTOS + UART

    Цитата(SasaVitebsk @ Feb 3 2015, 17:14) На счет того, что всегда не хватает - вы абсолютно правы. С модбасом, к сожалению, не работал. Появилась пара мыслей об универсальном драйвере под RTOS. Доведу до ума покажу.
  3. stm32cube + RTOS + UART

    Цитата(SasaVitebsk @ Feb 3 2015, 09:29) А причём здесь CMSIS? CMSIS как был так и остался. И в кубе он есть. Что-то вы не досмотрели или недопоняли. Я писал проект тогда, когда куба не было. Был stlib. Там был действительно мрак, поэтому пришлось написать всё самому. Недавно смотрел драйвер USART куба и даже удивился. Очень даже неплохо написано. Смотрел я его правда поверхностно, но мне понравился подход. Часть функционала я писал аналогично. С другой стороны, связь с FreeRTOS, пусть и заявленная должна осуществляться на более высоком уровне, насколько я понимаю. Например у меня написан драйвер USART, поверх него драйвер модбас. И вот драйвер модбас уже управляет событиями FreeRTOS. Можно, конечно, семафорить и на приём каждого байта, хозяин-барин. Думаю, что в самом в кубе вы найдёте примеры применения FreeRTOS совместно с USART. Может быть, я действительно что-то не понимаю, но в общем случае при приеме данных с UART, нам не известна длинна входящей посылки. Поэтому только 2 выхода: поллинг, событие(семафор) приема байта. Подход к драйверу может быть и ничего. Но тогда уже стоит брать пример с драйвера RTE_DRIVER UART от KEIL для STM32F1X. Там все гораздо интереснее, хотя все равно - есть ошибки.
  4. stm32cube + RTOS + UART

    Цитата(seniorandre @ Feb 2 2015, 17:00) Месяц назад занимался тем же самым, единственное что нашел, что у USART есть два callback, которые как в DMA IRQ вызываются на половину заполненности буфера или всего буфера. Так и не понял как отлавливать символ окончания команды, которую я отправляю по USART, т.к. теперь вроде прерывание занято обработчиком этих callback. Так и плюнул и вернулся к CMSIS. Может действительно у кого нибудь есть пример нормальный как правильно работать с последовательным портом с использованием FREERTOS, а то бред какой-то получается. В цикле опрашивать порт как в демо, не наш метод, да и получить событие когда пол буфера заполнено, нафига? Есть 2 простых варианта. Это настраивать буфер на прием 1 байта. Настраивать буфер с "запасом" и делать поллинг принимаемых данных. - По приему некоторого числа, делать инициализацию заново. Что одно, что второе - костыли. Все это вызывает удивление. Например вот это: #if (USE_RTOS == 1) /* Reserved for future use */ #error “USE_RTOS should be 0 in the current HAL release” #else #define __HAL_LOCK(__HANDLE__) \ do{ \ if((__HANDLE__)->Lock == HAL_LOCKED) \ { \ return HAL_BUSY; \ } \ else \ { \ (__HANDLE__)->Lock = HAL_LOCKED; \ } \ }while (0) #define __HAL_UNLOCK(__HANDLE__) \ do{ \ (__HANDLE__)->Lock = HAL_UNLOCKED; \ }while (0)
  5. stm32cube + RTOS + UART

    Всем доброго дня. Скачал самую свежую версию куба. В описаниях было много сказано о ее совместимости с FREERTOS. Интерсовал механизм приема-передачи данных по УАРТу в HAL драйвере. Возможности выставления флагов(событий) для RTOS. Как вариант буферы приема данных и т.п. и т.д. То,что увидел, очень сильно озадачило. Приемник HAL драйвера UART фактически неработоспсобен для общего применения???? Остальные драйверы пока не "копал", но если там сохранен такой же подход как и в УАРТе, то зачем все это надо было STm? Подрыгать ногами в демо проекте? Чем был плох CMSIS?
  6. Скачал Mqx от Freescale. Немного поизучал. Под рукой не было родных freescale процов. Перепилил под STM32F107. Ядро заработало. А вот уровень IO - драйвера вызывают вопросы. До этого большой практики в RTOS не было. Самый главные из вопросов почему именно так сложно. Ведь у все таки работаем с однокристаллкой. Иногда ножку надо дернуть и побыстрее. Почему не используется CMSIS? Или это не стандарт для АРМов? По хорошему напрашивается еще один подуровень - согласования. А вообще понравилось. Очень много "вкусных" вещей. Быстродействие для моего случая пока не проверял.
  7. Цитата(Сергей Борщ @ Sep 13 2013, 15:44) Если прошивку обновляет клиент - она должна быть криптована. Соответственно для несовместимых версий железа используются разные ключи криптования и "неправильная" прошивка не будет расшифрована и, следовательно, будет отвергнута загрузчиком. Другое дело, если основной функционал прошивок для разных модификаций железа сильно схож - тогда может иметь смысл хранить в области загрузчика идентификатор версии железа и в одной глобальной прошивке предусмотреть поддержку всех вариантов железа с ветвлением по прочитанному из загрузчика идентификатору. В этом случае загрузчик может в начале обновления получать информацию о версии прошивки и сравнивая с минимально допустимой версией отвергать либо принимать ее. Причем идентификатор версии имеет смысл заложить изначально, даже если не планируете ветвление по нему. Со временем захочется прийти к объединенному варианту прошивок, а все необходимое для поддержки такого варианта у вас уже будет даже в старых приборах. Криптование прошивок пока не предуматривается. Вопрос каким образом хранится ID железа? Загрузчик в МК имеет какую то версию и ID - или тип прибора . Т.е. - это по сути ID железа? Загрузчик верхнего уровня - читает этот ID. - т.е. знает тип железа и модификацию загручика. Остается записать файл основной программы. Причем сам файл по себе должен нести информацию о допустимости записи в тот или иной прибор. Выбор типа файла как правило bin или hex???? - Т.е. должны иметь служебные поля, позволяющие верхнему загрузчику по файлу определить тип железа для которого он предназначен. (ID, номер билда и т.п.) И версии поддерживаемого железа???? Также возникает вопрос о функционале загручика нижнего уровня. Его роль в защите от записи неправильной версии прошивки сводится лишь к выдаче собственного ID? И уже загрузчик верхнего уровня принимает решение о продолжении работы. Т.е. имеем набор загрузчиков под каждую уникальную версию железа. Или как вариант - служебное поле во флеше загручика - но это лишние операции при начальном программировании загрузчика. Цитата(mempfis_ @ Sep 13 2013, 16:22) При загрузке обновления загружались первые 1024 байта, расшифровывались и по определённой позиции читался идентификатор устройства. Если Идентификатор совпадал, то загрузка обновления Т.е. программа верхнего уровня "парсила" заливаемую прошивку? (Как вариант искала текстовое описание устройства в прошивке) Ну и разумеется заменила более ранюю версию у клиента?
  8. Мысли в слух. Кто чего может прделожить интересного. Имеем однокристалльный МК - как частность АРМ. Программа МК содержит самописный загрузчик и собственно основную программу. Собсвенно сами интересности: 1. Куча разнообразного железа, имеющего по сути дела одинаковый загрузчик. 2. Куча версий основных программ предназначенных для разных версий изделий, которые могут быть несовместимы с железом. (Более поздняя версия железа не подходит для старой прошивки и наоборот) Ну и как следствие проблемы: Залита не та версия программы - не в ту железку. Если на своем рабочем месте - это легко исправимо. Загрузчик - защищает сам себя от перезаписи и все легко можно откатить. А если где-то удаленно? И это делает человек очень далекий от железа и приборов перепрошивается много? А если после выпуска прибора прошло пару лет? Т.е. система должна быть дубовой и надежной)))) Дорогие форумчане, что можете предложить? Проблема ведь типовая?
  9. http://www.we-online.de/web/en/electronic_..._Center_PBS.php
  10. На просторах интернета наткнулся на статью по приведенной выше проблеме.(Объединение земель для ЮСБ) http://uk.farnell.com/images/en/ede/pdf/usb_dev_mistake.pdf - страница 7. Если ссылка уже была - просьба сильно не пинать)))). Думаю, что проблема до сих пор актуальна для многих здесь присутствующих.
  11. Stm32w

    После прочтения даташита на STM32W108C8 понял, что толкового описания радиомодуля нет. Поиск инфы на просторах инета результата не принес. Уважаемые форумчане, никому на глаза случайно))))) не попадалось чуть больше информации, чем изложено в даташите?
  12. Всем доброго дня. Возникла нужда в схеме зарядки литиевых АКБ. Необходимо заряжать 2 банки. По "религиозным" причинам схема должна быть линейной. Присмотрел BQ2057W. Сразу возник дурацкий вопрос, как подключить нагрузку к этой микросхеме? Т.е. есть питание - заряжаем АКБ и питаем схему, нет питания - работаем от АКБ. Может быть посоветуете что нибудь еще?
  13. Реализация CAN в AT91SAM7X256

    Пример как есть: настройка на прием 1 и 3го майлбокса CODE #define RECIEVE_MAILBOX_NUMBER_1 1 #define RECIEVE_MAILBOX_NUMBER_3 3 #define TRANSMIT_MAILBOX_NUMBER 2 __ramfunc void init_can_reception(struct can_cmd_s *p_can, Uint32 id) { //AT91PS_CAN base_can; CanTransfer canTransfer1; AT91PS_CAN_MB CAN_Mailbox; CAN_Mailbox = AT91C_BASE_CAN0_MB0; CAN_Mailbox = (AT91PS_CAN_MB) ((unsigned int)(CAN_Mailbox + RECIEVE_MAILBOX_NUMBER_1)); CAN_Mailbox->CAN_MB_MCR = 0x0; CAN_Mailbox->CAN_MB_MMR = 0x00; CAN_Mailbox->CAN_MB_MAM = AT91C_CAN_MIDvA & ((~id) << (18)); CAN_Mailbox->CAN_MB_MID = AT91C_CAN_MIDvA & (id << (18)); CAN_Mailbox->CAN_MB_MMR = AT91C_CAN_MOT_RX; CAN_Mailbox = AT91C_BASE_CAN0_MB0; CAN_Mailbox = (AT91PS_CAN_MB) ((unsigned int)(CAN_Mailbox + RECIEVE_MAILBOX_NUMBER_3)); CAN_Mailbox->CAN_MB_MCR = 0x0; CAN_Mailbox->CAN_MB_MMR = 0x00; CAN_Mailbox->CAN_MB_MAM = AT91C_CAN_MIDvA & ((~id) << (18)); CAN_Mailbox->CAN_MB_MID = AT91C_CAN_MIDvA & (id << (18)); p_can->accepted_id = AT91C_CAN_MIDvA & (id << (18)); CAN_Mailbox->CAN_MB_MMR = AT91C_CAN_MOT_RX; AT91C_BASE_CAN0->CAN_IER = (1 << RECIEVE_MAILBOX_NUMBER_3); AT91C_BASE_CAN0->CAN_IER = (1 << RECIEVE_MAILBOX_NUMBER_1); } //Начало передачи по кан: if ((p_can->trans_state != CAN_SENDING) && (flag)) { res = read_can_data(p_can, &hi, &low, &id); if (res != 0) { CAN_Mailbox = AT91C_BASE_CAN0_MB0; CAN_Mailbox = (AT91PS_CAN_MB) ((unsigned int)(CAN_Mailbox + TRANSMIT_MAILBOX_NUMBER)); status = disable_can_interrupt(); can_msr = CAN_Mailbox->CAN_MB_MSR; if ((AT91C_CAN_MRDY & can_msr) != 0) { // dbg_send_str("Error busy"); enable_can_interrupt(status); return 1; } CAN_Mailbox->CAN_MB_MCR = 0x0; CAN_Mailbox->CAN_MB_MMR = 0x00; CAN_Mailbox->CAN_MB_MID = AT91C_CAN_MIDvA & (id << 18); // ID 11 CAN_Mailbox->CAN_MB_MMR = AT91C_CAN_MOT_TX | AT91C_CAN_PRIOR; CAN_Mailbox->CAN_MB_MDL = low; CAN_Mailbox->CAN_MB_MDH = hi; CAN_Mailbox->CAN_MB_MCR = AT91C_CAN_MTCR | (AT91C_CAN_MDLC & (res << 16)); // Mailbox Data Length Code p_can->trans_state = CAN_SENDING; enable_can_interrupt(status | (1 << TRANSMIT_MAILBOX_NUMBER)); } return 0; } Обработчик прерывания: __ramfunc void CAN_Handler(void) { AT91PS_CAN_MB CAN_Mailbox; unsigned int status; unsigned int can_msr; unsigned int message_mode; unsigned int numMailbox; int res; int low, hi; unsigned short id; status = (AT91C_BASE_CAN0->CAN_SR); status &= (AT91C_BASE_CAN0->CAN_IMR); if (status & AT91C_CAN_WAKEUP) { AT91C_BASE_CAN0->CAN_IDR = AT91C_CAN_WAKEUP; pCAN0Transfer->test_can = AT91C_TEST_OK; pCAN0Transfer->state = CAN_IDLE; } /* if(status & AT91C_CAN_WARN){ can_cmd.error |= ERROR_CAN_WARN; AT91C_BASE_CAN0->CAN_IDR = AT91C_CAN_WARN; // (CAN) Form Error } */ // Mailbox event ? if ((status & 0x0000FFFF) != 0) { for (numMailbox = 1; numMailbox < 4; numMailbox++) { CAN_Mailbox = (AT91PS_CAN_MB) ((unsigned int)(AT91C_BASE_CAN0_MB0 + numMailbox)); can_msr = CAN_Mailbox->CAN_MB_MSR; if ((AT91C_CAN_MMI & can_msr) == AT91C_CAN_MMI) { // test_error_cntr++; can_cmd.error |= ERROR_CAN_MMI; if (numMailbox == RECIEVE_MAILBOX_NUMBER_3) { can_cmd.error |= ERROR_CAN_OVER_MAILBOX_3; } if (numMailbox == RECIEVE_MAILBOX_NUMBER_1) { can_cmd.error |= ERROR_CAN_OVER_MAILBOX_1; } } if ((AT91C_CAN_MABT & can_msr) == AT91C_CAN_MABT) { CAN_Mailbox->CAN_MB_MCR = AT91C_CAN_MACR; // test_error_cntr++; // can_cmd.error |= ERROR_CAN_ABT; } if ((AT91C_CAN_MRDY & can_msr) == AT91C_CAN_MRDY) { message_mode = (CAN_Mailbox->CAN_MB_MMR >> 24) & 0x7; if (message_mode == 0) { // test_error_cntr++; can_cmd.error |= ERROR_CAN_MODE; } else if ((message_mode == CAN_MOT_RECEPT) || (message_mode == CAN_MOT_RECEPT_OW)) { low = CAN_Mailbox->CAN_MB_MDL; hi = CAN_Mailbox->CAN_MB_MDH; dispatch_can_data(&can_cmd, hi, low, (can_msr >> 16) & 0xF, (CAN_Mailbox-> CAN_MB_MID & AT91C_CAN_MIDvA) >> 18); AT91C_BASE_CAN0->CAN_IER = 1 << numMailbox; // test_all_recv += (can_msr>>16)&0xF; CAN_Mailbox->CAN_MB_MMR = 0x0; CAN_Mailbox->CAN_MB_MID = can_cmd.accepted_id; CAN_Mailbox->CAN_MB_MMR = AT91C_CAN_MOT_RX; CAN_Mailbox->CAN_MB_MCR = AT91C_CAN_MTCR; if (numMailbox == RECIEVE_MAILBOX_NUMBER_3) { // test_error_cntr++; can_cmd.error |= ERROR_CAN_OVER_MAILBOX; } } else if (message_mode == CAN_MOT_TRANSMIT) { can_cmd.trans_state = CAN_IDLE; can_msr = CAN_Mailbox->CAN_MB_MSR; /* if ((AT91C_CAN_MRDY & can_msr) == AT91C_CAN_MABT) { CAN_Mailbox->CAN_MB_MCR = AT91C_CAN_MABT; } */ if ((AT91C_CAN_MRDY & can_msr) == AT91C_CAN_MRDY) { CAN_Mailbox->CAN_MB_MCR = 0x0; CAN_Mailbox->CAN_MB_MMR = 0x0; res=0; res = read_can_data(&can_cmd, &hi, &low, &id); if (res) { CAN_Mailbox->CAN_MB_MID = AT91C_CAN_MIDvA & (id << 18); // ID 11 CAN_Mailbox-> CAN_MB_MMR = AT91C_CAN_MOT_TX | AT91C_CAN_PRIOR; CAN_Mailbox-> CAN_MB_MDL = low; CAN_Mailbox-> CAN_MB_MDH = hi; // Mailbox Data Length Code CAN_Mailbox->CAN_MB_MCR = AT91C_CAN_MTCR | (AT91C_CAN_MDLC & (res << 16)); AT91C_BASE_CAN0->CAN_IER = 1 << numMailbox; //??????? can_cmd.trans_state = CAN_SENDING; } } else { can_cmd.error |= ERROR_CAN_MRDY; } } } } } if ((status & 0xFFCF0000) != 0) { CAN_ErrorHandling(status, 0); } }
  14. ISA+ПЛИС

    Автор книги: Ю.В.Новиков, О.А.Калашников, С.Э.Гуляев Разработка устройств сопряжения для персонального компьютера типа IBM PC Посмотрите эту книгу, в свое время она мне здорово помогла. Использовал CPLD от Xilinx XC95144(XL)
  15. Цитата(roland07 @ Oct 6 2010, 10:14) зы Есть ли какой нить калькулятор, чтоб посчитал регстр CAN_BR при условии кварца 18.432 и at91SAM7x256 Заранее спасибо. //------------------------------------------------------------------------------ /// baudrate calcul /// \param base_CAN CAN base address /// \param baudrate Baudrate value (kB/s) /// allowed values: 1000, 800, 500, 250, 125, 50, 25, 10 /// \return return 1 in success, otherwise return 0 //------------------------------------------------------------------------------ unsigned char CAN_BaudRateCalculate(AT91PS_CAN base_CAN, unsigned int baudrate) { unsigned int BRP; unsigned int PROPAG; unsigned int PHASE1; unsigned int PHASE2; unsigned int SJW; unsigned int t1t2; unsigned char TimeQuanta; base_CAN->CAN_BR = 0; if (baudrate == 1000) { TimeQuanta = 8; } else { TimeQuanta = 16; } BRP = (BOARD_MCK / (baudrate * 1000 * TimeQuanta)) - 1; //TRACE_DEBUG("BRP = 0x%X\n\r", BRP); // timing Delay: // Delay Bus Driver: 50 ns // Delay Receiver: 30 ns // Delay Bus Line (20m): 110 ns if ((TimeQuanta * baudrate * 2 * (50 + 30 + 110) / 1000000) >= 1) { PROPAG = (TimeQuanta * baudrate * 2 * (50 + 30 + 110) / 1000000) - 1; } else { PROPAG = 0; } //TRACE_DEBUG("PROPAG = 0x%X\n\r", PROPAG); t1t2 = TimeQuanta - 1 - (PROPAG + 1); //TRACE_DEBUG("t1t2 = 0x%X\n\r", t1t2); if ((t1t2 & 0x01) == 0x01) { // ODD //TRACE_DEBUG("ODD\n\r"); PHASE1 = ((t1t2 - 1) / 2) - 1; PHASE2 = PHASE1 + 1; } else { // EVEN //TRACE_DEBUG("EVEN\n\r"); PHASE1 = (t1t2 / 2) - 1; PHASE2 = PHASE1; } //TRACE_DEBUG("PHASE1 = 0x%X\n\r", PHASE1); //TRACE_DEBUG("PHASE2 = 0x%X\n\r", PHASE2); if (1 > (4 / (PHASE1 + 1))) { //TRACE_DEBUG("4*Tcsc\n\r"); SJW = 3; } else { //TRACE_DEBUG("Tphs1\n\r"); SJW = PHASE1; } //TRACE_DEBUG("SJW = 0x%X\n\r", SJW); // Verif if (BRP == 0) { TRACE_DEBUG("BRP = 0 is not authorized\n\r"); return 0; } if ((PROPAG + PHASE1 + PHASE2) != (TimeQuanta - 4)) { TRACE_DEBUG("Pb (PROPAG + PHASE1 + PHASE2) = %d\n\r"); TRACE_DEBUG("with TimeQuanta-4 = %d\n\r"); return 0; } base_CAN->CAN_BR = (AT91C_CAN_PHASE2 & (PHASE2 << 0)) + (AT91C_CAN_PHASE1 & (PHASE1 << 4)) + (AT91C_CAN_PROPAG & (PROPAG << 8)) + (AT91C_CAN_SYNC & (SJW << 12)) + (AT91C_CAN_BRP & (BRP << 16)) + (AT91C_CAN_SMP & (0 << 24)); return 1; } Функция настройки частоты CAN как есть. Автоопределение скорости не пробовал, подсказать ничем не могу. Для работы с CAN вам потребуется минимум 2 устройства!!! Частота CAN должна быть достаточно точно выбрана для обоих.