Jump to content

    

Алексей ВМ

Участник
  • Content Count

    125
  • Joined

  • Last visited

Community Reputation

0 Обычный

About Алексей ВМ

  • Rank
    Частый гость

Recent Profile Visitors

2192 profile views
  1. CC2541 (8051MCU) перенести библиотечные функции в ОЗУ

    Это макросы. Насколько я понял, служебные функции вызываются при использовании параметров в вызове функции. Если тело функции HalFlashWriteRAM() использовать в функции UpdateFirmware(), то все работает отлично.
  2. CC2541 (8051MCU) перенести библиотечные функции в ОЗУ

    Это и есть отдельная программа. Она копируется из ROM в SRAM и оттуда запускается, но при этом происходит обращение к служебным функциям, например LCALL ?BANKED_ENTER_XDATA, которые находятся во флеше. #pragma default_function_attributes = @ "RAMCODE" void UpdateFirmware(void) { buf[0] = 0xBE; buf[1] = 0xEF; buf[2] = 0xDE; buf[3] = 0xAD; HalFlashWriteRAM(TEST_ADDR, buf, 1); LED_ON for(;;); } void HalFlashWriteRAM(uint16 addr, uint8 *buf, uint16 cnt) { halDMADesc_t *ch = HAL_NV_DMA_GET_DESC(); HAL_DMA_SET_SOURCE(ch, buf); HAL_DMA_SET_DEST(ch, &FWDATA); HAL_DMA_SET_VLEN(ch, HAL_DMA_VLEN_USE_LEN); HAL_DMA_SET_LEN(ch, (cnt * HAL_FLASH_WORD_SIZE)); HAL_DMA_SET_WORD_SIZE(ch, HAL_DMA_WORDSIZE_BYTE); HAL_DMA_SET_TRIG_MODE(ch, HAL_DMA_TMODE_SINGLE); HAL_DMA_SET_TRIG_SRC(ch, HAL_DMA_TRIG_FLASH); HAL_DMA_SET_SRC_INC(ch, HAL_DMA_SRCINC_1); HAL_DMA_SET_DST_INC(ch, HAL_DMA_DSTINC_0); // The DMA is to be polled and shall not issue an IRQ upon completion. HAL_DMA_SET_IRQ(ch, HAL_DMA_IRQMASK_DISABLE); HAL_DMA_SET_M8( ch, HAL_DMA_M8_USE_8_BITS); HAL_DMA_SET_PRIORITY(ch, HAL_DMA_PRI_HIGH); HAL_DMA_CLEAR_IRQ(HAL_NV_DMA_CH); HAL_DMA_ARM_CH(HAL_NV_DMA_CH); FADDRL = (uint8)addr; FADDRH = (uint8)(addr >> 8); FCTL |= 0x02; // Trigger the DMA writes. while (FCTL & 0x80); // Wait until writing is done. //LED_ON //for(;;); } #pragma default_function_attributes = Например, вызов функции HalFlashWriteRAM(TEST_ADDR, buf, 1); порождает вызов LCALL ?BANKED_ENTER_XDATA
  3. Добрый день, Необходимо запускать все функции из SRAM, так как надо перезаписать флешь с кодом. Проблема в том, что функция, вызываемая из SRAM, обращается к служебным функциям, сидящим во флеше. Как перенести все функции в SRAM?
  4. CC2541 (8051 MCU) - перепрошить 0-й банк

    Программатор не поможет)). Доступ к СС2541 только по BLE. Внутри СС2541 прошиты BIM, ImageA и ImageB. Перепрошивать может только ImageA. Задача - заменить и BIM, и ImageA, и ImageB.
  5. CC2541 (8051 MCU) - перепрошить 0-й банк

    Да, надо переписать в том числе и BIM. Вообще весь банк 0 обновить с помощью кода, который располагается в 3-м банке.
  6. CC2541 (8051 MCU) - перепрошить 0-й банк

    Добрый день! Имеется СС2541, в нем живут три проги - BIM, ImageA и ImageB. BIM находится в 0-м банке. Там же располагаются части ImageA и ImageB, которые должны находиться в root bank - INTVEC, NEAR_CODE, BANK_RELAYS и тп. ImageA грузит по BLE и шьет ImageB. Задача - перепрошить с помощью ImageB все три проги. Решение - ImageA грузит по BLE и шьет ImageBL, ImageBL все перепрошивает. Все бы ничего, но непонятно, как перепрошивать 0-й банк, в котором находятся INTVEC, NEAR_CODE, а особенно BANK_RELAYS, загрузчиком из другого банка?
  7. TCIF сбрасываю. Если не сбрасывать, будет заходить в обработчик снова и снова по первой записи. Другие флаги не выставляются, то есть ошибок записи тоже нет.
  8. Вообще один раз, больше не возникает, запись в регистры ARR и RCR (через DMAR) перед этим прерыванием производится правильно. СС1 шлепают нормально, данные выводятся, UIF выставляется, но записи в регистры ARR и RCR не производится, прерывания от выполнения этой записи не возникает.
  9. Реализовал выдачу данных по событию capture/compare event. Прерывание ТС записи DMA по update event возникает только один раз, прерывание ТС записи DMA по capture/compare event генерируются нормально. Регистры CCR1 = 0, ARR и RCR содержат правильные значения. Как я понимаю update event возникает только один раз. В чем может быть причина?
  10. Немного модифицированное предложение ув. SSerge Пины дергать не по update event, а по capture/compare event. Соответственно, update event возникает при окончании передачи всего пакета (68 импульсов), по нему производится DMA запись регистра ARR новым значение периода. Два обработчика прерываний - один старый для формирования буфера передачи, новый для изменения периода таймера.
  11. В проекте присутствует обработка довольно большого объема данных, прерывание с такой обработкой будет занимать довольно значительное время... Немного не ясно с RCR: Each time the REP_CNT related downcounter reaches zero, an update event is generated Это какой-то особый update event, или он заведен на TIM1_UP? Дальше по тексту упоминается repetition update event U_RC: As REP_CNT is reloaded with REP value only at the repetition update event U_RC, any write to the TIMx_RCR register is not taken in account until the next repetition update event. но кроме этого отрывка нигде не находится поиском.
  12. Если удастся менять период таймера аппаратно, то задержки до единиц мкс до входа в обработчик прерывания ни на что не влияют. За FPU благодарю, постараюсь избавиться от него.
  13. Уже работает. Но заказчик решил изменить возможности, отсюда все эти пляски с бубном...
  14. Частота 168 МГц . XMC4700 мы с Вами уже обсуждали в другой ветке. Если девайс будет развиваться, естественно, аппаратная часть будет изменена.