简 介: 通过MicroPython中的数组mem对于MM32F3277内部的模拟比较器进行初步测试,验证了它的最基本的设置和工作关系。测试过程中也发现了MM32F3277的数据手册与对应的内部功能方面的问题:对于COMP控制寄存器偏移量描述错误,以及对于比较器的输出端口如何选择的问题。

关键词MM32F3277memCOMP

#mermaid-svg-rgPCJmG1Ll2M9tez .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-rgPCJmG1Ll2M9tez .label text{fill:#333}#mermaid-svg-rgPCJmG1Ll2M9tez .node rect,#mermaid-svg-rgPCJmG1Ll2M9tez .node circle,#mermaid-svg-rgPCJmG1Ll2M9tez .node ellipse,#mermaid-svg-rgPCJmG1Ll2M9tez .node polygon,#mermaid-svg-rgPCJmG1Ll2M9tez .node path{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-rgPCJmG1Ll2M9tez .node .label{text-align:center;fill:#333}#mermaid-svg-rgPCJmG1Ll2M9tez .node.clickable{cursor:pointer}#mermaid-svg-rgPCJmG1Ll2M9tez .arrowheadPath{fill:#333}#mermaid-svg-rgPCJmG1Ll2M9tez .edgePath .path{stroke:#333;stroke-width:1.5px}#mermaid-svg-rgPCJmG1Ll2M9tez .flowchart-link{stroke:#333;fill:none}#mermaid-svg-rgPCJmG1Ll2M9tez .edgeLabel{background-color:#e8e8e8;text-align:center}#mermaid-svg-rgPCJmG1Ll2M9tez .edgeLabel rect{opacity:0.9}#mermaid-svg-rgPCJmG1Ll2M9tez .edgeLabel span{color:#333}#mermaid-svg-rgPCJmG1Ll2M9tez .cluster rect{fill:#ffffde;stroke:#aa3;stroke-width:1px}#mermaid-svg-rgPCJmG1Ll2M9tez .cluster text{fill:#333}#mermaid-svg-rgPCJmG1Ll2M9tez div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:12px;background:#ffffde;border:1px solid #aa3;border-radius:2px;pointer-events:none;z-index:100}#mermaid-svg-rgPCJmG1Ll2M9tez .actor{stroke:#ccf;fill:#ECECFF}#mermaid-svg-rgPCJmG1Ll2M9tez text.actor>tspan{fill:#000;stroke:none}#mermaid-svg-rgPCJmG1Ll2M9tez .actor-line{stroke:grey}#mermaid-svg-rgPCJmG1Ll2M9tez .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333}#mermaid-svg-rgPCJmG1Ll2M9tez .messageLine1{stroke-width:1.5;stroke-dasharray:2, 2;stroke:#333}#mermaid-svg-rgPCJmG1Ll2M9tez #arrowhead path{fill:#333;stroke:#333}#mermaid-svg-rgPCJmG1Ll2M9tez .sequenceNumber{fill:#fff}#mermaid-svg-rgPCJmG1Ll2M9tez #sequencenumber{fill:#333}#mermaid-svg-rgPCJmG1Ll2M9tez #crosshead path{fill:#333;stroke:#333}#mermaid-svg-rgPCJmG1Ll2M9tez .messageText{fill:#333;stroke:#333}#mermaid-svg-rgPCJmG1Ll2M9tez .labelBox{stroke:#ccf;fill:#ECECFF}#mermaid-svg-rgPCJmG1Ll2M9tez .labelText,#mermaid-svg-rgPCJmG1Ll2M9tez .labelText>tspan{fill:#000;stroke:none}#mermaid-svg-rgPCJmG1Ll2M9tez .loopText,#mermaid-svg-rgPCJmG1Ll2M9tez .loopText>tspan{fill:#000;stroke:none}#mermaid-svg-rgPCJmG1Ll2M9tez .loopLine{stroke-width:2px;stroke-dasharray:2, 2;stroke:#ccf;fill:#ccf}#mermaid-svg-rgPCJmG1Ll2M9tez .note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-rgPCJmG1Ll2M9tez .noteText,#mermaid-svg-rgPCJmG1Ll2M9tez .noteText>tspan{fill:#000;stroke:none}#mermaid-svg-rgPCJmG1Ll2M9tez .activation0{fill:#f4f4f4;stroke:#666}#mermaid-svg-rgPCJmG1Ll2M9tez .activation1{fill:#f4f4f4;stroke:#666}#mermaid-svg-rgPCJmG1Ll2M9tez .activation2{fill:#f4f4f4;stroke:#666}#mermaid-svg-rgPCJmG1Ll2M9tez .mermaid-main-font{font-family:"trebuchet ms", verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-rgPCJmG1Ll2M9tez .section{stroke:none;opacity:0.2}#mermaid-svg-rgPCJmG1Ll2M9tez .section0{fill:rgba(102,102,255,0.49)}#mermaid-svg-rgPCJmG1Ll2M9tez .section2{fill:#fff400}#mermaid-svg-rgPCJmG1Ll2M9tez .section1,#mermaid-svg-rgPCJmG1Ll2M9tez .section3{fill:#fff;opacity:0.2}#mermaid-svg-rgPCJmG1Ll2M9tez .sectionTitle0{fill:#333}#mermaid-svg-rgPCJmG1Ll2M9tez .sectionTitle1{fill:#333}#mermaid-svg-rgPCJmG1Ll2M9tez .sectionTitle2{fill:#333}#mermaid-svg-rgPCJmG1Ll2M9tez .sectionTitle3{fill:#333}#mermaid-svg-rgPCJmG1Ll2M9tez .sectionTitle{text-anchor:start;font-size:11px;text-height:14px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-rgPCJmG1Ll2M9tez .grid .tick{stroke:#d3d3d3;opacity:0.8;shape-rendering:crispEdges}#mermaid-svg-rgPCJmG1Ll2M9tez .grid .tick text{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-rgPCJmG1Ll2M9tez .grid path{stroke-width:0}#mermaid-svg-rgPCJmG1Ll2M9tez .today{fill:none;stroke:red;stroke-width:2px}#mermaid-svg-rgPCJmG1Ll2M9tez .task{stroke-width:2}#mermaid-svg-rgPCJmG1Ll2M9tez .taskText{text-anchor:middle;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-rgPCJmG1Ll2M9tez .taskText:not([font-size]){font-size:11px}#mermaid-svg-rgPCJmG1Ll2M9tez .taskTextOutsideRight{fill:#000;text-anchor:start;font-size:11px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-rgPCJmG1Ll2M9tez .taskTextOutsideLeft{fill:#000;text-anchor:end;font-size:11px}#mermaid-svg-rgPCJmG1Ll2M9tez .task.clickable{cursor:pointer}#mermaid-svg-rgPCJmG1Ll2M9tez .taskText.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-rgPCJmG1Ll2M9tez .taskTextOutsideLeft.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-rgPCJmG1Ll2M9tez .taskTextOutsideRight.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-rgPCJmG1Ll2M9tez .taskText0,#mermaid-svg-rgPCJmG1Ll2M9tez .taskText1,#mermaid-svg-rgPCJmG1Ll2M9tez .taskText2,#mermaid-svg-rgPCJmG1Ll2M9tez .taskText3{fill:#fff}#mermaid-svg-rgPCJmG1Ll2M9tez .task0,#mermaid-svg-rgPCJmG1Ll2M9tez .task1,#mermaid-svg-rgPCJmG1Ll2M9tez .task2,#mermaid-svg-rgPCJmG1Ll2M9tez .task3{fill:#8a90dd;stroke:#534fbc}#mermaid-svg-rgPCJmG1Ll2M9tez .taskTextOutside0,#mermaid-svg-rgPCJmG1Ll2M9tez .taskTextOutside2{fill:#000}#mermaid-svg-rgPCJmG1Ll2M9tez .taskTextOutside1,#mermaid-svg-rgPCJmG1Ll2M9tez .taskTextOutside3{fill:#000}#mermaid-svg-rgPCJmG1Ll2M9tez .active0,#mermaid-svg-rgPCJmG1Ll2M9tez .active1,#mermaid-svg-rgPCJmG1Ll2M9tez .active2,#mermaid-svg-rgPCJmG1Ll2M9tez .active3{fill:#bfc7ff;stroke:#534fbc}#mermaid-svg-rgPCJmG1Ll2M9tez .activeText0,#mermaid-svg-rgPCJmG1Ll2M9tez .activeText1,#mermaid-svg-rgPCJmG1Ll2M9tez .activeText2,#mermaid-svg-rgPCJmG1Ll2M9tez .activeText3{fill:#000 !important}#mermaid-svg-rgPCJmG1Ll2M9tez .done0,#mermaid-svg-rgPCJmG1Ll2M9tez .done1,#mermaid-svg-rgPCJmG1Ll2M9tez .done2,#mermaid-svg-rgPCJmG1Ll2M9tez .done3{stroke:grey;fill:#d3d3d3;stroke-width:2}#mermaid-svg-rgPCJmG1Ll2M9tez .doneText0,#mermaid-svg-rgPCJmG1Ll2M9tez .doneText1,#mermaid-svg-rgPCJmG1Ll2M9tez .doneText2,#mermaid-svg-rgPCJmG1Ll2M9tez .doneText3{fill:#000 !important}#mermaid-svg-rgPCJmG1Ll2M9tez .crit0,#mermaid-svg-rgPCJmG1Ll2M9tez .crit1,#mermaid-svg-rgPCJmG1Ll2M9tez .crit2,#mermaid-svg-rgPCJmG1Ll2M9tez .crit3{stroke:#f88;fill:red;stroke-width:2}#mermaid-svg-rgPCJmG1Ll2M9tez .activeCrit0,#mermaid-svg-rgPCJmG1Ll2M9tez .activeCrit1,#mermaid-svg-rgPCJmG1Ll2M9tez .activeCrit2,#mermaid-svg-rgPCJmG1Ll2M9tez .activeCrit3{stroke:#f88;fill:#bfc7ff;stroke-width:2}#mermaid-svg-rgPCJmG1Ll2M9tez .doneCrit0,#mermaid-svg-rgPCJmG1Ll2M9tez .doneCrit1,#mermaid-svg-rgPCJmG1Ll2M9tez .doneCrit2,#mermaid-svg-rgPCJmG1Ll2M9tez .doneCrit3{stroke:#f88;fill:#d3d3d3;stroke-width:2;cursor:pointer;shape-rendering:crispEdges}#mermaid-svg-rgPCJmG1Ll2M9tez .milestone{transform:rotate(45deg) scale(0.8, 0.8)}#mermaid-svg-rgPCJmG1Ll2M9tez .milestoneText{font-style:italic}#mermaid-svg-rgPCJmG1Ll2M9tez .doneCritText0,#mermaid-svg-rgPCJmG1Ll2M9tez .doneCritText1,#mermaid-svg-rgPCJmG1Ll2M9tez .doneCritText2,#mermaid-svg-rgPCJmG1Ll2M9tez .doneCritText3{fill:#000 !important}#mermaid-svg-rgPCJmG1Ll2M9tez .activeCritText0,#mermaid-svg-rgPCJmG1Ll2M9tez .activeCritText1,#mermaid-svg-rgPCJmG1Ll2M9tez .activeCritText2,#mermaid-svg-rgPCJmG1Ll2M9tez .activeCritText3{fill:#000 !important}#mermaid-svg-rgPCJmG1Ll2M9tez .titleText{text-anchor:middle;font-size:18px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-rgPCJmG1Ll2M9tez g.classGroup text{fill:#9370db;stroke:none;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:10px}#mermaid-svg-rgPCJmG1Ll2M9tez g.classGroup text .title{font-weight:bolder}#mermaid-svg-rgPCJmG1Ll2M9tez g.clickable{cursor:pointer}#mermaid-svg-rgPCJmG1Ll2M9tez g.classGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-rgPCJmG1Ll2M9tez g.classGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-rgPCJmG1Ll2M9tez .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5}#mermaid-svg-rgPCJmG1Ll2M9tez .classLabel .label{fill:#9370db;font-size:10px}#mermaid-svg-rgPCJmG1Ll2M9tez .relation{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-rgPCJmG1Ll2M9tez .dashed-line{stroke-dasharray:3}#mermaid-svg-rgPCJmG1Ll2M9tez #compositionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-rgPCJmG1Ll2M9tez #compositionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-rgPCJmG1Ll2M9tez #aggregationStart{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-rgPCJmG1Ll2M9tez #aggregationEnd{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-rgPCJmG1Ll2M9tez #dependencyStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-rgPCJmG1Ll2M9tez #dependencyEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-rgPCJmG1Ll2M9tez #extensionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-rgPCJmG1Ll2M9tez #extensionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-rgPCJmG1Ll2M9tez .commit-id,#mermaid-svg-rgPCJmG1Ll2M9tez .commit-msg,#mermaid-svg-rgPCJmG1Ll2M9tez .branch-label{fill:lightgrey;color:lightgrey;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-rgPCJmG1Ll2M9tez .pieTitleText{text-anchor:middle;font-size:25px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-rgPCJmG1Ll2M9tez .slice{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-rgPCJmG1Ll2M9tez g.stateGroup text{fill:#9370db;stroke:none;font-size:10px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-rgPCJmG1Ll2M9tez g.stateGroup text{fill:#9370db;fill:#333;stroke:none;font-size:10px}#mermaid-svg-rgPCJmG1Ll2M9tez g.statediagram-cluster .cluster-label text{fill:#333}#mermaid-svg-rgPCJmG1Ll2M9tez g.stateGroup .state-title{font-weight:bolder;fill:#000}#mermaid-svg-rgPCJmG1Ll2M9tez g.stateGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-rgPCJmG1Ll2M9tez g.stateGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-rgPCJmG1Ll2M9tez .transition{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-rgPCJmG1Ll2M9tez .stateGroup .composit{fill:white;border-bottom:1px}#mermaid-svg-rgPCJmG1Ll2M9tez .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px}#mermaid-svg-rgPCJmG1Ll2M9tez .state-note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-rgPCJmG1Ll2M9tez .state-note text{fill:black;stroke:none;font-size:10px}#mermaid-svg-rgPCJmG1Ll2M9tez .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.7}#mermaid-svg-rgPCJmG1Ll2M9tez .edgeLabel text{fill:#333}#mermaid-svg-rgPCJmG1Ll2M9tez .stateLabel text{fill:#000;font-size:10px;font-weight:bold;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-rgPCJmG1Ll2M9tez .node circle.state-start{fill:black;stroke:black}#mermaid-svg-rgPCJmG1Ll2M9tez .node circle.state-end{fill:black;stroke:white;stroke-width:1.5}#mermaid-svg-rgPCJmG1Ll2M9tez #statediagram-barbEnd{fill:#9370db}#mermaid-svg-rgPCJmG1Ll2M9tez .statediagram-cluster rect{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-rgPCJmG1Ll2M9tez .statediagram-cluster rect.outer{rx:5px;ry:5px}#mermaid-svg-rgPCJmG1Ll2M9tez .statediagram-state .divider{stroke:#9370db}#mermaid-svg-rgPCJmG1Ll2M9tez .statediagram-state .title-state{rx:5px;ry:5px}#mermaid-svg-rgPCJmG1Ll2M9tez .statediagram-cluster.statediagram-cluster .inner{fill:white}#mermaid-svg-rgPCJmG1Ll2M9tez .statediagram-cluster.statediagram-cluster-alt .inner{fill:#e0e0e0}#mermaid-svg-rgPCJmG1Ll2M9tez .statediagram-cluster .inner{rx:0;ry:0}#mermaid-svg-rgPCJmG1Ll2M9tez .statediagram-state rect.basic{rx:5px;ry:5px}#mermaid-svg-rgPCJmG1Ll2M9tez .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#efefef}#mermaid-svg-rgPCJmG1Ll2M9tez .note-edge{stroke-dasharray:5}#mermaid-svg-rgPCJmG1Ll2M9tez .statediagram-note rect{fill:#fff5ad;stroke:#aa3;stroke-width:1px;rx:0;ry:0}:root{--mermaid-font-family: '"trebuchet ms", verdana, arial';--mermaid-font-family: "Comic Sans MS", "Comic Sans", cursive}#mermaid-svg-rgPCJmG1Ll2M9tez .error-icon{fill:#522}#mermaid-svg-rgPCJmG1Ll2M9tez .error-text{fill:#522;stroke:#522}#mermaid-svg-rgPCJmG1Ll2M9tez .edge-thickness-normal{stroke-width:2px}#mermaid-svg-rgPCJmG1Ll2M9tez .edge-thickness-thick{stroke-width:3.5px}#mermaid-svg-rgPCJmG1Ll2M9tez .edge-pattern-solid{stroke-dasharray:0}#mermaid-svg-rgPCJmG1Ll2M9tez .edge-pattern-dashed{stroke-dasharray:3}#mermaid-svg-rgPCJmG1Ll2M9tez .edge-pattern-dotted{stroke-dasharray:2}#mermaid-svg-rgPCJmG1Ll2M9tez .marker{fill:#333}#mermaid-svg-rgPCJmG1Ll2M9tez .marker.cross{stroke:#333}:root { --mermaid-font-family: "trebuchet ms", verdana, arial;}#mermaid-svg-rgPCJmG1Ll2M9tez {color: rgba(0, 0, 0, 0.75);font: ;}

mem操作COMP
目 录
Contents
mem数组
初步测试
测试CRV
总 结
存在问题
实验程序

§01 mem操作COMP


一、mem数组

  在MicroPython中存在一组数组可以直接访问MCU的内存,这组数组为:

  • mem32
  • mem16
  • mem8

  它们分别通过4字节,2字节,1字节访问MCU的RAM空间。使用他们可以按照 list的模式进行访问MCU内部的RAM。 对于mem32[addr]中的地址参数addr必须是4的整数倍数,mem16的地址参数则必须是2的整数倍数,mem8没有限制。

1、mem数组作用

  前期,分别通过mem数字完成了对于MicroPython中的一些模块寄存器的访问。

  • 通过mem函数在MicroPython中访问模块寄存器
  • MM32F3277 MicroPython的 mem 函数对于MCU内存访问

  通过实验可以看到,使用mem完成对于内存操作,可以在一定程度上加快运行速度,但是速度提高并不明显。

  尽管如此,对于MicroPython内核中没有支持的功能,通过mem数组访问可以完成MCU内部的模块的操作。比如对于其中的CRC,UART,GPIO的直接操作。

  下面,对于MM32F3277内部的模拟比较器COMP模块进行直接访问。

2、COMP模块

(1)COMP时钟

  在MM32F3277内部具有两个模拟比较器,COMP1,COMP2,它们挂载在内部APB2上。

▲ 图1.1.1 COMP1,2 时钟

  COMP的输入时钟与APB2_CLK同步。在使用比较器之前,要先使能RCC控制器中的时钟使能控制位。配置RCC控制器中的软件复位请求可进行软件复位操作。

▲ 图1.1.2 APB2 中的COMP1,2使能


/// @brief RCC Base Address Definition

#define RCC_BASE                        (AHBPERIPH_BASE + 0x1000)               ///< Base Address: 0x40021000
/// @brief RCC Register Structure Definition

typedef struct {__IO u32 CR;                                                                ///< Control Register                               offset: 0x00__IO u32 CFGR;                                                              ///< Configuration Register                         offset: 0x04__IO u32 CIR;                                                               ///< Clock Interrupt Register                       offset: 0x08__IO u32 AHB3RSTR;                                                          ///< Advanced High Performance Bus 3 Reset Register offset: 0x0C__IO u32 AHB2RSTR;                                                          ///< Advanced High Performance Bus 2 Reset Register offset: 0x10__IO u32 AHBRSTR;                                                           ///<  Advanced High Performance Bus 1 Reset Register  offset: 0x14__IO u32 APB2RSTR;                                                          ///< Advanced Peripheral Bus 2 Reset Register      offset: 0x18__IO u32 APB1RSTR;                                                          ///< Advanced Peripheral Bus 1 Reset Register      offset: 0x1C__IO u32 AHB3ENR;                                                           ///< Advanced High Performance Bus 3 Enable Register  offset: 0x20__IO u32 AHB2ENR;                                                           ///< Advanced High Performance Bus 2 Enable Register  offset: 0x24union {__IO u32 AHBENR;                                                        ///< Advanced High Performance Bus 1 Enable Register  offset: 0x28__IO u32 AHB1ENR;};__IO u32 APB2ENR;                                                           ///< Advanced Peripheral Bus 2 Enable Register      offset: 0x2C__IO u32 APB1ENR;                                                           ///< Advanced Peripheral Bus 1 Enable Register      offset: 0x30__IO u32 BDCR;                                                              ///< Backup Domain Control Register                  offset: 0x34__IO u32 CSR;                                                               ///< Control Status Register                         offset: 0x38__IO u32 SYSCFGR;                                                           ///< System Configuration Register                   offset: 0x3C__IO u32 CFGR2;                                                             ///< System Configuration Register                  offset: 0x40__IO u32 ICSCR;                                                             ///< Internal clock source calibration register     offset: 0x44__IO u32 PLLCFGR;                                                           ///< PLL configures registers                       offset: 0x48u32 Reserved1[13];                                                          ///< Reserved space__IO u32 HSIDLY;                                                            ///< HSI delay register                             offset: 0x80__IO u32 HSEDLY;                                                            ///< HSE delay register                             offset: 0x84__IO u32 PLLDLY;                                                            ///< PLL delay register                             offset: 0x88
} RCC_TypeDef;

  对于RCC中的APB2的地址为:

RCC_BASE = 0x40021000
APB2ENR = 11*4
APB1ENR = 12*4

(2)COMP BASE


/// @brief COMP Base Address Definition

#define COMP_BASE                       (APB2PERIPH_BASE + 0x4000)              ///< Base Address: 0x40014000
/// @brief Comparators Register Structure Definition

typedef struct {__IO u32 RESERVED1;                                                         ///<                                                offset: 0x00__IO u32 RESERVED2;                                                         ///<                                                offset: 0x04__IO u32 RESERVED3;                                                         ///<                                                offset: 0x08union {__IO u32 CSR1;                                                          ///< COMP1 Control Status Register                  offset: 0x0C__IO u32 COMP1_CSR;};union {__IO u32 CSR2;                                                          ///< COMP2 Control Status Register                  offset: 0x10__IO u32 COMP2_CSR;};__IO u32 RESERVED4;                                                         ///<                                                offset: 0x14union {__IO u32 CRV;                                                           ///< COMP external reference voltage register       offset: 0x18__IO u32 COMP_CRV;};union {__IO u32 POLL1;                                                         ///< COMP1 polling register                         offset: 0x1C__IO u32 COMP1_POLL;};union {__IO u32 POLL2;                                                         ///< COMP2 polling register                         offset: 0x20__IO u32 COMP2_POLL;};
} COMP_TypeDef;

  注意到,上述结构定义中,对于比较器的地址与数据手册上的定义不一样!

▲ 图1.1.3 数据手册上的寄存器地址

(3)功能框图

  如下是MM32F3277数据手册上的COMP1,2功能框图。

▲ 图1.1.4 COMP1,2功能框图

  通过系统框图可以看到,两个模拟比较器的INP可以选择: PA[0], PA[1],PA[2],PA[3]

  INM可以输入:CRV,PA[0]/PA[2], PA[5],PA[4]

二、初步测试

1、时钟操作

(1)基本操作

from machine                import Pin,mem32
import utime
from micropython            import constRCC_BASE    = const(0x40021000)
APB2ENR     = const(RCC_BASE+11*4)
APB1ENR     = const(RCC_BASE+12*4)print('%08x'%mem32[APB2ENR])
print('%08x'%mem32[APB1ENR])

  输出结果:

00000113
10000036

▲ 图1.2.1 APB2时钟允许位置

▲ 图1.2.2 APB1时钟允许位

(2)增加UART2

  增加了一个对于UART2初始化。

uart2 = UART(1, 115200)print('%08x'%mem32[APB2ENR])
print('%08x'%mem32[APB1ENR])

  程序运行结果:

00000113
10020036

  可以看到对应的APB1中的多了对应的UART2的初始化。

▲ 图1.2.3 APB1时钟允许位置

(3)允许COMP1,2

RCC_BASE    = const(0x40021000)
APB2ENR     = const(RCC_BASE+11*4)
APB1ENR     = const(RCC_BASE+12*4)mem32[APB2ENR] |= 0x8000print('%08x'%mem32[APB2ENR])
print('%08x'%mem32[APB1ENR])

  运行的结果为:

00008113
10020036

  此时对应COMP1,2时钟被允许。

2、COMP寄存器

▲ 图1.2.4 控制寄存器

(1)读取初始值

COMP_BASE = const(0x40014000)
COMP_CSR1 = const(COMP_BASE+0xc)
COMP_CSR2 = const(COMP_BASE+0x10)
COMP_CRV  = const(COMP_BASE+0x18)
COMP_POLL1 = const(COMP_BASE+0x1c)
COMP_POLL2 = const(COMP_BASE+0x20)print('%08x'%mem32[COMP_CSR1])
print('%08x'%mem32[COMP_CSR2])
print('%08x'%mem32[COMP_CRV])
print('%08x'%mem32[COMP_POLL1])
print('%08x'%mem32[COMP_POLL2])

  初始的值:

00000000
00000000
00000000
00000000
00000000

(2)使能COMP12

mem32[COMP_CSR1] |= 0x1
mem32[COMP_CSR2] |= 0x1
print('%08x'%mem32[COMP_CSR1])
print('%08x'%mem32[COMP_CSR2])
00000001
40000001

  比较奇怪的是,现在两个比较器的设置都是一样的,但是它们的OUT却不一致!

3、设置外部电压

(1)分别将PA0,PA4置成高低电平

▲ 图1.2.5 将PA0

  输出结果:

40000001
40000001

(2)分别将PA0,PA4置成低、高电平

  输出结果:

00000001
00000001

  以上在CSR中的OUT位置反映的结果是外部电压变化的结果。

4、COMP输出信号

  通过COMP内部结构,可以看到OUT的输出管脚对应PA[6]/PA[2]。但是在CSR控制OUT_SEL中并没有给出输出到PA6,PA2的选项。

▲ 图1.2.6 输出选择控制

  下面只能通过软件来测试。

  通过软件对于OUT_SEL设置从0 ~ 15,但是对应的PA6,没有任何变化。无论检测OUT如何声明:

out = Pin('PA6', Pin.AF_PUSHPULL)

三、测试CRV

  将比较器的INM的输入设置为CRV,可以将比较器的负输入端设置为内部参考电压。

1、寄存器设置

mem32[COMP_CSR1] = (0x1 | 0x30)
mem32[COMP_CSR2] = (0x1 | 0x30)
mem32[COMP_CRV]  = (0x3F)
print('%08x'%mem32[COMP_CSR1])
print('%08x'%mem32[COMP_CSR2])
print('%08x'%mem32[COMP_CRV])

  此时对应的:

  • SRV-SRC: 1 : 对应VDDA;
  • CRV_EN: 为1:,使能参考电压。

  如果设置PA0为3.3V,此时输出为:

40000031
40000031
0000003f

  如果设置PA0为0V,此时输出为:

00000031
00000031
0000003f

  这说明比较器大体工作正常。

2、设置PA0位1/2 VCC

  通过电位器设置PA0为1.66V。

▲ 图1.3.1 使用电位器将PA0设置为1.66V

(1)设置CRV

  陆续设置CRV从0 ~ 0xf,分别读出OUT的值。

for i in range(16):mem32[COMP_CRV] = 0x30 | iprint('%d, %08x'%(i, mem32[COMP_CSR1]))

(2)测试结果

0, 40000031
1, 40000031
2, 40000031
3, 40000031
4, 40000031
5, 40000031
6, 40000031
7, 40000031
8, 40000031
9, 00000031
10, 00000031
11, 00000031
12, 00000031
13, 00000031
14, 00000031
15, 00000031

  可以看到此时,对应的CRV在8 至9 之间发生了转变。此时它们分别对应:

  • 9/20×VDDA = 1.484V
  • 10/20×VDDA=1.65V
      这的确是在设置中电电位附近。

3、设置PA0为2V

  使用电位器设置PA0位2V。运行上面程序,输出为:

0, 40000031
1, 40000031
2, 40000031
3, 40000031
4, 40000031
5, 40000031
6, 40000031
7, 40000031
8, 40000031
9, 40000031
10, 40000031
11, 00000031
12, 00000031
13, 00000031
14, 00000031
15, 00000031

※ 总  结 ※


  通过MicroPython中的数组mem对于MM32F3277内部的模拟比较器进行初步测试,验证了它的最基本的设置和工作关系。

  测试过程中也发现了MM32F3277的数据手册与对应的内部功能方面的问题:对于寄存器偏移量描述错误,以及对于比较器的输出端口如何选择的问题。

一、存在问题

1、比较器偏移量

  在数据手册 29.5 比较器寄存器描述中,对于CSR的Offset描述是错误的。

▲ 图2.1.1 数据手册中对于COMP偏移量描述错误

2、比较器输出

  手册中,对于比较器的输出为PA6,PA2,可是如何能够设置。现在无法测试到这个输出信号。

▲ 图2.1.3 如何能够设置比较器的输出为PA6,PA2

■ 实验程序

#!/usr/local/bin/python
# -*- coding: gbk -*-
#============================================================
# TEST1.PY                     -- by Dr. ZhuoQing 2021-12-05
#
# Note:
#============================================================from machine                import Pin,mem32,UART
import utime
from micropython            import const#------------------------------------------------------------
led = Pin('PB2', Pin.OUT_PUSHPULL)
out1 = Pin('PA6', Pin.AF_PUSHPULL)
out1 = Pin('PA2', Pin.AF_PUSHPULL)#------------------------------------------------------------
RCC_BASE    = const(0x40021000)
APB2ENR     = const(RCC_BASE+11*4)
APB1ENR     = const(RCC_BASE+12*4)mem32[APB2ENR] |= 0x8000#print('%08x'%mem32[APB2ENR])
#print('%08x'%mem32[APB1ENR])#------------------------------------------------------------COMP_BASE = const(0x40014000)
COMP_CSR1 = const(COMP_BASE+0xc)
COMP_CSR2 = const(COMP_BASE+0x10)
COMP_CRV  = const(COMP_BASE+0x18)
COMP_POLL1 = const(COMP_BASE+0x1c)
COMP_POLL2 = const(COMP_BASE+0x20)#print('%08x'%mem32[COMP_CSR1])
#print('%08x'%mem32[COMP_CSR2])
#print('%08x'%mem32[COMP_CRV])
#print('%08x'%mem32[COMP_POLL1])
#print('%08x'%mem32[COMP_POLL2])#------------------------------------------------------------
mem32[COMP_CSR1] = (0x1 | 0x30)
mem32[COMP_CSR2] = (0x1 | 0x30)
mem32[COMP_CRV]  = (0x3F)
#print('%08x'%mem32[COMP_CSR1])
#print('%08x'%mem32[COMP_CSR2])
#print('%08x'%mem32[COMP_CRV])#------------------------------------------------------------
for i in range(16):mem32[COMP_CRV] = 0x30 | iprint('%d, %08x'%(i, mem32[COMP_CSR1]))while True:led.high()utime.sleep_ms(50)led.low()utime.sleep_ms(50)#------------------------------------------------------------
#        END OF FILE : TEST1.PY
#============================================================

■ 相关文献链接:

  • 通过mem函数在MicroPython中访问模块寄存器
  • MM32F3277 MicroPython的 mem 函数对于MCU内存访问

● 相关图表链接:

  • 图1.1.1 COMP1,2 时钟
  • 图1.1.2 APB2 中的COMP1,2使能
  • 图1.1.3 数据手册上的寄存器地址
  • 图1.1.4 COMP1,2功能框图
  • 图1.2.1 APB2时钟允许位置
  • 图1.2.2 APB1时钟允许位
  • 图1.2.3 APB1时钟允许位置
  • 图1.2.4 控制寄存器
  • 图1.2.5 将PA0
  • 图1.2.6 输出选择控制
  • 图1.3.1 使用电位器将PA0设置为1.66V
  • 图2.1.2 数据手册描述错误
  • 图2.1.3 如何能够设置比较器的输出为PA6,PA2

利用mem数组在MM32 MicroPython中实现COMP的功能相关推荐

  1. 利用mem数组完成MM32 的 MicroPython中UART1的(REPL)的交互

    简 介: 利用了UART中的CSR的RXVAL标志位,可以判断有新的byte从REPL中获得,通过查询该标志位,可以实现通过REPL(UART1)上位机发送的信息.进而可以提高软件调试效率.在程序中添 ...

  2. 测试MM32 MicroPython测试电路板的基本功能

    简 介: 对于来自于逐飞的MM32 MicroPython模块进行补充测试.总结了现在一些缺少的功能. 关键词: MicroPython,MM32,逐飞,灵动单片机 #mermaid-svg-JjPS ...

  3. 通过mem函数在MicroPython中访问模块寄存器

    简 介: 通过mem函数直接访问MCU内部的寄存器,可以完成一些在原来的MicroPython中内核没有实现的模块.通过测试可以看到,通过mem访问GPIO并没有明显增加访问的速度.使用mem访问CR ...

  4. 为什么在MM32中的MicroPython中无法打开二进制文件呢?

    简 介: 对于在MM32F3277的MicroPython下, 对于SD卡中的文件按照二进制方式进行读写进行测试,发现MicroPython下无法支持对于二进制文件的操作.根据现在这种测试,需要找到具 ...

  5. python去除数组缺失值_动态数组的应用,VBA中如何利用动态数组去除重复值的第二讲...

    大家好,我们今日继续讲解VBA代码解决方案的第62讲内容:在VBA中如何使用动态数组,以及利用动态数组去除重复值的方法第二部分.在上一讲中,我们讲了知识点的利用,其一是Filter函数,其二是ReDi ...

  6. c++删除数组中重复元素_在VBA中如何使用动态数组,以及利用动态数组去除重复值的方法...

    大家好,我们今日继续讲解VBA数组与字典解决方案第22讲:在VBA中如何使用动态数组,以及利用动态数组去除重复值的方法.如果文本中含有大量的重复值,此时,如果我们要剔除重复值,该怎么办?用VBA的方法 ...

  7. 这是如何更好地利用JavaScript数组的方法

    by pacdiv 由pacdiv 这是如何更好地利用JavaScript数组的方法 (Here's how you can make better use of JavaScript arrays) ...

  8. OC中的数组,常使用的函数,怎样将字符串写到文件中,将数组写到文件中

    现在我要解决的问题是什么,怎样将字符串写到文件中 NSString *str1=@"Hello World";//首先是定义一个字符串,也就是要操作的字符串 NSString *f ...

  9. php中怎么应用css文件,利用PHP怎么下载CSS文件中的图片

    利用PHP怎么下载CSS文件中的图片 发布时间:2020-12-18 16:14:49 来源:亿速云 阅读:87 作者:Leah 这篇文章给大家介绍利用PHP怎么下载CSS文件中的图片,内容非常详细, ...

最新文章

  1. Java 时间和日期类型的 Hibernate 映射
  2. web服务器(IIS)的操作步骤
  3. 雪城大学信息安全讲义 3.3 提升 Set-UID 程序的安全性
  4. cassandra——可以预料的查询,如果你的查询条件有一个是根据索引查询,那其它非索引非主键字段,可以通过加一个ALLOW FILTERING来过滤实现...
  5. window 程序报错 自动重启_好程序员web前端教程之详解JavaScript严格模式
  6. c语言网上找程序组合,C语言程序我同学说在网上下的一章一章的小说组合成一个太麻烦,于是 爱问知识人...
  7. linux socket资源耗尽,TCP的socket资源被耗尽的问题
  8. 特斯拉在华招聘太阳能和储能项目经理 屋顶光伏业务要来了?
  9. 苹果与高通联合抢占 5G!
  10. android 创建文件夹,文件需要注意的格式
  11. Java从入门到精通
  12. Android-APP 安全(六)之android取证
  13. 小众即时通信工具专项整治启动,关停“比邻”“聊聊”“密语”等9款违法App...
  14. pta新浪微博热门话题
  15. 莫列波纹(Moiré pattern)与Banding
  16. 全球与中国糖粉市场深度研究分析报告
  17. linux flash插件安装方法,Linux系统下安装Flash浏览器插件的方法
  18. 皮卡洞察报告2021版——附下载链接
  19. office 365安装包下载
  20. 中兴网络设备交换机路由器查看告警信息命令方法

热门文章

  1. 携程2019校招编程题(3)
  2. mybaits if判断进入不了
  3. Android 应用审核乱象:诈骗软件冲上排行榜首
  4. 用Docker安装Gitlab
  5. Object-C 如何把一个时间戳转换为一个标准的时间格式?
  6. CCRD_TOC_2008年第6期
  7. 从MyEclipse到IntelliJ IDEA ——让你脱键盘,全键盘操作
  8. jquery ajax return值不能取得的解决方案
  9. CCNP ONT LAB之PQ WFQ
  10. 回滚 - 每天5分钟玩转 Docker 容器技术(141)