Jump to content

    

Aaron

Свой
  • Content Count

    254
  • Joined

  • Last visited

Community Reputation

0 Обычный

About Aaron

  • Rank
    Местный
  • Birthday 08/05/1984

Контакты

  • Сайт
    http://

Информация

  • Город
    Зеленоград

Старые поля

  • Vkontakte
    kostik_aaron

Recent Profile Visitors

2609 profile views
  1. Интересный вы человек. У вас устройство не работает, и вы не понимаете почему, но при этом не хотите проверять те советы, которые вам дают. Инфа о VID/PID даст однозначный ответ - есть у вас физически обмен по USB, или его нет. Следующие вопросы важны, т.к. чтобы устройство могло проинициализироваться, ему нужен хороший USB тракт. У вас инициализации даже нет (если VID/PID = 0000/0000), а вы про обмен данными думаете... Тем более некорректно сравнивать мосты USB2.0 FullSpeed (12Мбит/с) и USB2.0 HighSpeed (480Мбит/с) - к ним требования по качеству трассы абсолютно разные. Ещё вариант - контакт №59 PWRSAV# подтянут к питанию? на схеме 4.1 он не используется - болтается в воздухе. Попробуйте подтянуть.
  2. И всё же, пока драйвера не установлен, будет неизвестное устройство, в свойствах которого можно посмотреть VID/PID. Дайте точный ответ - у вас там 0х0000/0х0000? Тип корпуса QFN или TQFP? В качестве пайки полностью уверены? Если где-то ложная пайка, попробуйте пальцем надавить на микруху и включить. Далее: по питанию у вас всё нормально? ёмкости достаточные стоят - прямо как по схеме рисунка 4.1, других потребителей без ёмкости нет? в качестве разводки платы уверены? длина дифф. линий, волновые сопротивления, опорные слои? подключение земли и корпуса со стороны USB-разъёма тоже через 0 Ом резистор осуществляется, как и в схеме рисунка 4.1? Попробуйте поменять перемычку 0 Ом на параллельные 1 МОм и 1000 пФ. кабель USB стандартный используете, с ним проблем не может быть? Просто если у вас одинаковое поведение на всех платах, то проблема скорее всего в качестве схемотехники/топологии. Надо в ту сторону копать.
  3. в диспетчере устройств usb vid/pid определяет или нули одни? Если нули, то это просто передергивание линии. Почему pwren# в 1? У него активный ноль. То есть не может стартануть? По документации на вход можно сигнал с генератора подавать?
  4. Хочу заметить, что USB очень капризный интерейс. Вы зря объединили gnd и shield на разъеме. Развяжите их - между ними поставьте в параллель резистор 1МОм 250В и кондер 1000пФ 250В. Еще можно ферритовое колечко на usb кабель надеть. Вторая мысль - может у вас кварц хреново работает на входе в ft2232? емкости к кварцу правильно подобраны? Usb не терпит шалостей с тактовой.
  5. > полностью перестает работать ... Можно уточнить, перестаёт работать только на время флуда, и потом самовосстанавливается? Или всё же подразумевается, что после прекращения флуда уже не восстанавливается работоспособность стека?
  6. > 1) как это можно сделать в Си, учитывая, что код формируется до вызова main() Вам надо написать функцию reset handler (точное имя определено в crt..s). Вы её можете написать на Си. Или возьмите исходник crt ассемблерный и под себя его перепишите. > 2) как указать в линкере, чтобы стек был в нужном месте, нужного размера. Вы же уже ответили сами строчкой выше: .section my_stack, stack, address(0x1800) .space 0x100 Определите глобальные константы исходя из этой секции, аналогичные __SP_init и __SPLIM_init - и используйте свои константы в своём файле инициализации. в gcc это всё можно задать .ld файлом, в keil - scatter. Для pic надо мануалы курить, наверняка тоже есть нечто аналогичное.
  7. В стандартах кодирования обычно разжёвывается каждое правило - в первую очередь их смотрите. Все они в чём-то похожи, в чём-то отличаются. MISRA C JPL Coding Standard for C SEI CERT C Coding Standard http://google.github.io/styleguide/cppguide
  8. #ifndef Config_H_ ........................ TstackLow Test; <<<<<!!!!!Ошибка!!!!!!!! #endif *рукалицо* К сожалению, таких горе-программистов сейчас полно. Когда так делают, рассуждают типа "этот файл всё равно локальный и будет добавлен только в одно конкретное место в одном сишном файле. препроцессор их объединяет перед компиляцией, а мне удобнее прямо здесь и сейчас объект объявить". А потом внезапно: @pokk, по вашему вопросу: почитайте литературу на тему высокой связности кода и больше никогда так не делайте.
  9. RCALL __psv_init RCALL __crt_start_mode, __crt_start_mode_normal RCALL __data_init, __data_init_da и ещё сам код верхнего уровня - тоже название функции надо знать - типа reset_handler, __reset, __crt_reset - map-файл посмотреть. Про синтаксис компилятора не подскажу, но судя по всему вы знаете что и как делать. Первый момент. Вам надо в линковщике все эти функции явно объявить внутри секции, относящейся к бутлодеру. Второй момент. Если вы всё делаете в рамках одного проекта, то у вас секция .bss и .data будут содержать сведения как о загрузкике, так и о приложении. Переписывая приложение, размер занимаемого места секциями может измениться - вы всё равно влиять будете на загрузчик. Чтобы это исключить, вам надо в явном виде все константы и переменные, относящиеся к приложению, определять в коде в секцию приложения. Имхо это слишком большой гемор, лучше сделать два независимых проекта bootloader и app. Могу предположить, что вы хотели сэкономить место на общих функциях - типа, в бутлодере есть инициализация и функции по работе с периферией, которые в основной проге тоже используете. В таком случае выделите в отдельную секцию в явном виде по конкретному адресу место под структуру, которая будет хранить ссылки на ваши "общие библиотечные" функции. Тогда в основном приложении вам достаточно объявить просто прототипы этих функций, взять ссылки на них из предопределённой структуры - вот и будет экономия места. Других причин создавать загрузчик и приложение в одном проекте я не вижу.
  10. На заметку - ещё при работе с double могут быть подводные камни в части выравнивания адресов до размера sizeof(double) - стек выравнивается по-умолчанию обычно на 4 байта (на примере corte-m) и по размеру и по адресу, надо до 8 байт выравнивать. Иначе тоже может в строку попасть не то, что вы ожидаете.
  11. лови готовый код, а то ещё потом подводные камни встретишь... JumpToApplication(ADDR_USER_START); обрати внимание - в NVIC_SetVectorTable смещение относительное задаётся, а не абсолютный адрес void JumpToApplication(uint32_t addr) { typedef void (*pFunction)(void); pFunction Jump_To_Application; uint32_t JumpAddress; if(addr < ADDR_USER_START) { // printf("Try to start User App from BL code area!\r\n"); return; } /* Test if user code is programmed starting from address "ADDR_USER_START" */ uint32_t estack_label = (*(__IO uint32_t*)addr) & 0x2FFE0000; // printf("estack_label @ 0x%08X: 0x%08X\r\n", addr, estack_label); // printf("ADDR_RAM_START, RAM_SIZE: 0x%08X, 0x%08X\r\n", ADDR_RAM_START, RAM_SIZE); if (estack_label == ADDR_RAM_START) { __disable_irq(); // __disable_fault_irq(); NVIC_SetVectorTable(NVIC_VectTab_FLASH, FLASH_BL_SIZE); JumpAddress = *(__IO uint32_t*) (addr + 4); Jump_To_Application = (pFunction) JumpAddress; /* Initialize user application's Stack Pointer */ __set_MSP(*(__IO uint32_t*) addr); __set_CONTROL(0x00000000); // switch to "main" stack pointer PSP // код найден по ссылке code from http://www.freertos.org/FreeRTOS_Support_Forum_Archive/July_2011/freertos_Cortex_M3_port_fault-stack_MSP_setup_4606104.html // Ensure that normal processing runs on PSP ("Process" Stack // Pointer, in "thread mode" or "normal mode"). Processor starts // out of reset using MSP, so unless the RTL has already switched, we // need to switch here. // printf("CONTROL register=%08lX, stack in use is %s\n", // __get_CONTROL(), (__get_CONTROL()&0x2) ? "PSP, need to switch." : "MSP, OK."); // if( (__get_CONTROL()&0x2) != 0 ) { // // Ooops, we're using PSP "Process" Stack Pointer // // Set up "main" stack pointer and switch to it // //__set_MSP(__get_PSP()); // copy current stack pointer value into PSP // __set_MSP(*(__IO uint32_t*) addr); // __set_CONTROL(0x00000000); // switch to "main" stack pointer PSP // //__set_CONTROL(0x00000002); // switch to "process" stack pointer PSP // printf("After stack pointer switch: CONTROL register=%08lX, stack in use is %s\n",__get_CONTROL(), (__get_CONTROL()&0x2)?"PSP":"MSP"); // } Jump_To_Application(); } else { printf("No UserApp!\n"); }; }
  12. Электрическая надежность STM32.

    stm32 очень любят подделывать, шибко популярные камни. Отсюда скорее всего и проблемы с портами. Покупайте в надёжных проверенных конторах, - у нас с stm32 проблем никогда не было.
  13. Такой интерес к обсуждению затравки "человек-оркестр"! :) Прикольно, что в соседних ветках куча объявлений, где требуются по факту те же самые "человеки-оркестры", (и схему разработать, и плату развести, писать код, регулировать и оформлять ЭД) но никто там не хочет тему мусолить. Ладно, давайте все помои сюда! =) Шучу... Если кто-то считает себя узким специалистом, но зато полным профи своего дела - прошу, звоните - пообщаемся! Николай Семёнович, я вас убедительно прошу - ваш неугасающий интерес к этой теме, а также многочисленные истории из своей жизни и о своей жизни рассказывать в разделе "Общение".
  14. И снова попытка натянуть стандартный шаблон. Форумчане уже досконально знают, кто и как у нас работает, как мы все спиногрызы сидим и мучаем бедных спецов. Затронул тему живую, её можно мусолить вечно будет - это как политика, верно? Заинтересовавшихся прошу связываться со мной, а не разводить флуд.
  15. Итак, кого смущает фраза "человек-оркестр", перефразирую: ищем специалиста, желательно универсала. С вопросами по существу - звоните. Предложение актуально всё время, т.к. вал новых работ идёт, нам рук не хватает, все сотрудники перегружены.