PIO 中的赋值魔术,MOV 指令
前言
在普通编程语言中,mov 可以理解为“赋值指令”,将一个值从一个地方拷贝到另一个地方。在 RP2040 的 PIO 汇编语言中,mov 同样是数据传递的关键指令,但它操作的是 PIO 独有的几个寄存器。
在 PIO 中,你可以用 mov 把值从一个寄存器传到另一个寄存器,或者从一个常量设定某个寄存器状态。PIO 的寄存器包括:
x、y:通用寄存器
osr(Output Shift Register):主控写入 PIO 的数据在这里
isr(Input Shift Register):PIO 采集到的数据进入这里
pins:GPIO 当前状态(作为输入)
pc:程序计数器(一般不用动)
null:空目标,丢弃数据用
语法格式
mov <destination>, (op) <source>
参数 | 含义 |
---|---|
destination | 目标寄存器,如 x, y, isr, osr |
source | 来源寄存器或值,如 x, y, pins, osr, null |
op(可选) | 求反(按位求补),反转比特顺序 |
用法示例
1. 把 x 的值给 y:
mov(y, x)
用途:x 计数器计算完毕后,把值传给 y 用于下一步处理。
2. 从主控写入的 osr 中取值放到 x 中:
mov(x, osr)
用途:主控通过 .put() 写入一个值,PIO 用这个指令加载进 x。
注意:这条指令默认是阻塞的,如果 osr 没准备好,会停在这里等待。
3. 将当前引脚状态读到 isr 中:
mov(isr, pins)
用途:一次读取所有输入引脚状态(适用于并口采集等并发场景)
4. 把某个值清空:
mov(x, null)
用途:清空某个寄存器(实际作用是丢弃)
5. 将寄存器取反再传递(适用于补码或反相逻辑):
mov(x, invert(x))
用途:对信号进行反向处理,比如 PWM 输出反向控制
代码示例
from machine import Pin
from rp2 import StateMachine
import time# PIO 程序:取反 OSR 的值,送入 X 寄存器,再写入 ISR 推送出去
@rp2.asm_pio()
def not_example():pull(block) # 从主控获取数据mov(x, osr) # 把 osr 的值放入 xmov(x, invert(x)) # 对 x 按位取反mov(isr, x) # 将 x 放入 isrpush(block) # 推送 isr 值# 创建状态机
sm = StateMachine(0, not_example, freq=2000)
sm.active(1)# 发送一个测试值,比如 0xAAAAAAAA(101010...)
input_val = 0xAAAAAAAA
sm.put(input_val)
time.sleep(0.01)
result = sm.get()print(f"输入值: 0x{input_val:08X}")
print(f"取反后: 0x{result:08X}")
程序输出
输入值: 0xAAAAAAAA
取反后: 0x55555555
与 set 的区别
指令 | 特点 | 用途 |
---|---|---|
set | 设置一个寄存器为常量(立即数) | 初始化常量,如 set x, 10 |
mov | 寄存器间或从特殊寄存器传值 | 动态传值,如 mov x, osr |
结论:
-
set:静态赋值
-
mov:动态传递
总结
mov 在 PIO 中的意义远超简单的“赋值”,它是串起主控与状态机之间沟通的桥梁,是 PIO 灵活处理控制逻辑的核心指令之一。
掌握了 mov,你就能玩转:
主控数据驱动 PIO(如动态 PWM、协议适配)
多寄存器交互(如延时、复位、反向处理)
多状态机协同(配合 irq 与 mov isr/pins)
注:
测试PC(Program Counter)这个,始终返回的是0,我用的micropython是1.24版,据查询资料,可能是官方为了性能等原因考虑,没有提供该功能(pico提供,micropython未实现),未验证。
相关文章:

PIO 中的赋值魔术,MOV 指令
前言 在普通编程语言中,mov 可以理解为“赋值指令”,将一个值从一个地方拷贝到另一个地方。在 RP2040 的 PIO 汇编语言中,mov 同样是数据传递的关键指令,但它操作的是 PIO 独有的几个寄存器。 在 PIO 中,你可以用 mov …...
[docker]更新容器中镜像版本
从peccore-dev仓库拉取镜像 docker pull 10.12.135.238:8060/peccore-dev/configserver:v1.13.45如果报错,请参考docker拉取镜像失败,添加仓库地址 修改/etc/CET/Common/peccore-docker-compose.yml文件中容器的版本,为刚刚拉取的版本 # 配置中心confi…...

第十七次CCF-CSP算法(含C++源码)
第十七次CCF-CSP认证 小明种苹果AC代码 小明种苹果(续)AC代码 后面好难哈哈 小手冰凉 小明种苹果 输入输出: 题目链接 AC代码 #include<iostream> using namespace std; int n,m; int res,res3; int sum; int res21; int main(){cin …...

打造一个支持MySQL查询的MCP同步插件:Java实现
打造一个支持MySQL查询的MCP同步插件:Java实现 用Java实现一个MCP本地插件,直接通过JDBC操作本地MySQL,并通过STDIO与上层MCP客户端(例如Cursor)通信。插件注册一个名为mysql 的同步工具,接收连接参数及SQL…...

黑马k8s(十五)
1.Ingress介绍 2.Ingress使用 环境准备 Http代理 Https代理...
Axure项目实战:智慧运输平台后台管理端-订单管理1(多级交互)
亲爱的小伙伴,在您浏览之前,烦请关注一下,在此深表感谢!如有帮助请订阅专栏! Axure产品经理精品视频课已登录CSDN可点击学习https://edu.csdn.net/course/detail/40420 课程主题:订单管理 主要内容:条件组合、中继器筛选、表单跟随菜单拖动、审批数据互通等 应用场景…...

解决 cursor 中不能进入 conda 虚拟环境
【问题】 遇到一个小问题,我创建的conda 环境在 cmd、powershell中都可以激活,但在pycharm、cursor中却不能激活? 看图 cmd中正常: cursor中不正常: 【解决方法】 cursor 中,打开终端,输入&a…...
微信小程序请求扣子(coze)api的例子
1. 准备工作 在开始之前,确保已经完成了以下准备工作: 创建并发布了 Coze 智能体。获取了个人访问令牌(Personal Access Token),这是用于授权的关键凭证。确认目标智能体的 Bot ID 和其他必要参数已准备就绪。 2. 请…...

C++ 实现二叉树的后序遍历与中序遍历构建及层次遍历输出
C 实现二叉树的后序遍历与中序遍历构建及层次遍历输出 目录 C 实现二叉树的后序遍历与中序遍历构建及层次遍历输出一、实验背景与目标二、实验环境三、实验内容四、数据结构与算法数据结构算法描述1. **构建二叉树函数 buildTree**2. **层次遍历函数 LevelOrder** 关键代码与解…...
基于大模型的髋关节骨关节炎预测与治疗方案研究报告
目录 一、引言 1.1 研究背景与意义 1.2 研究目的与创新点 1.3 研究方法与技术路线 二、髋关节骨关节炎概述 2.1 疾病定义与分类 2.2 发病机制与病理过程 2.3 流行病学特征 三、大模型技术原理与应用基础 3.1 大模型的基本概念与架构 3.2 大模型在医疗领域的应用进展…...
qiankun解决的问题
qiankun 中的沙箱机制是如何实现的?解决了什么问题? 一、实现方式 qiankun 的沙箱机制主要用于隔离微应用之间的运行环境,避免相互影响。其核心实现基于两种策略: 快照沙箱(SnapshotSandbox) 适用于不支…...
JavaScript从入门到精通(一)
引言 JavaScript 是一种跨平台、面向对象的脚本语言,最初是为了给网页添加交互性而创建的。如今,JavaScript 不仅是浏览器端开发的核心技术,也广泛应用于服务器端(如 Node.js)、移动应用开发等多个领域。本教程旨在提…...
快速失败(fail-fast)和安全失败(fail-safe)的区别
在 Java 中,快速失败(Fail-Fast)和安全失败(Fail-Safe)是集合类(Collection)在迭代过程中处理并发修改的两种不同策略,二者的核心区别在于 对并发修改的感知机制与容错性…...

虚拟环境中的PyQt5 Pycharm设置参考
假如虚拟环境名是p3939 里面安装了pyqt5相关的库 1.QtDesigner Qt Designer 是通过拖拽的方式放置控件,并实时查看控件效果进行快速UI设计 位置 内容 name 可以随便命名,只要便于记忆就可以,本次采取通用…...
AI 笔记 - 模型优化 - 注意力机制在目标检测上的使用
人脸检测添加注意力机制 简介人脸检测的核心挑战与注意力机制的作用人脸检测中的注意力机制作用 选型参考基础选择(空间注意力 vs 通道注意力)空间注意力(关注“哪里”重要)通道注意力(关注“什么特征”重要࿰…...

AUTOSAR图解==>AUTOSAR_SRS_LIN
AUTOSAR LIN模块分析 目录 LIN模块概述LIN模块架构LIN通信状态流程LIN通信序列LIN配置结构总结1. LIN模块概述 本文档基于AUTOSAR规范SRS_LIN文档,对LIN(Local Interconnect Network)相关模块进行详细分析。主要包括以下几个模块: LIN接口 (LinIf)LIN驱动 (Lin)LIN传输层…...
UML 时序图 使用案例
UML 时序图 UML 时序图 (Sequence Diagram)时序图的主要元素消息类型详解时序图示例时序图绘制步骤时序图的应用场景 UML 时序图 (Sequence Diagram) 时序图是UML(统一建模语言)中用于展示对象之间交互行为的动态视图,它特别强调消息的时间顺序。 时序图的主要元素…...

华为昇腾使用ollama本地部署DeepSeek大模型
文章目录 前言一、本次使用的硬件资源二、Ollama介绍三、Ollama在arm64位的芯片的安装及使用方法总结 前言 本次打算在华为昇腾上面使用ollama进行部署DeepSeek大模型。 一、本次使用的硬件资源 存储资源 内存资源 cpu资源 二、Ollama介绍 Ollama 是一个开源的大型语言…...

多态的总结
什么是多态? 答:多态是多种形态,是为了完成某种行为时,不同对象会产生不同的形态(结合车票例子解释) 2. 什么是重载、重写(覆盖)、重定义(隐藏)? 答:重载的条件是:在同一…...

Windows 高分辨率屏幕适配指南:解决界面过小、模糊错位问题
🖥️ Windows 高分辨率屏幕适配指南:解决界面过小、模糊错位问题 摘要: 在使用高分辨率屏幕时,许多老旧的桌面软件会出现界面显示异常的问题,例如窗口过小、控件错位、文字模糊等。本文提供一套通用解决方案࿰…...
tvalid寄存器的理解
if(!out_axis_tvalid_reg || m_axis_tready ) beginend m_axis_tready 是上拍下一级给的ready信号 out_axis_tvalid_reg是上一拍,本级给下级的valid信号 一共有四种组合,然后可以通过这个if语句,在接下来的begin ... end中,用来…...
C++八股 —— 手撕定时器
文章目录 1. 什么是定时器2. 需要考虑的问题吧3. 接口设计4. 完整代码5. 性能优化 来自:腾讯百度C二面:手撕定时器_哔哩哔哩_bilibili 腾讯、网易、百度C: 手撕定时器 相关概念参考: C八股——函数对象、Lambda、bind、functi…...

K8S-statefulset-mysql-ha
需求 实现一个HA mysql,包括1个master,2个slave。在K8S上已statefulset部署。 mysql HA原理 略 K8S环境需要解决的问题 1、由于使用同一个statefulset配置,因此需要考虑master和slave使用不同的cnf文件。 2、不同pod之间文件的传输 3、…...

【方案分享】展厅智能讲解:基于BLE蓝牙Beacon的自动讲解触发技术实现
【方案分享】展厅智能讲解:基于BLE蓝牙Beacon的自动讲解触发技术实现 让观众靠近展品即可自动弹出讲解页面,是智能展厅的核心功能之一。本文将从软硬件技术、BLE Beacon原理、微信小程序实现、优劣对比与拓展方案五个维度,系统讲解“靠近展台…...

web常见的攻击方式有哪些?如何防御?
Web常见攻击方式及防御策略 SQL注入 (SQL Injection) 详细解析: SQL 注入是一种利用应用程序未正确验证用户输入的漏洞,通过向应用传递恶意 SQL 查询来操纵数据库的行为。这种攻击可能导致敏感数据泄露、篡改或删除。 步骤: 攻击者找到可接受动态参数的应用程序…...

力扣:《螺旋矩阵》系列题目
今天做了一下螺旋矩阵主题的一系列题目 即力扣中的相似题目 还是有所感悟的 接下来一一回顾: 第一题: 59. 螺旋矩阵 II - 力扣(LeetCode) 这题让我们生成一个正方形的矩阵,注意是正方形,不是长方形&a…...

发电厂进阶,modbus TCP转ethernet ip网关如何赋能能源行业
案例分享:稳联技术modbus TCP转ethernet ip网关wl-abc004赋能,发电厂自动化改造,推动能源行业智能化升级 随着全球能源结构转型和“双碳”目标的推进,传统发电厂(如火电、水电、生物质发电)正面临严峻挑战&…...

深入了解linux系统—— 操作系统的路径缓冲与链接机制
前言 在之前学习当中,我们了解了被打开的文件是如何管理的;磁盘,以及ext2文件系统是如何存储文件的。 那我们要打开一个文件,首先要先找到这个文件,操作系统又是如何去查找的呢? 理解操作系统搜索文件 …...
Ansible快速入门指南
Ansible 是一款基于 Python 开发的开源自动化运维工具,主要用于实现服务器配置管理、应用部署、任务自动化执行等功能。它通过 简单的 YAML 脚本(Playbook) 定义任务,结合 SSH 协议 对远程主机进行管理,无需在被控节点…...

华为2025年校招笔试真题手撕教程(一)
一、题目 输入: 第一行为记录的版本迭代关系个数N,范围是[1,100000]; 第二行到第N1行:每行包含两个字符串,第一个字符串为当前版本,第二个字符串为前序版本,用空格隔开。字符串包含字符个数为…...