Портирование freertos на SOC этого m0, частота tc0 не может быть больше 1000

Я новичок по поводу freertos и портирования freertos на один SOC(rn8215: кора m0 + adc + uart + lcd+ мера энергии). Этот SOC использовался в нашем продукте много лет.

И я знаю, что freertos можно портировать на кору m0(stm32f0xx). Должно быть хорошо работать на этом чипе SOC.

В соответствии с предложением портирования freertos, я создал проект и добавил в него связанные файлы. Было создано четыре задачи для тестирования основных функций.

task                 prior
vtask_100ms          1
key_scan_tas         2
vsecond_task         3
vuart_rx_task         5

соответствующие настройки / ресурсы перечислены ниже.

  • configTICK_RATE_HZ = 1000. (отметка 1 мс)

  • Включить таймер tc0 h/w,(1 мс, и isr-handler не делают ничего, кроме очистки бита состояния)

  • Включить прерывание по Rtc (1сек)

До сих пор эти функции могут работать хорошо (Uart может выполнять действие tx/rx; контекст Lcd может отображаться в порядке прокрутки;Power_led может быть флэш-памятью; система может работать в течение примерно 10 часов стабильно).

когда я изменяю частоту TC0 на 2000(или больше)(на самом деле, я хочу, чтобы он работал на частоте 7200 Гц для дискретизации АЦП). После включения через несколько минут (2 минуты или 5 минут, время не фиксировано), система будет остановлена (ОС может ввести tc0 isr-handler/rtc-handler. Но индикатор питания не может быть прошит; rart-tx от uart не может работать; контекст Lcd не может быть прокручен.Похоже, что расписание задачи было остановлено).

  1. Я уверен, что этот SOC tc0 работает нормально (В до проекта, он работает на частоте 7200 Гц для дискретизации АЦП, без OS-системы).
  2. В этом проекте freertos, если я уберу tc0 interrupt-init и isr-handler или я изменю частоту tc0 на небольшое значение (<=1000), проблема остановки не возникнет.

Я проверил значение NVIC следующим образом. Данные захвата NVIC

Код инициализации TC0 и код обработчика isr следующие.

TC0->CCFG = 0;
TC0->PS = rn8211_get_sys_freq() / 2000 - 1;
TC0->DN = 0;
TC0->CTRL = 0x03;
TC0->IE = 0x01;
NVIC_SetPriority (TC0_IRQn, (1<<__NVIC_PRIO_BITS) - 1);
NVIC_EnableIRQ(TC0_IRQn);
//isr-handler
void TC0_HANDLER(void)
{
    TC0->STA = 0x0f;
}

Какую часть / место я должен проверить об этой проблеме?

0 ответов

Другие вопросы по тегам