简 介: 通过mem函数直接访问MCU内部的寄存器,可以完成一些在原来的MicroPython中内核没有实现的模块。通过测试可以看到,通过mem访问GPIO并没有明显增加访问的速度。使用mem访问CRC,验证了它的工作机制,但对比Online CRC计算结果发现他们之间存在差异。对于UART的访问,可以获得UART1,作为REPL接收可以直接读取来自于RDR中的内容。
关键词
: mem,MM32,CRC,UART
#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中访问模块寄存器相关推荐
- MicroPython中I2C模块的设计与实现(1) - machine_i2c框架的机制
MicroPython中I2C模块的设计与实现(1) - machine_i2c框架的机制 苏勇,2022年3月 文章目录 MicroPython中I2C模块的设计与实现(1) - machine_i ...
- MM32F3277 MicroPython的 mem 函数对于MCU内存访问
简 介: 通过mem32,mem16,mem8可以使得MicroPython向访问数字一样访问MCU中的任意内存.在ARM模型下,所有的寄存器都是基于RAM地址访问,所以原则上,可以通过memxx编程 ...
- pythonserial函数_python3.5 中serial模块的问题
在python3.5中使用serial模块进行串口通信,通过while 1循环进行持续性的设备通信,但是第一个设备完成之后对下一个设备进行通信会有问题:Attempting to use a port ...
- python isalpha函数用法_python中string模块各属性以及函数的用法
任何语言都离不开字符,那就会涉及对字符的操作,尤其是脚本语言更是频繁,不管是生产环境还是面试考验都要面对字符串的操作. python的字符串操作通过2部分的方法函数基本上就可以解决所有的字符串操作需求 ...
- python中time函数用法_python 中time模块使用
在开始之前,首先要说明这几点: 1.在Python中,通常有这几种方式来表示时间:1)时间戳 2)格式化的时间字符串 3)元组(struct_time)共九个元素.由于Python的time模块实现主 ...
- linux用户空间寄存器,在Linux用户空间中访问硬件寄存器
我想写Linux用户空间中OMAP3530上的硬件寄存器.请找到下面的代码. Mmap返回错误: 内存映射失败.错误-1 mmap:权限被拒绝 #include #include #include # ...
- 利用mem数组完成MM32 的 MicroPython中UART1的(REPL)的交互
简 介: 利用了UART中的CSR的RXVAL标志位,可以判断有新的byte从REPL中获得,通过查询该标志位,可以实现通过REPL(UART1)上位机发送的信息.进而可以提高软件调试效率.在程序中添 ...
- 利用mem数组在MM32 MicroPython中实现COMP的功能
简 介: 通过MicroPython中的数组mem对于MM32F3277内部的模拟比较器进行初步测试,验证了它的最基本的设置和工作关系.测试过程中也发现了MM32F3277的数据手册与对应的内部功能方 ...
- 21 Python模块、import语句、搜索路径、变量、命名空间和作用域、dir函数、globals()和locals()函数、reload()函数、Python中的包
21Python模块 Python 模块(Module),是一个 Python 文件,以 .py 结尾,包含了 Python 对象定义和Python语句. 模块让你能够有逻辑地组织你的 Python ...
最新文章
- Swift 换肤方案的实现使用SwiftTheme框架
- linux nfs如何配置,Linux上的NFS如何配置?
- 004_URL 路由 - 对磁盘文件的请求进行路由
- 财富第三极人类社会运行模型(附路线图)
- 『爬虫四步走』手把手教你使用Python抓取并存储网页数据!
- java web开发常用标签
- 给windows 98 客户虚拟机安装VMWare tools
- Mybatis代码生成适配Oracle和Mysql数据库_01
- html判断ie6,jquery如何判断是否是ie?
- C语言丨线性表(二):线性链表(单链表)
- 诺基亚造平板到底前途几何?
- [terry笔记]Oracle10g/11g安装-redhat5.5
- 6.5版本虚拟机的封装
- 学科前沿技术专题结课作业
- linux环境下的多线程编程(一)
- linux-uboot 移植四 uboot的移植
- xdb 服务_如何禁用Oracle的XDB及修改XDB服务端口
- brew mysql_brew mysql
- Houdini学习 —— 使用VOP进行陨石坑效果制作
- 基于Gstreamer和大疆OSDK4.0视频h264接口推流
热门文章
- python_bomb----函数高级特性(生成器)
- 用Xamarin.Forms创建移动应用程序
- 导入自定义模块model
- R的一些统计分析包工具
- 金山手机安全卫士试用报告
- 显示ip的img的url
- 《Akka应用模式:分布式应用程序设计实践指南》读书笔记1
- 云计算服务需求促进边缘计算的应用与发展
- python pip 自动补全
- 静态类和非静态类中静态变量