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

这篇具有很好参考价值的文章主要介绍了STM32G4 比较器COMPx(寄存器开发)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

1. 特性

1.1 框图

stm32内部比较器,STM32,笔记,stm32,单片机,嵌入式硬件

1.2 比较器输入信号SEL

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

stm32内部比较器,STM32,笔记,stm32,单片机,嵌入式硬件

1.3 比较器滞回选择HYST

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

stm32内部比较器,STM32,笔记,stm32,单片机,嵌入式硬件

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)。

stm32内部比较器,STM32,笔记,stm32,单片机,嵌入式硬件

根据上图可以看到,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寄存器中读取。文章来源地址https://www.toymoban.com/news/detail-533196.html

到了这里,关于STM32G4 比较器COMPx(寄存器开发)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32G4高精度定时器的同步功能

    STM32G474 所含的高精度定时器(HRTIMER)其实包含了多个定时器,多个定时器之间可以单独工作,也可以进行同步,且高精度定时器还能与片上的其他定时器以及其他芯片进行同步,本文将对高精度定时器的同步功能进行介绍。 HRTIME 的整体架构如下图所示,内含由 7 个定时器,主

    2024年04月23日
    浏览(110)
  • 8.2 电压比较器(1)

    电压比较器是对输入信号进行鉴幅与比较的电路,是组成非正弦波发生电路的基本单元电路,在测量和控制中有着相当广泛的应用。 1、电压比较器的电压传输特性 电压比较器的输出电压 u O u_{scriptscriptstyle O} u O ​ 与输入电压 u I u_{scriptscriptstyle I} u I ​ 的函数关系 u O = f

    2024年02月11日
    浏览(50)
  • 记录一次对STM32G4串口硬件FIFO的调试

    前言:通常我们使用串口接收多字节数据会使用中断和DMA两种方式。使用中断方式,每接收到一个字节就会触发一次中断,我们可以在中断函数里将接收到的这一字节保存在内存中然后等待其他程序处理,也可以直接在中断函数里处理。使用DMA方式,需要事先开辟一块内存,

    2024年02月09日
    浏览(38)
  • 一位比较器【模电实验】

    一位比较器,数值比较器的作用和原理是什么? 一、数值比较器的定义及功能 在数字系统中,特别是在计算机中都具有运算功能,一种简单的运算就是比较两个数A和B的大小。数值比较器就是对两数A、B进行比较,以判断其大小的逻辑电路。比较结果有A>B、A<B以及

    2024年02月05日
    浏览(60)
  • Verilog | 4位数值比较器

    牛客上的一道题,记录一下 这道题有两种思路: 第一种是按位比较,列举出所有情况: 第二种方法是,使用同或的方式获取一个标志位,进而获得判断依据: 关于比较器还有另外一道题 问题描述 给定8个数,以及若干二输入的比较器(可以将两个输入排序)。要求在单周期

    2024年02月11日
    浏览(39)
  • LM393电压比较器介绍

    概述       LM393 是双电压比较器集成电路。主要应用在脉冲发生器、模数转换器、限幅器、数字逻辑门电路、电压比较电路等场合。LM393电压比较器能直接连接TTL和CMOS电平电路。 特点 1、工作温度范围:0℃ --- +70℃; 2、工作电源电压范围宽,单电源、双电源均可工作:    

    2024年02月03日
    浏览(68)
  • JAVA语言-比较器Comparator

    目录 一、什么是Comparator 二、Java compare方法和compareTo方法 三、java中Comparable和Comparator的区别 Comparator的例子 Comparator 是javase中的接口,位于java.util包下。 数组工具类和集合工具类中提供的工具方法sort方法都给出了含有Comparator接口的重载方法。 List实例调sort方法 demo如下: 使

    2024年02月06日
    浏览(47)
  • LM324电压比较器介绍

    LM324 电压比较器简介       LM324 是单电源四路运算放大器,是一个具有差分输入和单端输出的高增益电压放大器。与在单电源应用场合的标准运算放大器比起来,其优点更明显。该四路放大器可以工作于低至3.0 V或高达32 V的电源电压,静态电流是MC1741的五分之一左右(每个放

    2024年02月06日
    浏览(76)
  • Java比较器(Comparator接口)

    1.当元素的类型没有实现java.lang.Comparable接口而又不方便修改代码,或者实现了java.lang.Comparable接口的排序规则不适合当前的操作,那么可以考虑使用 Comparator 的对象来排序 2.重写compare(Object o1,Object o2)方法,比较o1和o2的大小:如果方法返回正整数,则表示o1大于o2;如果返回

    2024年02月15日
    浏览(48)
  • Java中的比较器(Comparator)

    Java中的比较器(Comparator)是一种对象,用于定义两个对象之间的比较规则。它是一个独立的类,实现了Comparator接口,通常用于对集合中的元素进行排序。Comparator接口中有一个compare()方法,它接受两个对象作为参数,并返回一个int值,表示它们的顺序。 下面是一个简单的例

    2024年02月11日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包