STM32H750外设ADC之注入转换的上下文队列

ops/2024/11/14 21:09:14/

目录

概述

1  注入转换的上下文队列 

1.1 配置ADCx_CFGR 中JQDIS

1.2 注入触发ADCx_JSQR

1.3 ADCx_JSQR中的缓冲区

1.4 注意的问题

1.5 一个范例

2 更改触发或序列上下文时的操作

2.1 JSQR 上下文队列示例(队列更改)

2.2  JSQR 上下文队列示例(触发更改)

2.3 转换前发生溢出的 JSQR 上下文队列示例

2.4 转换期间发生溢出的 JSQR 上下文队列示例

 2.5 队列为空时的 JSQR 上下文队列示例( JQM=0 的情况)

2.6 队列为空时的 JSQR 上下文队列示例( JQM=1 的情况)

 2.7 清空上下文队列

3 上下文队列:在队列为空时启动 ADC

4 禁止队列

5 上下文队列: ADCx_JSQR 寄存器编程


概述

本文主要介绍STM32H750外设ADC之注入转换的上下文队列的相关内容,包括配置上下文队列的方法,相关寄存器的功能介绍等。

1  注入转换的上下文队列 

1.1 配置ADCx_CFGR 中JQDIS

实现上下文队列可为下一个注入转换序列准备多达 2 个上下文。必须将 ADCx_CFGR 寄存器的 JQDIS 位复位才能使能此功能。上下文队列使能时,只能进行硬件触发转换。

位 31 JQDIS:注入队列禁止 (Injected Queue disable)
这些位由软件置 1 和清零,用于禁止注入队列机制:
0:使能注入队列
1:禁止注入队列
注: 仅当 ADSTART=0 且 JADSTART=0 时(这可确保当前未进行常规转换、也未进行注入转换),才允许通过软件对此位执行写操作。将 JQDIS 位置 1 或复位会导致注入队列被清空, JSQR 寄存器也会被清空

1.2 注入触发ADCx_JSQR

该上下文包括:
1)注入触发的配置( ADCx_JSQR 寄存器中的 JEXTEN[1:0] 位和 JEXTSEL[4:0] 位)

位 8:7 JEXTEN[1:0]:注入通道的外部触发使能和极性选择 (External Trigger Enable and Polarity Selection for injected channels)
通过软件将这些位置 1 和清零可选择外部触发极性和使能注入组的触发。
00:如果 JQDIS=0(队列使能),同时禁止硬件和软件触发检测
00:如果 JQDIS=1(队列禁止),禁止硬件触发检测(可通过软件启动转换)
01:在上升沿执行硬件触发检测
10:在下降沿执行硬件触发检测
11:在上升沿和下降沿都执行硬件触发检测


注: ADC 使能后 (ADEN=1),允许随时通过软件写入这些位。如果 JQM=1 且上下文队列为空,则会在内部禁止注入序列的软件和硬件触发

位 6:2 JEXTSEL[4:0]:注入组的外部触发选择 (External Trigger Selection for injected group)
这些位可选择用于触发注入组转换的外部事件。
00000:事件 0
00001:事件 1
00010:事件 2
00011:事件 3
00100:事件 4
00101:事件 5
00110:事件 6
00111:事件 7
...
11111:事件 31:
注: ADC 使能后 (ADEN=1),允许随时通过软件写入这些位
 

2)注入序列的定义( ADCx_JSQR 寄存器中的 JSQx[4:0] 位和 JL[1:0] 位)

 位 13:9 JSQ1[4:0]: 注入序列中的第一次转换 (1st conversion in the injected sequence)

通过软件写入这些位,并将通道编号 (0..19) 分配为注入转换序列中的第一次转换。

注: ADC 使能后 (ADEN=1),允许随时通过软件写入这些位。

位 1:0 JL[1:0]: 注入通道序列长度 (Injected channel sequence length)
通过软件写入这些位可定义注入通道转换序列中的转换总数。
00: 1 次转换
01: 2 次转换
10: 3 次转换
11: 4 次转换
注: ADC 使能后 (ADEN=1),允许随时通过软件写入这些位。
 

1.3 ADCx_JSQR中的缓冲区

上下文的所有参数都会在 ADCx_JSQR 这一寄存器中定义,该寄存器会实现一个双缓冲区队
列,可缓冲多达 2 组参数。

1)JSQR 寄存器可随时写入,正在进行注入转换时也不例外。

2)每个写入到 JSQR 寄存器中的数据均会存储在上下文队列中。

3)队列开始时为空,对 JSQR 寄存器进行的第一次写访问时会立即更改上下文,随即 ADC会准备好接收注入触发。

4)注入序列完成后,队列会被占用,上下文会根据队列中存储的后续 JSQR 参数进行更改。这一新的上下文会用于下一个注入转换序列。

5)如果在队列已满的情况下向 JSQR 寄存器执行写操作,会发生队列溢出。这种溢出情况会通过 JQOVF 标志置为有效来指示。发生溢出时,会忽略造成溢出的 JSQR 寄存器写访问,并且上下文队列保持不变。如果 JQOVFIE 位置 1,可产生中断。

ADC x 中断和状态寄存器 (ADCx_ISR)( x=1 到 3)
ADC x interrupt and status register
偏移地址: 0x00
复位值: 0x0000 0000

位 10 JQOVF:注入上下文队列溢出 (Injected context queue overflow)
当注入上下文队列溢出时,该位会由硬件置 1。通过软件写入 1 可将该位清零。

0:未发生注入上下文队列溢出(或标志事件已通过软件确认并清零)
1:发生注入上下文队列溢出
 

ADC x 中断使能寄存器 (ADCx_IER)( x=1 到 3)
ADC x interrupt enable register
偏移地址: 0x04
复位值: 0x0000 0000


位 10 JQOVFIE:注入上下文队列溢出中断使能 (Injected context queue overflow interrupt enable)
此位由软件置 1 和清零,用于使能/禁止注入上下文队列溢出中断。
0:禁止注入上下文队列溢出中断。
1:使能注入上下文队列溢出中断 JQOVF 位置 1 时产生中断。


注: 仅当 JADSTART=0 时(这可确保当前未进行任何注入转换),才允许通过软件对此位执行写操作。
 

6)队列变空时可能执行两种操作,具体取决于寄存器 ADCx_CFGR 的控制位 JQM 的值。

 ADC x 配置寄存器 (ADCx_CFGR)( x=1 到 3)
ADC x configuration register
偏移地址: 0x0C
复位值: 0x8000 0000

位 21 JQM: JSQR 队列模式 (JSQR queue mode)
此位由软件置 1 和清零。此位定义空队列的管理方式。
0: JSQR 模式 0:队列从不为空,并会保留上一次写入 JSQR 的配置。
1: JSQR 模式 1:队列可以为空,队列为空时,会在上一个有效注入序列完成后立即在内部禁止注入序列的软件和硬件触发。

注: 仅当 JADSTART=0 时(这可确保当前未进行任何注入转换),才允许通过软件对此位执行写操作。如果使能了双重模式( ADCx_CCR 寄存器的 DAMDF 位不等于零),则从ADC 的 JQM 位不再可写,其内容与主 ADC 的 JQM 位相等。
 


JQM =0

队列刚好在使能 ADC 后为空,但在随后的运行操作期间绝不会变空:队列始终保留上一个有效的上下文,并会根据上一个有效的上下文处理后续的有效注入序列启动。

JQM=1

队列会在注入序列结束后或队列被清空时变空。这种情况下,队列中不存在任何上下文,硬件触发也会被禁止。因此会忽略后续的所有硬件注入触发,直至软件重新向 JSQR 寄存器写入新的注入上下文。

7) 读取 JSQR 寄存器会返回当前有效的 JSQR 上下文。如果 JSQR 上下文为空, JSQR 的
读出值为 0x0000。

8)如果通过将 JADSTP 置 1 的方式停止注入转换、或者通过将 ADDIS 置 1 的方式禁止
ADC,队列会被清空。
– 如果 JQM=0,队列会保留上一个有效的上下文。
– 如果 JQM=1,队列会变空,并会忽略触发。
 

1.4 注意的问题

如果配置为不连续模式(位 JDISCEN=1),只有注入序列的最后一次触发会更改上下文并占用队列。第一次触发仅会占用队列,但其他触发仍为有效触发。

ADC x 配置寄存器 (ADCx_CFGR)( x=1 到 3)
ADC x configuration register
偏移地址: 0x0C
复位值: 0x8000 0000
 

位 20 JDISCEN: 注入通道的不连续采样模式 (Discontinuous mode on injected channels)

通过软件将该位置 1 和清零可使能/禁止注入通道的不连续采样模式。
0:禁止注入通道的不连续采样模式
1:使能注入通道的不连续采样模式

注: 仅当 JADSTART=0 时(这可确保当前未进行任何注入转换),才允许通过软件对此位执行写操作。不能同时使用自动注入模式和不连续模式:当 JAUTO 置 1 时, DISCEN 和 JDISCEN 位必须通过软件保持清零状态。如果使能了双重模式( ADCx_CCR 寄存器的 DAMDF 位不等于零),则从 ADC 的 JDISCEN位不再可写,其内容与主 ADC 的 JDISCEN 位相等。
 

1.5 一个范例

不连续模式示例所示(两个上下文的长度均为 3):
第一次触发,不连续。序列 1:上下文 1 已占用,已执行第一次转换
第二次触发,不连续。序列 1:第二次转换。
第三次触发,不连续。序列 1:第三次转换。

第四次触发,不连续。序列 2:上下文 2 已占用,已执行第一次转换。
第五次触发,不连续。序列 2:第二次转换。
第六次触发,不连续。序列 2:第三次转换。

注: 上下文队列使能时(位 JQDIS=0),仅可使用硬件触发。

ADC x 配置寄存器 (ADCx_CFGR)( x=1 到 3)
ADC x configuration register
偏移地址: 0x0C
复位值: 0x8000 0000

位 31 JQDIS:注入队列禁止 (Injected Queue disable)
这些位由软件置 1 和清零,用于禁止注入队列机制:
0:使能注入队列
1:禁止注入队列


注: 仅当 ADSTART=0 且 JADSTART=0 时(这可确保当前未进行常规转换、也未进行注入转换),才允许通过软件对此位执行写操作。将 JQDIS 位置 1 或复位会导致注入队列被清空, JSQR 寄存器也会被清空。
 

2 更改触发或序列上下文时的操作

2.1 JSQR 上下文队列示例(队列更改)

2.2  JSQR 上下文队列示例(触发更改)

2.3 转换前发生溢出的 JSQR 上下文队列示例

2.4 转换期间发生溢出的 JSQR 上下文队列示例

 2.5 队列为空时的 JSQR 上下文队列示例( JQM=0 的情况)

2.6 队列为空时的 JSQR 上下文队列示例( JQM=1 的情况)

 2.7 清空上下文队列

1)通过将 JADSTP 置 1 的方式清空 JSQR 上下文队列 (JQM=0)。正在进行转换时发生 JADSTP 的情况。

2)通过将 JADSTP 置 1 的方式清空 JSQR 上下文队列 (JQM=0)。正在进行转换时发生 JADSTP 并出现新触发的情况。


 

3) 通过将 JADSTP 置 1 的方式清空 JSQR 上下文队列 (JQM=0)。在正在进行转换的范围之外发生 JADSTP 的情况。

4)通过将 JADSTP 置 1 的方式清空 JSQR 上下文队列 (JQM=1)。

5) 通过将 ADDIS 置 1 的方式清空 JSQR 上下文队列 (JQM=0)。

6)通过将 ADDIS 置 1 的方式清空 JSQR 上下文队列 (JQM=1)。
 

3 上下文队列:在队列为空时启动 ADC

要在队列为空时启动 ADC 操作,必须按照以下程序进行操作,以免在 ADC 初始化时无法获
悉第一个上下文。此程序仅在 JQM 位复位的情况下适用:

step -1:写入空 JSQR, JEXTEN 不等于 0(否则会触发软件转换)

位 8:7 JEXTEN[1:0]:注入通道的外部触发使能和极性选择 (External Trigger Enable and Polarity
Selection for injected channels)
通过软件将这些位置 1 和清零可选择外部触发极性和使能注入组的触发。
00:如果 JQDIS=0(队列使能),同时禁止硬件和软件触发检测
00:如果 JQDIS=1(队列禁止),禁止硬件触发检测(可通过软件启动转换)
01:在上升沿执行硬件触发检测
10:在下降沿执行硬件触发检测
11:在上升沿和下降沿都执行硬件触发检测


step -2: 将 JADSTART 置 1 (Set NAK)

位 3 JADSTART: ADC 开始注入转换 (ADC start of injected conversion)
此位由软件置 1,用于开始 ADC 的注入通道转换。根据配置位 JEXTEN 的值,可以立即开始转换(软件触发配置),也可以在发生注入硬件触发事件后开始转换(硬件触发配置)。
该位通过硬件清零:
– 在单次转换模式下,如果选择了软件触发 (JEXTSEL=0x0):出现注入转换序列结束 (JEOS) 标志时清零。
– 在所有情况下:执行完 JADSTP 命令后,由硬件将 JADSTP 位清零的同时清零。
0:当前未进行 ADC 注入转换。
1:写入 1 可开始注入转换。读取值为 1 表示 ADC 正在运行,最终会转换注入通道
 

step -3:将 JADSTP 置 1 (Set NAK)

位 5 JADSTP: ADC 停止注入转换命令 (ADC stop of injected conversion command)
该位由软件置 1,用于停止和丢弃正在进行的注入转换( JADSTP 命令)。
当转换已有效丢弃、并且可重新配置 ADC 注入序列和触发时,会通过硬件将该位清零。随后, ADC会准备好接收新的开始注入转换命令( JADSTART 命令)。


0:当前未执行 ADC 停止注入转换命令
1:写入 1 可停止正在进行的注入转换。读取值为 1 表示正在执行 ADSTP 命令。
 


step -4:等待,直至 JADSTART 复位
step -5:将 JADSTART 置 1 (Set NAK)
 

4 禁止队列

可通过将 ADCx_CFGR 寄存器中的 JQDIS 位置 1 的方式禁止队列。

位 31 JQDIS:注入队列禁止 (Injected Queue disable)
这些位由软件置 1 和清零,用于禁止注入队列机制:
0:使能注入队列
1:禁止注入队列
 

5 上下文队列: ADCx_JSQR 寄存器编程

step-1:  

当注入转换上下文队列使能时 (JQDIS=0),必须通过一次寄存器写访问编程 ADCx_JSQR。

 step-2:  

由于 JL[1:0] 寄存器定义了注入序列数目,因此必须同时写入对应的 JSQ1 到 JSQ4。如果在注入转换开始前对 ADCx_JSQR 进行重新编程,那么重新编程的数据会置于队列中。

 step-3:  

上下文队列为空时, ADCx_JSQR 的读出值为 0x0000。寄存器访问不应使用“读-修改-写”序列。如果在已有 2 个上下文排队的情况下对 ADCx_JSQR 进行编程, JQOVF 标志将置 1,并会产生中断。

ADC x 中断和状态寄存器 (ADCx_ISR)( x=1 到 3)
ADC x interrupt and status register
偏移地址: 0x00
复位值: 0x0000 0000

 位 10 JQOVF:注入上下文队列溢出 (Injected context queue overflow)
当注入上下文队列溢出时,该位会由硬件置 1。通过软件写入 1 可将该位清零。更多信息,
0:未发生注入上下文队列溢出(或标志事件已通过软件确认并清零)
1:发生注入上下文队列溢出


http://www.ppmy.cn/ops/31696.html

相关文章

创建和激活python虚拟环境(venv), 以及在vscode上运行python虚拟环境

最近使用python做项目,发现佬们都是在用python的虚拟环境来放项目。发现确实有一些优势在这之中, 首先就是隔离性,我们将每个项目放入相对应的环境配置,可以有效避免乱七八糟的库出现在解释器中。其次就是可移植性强,…

【项目学习01_2024.05.02_Day04】

学习笔记 4 课程分类查询4.1需求分析4.2 接口定义4.3 接口开发4.3.1 树型表查询4.3.2 开发Mapper 4 课程分类查询 4.1需求分析 有课程分类的需求 course_category课程分类表的结构 这张表是一个树型结构,通过父结点id将各元素组成一个树。 利用mybatis-plus-gen…

SSM整合-前后端分离-项目环境搭建 (上)

整合SSM 项目基础环境搭建项目介绍创建项目项目全局配置web.xmlSpringMVC配置配置Spring和MyBatis, 并完成整合创建表, 使用逆向工程生成Bean, XxxMapper和XxxMapper.xml注意事项和细节说明 实现功能01-搭建Vue前端工程需求分析/图解代码实现搭建Vue前端工程vue3项目目录结构梳…

初识Flask

初识Flask Flask是使用 Python编写的Web微框架。Web框架可以让我们不用关心底层的请求响应处理,更方便高效地编写Web程序。 Flask主要有两个依赖,一个是WSGI(Web Server Gateway Interface,Web服务器网关接口)工具集…

权利压迫攻击(Grinding Attack)是什么

权利压迫攻击(Grinding Attack) 权利压迫攻击是指恶意节点通过影响出块节点的选举过程,加大自己被选为出块节点的概率。在基于 PoS、PoSpace 的共识协议中,随机性来自于链本身的原始数据。恶意节点在出块时,可以通过尝…

迁移数据前,如何确保Oracle与Hive表中字段数量的一致性

在数据库迁移项目中,确保源数据库和目标数据库的表结构一致性是至关重要的。当从Oracle迁移到Hive时,虽然两者在架构和查询语言上存在差异,但字段数量的一致性检查仍然是一个基本的步骤。本文将介绍如何检查Oracle中的表的字段和Hive表中的字…

4. 寻找两个正序数组的中位数

题目描述 2个有序数组(保证不能同时为空)长度分别为m,n;求他们的中位数。 要求时间复杂度O(long(mn))。 解题思路 题目的要求可以转述为求第k大个数,k可能为1个数,可能为2个数。 k(mn)/2 num1[k/2]表示…

python实现2路归并排序

归并排序是通过序列的合并来实现排序的。 对于一个序列a1 a2 a2 … an,我们可以首先把它们看成一系列的只有一个元素的有序子序列a1;a2;a3;…;an,我们让a1和a2合并,a3和a4合并,依次类推,最后得到一个有序子序列的序列a…