STM32G4 比较器COMPx(寄存器开发)

news2024/11/29 11:49:25

目录

  • 1. 特性
    • 1.1 框图
    • 1.2 比较器输入信号SEL
    • 1.3 比较器滞回选择HYST
    • 1.4 比较器的输出
    • 1.5 LOCK机制
  • 2. 编程
    • 2.1 初始化步骤
    • 2.2 举例

STM内部的比较器是模拟量的比较器,其与APB2时钟同步,在RCC时钟控制器中没有COMx时钟使能标志位,其时钟的使能与复位与SYSCLK同步。

1. 特性

1.1 框图

模块框图

1.2 比较器输入信号SEL

比较器的输入端有正负极信号,正极INP通过INPSEL选择输入信号,负极通过INMSEL选择输入信号,其SEL引脚定义如下图表所示。

SEL定义

1.3 比较器滞回选择HYST

滞回英文 Hysteresis ,可以理解为施密特触发器,通过在CSR寄存器中配置HYST来选择滞回电压。

滞回电压配置

1.4 比较器的输出

根据框图可以看到,比较器的输出信号为VALUE。VALUE直接连接到 HRTIM(高分辨率定时器)外设;VALUE还通过POLARITY(CSR寄存器的POL配置)的极性选择(是否取反)连接到 COMPx_OUT(GPIO)EXTI总线TIMx定时器

1.5 LOCK机制

一旦将CSR寄存器的LOCK标志位置位,就不能清除LOCK标志位了,只有重新复位MCU才可清除。并且LOCK置位后,CSR寄存器变为只读,不能重新配置。

2. 编程

2.1 初始化步骤

  1. 使能SYSCLK时钟
  2. 初始化GPIO,将要使用到的comp引脚定义为模拟量模式(MODER=3)
  3. 配置CSR寄存器;使能比较器;锁定寄存器
  4. 配置中断

2.2 举例

下面以COMP1进行举例,分别使用PB1和PA4作为比较器输入的正负极,上下沿都产生中断。
测试代码如下。(已经提前打开GPIO、SYSCLK时钟)


#define MODER_IN												(0x00UL)	//输入
#define MODER_OUT												(0x01UL)	//输出
#define MODER_FUNC												(0x02UL)	//功能
#define MODER_ANA												(0x03UL)	//模拟
#define MODER_BIT												(0x03UL)	//

#define PUPDR_NO												(0x00UL)	//无上下拉
#define PUPDR_PU												(0x01UL)	//上拉
#define PUPDR_PD												(0x02UL)	//下拉
#define PUPDR_BIT												(0x03UL)	//


#define COMP_COMPx												COMP1
#define COMP_INP_GPIO											GPIOB
#define COMP_INP_PORT											1
#define COMP_INP_SEL											1 //<根据本文1.2的查表,PB1选择1
#define COMP_INM_GPIO											GPIOA
#define COMP_INM_PORT											4
#define COMP_INM_SEL											6 //<根据本文1.2的查表,PA4选择6

void COMP1_Init(void)
{
//步骤2:初始化GPIO,IO模式为模拟量
	COMP_INP_GPIO->MODER	&= ~(MODER_BIT	<< (COMP_INP_PORT << 1));
	COMP_INP_GPIO->MODER	|=  (MODER_ANA	<< (COMP_INP_PORT << 1));
	COMP_INP_GPIO->PUPDR	&= ~(PUPDR_BIT	<< (COMP_INP_PORT << 1));
	COMP_INP_GPIO->PUPDR	|=  (PUPDR_NO	<< (COMP_INP_PORT << 1));
	COMP_INM_GPIO->MODER	&= ~(MODER_BIT	<< (COMP_INM_PORT << 1));
	COMP_INM_GPIO->MODER	|=  (MODER_ANA	<< (COMP_INM_PORT << 1));
	COMP_INM_GPIO->PUPDR	&= ~(PUPDR_BIT	<< (COMP_INM_PORT << 1));
	COMP_INM_GPIO->PUPDR	|=  (PUPDR_NO	<< (COMP_INM_PORT << 1));

//步骤3:配置CSR寄存器;使能比较器;锁定寄存器
	COMP1->CSR = 0
				|COMP_CSR_LOCK						// 【1:寄存器只读】
				// COMP_CSR_VALUE					// 【只读,不经过机型选择器的value】
				// |COMP_CSR_SCALEN					// 【1:VREFINT分段使能(VREFINT/1/2/3有效)】
				// |COMP_CSR_BRGEN						// 【1:电阻桥使能】
				|(0 << COMP_CSR_BLANKING_Pos)		// 消隐信号选择   <暂时不用
				|(3 << COMP_CSR_HYST_Pos)			// 滞回电压选择
															// 0: No hysteresis 
															// 1: 10mV hysteresis 
															// 2: 20mv hysteresis 
															// 3: 30mV hysteresis <当前选择
															// 4: 40mV hysteresis
															// 5: 50mV hysteresis
															// 6: 60mV hysteresis
															// 7: 70mV hysteresis
				// |COMP_CSR_POLARITY					// 【1:极性反转】
				|(COMP_INP_SEL << COMP_CSR_INPSEL_Pos)			// 正极输入选择 <根据本文1.2的查表,PB1选择1
				|(COMP_INM_SEL << COMP_CSR_INMSEL_Pos)			// 负极输入选择 <根据本文1.2的查表,PA4选择6
				|COMP_CSR_EN						// 比较器使能
				;
//步骤4:配置中断

	EXTI->IMR1 |= BIT21;//COMP1 Output 中断屏蔽失效
	EXTI->RTSR1 |= BIT21;//COMP1 Output 上升沿触发
	EXTI->FTSR1 |= BIT21;//COMP1 Output 下降沿触发
}

上述配置中断部分的 BIT21,是通过手册查表 Table 98: EXTI lines connections 来的(手册Page449)。

在这里插入图片描述

根据上图可以看到,line21就是COMP1output总线。

EXTI的 RTSR1 、FTSR1 寄存器分别是上升沿使能、下降沿使能寄存器。

配置完毕初始化后,就可以在中断函数中等待比较中断了。中断内部举例代码如下。

void COMP1_2_3_IRQHandler(void)
{
	EXTI->PR1 |= BIT21;//清除中断挂起标志位
	if(COMP1->CSR & COMP_CSR_VALUE)
		GPIOC->BSRR |= BIT13;//LED点亮(测试使用)
	else
		GPIOC->BSRR |= (BIT13 << 16);//LED关闭(测试使用)
}

当正极大于负极(算上滞回电压),VALUE为0,即比较器输出0;(我测试是这个结果)
当正极小于负极(算上滞回电压),VALUE为1,即比较器输出1。
VALUE值可以在 COMPx->CSR寄存器中读取。

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

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

相关文章

前端自学要多久?自学前端一般多久可以找到差不多的工作?

好程序员今天给各位同学分享自学前端的高效率路径&#xff0c;最快4个月&#xff0c;平均6个月&#xff01; 一、html, CSS (1月) 1.基本语法, 2.做2-3个项目实战 3.刷面试题 二、JavaScript (1.5月) 1.基本语法 2.实际案例练习融合HTML, Css项目实战 3.刷题面试题 三、Vue/Rea…

Java 高级应用-多线程-(三)实现 Callable 接口与使用线程池创建线程

实现 Callable 接口 • 与使用 Runnable 相比&#xff0c; Callable 功能更强大些 – 相比 run()方法&#xff0c;可以有返回值 – 方法可以抛出异常 – 支持泛型的返回值&#xff08;需要借助 FutureTask 类&#xff0c;获取返回结果&#xff09; • Future 接口&#xff08;…

游戏研发项目管理

基于阶段模式进行游戏新产品研发过程&#xff0c;以及基于这种研发过程Leangoo 领歌提供的项目模板。 二、游戏产品开发流程 通常开发一款新游戏大体上会按照如下流程来进行&#xff1a; 1&#xff09; 概念阶段 – Concept 主策根据产品创意&#xff0c;确定游戏策划草案&a…

C++中的内存空间管理详解【C++】

文章目录 C/C内存分布C语言中动态内存管理方式&#xff1a;malloc/calloc/realloc/freeC内存管理方式new/delete操作内置类型new和delete操作自定义类型 operator new与operator delete函数重载operator new与operator deletenew和delete的实现原理内置类型自定义类型 定位new表…

使用tomcat可能遇到的问题

问题一&#xff1a;窗口一闪而过 如果双击startup.bat&#xff0c;启动tomcat&#xff0c;命令窗口一闪而过&#xff1b;或者用命令窗口执行startup.bat命令&#xff0c;未能启动tomcat&#xff0c;而是提示下面的文字&#xff1b; 说明可能是java的环境变量配置错误&#xf…

让ChatGPT谈谈科技发展

ChatGPT谈科技发展 讲讲科技发展的那些事儿谈谈ChatGPT对科技发展的影响谈谈你对ChatGPT的看法ChatGPT对科技发展的负面影响ChatGPT的存在是利是弊&#xff1f;关于全国科技者工作日 讲讲科技发展的那些事儿 谈谈ChatGPT对科技发展的影响 谈谈你对ChatGPT的看法 ChatGPT对科技发…

pdf怎么合并成一个文件?高效工具分享

PDF是一种非常常用的文档格式&#xff0c;许多人经常需要合并多个PDF文件为一个文件。这是因为有时候我们需要将多个PDF文件打包成一个文件&#xff0c;以便于共享或归档。在本文中&#xff0c;我们将介绍如何使用电脑或手机合并PDF文件。 以下是常见的合并PDF的软件&#xff1…

以太坊Layer 2即将爆发!加密巨头入场布局,或将迎来“百链大战”!

眼下&#xff0c;以太坊Layer 2发展势头强劲。在数十条Rollup Layer 2异彩纷呈之际&#xff0c;Coinbase、ConsenSys等加密巨头也开始下场参与竞争&#xff0c;部署原生Layer 2网络。 截至2022年底&#xff0c;Layer 2解决方案的日均交易数在持续增加&#xff0c;甚至超过了以太…

牛客网语法篇刷题(C语言) — 基本类型

&#x1f929;本文作者&#xff1a;大家好&#xff0c;我是paperjie&#xff0c;感谢你阅读本文&#xff0c;欢迎一建三连哦。 &#x1f970;内容专栏&#xff1a;这里是《C语言—语法篇》专栏&#xff0c;笔者用重金(时间和精力)打造&#xff0c;基础知识一网打尽&#xff0c;…

如何制作插件使用案例?

UE5 插件开发指南 前言0 示例角色蓝图1测试关卡2 扩展物品数据3 小结前言 作为一款插件,我们一定想要开发者拿到之后立即知道如何使用,所以我们需要制作插件使用案例,最好搭配相应的文档教会插件的使用者如何使用插件,如何对插件的功能进行扩展。为了达到这样的目标,我们…

TOPSIS(优劣解距离法)【附Python实现代码及可视化代码】

目录 一、指标正向化 1.极小型指标->极大型指标 2.中间型指标->极大型指标 3.区间型指标->极大型指标 二、标准化处理 三、计算得分并归一化(不带权重) 四、计算得分并归一化(带权重) 熵权法 1&#xff09;判断输入的矩阵是否存在负数 2&#xff09;计算第j…

通过 Wacom 的 Project Mercury 提高远程办公效率

过去几年中&#xff0c;我们的工作方式发生了翻天覆地的变化。疫情加快了对远程办公和协作的采纳&#xff0c;导致人们更加依赖技术来联系团队和提高工作效率。 但是&#xff0c;那些依靠专门硬件和软件来完成工作的创作者呢&#xff1f;艺术家、设计师和开发人员需要使用专门…

34 KVM管理设备-管理虚拟磁盘

文章目录 34 KVM管理设备-管理虚拟磁盘34.1 概述34.2 操作步骤 34 KVM管理设备-管理虚拟磁盘 34.1 概述 虚拟磁盘类型主要包含virtio-blk、virtio-scsi、vhost-scsi等。virtio-blk模拟的是一种block设备&#xff0c;virtio-scsi和vhost-scsi模拟的是一种scsi设备。 virtio-b…

window部署redis集群

1.下载Redis-x64-3.2.100.zip 下载网址&#xff1a;https://github.com/microsoftarchive/redis 百度网盘下载&#xff1a;百度网盘 请输入提取码 提取码&#xff1a;j2js redis版本一定要大于3.0&#xff0c;原因&#xff1a;windows暂不支持redis-cli创建集群&#xff0c;…

TPP0100泰克无源电压探头

tektronix泰克TPP0100 和 TPP0101无源电压探头是输入电阻为 10 M? 的 100 MHz、10X 无源电压探头。这些探头是和 1 MΩ/13 pF (TPP0100) 和 1 MΩ/20 pF (TPP0101) 输入的 BNC示波器搭配 使用。 tektronix泰克TPP0100无源电压探头特点 带宽 直流至 100 M…

Day5 统计回文、连续最大和

✨个人主页&#xff1a; 北 海 &#x1f389;所属专栏&#xff1a; C/C相关题解 &#x1f383;操作环境&#xff1a; Visual Studio 2019 版本 16.11.17 文章目录 选择题1.C指针/链表/结构 编程题1.统计回文2.连续最大和 选择题 1.C指针/链表/结构 题目&#xff1a;下面两个结…

MySQL 性能调优及生产实战篇终版

前言为什么会查询慢&#xff1f;优化数据访问查询数据低效原因是否请求了不需要的数据 优化执行过程查询缓存查询优化处理语法解析器查询优化器优化器的优化策略优化器的优化类型关联查询排序优化 大数据量查询优化优化 COUNT 查询优化关联查询优化子查询优化 LIMIT 分页优化 u…

Laetus控制器维修20C-A323包装机控制模块

LAETUS 旗下系列有&#xff1a; ARGUS 、 POLYPHEM 、 INSPECT 等均可维修。Laetus GmbH控制器维修28C-A353&#xff0c;设备控制模块维修。 Laetus GmbH部分产品维修型号&#xff1a; Laetus 2D COSI wt &#xff1b; Laetus 2D COSI wt Laetus TDK Lambda HK15 Laetus 2D-…

别再瞎考证了!关于网络安全行业的证书,看完这篇,明明白白考证

有相关证书会让你的职业生涯锦上添花&#xff0c;实战技术能力必不可少。 温馨提示&#xff1a; 1、不满足条件的高校学生群体&#xff0c;可以直接报名考取NISP二级证书&#xff0c;满足CISP认证要求后&#xff0c;免考试按规定更换CISP证书&#xff0c;为毕业后从事网络安全…

一切从“简”,解放IT运维人员

运维人的神技 运维既是个技术活儿也是个苦差事&#xff0c;而运维人员被期望有着无限的技能&#xff1a;主机、存储、网络、操作系统样样精通&#xff0c;而且还要会写SQL、shell、开发语言java、.net、python等等&#xff0c;对业务更是门清&#xff0c;对各个用户的脾气喜好也…