【IAR工程】STM8S基于ST标准库读取DS1302数据
【IAR工程】STM8S基于ST标准库读取DS1302数据
- ✨申明:本文章仅发表在CSDN网站,任何其他网站,未注明来源,见此内容均为盗链和爬取,请多多尊重和支持原创!
- 🍁对于文中所提供的相关资源链接将作不定期更换。
- 🔖基于ST STM8S/A标准外设库:STSW-STM8069,版本号:
2.3.1 - 📌STSW-STM8069官方资源下载地址:
https://www.st.com/zh/embedded-software/stsw-stm8069.html - 🔧IAR编译器版本:
IAR Assembler for STMicroelectronics STM8 3.11.1 - 📌STM8S207/208RBT6最小系统板:
https://oshwhub.com/perseverance51/stm8s207rbt6-kai-fa-ban - 🎯本工程使用STM8S208RB+DS1302实物验证没有问题。
🎉基于标准库工程,当然不局限与STM8其他型号的芯片的使用,只要是stm8芯片都可以使用该源文件进行驱动,方便适配移植,减少不必要的重复开发工作。
- 📜串口打印信息:

📑引脚定义
如果是其他型号可以根据自由更换其他引脚。注意修改相关定义。
TM8S单片机-->DS1302PC2 -->CLKPC3-->DATPC4 -->RST
📓DS1302驱动
- 🌿DS1302.h文件
#ifndef __DS1302_H
#define __DS1302_H/****************************驱动 RTC 芯片 DS1302******************************//* Includes ------------------------------------------------------------------*/#include "stm8s.h"/* Defines -------------------------------------------------------------------*/
//是否设置时间到DS1302中
#define RTC_RESET_TIME_EN 0u#define RTC_SCK_PORT (GPIO_TypeDef *)(GPIOC)
#define RTC_SCK_PIN (GPIO_PIN_2) // PC2
#define RTC_SCK_HIGH() GPIO_WriteHigh(RTC_SCK_PORT, RTC_SCK_PIN)
#define RTC_SCK_LOW() GPIO_WriteLow (RTC_SCK_PORT, RTC_SCK_PIN)#define RTC_IO_PORT (GPIO_TypeDef *)(GPIOC)
#define RTC_IO_PIN (GPIO_PIN_3) // PC3#define RTC_IO_IN() GPIO_Init(RTC_IO_PORT, RTC_IO_PIN, GPIO_MODE_IN_PU_NO_IT)
#define RTC_IO_STATUS() GPIO_ReadInputPin(RTC_IO_PORT, RTC_IO_PIN)#define RTC_IO_OUT() GPIO_Init(RTC_IO_PORT, RTC_IO_PIN, GPIO_MODE_OUT_PP_HIGH_SLOW)
#define RTC_IO_HIGH() GPIO_WriteHigh(RTC_IO_PORT, RTC_IO_PIN)
#define RTC_IO_LOW() GPIO_WriteLow (RTC_IO_PORT, RTC_IO_PIN)#define RTC_RST_PORT (GPIO_TypeDef *)(GPIOC)
#define RTC_RST_PIN (GPIO_PIN_4) // PC4
#define RTC_RST_HIGH() GPIO_WriteHigh(RTC_RST_PORT, RTC_RST_PIN)
#define RTC_RST_LOW() GPIO_WriteLow (RTC_RST_PORT, RTC_RST_PIN)/* Values --------------------------------------------------------------------*/typedef struct Time
{uint8_t year; // year 0-99uint8_t month; // month 01-12uint8_t day; // day 01-28,29,30,31uint8_t week; // week 01-07uint8_t hour; // hour 01-12 or 00-23uint8_t minute; // minute 00-59uint8_t second; // second 00-59
} TimeTypeDef;static TimeTypeDef TimeBuffer; // 数据缓冲区(8421-BCD码)/* Functions -----------------------------------------------------------------*/void DS1302_Init ( void );static void DS1302_WriteByte ( uint8_t byte );
static uint8_t DS1302_ReadByte ( void );
static void DS1302_WriteData ( uint8_t addr, uint8_t data );
static uint8_t DS1302_ReadData ( uint8_t addr );TimeTypeDef DS1302_ReadTime ( void );
void DS1302_WriteTime ( TimeTypeDef *TimeDisplay );static uint8_t DectoBCD ( uint8_t num );
static uint8_t BCDtoDec ( uint8_t num );//static void DS1302_DLY_ms( uint16_t nCount );
static void DS1302_DLY_us( uint16_t nCount );#endif /* __DS1302_H */
- 🌿DS1302.c文件
#include "ds1302.h"/*************************************************************************初始化
--------------------------------------------------------------------------
无参数
--------------------------------------------------------------------------
无返回值
*************************************************************************/
void DS1302_Init ( void )
{GPIO_Init( RTC_SCK_PORT, RTC_SCK_PIN, GPIO_MODE_OUT_PP_HIGH_SLOW );GPIO_Init( RTC_RST_PORT, RTC_RST_PIN, GPIO_MODE_OUT_PP_HIGH_SLOW );GPIO_Init( RTC_IO_PORT, RTC_IO_PIN, GPIO_MODE_OUT_PP_HIGH_SLOW );RTC_SCK_LOW();RTC_IO_LOW();RTC_RST_LOW();
}/*************************************************************************写一字节数据
--------------------------------------------------------------------------
byte:一字节数据
--------------------------------------------------------------------------
无返回值
*************************************************************************/
static void DS1302_WriteByte ( uint8_t byte )
{uint8_t i;BitStatus bit;RTC_IO_OUT(); // IO 配置为输出模式for ( i = 0; i < 8; i++ ){RTC_SCK_LOW();bit = ( BitStatus )( byte & 0x01 );if ( bit != RESET )RTC_IO_HIGH();elseRTC_IO_LOW();RTC_SCK_HIGH();byte >>= 1;//DS1302_DLY_ms(1);}
}/*************************************************************************读一字节数据
--------------------------------------------------------------------------
addr:地址
--------------------------------------------------------------------------
返回值:一字节数据
*************************************************************************/
static uint8_t DS1302_ReadByte ( void )
{uint8_t i;uint8_t data = 0;BitStatus bit;RTC_IO_IN(); // IO 配置为输入模式for ( i = 0; i < 8; i++ ){data >>= 1;RTC_SCK_LOW();bit = RTC_IO_STATUS();if ( bit != RESET )data |= 0x80;elsedata &= 0x7F;RTC_SCK_HIGH();//DS1302_DLY_ms(1);}return data;
}/*************************************************************************往指定寄存器写入一字节数据
--------------------------------------------------------------------------
addr:地址 data:一字节数据
--------------------------------------------------------------------------
无返回值
*************************************************************************/
static void DS1302_WriteData ( uint8_t addr, uint8_t data )
{// 数据传输开始RTC_RST_LOW();RTC_SCK_LOW();RTC_RST_HIGH();DS1302_WriteByte ( addr ); // 写入的地址DS1302_WriteByte ( data ); // 写入的数据// 数据传输结束RTC_RST_LOW();
}/*************************************************************************在指定寄存器读出一字节数据
--------------------------------------------------------------------------
addr:地址
--------------------------------------------------------------------------
返回值:一字节数据
*************************************************************************/
static uint8_t DS1302_ReadData ( uint8_t addr )
{uint8_t data;// 数据传输开始RTC_RST_LOW();RTC_SCK_LOW();RTC_RST_HIGH();DS1302_WriteByte ( addr ); // 要读的地址data = DS1302_ReadByte(); // 要读的数据// 数据传输结束RTC_RST_LOW();return data;
}/*************************************************************************读时间
--------------------------------------------------------------------------
无参数
--------------------------------------------------------------------------
返回值:时间数据
*************************************************************************/
TimeTypeDef DS1302_ReadTime ( void )
{TimeTypeDef TimeDisplay;// 读出来的数据是 BCD 码TimeBuffer.year = DS1302_ReadData ( 0x8D );TimeBuffer.month = DS1302_ReadData ( 0x89 );TimeBuffer.day = DS1302_ReadData ( 0x87 );TimeBuffer.week = DS1302_ReadData ( 0x8B );TimeBuffer.hour = DS1302_ReadData ( 0x85 );TimeBuffer.minute = DS1302_ReadData ( 0x83 );TimeBuffer.second = DS1302_ReadData ( 0x81 ); // bit7 定义为时钟暂停标志(CH)// BCD 码转换为十进制TimeDisplay.year = BCDtoDec ( TimeBuffer.year );TimeDisplay.month = BCDtoDec ( TimeBuffer.month );TimeDisplay.day = BCDtoDec ( TimeBuffer.day );TimeDisplay.week = BCDtoDec ( TimeBuffer.week );TimeDisplay.hour = BCDtoDec ( TimeBuffer.hour );TimeDisplay.minute = BCDtoDec ( TimeBuffer.minute );TimeDisplay.second = BCDtoDec ( TimeBuffer.second );return TimeDisplay;
}/*************************************************************************修改时间
--------------------------------------------------------------------------
*TimeDisplay:要显示的时间(十进制)
--------------------------------------------------------------------------
无返回值
*************************************************************************/
void DS1302_WriteTime ( TimeTypeDef *TimeDisplay )
{// 十进制转换为 BCD 码TimeBuffer.year = DectoBCD ( TimeDisplay->year );TimeBuffer.month = DectoBCD ( TimeDisplay->month );TimeBuffer.day = DectoBCD ( TimeDisplay->day );TimeBuffer.week = DectoBCD ( TimeDisplay->week );TimeBuffer.hour = DectoBCD ( TimeDisplay->hour );TimeBuffer.minute = DectoBCD ( TimeDisplay->minute );TimeBuffer.second = DectoBCD ( TimeDisplay->second );// 关闭写保护(控制寄存器:8FH、8EH bit7:保护位)DS1302_WriteData ( 0x8E, 0x00 );// 写入的数据是 BCD 码DS1302_WriteData ( 0x8C, TimeBuffer.year );DS1302_WriteData ( 0x88, TimeBuffer.month );DS1302_WriteData ( 0x86, TimeBuffer.day );DS1302_WriteData ( 0x8A, TimeBuffer.week );DS1302_WriteData ( 0x84, TimeBuffer.hour );DS1302_WriteData ( 0x82, TimeBuffer.minute );DS1302_WriteData ( 0x80, TimeBuffer.second ); // bit7 定义为时钟暂停标志(CH)// 开启写保护(控制寄存器:8FH、8EH bit7:保护位)DS1302_WriteData ( 0x8E, 0x80 );
}/*************************************************************************十进制转BCD码
--------------------------------------------------------------------------
num:十进制数
--------------------------------------------------------------------------
返回值:BCD码
*************************************************************************/
static uint8_t DectoBCD ( uint8_t num )
{uint8_t result;uint8_t temp1, temp2;temp1 = ( num / 10 ) << 4; // 十位 / 10 * 16temp2 = num % 10; // 个位 % 10result = temp1 + temp2;return result;
}/*************************************************************************BCD码转十进制
--------------------------------------------------------------------------
num:BCD码
--------------------------------------------------------------------------
返回值:十进制
*************************************************************************/
static uint8_t BCDtoDec ( uint8_t num )
{uint8_t result;uint8_t temp1, temp2;temp1 = ( num >> 4 ) * 10; // 十位 / 16 * 10temp2 = num & 0x0F; // 个位 % 16result = temp1 + temp2;return result;
}/*************************************************************************软件延时(ms级别)
--------------------------------------------------------------------------
nCount:延时长度
--------------------------------------------------------------------------
无返回值
*************************************************************************/
//static void DS1302_DLY_ms( uint16_t nCount )
//{
// while( nCount-- )
// {
// DS1302_DLY_us( 1000 );
// }
//}/*************************************************************************软件延时(us级别)
--------------------------------------------------------------------------
nCount:延时长度
--------------------------------------------------------------------------
无返回值
*************************************************************************/
static void DS1302_DLY_us( uint16_t nCount )
{nCount *= 2;while( --nCount );
}
📝main主程序代码
/**************************************************************************************
实验现象:打开串口调试助手,选择CH340对应串口号,波特率设置9600, 串口助手上会显示printf各种数据格式输出信息。接线说明: 1,STM8S单片机-->LEDPC7-->LED1PC6-->LED2
---------------------------------------------------------TM8S单片机-->DS1302PC2 -->CLKPC3-->DATPC4 -->RST注意事项: 1、点击“Download active application”按钮,程序下载完成后,即可运行程序。2、串口1使用的是PA4和PA5引脚,所以这两个IO口不要被占用
***************************************************************************************/#include "stm8s.h" /* 添加库函数头文件 */
#include "delay.h"
#include "led.h"
#include "usart.h"
#include "ds1302.h"
#include <stdio.h>//包含此头文件调用printf函数串口才能有输出/* 主函数 */
int main( void )
{u8 i = 0;// 设置初始时间
// TimeTypeDef Set_Time = {23, 04, 4, 2, 23, 25, 10};
const char *WEEK[7] = { "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" };TimeTypeDef tm= {0};uint8_t TimeSecPre;disableInterrupts(); //关闭系统中断//内部时钟为1分频 = 16MhzCLK_SYSCLKConfig( CLK_PRESCALER_HSIDIV1 );LED_Init();USART1_Init( 9600 ); //初始化USART1 , 并设置波特率为9600DS1302_Init();//是否设置时间到DS1302中
#if RTC_RESET_TIME_EN > 0uDS1302_WriteTime( Set_Time );
#endifenableInterrupts(); //使能系统中断while( 1 ){i++;if( i % 20 == 0 ){LED1_TOGGLE;LED2_TOGGLE;}tm = DS1302_ReadTime();if ( TimeSecPre != tm.second ){TimeSecPre = tm.second;printf( "20%02d年%02d月%02d日 星期:%s %02d:%02d:%02d\r\n", tm.year, tm.month, tm.day,WEEK[tm.week] , tm.hour, tm.minute, tm.second);}delay_ms( 10 );}
}
//是一个宏定义;在固件库中,它的作用就是检测传递给函数的参数是否是有效的参数
void assert_failed( u8* file, u32 line )
{while ( 1 ){}
}
📚程序源码
- ✨申明:本文章仅发表在CSDN网站,任何其他网站,未注明来源,见此内容均为盗链和爬取,请多多尊重和支持原创!
- 🍁对于文中所提供的相关资源链接将作不定期更换。
链接: https://pan.baidu.com/s/18drnS5yPTSz79vxTBS7Brw
提取码: thdy
相关文章:
【IAR工程】STM8S基于ST标准库读取DS1302数据
【IAR工程】STM8S基于ST标准库读取DS1302数据✨申明:本文章仅发表在CSDN网站,任何其他网站,未注明来源,见此内容均为盗链和爬取,请多多尊重和支持原创!🍁对于文中所提供的相关资源链接将作不定期更换。&…...
【SpringBoot】实现后端服务器发送QQ邮件验证码的功能
步骤一、添加邮件相关依赖二、配置邮件服务器三、发送邮件PS:SMTP 发送失败的解决方案一、添加邮件相关依赖 在 pom.xml 文件中添加 JavaMail 和 Spring Mail 相关的依赖。示例代码如下: <dependency><groupId>com.sun.mail</groupId&g…...
vue在input中输入后,按回车,提交数据
vue在input中输入后,按回车,提交数据 1.展示效果如下: 2.代码展示: <div><el-input v-model"toAddNameText" keyup.enter.native"toAddName()" placeholder"回车,即新增该竖杆名称…...
【YOLOX】用YOLOv5框架YOLOX
【YOLOX】用YOLOv5框架YOLOX一、新建common_x.py二、修改yolo.py三、新建yolox.yaml四、训练最近在跑YOLO主流框架的对比实验,发现了一个很奇怪的问题,就是同一个数据集,在不同YOLO框架下训练出的结果差距竟然大的离谱。我使用ultralytics公司…...
【python机器学习实验】——逻辑回归与感知机进行线性分类,附可视化结果!
【python机器学习实验】——逻辑回归与感知机进行线性分类,附可视化结果! 下载链接 下载链接 下载链接 可视化效果图: 感知机模型结果为例: 首先,我们有训练数据和测试数据,其每一行为(x,y,label)的形式…...
wps删除的文件怎么恢复
在办公中,几乎每个人都会用到WPS办公软件。它可以帮助我们快速有效地处理各种Word文档、ppt幻灯片、excel表格等。但有文件就会有清理,如果我们不小心删除了wps文件呢?那些wps删除的文件怎么恢复?针对这种情况,小编为大家带来一些恢复WPS文…...
NIO消息黏包和半包处理
1、前言 我们在进行NIO编程时,通常会使用缓冲区进行消息的通信(ByteBuffer),而缓冲区的大小是固定的。那么除非你进行自动扩容(Netty就是这么处理的),否则的话,当你的消息存进该缓冲…...
day018 第六章 二叉树 part05
一、513.找树左下角的值 这个题目的主要思路是使用广度优先搜索(BFS)遍历整棵树,最后返回最后一层的最左边的节点的值。具体的实现可以使用队列来存储每一层的节点,并且在遍历每一层节点时,不断更新最左边的节点的值。…...
如何下载ChatGPT-ChatGPT如何写作
CHATGPT能否改一下文章 ChatGPT 作为一种自然语言处理技术,生成的文章可能存在表达不够准确或文风不符合要求等问题。在这种情况下,可以使用编辑和修改来改变输出的文章,使其符合特定的要求和期望。 具体来说,可以采用以下步骤对…...
微策略再次买入
原创:刘教链* * *隔夜,比特币再次小幅回升至28k上方。微策略(Microstrategy)创始人Michael Saylor发推表示,微策略再次出手,买入1045枚比特币。此次买入大概花费2930万美元,平均加仓成本28016美…...
express框架
Express 是基于 Node.js 平台,快速、开放、极简的 Web 开发框架. 创建一个基本的express web服务器 // 1.导入express const express require(express); // 2.创建web服务器 const app express(); // 3.启动web服务器 app.listen(80, ()>{console.log(expres…...
完蛋的goals
...
Javase学习文档------面象对象初探
引入面向对象 面向对象的由来: 面向对象编程(Object-Oriented Programming, OOP)是一种编程范型,其由来可以追溯到20世纪60年代。在此之前,主流编程语言采用的是“过程化编程”模式,即面向过程编程模式。在这种模式下&…...
ChatGPT能够干翻谷歌吗?
目前大多数人对于ChatGPT的喜爱,主要源自于其强大的沟通能力,当我们向ChatGPT提出问题时,它不仅能够为我们提供结论,而且还能够与我们建立沟通,向ChatGPT提出任何问题,感觉都像是在与一个真实的人类进行交谈…...
PCL 使用点云创建数字高程模型DEM
目录 一、DEM1、数字高程模型二、代码实现三、结果展示1、点云2、DEM四、相关链接一、DEM 1、数字高程模型 数字高程模型(Digital Elevation Model),简称DEM,是通过有限的地形高程数据实现对地面地形的数字化模拟(即地形表面形态的数字化表达),它是用一组有序数值阵列形…...
我体验了首个接入GPT-4的代码编辑器,太炸裂了
最近一款名为Cursor的代码编辑器已经传遍了圈内,受到众多编程爱好者的追捧。 它主打的亮点就是,通过 GPT-4 来辅助你编程,完成 AI 智能生成代码、修改 Bug、生成测试等操作。 确实很吸引人,而且貌似也能大大节省人为的重复工作&…...
互联网数据挖掘与分析讲解
一、定义 数据挖掘(英语:Data mining),又译为资料探勘、数据采矿。它是数据库知识发现(英语:Knowledge-Discovery in Databases,简称:KDD)中的一个步骤。数据挖掘一般是指从大量的数…...
linux之cut的使用
cut是一个选取命令,就是将一段数据经过分析,取出我们想要的。一般来说,选取信息通常是针对“行”来进行分析的,并不是整篇信息分析的 其语法格式为: cut [-bn] [file] 或 cut [-c][file] 或 cut [-df] [file]使用说明:…...
Redis第十讲 Redis之Hash数据结构Dict-rehash扩容操作
Rehash 执行过程 字典的 rehash 操作实际上就是执行以下任务: 创建一个比 ht[0]->table 更大的 ht[1]->table ;将 ht[0]->table 中的所有键值对迁移到 ht[1]->table ;将原有 ht[0] 的数据清空,并将 ht[1] 替换为新的 ht[0] ; 经过以上步骤之后, 程序就在不改…...
电动力学问题中的Matlab可视化
电磁场的经典描述 小说一则 电磁场的经典描述就是没有啥玩意量子力学的经典电动力学下对电磁场的描述,以后有空写个科幻小说,写啥呢,就写有天张三遇见了一个外星人,外星人来自这样一个星球,星球上的物质密度特别低,导致外星人的测量会明显的影响物质的运动,外星人不能同时得到…...
Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...
MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...
【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...
渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止
<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet: https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...
【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...
第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...
