描述
本文来源电子发烧友社区,作者:李先生, 帖子地址:https://bbs.elecfans.com/jishu_2283626_1_1.html
特性
WUP 模块是唤醒模块,时钟来源 3K,每隔 0.3ms 计数一次,当 wup_data =
0 时,不工作,无 irq 产生。wup_data 不等于 0 时每隔(wup_data+1)个时钟周
期产生一个 irq,计数器重新装载 wup_data 的值。可以用于低功耗模式的唤醒等。
寄存器
wup 数据寄存器(wup_data)
wup 中断使能寄存器(wup_irq_en)
wup 中断寄存器(wup_irq)
接口代码
寄存器定义在driversIncCSM32RV20.h
-
#define WUP_BASE 0x30000610UL
-
typedef struct
-
{
-
volatile uint32_t DATA;
-
volatile uint32_t IRQ_EN;
-
volatile uint32_t IRQ;
-
}WUP_TypeDef;
-
#define WUP ((WUP_TypeDef *)WUP_BASE)
复制代码
接口代码位于
driversSrcwup.c
driversIncwup.h
-
#include "headfile.h"
-
void WUP_Init_case1(uint32_t data)//设置中断周期,使能WUP中断
-
{
-
WUP->DATA = data;
-
WUP->IRQ_EN = 1;
-
}
-
void WUP_IRQhandler(void)
-
{
-
if(WUP->IRQ&0x01)
-
{
-
WUP->IRQ = 0;
-
//GPIO_Toggle(GPIOA,PIN14);
-
}
-
}
复制代码
测试代码
-
#include "headfile.h"
-
int main(void)
-
{
-
///----System Init ---------------------------------------------------------------------------------------------
-
CLIC_Init();//系统中断配置
-
System_Clock_Init();//系统时钟初始化
-
///----Chapter 5 GPIO Test Init ---------------------------------------------------------------------------------
-
GPIO_MODE_Init(GPIOA,PIN8,GPIO_MODE_OUTPUT); //GPIO 模式
-
UART_Init_case1(UART1);//非中断模式
-
WUP_Init_case1(10*1000*3);//设置中断周期,使能WUP中断 9S
-
Interrupt_Enable(WUP_int_ID);//CLIC使能中断
-
SYS_Interrupt_Enable();//CLIC开总中断
-
while(1)
-
{
-
//配置不同低功耗模式
-
System_Halt();//待机模式 halt1
-
ee_printf("nCSM32RV201");
-
System_Sleep();//睡眠模式 halt2
-
ee_printf("nCSM32RV202");
-
System_Powerdown();//掉电模式 powerdown1
-
ee_printf("nCSM32RV203");
-
System_DeepPwd();//掉电模式 powerdown2
-
ee_printf("nCSM32RV204");
-
}
-
return 0;
-
}
-
void WUP_IRQhandler(void)
-
{
-
if(WUP->IRQ&0x01)
-
{
-
WUP->IRQ = 0;
-
GPIO_Toggle(GPIOA,PIN8);
-
}
-
}
复制代码
测试
烧录程序测试,可以看到每隔10*1000*3*0.3mS即9S唤醒一次,打印字符串。
问题待确认:
打印一次显示不全,先打印的
CSM32RV20
然后打印
1
CSM32RV20
然后是
2
CSM32RV20
前两次间隔9S,后一次间隔21S。
总结
对于物联网应用来说,低功耗是很重要的。实现低功耗的一个重要手段就是休眠,定时唤醒。CSM32RV20支持不同级别的低功耗模式,可以定时唤醒,适合IOT等应用场景。
打开APP阅读更多精彩内容