首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法写入dsPIC30F OSCCON

无法写入dsPIC30F OSCCON
EN

Stack Overflow用户
提问于 2013-05-31 23:37:45
回答 1查看 961关注 0票数 0

我目前的项目需要让dsPIC30F进入低功耗模式,当它收到外部“低功耗警告”信号。我已经验证了EnterLowPowerMode()确实执行。但是,当我尝试使用内置的OSCCON和嵌入在C代码中的asm()来调整__builtin_write_OSCCONL()后标量时,OSCCON<7:6>的值保持不变。

我不明白为什么总成不能工作。这看起来很简单,够了。

代码语言:javascript
复制
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();语句中,但这仍然不起作用。

如果我漏掉了什么,让我知道,我可以相当快地更新。

EN

回答 1

Stack Overflow用户

发布于 2018-08-30 22:43:36

代码语言:javascript
复制
__builtin_write_OSCCONL(0xC0);

这一行只是尝试将0xC0写入OSCCON寄存器的较低字节。这将失败,因为必须遵循特定的序列来操作此寄存器中的位。dsPIC30F参考手册第7.4.1节对此作了概述。我相信您的错误是假设__builtin_write_OSCCONL正在为您执行此序列。

你想要的

代码语言:javascript
复制
__builtin_write_OSCCONL(0x46);
__builtin_write_OSCCONL(0x57);
__builtin_write_OSCCONL(0xC0);
//now the lower 8 bits of OSCCON should be 0xC0
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16867487

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档