我当前的项目需要在收到外部“低功耗警告”信号时使dsPIC30F进入低功耗模式。我已经证实EnterLowPowerMode()
实际上可以执行。但是,当我尝试使用内置的OSCCON
和嵌入在C代码中的__builtin_write_OSCCONL()
来调整asm()
后标量时,OSCCON<7:6>
的值保持不变。
我不明白为什么程序集无法正常工作。似乎很简单。
void EnterLowPowerMode()
{
uint8_t writeUnlock1 = 0x46;
uint8_t writeUnlock2 = 0x57;
uint8_t writeData = 0xC0;
// Set PMD1 and PMD2 equal to 0xFFFF
*PMD1 = 0xFFFF; // Disable peripherals in Peripheral Module Disable register 1
*PMD2 = 0xFFFF; // Disable peripherals in Peripheral Module Disable register 2
// Unlock OSCCON and set OSCCON<7:6> to b11
// OSCCON address is 0x0742
__builtin_write_OSCCONL(0xC0);
// asm("MOV.w #0x0742,w0");
// asm("MOV.w #0x46,w1");
// asm("MOV.w #0x57,w2");
// asm("mov.w #0xC0,w3");
// asm("disi #3");
// asm("mov.b w1,[w0]");
// asm("mov.b w2,[w0]");
// asm("mov.b w3,[w0]");
// Set bit 15 of T1CON equal to 0
*T1CON = *T1CON & 0x7FFF;
// Set T1MR equal to 0x0000
*T1MR = 0x0000;
// Set T1PR equal to 0x00FA
*T1PR = 0x00FA;
// Set T1CON equal to 0x8000
*T1CON = 0x8000;
// Set gInLowPowerMode to kcg_true
gInLowPowerMode = kcg_true;
while(gLowPowerTime < C_LOW_POWER_TIMEOUT)
{
// wait
}
// repeat OSCCON unlock process here
// Set bits 6-7 of OSCCON to b00
*OSCCON = *OSCCON & 0xFF3F;
// Set bit 15 of T1CON to 0
*T1CON = *T1CON & 0x7FFF;
// Set T1MR to 0x0000
*T1MR = 0x0000;
// Set T1PR equal to 0x07D0
*T1PR = 0x07D0;
// Set T1CON equal to 0x8010
*T1CON = 0x8010;
// Set PMD1 equal to 0x81FC
*PMD1 = 0x81FC;
// Set PMD2 equal to 0xFFF9
*PMD2 = 0xFFF9;
// set SHORT_POWER_INTERRUPT to kcg_true
SHORT_POWER_INTERRUPT = kcg_true;
// set gInLowPowerMode to kcg_false
gInLowPowerMode = kcg_false;
}// end EnterLowPowerMode()
gLowPowerTime在一个中断中递增,该中断取决于应使用OSCCON后标量设置的新的,较慢的时钟,但由于它运行太快,因此该中断不会中断。
我也尝试过将所有汇编行都放在一个asm()中。声明,但这仍然行不通。
如果我有任何遗漏,请告诉我,我可以很快进行更新。
最佳答案
__builtin_write_OSCCONL(0xC0);
该行仅尝试将0xC0写入OSCCON寄存器的低字节。这将失败,因为必须遵循特定的顺序来操作该寄存器中的位。它在dsPIC30F reference manual的7.4.1节中概述。我相信您在这里的错误是假定__builtin_write_OSCCONL正在为您执行此序列。
你要
__builtin_write_OSCCONL(0x46);
__builtin_write_OSCCONL(0x57);
__builtin_write_OSCCONL(0xC0);
//now the lower 8 bits of OSCCON should be 0xC0
关于c - 无法写入dsPIC30F OSCCON,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16867487/