久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6797|回復: 1
打印 上一主題 下一主題
收起左側

STM32與DS1302的接口電路

[復制鏈接]
跳轉到指定樓層
樓主
ID:51472 發表于 2013-7-9 03:14 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
   作者在某STM32的應用中外接了一塊DS1302,借鑒原來寫過的PIC代碼,很快移植成功。在這里與大家分享一下。(1)硬件 CLK PA4  DAT PA5 RST PA6
(2)硬件初始化 CLK與RST均為輸出,而DAT是開漏型的輸出。因為在這種方式下,IO口的讀仍然存在,因此是真正的雙向IO模式。
/*DSCK -PA4 DAT PA5 RST DAT*/
#define ds1302Clk GPIO_Pin_4   //與時鐘線相連的芯片的管腳
#define ds1302Dat GPIO_Pin_5   //與數據線相連的芯片的管腳
#define ds1302Rst GPIO_Pin_6   //與復位端相連的芯片的管腳

/* PA 4,6,為輸出*/
GPIO_InitStructure.GPIO_Pin =  ds1302Clk | ds1302Rst ;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
   GPIO_Init(GPIOA, &GPIO_InitStructure);
//PA5配置為開漏模式,此模式下可以實現真下的雙向IO
GPIO_InitStructure.GPIO_Pin =  ds1302Dat;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
   GPIO_Init(GPIOA, &GPIO_InitStructure);
(3)配置完畢,然后實現的代碼就很簡單了,從現成的代碼移植過來。
#define WrEnDisCmd  0x8e  //寫允許/禁止指令代碼
#define WrEnDat     0x00 //寫允許數據
#define WrDisDat    0x80 //寫禁止數據
#define OscEnDisCmd 0x80 //振蕩器允許/禁止指令代碼
#define OscEnDat    0x00 //振蕩器允許數據
#define OscDisDat   0x80 //振蕩器禁止數據
#define WrMulti     0xbe //寫入多個字節的指令代碼
#define WrSingle    0x84 //寫入單個字節的指令代碼
#define RdMulti  0xbf //讀出多個字節的指令代碼
////以上這些#define均放在一個ds1302.h文件中。
void SendDat_1302(u8 Dat)
{ u8 i;
u8 cTmp;
for(i=0;i<8;i++)
{
   cTmp=Dat&LSB; //數據端等于tmp數據的末位值
  if(cTmp)    //1
      GPIO_SetBits(GPIOA,ds1302Dat);
  else
   GPIO_ResetBits(GPIOA,ds1302Dat);
  Dat>>=1;
  GPIO_SetBits(GPIOA,ds1302Clk);
  uDelay(1);
  GPIO_ResetBits(GPIOA,ds1302Clk);
}
}
/*寫入1個或者多個字節,第1個參數是相關命令
#define WrMulti     0xbe //寫入多個字節的指令代碼
#define WrSingle    0x84 //寫入單個字節的指令代碼
第2個參數是待寫入的值
第3個參數是待寫入數組的指針
*/
void WriteByte_1302(u8 CmdDat,u8 Num,u8 *pSend)
{
u8 i=0;
GPIO_ResetBits(GPIOA,ds1302Rst);
uDelay(1);
GPIO_SetBits(GPIOA,ds1302Rst);
SendDat_1302(CmdDat);
for(i=0;i<Num;i++)
{ SendDat_1302(*(pSend+i));
}
GPIO_ResetBits(GPIOA,ds1302Rst);
}
/*讀出字節,第一個參數是命令
#define RdMulti  0xbf //讀出多個字節的指令代碼
第2個參數是讀出的字節數,第3個是指收數據數組指針
*/
void RecByte_1302(u8 CmdDat,u8 Num,u8 *pRec)
{
u8 i,j,tmp,cTmp;
GPIO_ResetBits(GPIOA,ds1302Rst);//復位引腳為低電平
uDelay(1);
GPIO_ResetBits(GPIOA,ds1302Clk);
uDelay(1);
GPIO_SetBits(GPIOA,ds1302Rst);
SendDat_1302(CmdDat); //發送命令
for(i=0;i<Num;i++)
{ for(j=0;j<8;j++)
  { tmp>>=1;
   cTmp=GPIO_ReadInputDataBit(GPIOA,ds1302Dat);
   if(cTmp)
    tmp|=0x80;
   GPIO_SetBits(GPIOA,ds1302Clk);
   uDelay(1);
   GPIO_ResetBits(GPIOA,ds1302Clk);      
  }
  *(pRec+i)=tmp;
}
uDelay(1);
GPIO_ResetBits(GPIOA,ds1302Rst);//復位引腳為低電平
}
/*
當寫保護寄存器的最高位為0時,允許數據寫入寄存器。
寫保護寄存器可以通過命令字節8E、8F來規定禁止寫入/讀出。寫保護位不能在多字節傳送模式下寫入。
當寫保護寄存器的最高位為1時,禁止數據寫入寄存器。
時鐘停止位操作:當把秒寄存器的第7位時鐘停止位設置為0時起動時鐘開始
當把秒寄存器的第7位時鐘停止位設置為1時,時鐘振蕩器停止。
   
    根據傳入的參數決定相關命令,
第一個參數:命令字,第2個參數:寫入的數據
寫允許命令;8EH,00H
寫禁止命令;8EH,80H
振蕩器允許命令;80H,00H
振蕩器禁止命令;80H,80H
*/
void WrCmd(u8 CmdDat,u8 CmdWord)
{ u8 CmdBuf[2];
CmdBuf[0]=CmdWord;
WriteByte_1302(CmdDat,1,CmdBuf);
}
main函數中調用如下:
u8 Ds1302SendBuf[8]={0x30,0x32,0x01,0x10,0x01,0x01,0x08,33};  //發送數據緩沖區
u8 Ds1302RecBuf[8];    //接收數據緩沖區
WrCmd(WrEnDisCmd,WrEnDat);  //寫允許
WrCmd(OscEnDisCmd,OscEnDat); //振蕩器允許
WriteByte(WrMulti,8,Ds1302SendBuf);//將時間值送到DS1302中
RecByte(RdMulti,8,Ds1302RecBuf); // 讀出來看看,
......

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:51941 發表于 2013-7-21 09:52 | 只看該作者
為什么要用DS1302, STM32不是內部有RTC模塊么?
再用它就資源浪費了。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 在线播放国产一区二区三区 | 亚洲精品美女视频 | 成人免费视频网站在线看 | 国产精品一区二区三区四区 | 欧美亚洲国产一区二区三区 | 久久久精 | 美日韩免费视频 | 国产成人精品免高潮在线观看 | 黄色在线免费网站 | 伊人伊人| 亚洲自拍偷拍免费视频 | 精品粉嫩超白一线天av | 久热爱 | 成年人免费在线视频 | 亚洲视频在线观看 | 欧美日一区二区 | 国产精品久久久乱弄 | 国内精品视频 | 国产精品区一区二区三区 | 在线观看黄视频 | 秋霞a级毛片在线看 | 成人精品视频 | 久久久久国产一区二区三区 | 亚洲精品一区久久久久久 | 国产亚洲欧美在线视频 | 久久国产成人 | 国产91久久精品一区二区 | 久久国产成人精品国产成人亚洲 | 成人性视频免费网站 | 性xxxxx| 日韩区| 欧美福利视频一区 | 欧美一级黑人aaaaaaa做受 | 日韩精品久久久久 | 亚洲激情一级片 | 99久久久久久久久 | 成人乱人乱一区二区三区软件 | 久久亚洲天堂 | 成人三级网址 | 亚洲精品久久久久久久久久久 | 国产婷婷色综合av蜜臀av |