新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 基于GD32F130系列單片機(jī)的一種高性能、小尺寸、低成本的超低功耗解決方案實(shí)現(xiàn)(下)

基于GD32F130系列單片機(jī)的一種高性能、小尺寸、低成本的超低功耗解決方案實(shí)現(xiàn)(下)

作者:陳思偉 時(shí)間:2017-03-09 來源:電子產(chǎn)品世界 收藏

接上篇
3  硬件參考設(shè)計(jì)
     如圖2,AM1815進(jìn)入sleep模式的方式為MCU通過SPI 接口設(shè)置AM1815的sleep相關(guān)寄存器的值以使其進(jìn)入sleep模 式,當(dāng)AM1815進(jìn)入sleep模式后,會(huì)將PSW/nIRQ2引腳電 平由低變?yōu)楦?,而AM1815的PSW/nIRQ2引腳接到MCU的 VSS,當(dāng)其電平由低變高時(shí),MCU從上電變?yōu)閿嚯姞顟B(tài)。 AM1815從sleep模式喚醒的方式為其EXTI引腳接收到一個(gè)上 升沿或者下降沿脈沖,這樣PSW/nIRQ2引腳電平就會(huì)從高 變?yōu)榈?,從而MCU從斷電變?yōu)樯想姞顟B(tài)。通過以上這種方 式,以AM1815的進(jìn)入低功耗和喚醒來控制MCU的斷電和上 電。
AM1815和的引腳連接如表1。

4  軟件參考設(shè)計(jì) MCU通過SPI接口讀寫AM1815寄存器時(shí)序圖如圖3。 由AM1815的datasheet中SPI讀寫時(shí)序圖大概可知,MCU
讀AM1815寄存器的過程,首先要發(fā)送一個(gè)需要讀取的寄存 器地址addr,其中addr的第7位為0表示讀,然后把MCU通過 SPI接收到的AM1815返回的第一個(gè)字節(jié)丟掉,從第二個(gè)字節(jié)

本文引用地址:http://2s4d.com/article/201703/345021.htm

圖3   SPI讀寫過程
開始順序接收到的數(shù)據(jù)就是讀取的數(shù)據(jù)。MCU寫AM1815的過程類似,首先發(fā)送需要寫入的寄存器地址addr,其中addr 的第7位為1表示寫,然后依次將需要寫入的字節(jié)寫入,不用 管AM1815返回的數(shù)據(jù)。參 考 A M 1 8 1 5 d a t a s h e e t 中 S P I 接 口 讀 寫 過 程 , 在 端開發(fā)SPI接口函數(shù)讀寫AM1815寄存器相關(guān)代碼 如下:
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);
//等待發(fā)送區(qū)空
SPI1->DTR=addr;    //發(fā)送一個(gè)byte while((SPI1->STR&SPI_FLAG_RBNE)==RESET);    //等
待接收完一個(gè)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);
//等待發(fā)送區(qū)空
SPI1->DTR=addr;    //發(fā)送一個(gè)byte while((SPI1->STR&SPI_FLAG_RBNE)==RESET);  //等
待接收完一個(gè)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進(jìn)入sleep過程 選擇GD130的一個(gè)普通的GPIO口(例如PB7)作為控制
引 腳 , 當(dāng) 檢 測 到 P B 7 上 有 一 個(gè) 下 降 沿 時(shí) , 通 過 S P I 接 口 向 AM1815的sleep寄存器寫值則會(huì)控制AM1815進(jìn)入sleep模式。 參考datasheet,相關(guān)代碼如下:
if(!GPIO_ReadInputBit(GPIOB,GPIO_PIN_7))
{
/*先將Control1寄存器的STOP位清0,否則第二次無法
進(jìn)入sleep,將ARST和PWR2位置1*/
temp_stop=readreg(0x10);

writereg(0x10, (temp_stop&&0x7F)|0x06);

temp_stop= readreg(0x10);

/*將IntMask寄存器的EX1E位置1,使能外部觸發(fā)中斷,
以喚醒AM1815*/

temp1= readreg(0x12); writereg(0x12, temp1|0x01); temp1= readreg(0x12); if(readreg(0x12)==0xE1)
{
/*讀Status寄存器,清EX1位,將Sleep_Control寄存器的
SLP位置1,進(jìn)入sleep模式*/
temp_state=readreg(0x0F); temp_sleep=readreg(0x17); writereg(0x17, temp_sleep|0x80); temp_sleep= readreg(0x17);
}

}

5 AM1815被喚醒以及喚醒MCU啟動(dòng)過程
A M1815可以通過外部信號(hào)喚醒, 上升沿和下降沿均 可,也可以通過設(shè)置RTC定時(shí)自動(dòng)喚醒。當(dāng)AM1815的EXTI 引腳接收到一個(gè)外部觸發(fā)信號(hào),PSW引腳會(huì)由高變到低,從 而控制MCU上電啟動(dòng)。因篇幅所限,該部分代碼就不再貼 出來了。

6 結(jié)語
本 文 設(shè) 計(jì) 了 一 種 可 以 應(yīng) 用 于 可 穿 戴 設(shè) 備 、 便 攜 設(shè) 備 、 追 蹤 器 、 R F I D 、 支 付 U k e y 、 儀 器 儀 表 等 行 業(yè) 的 低 功耗設(shè)計(jì)方案。 該方案使用了Gigadev ice公司的高性價(jià)比 MCU G8U6和Ambiq Micro公司的超低功耗RTC AM1815。和業(yè)界通用的單芯片方案比較,該方案具有高性 能、超低功耗、小尺寸以及低成本的特點(diǎn)。在低占空比的應(yīng) 用場合,該方案的優(yōu)勢更加明顯。



關(guān)鍵詞: GD32F130 單片機(jī)

評(píng)論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉