0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

深入浅出带你了解磁共振成像(MRI)基本原理

昊量光电 来源:昊量光电 作者:昊量光电 2024-04-03 17:04 次阅读


深入浅出带你了解磁共振成像(MRI)基本原理

一、当我们去医院做核磁共振检查时是如何给大脑照相的呢?照相的原理又是什么?

人的大脑可以说是世jie上zui为精妙复杂的系统,从生理上来说,脑的功能是控制身体的其他器官,可以说所有的行为都因它而起,所有的感悟也都由它而生。对于这么复杂而又精细的系统,从古至今人类从未放弃探索。

研究脑zui古老的方法是神经解剖学。神经生理学家研究脑的化学、药理学和电性质,认知神经科学研究大脑的运作如何执行心理或认知功能。我们姑且将其统称为脑科学,即研究脑的结构和功能的科学。

脑科学研究方法除了常规的认知行为研究之外,还有利用脑功能成像设备的研究方法,zui常见的有磁共振成像技术(MRI)、脑电图(EEG)、脑磁图(MEG)等。今天我们就来聊聊磁共振成像技术(MRI)的基本原理。

wKgaomYNG6OAT74mAAZ7vItOR1A309.png

图1.图片来源于网络

磁共振成像技术原本称为核磁共振成像。很多人听到“核磁”,第1反应是这个对人体有害吗,因为名称中不是有“核”吗。其实,此处的”核“指”原子核“确实不假,但磁共振成像只与原子核的磁场相关,与原子核聚变、裂变等的能量放射并无关系。因此,磁共振成像其实是利用人体组织中某种原子核的核磁共振现象,将所得射频信号经过计算机处理,重构出人体某一层面的图像的诊断技术。

二、“核”和“磁”

我们先来说说这个“核”。人体是由原子构成的,原子由电子和原子核组成,原子核包括质子和中子。原子核像地球一样可以围绕着中轴进行自我旋转,并且人体中水分含量zui多,因此大脑中的H质子会自旋。通常情况下,每个质子自旋均会产生一个小的磁场,但呈随机无序排列,各方向的磁性相互抵消,因此人体整体不表现磁性。

但当一个人进入核磁共振扫描机器里,这些质子就处在了扫描机所产生的强磁场中。这些H原子仍按自己的频率震动,但方向为与外界磁场保持一致,整体上会表现出磁性。这就好比学校做广播体操,同学们一开始是随机排列的,但是一旦听到广播体操声响起,同学们都会自觉的排列整齐,朝同一个方向齐刷刷站好。此时,质子兼顾自旋和指向磁场方向或反方向的两种运动,综合起来看就类似于小时候玩的陀螺,称之为进动。

因此,磁共振成像系统中很重要的一个组成部分就是磁体系统,它的主要作用是提供一个稳定的、均匀的空间磁场环境。根据磁场强度的大小,可以把磁共振设备分为低场、中场、高场及超高场。磁场的单位是特斯拉Tesla),是以一位传奇的物理学家尼古拉·特斯拉的名字命名的。

磁场强度小于0.5T的磁共振设备被叫做低场磁共振

磁场强度大于0.5T小于1.0T的磁共振设备叫做中场磁共振

磁场强度大于1.0T小于2.0T的磁共振就是高场磁共振

磁场强度大于2.0T的磁共振是超高场磁共振,包括临床和科研常用的3.0T和7.0T

wKgZomYNG6SAewYjAAFkbX-Ku20370.png

wKgaomYNG6SAKRU2AACgQfZAYug271.png

三、“共振”

前面我们提到,在外加磁场后,体内的质子进动而产生磁矢量。平衡状态下,大部分的质子方向和外加磁场方向一致(即纵向磁化),而由于相位不同,宏观上只有纵向磁化产生,而无横向磁化产生。但由于和外加磁场方向一致不能被直接测量,我们如果想要获得这个信号,就需要扰乱它。

这就提到磁共振系统第二个重要组成部分——射频系统,它的主要作用是发射能够激发成像区域的射频脉冲。当我们加入的射频脉冲的频率和质子进动频率一致时,就会发生能量的传递,低能的质子获得能量进入高能的状态,这便是核磁共振。

加入了射频脉冲之后,产生的第1个影响是能量的传递,获得能量的质子会从低能级(磁场方向指向上)跃迁至高能状态(磁场方向指向下),纵向磁场强度随之不断减小。第二个影响是由于频率一致,所有吸收能量的质子会相互吸引靠拢,产生相同的相位,横向磁场强度随之不断增大。

wKgaomYNG6WARjBxAAHdr_OdRlA846.png

四.“成像”

那么,射频脉冲关闭后发生了什么呢?当射频脉冲消失后,这些共振的H原子会慢慢恢复到原来的方向和幅度,这个过程称之为“弛豫”。

弛豫分为横向弛豫和纵向弛豫。横向弛豫也称T2弛豫,即横向磁化逐渐减少的过程,横向磁化从zui大值减少了63%所花费的时间为T2;纵向弛豫也称为T1弛豫,即纵向磁化逐渐恢复的过程,纵向磁化恢复到平衡状态强度的63%所需的时间为T1。弛豫时间与质子密度有关,不同组织的T1和T2值有很大的差异。

简单来说,在恢复的过程中,被激发的质子释放的能量,即磁共振信号被计算机所接收。对于T1像,计算机接收的是从0到63%的信号,时间越长,信号越弱。而T2像是从100%到37%的信号,所以时间越长,信号越强。

zui终按照强度转换为黑白灰阶,从而画出人体图像。信号越强,图像越亮;信号越弱,图像越暗。比如,大家可以记住水为长T1长T2,脂肪为短T1短T2,如下图所示。T1像中的脑脊液为黑色,而T2像中脑脊液为白色。通常,T1观察解剖结构较好,T2观察组织病变较好。

wKgZomYNG6WAEeXTAANfWS6JSPw423.png


五.Metrolab 核磁共振(MRI)磁场相机MFC2046

当我们了解清楚核磁共振的原理之后,才会发现要搭建一套医院的核磁共振检测设备是需要很高精度的检测仪器辅助检测的,昊量光电全新推出的Metrolab 核磁共振(MRI)磁场相机MFC2046就是专门为了医疗、科研等高精度设备检测提供了一种zui优的解决方案!

wKgaomYNG6aABSwDAAJfKw0ABa4085.png

链接:https://www.auniontech.com/details-2085.html

Metrolab 的 NMR(质子核磁共振) 磁场相机于 25 年前推出,加快了磁共振成像(MRI)磁体的磁场测绘。它们将采集时间从几小时缩短到几分钟,将定位误差减小到几分之一毫米,并使人为误差和漂移误差变得微不足道。

Metrolab 核磁共振成像(MRI)磁场相机MFC2046基于脉冲 NMR 技术,是精密测试仪核磁共振三轴高斯计PT2026 的延伸。

新一代磁场相机MFC2046相比上一款MFC3045可提供更多方案:

测量范围更广,频率可达1.1 GHz 或 30 T

多种探头阵列几何形状可供选择,用于绘制DSV 为 100 mm至 600mm的 MRI 磁体或孔径小至 20 mm的 NMR光谱磁体的图谱

一个测头阵列上蕞多可安装255 个测头

更高的灵活性:一台仪器可进行多点测绘和单点测量

高效的工作流程:核磁共振成像探头阵列可包括一个宽范围探头,用于进行磁场扫描

标准USB以太网接口

用户友好型软件:任务驱动,实时数据采集

wKgZomYNG6eAM5eIAAYNuX1Wtrc309.png


参考文献:

《磁共振成像临床应用入门》靳二虎蒋涛 张辉

Grover, V. P., Tognarelli, J. M., Crossey, M. M., Cox, I. J., Taylor-Robinson, S. D., & McPhail, M. J. (2015). Magnetic Resonance Imaging: Principles and Techniques: Lessons for Clinicians. Journal of clinical and experimental hepatology, 5(3), 246–255.

如果您对磁场成像测量有兴趣,请访问上海昊量光电的官方网页:

https://www.auniontech.com/three-level-361.html

欢迎继续关注上海昊量光电的各大媒体平台,我们将不定期推出各种产品介绍与技术新闻。

更多详情请联系昊量光电/欢迎直接联系昊量光电

关于昊量光电:

上海昊量光电设备有限公司是光电产品专业代理商,产品包括各类激光器、光电调制器、光学测量设备、光学元件等,涉及应用涵盖了材料加工、光通讯、生物医疗、科学研究、国防、量子光学、生物显微、物联传感、激光制造等;可为客户提供完整的设备安装,培训,硬件开发,软件开发,系统集成等服务。


审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • MRI
    MRI
    +关注

    关注

    0

    文章

    64

    浏览量

    16814
  • 磁共振成像
    +关注

    关注

    0

    文章

    20

    浏览量

    8592
收藏 人收藏

    评论

    相关推荐

    深入浅出RISC-V调试

    一、JTAG简介 目前RISC-V官方支持的调试方式是JTAG(Joint Test Action Group),而ARM支持的调试方式有JTAG和SWD(Serial Wire Debug)这两种。 JTAG是一种国际标准的调试方式(IEEE1149.1),而SWD是ARM开发的。标准JTAG采用四线方式,分别是TCK、TMS、TDI和TDO,有一个可选的TRST引脚。 ● TCK:测试时钟输入。 ● TMS:测试模式选择。 ● TDI:测试数据输入。 ● TDO:测试数据输出。 在调试时需要用到一个工具,比如JLink或者CMSIS-DAP,对于这个工具,在这里称为JTAG主机(JTAG host),而嵌入在芯片内部的JTAG称为JTAG从机(JTAG slave),需要注意的是上面这些信号的输入输出方向是对于JTAG从机来说的。下文中如无特别说明,JTAG都是指JTAG从机。 一个JTAG主机可以同时对多个JTAG从机进行调试,这通过JTAG扫描链(JTAG Scan Chain)完成,如图1所示。 图1 一个JTAG主机连接多个JTAG从机 JTAG内部有一个TAP(Test Access Port)控制器(或者说状态机),通过TCK和TMS信号来改变状态机的状态。这个状态机的核心是两路SCAN,分别是IR SCAN和DR SCAN,TAP状态机如图2所示。 图2 TAP状态机 箭头上的0或1表示的是TMS信号的电平。JTAG在每一个TCK信号的上升沿采样TMS信号和TDI信号,决定状态机的状态是否发生变化,在每一个TCK信号的下降沿输出TDO信号。可以看到,无论TAP目前处于哪一个状态,只要TMS保持高电平并持续5个TCK时钟,则TAP一定会回到Test-Logic-Reset状态。 JTAG内部有一个IR(instruction register)寄存器和多个DR(data register)寄存器,IR寄存器决定要访问的是哪一个DR寄存器。DR寄存器有IDCODE、BYPASS等。在Test-Logic-Reset状态下IR寄存器默认选择的是IDCODE这个DR寄存器。 JTAG主机通过IR SCAN设置IR寄存器的值,然后通过DR SCAN来读、写相应的DR寄存器。 二、RISC-V调试Spec 调试模块在CPU芯片设计里是最为不起眼的,但又是最为复杂的模块之一,大部分开源的处理器IP都没有调试模块。 下面的内容基于RISC-V debug spec 0.13版本。 目前RISC-V的官方调试上位机是openocd,调试工具可以是JLink或者CMSIS-DAP,RISC-V调试系统框架如图3所示。 图3 RISC-V调试系统框架 可以看到主要分为3个部分,分别是Debug Host,可以理解为PC;Debug Hardware,可以理解为JLink或者CMSIS-DAP这样的调试工具;第三部分就是嵌入在芯片内部的调试模块。在调试模块内部,与调试工具直接交互的是DTM模块,DTM模块通过DMI接口与DM模块交互。 1>DTM模块 在DTM模块里实现了一个TAP控制器(状态机),其中IR寄存器的长度最少为5位,当TAP控制器复位时,IR的值默认为5\'b00001,即选择的是IDCODE寄存器。DTM模块的寄存器(DR寄存器)定义如图4所示。 图4 DTM寄存器 其中红色框起来的寄存器是必须要实现的。下面简单介绍一下这几个寄存器。 ① IDCODE寄存器(0x01) 当TAP状态机复位时,IR寄存器的值默认为0x01,即选择的是IDCODE寄存器。IDCODE寄存器的每一位含义如图5所示。IDCODE是只读寄存器。 图5 IDCODE寄存器 ● Version:只读,版本号,可为任意值。 ● PartNumber:只读,可为任意值。 ● Manufld:只读,厂商号,遵循JEP106标准分配,实际中可为任意值,只要不与已分配的厂商号冲突即可。 ② DTM控制和状态寄存器(dtmcs,0x10) dtmcs寄存器的每一位含义如图6所示。 图6 dtmcs寄存器 ● dmihardreset:DTM模块硬复位,写1有效。 ● dmireset:清除出错,写1有效。 ● idle:只读,JTAG 主机在Run-Test-Idle状态停留的时钟周期数,0表示不需要进入Run-Test-Idle状态,1表示进入Run-Test-Idle状态后可以马上进入下一个状态,以此类推。 ● dmistat:只读,上一次操作的状态。0表示无出错,1或者2表示操作出错,3表示操作还未完成。 ● abits:只读,dmi寄存器中address域的大小(位数)。 ● version:只读,实现所对应的spec版本,0表示0.11版本,1表示0.13版本。 ③ DM模块接口访问寄存器(dmi,0x11) dmi寄存器的每一位含义如图7所示。 图7 dmi寄存器 ● address:可读可写,DM寄存器的长度(位数)。 ● data:可读可写,往DM寄存器读、写的数据,固定为32位。 ● op:可读可写,读或者写这个域时有不同的含义。当写这个域时,写0表示忽略address和data的值,相当于nop操作;写1表示从address指定的寄存器读数据;写2表示把data的数据写到address指定的寄存器。写3为保留值。当读这个域时,0表示上一个操作正确完成;1为保留值;2表示上一个操作失败,这个状态是会被记住的,因此需要往dtmcs寄存器的dmireset域写1才能清除这个状态。3表示上一个操作还未完成。 在Update-DR状态时,DTM开始执行op指定的操作。在Capture-DR状态时,DTM更新data域。 ④ BYPASS寄存器(0x1f) 只读,长度为1,值固定为0。 2>DM模块 从图3可知,DM模块访问RISC-V Core有两种方式,一种是通过abstract command,另一种是通过system bus。abstract command方式是必须要实现的,system bus的方式是可选的。 DM模块的寄存器都为32位,定义如图8所示。 图8 DM寄存器 下面介绍一下红色框起来这几个重要的寄存器。 ① data寄存器(data0-data11,0x04-0x0f) 这12个寄存器是用于abstract command的数据寄存器,长度为32位,可读可写。 ② DM控制寄存器(dmcontrol,0x10) dmcontrol寄存器的每一位含义如图9所示。 图9 dmcontrol寄存器 ● haltreq:只写,写1表示halt(暂停)当前hart(hart表示CPU核,存在多核的情况)。 ● resumereq:只能写1,写1表示resume(恢复)当前hart,即go。 ● hartreset:可读可写,写1表示复位DM模块,写0表示撤销复位,这是一个可选的位。 ● ackhavereset:只能写1,写1表示清除当前hart的havereset状态。 ● hasel:可读可写,0表示当前只有一个已经被选择了的hart,1表示当前可能有多个已经被选择了的hart。 ● hartsello:可读可写,当前选择的hart的低10位。1位表示一个hart。 ● hartselhi:可读可写,当前选择的hart的高10位。1位表示一个hart。如果只有一个hart,那么hasel的值为0,hartsello的值为1,hartselhi的值为0。 ● setresethaltreq:只能写1,写1表示当前选择的hart复位后处于harted状态。 ● clrresethaltreq:只能写1,写1表示清除setresethaltreq的值。 ● ndmreset:可读可写,写1表示复位整个系统,写0表示撤销复位。 ● dmactive:可读可写,写0表示复位DM模块,写1表示让DM模块正常工作。正常调试时,此位必须为1。 ③ DM状态寄存器(dmstatus,0x11) dmstatus寄存器是一个只读寄存器,每一位含义如图10所示。 图10 dmstatus寄存器 ● impebreak:1表示执行完progbuf的指令后自动插入一条ebreak指令,这样就可以节省一个progbuf。当progbufsize的值为1时,此值必须为1。 ● allhavereset:1表示当前选择的hart已经复位。 ● anyhavereset:1表示当前选择的hart至少有一个已经复位。 ● allresumeack:1表示当前选择的所有hart已经应答上一次的resume请求。 ● anyresumeack:1表示当前选择的hart至少有一个已经应答上一次的resume请求。 ● allnonexistent:1表示当前选择的hart不存在于当前平台。 ● anynonexistent:1表示至少有一个选择了的hart不存在于当前平台。 ● allunavail:1表示当前选择的hart都不可用。 ● anyunavail:1表示至少有一个选择了的hart不可用。 ● allrunning:1表示当前选择的hart都处于running状态。 ● anyrunning:1表示至少有一个选择了的hart处于running状态。 ● allhalted:1表示当前选择的hart都处于halted状态。 ● anyhalted:1表示至少有一个选择了的hart处于halted状态。 ● authenticated:0表示使用DM模块之前需要进行认证,1表示已经通过认证。 ● authbusy:0表示可以进行正常的认证,1表示认证处于忙状态。 ● hasresethaltreq:1表示DM模块支持复位后处于halted状态,0表示不支持。 ● confstrptrvalid:1表示confstrptr0~3寄存器保存了配置字符串的地址。 ● version:0表示DM模块不存在,1表示DM模块的版本为0.11,2表示DM模块的版本为0.13。 ④ abstract控制和状态寄存器(abstractcs,0x16) abstractcs寄存器定义如图11所示。 图11 abstractcs寄存器 ● progbufsize:只读,program buffer的个数,取值范围为0~16,每一个的大小为32位。 ● busy:只读,1表示abstract命令正在执行,当写command寄存器后该位应该马上被置位直到命令执行完成。 ● cmderr:可读、只能写1,cmderr的值仅当busy位为0时有效。0表示无错误,1表示正在操作command、abstractcs、data或者progbuf寄存器,2表示不支持当前命令,3表示执行命令时出现异常,4表示由于当前hart不可用,或者不是处于halted/running状态而不能被执行,5表示由于总线出错(对齐、访问大小、超时)导致的错误,7表示其他错误。写1清零cmderr。 ● datacount:只读,所实现的data寄存器的个数。 ⑤ abstract命令寄存器(command,0x17) 当写这个寄存器时,相应的操作就会被执行。command寄存器只能写,定义如图12所示。 图12 command寄存器 ● cmdtype:只写,命令类型,0为表示访问寄存器,1表示快速访问,2表示访问内存。 ● control:只写,不同的命令类型有不同的含义,说明如下。 当cmdtype为0时,control定义如图13所示。 图13 访问寄存器 ● cmdtype:值为0。 ● aarsize:2表示访问寄存器的最低32位,3表示访问寄存器的最低64位,4表示访问寄存器的最低128位。如果大于实际寄存器的大小则此次访问是失败的。 ● aarpostincrement:1表示成功访问寄存器后自动增加regno的值。 ● postexec:1表示执行progbuf里的内容(指令)。 ● transfer:0表示不执行write指定的操作,1表示执行write指定的操作。 ● write:0表示从指定的寄存器拷贝数据到arg0指定的data寄存器。1表示从arg0指定的data寄存器拷贝数据到指定的寄存器。 ● regno:要访问的寄存器。 综上,可知: Ⅰ. 当write=0,transfer=1时,从regno指定的寄存器拷贝数据到arg0对应的data寄存器。 Ⅱ. 当write=1,transfer=1时,从arg0对应的data寄存器拷贝数据到regno指定的寄存器。 Ⅲ. 当aarpostincrement=1时,将regno的值加1。 Ⅳ. 当postexec=1时,执行progbuf寄存器里的指令。 arg对应的data寄存器如图14所示。 图14 arg对应的data寄存器 即当访问的寄存器位数为32位时,arg0对应data0寄存器,arg1对应data1寄存器,arg2对应data2寄存器。 当cmdtype为1时,control定义如图15所示。 图15 快速访问 ● cmdtyte:值为1。 此命令会执行以下操作: 1)halt住当前hart。 2)执行progbuf寄存器里的指令。 3)resume当前hart。 当cmdtype为2时,control定义如图16所示。 图16 访问内存 ● cmdtype:值为2。 ● aamvirtual:0表示访问的是物理地址,1表示访问的是虚拟地址。 ● aamsize:0表示访问内存的低8位,1表示访问内存的低16位,2表示访问内存的低32位,3表示访问内存的低64位,4表示访问内存的低128位。 ● aampostincrement:1表示访问成功后,将arg1对应的data寄存器的值加上aamsize对应的字节数。 ● write:0表示从arg1指定的地址拷贝数据到arg0指定的data寄存器,1表示从arg0指定的data寄存器拷贝数据到arg1指定的地址。 ● target-specific:保留。 综上,可知: Ⅰ. 当write=0时,从arg1指定的地址拷贝数据到arg0指定的data寄存器。 Ⅱ. 当write=1时,从arg0指定的data寄存器拷贝数据到arg1指定的地址。 Ⅲ. 当aampostincrement=1时,增加arg1对应的data寄存器的值。 ⑥ 系统总线访问控制和状态寄存器(sbcs,0x38) sbcs寄存器定义如图17所示。 图17 sbcs寄存器 ● sbversion:只读,0表示system bus是2018.1.1之前的版本,1表示当前debug spec的版本,即0.13版本。 ● sbbusyerror:只读,写1清零,当debugger要进行system bus访问操作时,如果上一次的system bus访问还在进行中,此时会置位该位。 ● sbbusy:只读,1表示system bus正在忙。在进行system bus访问前必须确保该位为0。 ● sbreadonaddr:可读可写,1表示每次往sbaddress0寄存器写数据时,将会自动触发system bus从新的地址读取数据。 ● sbaccess:可读可写,访问的数据宽度,0表示8位,1表示16位,2表示32位,3表示64位,4表示128位。 ● sbautoincrement:可读可写,1表示每次system bus访问后自动将sbaddress的值加上sbaccess的大小(字节)。 ● sbreadondata:可读可写,1表示每次从sbdata0寄存器读数据后将自动触发system bus从新的地址读取数据。 ● sberror:可读,写1清零,0表示无错误,1表示超时,2表示访问地址错误,3表示地址对齐错误,4表示访问大小错误,7表示其他错误。 ● sbasize:只读,system bus地址宽度(位数),0表示不支持system bus访问。 ● sbaccess128:只读,1表示system bus支持128位访问。 ● sbaccess64:只读,1表示system bus支持64位访问。 ● sbaccess32:只读,1表示system bus支持32位访问。 ● sbaccess16:只读,1表示system bus支持16位访问。 ● sbaccess8:只读,1表示system bus支持8位访问。 ⑦ 系统总线地址0寄存器(sbaddress0,0x39) 可读可写,如果sbcs寄存器中的sbasize的值为0,那么此寄存器可以不用实现。 当写该寄存器时,会执行以下流程: Ⅰ. 设置sbcs.sbbusy的值为1。 Ⅱ. 从新的sbaddress地址读取数据。 Ⅲ. 如果读取成功并且sbcs.sbautoincrement的值为1,则增加sbaddress的值。 Ⅳ. 设置sbcs.sbbusy的值为0。 ⑧ 系统总线数据0寄存器(sbdata0,0x3c) 可读可写,如果sbcs寄存器中的所有sbaccessxx的值都为0,那么此寄存器可以不用实现。 当写该寄存器时,会执行以下流程: Ⅰ. 设置sbcs.sbbusy的值为1。 Ⅱ. 将sbdata的值写到sbaddress指定的地址。 Ⅲ. 如果写成功并且sbcs.sbautoincrement的值为1,则增加sbaddress的值。 Ⅳ. 设置sbcs.sbbusy的值为0。 当读该寄存器时,会执行以下流程: Ⅰ. 准备返回读取的数据。 Ⅱ. 设置sbcs.sbbusy的值为1。 Ⅲ. 如果sbcs.sbautoincrement的值为1,则增加sbaddress的值。 Ⅳ. 如果sbcs.sbreadondata的值为1,则开始下一次读操作。 Ⅴ. 设置sbcs.sbbusy的值为0。 三、RISC-V调试上位机分析 RISC-V官方支持的调试器上位机是openocd。openocd是地表最强大(没有之一)的开源调试上位机,支持各种target(ARM(M、A系列)、FPGA、RISC-V等),支持各种调试器(Jlink、CMSIS-DAP、FTDI等),支持JTAG和SWD接口。 这里不打算详细分析整个openocd的实现,只是重点关注针对RISC-V平台的初始化、读写寄存器和读写内存这几个流程。 1>openocd启动过程 openocd启动时需要通过-f参数制定一个cfg文件,比如: openocd.exe -f riscv.cfg riscv.cfg文件的内容如下: adapter_khz1000 reset_config srst_only adapter_nsrst_assert_width 100 interface cmsis-dap transport select jtag set _CHIPNAME riscv jtag newtap $_CHIPNAME cpu -irlen 5 -expected-id 0x1e200a6d set _TARGETNAME $_CHIPNAME.cpu target create $_TARGETNAME riscv -chain-position $_TARGETNAME ■ 第一行设置TCK的时钟为1000KHz。 ■ 第二行表示不支持通过TRST引脚复位,只支持TMS为高电平并持续5个TCK时钟这种方式的复位。 ■ 第三行是复位持续的延时。 ■ 第四行指定调试器为CMSIS-DAP。 ■ 第五行指定调试接口为JTAG。 ■ 第六行指定调试的target类型为riscv。 ■ 第七行指定生成一个IR寄存器长度为5位、IDCODE为0x1e200a6d的JTAG TAP。 ■ 第八、九行指定生成一个riscv target。 openocd启动时的主要流程如图18所示。 图18 openocd启动流程 下面重点关注一下examine target这个流程。 这里的target是指riscv,对于riscv,首先会读取dtmcontrol这个寄存器,因为openocd支持0.11和0.13版本的DTM,通过这个寄存器可以知道当前调试的DTM是哪一个版本。这里选择0.13版本来分析。通过读取dtmcontrol,还可以知道idle、abits这些参数。接下来会将dmcontrol这个寄存器的dmactive域写0后再写1来复位DM模块。接下来再读取dmstatus,判断version域是否为2。接下来还会读取sbcs和abstractcs寄存器,最后就是初始化每一个hart的寄存器。 2>read register过程 读寄存器时,先构建command寄存器的内容,首先将cmdtype的值设为0,aarsize的值设为2(寄存器的宽度为32位),transfer的值设为1,regno的值设为要读的寄存器的number,其他值设为0,然后写到command寄存器里。然后一直读取abstractcs寄存器,直到abstractcs寄存器的busy位为0或者超时。然后再判断abstractcs寄存器的cmderr的值是否为0,如果不为0则表示此次读取寄存器失败,如果为0则继续读取data0寄存器,这样就可以得到想要读的寄存器的值。 3>write register过程 写寄存器时,先将需要写的值写到data0寄存器,然后构建command寄存器的内容,首先将cmdtype的值设为0,aarsize的值设为2(寄存器的宽度为32位),transfer的值设为1,write的值设为1,regno的值设为要写的寄存器的number,其他值设为0,然后写到command寄存器里。然后一直读取abstractcs寄存器,直到abstractcs寄存器的busy位为0或者超时。然后再判断abstractcs寄存器的cmderr的值是否为0,如果不为0则表示此次写寄存器失败,如果为0则表示写寄存器成功。 4>read memory过程 如果progbufsize的值大于等于2,则会优先使用通过执行指令的方式来读取内存。这里不分析这种方式,而是分析使用system bus的方式。通过前面的分析可知,system bus有两个版本V0和V1,这里以V1版本来说明。 先将sbcs寄存器的sbreadonaddr的值设为1,sbaccess的值设为2(32位),然后将要读内存的地址写入sbaddress0寄存器。接着读sbdata0寄存器,最后读sbcs寄存器,如果其中的sbbusy、sberror和sbbusyerror都为0,则从sbdata0读取到的内容就是要读的内存的值。 5>write memory过程 和read memory类似,同样以V1版本来说明。 先将要写的内存地址写到sbaddress0寄存器,然后将要写的数据写到data0寄存器,最后读sbcs寄存器,如果其中的sbbusy、sberror和sbbusyerror都为0,则此次写内存成功。 四、RISC-V JTAG的实现 通过在STM32F103C8T6上实现(模拟)RISC-V调试标准,进一步加深对RISC-V JTAG调试的理解。 使用STM32的四个GPIO作为JTAG信号的四根线,其中TCK所在的引脚设为外部中断,即上升沿和下降沿触发方式,实现了可以通过openocd以RISC-V的调试标准来访问STM32的寄存器和内存。程序流程如图19所示。 图19 JTAG实现的程序流程 五、参考资料 1、在STM32上模拟RISC-V JTAG的实现:stm32_riscv_jtag_slave 2、一个从零开始写的易懂的RISC-V处理器核:tinyriscv
    发表于 11-28 22:00

    FPGA在医疗成像设备中的应用

    随着医疗科技的飞速发展,医疗成像设备在医学诊断和治疗中扮演着至关重要的角色。从传统的X射线到先进的计算机断层扫描(CT)、磁共振成像(MRI)乃至四维
    的头像 发表于 11-07 09:00 340次阅读

    国仪量子推出全球首台AI电子顺磁共振波谱仪

    10月20日,媒体报道称,在浙江大学举办的2024年全国电子顺磁共振波谱学学术研讨会上,国仪量子技术(合肥)股份有限公司(简称国仪量子)隆重推出了全球首台AI电子顺磁共振波谱仪(AI-EPR)。
    的头像 发表于 10-22 11:20 380次阅读

    磁共振机房精密空调,如何避免故障?

    磁共振机房精密空调系统常见故障与处理。
    的头像 发表于 10-12 18:13 266次阅读
    核<b class='flag-5'>磁共振</b>机房精密空调,如何避免故障?

    THS4631DGNR是否可以用在磁共振成像设备中?

    THS4631DGNR是否可以用在磁共振成像设备中
    发表于 09-24 07:48

    CBM96AD53-125 一款四通道、16位、125MSPS串行LVDS 1.8V模数转换器

    磁共振成像(MRI)是一种使用强大的磁场和无线电波来生成身体内部结构详细图像的医学成像技术。与使用有害辐射的CT扫描(计算机断层扫描)不同,MRI不涉及辐射风险。芯佰微推出了ADC
    的头像 发表于 09-11 17:42 348次阅读
    CBM96AD53-125 一款四通道、16位、125MSPS串行LVDS 1.8V模数转换器

    磁共振检查常用线圈及分类方法

    研究。线圈是MRI系统中的关键部件,用于接收和发射射频信号,对成像质量具有重要影响。本文将介绍磁共振检查中常用的线圈及其分类方法。 一、磁共振线圈的
    的头像 发表于 08-21 09:52 1829次阅读

    深入浅出系列之代码可读性

    原创声明:该文章是个人在项目中亲历后的经验总结和分享,如有搬运需求请注明出处。 这是“深入浅出系列”文章的第一篇,主要记录和分享程序设计的一些思想和方法论,如果读者觉得所有受用,还请“一键三连
    的头像 发表于 08-09 16:00 265次阅读

    高压功率放大器在核磁共振陀螺研究中的应用

    实验名称:核磁共振陀螺内嵌磁力仪的横向弛豫时间在线测量方法实验研究方向:精密测量测试目的:核磁共振陀螺中探测光频率变动将导致内嵌磁力仪所测信号幅度的变动,进而导致陀螺的零偏漂移。根据核磁共振陀螺结构
    的头像 发表于 07-25 11:49 761次阅读
    高压功率放大器在核<b class='flag-5'>磁共振</b>陀螺研究中的应用

    深入浅出谈TDR阻抗测试

    、脉宽、时序、抖动或噪声内容的任何事物都会影响整个系统的性能和可靠性。为保证信号完整性,必须了解和控制信号经过的传输环境的阻抗。阻抗不匹配和不连续会导致反射,增加系
    的头像 发表于 06-06 08:28 5740次阅读
    <b class='flag-5'>深入浅出</b>谈TDR阻抗测试

    饱和吸收光谱的新型量子光学磁力计,确保核磁共振成像质量

    磁共振成像MRI)扫描仪可以提供质量卓越的3D图像,但用于创建这些图像的强磁场存在扰动,可能会在扫描中引入误差和干扰。
    的头像 发表于 05-28 09:19 1422次阅读
    饱和吸收光谱的新型量子光学磁力计,确保核<b class='flag-5'>磁共振成像</b>质量

    数字源表的基本原理与结构组成

    测试、电子元件测试、电池测试等领域得到了广泛应用。本文将详细探讨数字源表的基本原理和结构,以期为读者提供更为深入了解
    的头像 发表于 05-15 15:48 1118次阅读

    深入浅出带你搞懂-MOSFET栅极电阻

    一、MOSFET简介MOSFET是金属(metal)—氧化物(oxide)—半导体(semiconductor)场效应晶体管,属于电压控制电流型元件,是开关电路中的基本元件,其栅极(G极)内阻极高。以N沟道增强型为例,其结构为在一块浓度较低的P型硅上扩散两个浓度较高的N型区作为漏极和源极,半导体表面覆盖二氧化硅绝缘层并引出一个电极作为栅极。由于mos管本身的
    的头像 发表于 05-09 08:10 2.3w次阅读
    <b class='flag-5'>深入浅出</b><b class='flag-5'>带你</b>搞懂-MOSFET栅极电阻

    【年度精选】2023年度top5榜单——电机控制资料

    控制领域的朋友来说,是一份宝贵的参考资料。资料详细介绍了传动控制的基本原理、设计方法和实际应用案例,深入浅出地阐述了传动控制的精髓。无论是初学者还是专业人士,都能从中受益匪。如果你对传动控制感兴趣
    发表于 01-16 14:34

    深入浅出地探讨CCS充电标准的基本原理

    CCS充电标准的历史可以追溯到2011年。当时,欧洲、北美和亚洲的电动汽车市场出现了不同的充电标准,这给全球范围内的电动汽车发展带来了互操作性和充电便利性的问题。
    发表于 01-11 10:05 5553次阅读
    <b class='flag-5'>深入浅出</b>地探讨CCS充电标准的<b class='flag-5'>基本原理</b>