新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 基于GD32F130系列单片机的一种高性能、小尺寸、低成本的超低功耗解决方案实现(下)

基于GD32F130系列单片机的一种高性能、小尺寸、低成本的超低功耗解决方案实现(下)

作者:陈思伟时间:2017-03-09来源:电子产品世界收藏

接上篇
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和的引脚连接如表1。

4  软件参考设计 MCU通过SPI接口读写AM1815寄存器时序图如图3。 由AM1815的datasheet中SPI读写时序图大概可知,MCU
读AM1815寄存器的过程,首先要发送一个需要读取的寄存 器地址addr,其中addr的第7位为0表示读,然后把MCU通过 SPI接收到的AM1815返回的第一个字节丢掉,从第二个字节

本文引用地址:http://www.eepw.com.cn/article/201703/345021.htm

图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 接 口 读 写 过 程 , 在 端开发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 G8U6和Ambiq Micro公司的超低功耗RTC AM1815。和业界通用的单芯片方案比较,该方案具有高性 能、超低功耗、小尺寸以及低成本的特点。在低占空比的应 用场合,该方案的优势更加明显。



关键词: GD32F130 单片机

评论


相关推荐

技术专区

关闭