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.

[参考译文] CC3230SF:在电池断电以唤醒休眠模式时 GPIO3的中断模式

Guru**** 2342660 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/1515592/cc3230sf-interrupt-mode-for-gpio3-when-the-battery-goes-down-to-wake-up-the-hibernate-mode

器件型号:CC3230SF

工具/软件:

尊敬的  和其他专家

我在将 GPIO3设置为中断或唤醒源方面有疑问。 使用 platform.c 文件中的代码在 Hibernate 模式下对产品进行测试。 此程序测试了如何成功使 MCU 进入休眠模式。 我已经确认了这一点、因为当 MCU 从运行模式更改为休眠模式时、可以看到大约25mA 的电流下降。

我想让 MCU 在电池电量降至20%以下时、在从休眠模式中断时唤醒并进入工作模式。 电池电平通过 GPIO3测量、因为充电器输出连接到分压器后的 GPIO3。


因此、如果参考数据表和 prcm.h 文件、则 GPIO3不可用于中断。 我的问题是、如何将 GPIO3设为中断? 我为它制作了代码并进行了测试。 请参阅随附的图像。 最后一个图像显示 GPIO3设置为中断、但在进入下一个循环之前卡住在那里。下面是我的代码、这里有一个错误。

下面是我的代码、这里有一些错误。 我谦卑地期待专家帮助我确定这一问题。

----------------------------------------------------------------------------------------------------------------------------------------------

(main.c 文件)

Float BatteryLevel (){

ADC_Handle ADC;
ADC_Params 参数;
INT_fast16_t res;
悬空 Vin_battery、百分比;

uint32_t sum = 0;
INT 计数= 0;
int i;

adc_init ();

ADC_Params_init (&params);

ADC = ADC_OPEN (CONFIG_ADC_0、&params);

IF (ADC = NULL)

返回0.0f;
}

对于(i = 0;i < 100;i++){
Uint16_t adcValue0;
RES = ADC_CONVERT (ADC、&adcValue0);
如果(res == ADC_STATUS_SUCCESS){
uint32_t adcValue0MicroVolt = ADC_convertRawToMicroVolts (ADC、adcValue0);
SUM += adcValue0MicroVolt;
count++;
}
}

if (count > 0){
uint32_t average_adcValue0MicroVolt = sum / count;
VIN_BATTERY = AVERAY_adcValue0MicroVolt / 10000.0f;

VIN_BATTERY_CALIBRATED = Vin_BATTERY - 0.047f;

百分比=((Vin_battery_calibrated - 0.435f)/(0.609f - 0.435f))* 100.0f;
如果(百分比< 0.0f)百分比= 0.0f;
否则 if (百分比> 100.0f)百分比= 100.0f;

}

ADC_CLOSE (ADC);

返回百分比;

}

空中断时间(){

#define GPIO_BASE 0x40024000
#define PRCM_HIB_GPIO3 (1 << 3)

//将引脚设置为内部上拉电阻
PinTypeGPIO (PIN_58、PIN_MODE_0、TRUE);// TRUE =启用上拉

//设置为输入和下降沿触发器
GPIODirModeSet (GPIO_BASE、1 << 3、GPIO_DIR_MODE_IN);
GPIOIntTypeSet (GPIO_BASE、1 << 3、GPIO_FALLING_EDGE);
GPIOIntClear (GPIO_BASE、1 << 3);
GPIOIntEnable (GPIO_BASE、1 << 3);

//允许 GPIO3从休眠状态唤醒
PRCMHibernateWakeupSourceEnable (PRCM_HIB_GPIO3);

}

空中断关闭(){
#define GPIO_BASE 0x40024000
GPIOIntDisable (GPIO_BASE、1 << 3);//禁用 GPIO3上的中断
}

mainThread(){

如果(battery_percentage < 20.0f){
uart_print ("电池电量低于20%...\n");
flutOn();
setHibRetentionReg ();
getHibRetentionReg ();
}

uart_print ("电池电量超过20%...\n");

scheduleShutdown(NULL);
powerShutdown(Ms);

}

----------------------------------------------------------------------------------------------------------------------------------------------

(platform.c 文件)

#define SLOW_CLK_FREQ 32768

void powerShutdown (uint32_t shutdownTime)

Power_Notify Obj hibSignal;
uint32_t ticks =(shutdownTime * SLOW_CLK_FREQ)/1000;
UART_print ("关机节拍=%lu\n"、节拍);
PRCMHibernateIntervalSet(ticks);
PRCMHibernateWakeupSourceEnable (PRCM_HIB_SLOW_CLK_CTR);

uart_print ("为%lu ms 进入休眠状态..."、shutdownTime);
POWER_registerNotify (&hibSignal、PowerCC32XX_Entering_shutdown、
preHibConfig、
(uintptr_t) NULL);
INT STATUS = POWER_SHUTDOWN (0、ticks);

if (status != Power_Sok){
UART_print ("Hibernate failed! 已返回 power_shutdown:%d\n"、状态);
}其他{
uart_print ("已请求休眠(您不应看到此行)\n");
}
}

----------------------------------------------------------------------------------------------------------------------------------------------

此致、

Aiman

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Aiman:

    根据CC323x 的 TRM 、是用于休眠的唤醒源:以下引脚:GPIO2、GPIO4、GPIO13、GPIO17、GPIO11、 GPIO24。  其中未列出引脚 GPIO3。  这可能意味着您不能将 GPIO3用于此目的。

    1月

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 

    我想知道我是否更改为 GPIO2、上面的代码对于执行中断是正确的。

    Aiman

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Aiman:

    很抱歉、我无法调试您的代码 请等待 TI 的回答。  但我可以向您提供一些意见:

    • 您的代码很奇怪。 将 TI 驱动器(PowerCC32XX.h)的电源管理层与 driverlib 层混用。 尽管这种方法可能起作用、但它可能会带来一些副作用 、因为这不是电源管理层的预期用途。
    • 请勿定义和使用您自己的宏、如宏  PRCM_HIB_GPIO3。 仅使用 驱动程序中定义的 PRCM_HIB_宏。
    • 您错过了调用函数  PRCMHibernateWakeUpGPIOSelect()
    • 如果我能推荐一件事。 不要将多个抽象层混合在一起。 在相同的代码中使用 TI drviers 或 drvierlib、除非您完全知道自己在做什么。

    1月