混沌鸿蒙网站建设公司网站建设维护及使用管理办法

news/2025/10/6 1:51:56/文章来源:
混沌鸿蒙网站建设,公司网站建设维护及使用管理办法,wordpress4.7.2卡,电子产品外包加工项目上一章学习了STM32MP1内置RTC外设#xff0c;了解了Linux系统下RTC驱动框架。一般的应用场合使用SOC内置的RTC就可以了#xff0c;而且成本也低#xff0c;但是在一些对于时间精度要求比较高的场合#xff0c;SOC内置的RTC就不适用了。这个时候需要根据自己的应用要求选择合…上一章学习了STM32MP1内置RTC外设了解了Linux系统下RTC驱动框架。一般的应用场合使用SOC内置的RTC就可以了而且成本也低但是在一些对于时间精度要求比较高的场合SOC内置的RTC就不适用了。这个时候需要根据自己的应用要求选择合适的外置RTC芯片正点原子STM32MP1开发板上板载了一个RTC芯片PCF8563这是一个IIC接口的外置RTC芯片本章就来学习一 下如何驱动外置RTC芯片。 PCF8563简介 PCF8563简介 PCF8563是一个CMOS RTC芯片支持时间和日历功能支持可编程的时钟输出、中断输出以及低电压检测。PCF8563提供了两线IIC接口来传输时间信息最大传输速度为400Kbit/S在读写寄存器的时候地址自增PCF8563相关特性如下 提供年、月、日、星期时、分、秒计时使用外置32.768Khz晶振。低后备电流0.25uAVDD3.0V温度25℃。IIC接口速度最高400KHz。可编程时钟输出可以供其他设备使用可输出的时钟频率有32.768kHz、1.024kHz、32Hz和1Hz。支持闹钟和定时功能。IIC读地址为0XA3写地址为0XA2也就是IIC器件地址为0X51。有一个开漏输出的中断引脚。 PCF8563框图如下图所示 简单分析一下上图中的框图 这是PCF8563的32.768kHz晶振引脚PCF8563必选要外接32.768kHz晶振。这是PCF8563的IIC引脚PCF8563通过IIC接口与主控进行通信因此PCF8563本质是个IIC器件。时钟输出引脚。中断引脚。前面说了PCF8563是个IIC器件因此内部就有很多寄存器来实现RTC功能比如配置芯片读取时间信息等。这部分就PCF8563的内部寄存器。 PCF8563寄存器详解 PCF8563有16个内部寄存器这些寄存器都是8位的。前两个寄存器(0x00和0x01)为控 制/状态寄存器。0X02-0X08为时间和日期寄存器这些寄存器保存着秒、分、时、日、星期、月和年信息。0X09-0X0C为闹钟寄存器保存闹钟信息。0X0D为时钟输出频率寄存器0X0E和0X0F这两个寄存器时钟控制寄存器。注意、时分秒、年月日、闹钟等时间信息为BCD格式。 接下来看一下这些寄存器如何使用 控制状态寄存器1(0X00) 寄存器结构如下图所示 上图是控制状态寄存器 1相应的位含义如下 TEST1(bit7)0正常模式1测试模式。N(bit6,bit4,bit2-0)未使用。STOP(bit5)0RTC时钟运行1RTC时钟停止。TESTC(bit3)0正常模式关闭POR覆写1使能POR覆写。 控制状态寄存器2(0X01) 寄存器结构如下图所示 上图是控制状态寄存器2相应的位含义如下 N(bit7-5)未使用。TI_TP(bit4)为0的时候INT引脚取决于TF位为1的时候INT引脚输出指定频率的脉冲。AF(bit3)闹钟标志位为1的话表示闹钟发生写0清除写1无效。TF(bit2)定时器标志位为1的话表示定时发生写0清除写1无效。AIE(bit1)闹钟中断使能位0关闭闹钟中断1使能闹钟中断。TIE(bit0)定时器中断使能位0关闭定时器中断1使能定时器中断。 时间和日期寄存器(0X02-0X08) 接下来看一下时间和日期相关寄存器一共7个寄存器结构如下图所示 依次来看一下上图中的这些寄存器 0X02此寄存器为秒钟寄存器PCF8563是有低电压检测的当VDD电压低于最小允许电压的时候VL(bit)位就会置1表示时钟异常如果电压正常的话就为0。SECONDS(bit6-0)这7位表示具体的秒数范围0~59为BCD格式。0X03此寄存器为分钟寄存器MINUTES(bit6-0)这7位有效表示具体的分钟数范围0-59为BCD格式。0X04此寄存器为小时寄存器HOURS(bit5-0)这6位有效表示具体的小时数范围0-23为BCD格式。0X05此寄存器为日期寄存器DAYS(bit5-0)这6位有效表示具体的小时数范围1-31为BCD格式。0X06此寄存器为星期寄存器WEEKDAYS(bit2-0)这3位有效表示具体的星期范围0-6为BCD格式。0为星期日 1为星期一以此类推6就是星期六。0X07此寄存器为月份寄存器其中C(bit7)为世纪标志位如果为1的话表示20xx年为 0的话表示19xx年。MONTHS(bit4-0)这5位有效表示具体的月份范围1-12分别为1-12月为BCD格式。0X08此寄存器为年寄存器YEARS(bit7-0)这8位有效表示具体的年份范围0-99。 闹钟寄存器(0X09-0X0C) 接下来看一下闹钟相关寄存器一共4个寄存器结构如下图所示 依次来看一下上图中的这些寄存器 0X09此寄存器为闹钟分钟寄存器AE_M(bit7)为分钟闹钟使能位为0的话使能分钟闹钟为1的话关闭。MINUTE_ALARM(bit6-0)这7位表示具体的闹钟分钟范围0-59为BCD格式。0X0A此寄存器为闹钟小时寄存器含义和0X09寄存器类似。0X0B此寄存器为闹钟日期寄存器含义和0X09寄存器类似。0X0C此寄存器为闹钟星期寄存器含义和0X09寄存器类似。 另外还有时钟输出寄存(0X0D)以及定时器寄存器(0X0E和0X0F)这里不用PFC8563的时钟输出和定时器功能就不讲解了。 总体来说PCF8563还是很简单的这是一个IIC接口的RTC芯片因此在Linux系统下 就涉及到两类驱动 IIC驱动需要IIC驱动框架来读写PCF8563芯片。RTC驱动因为这是一个RTC芯片因此要用到RTC驱动框架。 如果要用到中断功能的话还需要用到Linux系统中的中断子系统这些前面都有相应的实验讲解。所以PCF8563的Linux驱动并不复杂而且重点是Linux系统默认就已经集了PCF8563驱动使用起来非常简单直接修改设备树添加PCF8563节点信息然后使能内核的PCF8563驱动即可。 硬件原理图分析 PCF8563原理图如下图所示 从上图可以看出PCF8563连接到了STM32MP157的I2C4接口上引脚为PZ5、 PZ4。另外 PCF8563的INT引脚连接到了STM32MP157的PI3引脚上。 实验驱动编写 修改设备树 添加/查找PCF8563使用IO的pinmux配置 PCF8563的IIC接口连接到了STM32MP157的I2C4上对应的引脚为PZ4和PZ5。另外还有一个中断引脚PI3首先需要在设备树中添加这3个引脚对应的配置信息。 首先添加PZ4和PZ5打开stm32mp15-pincrtl.dtsi文件查找一下有没有I2C4的引脚配置信息默认是有的内容如下 示例代码44.3.1.1 i2c4引脚节点 1 i2c4_pins_a: i2c4-0 { 2 pins { 3 pinmux STM32_PINMUX(Z, 4, AF6), /* I2C4_SCL */ 4 STM32_PINMUX(Z, 5, AF6); /* I2C4_SDA */ 5 bias-disable; 6 drive-open-drain; 7 slew-rate 0; 8 }; 9 }; 10 11 i2c4_pins_sleep_a: i2c4-1 { 12 pins { 13 pinmux STM32_PINMUX(Z, 4, ANALOG), /* I2C4_SCL */ 14 STM32_PINMUX(Z, 5, ANALOG); /* I2C4_SDA */ 15 }; 16 };从第3、4行可以看出I2C4默认引脚就是PZ4和PZ5和本实验一样所以I2C4的引脚不需要修改直接使用i2c4_pins_a即可。接下来还需要定义中断引脚PI3的引脚信息前面讲过了如果一个引脚作为GPIO功能的话可以不用添加此引脚pinctrl信息。 在I2C4节点下添加pinmux并追加pcf8563子节点 前面说了Linux内核内部已经集成了PCF8563驱动所以肯定有文档描述如何使用这个驱动。打开Documentation/devicetree/bindings/rtc/pcf8563.txt此文档描述了如何使用Linux内核自带的pcf8563驱动也给出了参考设备节点参考此文档即可。 在stm32mp157d-atk.dts文件追加I2C4节点追加如下所示内容 示例代码 44. 3.1.3 追加 pcf 8563 节点 1 i2c4 { 2 pinctrl-names default, sleep; 3 pinctrl-0 i2c4_pins_a; 4 pinctrl-1 i2c4_pins_sleep_a; 5 status okay; 6 7 pcf856351{ 8 compatible nxp,pcf8563; 9 irq_gpio gpioi 3 IRQ_TYPE_EDGE_FALLING; 10 reg 0x51; 11 }; 12 };第2-4行设置IO要使用的pinmux配置。 第7-10行pcf8563设备子节点第8行设置compatible为“nxp,pcf8563”这个是必须的否则无法匹配Linux内核自带的pcf8563驱动。从第9行设置pcf8563中断引脚为PI3下降沿触发。pcf8563的I2C地址为0X51因此reg为0X51。 PCF8563驱动使能 上一个实验使能了STM32MP157内部RTC为了防止干扰所以要先关闭内部RTC配置路径为 - Device Drivers - Real Time Clock - STM32 RTC //取消选中 如下图所示 使能Linux内核自带的PCF8563驱动 接下来需要使能Linux内核自带的PCF8563驱动配置路径如下 - Device Drivers - Real Time Clock - * Philips PCF8563/Epson RTC8564 //选中 PCF8563 如下图所示 配置完成后重新编译内核和设备树得到新的uImage以及stm32mp157d-atk.dtb。 运行测试 使用上面编译得到的内核和设备树启动开发板。当系统第一次启动没有设置PCF8563时间的时候启动过程会提示如下图所示信息 从上图可以看出系统已经识别出了PCF8563说明驱动没问题。但是这里提示检测到低电压日期和时间无效。这是因为没有设置时间等系统启动成功然后参考上一篇笔记内部RTC的设置方法设置RTC时间比如这里设置时间为2021年5月21号下午15:52:00输入如下命令 date -s 2021-05-21 15:52:00 //设置时间 hwclock -w //保存 时间设置好以后重启系统此时系统log信息如下图所示 从上图可以看出此时PCF8563再没有提示电压低的错误而且正确的读出了时间信 息整个开发板掉电以后PCF8563也会继续计时因为有一个纽扣电池供电。 PCF8563驱动分析 上一小节已经测试了PCF8563本小节来简单看一下PCF8563驱动源码根据示例代码44.3.1.3中的第8行的compatible属性值可以找到对应到驱动文件在Linux源码中搜索字符串“nxp,pcf8563”即可找到对应的驱动文件驱动文件为drivers/rtc/rtc-pcf8563.c。 PCF8563是个I2C器件因此基础驱动框架是I2C在rtc-pcf8563.c文件中找到如下所示内容 上述示例代码就是个标准的I2C驱动框架第9-14行的pcf8563_of_match结构体数组就是设备树匹配数组第10行的compatible属性为“nxp,pcf8563”和设备树相匹配。匹配以后第23行的pcf8563_probe函数就会执行。 接下来看一下pcf8563_probe函数函数源码如下(有缩略) 示例代码44.5.2 pcf8563_probe 函数 1 static int pcf8563_probe(struct i2c_client *client, 2 const struct i2c_device_id *id) 3 { 4 struct pcf8563 *pcf8563; 5 int err; 6 unsigned char buf; ...... 13 pcf8563 devm_kzalloc(client-dev, sizeof(struct pcf8563), 14 GFP_KERNEL); 15 if (!pcf8563) 16 return -ENOMEM; 17 18 i2c_set_clientdata(client, pcf8563); 19 pcf8563-client client; 20 device_set_wakeup_capable(client-dev, 1); 21 22 /* Set timer to lowest frequency to save power */ 23 buf PCF8563_TMRC_1_60; 24 err pcf8563_write_block_data(client, PCF8563_REG_TMRC, 1, buf); 25 if (err 0) { 26 dev_err(client-dev, %s: write error\n, __func__); 27 return err; 28 } 29 30 /* Clear flags and disable interrupts */ 31 buf 0; 32 err pcf8563_write_block_data(client, PCF8563_REG_ST2, 1, buf); 33 if (err 0) { 34 dev_err(client-dev, %s: write error\n, __func__); 35 return err; 36 } 37 38 pcf8563-rtc devm_rtc_allocate_device(client-dev); 39 if (IS_ERR(pcf8563-rtc)) 40 return PTR_ERR(pcf8563-rtc); 41 42 pcf8563-rtc-ops pcf8563_rtc_ops; 43 /* the pcf8563 alarm only supports a minute accuracy */ 44 pcf8563-rtc-uie_unsupported 1; 45 pcf8563-rtc-range_min RTC_TIMESTAMP_BEGIN_2000; 46 pcf8563-rtc-range_max RTC_TIMESTAMP_END_2099; 47 pcf8563-rtc-set_start_time true; 48 49 if (client-irq 0) { 50 err devm_request_threaded_irq(client-dev, client-irq, 51 NULL, pcf8563_irq, 52 IRQF_SHARED | IRQF_ONESHOT | IRQF_TRIGGER_LOW, 53 pcf8563_driver.driver.name, client); 54 if (err) { 55 dev_err(client-dev, unable to request IRQ %d\n, 56 client-irq); 57 return err; 58 } 59 } 60 61 err rtc_register_device(pcf8563-rtc); 62 if (err) 63 return err; ...... 70 return 0; 71 }第13行申请内存内存rtc-pcf8563.c定义了一个pcf8563结构体来描述PCF8563芯片所以这里就是申请一个pcf8563实例。 第23-36行初始化PCF8563。 第38行pcf8563结构体里面有个rtc成员变量此成员变量是个rtc_device结构体指针。 这个就是上一章讲解的RTC驱动框架最核心的rtc_device。这里需要对这个rtc指针分配内存。 第42行设置rtc_device的ops成员变量为pcf8563_rtc_opspcf8563_rtc_ops包含了PCF8563的具体操作包括设置时间、读取时间、设置闹钟等。 第44-47行继续初始化rtc的其他成员变量。 第49-59行中断初始化PCF8563有个中断引脚INT因此可以使用中断功能。这里使用devm_request_threaded_irq函数完成中断申请已经初始化中断函数为pcf8563_irq。 第61行调用rtc_register_device函数向系统注册rtc_device也就是pcf8563。 总结 一下pcf8563_probe函数的核心就是初始化PCF8563然后使用上一章讲的RTC驱动框架来设置PCF8563然后向内核注册。 接下来看一下PCF8563的核心pcf8563_rtc_ops内容如下 pcf8563_rtc_ops提供了PCF8563的时间以及闹钟读写操作函数应用程序对PCF8563的所有操作最终都是通过这些函数来完成的。以读时间为例当应用程序读取PCF8563当前时间的时候.read_time就会执行在这里就是pcf8563_rtc_read_time函数源码如下(有省略) 第8行使用pcf8563_read_block_data函数从PCF8563_REG_ST1寄存器(地址为0X00)开始连续读取9个寄存器的数据。这样就可以得到PCF8563的控制与状态寄存器1和2以及事件与日期寄存器的值。 第12行判断PCF8563的0X02寄存器VL位是否为1也就是检查PCF8563是否处于低电压模式事件和日期是否有效。 第28-34行依次获取PCF8563中的时间和日期值这里使用bcd2bin函数将原始的BCD值转换为时间值。将获取到的时间和日期打包到参数tm中tm是个rtc_time结构体指针变量。 第36行判断0X07寄存器的C位(bit7)的值此位为1的话表示20xx年为0的话就是19xx年。 可以看出pcf8563_rtc_read_time函数很简单就是读取PCF8563内部的时间和日期值然后将其打包进rtc_time里面。其他的函数大同小异可以自行分析一下。 至此PCF8563驱动就简单分析完成了其他IIC接口的RTC芯片驱动基本都是类似的可以在实际项目开发中选择合适的RTC芯片。 总结 这里的驱动PCF8563还是比较简单的因为Linux内核是已经写好了相关驱动的只要自己在Linux内核配置开启然后在设备树中添加相应的对应的i2c节点以及GPIO对应的子节点就可以使用了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/928912.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

day1 Gitlab Runner 学习

Gitlab Runner 学习 runner下载|安装|启动 下载 # 为您的系统下载二进制文件 sudo curl -L --output /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runne…

网站云优化有哪些做网站好的公司

文章目录 一、前言二、准备阶段三、环境配置3.1 Type-V管理器环境配置3.2 新增.wslconfig 文件 四、遇到的问题以及解决方案 一、前言 ​ 使用 wsl 的过程中,会出现 WSL 的IP地址 找不到,或者无法和计算机通讯,搞 嵌入式 的话,还…

珠海模板建站平台网站建设用途

一 什么是nodeJs nodeJs是一个后端技术,研究web应用的开发模式,能够开发一些简单的服务器,学会操作数据库等等。官方解释就是:nodeJs是基于谷歌v8引擎的javascript运行环境 nodeJs使用了一个事件驱动,非非阻塞式I/O模型…

网站建设合作伙伴网页搜索器

要搭建自己的 PyPI 服务器,您可以使用 warehouse 项目,它是 PyPI 的开源实现。下面是一些基本步骤: 准备环境: 安装 Python安装 PostgreSQL 数据库 克隆 warehouse 项目: git clone https://github.com/pypa/wareh…

Software Foundations Vol.I : 使用结构化的数据(Lists)

Software Foundations Vol.I : 使用结构化的数据(Lists)数值序对 在 Inductive 类型定义中,每个构造子(Constructor)可以有任意多个参数 —— 可以没有(如 true 和 O),可以只有一个(如 S),也可以更多 (如 ny…

阿里云1M做网站闸北区网站建设网

狂神说SpringBoot系列连载课程,通俗易懂,基于SpringBoot2.2.5版本,欢迎各位狂粉转发关注学习。未经作者授权,禁止转载分布式理论什么是分布式系统?在《分布式系统原理与范型》一书中有如下定义:“分布式系统…

Software Foundations Vol.I : 归纳证明(Induction)

Software Foundations Vol.I : 归纳证明(Induction)归纳法证明 我们在上一章中通过基于化简的简单论据证明了 0 是 + 的左幺元。 我们也观察到,当我们打算证明 0 也是 + 的 右 幺元时事情就没这么简单了 Theorem plus…

外贸网站建设和seo海淀网站建设多少钱

本质上, 这两种方式都是加载CSS文件, 但还是存在着细微的差别 import 机制不同于link,link是加载页面前css加载完毕,import 是先读取文件再加载import是css2.0里的 ie5以上不支持用js控制dom时改变样式,只能用link,import不是dom…

广州网站建设app开发哈尔滨网页模板建站

首先思考一个问题:如果 Dubbo 应用使用 ZooKeeper 作为注册中心,现在需要切换到新的 ZooKeeper 实例,如何做到流量无损? 本文提供解决这个问题的一种方案。 场景 有两个基于 Dubbo 的微服务应用,一个是服务提供者&…

Software Foundations Vol.I : Coq函数式编程(Basics)

好久没写随笔了,随便投投.这里的内容主要取至《软件基础》第一卷https://coq-zh.github.io/. 我补充了一部分习题的答案,在https://github.com/mesonoxian-yao/softwareFoudations-volume1-coqLearn可以看看. Software…

Python 在自然语言处理中的应用与发展

一、引言 🗣️ 自然语言处理(NLP)是人工智能的重要分支,旨在让计算机理解、生成和处理人类语言。它广泛应用于 搜索引擎、机器翻译、智能客服、情感分析、舆情监测 等场景。Python 作为 AI 研究和工程实现的主流语…

专业的深圳网站建设公司排名深圳网站制作公司在那

文章目录 解决TensorRT加速推理SDXL出现黑图问题1. fp162. 更换vae 解决TensorRT加速推理SDXL出现黑图问题 一般产生黑图,仅需要修改下面两个问题即可解决。 1. fp16 将pipeline中的fp16修改为fp32。 在使用稳定扩散(Stable Diffusion)生…

影响网站可用性的因素青州网站设计

文章目录 协议局域网通信IP 地址网络通信的本质tcp 和 udp 协议网络字节序网络主机数据转化接口 协议 协议:收到数据后,多出来的那一部分,也叫一种 “约定”,一整套的自硬件到软件,都有协议,需要有人定制&a…

Python 在网络爬虫与数据采集中的应用

一、引言 🌐 在大数据时代,数据已成为企业与科研的核心资产。然而,很多数据并不以结构化形式直接提供,需要通过网络爬虫和采集技术来获取。Python,凭借其简洁的语法、强大的第三方库和活跃的社区支持,已经成为网…

开通网站主机站长统计网站统计

栅格数据是一种从远处表示地球表面和大气的地理空间数据,通常使用卫星或航空传感器。它是一种基于网格的数据结构,其中网格中的每个单元或像素代表地球表面的特定位置。这些像素可以存储各种类型的信息,例如海拔、温度、土地覆盖、降水量或与该位置相关的任何其他连续或分类…

做网站和seo哪个好网站制作的收费标准

虚拟机Linux系统网络配置: 1、Vmware网络设置 虚拟机设置->网路适配器->网络连接 桥接模式:能提供独立的IP地址的情况下使用NAT模式:一台计算机只能使用一个IP,主机与虚拟机共享IP,外部网络无法发现虚拟机&#…

wordpress 企业整站源码岳阳网站建设网站

点击访问体验 之前有体验过github的代码助手,奈何收费了,上周发现有一个免费的代码助手。 下载安装 vscode 搜索扩展 TONGYI Lingma 安装完成后登陆即可体验 写注释让他写代码 根据上下文自动补充 这里我只写了一个方法名,getAgencyList…

15_spring_data_neo4j简单教程

Spring Data Neo4j 简单教程 简介 Spring Data Neo4j 是 Spring Data 项目的一部分,它提供了对 Neo4j 图数据库的集成支持。通过 Spring Data Neo4j,开发者可以轻松地在 Spring Boot 应用中使用 Neo4j 数据库,利用图…

珠海网站制作哪家便宜久久建筑网 百度网盘

认证与权限频率组件 身份验证是将传入请求与一组标识凭据(例如请求来自的用户或其签名的令牌)相关联的机制。然后 权限 和 限制 组件决定是否拒绝这个请求。 简单来说就是: 认证确定了你是谁权限确定你能不能访问某个接口限制确定你访问某…

成都网站建设制作设计内蒙古最新消息今天

Python是一种高级编程语言,广泛用于数据科学、人工智能、网络编程等领域。 Python提供了许多内置函数和标准库,可以完成各种任务: 1、print()函数:将文本输出到控制台。可以将字符串、数字和变量等输出到控制台。 2、input()函…