一开始网上搜了很多代码,把好多子程序都放进去了,心想万一以后能用到。

端口设置如下。

  GPIO_InitTypeDef GPIO_InitStruct;DS1302_CLK_RCC_CLK_ENABLE();/*open GPIO  clock*/GPIO_InitStruct.Pin = DS1302_CLK;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;//GPIO_PULLUP;//GPIO_NOPULLGPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(DS1302_CLK_PORT, &GPIO_InitStruct); 

下载过后,没有反应,读的数据不是5A,就是FF。再看手册,再网搜代码。

STM32F103用IO口和DS1302模块通信_迷宫中的我-CSDN博客 这个是目前最接近我的胃口的代码。

因为这个作者也使用了HAL库。我仔细对比了数据手册和代码,确认是上升沿有效写入,下降沿有效读出。先送出数据,设计上升沿,完成写操作。设计下降沿,读入数据,完成读操作。为了完成基本功能,删除了整片读写函数,增加了信号操作的几个延时 。

整个代码只有两个操作。

1)写命令字节(DS1302的IO线改为输出方式),写数据字节(DS1302的IO线改为输出方式)。

2)写命令字节(DS1302的IO线改为输出方式),读数据(DS1302的IO线改为输入方式)。

单步运行,发现输入输出设定的标志位搞反了。

/**********配置数据IO端口 输出 **********/if(FLAG==0x00)//-------这里原来是01,改成00就对了{  GPIO_InitStruct.Pin = DS1302_DAT;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;//GPIO_PULLUPGPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(DS1302_DAT_PORT, &GPIO_InitStruct);  }/**********配置数据IO端口 输入**********/if(FLAG==0x01)//------这里原来是00,改成01就对了{    GPIO_InitStruct.Pin = DS1302_DAT;GPIO_InitStruct.Mode = GPIO_MODE_INPUT;//配置输入,DS1302_DAT pin has an internal 40kΩ (typ) pulldown resistor to ground.GPIO_InitStruct.Pull = GPIO_NOPULL;//GPIO_PULLUP;//GPIO_NOPULLGPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;//GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(DS1302_DAT_PORT, &GPIO_InitStruct); }

去掉杜邦线,直接找合适的插座与DS1302的插针连接。

再次运行,终于读到了正确数据。就是16进制到bcd的转换还不习惯。赶紧再熟悉一下。

重要的代码如下。

/********************************************************
****函数名称:void DS_WriteByte(uint8_t data)
****函数作用:DS1302写一个字节
****输入参数:要写的数据,
****输出参数:
********************************************************/
void DS1302_WriteByte(uint8_t data)
{uint8_t i=0;DS1302_Set_IO(FLAG_OUT);//DS1302_DAT_setOUT()for(i=0;i<8;i++){if(data&0x01)DS1302_DAT_H();//数据线放上数据,先发低位elseDS1302_DAT_L();DS1302_CLK_L();//时钟线拉低DS1302_delay(2);        DS1302_CLK_H();//时钟上升沿写入数据DS1302_delay(2);data>>=1;}DS1302_DAT_L();
}
/********************************************************
****函数名称:void DS_WriteSingleReg(uint8_t reg,uint8_t data)
****函数作用:写数据DS寄存器
****输入参数:reg,寄存器   data,数据
****输出参数:
********************************************************/
void DS1302_WriteSingleReg(uint8_t reg,uint8_t data)
{DS1302_RST_L();//禁止数据传输 !!!这条很重要DS1302_CLK_L();//确保写数据前SCLK为低电平DS1302_delay(2);DS1302_RST_H();    //RET=1;//启动DS1302总线DS1302_delay(3);DS1302_WriteByte(reg);DS1302_WriteByte(data);DS1302_RST_L();// CE=0;DS1302_CLK_L();//CLK=0;}
/********************************************************
****函数名称:uint8_t DS_ReadByte(void)
****函数作用:读取一个字节数据
****输入参数:
****输出参数:读出的数据 LSB 先出。
写数据是在SCLK的上升沿实现,而读数据在SCLK的下降沿实现,所以,在单字节读时序中,
写命令的第八个上升沿结束后紧接着的第八个下降沿就将要读寄存器的第一位数据读到数据线上了!
这个就是DS1302操作中最特别的地方。当然读出来的数据也是最低位开始。
********************************************************/
uint8_t DS1302_ReadByte(void)
{uint8_t bit=0;uint8_t input_value=0;uint8_t i=0;    DS1302_Set_IO(FLAG_IN);//DS1302_DAT_setIN();//配置IO为输入DS1302_delay(2);for(i=0;i<8;i++){DS1302_CLK_H();DS1302_delay(5);DS1302_CLK_L();DS1302_delay(10);//时钟线拉低,时钟下降沿读数据。读之前为DS1302_WriteByte,最后为DS1302_CLK_Hbit=(HAL_GPIO_ReadPin(DS1302_DAT_PORT,DS1302_DAT));input_value |= (bit << i);         }DS1302_Set_IO(FLAG_OUT);//配置IO为输出,恢复正常状态DS1302_delay(2);return input_value;
}
/********************************************************
****函数名称:uint8_t DS1302_ReadSingleReg(uint8_t reg)
****函数作用:读取寄存器的值
****输入参数:寄存器,reg发送所在地址
****输出参数:值
********************************************************/
uint8_t DS1302_ReadSingleReg(uint8_t reg)
{uint8_t data=0;uint8_t mm,nn,value;   DS1302_RST_L();//禁止数据传输 !!!这条很重要DS1302_CLK_L();//确保写数据前SCLK为低电平DS1302_delay(2);DS1302_RST_H();//RET=1;//启动DS1302总线,当CE被从0置为1时,时钟线必须为逻辑0。DS1302_delay(2);DS1302_WriteByte(reg);data=DS1302_ReadByte();DS1302_RST_L();  DS1302_delay(2);DS1302_CLK_L();//数据处理转化十进制mm=data/16;nn=data%16;value=mm*10+nn;return value;
}

//在DS1302.c中,读完时间后调用printf 打印到串口输出,计算机用串口调试助手接收,“时间”这两个字会出现中文乱码
printf("时间:%d-%d-%d %d:%d:%d %d \n",TimeData.year,TimeData.month,TimeData.day,TimeData.hour,TimeData.minute,TimeData.second,TimeData.week);
把上面一行放在主程序中,串口接收汉字正常。怎么肥事?

STM32读写DS1302,HAL库方式相关推荐

  1. 【STM32】CubeMX+HAL库之 硬件IIC+DMA控制OLED(兼容SSD1306SH1106驱动)

    [STM32]CubeMX+HAL库之 硬件IIC+DMA控制1.3寸OLED 前言 目前网上大多数驱动OLED屏都采用软件IIC,因为HAL库的升级使得硬件IIC的稳定性得到了保障,所以想采用硬件I ...

  2. 【STM32笔记】HAL库低功耗STOP停止模式的串口唤醒(解决进入以后立马唤醒、串口唤醒和回调无法一起使用、接收数据不全的问题)

    [STM32笔记]HAL库低功耗STOP停止模式的串口唤醒(解决进入以后立马唤醒.串口唤醒和回调无法一起使用.接收数据不全的问题) [STM32笔记]低功耗模式配置及避坑汇总 前文: blog.csd ...

  3. 【STM32笔记】HAL库低功耗模式配置(ADC唤醒无法使用、低功耗模式无法烧录解决方案)

    [STM32笔记]HAL库低功耗模式配置(ADC唤醒无法使用.低功耗模式无法烧录解决方案) [STM32笔记]低功耗模式配置及避坑汇总 一.低功耗模式简介 系统提供了多个低功耗模式,可在 CPU 不需 ...

  4. STM32CubeMX | STM32 F1系列HAL库低功耗STOP和STANDBY模式唤醒(RTC时钟唤醒+外部中断唤醒示例)

    STM32CubeMX | STM32 F1系列HAL库低功耗STOP和STANDBY模式唤醒(RTC时钟唤醒+外部中断唤醒示例) 目录 STM32CubeMX | STM32 F1系列HAL库低功耗 ...

  5. STM32如何配置HAL库

    STM32如何配置HAL库 前言   相比较早几年使用标准库开发来讲,最近几年HAL库的使用是越来越多,那么我们开发应当使用哪一种呢,本文着重介绍常用的几种开发方式及相互之间的区别,白猫也好.黑猫也好 ...

  6. 【嵌入式系统基础实验一】-----led流水灯及串口通信的HAL库方式和寄存器编程方式实现,输出波形检测

    文章目录 1.实验知识点简要解析 1.1串口通信协议 1.2 RS232.485电平与TTL电平的区别 1.3 USB/TTL转232"模块 2.LED流水灯的寄存器地址 和HAL库这两种方 ...

  7. STM32寄存器HAL库方式的LED程序

    目录 一.原理学习.学习和理解STM32F103系列芯片的地址映射和寄存器映射原理:了解GPIO端口的初始化设置三步骤(时钟配置.输入输出模式设置.最大速率设置). 1.什么是寄存器 2.STM32F ...

  8. STM32单片机基于HAL库开发HC-SR04 超声波测距模块(终极版)

    参考: 某宝HC-SR04 超声波测距模块商品详情页 STM32L051C8T6 HAL库 输入捕获进行超声波测距 案例 STM32CubeMX学习笔记3--TIM2输入捕获(SR-04测距) cub ...

  9. STM32系列之HAL库开发

    STM32系列文章目录 文章目录 STM32系列文章目录 前言 一.HAL库之串口收发 1.配置STM32CUBEID 2.使用串口中断收发 2.1 配置串口中断 2.2 HAL库中断处理逻辑 3 测 ...

  10. STM32 之二 HAL库详解 及 手动移植

    2018.1.19 更新其中的错误部分 HAL库结构   说到 STM32 的 HAL 库,就不得不提 STM32CubeMX,其作为一个可视化的配置工具,对于开发者来说,确实大大节省了开发时间.ST ...

最新文章

  1. ADPRL - 近似动态规划和强化学习 - Note 3 - Stochastic Infinite Horizon Problem
  2. linux java maven_Linux——java+tomcat+maven 安装
  3. PHP Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 8192 bytes)
  4. 设计模式的理解:组合模式 (Composite)
  5. CG CTF MISC 图种
  6. 【操作系统】Semaphore处理吸烟者问题
  7. TF下载量已超4600万!首届TensorFlow World大会,谷歌大牛Jeff Dean激情演讲
  8. Php超出高度隐藏,html设置div最小高度,超出的自适应
  9. 2018-12-20 第二章Java 预习作业
  10. MySQL数据库MyISAM与InnoDB存储引擎的比较
  11. Java-抽象类第一篇认识抽象类
  12. PS2019剪裁、切片、标尺工具、吸管工具、颜色取样器、注释工具、计数工具
  13. Java分布式架构:应用+特点+架构模式
  14. redis下载配置并简单测试(免安装版)
  15. java中public static void main(String args[])具体是什么意思?
  16. 汽车零部件:供应生产仍需持续恢复中
  17. App Store拒绝原因
  18. python爬取微博评论点赞数_Python selenium爬取微博数据代码实例
  19. 如何修改默认的FTP帐号或密码
  20. 百度超级链数字藏品 仿鲸探数字藏品平台开发

热门文章

  1. SpringBoot使用Mybatis教程
  2. Bentley.Hammer.XM.v08.09.400.34 1CD(水锤和瞬态分析软件)好用版\
  3. 54版本火狐浏览器、firebug及firepath的安装
  4. 前端页面常用代码参考
  5. 深入理解Nginx~优化性能的配置项
  6. python实现一个土豆聊天 potato chat 机器人
  7. 学完这个PPT设计课程后,我实现了月入3w+!
  8. #python 颜色聚类处理
  9. 多智能体强化学习(二) MAPPO算法详解
  10. Python 文件路径过深找不到文件