【龙芯1c库】封装硬件pwm接口和使用示例

linux驱动 -- PWM配置SysFs操作方法 pwm设备控制SysFs操作方法 阅读详情

龙芯1c库是把龙芯1c的常用外设的常用功能封装为一个库,类似于STM32库。Git地址:https://gitee.com/caogos/OpenLoongsonLib1c

本文通过“龙芯1c库”中提供的PWM接口,实现了在4路pwm的输出连续的pwm脉冲和单个脉冲。
在讲解了pwm接口之后,才开始详细介绍寄存器,以及怎样使用这些寄存器来封装接口,最后给出了封装的pwm接口代码清单。
 

龙芯1c库中pwm接口使用示例

PWM接口简介

提供三个接口函数,分别是

 

void pwm_init(pwm_info_t *pwm_info);
void pwm_disable(pwm_info_t *pwm_info);
void pwm_enable(pwm_info_t *pwm_info);

其中函数pwm_init()是最核心的接口,调用后会立刻在指定引脚上产生需要的波形。初始化之后,可以在需要的时候调用pwm_disable()停止输出pwm波形,在disable后还可以调用pwm_enable()重新使能,指定引脚上又继续输出pwm波形。
这三个接口都是一了相同的入参,这个入参到底长啥样,马上揭晓。

// 硬件pwm信息
typedef struct
{
    unsigned int gpio;                      // PWMn所在的gpio
    unsigned int mode;                      // 工作模式(单脉冲、连续脉冲)
    float duty;                             // pwm的占空比
    unsigned long period_ns;                // pwm周期(单位ns)
}pwm_info_t;

我想这个应该一看就知道说的是啥。
这里重点解释一下为什么这里是gpio,而不是PWMn。因为每路pwm都可以复用到至少另外的一个引脚上,却不存在一个引脚可能发生支持多个PWM复用的情况,这里直接传入gpio,代码中会自动根据gpio判断是使用那个PWM,是否需要使用复用,如果需要复用,自动复用。
除了gpio之外,还有工作模式为啥还有个单脉冲模式。当工作在单脉冲模式时,调用一次pwm_init()产生一个脉冲。这对于常用于步进电机的控制,比如我之前做的3D打印机(龙印)就用到了,通过控制脉冲个数,达到控制步进电机行走距离的目的。

龙芯1C300B支持FPU(硬件浮点运算单元),并且龙芯1c库中已经默认开启了FPU,所以这里直接采用浮点数形式的占空比。

据此,构造了三个测试用例:
用例一,测试PWM正常模式(连续输出PWM)。
通过调用pwm_init()产生连续单脉冲,然后调用pwm_disable()停止输出脉冲,最后调用pwm_enable()又继续输出连续脉冲。为了便于使用示波器观察,禁止输出一会后,又使能,再禁止,再使能,反复不停的循环。
用例二,测试PWM单脉冲模式(每次只输出一个脉冲)
通过调用pwm_init()产生一个脉冲,再延时一会之后(延时时间必须大于等于pwm周期),再调用pwm_init(),再延时一会,再调用pwm_init(),再延时,再输出一定数量的脉冲之后停止输出。通用为了便于用示波器观察,可以将上述过程反复重复。
用例三。将pwm默认的引脚作用普通GPIO,同时复用其它引脚来用作pwm。
PWM0的默认引脚GPIO06用作普通gpio,而GPIO04上输出pwm波形,

 

硬件资源

龙芯1c有4路pwm,每路都可以复用。但只有pwm0和pwm1才有默认引脚(当然也可以复用其它引脚),pwm2和pwm3都需要复用。这里每路选取了两个引脚,如下

 

// pwm引脚定义
#define LS1C_PWM0_GPIO06                    (6)         // gpio06用作pwm0
#define LS1C_PWM0_GPIO04                    (4)         // gpio04复用为pwm0
#define LS1C_PWM1_GPIO92                    (92)        // gpio92用作pwm1
#define LS1C_PWM1_GPIO05                    (5)         // gpio05复用为pwm1
#define LS1C_PWM2_GPIO52                    (52)        // gpio52复用为pwm2
#define LS1C_PWM2_GPIO46                    (46)        // gpio46复用为pwm2
#define LS1C_PWM3_GPIO47                    (47)        // gpio47复用为pwm3
#define LS1C_PWM3_GPIO53                    (53)        // gpio53复用为pwm3

每个引脚都可以输出连续pwm脉冲和单个脉冲。

 

测试用例1——产生连续脉冲

代码清单

 

// 测试硬件pwm产生连续的pwm波形
void test_pwm_normal(void)
{
    pwm_info_t pwm_info;
    int i;

    pwm_info.gpio = LS1C_PWM0_GPIO06;               // pwm引脚位gpio06
//    pwm_info.gpio = LS1C_PWM0_GPIO04;
    pwm_info.mode = PWM_MODE_NORMAL;                // 正常模式--连续输出pwm波形
    pwm_info.duty = 0.25;                           // pwm占空比
    pwm_info.period_ns = 5*1000*1000;               // pwm周期5ms

    // pwm初始化,初始化后立即产生pwm波形
    pwm_init(&pwm_info);

    while (1)
    {
        // 延时100ms
        for (i=0; i<100; i++)
        {
            delay_1ms();
        }

        // 禁止pwm
        pwm_disable(&pwm_info);

        // 延时100ms
        for (i=0; i<100; i++)
        {
            delay_1ms();
        }

        // 使能pwm
        pwm_enable(&pwm_info);
    }

    return ;
}

 

 

 

测试效果

从图上可以看出,有脉冲和没脉冲的时间都是100ms,与代码相符。下面放大了再来看看连续脉冲的详细信息,如下

占空比为0.25,pwm周期为5ms,与代码相符。

测试用例2——产生单脉冲

代码清单

 

// 测试硬件pwm产生pwm脉冲
void test_pwm_pulse(void)
{
    int i;
    pwm_info_t pwm_info;

    pwm_info.gpio = LS1C_PWM0_GPIO06;               // 输出pwm波形的引脚
    pwm_info.mode = PWM_MODE_PULSE;                 // 单脉冲模式,每次调用只发送一个脉冲,调用间隔必须大于pwm周期
 
龙芯1c封装硬件定时器接口使用示例 龙芯1c是把龙芯1c的常用外设的常用功能封装为一个,类似于STM32。完整源码请移步到https://gitee.com/caogos/OpenLoongsonLib1c 龙芯1c硬件定时器接口使用示例 封装接口函数简介 首先来看看有哪些接口,如下 // 硬件定时器 typedef enum { TIMER_PWM0, // P... 阅读详情

相关推荐

龙芯1c在RT-Thread下输出PWM

本文以在引脚GPIO6上输出占空比为0.25、周期为5ms的PWM为例,演示一下怎么在RT-Thread中使用龙芯1c中的PWM相关接口函数。

勤为本的专栏 1597

RK3568 PWM 使用

前言 现在记录一下rk3568下pwm的驱动编写,下面是内核pwm的API,参考于开源论坛(firefly的开源论坛里面的Wiki教程) 说明 ROC-RK3568-PC的 PWM 驱动为:kernel/drivers/pwm/pwm-rockchip.c DTS配置 配置 PWM 主要有以下三大步骤:配置 PWM DTS 节点、配置 PWM 内核驱动、控制 PWM 设备。 配置 PWM DTS节点 在 DTS 源文件 kernel/arch/arm64/boot/dts/rockchip/rk356x-f

qq_29890089的博客 7988

龙芯1c封装时钟接口使用示例

龙芯1c是把龙芯1c的常用外设的常用功能封装为一个,类似于STM32。Git地址:https://gitee.com/caogos/OpenLoongsonLib1c本文通过“龙芯1c”中提供的时钟相关接口,获取了PLL,CPU,DDRAPB的时钟,并将其打印出来,然后再详细讲解是如何封装这几个接口的。龙芯1c中时钟接口使用示例时钟接口简介提供几个clk_get_xxx_rate()的...

勤为本的专栏 1230

Linux PWM framework简介API描述【转】

本文转载自:https://blog.csdn.net/mike8825/article/details/51656400 1. 前言 PWM是Pulse Width Modulation(脉冲宽度调制)的缩写,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,其本质是一种对模拟信号电平进行数字编码的方法。在嵌入式设备中,PWM多用于控制马达、LED、振动器等模拟器件...

544

linux舵机控制程序,Linux PWM设备驱动及舵机控制

pwm归根到底就是调整高低电平在一个周期信号里的比例时间.占空比: 指有效电平(通常高电平)在周期信号里的持续时间.周期信号: 如从上升沿到下一个上升沿的时间。 100HZ表示1秒钟内有100个时钟周期。pwm常用于调节LCD背光对比度, 舵机, 调速马达,也可用于作时钟信号产生器。 如上图,就是四种在相同周期信号里的不同的占空比(每个周期里的高电平持续时间)pwm调节LCD背光原理:LCD背光...

weixin_36414025的博客 1033

编写Linux标准的PWM驱动

编写Linux标准的PWM驱动,需要定义一个结构体 struct pwm_device ,实现五个个PWM函数(include/linux/pwm.h),如下所示: structpwm_device; /* *pwm_request-requestaPWMdevice */ structpwm_device*pwm_request(int

4822

龙芯1c封装软件延时接口使用示例

龙芯1c是把龙芯1c的常用外设的常用功能封装为一个,类似于STM32。Git地址:https://gitee.com/caogos/OpenLoongsonLib1c程序中难免会用到延时函数,一般通过执行n个nop指令实现延时。为此封装了delay_us(i), delay_ms(i), delay_s(i)三个函数,分别延时ius, ims, is。并测试了几个函数的延时精度,除了延时时间...

勤为本的专栏 1005

龙芯1c实现无源蜂鸣器唱歌《送别》

龙芯1c龙芯1c上用裸机编程实现无源蜂鸣器唱《送别》

勤为本的专栏 2925

龙芯可以运行linux吗,开源的龙芯主板可顺利启动Linux系统

软件开源很常见,但是你见过硬件开源吗?国内也有。据了解,龙芯俱乐部广州龙芯经过3个版本的研发,龙芯1C开源主板已经调试成功,可以顺利启动Linux系统了。开源龙芯主板是一款以开源方式推广的龙芯嵌入式主板,在“树莓派”(RaspberryPi)一样尺寸的小电路板上(火柴盒大小)集成了龙芯1CSOC处理器、RTC时钟等主要部件,以及RJ-45、USB、串口(最多12路)、SPI、PWM、CAN...

weixin_35512156的博客 1019

龙芯各系列芯片详细介绍

龙芯 1C103 片上集成 Flash、ATIM、GTIM、ADC、SPI、I2C、UART、RTC 等功能模块,可输出带有死区的互补 PWM 信号,具备驱动舵机、有刷电机、无刷电机的原生支持,同时具备常见的通讯模块。龙芯 1C103 采用 QFN32 封装形式,芯片尺寸 4.0mm×4.0mm。芯片尺寸小,各引脚可根据需求进行复用,应用场景灵活,可以满足高性价比的常见电机应用。产品主要应用于筋膜枪、修枝机、电锯、电扳手、跳绳机、风扇、汽车电子等。

weixin_50519878的博客 312

迅为龙芯全系列开发板:全国产化嵌入式开发实战指南

在嵌入式系统与工控领域,处理器选型是项目成功的基础,它直接关系到系统的性能、功耗与长期可维护性。随着供应链安全与自主可控成为行业刚需,基于自主指令集的全国产平台正成为关键基础设施、网络安全等场景的重要选项。龙芯处理器家族覆盖了从低功耗嵌入式到高性能计算的完整谱系,其生态围绕LoongArch指令集与Linux软件栈构建,为开发者提供了从芯片到系统的全栈可控环境。这种技术路径的价值在于,它不仅能满足特定行业的国产化替代要求,更能通过开箱即用的开发板方案,大幅降低从原型验证到产品落地的工程门槛。迅为推出的龙芯

weixin_30731305的博客 479

龙芯2k0300 - 久久派核心板开发环境搭建

龙芯2K0300处理器官网地址:《https://www.loongson.cn/index.php/product/show?id=33龙芯2K0300数据手册;龙芯2K0300处理器用户手册。

Graceful_scenery的博客 997

龙芯2k0300 - 久久派开发环境搭建及内核升级

龙芯2K0300处理器官网地址:《https://www.loongson.cn/index.php/product/show?id=33龙芯2K0300数据手册;龙芯2K0300处理器用户手册。久久派2K0300核心板默认配套的是PMON固件以及linux 4.19的内核,PMON是一个兼有BIOS部分功能的开放源码软件,多用于嵌入式系统。基于龙芯的系统采用PMON作为类BIOS兼,并在其基础上做了很多完善的工作,支持BIOS启动配置,内核加载,程序调试,内存寄存器显示、设置以及内存反汇编等。

Graceful_scenery的博客 1052

龙芯2k0300 - 久久派开发环境搭建及内核升级(上)

龙芯2K0300处理器官网地址:《https://www.loongson.cn/index.php/product/show?id=33龙芯2K0300数据手册;龙芯2K0300处理器用户手册。龙芯系统有两套不兼容的LoongArch生态,核心差异在底层标准、内核、软件兼容、发行版、使用场景。龙芯的旧世界(ABI 1.0)新世界(ABI 2.0)是两套不兼容的软件生态体系。简单来说,旧世界是龙芯早期仓促推出的、未能完全融入开源主线的“过渡方案”;

Graceful_scenery的博客 553

第二十届全国大学生智能汽车竞赛极速光电组 恩智浦MicroPython赛道相关说明

作为编程手段,一方面可以减轻同学们编程的负担,让同学们能够有更多的精力进行创新,另一方面也希望能够吸引更多学生(包括非电子类专业、低年级同学及专科学校的同学)参加这一基础赛题,锻炼当代大学生的专业交叉运用能力。要求使用平衡D、E车模制作赛车,小车从起跑线前1米范围内出发,自动保持直立平衡沿赛道运行一周,再次通过起跑线后自动停止在起跑线后1米范围内,中途只允许两个轮胎着地,不允许倒地滑行;核心板中已烧录好固件,且限定使用官方提供的固件,不允许烧录其他固件,届时会辅以技术手段检查是否直接使用的。

TSINGHUAJOKING 2万+

一根数据线驯服百万色:WS2812 是如何把复杂灯光变成“面条”的

本文深入解析WS2812智能LED灯珠的工作原理与应用技巧,涵盖协议时序、硬件设计、软件驱动故障排查等关键知识。重点解析其单线归零码通信协议(800kHz速率)24bit RGB数据结构,强调5V电平匹配、电源去耦终端匹配三大硬件设计铁律。文章对比了SPI模拟、PWM+DMA专用外设三种驱动方案,并提供常见故障排查指南。最后展示了从基础驱动到HSV调色、分布式光效等进阶应用,为开发者提供从硬件连接到创意光效的完整解决方案。

在你不想做的时候,正是应该做的时候。 287

【信息科学与工程学】【产品体系】计算机科学与自动化——第一百八十九篇 操作系统内核(微内核/宏内核)函数与算法02

宏内核(Linux)更多典型内核函数/算法,从编号271开始,覆盖中断管理、热插拔、PCI、ACPI、固件、崩溃转储、kexec、休眠、watchdog、RTC、hwmon、LED、backlight、input子系统、remoteproc等更多领域。编号类型领域内核类型内核中的函数/算法/模块/模组模块的调用关系模块/函数/算法逐步推理思考的数学表达式及参数列表及参数数值设计模块的C/C++/其他代码关联知识271中断管理中断描述符宏内核 / (中断子系统核心)驱动申请中断 → → → 分配irq_

weixin_49199313的博客 30

宇树机器人技术演进全解析:从四足运动控制到具身智能落地

四足机器人作为具身智能的关键载体,其核心在于高动态运动控制、实时感知决策与低成本力控执行器的系统集成。宇树科技通过A1至Z1五代产品迭代,逐步攻克了边缘端实时SLAM、QP优化运动规划、QDD一体化关节驱动等关键技术瓶颈,实现了从实验室原型到电力巡检、消防救援、高校教学等真实场景的规模化落地。尤其在运动控制算法(如在线QP求解)、视觉优先感知架构及电机材料级创新(如渗氮钢齿轮、铜包铝绕组)方面展现出扎实的工程化能力。本文深度拆解宇树机器人技术栈演进逻辑,为机器人开发者、高校教师与工业用户理解国产四足平台的技

weixin_34417183的博客 439
上一篇: 【龙芯1c库】封装时钟接口和使用示例
下一篇: 【龙芯1c库】封装引脚复用接口和使用示例
勤为本
博客等级 码龄15年 215粉丝 60原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值