OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 8180|回复: 23

请问谁用过stm32驱动ds12c887这个实时时钟芯片?

[复制链接]

2

主题

14

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2015-4-3
在线时间
0 小时
发表于 2015-4-3 19:46:23 | 显示全部楼层 |阅读模式
5金钱
RT,本人按照那个RTC的时序来写的程序,死活读不了时钟的数据,网上基本上全是51驱动的这个芯片,不知道哪位用stm32驱动过这个片子,求解答!!!以下是本人写的读写函数
//写DS12C887函数
void write_ds(unsigned char add,unsigned char date)
{
  dscs = 0;
  dsas = 0;
  dsds = 1;
  dsrw = 1;  
  wad0 = (add & 0x01); //先写地址 
  wad1 = ((add & 0x02) >>1);
  wad2 = ((add & 0x04) >>2);
  wad3 = ((add & 0x08) >>3);
  wad4 = ((add & 0x10) >>4);
  wad5 = ((add & 0x20) >>5);
  wad6 = ((add & 0x40) >>6);
  wad7 = ((add & 0x80) >>7);  
  dsas = 1;
  dsrw = 0;
  wad0 = (date & 0x01); //再写数据
  wad1 = ((date & 0x02) >>1);
  wad2 = ((date & 0x04) >>2);
  wad3 = ((date & 0x08) >>3);
  wad4 = ((date & 0x10) >>4);
  wad5 = ((date & 0x20) >>5);
  wad6 = ((date & 0x40) >>6);
  wad7 = ((date & 0x80) >>7);
  dsrw = 1;
  dsas = 0;
  dscs = 1;
}

//读DS12C887函数
unsigned char read_ds(unsigned char add)
{
  unsigned char ds_date;
  unsigned char d1;
  unsigned char d2;
  unsigned char d3;
  unsigned char d4;
  unsigned char d5;
  unsigned char d6;
  unsigned char d7;
  unsigned char d8;
  dscs = 0;
  dsas = 0;
  dsds = 1;
  dsrw = 1;
  wad0 = (add & 0x01); //先写地址 
  wad1 = ((add & 0x02) >>1);
  wad2 = ((add & 0x04) >>2);
  wad3 = ((add & 0x08) >>3);
  wad4 = ((add & 0x10) >>4);
  wad5 = ((add & 0x20) >>5);
  wad6 = ((add & 0x40) >>6);
  wad7 = ((add & 0x80) >>7);  
  dsas = 1;
  dsds = 0;
  d1 = (rad7 << 7);
  d2 = (rad6 << 6);
  d3 = (rad5 << 5);
  d4 = (rad4 << 4);
  d5 = (rad3 << 3);
  d6 = (rad2 << 2);
  d7 = (rad1 << 1);
  d8 = rad0 ;
  ds_date = (d1 + d2 + d3 + d4 + d5 + d6 + d7 + d8);//再读数据
  dsds = 1;
  dsas = 0;
  dscs = 1;
  return ds_date;
}

最佳答案

查看完整内容[请看2#楼]

用FSMC接口就行了。不过PB7上需要接74HC04反相器后才能与AS脚连接。 单片机:STM32F103VET6 [mw_shl_code=c,true]#include #include #include typedef __packed struct { __IO uint8_t SEC; __IO uint8_t SECALR; __IO uint8_t MIN; __IO uint8_t MINALR; __IO uint8_t HOUR; __IO uint8_t HOURALR; __IO uint8_t DAY; __IO uint8_t DATE; ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

15

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2017-9-27
在线时间
6 小时
发表于 2015-4-3 19:46:24 | 显示全部楼层
用FSMC接口就行了。不过PB7上需要接74HC04反相器后才能与AS脚连接。
单片机:STM32F103VET6
[mw_shl_code=c,true]#include <stdio.h>
#include <stm32f10x.h>
#include <string.h>

typedef __packed struct
{
        __IO uint8_t SEC;
        __IO uint8_t SECALR;
        __IO uint8_t MIN;
        __IO uint8_t MINALR;
        __IO uint8_t HOUR;
        __IO uint8_t HOURALR;
        __IO uint8_t DAY;
        __IO uint8_t DATE;
        __IO uint8_t MONTH;
        __IO uint8_t YEAR;
        __IO uint8_t CR1;
        __IO uint8_t CR2;
        __IO uint8_t CR3;
        __IO uint8_t CR4;
        __IO uint8_t RAM1[36]; // 0x0e-0x31
        __IO uint8_t CENTURY;
        __IO uint8_t RAM2[77]; // 0x33-0x7f
} DS12C887_TypeDef;

#define RTC2 ((DS12C887_TypeDef *)0x60000000)

// 延时n毫秒
void delay(uint16_t nms)
{
        TIM_TimeBaseInitTypeDef tim;
        TIM_TimeBaseStructInit(&tim);
        tim.TIM_Period = 10 * nms - 1;
        tim.TIM_Prescaler = 7199;
        TIM_TimeBaseInit(TIM6, &tim);
        TIM_ClearFlag(TIM6, TIM_FLAG_Update);
        TIM_SelectOnePulseMode(TIM6, TIM_OPMode_Single);
        TIM_Cmd(TIM6, ENABLE);
        while (TIM_GetFlagStatus(TIM6, TIM_FLAG_Update) == RESET);
}

int fputc(int ch, FILE *fp)
{
        if (fp == stdout)
        {
                if (ch == '\n')
                {
                        while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
                        USART_SendData(USART1, '\r');
                }
                while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
                USART_SendData(USART1, ch);
        }
        return ch;
}

int main(void)
{
        FSMC_NORSRAMInitTypeDef fsmc;
        FSMC_NORSRAMTimingInitTypeDef fsmc_timing;
        GPIO_InitTypeDef gpio;
        USART_InitTypeDef usart;
        
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC, ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE | RCC_APB2Periph_USART1, ENABLE);
        
        // PA8为RST复位引脚(默认输出低电平)
        gpio.GPIO_Mode = GPIO_Mode_Out_PP;
        gpio.GPIO_Pin = GPIO_Pin_8;
        gpio.GPIO_Speed = GPIO_Speed_2MHz;
        GPIO_Init(GPIOA, &gpio);
        
        // PA9为串口1发送引脚
        gpio.GPIO_Mode = GPIO_Mode_AF_PP;
        gpio.GPIO_Pin = GPIO_Pin_9;
        gpio.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &gpio);
        
        // PB7为NADV, 取反后送到AS引脚上, 该引脚不可用地址线代替
        gpio.GPIO_Pin = GPIO_Pin_7;
        GPIO_Init(GPIOB, &gpio);
        
        // PD0~1为AD2~3, PD4为NOE接DS引脚, PD5为NWE接RW引脚, PD7为NE1片选引脚接CS, PD14~15为AD0~1
        gpio.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_7 | GPIO_Pin_14 | GPIO_Pin_15;
        GPIO_Init(GPIOD, &gpio);
        
        // PE7~10为AD4~7
        gpio.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10;
        GPIO_Init(GPIOE, &gpio);
        
        // 初始化串口1
        USART_StructInit(&usart);
        usart.USART_BaudRate = 115200;
        usart.USART_Mode = USART_Mode_Tx;
        USART_Init(USART1, &usart);
        USART_Cmd(USART1, ENABLE);
        
        // FSMC的Bank1, Subbank1设为8位NOR Flash地址/数据线复用模式, 关闭NWAIT引脚
        fsmc.FSMC_ReadWriteTimingStruct = &fsmc_timing;
        fsmc.FSMC_WriteTimingStruct = &fsmc_timing;
        FSMC_NORSRAMStructInit(&fsmc);
        fsmc.FSMC_MemoryType = FSMC_MemoryType_NOR; // 存储器类型为NOR Flash
        fsmc.FSMC_WaitSignal = FSMC_WaitSignal_Disable; // 不使用NWAIT引脚
        fsmc_timing.FSMC_AddressHoldTime = 1;
        fsmc_timing.FSMC_AddressSetupTime = 0;
        fsmc_timing.FSMC_BusTurnAroundDuration = 0;
        fsmc_timing.FSMC_DataSetupTime = 2; // HCLK=72MHz时, DATAST的最小值为2, 即3xHCLK clock cycles
        FSMC_NORSRAMInit(&fsmc);
        FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM1, ENABLE); // 虽然Subbank1默认是启用的, 但执行FSMC_NORSRAMInit函数时会被关闭, 所以需要再次开启
        
        printf("STM32F103VE FSMC DS12C887\n");
        delay(200);
        GPIO_WriteBit(GPIOA, GPIO_Pin_8, Bit_SET); // RESET=1, 撤销复位信号
        
        // 读写自由SRAM区域
        printf("General-purpose RAM1 addr: 0x%08x\n", (uint32_t)RTC2->RAM1);
        printf("General-purpose RAM2 addr: 0x%08x\n", (uint32_t)RTC2->RAM2);
        strcpy((char *)RTC2->RAM1, "Flexible static memory controller");
        strcpy((char *)RTC2->RAM2, "Muxed mode - multiplexed asynchronous access to NOR Flash memory");
        printf("str1=%s\n", RTC2->RAM1);
        printf("str2=%s\n", RTC2->RAM2);
        
        // 读A~D寄存器
        printf("A=0x%02x B=0x%02x C=0x%02x D=0x%02x\n", RTC2->CR1, RTC2->CR2, RTC2->CR3, RTC2->CR4);
        while (1)
                __WFI();
}

void HardFault_Handler(void)
{
        printf("Hard Error!\n");
        while (1);
}[/mw_shl_code]
回复

使用道具 举报

2

主题

14

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2015-4-3
在线时间
0 小时
 楼主| 发表于 2015-4-3 19:48:39 | 显示全部楼层
在线等,在线等
回复

使用道具 举报

2

主题

14

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2015-4-3
在线时间
0 小时
 楼主| 发表于 2015-4-3 19:53:46 | 显示全部楼层
是不是这个片子太古老了,没人用过。。。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-4-3 22:50:37 | 显示全部楼层
帮顶。。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

2

主题

14

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2015-4-3
在线时间
0 小时
 楼主| 发表于 2015-4-4 11:56:26 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
原子哥用过这个时钟芯片吗?
回复

使用道具 举报

5

主题

40

帖子

0

精华

初级会员

Rank: 2

积分
141
金钱
141
注册时间
2015-1-10
在线时间
19 小时
发表于 2015-4-4 12:18:40 | 显示全部楼层
在郭天祥51的教程中见过,但没用过。
回复

使用道具 举报

2

主题

14

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2015-4-3
在线时间
0 小时
 楼主| 发表于 2015-4-4 12:22:32 | 显示全部楼层
回复【6楼】Director_Liu:
---------------------------------
他是用的51,我用的stm32,我就是按照他那个移植的,就是不管用…
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-4-5 00:07:17 | 显示全部楼层
回复【5楼】huidefengsy:
---------------------------------
没用过
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

3

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
85
金钱
85
注册时间
2015-8-17
在线时间
20 小时
发表于 2015-8-17 10:36:39 | 显示全部楼层
你时序写错了吧,我看郭天祥不是这么写的呀
回复

使用道具 举报

2

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
54
金钱
54
注册时间
2012-12-16
在线时间
5 小时
发表于 2016-1-16 18:46:44 | 显示全部楼层
本帖最后由 maverics 于 2016-1-16 18:47 编辑

请问lz硬件上stm32驱动ds12c887,选用的IO口还是外部总线,能否推荐下硬件如何设计,谢谢
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2016-4-6
在线时间
1 小时
发表于 2016-4-6 13:13:14 | 显示全部楼层
楼主弄完了吗,求程序
回复

使用道具 举报

15

主题

317

帖子

0

精华

高级会员

Rank: 4

积分
863
金钱
863
注册时间
2015-2-12
在线时间
354 小时
发表于 2016-4-6 13:18:42 | 显示全部楼层
STM32速度快,建议移植时,先夸张地延时时序间隔。然后再逐步消弱它。
回复

使用道具 举报

15

主题

317

帖子

0

精华

高级会员

Rank: 4

积分
863
金钱
863
注册时间
2015-2-12
在线时间
354 小时
发表于 2016-4-6 13:22:03 | 显示全部楼层
补充:注意数据端口读写更换。
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
5
金钱
5
注册时间
2020-3-13
在线时间
1 小时
发表于 2020-3-13 17:02:26 | 显示全部楼层
huidefengsy 发表于 2015-4-4 12:22
回复【6楼】Director_Liu:
---------------------------------
他是用的51,我用的stm32,我就是按照他那个 ...

楼主弄出来了吗,求问哭哭,很急,有报酬噢
回复

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2020-6-7
在线时间
3 小时
发表于 2020-6-7 13:58:31 | 显示全部楼层
datoudatou 发表于 2020-3-13 17:02
楼主弄出来了吗,求问哭哭,很急,有报酬噢

您这个搞定了么?
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2020-6-8
在线时间
4 小时
发表于 2020-6-8 14:01:21 | 显示全部楼层
Jacobli 发表于 2020-6-7 13:58
您这个搞定了么?

请问你有这个代码吗?
回复

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2020-6-7
在线时间
3 小时
发表于 2020-6-9 20:41:28 | 显示全部楼层
Brandon613 发表于 2020-6-8 14:01
请问你有这个代码吗?

有,2018年初的时候用STM32F107+DS12C887调出来的,实现了RTC的读写时间;目前此部分代码用了一两年了,运行稳定;
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2020-6-8
在线时间
4 小时
发表于 2020-6-9 22:22:13 | 显示全部楼层
Jacobli 发表于 2020-6-9 20:41
有,2018年初的时候用STM32F107+DS12C887调出来的,实现了RTC的读写时间;目前此部分代码用了一两年了,运 ...

可以分享下代码吗?可有偿,急用
回复

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2020-6-7
在线时间
3 小时
发表于 2020-6-10 20:38:59 | 显示全部楼层
Brandon613 发表于 2020-6-9 22:22
可以分享下代码吗?可有偿,急用

代码可以分享,但是我怎么分享给你呢;
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2020-6-8
在线时间
4 小时
发表于 2020-6-10 21:16:49 | 显示全部楼层
Jacobli 发表于 2020-6-10 20:38
代码可以分享,但是我怎么分享给你呢;

加我QQ吧:1059778337,谢谢啦
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
20
金钱
20
注册时间
2020-5-28
在线时间
6 小时
发表于 2020-10-23 10:22:59 | 显示全部楼层
你好,看你已经解决了这个stm32驱动ds12c887?
回复

使用道具 举报

1

主题

9

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2020-6-2
在线时间
5 小时
发表于 2020-10-30 09:17:01 | 显示全部楼层
STM32F103C8T6没FSMC口怎么驱动DS12C887呀,时序按51写的求助!!!
回复

使用道具 举报

1

主题

9

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2020-6-2
在线时间
5 小时
发表于 2020-12-15 16:32:31 | 显示全部楼层
本帖最后由 苍天蓝耀 于 2020-12-15 16:36 编辑




回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-25 07:37

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表