APT32F1023H8S6(SSOP-24封装)MCU是由爱普特微电子推出的基于平头哥半导体RISC-V内核开发的32位高性能、低成本单片机,最近有个项目需要用到其超低功耗待机和RTC中断唤醒功能(实测功耗3.5uA,带LDO后功耗5.6uA),现把源代码和原理图分享给大家,方便大家学习、使用!

电路原理图如下:
image.png
单片机源程序如下:
/*******************************************************************************
  • 文件名: 真空泵控制板(超低功耗,9V集成电池待机3个月后唤醒)主控程序
  • 编  写: 李工/Michael Lee
  • 单  位: 领岸
  • 时  间: 2023年06月17日
  • 修  改:
  • 版  本: V1.0
  • 备  注:
  •         1.时钟选择MCU内部5MHz IMOSC振荡器;
  •             2.接口说明:
  •                    APT32F1023B-24PIN            -----                  外部设备
  •                   *******************         LED指示灯           ******************
  •                              PB0.3                  -----                    LED
  •               *******************          真空泵             ******************
  •                          PA0.0                  -----                 DC直流电机
  •                 3.MCU上电后使用默认IMOSC时钟完成软硬件初始化设置,初始化完毕后系统仍选择
  •                   此时钟作为主时钟(5分频),以降低功耗(实测电流500uA左右);
  •                 4.由于MCU选择内部IMOSC作为主时钟,下载仿真器注意要设置ICE Clock<1000KHz;
  •                 5.MCU上电后(自锁按键开关),先启动真空泵(DC直流电机)工作10秒钟,再初
  •                   始化RTC并低功耗运行,然后MCU进入深度休眠模式,RTC每隔3个月(测试时间设
  •                   为3小时)唤醒一次MCU,并启动真空泵工作10秒钟后再次进入深度休眠模式,以
  •                   此循环,直至电池供电耗尽(实测RTC运行时整机待机功耗5.6uA,其中MCU待机功
  •                   耗3.5uA左右,稳压LDO为HT7550-3,SOT-89封装,LDO空载功耗0.87uA);
  •                 6.免费申请APT32系列单片机/MCU下载仿真器、学习板及FAE技术支持、软硬件
  •                   开发咨询等请联系:18823326651(李工,微信同号)、274915968@qq.com
  • *******************************************************************************/
  • //加载头文件
  • #include "sys_clk.h"
  • #include "iostring.h"
  • #include "csp.h"
  • #include "pm.h"
  • #include "rtc.h"
  • #include <string.h>
  • #include <drv/gpio.h>
  • #include <drv/pin.h>
  • #include "low_power.h"                          //加载MCU低功耗设置等操作头文件
  • #include "rtc_time.h"                           //加载RTC初始化等操作头文件
  • //宏定义
  • /*** 变量类型 ***/
  • #define uchar unsigned char
  • #define uint unsigned int
  • #define ushort unsigned short
  • #define ulong unsigned long
  • /*** LED指示灯 ***/
  • #define LED_ON csi_pin_set_high(PB03)           //点亮LED指示灯(PB03端口输出高电平)
  • #define LED_OFF csi_pin_set_low(PB03)           //熄灭LED指示灯(PB03端口输出低电平)
  • /*** 直流电机真空泵 ***/
  • #define Pump_ON csi_pin_set_high(PA00)          //开启真空泵(PA00端口输出高电平)
  • #define Pump_OFF csi_pin_set_low(PA00)          //关闭真空泵(PA00端口输出低电平)
  • //外部函数
  • /*** 系统启动 ***/
  • extern void system_init(void);
  • extern void board_init(void);
  • //主函数标志位
  • uchar Pump_First_Start = 0;                     //定义、保存上电真空泵首次启动标志位
  • //主函数变量
  • uint Wake_Up_Times = 0;                         //定义、保存MCU低功耗唤醒次数
  • //外部变量
  •                            /********** GPIO口初始化操作 ***********/
  • /*******************************************************************************
  • 函数名: GPIO_Init()
  • 功  能: GPIO口初始化
  • 参  数: 无
  • 返回值: 无
  • *******************************************************************************/
  • void GPIO_Init(void)
  • {
  •         //LED指示灯
  •         csi_pin_set_mux(PB03,PB03_OUTPUT);                //配置PB0.3端口为输出模式
  •         csi_pin_output_mode(PB03, GPIO_PUSH_PULL);        //推挽输出
  •         //直流电机真空泵
  •         csi_pin_set_mux(PA00,PA00_OUTPUT);                //配置PA0.0端口为输出模式
  •         csi_pin_output_mode(PA00, GPIO_PUSH_PULL);        //推挽输出
  •         //主频CLO输出
  • //        csi_pin_set_mux(PA02, PA02_CLO);            //设置主频输出引脚为PA0.2脚
  • //  csi_clo_config(CLO_SYSCLK, CLO_DIV8);       //CLO分频系数为8,输出频率=主频48MHz/8=6MHz
  • }
  •                                          /********** 其他操作函数 ***********/
  • /*******************************************************************************
  • 函数名: Pump_Run()
  • 功  能: 直流电机真空泵启动10秒左右,并且LED闪烁提示
  • 参  数: 无
  • 返回值: 无
  • *******************************************************************************/
  • void Pump_Run(void)
  • {
  •         uint i;                                     //定义临时变量,方便后续程序使用
  •     Pump_ON;                                    //启动直流电机真空泵
  •         for(i=0;i<18;i++)                           //LED指示灯闪烁,并循环延时10秒
  •         {
  •                 LED_ON;                                 //点亮LED指示灯
  •                 mdelay(300);                            //延时
  •                 LED_OFF;                                //熄灭LED指示灯
  •                 mdelay(300);                            //延时
  •         }
  •         Pump_OFF;                                   //关闭直流电机真空泵
  • }
  • //主函数
  • int main()
  • {
  •         //系统、GPIO口等初始化
  •         system_init();                              //系统时钟、TICK等配置(系统时钟5MHz 5分频)
  • //        board_init();                               //UART2硬件串口等配置(系统打印参数用)
  •         GPIO_Init();                                //GPIO口初始化
  •         RTC_Init();                                 //RTC时钟初始化
  •         Low_Power_Set();                            //MCU低功耗设置
  •       
  •         //主循环
  •         while(1)
  •         {
  •                 //真空泵首次上电,启动10秒左右,并且LED闪烁提示(MCU被唤醒后也从此处开始执行程序)
  •                 if(Pump_First_Start==0)
  •                 {
  •                         Pump_Run();                         //真空泵运行
  •                         Pump_First_Start = 1;               //上电真空泵首次启动标志位置1
  •                 }
  •                 //MCU深度休眠被RTC中断唤醒,判断延时时间到后,真空泵启动10秒左右,并且LED闪烁提示
  •                 else
  •                 {
  •                         Wake_Up_Times++;                    //RTC中断唤醒计时次数+1
  •                         if(Wake_Up_Times>5)                 //延时时间达到:5*1min=5min
  •                         {
  •                                 Wake_Up_Times = 0;              //清零RTC中断唤醒计时次数
  •                                 Pump_Run();                     //真空泵运行
  •                         }
  •                 }
  •                 //MCU进入深度睡眠状态
  •                 csi_pm_enter_sleep(PM_MODE_DEEPSLEEP);  //MCU选择进入深度睡眠运行状态
  •         }
  •       
  •     return 0;
  • }
  • 复制代码
    image.png

    image.png