Debugging 皮质-M0+;仅使用断点写入寄存器
我有一个应用程序,它只在写入寄存器之前设置断点时工作。特定的uC是Atmel SAMC21,问题似乎在于写入GCLK外围设备时。我正确写入GEN位,然后设置CHEN以启用通道。通过断点,可以正确启用它。如果没有断点,则通过Atmel Studio IO调试窗口观察时不会设置位。当未设置位(因为未计时)时,此特定通道连接到的CAN外围设备将挂起,但如果我设置断点,然后允许程序继续,则可以正常工作。它们在代码中没有其他位置该位被设置或检查,并且没有多线程处理 违规代码:Debugging 皮质-M0+;仅使用断点写入寄存器,debugging,atmel,cortex-m,atmelstudio,Debugging,Atmel,Cortex M,Atmelstudio,我有一个应用程序,它只在写入寄存器之前设置断点时工作。特定的uC是Atmel SAMC21,问题似乎在于写入GCLK外围设备时。我正确写入GEN位,然后设置CHEN以启用通道。通过断点,可以正确启用它。如果没有断点,则通过Atmel Studio IO调试窗口观察时不会设置位。当未设置位(因为未计时)时,此特定通道连接到的CAN外围设备将挂起,但如果我设置断点,然后允许程序继续,则可以正常工作。它们在代码中没有其他位置该位被设置或检查,并且没有多线程处理 违规代码: // PCHCTRL[26]
// 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];
我试着在两次书写之间插入延迟,但没有成功。非常感谢您对问题原因的任何帮助 快速浏览数据表可以发现(我的重点): 17.5.8。寄存器访问保护 所有具有写访问权限的寄存器都可以选择由外围访问控制器进行写保护 (PAC) 注: 可选写保护由寄存器中的“PAC写保护”属性指示 描述 当CPU在调试模式下停止时,所有写保护将自动禁用。写保护 不适用于通过外部调试器进行访问。 从这一点来看,听起来很像你的启动代码或应用程序的其他部分可能正在将PAC设置为写保护GCLK,在这种情况下,需要一些戳来在修改前后取消对它的保护 否则,还有一个问题: 17.6.3.1。启用外围时钟 在启用外围时钟之前,必须启用其中一个生成器(GENCTRLn.GENEN)并 通过设置外设中的生成器选择位,选择作为外设通道的源 通道控制寄存器(PCHCTRL.GEN)。可以选择任何可用的生成器作为时钟源 每个外围通道 选择发生器后,通过在中设置通道启用位来启用外围时钟 外围通道控制寄存器PCHCTRLm.CHEN=1。PCHCTRLm.CHEN位必须为 已同步到通用时钟域。PCHCTRLm.CHEN将继续读取其先前状态 直到同步完成
这表明,如果生成器本身没有正确设置和启用,您可能会看到类似的情况。这几乎可以肯定是因为在继续之前没有等待时钟同步(命中断点会导致足够长的延迟,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
}