基于GD32F130系列单片机的一种高性能、小尺寸、低成本的超低功耗解决方案实现(下)
接上篇
3 硬件参考设计
如图2,AM1815进入sleep模式的方式为MCU通过SPI 接口设置AM1815的sleep相关寄存器的值以使其进入sleep模 式,当AM1815进入sleep模式后,会将PSW/nIRQ2引脚电 平由低变为高,而AM1815的PSW/nIRQ2引脚接到MCU的 VSS,当其电平由低变高时,MCU从上电变为断电状态。 AM1815从sleep模式唤醒的方式为其EXTI引脚接收到一个上 升沿或者下降沿脉冲,这样PSW/nIRQ2引脚电平就会从高 变为低,从而MCU从断电变为上电状态。通过以上这种方 式,以AM1815的进入低功耗和唤醒来控制MCU的断电和上 电。
AM1815和GD32F130的引脚连接如表1。
4 软件参考设计 MCU通过SPI接口读写AM1815寄存器时序图如图3。 由AM1815的datasheet中SPI读写时序图大概可知,MCU
读AM1815寄存器的过程,首先要发送一个需要读取的寄存 器地址addr,其中addr的第7位为0表示读,然后把MCU通过 SPI接收到的AM1815返回的第一个字节丢掉,从第二个字节
图3 SPI读写过程
开始顺序接收到的数据就是读取的数据。MCU写AM1815的过程类似,首先发送需要写入的寄存器地址addr,其中addr 的第7位为1表示写,然后依次将需要写入的字节写入,不用 管AM1815返回的数据。参 考 A M 1 8 1 5 d a t a s h e e t 中 S P I 接 口 读 写 过 程 , 在 GD32F130端开发SPI接口函数读写AM1815寄存器相关代码 如下:
MCU通过SPI读AM1815寄存器代码
void mcu_spi_read(uint8_t num_bytes, uint8_t addr, uint8_t
*data)
{
uint8_t i,temp; addr=addr & 0x7F; ASSERT_SPI_CE;
while((SPI1->STR&SPI_FLAG_TBE)==RESET);
//等待发送区空
SPI1->DTR=addr; //发送一个byte while((SPI1->STR&SPI_FLAG_RBNE)==RESET); //等
待接收完一个byte temp= SPI1->DTR;
for (i = 0; i < num_bytes; i++)
{
while((SPI1->STR&SPI_FLAG_TBE)==RESET); SPI1->DTR = 0;
// Write data is a don't care.
while((SPI1->STR&SPI_FLAG_RBNE)==RESET);
data[i] = SPI1->DTR;
} DEASSERT_SPI_CE;
} MCU通过SPI写AM1815寄存器代码
void mcu_spi_write(uint8_t num_bytes, uint8_t addr, uint8_
t *data)
{
uint8_t i,temp; addr=addr | 0x80; ASSERT_SPI_CE;
while((SPI1->STR&SPI_FLAG_TBE)==RESET);
//等待发送区空
SPI1->DTR=addr; //发送一个byte while((SPI1->STR&SPI_FLAG_RBNE)==RESET); //等
待接收完一个byte
temp= SPI1->DTR;
for (i = 0; i < num_bytes; i++)
{
while((SPI1->STR&SPI_FLAG_TBE)==RESET); SPI1->DTR = data[i]; // Write data is a don't care. while((SPI1->STR&SPI_FLAG_RBNE)==RESET); temp = SPI1->DTR;
} DEASSERT_SPI_CE;
} GD130控制AM1815进入sleep过程 选择GD130的一个普通的GPIO口(例如PB7)作为控制
引 脚 , 当 检 测 到 P B 7 上 有 一 个 下 降 沿 时 , 通 过 S P I 接 口 向 AM1815的sleep寄存器写值则会控制AM1815进入sleep模式。 参考datasheet,相关代码如下:
if(!GPIO_ReadInputBit(GPIOB,GPIO_PIN_7))
{
/*先将Control1寄存器的STOP位清0,否则第二次无法
进入sleep,将ARST和PWR2位置1*/
temp_stop=readreg(0x10);
writereg(0x10, (temp_stop&&0x7F)|0x06);
temp_stop= readreg(0x10);
/*将IntMask寄存器的EX1E位置1,使能外部触发中断,
以唤醒AM1815*/
temp1= readreg(0x12); writereg(0x12, temp1|0x01); temp1= readreg(0x12); if(readreg(0x12)==0xE1)
{
/*读Status寄存器,清EX1位,将Sleep_Control寄存器的
SLP位置1,进入sleep模式*/
temp_state=readreg(0x0F); temp_sleep=readreg(0x17); writereg(0x17, temp_sleep|0x80); temp_sleep= readreg(0x17);
}
}
5 AM1815被唤醒以及唤醒MCU启动过程
A M1815可以通过外部信号唤醒, 上升沿和下降沿均 可,也可以通过设置RTC定时自动唤醒。当AM1815的EXTI 引脚接收到一个外部触发信号,PSW引脚会由高变到低,从 而控制MCU上电启动。因篇幅所限,该部分代码就不再贴 出来了。
6 结语
本 文 设 计 了 一 种 可 以 应 用 于 可 穿 戴 设 备 、 便 携 设 备 、 追 踪 器 、 R F I D 、 支 付 U k e y 、 仪 器 仪 表 等 行 业 的 低 功耗设计方案。 该方案使用了Gigadev ice公司的高性价比 MCU GD32F130G8U6和Ambiq Micro公司的超低功耗RTC AM1815。和业界通用的单芯片方案比较,该方案具有高性 能、超低功耗、小尺寸以及低成本的特点。在低占空比的应 用场合,该方案的优势更加明显。
- 基于GD32F130系列单片机的一种高性能、小尺寸、低成本的超低功耗解决方案实现(上)(03-09)
- FPGA的DSP性能揭秘(06-16)
- 基于单片机通用引脚的软件UART设计(10-16)
- 分时操作系统思想在单片机中的具体应用 (10-30)
- 基于AT89C51+DSP的双CPU伺服运动控制器的研究(05-26)
- 关于RTX51 TINY的分析与探讨(05-30)