简 介: 通过mem函数直接访问MCU内部的寄存器,可以完成一些在原来的MicroPython中内核没有实现的模块。通过测试可以看到,通过mem访问GPIO并没有明显增加访问的速度。使用mem访问CRC,验证了它的工作机制,但对比Online CRC计算结果发现他们之间存在差异。对于UART的访问,可以获得UART1,作为REPL接收可以直接读取来自于RDR中的内容。

关键词memMM32CRCUART

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

mem操作模块
目 录
Contents
为什么使用mem函数?
操作GPIO
CRC计算
基本测试
UART访问
读取UART1接收数据寄存器
测试总结

§01 mem操作模块


一、为什么使用mem函数?

  在博文 MM32F3277 MicroPython的 mem 函数对于MCU内存访问 测试了利用MicroPython中的mem函数直接访问MCU的 Flash, RAM, 内部特殊寄存器等。最初使用mem来直接访问和操作MCU的寄存器的目的是希望能够加快运行。下面将会通过一些特定的实验来检查这方面的差异。

二、操作GPIO

1、使用Pin操作

(1)测试代码

from machine                import Pin,mem32,mem16
import utimeprint("Test IO operating.")pin0 = Pin('PA0', Pin.OUT_PUSHPULL)
led  = Pin('PB2', Pin.OUT_PUSHPULL)while True:pin0(1)pin0(0)

(2)测试结果

  测量PA0的波形如下图所示。 对应的频率为24.31kHz。

▲ 图1.2.1 测量PA0的波形与频率

(3)使用函数high,low

  使用high(), low() 函数改变GPIO。

while True:pin0.high()pin0.low()

  PA0的波形如下图所示。对应的频率为:20.78kHz。

▲ 图1.2.2 测量PA0的波形和频率

2、使用mem操作

(1)测试代码

from machine                import Pin,mem32,mem16
import utime
from micropython            import constprint("Test IO operating.")pin0 = Pin('PA0', Pin.OUT_PUSHPULL)
led  = Pin('PB2', Pin.OUT_PUSHPULL)AHBPERIPH_BASE  = const(0x40020000)GPIOA_BASE    = const(AHBPERIPH_BASE + 0x0020000)
GPIOB_BASE    = const(AHBPERIPH_BASE + 0x0020400)
GPIOC_BASE    = const(AHBPERIPH_BASE + 0x0020800)
GPIOD_BASE    = const(AHBPERIPH_BASE + 0x0020C00)
GPIOE_BASE    = const(AHBPERIPH_BASE + 0x0021000)
GPIOF_BASE    = const(AHBPERIPH_BASE + 0x0021400)
GPIOG_BASE    = const(AHBPERIPH_BASE + 0x0021800)
GPIOH_BASE    = const(AHBPERIPH_BASE + 0x0021C00)ODR = const(GPIOA_BASE+3*4)while True:mem32[ODR] ^= 1

(2)测试结果

  测试上述操作对应的PA0的输出方波频率:23.54kHz。

▲ 图1.2.3 PA0信号波形与频率

(3)使用幅值操作GPIO

while True:mem32[ODR] = 0mem32[ODR] = 1

  PA0的输出波形与频率如下图所示。

▲ 图1.2.4 PA0的波形与频率

■ 测试结论

  通过上面测试,可以看到使用mem访问GPIO进行操作,实际上比起直接使用Pin的函数并没有快多少。

§02 CRC计算


一、基本测试

1、测试程序

from machine                import mem32
import utime
from micropython            import constAHBPERIPH_BASE  = const(0x40020000)
CRC_BASE        = const(AHBPERIPH_BASE + 0x3000)
CRC_DR      = const(CRC_BASE + 0)   # CRC data register
CRC_IDR     = const(CRC_BASE + 4)   # CRC independent data register
CRC_CR      = const(CRC_BASE + 8)   # CRC control register
CRC_MIR     = const(CRC_BASE + 12)  # Middle data registerRCC_BASE    = const(AHBPERIPH_BASE + 0x1000)
RCC_AHB1    = const(RCC_BASE+10*4)
mem32[RCC_AHB1] |= 0x1000           # Enable CRC clockmem32[CRC_CR] = 0x1                 # Reset CRC
print('CRC CR: %08x'%mem32[CRC_CR])
print('CRC DR: %08x'%mem32[CRC_DR])mem32[CRC_DR] = 1
mem32[CRC_DR] = 2
print('CRC DR: %08x'%mem32[CRC_DR])         # Caculate the CRCmem32[CRC_DR] = mem32[CRC_DR]       # Check CRC
print('CRC DR: %08x'%mem32[CRC_DR])

2、测试结果

CRC CR: 00000000
CRC DR: -0000001
CRC DR: 298be7ba
CRC DR: 00000000

  可以看到对于1,2 进行CRC计算之后,如果重新将CRC结果输入到DR,最终可以得到输出的DR为0。

▲ 图2.1.1 CRC 控制寄存器的定义

  通过测试,发现CRC_BITSEL只能选择00,对应32位,最终的CRC校验才能够归零。至于为什么,现在不清楚。

3、Online CRC计算

  在 CRCCALC 中给出了在线的CRC计算。通过它的计算对比MM32的计算结果。

▲ 图2.1.2 在线Online CRC 计算

  通过测试,发现通过Online的计算结果与MM32计算的结果没有能够对应上。

  x32 + x26 + x23 + x22 + x16 + x12 + x11 + x10 + x8 + x7 + x5 + x4 + x2 + x + 1

§03 UART访问


  由于现在MicroPython不提供对于UART1的接受访问,这个端口用于REPL。 那么是否可以通过mem直接访问呢?

一、读取UART1接收数据寄存器

1、读取数据寄存器

from machine                import Pin,mem32
import utime
from micropython            import constAPB2PERIPH_BASE = const(0x40010000)
APB1PERIPH_BASE = const(0x40000000)UART1_BASE    = const(APB2PERIPH_BASE + 0x3800)
UART2_BASE    = const(APB1PERIPH_BASE + 0x4400)
UART3_BASE    = const(APB1PERIPH_BASE + 0x4800)
UART4_BASE    = const(APB1PERIPH_BASE + 0x4C00)
UART5_BASE    = const(APB1PERIPH_BASE + 0x5000)
UART6_BASE    = const(APB2PERIPH_BASE + 0x3C00)
UART7_BASE    = const(APB1PERIPH_BASE + 0x7800)
UART8_BASE    = const(APB1PERIPH_BASE + 0x7C00)UART1_RDR       = const(UART1_BASE + 1*4)print("Test UART.")while True:print("%08x"%mem32[UART1_RDR])utime.sleep_ms(250)

  输出的结果为:就是刚刚输入的字符结果。

2、使用UART1

print("Test UART.")uart1 = UART(0,115200)
print(dir(uart1))oldany = uart1.any()while True:if uart1.any() != oldany:oldany = uart1.any()print("%c"%mem32[UART1_RDR])utime.sleep_ms(20)

  通过测试,发现:

  • UART1 无法使用 uart.read() : 这个函数应该放开;
  • UART1只能够接收到有限个字符,希望能够扩展到128个字符。

※ 测试总结 ※


  通过mem函数直接访问MCU内部的寄存器,可以完成一些在原来的MicroPython中内核没有实现的模块。通过测试可以看到,通过mem访问GPIO并没有明显增加访问的速度。使用mem访问CRC,验证了它的工作机制,但对比Online CRC计算结果发现他们之间存在差异。

  对于UART的访问,可以获得UART1,作为REPL接收可以直接读取来自于RDR中的内容。


■ 相关文献链接:

  • MM32F3277 MicroPython的 mem 函数对于MCU内存访问
  • CRCCALC

● 相关图表链接:

  • 图1.2.1 测量PA0的波形与频率
  • 图1.2.2 测量PA0的波形和频率
  • 图1.2.3 PA0信号波形与频率
  • 图1.2.4 PA0的波形与频率
  • 图2.1.1 CRC 控制寄存器的定义
  • 图2.1.2 在线Online CRC 计算

通过mem函数在MicroPython中访问模块寄存器相关推荐

  1. MicroPython中I2C模块的设计与实现(1) - machine_i2c框架的机制

    MicroPython中I2C模块的设计与实现(1) - machine_i2c框架的机制 苏勇,2022年3月 文章目录 MicroPython中I2C模块的设计与实现(1) - machine_i ...

  2. MM32F3277 MicroPython的 mem 函数对于MCU内存访问

    简 介: 通过mem32,mem16,mem8可以使得MicroPython向访问数字一样访问MCU中的任意内存.在ARM模型下,所有的寄存器都是基于RAM地址访问,所以原则上,可以通过memxx编程 ...

  3. pythonserial函数_python3.5 中serial模块的问题

    在python3.5中使用serial模块进行串口通信,通过while 1循环进行持续性的设备通信,但是第一个设备完成之后对下一个设备进行通信会有问题:Attempting to use a port ...

  4. python isalpha函数用法_python中string模块各属性以及函数的用法

    任何语言都离不开字符,那就会涉及对字符的操作,尤其是脚本语言更是频繁,不管是生产环境还是面试考验都要面对字符串的操作. python的字符串操作通过2部分的方法函数基本上就可以解决所有的字符串操作需求 ...

  5. python中time函数用法_python 中time模块使用

    在开始之前,首先要说明这几点: 1.在Python中,通常有这几种方式来表示时间:1)时间戳 2)格式化的时间字符串 3)元组(struct_time)共九个元素.由于Python的time模块实现主 ...

  6. linux用户空间寄存器,在Linux用户空间中访问硬件寄存器

    我想写Linux用户空间中OMAP3530上的硬件寄存器.请找到下面的代码. Mmap返回错误: 内存映射失败.错误-1 mmap:权限被拒绝 #include #include #include # ...

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

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

  8. 利用mem数组在MM32 MicroPython中实现COMP的功能

    简 介: 通过MicroPython中的数组mem对于MM32F3277内部的模拟比较器进行初步测试,验证了它的最基本的设置和工作关系.测试过程中也发现了MM32F3277的数据手册与对应的内部功能方 ...

  9. 21 Python模块、import语句、搜索路径、变量、命名空间和作用域、dir函数、globals()和locals()函数、reload()函数、Python中的包

    21Python模块 Python 模块(Module),是一个 Python 文件,以 .py 结尾,包含了 Python 对象定义和Python语句. 模块让你能够有逻辑地组织你的 Python ...

最新文章

  1. Swift 换肤方案的实现使用SwiftTheme框架
  2. linux nfs如何配置,Linux上的NFS如何配置?
  3. 004_URL 路由 - 对磁盘文件的请求进行路由
  4. 财富第三极人类社会运行模型(附路线图)
  5. 『爬虫四步走』手把手教你使用Python抓取并存储网页数据!
  6. java web开发常用标签
  7. 给windows 98 客户虚拟机安装VMWare tools
  8. Mybatis代码生成适配Oracle和Mysql数据库_01
  9. html判断ie6,jquery如何判断是否是ie?
  10. C语言丨线性表(二):线性链表(单链表)
  11. 诺基亚造平板到底前途几何?
  12. [terry笔记]Oracle10g/11g安装-redhat5.5
  13. 6.5版本虚拟机的封装
  14. 学科前沿技术专题结课作业
  15. linux环境下的多线程编程(一)
  16. linux-uboot 移植四 uboot的移植
  17. xdb 服务_如何禁用Oracle的XDB及修改XDB服务端口
  18. brew mysql_brew mysql
  19. Houdini学习 —— 使用VOP进行陨石坑效果制作
  20. 基于Gstreamer和大疆OSDK4.0视频h264接口推流

热门文章

  1. python_bomb----函数高级特性(生成器)
  2. 用Xamarin.Forms创建移动应用程序
  3. 导入自定义模块model
  4. R的一些统计分析包工具
  5. 金山手机安全卫士试用报告
  6. 显示ip的img的url
  7. 《Akka应用模式:分布式应用程序设计实践指南》读书笔记1
  8. 云计算服务需求促进边缘计算的应用与发展
  9. python pip 自动补全
  10. 静态类和非静态类中静态变量