2019年9月19日星期四(STM32)

一.RTC(实时时钟)

1.背景

时间在计算机系统中是一个非常重要的参数,在很多应用场景下都需要使用时间。RTC就是一个专门记录时间的设备,本质上是一个1Hz定时器。

为了计时准确,计时系统掉电也要能够正常计时。为了到达这个目的,RTC需要独立的时钟源,独立的供电电源

stm32f407的RTC的时钟源是低速晶振(LSE---32.768KHz),使用纽扣电池单独供电

2.stm32f407的RTC

RTC进行2次预分频,一次7位异步和15位的同步,最终得到1hz的时钟,为了降低功耗,异步预分频器尽量设置较大的值

RTC的中断属于外部中断,按照外部中断的方法配置

3.RTC编程实现

(1)使能PWR时钟

RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);

(2)使能RTC寄存器访问

PWR_BackupAccessCmd(ENABLE);

(3)选择RTC时钟源(LSE)

RCC_LSEConfig(RCC_LSE_ON);//使能LSE时钟

while(RCC_GetFlagStatus(RCC_FLAG_LSERDY)!=SET);//等待LSE就绪

RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);//选择LSE作为RTC时钟源

RCC_RTCCLKCmd(ENABLE);//使能RTC时钟

(4)等待所有RTC寄存器就绪

RTC_WaitForSynchro();

(5)初始化RTC(分频系数/时间格式)

ErrorStatus RTC_Init(RTC_InitTypeDef* RTC_InitStruct)


typedef struct
{
  uint32_t RTC_HourFormat;   /*!< 12/24小时格式  @ref RTC_Hour_Formats */
 
  uint32_t RTC_AsynchPrediv; /*!< 异步分频系数 0x7f lower than 0x7F */
 
  uint32_t RTC_SynchPrediv;  /*!< 同步分频系数 0xff lower than 0x7FFF
*/
}RTC_InitTypeDef;

(6)设置日期和时间

ErrorStatus
RTC_SetTime(uint32_t RTC_Format, RTC_TimeTypeDef* RTC_TimeStruct)


typedef struct
{
  uint8_t RTC_Hours;    /*!< 时 */

uint8_t RTC_Minutes;  /*!<
分 */
 
  uint8_t RTC_Seconds;  /*!< 秒 */

uint8_t RTC_H12;     
/*!< 上午/下午 AM/PM @ref
RTC_AM_PM_Definitions */
}RTC_TimeTypeDef;

ErrorStatus
RTC_SetDate(uint32_t RTC_Format, RTC_DateTypeDef*
RTC_DateStruct)


typedef struct
{
  uint8_t RTC_WeekDay; /*!< 星期 @ref
RTC_WeekDay_Definitions */
 
  uint8_t RTC_Month;   /*!< 月 @ref RTC_Month_Date_Definitions*/

uint8_t
RTC_Date;     /*!< 日 */
 
  uint8_t RTC_Year;     /*!< 年 */
}RTC_DateTypeDef;

(7)往RTC备份寄存器中写入一个数据

RTC_WriteBackupRegister(RTC_BKP_DR0,
0x8888);


(8)获取时间和日期

void
RTC_GetTime(uint32_t RTC_Format, RTC_TimeTypeDef* RTC_TimeStruct)

void
RTC_GetDate(uint32_t RTC_Format, RTC_DateTypeDef* RTC_DateStruct)


如果使用闹钟功能,需要以下步骤:

(1)设置闹钟时间

void
RTC_SetAlarm(uint32_t RTC_Format, uint32_t RTC_Alarm, RTC_AlarmTypeDef*
RTC_AlarmStruct)

参数:

RTC_Format
- 时间格式(RTC_Format_BCD)

RTC_Alarm
- 哪个闹钟(RTC_Alarm_A)

RTC_AlarmStruct - 闹钟时间结构体


typedef struct
{
  RTC_TimeTypeDef RTC_AlarmTime;     /*!< 闹钟时间 */

uint32_t
RTC_AlarmMask;           
/*!< 闹钟时间中要屏蔽的成员 */

uint32_t
RTC_AlarmDateWeekDaySel;  /*!< 选择星期匹配/日期匹配 @ref RTC_AlarmDateWeekDay_Definitions */
 
  uint8_t RTC_AlarmDateWeekDay;     
/*!< 闹钟 星期/日期  @ref
RTC_WeekDay_Definitions */
}RTC_AlarmTypeDef;

(2)清除闹钟中断标识,使能闹钟中断

RTC_ClearITPendingBit(RTC_IT_ALRA);

RTC_ITConfig(RTC_IT_ALRA,
ENABLE);

(3)初始化外部中断(上升沿触发
外部中断线17)

EXTI_Init(.....);

(4)初始化NVIC(中断号-RTC_Alarm_IRQn)

NVIC_Init(...);

(5)使能闹钟

RTC_AlarmCmd(RTC_Alarm_A,
ENABLE);

二.IIC

1.概念

IIC(I2C)属于两线式串行总线,由飞利浦公司开发用于微控制器和外围设备进行通信一种总线(板间通信)

IIC由数据线(SDA)和时钟线(SCL)组成的串行总线,可用于发送和接收数据,属于半双工通信,IIC通信速度为 100Kbps(400Kbps)

2.IIC线路连接

IIC通信除了SCL和SDA以外,一般还有电源线(VCC)和地(GND)。IIC属于一主多从的总线结构(一个主设备(Master),多个从设备(slave))

通信由主设备发起,从设备被动响应,实现数据传输

3.IIC通信协议

(1)SCL和SDA接上拉电阻,默认高电平,表示总线是空闲状态

(2)从设备地址(7bit)

用来区分总线上不同的从设备,从设备地址有固定部分和可配置部分

(3)起始信号

SCL保持高电平,SDA由高向低跳变

(4)停止信号

SCL保持高电平,SDA由低向高跳变

(5)应答信号 ----- 收到有效数据向对方响应的信号

发送方每发送一个字节(8位),在第9个时钟周期释放数据线,接收对方的应答

有效应答为低电平(ACK),表示对方接收成功;无效应答为高电平(NACK),表示对方没有接收成功

(6)数据传输的实现

由SCL和SDA配合实现的,在SCL为高电平期间,保持SDA数据稳定(这段时间是对方读取数据时间)

在SCL为低电平期间,可以改变SDA的电平(这段时间是设置要发送的数据时间)

在IIC参考时钟的控制下,按照上述方法一位一位一次发送每一位数据

4.IIC协议通信过程

1)主设备发送起始信号

2)主设备发送从设备地址(高7bit)和读/写信号(低1bit)

1表示读,0表示写

3)等待从设备响应(ACK)

-------------------------读--------------------------

4)发送读数据 寄存器/内部
地址(由从设备)
5)等待ACK
6)主设备发送起始信号,主设备发送从设备地址和读信号
7)读取从设备发送过来的数据

-----------------------写---------------------------

4)发送写数据 寄存器/内部
地址(由从设备)
5)等待ACK
6)发送要写的数据

5.IIC通信的实现

1)使用GPIO模拟实现

如果芯片上没有IIC控制器,或者控制接口不够用,使用IO口模拟实现IIC通信协议

手动控制IO口,实现IIC的信号和数据传输

2)使用IIC控制器

IIC控制器将IIC协议中的固定部分实现,我们只需要将IIC协议中的可变部分(从设备地址 数据)提供给控制器

控制器自动按照IIC协议实现传输

6.at24c02

at24c02是一种eeprom,电擦除的存储芯片,存储的数据掉电不丢失,实际应用中用来存储版本信息,更新信息等等

1)原理图

2)AT24C02说明手册

从设备地址

1010000 = 0x50

写操作

读操作

原文地址:https://www.cnblogs.com/zjlbk/p/11552397.html

时间: 2024-10-13 04:13:35

2019年9月19日星期四(STM32)的相关文章

【蜕变之路】第1天 规划 (2019年2月19日)

声明: 本人是一名刚步入社会的职场小白,主要从事Java后端开发.开启[蜕变一路]系列主要是为了记录每日学习.思考以及总结的情况,目的是为了不断挑战自己,提升自己!此系列全程公开,欢迎见证! 内容: 1.每天学习一道编程题或者一个Java知识点(Java相关) 2.每周发表一篇技术文章(由浅入深) 3.每三天进行一次运动(跑步.打篮球.羽毛球等等) 4.每天睡前阅读三十分钟 5.每天学习英语三十分钟 时间: 2019年2月19日~2020年2月19日 期望: 1.提高Java编程能力 2.提高文

2019年8月15日星期四(系统编程)

2019年8月15日星期四 一. 线程互斥方式 - 互斥锁. 1. 什么是互斥锁?特点如何? 互斥锁是专门用于处理线程互斥的一个方式,它有两种状态:上锁状态/解锁状态. 特点:如果处理上锁状态,则不能再上锁,直到解锁为止才能再上锁.如果是处于解锁状态,则不能再解锁了,直到上锁了才能再解锁. 2. 关于线程互斥锁API函数接口? 0)定义互斥锁的变量(pthread_mutex_t-> 互斥锁的数据类型) pthread_mutex_t mutex; 1)初始化互斥锁  -> pthread_m

【Lazy资产管理系统v1.0】2019年10月19日发布测试版

Lazy资产管理系统,是一款简洁而高效的资产管理系统,包括[资产明细查询].[资产新增管理].[资产变动管理].[资产借用管理].[资产处置管理].[我的资产变动记录].[我的资产借用记录]等功能. 为了解决广大企业管理者资产管理的难题,作者将此项目免费发布出来,供大家使用与交流,欢迎大家加入Lazy资产管理系统QQ交流群:×××,作者愿意和一起做好做强这款简洁而高效的资产管理系统. Lazy资产管理系统,将于2019年10月19日发布测试版本,欢迎大家下载测试,以便我们提供更好的免费版本给大家

23.密码学知识-加密介绍-1——2019年12月19日

2019年12月19日14:51:00 1. 第1天 - 对称加密 1.1 基础知识点 知识点大纲介绍 密码的基础概念 对称加密 非对称加密 单向散列函数 哈希函数 消息认证码 数字签名 证书 ssl/tls - https 为什么要加密, 以及解决方案 保证数据安全 加密三要素 明文/密文 秘钥 定长的字符串 需要根据加密算法确定其长度 算法 加密算法 解密算法 加密算法和解密算法有可能是互逆的, 也有可能相同 常用的两种加密方式 对称加密 秘钥: 加密解密使用的是同一个秘钥, 秘钥有一个 特

抑郁症:2019年11月19日

重度抑郁症确诊第1天,坚持记录第1天 早上 在学校上课,和班主任请假下午去医院检查,没告诉班主任检查什么. 下午 Chicago_01 2019/11/09 14:01:32 14:01 到家了,准备去医院 Chicago_01 2019/11/09 14:01:38 Chicago_01 2019/11/09 14:20:36 14:20 到医院了 Chicago_01 2019/11/09 14:21:05 Chicago_01 2019/11/09 14:53:06 14:52 换一个医院

2019年5月19日-linux就该这么学-第9课

第7章 使用RAID与LVM磁盘阵列技术 7.1 RAID (独立冗余磁盘阵列)(1) RAID0:至少2块盘组成:数据依次写入到2块以上的硬盘中,能有效提升硬盘数据的吞吐速度,但不具备数据备份和错误修复能力.(2) RAID1:至少2块盘组成:同时将数据写到2块以上的硬盘设备上,提升数据的安全性,但增加了系统的计算功能负载.(3) RAID5:至少3块盘:通过厅偶校验兼顾了硬盘设备的读写速度.数据的安全与存储成本问题.(4) RAID10:=RAID0+RAID1:至少4块盘:能确保数据的安全

2019年7月11日星期四

一.复杂指针定义 1.简单指针   -> 指向基本数据类型  char int long.. 复杂指针   -> 指向非基本数据类型  指针/数组/函数/结构体 2.二级指针? 指向指针的指针. int a; int *pa = &a;   pa就是一级指针 int **p = &pa;  p就是二级指针 3.数组指针? 指向整个数组的基地址指针就是“数组指针” 1)如何定义数组指针? 方法与定义简单指针一致. int a; int *p = NULL; p = &a;

2019年7月18日星期四(交叉工具链)

一.交叉工具链? 1.什么是交叉工具链? 我们已经学习过的编译器是gcc编译器,gcc可以将高级语言转换目标程序. gcc编译器特点:在Ubuntu编译,在Ubuntu运行.  -> 在同一个平台上编译运行,这个gcc编译器又称之为本地编译. 这个gcc编译器是Ubuntu中自带,gcc所的路径:/usr/bin/gcc. 其实交叉工具链就是一个编译器,但是交叉工具链在Ubuntu中是没有的,所以想使用交叉工具链,就必须要自己移植. 交叉工具链面向平台不是Ubuntu,而是ARM平台.交叉工具链

2019年7月18日星期四(linux基础)

一.linux文件种类 1.如何查看linux下文件类型?如何决定文件类型? 使用"ls -l"查看文件的详细属性,其中第一个字母就是文件类型,是由创建方式来决定文件的类型.例如:使用mkdir命令来创建,就一定是目录文件. 2. 在linux下,一共有多少种文件类型 有7种.分别是: 文件类型        创建方式       字母 ====================================== 普通文件   ->    touch          - 目录文