При частоте порчи данных на ARM CortexM0+ на базе SoC?
Я работаю над SoC
Тестовая плата на базе ARM Cortex M0+. SoC
оснащен 5 банками памяти и способен масштабировать напряжение и частоту. Но проблема, с которой я сталкиваюсь, заключается в том, что когда я записываю какие-либо данные / значение в ч / б регистры по какому-либо адресу с частотой ниже частоты по умолчанию (20,8 МГц), это приводит к повреждению данных таким образом, что каждое значение записывается по нескольким адресам регистра, несмотря на одно значение по одному адресу. Код выглядит следующим образом:
int main(void)
{
//AP_PLL->CLKREF_RM = 0x000104f6; //32768 * 0x4F6 => 41.7 MHz;
//AP_PLL->CLKREF_RM = 0x0001027b; //32768 * 0x27b => 20.8 MHz;
AP_PLL->CLKREF_RM = 0x00010140; //32768 * 0x4F6 = 10.8 MHz;
for (int i = 0; i < 200; i++)
{
*((unsigned int*) 0x1000 + i) = i;
}
return 0;
}
выход при работе на 10 МГц: 0L, 0L, 1L, 1L, 1L, 1L, 2L, 2L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 5L, 5L, 6L, 6L, 6L, 6L
ожидаемый результат: 0L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L
1 ответ
Cortex-M0+ не определяет PLL - это специфическая часть, поэтому, так как вы не разглашаете конкретную часть, трудно советовать конкретно.
Обычно после изменения частоты ФАПЧ необходимо дождаться достижения блокировки ФАПЧ, прежде чем переключиться на часы ФАПЧ и продолжить выполнение - в вашем примере доступ к памяти происходит, когда ФАПЧ используется и работает нестабильно и, несомненно, еще добиться блокировки.
В зависимости от конкретной части и природы источника синхронизации блокировка ФАПЧ может занять несколько десятков микросекунд. Обычно ФАПЧ имеет регистр состояния, который следует опрашивать на предмет состояния блокировки перед переключением на часы ФАПЧ.
Обычный процесс переключения часов:
- Переключиться на основной генератор с фиксированной частотой
- Установите конфигурацию PLL
- Ждать блокировки PLL
- Переключиться на генератор PLL