IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 华大单片机HC32L072KATA低功耗调试笔记 -> 正文阅读

[嵌入式]华大单片机HC32L072KATA低功耗调试笔记

硬件工程师做的测试自制最小系统,系统 供电3V

测试目标:

使用原厂的例程,修改GPIO配置后的代码

按键进入深度睡眠状态,

再次按键,唤醒,点亮LED灯2秒。

测试过程:

测试第一次发现,深度睡眠后电流,3V时高达260 uA

找了一圈问题,各个引脚检查,发现引脚状态不正常的KEY2,断开相应的连接。

重新测试后,下降到90 uA

再次排查非GPIO口,将AVCC_USB/AVSS_USB断开,

再次测试,电流下降到36 uA

找不到问题点。再检查 特殊功能IO口,发现BOOT0的电压不正常,不是0,也不是VDD,而是中间的一个值,断开BOOT0连接,电流测试为2.2 uA

但BOOT0是不能悬浮的,检查 程序发现,引脚被配置为输入上拉,将引脚改为输入下拉。

再次测试,电流为2.2uA

致此,低功耗的功耗验证完成。

这里,总结一下问题点:

  • 不连接AVCC_USB/AVSS_USB。
  • 外部电路的配置不合理。
  • PORTF的对应BOOT0的引脚配置错误。

附源码如下:

/******************************************************************************

?* Include files

?******************************************************************************/

#include gpio.h

#include lpm.h

/******************************************************************************

?* Local pre-processor symbols/macros ('#define')

?******************************************************************************/

/******************************************************************************

?* Global variable definitions (declared in header file with 'extern')

?******************************************************************************/

/******************************************************************************

?* Local type definitions ('typedef')

?******************************************************************************/

/******************************************************************************

?* Local function prototypes ('static')

?******************************************************************************/

/******************************************************************************

?* Local variable definitions ('static')??????????? ??????????????????????????*

?******************************************************************************/

/******************************************************************************

?* Local pre-processor symbols/macros ('#define')

?******************************************************************************/

/*****************************************************************************

?* Function implementation - global ('extern') and local ('static')

?******************************************************************************/

static void App_LedInit(void);

static void App_UserKeyInit(void);

static void App_LowPowerModeGpioSet(void);

static void _UserKeyWait(void);

/**

?******************************************************************************

?** \brief? Main function of project

?**

?** \return uint32_t return value, if needed

?**

?** This sample

?**

?******************************************************************************/

int32_t main(void)

{

??? ///< 配置Demo板上所有不使用的IO为高阻输入,避免端口漏电

??? App_LowPowerModeGpioSet();

??? ///< LED 端口初始化

????????????? App_LedInit(); //初始化LED,并点亮

???

????????????? ///< ===============================================

??? ///< ============ 警告,警告,警告!!!============

??? ///< ===============================================

??? ///< 本样例程序会进入深度休眠模式,因此以下两行代码起防护作用(防止进入深度

??? ///< 休眠后芯片调试功能不能再次使用),

??? ///< 在使用本样例时,禁止在没有唤醒机制的情况下删除以下两行代码。

??? delay1ms(2000);

??? _UserKeyWait();???? ///< 等待按键按下后进入休眠模式

??? Gpio_SetIO(EVB_LEDR_PORT, EVB_LEDR_PIN);??????? //关闭LED灯

???

????????????? ///< 打开并配置按键端口为下降沿中断

??? Gpio_EnableIrq(EVB_KEY1_PORT, EVB_KEY1_PIN, GpioIrqFalling);

??? EnableNvic(PORTA_IRQn, IrqLevel3, TRUE);

???

??? ///< 进入低功耗模式——深度休眠(使能唤醒后退出中断自动休眠特性)

??? Lpm_GotoDeepSleep(TRUE);

???

??? while(1)

??? {

??????? ;

??? }

}

///< PortC 中断服务函数

void PortA_IRQHandler(void)

{

??? if(TRUE == Gpio_GetIrqStatus(EVB_KEY1_PORT, EVB_KEY1_PIN))

??? {???????????

??????? ///< LED点亮

??????? Gpio_ClrIO(EVB_LEDR_PORT, EVB_LEDR_PIN);

???????

??????? delay1ms(2000);

???????

??????? ///< LED关闭

??????? Gpio_SetIO(EVB_LEDR_PORT, EVB_LEDR_PIN);?

??????? Gpio_ClearIrq(EVB_KEY1_PORT, EVB_KEY1_PIN);???

??? }

}???

static void _UserKeyWait(void)

{???

??? while(1)

??? {

??????? ///< 检测电平(USER按键是否按下(低电平))

??????? if(FALSE == Gpio_GetInputIO(EVB_KEY1_PORT, EVB_KEY1_PIN))

??????? {

??????????? break;

??????? }

??????? else

??????? {

??????????? continue;

??????? }

??? }

}

static void App_LowPowerModeGpioSet(void)

{

??? ///< 打开GPIO外设时钟门控

??? Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio, TRUE);

???

??? //swd as gpio

??? Sysctrl_SetFunc(SysctrlSWDUseIOEn, TRUE);

???

??? ///< 配置为数字端口

??? M0P_GPIO->PAADS = 0;

??? M0P_GPIO->PBADS = 0;

??? M0P_GPIO->PCADS = 0;

??? M0P_GPIO->PDADS = 0;

??? M0P_GPIO->PEADS = 0;

??? M0P_GPIO->PFADS = 0;

?????????????

????????????? ///< 配置全为上拉使能

????????????? M0P_GPIO->PAPU = 0XFFFF;

??? M0P_GPIO->PBPU = 0XFFFF;

??? M0P_GPIO->PCPU = 0XFFFF;

??? M0P_GPIO->PDPU = 0XFFFF;

??? M0P_GPIO->PEPU = 0XFFFF;

??? M0P_GPIO->PFPD = 0XFFFF;???? //PORTF改为下拉

???

??? ///< 配置为端口输入(除LED端口外)

??? M0P_GPIO->PADIR = 0XFFFF;

??? M0P_GPIO->PBDIR = 0XFFFF;

??? M0P_GPIO->PCDIR = 0XFFFF;

??? M0P_GPIO->PDDIR = 0XFFFF;

??? M0P_GPIO->PEDIR = 0XFFFF;

??? M0P_GPIO->PFDIR = 0XFFFF;

???

}

static void App_UserKeyInit(void)

{

??? stc_gpio_cfg_t stcGpioCfg;

???

??? ///< 打开GPIO外设时钟门控

??? Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio, TRUE);

???

??? ///< 端口方向配置->输入

??? stcGpioCfg.enDir = GpioDirIn;

??? ///< 端口驱动能力配置->高驱动能力

??? stcGpioCfg.enDrv = GpioDrvL;

??? ///< 端口上下拉配置->无

??? stcGpioCfg.enPu = GpioPuEnable;

??? stcGpioCfg.enPd = GpioPdDisable;

??? ///< 端口开漏输出配置->开漏输出关闭

??? stcGpioCfg.enOD = GpioOdDisable;

??? ///< 端口输入/输出值寄存器总线控制模式配置->AHB

??? stcGpioCfg.enCtrlMode = GpioAHB;

??? ///< GPIO IO USER KEY初始化

??? Gpio_Init(EVB_KEY1_PORT, EVB_KEY1_PIN, &stcGpioCfg); ???

???

}

static void App_LedInit(void)

{

??? stc_gpio_cfg_t stcGpioCfg;

???

??? ///< 打开GPIO外设时钟门控

??? Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio, TRUE);

???

??? ///< 端口方向配置->输出(其它参数与以上(输入)配置参数一致)

??? stcGpioCfg.enDir = GpioDirOut;

??? < 端口上下拉配置->无

??? stcGpioCfg.enPu = GpioPuDisable;

??? stcGpioCfg.enPd = GpioPdDisable;

??? ///< GPIO IO LED端口初始化

??? Gpio_Init(EVB_LEDR_PORT, EVB_LEDR_PIN, &stcGpioCfg);

??? ///< LED关闭

??? Gpio_ClrIO(EVB_LEDR_PORT, EVB_LEDR_PIN);

}

/**

*****************************************************************************

** \brief 进入深度睡眠模式

**

** \input bOnExit - TRUE:当退出异常处理后,自动再次进入休眠;

** FALSE:唤醒后不再自动进入休眠

**

** \retval NULL

*****************************************************************************/

void Lpm_GotoDeepSleep(boolean_t bOnExit)

{

SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk;

SCB->SCR |= 1u

__WFI();

}

/******************************************************************************

?* EOF (not truncated)

?******************************************************************************/

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-09-09 11:56:09  更:2021-09-09 11:57:57 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 0:48:22-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码