您好!
我将面临与给定电源模式示例相关的问题、在该示例(PM2)中、包含了 DMA 描述符。
我想知道为什么它包含在内、尽管它没有功能、
如果我不包含 DMA 描述符该怎么办?
如果必须为内部操作添加该功能 、请向我提供一个具有无线电功能的 PM2示例。
谢谢:D
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
我尝试将 PM2与无线电一起使用、
我希望我的器 件在 PM2中的特定时间内处于唤醒状态、并且在唤醒后需要执行无线电任务、因为我遵循了勘误表、但在更改晶体和使用 DMA 时遇到了问题。
我在活动模式下粘贴了代码、但下载代码后、从未从 PM2中唤醒、尽管下面的勘误表
void main (void)
{
//halPowerClkMgmtSetMainClkSrc (晶振);
volatile uint8 storedDescHigh = DMA0CFGH;
易失性 uint8 storedDescLow = DMA0CFGL;
易失性 INT8温度;
P1SEL &=~(BIT3 | BIT0);
P1_0 = 1;P1_3 = 1;
P1DIR |=(BIT3 | BIT0);
setup_sleep_interrupt ();
通道= 0x05;
无线电配置(datarate、Freq);
while (1){
//================================================ 时钟设置================================ //
SLEEP &=~SLEEP_OSC_PD;
while (!(SLEEP & SLEEP_HFRC_S));
CLKCON =(CLKCON &~CLKCON_CLKSPD)| CLKCON_OSC | CLKSPD_DIV_2;
while (!(CLKCON & CLKCON_OSC));
SLEEP |= SLEEP_OSC_PD;
//将 LS XOSC 设置为睡眠定时器时钟源(CLKCON.OSC32 = 0)
CLKCON &=~CLKCON_OSC32;
//======================================================== active-mode================================================================= //
halPowerClkMgmtSetMainClkSrc (晶振);
printf ("\n ch:%x"、MARCSTATE);//设备状态
RFST = STROBE _RX;//发送针对 CCA 的 RX 选通
while (!(MARCSTATE & 0x0D));//wait unitll 将进入接收模式!
printf (在 ch:%x"、MARCSTATE 之后为"\n);//读取 MARCSTATE 以检查器件是否处于接收模式
printf ("\n pktch:%x"、PKTSTATUS);
while (!(PKTSTATUS & CCA_flag));//if channel is clear、then send the bytes.
rad_mode_tx ();
halWait(200);
halWait(100);
storedDescHigh = DMA0CFGH;
storedDescLow = DMA0CFGL;
DMAARM |=(DMAARM_ABORT | DMAARM0);
//使用正确的源更新描述符。
dmaDesc[0]=(uint16)&PM2_BUF >> 8;
dmaDesc[1]=(uint16)&PM2_BUF;
//将描述符与 DMA 通道0关联并 ARM DMA 通道
DMA0CFGH =(uint16)&dmaDesc >> 8;
DMA0CFGL =(uint16)&dmaDesc;
DMAARM = DMAARM0;
WORCTRL =0x05;
temp = WORTIME0;
while (temp = WORTIME0);
//设置睡眠定时器间隔
WOREVT1 = EVENT0_HIGH;
WOREVT0 = EVENT0_LOW;
//确保 HS XOSC 在进入 PM{2 - 3}时断电
//闪存缓存已禁用。
MEMCTR |= MEMCTR_CACHD;
睡眠= 0x06;
//按照“电源管理控制”一章中的说明进入电源模式
//中找到。 确保 DMA 通道0恰好被触发
//设置[PCON.IDLE]。
asm ("NOP");
asm ("NOP");
asm ("NOP");
IF (睡眠和0x03)
{
asm ("MOV 0xD7、#0x01");// DMAREQ = 0x01;
asm ("NOP");//需要完全对齐 DMA 传输。
asm ("ORL 0x87、#0x01");// PCON |= 0x01 -现在在 PM2中;
asm ("NOP");//唤醒时首次调用
}
//时序关键代码结束
//启用闪存缓存。
MEMCTR &=~MEMCTR_CACHD;
//使用原始描述符和 ARM 通道更新 DMA 通道0 (如果是)
//在输入 PM 之前使用。
DMA0CFGH = storedDescHigh;
DMA0CFGL = storedDescLow;
DMAARM = DMAARM0;
//等待 HS RCOSC 稳定
while (!(SLEEP & SLEEP_HFRC_S));
//将 LS XOSC 设置为睡眠定时器的时钟振荡器(CLKCON.OSC32 = 0)
CLKCON &=~CLKCON_OSC32;
// halPowerClkMgmtSetMainClkSrc (晶振);
}
}
如果我运行简单的 LED 切换、它工作正常。