【STM32MP157应用编程】3.控制PWM
目录
PWM文件
指令操作PWM
程序操作PWM
程序说明
程序代码
3_PWM_1.c
启动交叉编译工具
编译
拷贝到开发板
测试
PWM文件
在/sys/class/pwm目录下,存放了PWM的文件。
pwmchip0和pwmchip4目录对应了MP157 SoC的2个PWM控制器,pwmchip0对应的是MP157的TIM4,而pwmchip4对应的则是TIM1,并且STM32MP157只提供了一个PWM通道(PA10--TIM1_CH3)。TIM4_CH2用作LCD背光控制。
npwm:只读文件,读取该文件可以得知该PWM控制器下共有几路PWM输出。
cat npwm

export:在使用PWM之前,需要将其导出,通过export属性进行导出。
echo 2 > export

| 数字 | 对应的通道 |
|---|---|
| 0 | CH1 |
| 1 | CH2 |
| 2 | CH3 |
| 3 | CH4 |
unexport:将导出的PWM通道删除。
echo 2 > unexport

指令操作PWM

period:用于配置PWM周期,可读可写;写入一个字符串数字值,以ns(纳秒)为单位。最小值为5000。
echo 1000000 > period #设置1ms的周期
duty_cycle:用于配置PWM的占空比,可读可写;写入一个字符串数字值,是以ns为单位。
echo 500000 > duty_cycle #设置0.5ms的占空比
polarity:用于设置极性,可读可写,可写入的值: "normal":普通; "inversed":反转。
echo normal > polarity #设置普通极性

enable:可读可写,写入"0"表示禁止PWM;写入"1"表示使能PWM。读取该文件获取PWM当前是禁止还是使能状态。通常配置好PWM之后,再使能PWM。
echo 1 > enable #使能PWM

程序操作PWM
程序说明
./xxx 参数1 参数2
参数1:周期,以us为单位,最小值为5。
参数2:占空比,百分比。
0~100:占空比的百分比。
程序代码
3_PWM_1.c
/*PWM控制
*/
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>//./xxx 周期 占空比(百分比)static char PWM_path[] = "/sys/class/pwm/pwmchip4/pwm2";
static char PWM_export_path[] = "/sys/class/pwm/pwmchip4/export";
static char PWM_period_path[] = "/sys/class/pwm/pwmchip4/pwm2/period";
static char PWM_duty_cycle_path[] = "/sys/class/pwm/pwmchip4/pwm2/duty_cycle";
static char PWM_polarity_path[] = "/sys/class/pwm/pwmchip4/pwm2/polarity";
static char PWM_enable_path[] = "/sys/class/pwm/pwmchip4/pwm2/enable";int main(int argc, char *argv[])
{//检查参数个数if (argc != 3){printf("%s文件的参数个数错误!\n", argv[0]);return -1;}//检查参数char *endptr;//检查参数1是否为纯数字strtol(argv[1], &endptr, 10);if ((endptr == argv[1]) || ((!isspace(*endptr)) && (*endptr != '\0'))){perror("参数错误!\n");return -1;}endptr = NULL;//检查参数2是否为纯数字strtol(argv[2], &endptr, 10);if ((endptr == argv[2]) || ((!isspace(*endptr)) && (*endptr != '\0'))){perror("参数错误!\n");return -1;}//检查参数1的取值范围:>=5int ZhouQi = atol(argv[1]);if (ZhouQi < 5){perror("参数错误!\n");return -1;}//检查参数2的取值范围:0-100int ZhanKongBi = atol(argv[2]);if (ZhanKongBi < 0 || ZhanKongBi > 100){perror("参数错误!\n");return -1;}//检查PWM是否导出int fd;if (access(PWM_path, F_OK)){if (0 > (fd = open(PWM_export_path, O_WRONLY))){perror("文件打开错误!\n");return -1;}if (strlen("2") != (write(fd, "2", strlen("2")))){perror("PWM文件导出错误!\n");return -1;}close(fd);}//配置周期if (0 > (fd = open(PWM_period_path, O_WRONLY))){perror("period文件打开错误!\n");return -1;}char str[100];sprintf(str, "%d", ZhouQi * 1000);if (strlen(str) != write(fd, str, strlen(str))){perror("配置周期错误!\n");return -1;}close(fd);//配置占空比if (0 > (fd = open(PWM_duty_cycle_path, O_WRONLY))){perror("duty_cycle文件打开错误!\n");return -1;}sprintf(str, "%d", ZhouQi * 10 * ZhanKongBi );if (strlen(str) != write(fd, str, strlen(str))){perror("配置占空比错误!\n");return -1;}close(fd);//配置极性if (0 > (fd = open(PWM_polarity_path, O_WRONLY))){perror("polarity文件打开错误!\n");return -1;}if (strlen("normal") != write(fd, "normal", strlen("normal"))){perror("配置极性错误!\n");return -1;}close(fd);//使能if (0 > (fd = open(PWM_enable_path, O_WRONLY))){perror("enable文件打开错误!\n");return -1;}if (strlen("1") != write(fd, "1", strlen("1"))){perror("使能错误!\n");return -1;}close(fd);return 0;
}
启动交叉编译工具
source /opt/st/stm32mp1/3.1-snapshot/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi

编译
${CC} -o 3_PWM_1 3_PWM_1.c

拷贝到开发板
scp 3_PWM_1 root@10.3.22.219:/home/root/Linux_C_YingYong_BianCheng/JiaoCheng/3_PWM/


测试
输出周期为1ms,占空比为30%的PWM。
./3_PWM_1 1000 30


相关文章:
【STM32MP157应用编程】3.控制PWM
目录 PWM文件 指令操作PWM 程序操作PWM 程序说明 程序代码 3_PWM_1.c 启动交叉编译工具 编译 拷贝到开发板 测试 PWM文件 在/sys/class/pwm目录下,存放了PWM的文件。 pwmchip0和pwmchip4目录对应了MP157 SoC的2个PWM控制器,pwmchip0对应的是M…...
基于Python的selenium
一、安装 1.1安装Python,安装Python时需要勾选增加环境变量 如果之前已经安装过Python,需要将Python相关文件以及环境变量删除 1.2安装成功:在命令行界面下输入Python,最终展示>>>即可成功 2.1安装pycharm,直接自定义安装…...
Go底层原理:一起来唠唠GMP调度(一)
目录前言一、进程、线程、Goroutine1、进程与线程2、Goroutine二、Go调度器设计思想1、线程模型1.1 内核级线程模型1.2 用户级线程模型1.3 混合型线程模型2、 被废弃的 G-M 调度器2.1 了解 G-M 调度如何工作3、如今高效的 GMP 模型3.1 GMP模型调度流程3.2 GMP调度设计策略3.3 G…...
前端——1.相关概念
这篇文章主要介绍前端入门的相关概念 1.网页 1.1什么是网页? 网站:是指在因特网上根据一定的规则,使用HTML等制作的用于展示特定内容相关的网页集合 网页:是网站中的一“页”,通常是HTML格式的文件,它要…...
java四种线程池(基本使用)
标题java四种线程池及使用示例 1、线程工厂 1、我们先来写ThreadFactory,在创建线程池时候可以传入自定义的线程工厂,线程工厂说白了就是用来定制线程的一些属性:名字、优先级、是否为守护线程。直接看代码即可。 当然创建线程池的时候可以…...
float的表示范围为什么比long大
●很多人会有一个疑问, 一个用来表示小数的 float 为什么表示的范围会比 long 还要大呢 ? ●这次, 咱们就来详细说一说这个事情 从长计议 ●聊到这个话题, 我们就要从计算机存储数字这个位置说起了 ●计算机存储数字的方式其实就是 : 二进制 二进制是计算机中最基本的数字存储…...
Flutter Android 打包保姆式全流程 2023 版
大家好,我是 17。 为什么要写这篇文章呢?对于一没有 android 开发经验,从未有过打包经历的新人来说,要想成功打包,是很困难的。因为受到的阻碍太多,是完全陌生的领域,几乎是寸步难行。如果有老…...
C++笔记之lambda表达式
引言 Lambda表达式是从C 11版本引入的特性,利用它可以很方便的定义匿名函数对象,通常作为回调函数来使用。大家会经常拿它和函数指针,函数符放在一起比较,很多场合下,它们三者都可以替换着用。 语法 [ captures ] (…...
flink大数据处理流式计算详解
flink大数据处理 文章目录flink大数据处理二、WebUI可视化界面(测试用)三、Flink部署3.1 JobManager3.2 TaskManager3.3 并行度的调整配置3.4 区分 TaskSolt和parallelism并行度配置四、Source Operator(资源算子)五、Sink Operator(输出算子)六、Flink滑…...
Java面试题(二十三)DCL单例
懒汉式单例 private static SingletonInstance INSTANCE;private SingletonInstance(){}public static SingletonInstance getInstance() {if (INSTANCE null) {INSTANCE new SingletonInstance();}return INSTANCE;}构造方法私有化,然后判断是否为空,…...
UML-类图
一、类 一个类由三个格子组成,从上至下分别表示: 第一格:类名称(接口和抽象类,使用斜体) 第二格:类的属性(成员变量,可以没有) 第三格:类的操作&…...
PostgreSQL 数据库和 pgAdmin 4
PostgreSQL 数据库和 pgAdmin 4PostgreSQLPostgreSQL 数据库安装PostgreSQL 数据库安装 (Ubuntu)PostgreSQL 数据库其他系统安装PostgreSQL 数据库快速使用入门登录数据库访问数据库参考pgAdmin 4pgAdmin 4 安装使用 pgAdmin 4 登录数据库参考PostgreSQL PostgreSQL 数据库安装…...
quarkus 搭建与基础开发环境配置总结
quarkus搭建与基础开发环境配置总结 大纲 基础概念quarkus2.13.7脚手架工程配置配置maven3.8.7quarkus快速启动quarkus的三种打包方式quarkus将程序打包为二进制文件window环境下quarkus云原生二进制文件打包环境搭建使用GraalVM-java11替换本地java8运行二进制文件 基础概念…...
扩散模型DDPM开源代码的剖析【对应公式与作者给的开源项目,diffusion model】
扩散模型DDPM开源代码的剖析【对应公式与作者给的开源项目,diffusion model】一、简介二、扩散过程:输入是x_0和时刻num_steps,输出是x_t三、逆扩散过程:输入x_t,不断采样最终输出x_0四、具体参考算法流程图五、模型mo…...
C语言 学生记录管理系统
学生记录管理系统 1--添加 2--删除 3--查询:按姓名 4--查询:按班级 5--查询:按学号 0--退出 请选择操作序号(0—5):1 请输入新学生的学号:1 请输入新学生的…...
【独家】华为OD机试 C 语言解题 - 交换字符
最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南)华为od机试,独家整理 已参加机试人员的实战技巧文章目录 最近更新的博客使用说明本期…...
网络安全平台测试赛 easyphp(phar脏数据处理)
昨天的比赛,14.00-17.00.时间有点紧张,比赛期间没拿下来这道 😭非常痛苦,很顺畅的思路 一步步想下来,卡在最后一步末尾脏数据处理了,最后时间到了 没打通,还需多练 这里本地复现一下࿱…...
【python】XML格式文件读写详解
注:最后有面试挑战,看看自己掌握了吗 文章目录XML介绍格式XML与AJAX与HTML区别联系生成XML文件案例用SAX模块处理XML用DOM模块处理XML🌸I could be bounded in a nutshell and count myself a king of infinite space. 特别鸣谢:…...
理解js的精度问题
参考博客:js精度丢失问题-看这篇文章就够了(通俗易懂)、探寻 JavaScript 精度问题以及解决方案、JavaScript 浮点数陷阱及解法 1 为什么 JavaScript 中所有数字包括整数和小数都只有一种类型 即 Number类型,它的实现遵循 IEEE 754 标准。 符号位S&#…...
蓝桥杯 时间显示
题目 输入输出样例 示例 1 输入 46800999输出 13:00:00示例 2 输入 1618708103123输出 01:08:23评测用例规模与约定 对于所有评测用例,给定的时间为不超过 10^{18}1018 的正整数。 运行限制 最大运行时间:1s最大运行内存: 512M 基础知识 时间的转换…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...
OpenLayers 分屏对比(地图联动)
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...
MySQL账号权限管理指南:安全创建账户与精细授权技巧
在MySQL数据库管理中,合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号? 最小权限原则…...
08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险
C#入门系列【类的基本概念】:开启编程世界的奇妙冒险 嘿,各位编程小白探险家!欢迎来到 C# 的奇幻大陆!今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类!别害怕,跟着我,保准让你轻松搞…...
[ACTF2020 新生赛]Include 1(php://filter伪协议)
题目 做法 启动靶机,点进去 点进去 查看URL,有 ?fileflag.php说明存在文件包含,原理是php://filter 协议 当它与包含函数结合时,php://filter流会被当作php文件执行。 用php://filter加编码,能让PHP把文件内容…...
从物理机到云原生:全面解析计算虚拟化技术的演进与应用
前言:我的虚拟化技术探索之旅 我最早接触"虚拟机"的概念是从Java开始的——JVM(Java Virtual Machine)让"一次编写,到处运行"成为可能。这个软件层面的虚拟化让我着迷,但直到后来接触VMware和Doc…...
微服务通信安全:深入解析mTLS的原理与实践
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、引言:微服务时代的通信安全挑战 随着云原生和微服务架构的普及,服务间的通信安全成为系统设计的核心议题。传统的单体架构中&…...
spring Security对RBAC及其ABAC的支持使用
RBAC (基于角色的访问控制) RBAC (Role-Based Access Control) 是 Spring Security 中最常用的权限模型,它将权限分配给角色,再将角色分配给用户。 RBAC 核心实现 1. 数据库设计 users roles permissions ------- ------…...
JDK 17 序列化是怎么回事
如何序列化?其实很简单,就是根据每个类型,用工厂类调用。逐个完成。 没什么漂亮的代码,只有有效、稳定的代码。 代码中调用toJson toJson 代码 mapper.writeValueAsString ObjectMapper DefaultSerializerProvider 一堆实…...
