Перейти к содержанию

maxntf

Участник
  • Публикаций

    107
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный

Информация о maxntf

  • Звание
    Частый гость
  1. Отладка программы под бутлоадер.

    Спасибо! То, что нужно. FUNC void Setup (void) { SP = _RDWORD(0x08005000); // Setup Stack Pointer PC = _RDWORD(0x08005004); // Setup Program Counter XPSR = 0x01000000; // Set Thumb bit } Setup(); LOAD %L INCREMENTAL nocode // load debug info without performing reset FUNC void OnResetExec(void) { Setup(); }
  2. Отладка программы под бутлоадер.

    Это куда? Вот файлик debug.ini FUNC void Setup (void) { SP = _RDWORD(0x08005000); // Setup Stack Pointer PC = _RDWORD(0x08005004); // Setup Program Counter XPSR = 0x01000000; // Set Thumb bit } Setup(); LOAD %L INCREMENTAL nocode // load debug info without performing reset Там бы дописать что-то типа: IF(RESET) Setup(); Только возможно ли такое? У меня сейчас получается что при загрузке отладчика срабатывает функция Setup(), а когда я нажимаю в нем Reset то SP и PC сбрасываются. И получается что нужно перезагружать отладчик.
  3. Отладка программы под бутлоадер.

    Отлаживаю в Keil - ST-Link Debugger. Попробовал по совету x893 создал файл debug.ini. Похоже это то, что мне нужно. Только там получается что при запуске отладчика, он стартует с 0x08005004, а после reset(в отладчике) уже с 0x08000004. Помогите пожалуйста допилить этот ini.
  4. Отладка программы под бутлоадер.

    Подскажите как отладчику указать, чтоб он стартовал с определенного адреса? Читал, что вроде как нужно в скаттер файле определить точку входа через команду ENTRY. Только как это сделать я не знаю, что указывать в ее параметрах? Или это не то? Сам файл у меня тот, что предлагается стандартно (с измененной адресацией под бут) ; ************************************************************* ; *** Scatter-Loading Description File generated by uVision *** ; ************************************************************* LR_IROM1 0x08005000 0x0000B000 { ; load region size_region ER_IROM1 0x08005000 0x0000B000 { ; load address = execution address *.o (RESET, +First) *(InRoot$$Sections) .ANY (+RO) } RW_IRAM1 0x200000C0 0x00001F40 { ; RW data .ANY (+RW +ZI) } }
  5. Спасибо, понял в чем тут дело. Просто раньше работал только с 8 битными МК, там таких проблем нет. А у меня получилось, что буфер char - выравнивание у него по одному байту (без атрибута, начинаться может с любого адреса), а в качестве аргумента функции я передаю указатель на этот буфер с приведением типа до uint32.
  6. Всем привет, наткнулся на такой баг - объявил буфер в глобальных переменных. Передаю его адрес в аргументе функции. И когда обращаюсь в функции к этой переменной через указатель сразу вылетаю в HardFault_Handler. Пол дня парился, и в конце концов выяснил, что линковщик расположил ее по адресу не кратному 4. Проверил, действительно если передать в функцию указатель не кратный 4, то при чтении по этому адресу вылетаем в HardFault_Handler. И теперь не могу добиться, чтоб этот буфер разместился по корректному адресу. Добавляю перед ним или после него новые переменные, адреса смещаются, и у него все равно адрес не корректный. Что делать? P.S Keil V5.23.0.0
  7. Отладка с приемом по UART

    Да как только отключил, все работает нормально.
  8. Отладка с приемом по UART

    Понял. То есть даже если не включены прерывания по ошибкам, флаги все равно нужно сбрасывать при их установке?
  9. Отладка с приемом по UART

    Народ подскажите, натолкнулся на такую штуку: Включен USART1 на прием и разрешен только один тип прерывания по приему байта. void USART1_IRQHandler(void){ char bt; if(USART_GetITStatus(USART1, USART_IT_RXNE) == SET){ bt = (char)USART_ReceiveData(USART1); USART_ClearITPendingBit(USART1, USART_IT_RXNE); if(bt != 0){ bUartRx[cUartRx] = bt; if(cUartRx >= (BRXSIZE-2)) bUartRx[(BRXSIZE-1)] = 0, cUartRx = 0, fUartRxOver = 1; else cUartRx++, bUartRx[cUartRx] = 0; xSemaphoreGiveFromISR(xSemRxInBuf, NULL); } } } void UART_Init(void){ GPIO_InitTypeDef GPIO_InitStruct; USART_InitTypeDef USART_InitStruct; NVIC_InitTypeDef NVIC_InitStruct; RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_10MHz; GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9; GPIO_Init(GPIOA, &GPIO_InitStruct); GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_DOWN; GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10; GPIO_Init(GPIOA, &GPIO_InitStruct); GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_1); GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_1); USART_InitStruct.USART_BaudRate = 19200; USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_InitStruct.USART_Parity = USART_Parity_No; USART_InitStruct.USART_StopBits = USART_StopBits_1; USART_InitStruct.USART_WordLength = USART_WordLength_8b; USART_Init(USART1, &USART_InitStruct); USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); USART_Cmd(USART1, ENABLE); NVIC_InitStruct.NVIC_IRQChannel = USART1_IRQn; NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; NVIC_InitStruct.NVIC_IRQChannelPriority = 0; NVIC_Init(&NVIC_InitStruct); Так вот, во время отладки при нажатии Stop или остановки по брекпоинту, если в этот момент что то принималось в UART, то после запуска отладчика все время висим в обработчике прерывания. Причем все флаги сброшены и больше не устанавливаются, даже если приходят данные. P.S. STM32F051R8T6 Keil v.5.23.0.0
  10. Что у STM32 после таблицы прерываний?

    Меня интересует, нужна ли повторная инициализация startup в основной программе, или от нее нужно избавиться?
  11. Что у STM32 после таблицы прерываний?

    Всем привет. Для написания собственного бутлоадера, интересует что находится между окончанием таблицы прерываний и адресом входа в основную программу (в частности начало файла startup)? Начинается с такого: 0x080000C0 F000F802 BL.W __scatterload (0x080000C8) 0x080000C4 F000F83E BL.W __rt_entry (0x08000144) 0x080000C8 A00C ADR r0,{pc}+0x34; @0x080000FC ... Это в Keil по крайне мере. В отладчике проверил, в этот кусок кода попадаем в конце выполнения startup файла. Мысль одна, что это какая то подготовка регистров ядра. Кто может подсказать, там есть что-то важное или на этот кусок не нужно обращать внимания (не трогать его вообще) и там все всегда стандартно (одинаково)? Если этот код будет дублироваться как в самом загрузчике, так и в основной программе - это нормально? Или может в проекте с основной программой нужно как то написать scatter файл, чтоб проект вообще компилировался без этой инициализации и startup файла?
  12. Так в этих походу тоже. Я ведь не 433МГц принимаю, а то что выдает компаратор данного приемника. И задача практически аналогична, там преамбула и блок данных. Только тот компаратор что в приемнике не всегда выдает нормальный сигнал (когда помехи). Когда помех нет, сигнал как на первой картинки, а когда помехи как на второй. Но в том сигнале есть вся полезная часть, вот я и хочу ее выбирать (взять максимум с этого приемника). А по поводу NRF24L01. Нужно принимать сигнал с готовых устройств, работающих на частоте 433 и передающих данные в формате KeeLoq. P.S. Собственно задача попробовать сделать выборку по напряжению от 2,8В до 3,3В, а остальное откинуть.
  13. Это радиоприемник H5V4D на частоте 433МГц. Собственно я не писал что за источник сигнала, потому как хотел решить задачу именно по получению полезного сигнала из того что есть, а не ковырянием самих модулей. Если дальности действия будет мало, буду искать другой. Но пока задача стоит использовать именно этот. Просто сейчас на определенном удалении с промежуточными стенами, изменением расположения объектов (людей) и т.д., на выходе приемника то нормальный сигнал, то такая хрень. Но сигнал есть всегда, вот я и хочу получить данные по такому корявому сигналу. Сейчас принимаю сигнал с внешнего GPIO через EXTI прерывания. Сам не так давно работаю с STM. Сейчас посмотрел что там EXTI прерывание вроде как на выход компаратора можно настроить. Если так, то по идеи можно отследить нарастание и спад сигнала где-то в пределах от 2,8V до VDD там где полезная часть. Что скажете, или затея глупая?
  14. На выходе приемника при слабом уровне сигнала от передатчика получаем очень искаженный сигнал. Но по верхнему уровню сигнала вроде как видна полезная часть сигнала амплитудой примерно 0,5В. Приемник подключен к STM32F072. Какими аппаратными средствами можно отфильтровать такой сигнал? У меня пока напрашивается только вариант с АЦП. Длительность самого короткого импульса 280 мкс. Максимальная частота дескритизации АЦП на 12бит = 1Мгц. более чем достаточно. Опыта обработки сигналов мало, у кого есть дельные советы? Может еще нужно какой то фильтр поставить на входе МК.
  15. FreeRTOS - минимальное время тика?

    Не имею ни капли сомнения, что оно и правильно, и даже уже понимаю зачем. Со всей уверенностью считаю, что ребята которые все это разрабатывали по умнее всех нас вместе взятых. Хотел написать, что о такой фиче, нужно упоминать через каждую страницу мануала. А потом призадумался, может это такой тактический ход, для тех кто не особо любитель почитать? (пишу о себе:)). Пока это все разгребал, докапался до таких вещей, что неизвестно когда бы ещё специально лез в эти дебри. Но... Было бы чудесно, если бы отладчик спросил, делать переход по вектору прерывания или нет. Это очень удобно для освоения, когда начинающий ещё не знает куда должна пойти программа, и хочет по шагать.