2016-03-13 4 views
0

У меня есть приложение, которое работает только тогда, когда точка останова установлена ​​до записи в регистр. Конкретный uC - это Atmel SAMC21, и проблема, похоже, возникает при записи на периферию GCLK. Я правильно записываю бит GEN, затем устанавливаю CHEN для включения канала. С точкой останова она включена правильно. Без точки останова бит не устанавливается при наблюдении через окно отладки Atmel Studio IO. CAN-периферия этого конкретного канала подключена к зависанию, когда бит не установлен (поскольку он не синхронизирован), но работает нормально, если я устанавливаю точку останова, а затем разрешаю программе продолжать. Их нет другого места в коде, этот бит установлен или проверен, и нет многопоточности.Cortex-M0 + записывает регистр только с точкой останова

Код обижая:

// PCHCTRL[26] GCLK_CAN0 
GCLK->PCHCTRL[26].bit.GEN = 7;   // Generic clock generator 7 
GCLK->PCHCTRL[26].bit.CHEN = 1;   // The peripheral channel is enabled. 
GCLK->PCHCTRL[26].bit.WRTLOCK = 0;  // The peripheral channel and the associated generator registers are not locked. 

PCHCTRL:

union PCHCTRL { 
    uint32_t reg; 
    struct bit { 
     uint32_t GEN:4; 
     uint32_t :2; 
     uint32_t CHEN:1; 
     uint32_t WRTLOCK:1; 
     uint32_t :24; 
    } bit; 
} PCHCTRL[41]; 

Я попытался вставить задержки между двумя записями не повезло. Любая помощь очень ценится в связи с причиной этой проблемы!

ответ

0

Быстрое сканирование таблицы показывает это (курсив мой):

17.5.8. Регистрация защиты доступа

Все регистры с доступом для записи могут быть защищены от записи контроллером периферийного доступа (PAC).

Примечание: Дополнительная защита от записи указана в свойстве «PAC Write-Protection» в регистре .

Когда CPU остановлен в режиме отладки, вся защита от записи автоматически отключается. Защита от записи не применяется для доступа через внешний отладчик.

От того, это звучит ужасно много, как ваш код запуска или какой-либо другой части приложения может быть установка PAC для защиты от записи GCLK, в этом случае, что будет нуждаться в какой-то тыкать в ун-защиты это вокруг модификации.

В противном случае, есть также это:

17.6.3.1. Включение периферийного часы

Перед Периферийные часы включены, один из генераторов должны быть включен (GENCTRLn.GENEN) и выбран в качестве источника для периферийного канала, устанавливая биты выбора генератора в регистре Периферийного управления каналом (PCHCTRL.GEN). Любой доступный генератор может быть выбран в качестве источника синхронизации для каждого Периферийного канала.

Когда был выбран генератор, периферийная часы включена путем установки канала Включить бит в регистре Контроль периферийный канал, PCHCTRLm.CHEN = 1. Бит PCHCTRLm.CHEN должен быть синхронизированы с общей тактовой области , PCHCTRLm.CHEN будет продолжать читать в качестве своего предыдущего состояния до завершения синхронизации.

Что подсказывает, что вы можете увидеть что-то подобное, если сам генератор настроен неправильно и включен.

0

Это почти наверняка из-за того, что не дожидаясь синхронизации часов, прежде чем продолжить (удары по точке останова задерживают достаточно долго, чтобы это произошло, CAN и некоторые другие устройства по умолчанию не замораживают точку останова). Ему нужно что-то в этом направлении, чтобы дождаться синхронизации синхронизации:

// Set GCLK_CAN0 to use GCLK generator 8 
PCHCTRL26 |= PCHCTRL_CHEN | PCHCTRL_GEN_8; // Bit 6 is CHEN, GEN[3:0] set to 8 = GCLK generator 8 
while ((PCHCTRL26 & PCHCTRL_CHEN) == 0) { // Wait for sync 
    // Spin 
} 
Смежные вопросы