特性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等应用场景。