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

关键词memREPLRXVAL

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

mem访问REPL
目 录
Contents
基本想法
初步测试
UART1的交互
测试其他模块
测试APA102C
测试DAC
测试总结

§01 mem访问REPL


  在 通过mem函数在MicroPython中访问模块寄存器 可以实现对UART1,也就是用于MicroPython REPL 的串口输入的访问,但很可惜,无法对于发送过来的字符进行同步。下面希望通过特殊的交换协议来完成对于UART的输入信息的读取同步。

一、基本想法

  由于无法确定现在UART1的输入寄存器是否被更新,所以可以采用一下两个方式:

  • 第一个方式,就是把读入的UART1的接收寄存器修改成与当前值不同的数据,后面在进行判断;
  • 第二中方式,就是使用特殊的分隔符号,比如0x0,作为分隔符号,没两次0x0之间为新的数据;
  • 第三种方式:通过UART_CSR,当前状态寄存器来确定是否接收到了字符。

  由于在MicroPython中最快的轮询的时间间隔为1ms,所以对于从PC发送的机制,也需要保证每个字符之间的时间间隔大于1ms。

二、初步测试

1、测试修改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)
UART1_RDR       = const(UART1_BASE + 1*4)print("Test UART.")mem32[UART1_RDR] = 0xffwhile True:mem32[UART1_RDR] = 0xffprint("%08x"%mem32[UART1_RDR])utime.sleep_ms(250)

(2)测试结果

  读取的mem32[UART1_RDR] 仍然是 0x4,与写入的字符无关。因此可以知道,UART1的RDR是无法被改写的。

  下面是数据手册中表明RXREG为只读。

▲ 图1.2.1 MM32F3277的UART 的 RDR为只读

2、测试CSR寄存器

  利用UART_CSR中的RXAVL来判断是否接收到字符。

▲ 图1.2.2 MM32F3277 UART_CSR功能定义

(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)
UART1_RDR     = const(UART1_BASE + 1*4)
UART1_CSR     = const(UART1_BASE + 2*4)print("Test UART.")mem32[UART1_RDR] = 0xffwhile True:if (mem32[UART1_CSR] & 0x2):print("%c"%mem32[UART1_RDR])utime.sleep_ms(10)

(2)测试结果

▲ 图1.2.3 可以接收到字符

三、UART1的交互

1、交互程序

  下面是交互程序,是将UART1接收到的字符转换成整型数字显示出来。

from machine                import Pin,mem32
import utime
from micropython            import constAPB2PERIPH_BASE = const(0x40010000)
UART1_BASE    = const(APB2PERIPH_BASE + 0x3800)
UART1_RDR     = const(UART1_BASE + 1*4)
UART1_CSR     = const(UART1_BASE + 2*4)print("Test UART.")replbuf = bytes(0)
def procREPL():global replbufif mem32[UART1_CSR] & 0x2:replbuf += bytes([mem32[UART1_RDR]])if replbuf[-1:] == b'\r':print(int(replbuf[:-1]))replbuf = bytes(0)while True:procREPL()utime.sleep_ms(10)

  测试结果,上述命令是可以正常运行。

2、改在STM32 Bootloader

  由于在MicroPython中对于UART1的轮询最快是1ms,所以在STM32 Bootloader中增加一个发送字符间隔为1ms的命令。

(1)增加SNDCD命令

if(strncmp(szString, "SNDCD", 5) == 0) {int nLength = strlen(szString);int i;for(i = 5; i < nLength; i ++) {SendChar(szString[i], PORT1);Sleep(1);}return;
}

(2)测试SNDCD

 Ⅰ.MicroPython程序
#------------------------------------------------------------
replbuf = bytes(0)
def procREPL():global replbufif mem32[UART1_CSR] & 0x2:replbuf += bytes([mem32[UART1_RDR]])if replbuf[-1:] == b'\r':print(int(replbuf[:-1]))replbuf = bytes(0)#------------------------------------------------------------
while True:procREPL()utime.sleep_ms(1)
 Ⅱ.测试结果
  • 使用"SENDC100\r" 无法获得结果;
  • 使用“SNDCD100\r” 可以正常显示100的结果。

3、加快轮询

  如果在 while程序中,将1ms的等待去除,可以加快轮询的速度。

while True:procREPL()
#    utime.sleep_ms(1)

  通过测试可以看到无论使用 “SENDC”,还是“SNDCD”命令,都可以正常获得测试结果。

§02 测试其他模块


from machine                import UART,mem32
from micropython            import constAPB2PERIPH_BASE = const(0x40010000)
UART1_BASE    = const(APB2PERIPH_BASE + 0x3800)
UART1_RDR     = const(UART1_BASE + 1*4)
UART1_CSR     = const(UART1_BASE + 2*4)replbuf = bytes(0)
def procREPL(f):global replbufif mem32[UART1_CSR] & 0x2:replbuf += bytes([mem32[UART1_RDR]])if replbuf[-1:] == b'\r':f(replbuf[:-1])replbuf = bytes(0)def f(s):print(s)while True:procREPL(f)

一、测试APA102C

1、MicroPython程序

from machine                import UART,mem32,SPI
from micropython            import constfrom machine                import Pin,SPI
import utimespi = SPI(0, baudrate=100000, polarity=1, phase=1)
led = Pin('PB2', Pin.OUT_PUSHPULL)def led3buf(l1,l2,l3):'''led3buf: Construct three APA102C LED dataParam l1: LED 1 (rgb)Param l2: LED 2 (rgb)Param l3: LED 3 (rgb)Return: buf : 8+4*3=20bytess'''return bytes([0]*4) + bytes((0xff,l1[2],l1[1],l1[0])) + bytes((0xff,l2[2],l2[1],l2[0])) + bytes((0xff,l3[2],l3[1],l3[0])) + bytes([0xff]*4)def led3light(l1,l2,l3):return bytes([0]*4) + bytes((0xff,0, 0, l1)) + bytes((0xff,0,l2, 0)) + bytes((0xff,l3,0,0)) + bytes([0xff]*4)APB2PERIPH_BASE = const(0x40010000)
UART1_BASE    = const(APB2PERIPH_BASE + 0x3800)
UART1_RDR     = const(UART1_BASE + 1*4)
UART1_CSR     = const(UART1_BASE + 2*4)replbuf = bytes(0)
def procREPL(f):global replbufif mem32[UART1_CSR] & 0x2:replbuf += bytes([mem32[UART1_RDR]])if replbuf[-1:] == b'\r':f(replbuf[:-1])replbuf = bytes(0)def f(s):count1 = int(s)if count1 > 255: count1 = 255count2 = count3 = count1print(count1, count2, count3)buf = led3light(count1,count2,count3)spi.write(buf)print('Test APA102C.')while True:procREPL(f)

2、Python程序

from headm import *
from tsmodule.tsstm32       import *count = 0
while True:count += 10if count >= 255: count = 0stm32cmd('SNDCD%d\r'%count)time.sleep(.1)

3、测试结果

▲ 图2.1.1 APA102C变化亮度

二、测试DAC

1、MicroPython程序

from machine                import UART,mem32,DAC
from micropython            import constAPB2PERIPH_BASE = const(0x40010000)
UART1_BASE    = const(APB2PERIPH_BASE + 0x3800)
UART1_RDR     = const(UART1_BASE + 1*4)
UART1_CSR     = const(UART1_BASE + 2*4)dac0 = DAC(0)replbuf = bytes(0)
def procREPL(f):global replbufif mem32[UART1_CSR] & 0x2:replbuf += bytes([mem32[UART1_RDR]])if replbuf[-1:] == b'\r':f(replbuf[:-1])replbuf = bytes(0)def f(s):dac0.write_u16(int(s))while True:procREPL(f)

2、测试程序

from headm import *
from tsmodule.tsstm32       import *setv = linspace(0, 0xfff, 50)
outv = []for v in setv:vv = floor(v)stm32cmd('SNDCD%d\r'%vv)time.sleep(1.5)meter = meterval()outv.append(meter[0])printff(vv, meter[0])plt.plot(setv, outv)
plt.xlabel("Set Value")
plt.ylabel("DAC")
plt.grid(True)
plt.tight_layout()
plt.show()

3、测试结果

▲ 图2.2.1 读取DAC输出的结果

※ 测试总结 ※


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


■ 相关文献链接:

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

● 相关图表链接:

  • 图1.2.1 MM32F3277的UART 的 RDR为只读
  • 图1.2.2 MM32F3277 UART_CSR功能定义
  • 图1.2.3 可以接收到字符
  • 图2.1.1 APA102C变化亮度
  • 图2.2.1 读取DAC输出的结果

利用mem数组完成MM32 的 MicroPython中UART1的(REPL)的交互相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

  7. 每天一道LeetCode-----给定字符串s和字符数组words,在s中找到words出现的位置,words内部字符串顺序无要求

    Substring with Concatenation of All Words 原题链接Substring with Concatenation of All Words 题目意思是给定字符串s和 ...

  8. shell脚本中数组的使用_Shell脚本中的数组

    shell脚本中数组的使用 Knowing how to work with arrays in shell scripts will help you work with larger datase ...

  9. 如何利用一维数组实现二维数组的多列自由升降序排序过程详解

    如何利用一维数组实现二维数组的多列自由升降序排序过程详解 本例只说明多列排序的实现方式,一维数组的排序已经有过讲解不在赘述.所以本文是在已经完成了一维数组排序的函数封装的基础上完善多列排序的过程的详解 ...

最新文章

  1. 《jQuery Mobile入门经典》—— 2.7 练习
  2. debian apt-get 更新源文件格式说明
  3. wincc 报警记录 mysql_wincc查询历史报警记录,归档数据-工业支持中心-西门子中国...
  4. 多线程写mysql数据库_多线程读写mysql数据库
  5. 与云原生及开源大神们的第二次亲密接触 | 全议程重磅发布
  6. System.Windows.Forms.ListView
  7. vijos 1071 01背包
  8. 自动化测试用例设计方法
  9. Python将多个excel文件合并为一个文件
  10. 二元二次方程 c语言,C语言求二元二次方程组的解 我要代码 谢谢大家了
  11. LeetCode-717. 1比特与2比特字符
  12. r语言和rstudio_R和RStudio简介
  13. 集合(set) 深浅拷贝
  14. 【无标题】(2019)NOC编程猫创新编程复赛小学组真题含参考
  15. 【机器学习】PCA主成分项目实战:MNIST手写数据集分类
  16. 【Android -- 相机】Camera2 实现拍照 预览功能
  17. 【机试】判断两个数互质
  18. 【BBP 算法】HDU 6217
  19. shopify_反思构建自定义Shopify应用程序
  20. john the ripper密码破解工具

热门文章

  1. postman测试post请求
  2. 字符串分隔 -连续输入字符串,请按长度为8拆分每个字符串后输出到新的字符串数组; •长度不是8整数倍的字符串请在后面补数字0,空字符串不处理。...
  3. AngularJS 初始化加载流程
  4. web开发小记2:js触发css过渡
  5. amd64 与 ia64的区别
  6. 百度地图3.0实现图文并茂的覆盖物
  7. 对tomcat服务的***演示与安全分析
  8. 使用Redis存储Nginx+Tomcat负载均衡集群的Session
  9. 在CentOS下安装apche+tomcat+mysql+php
  10. 自定义控件详解(三):Canvas效果变换