工具/软件:
尊敬的 Shlomi Itzhak 和其他专家
我在将 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 (¶ms);
ADC = ADC_OPEN (CONFIG_ADC_0、¶ms);
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