0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

LPC55S69对接RT-Thread PWM设备框架

冬至子 来源:螺丝松掉的人 作者:螺丝松掉的人 2023-10-11 15:02 次阅读

在使用 RT-Thread 的 bsp pwm 的时候,注意到 lpc55sxx 系列只对接了通用定时器2中的通道1作为 PWM 输出。但其实 LPC55S69 具备非常多的 PWM 资源。于是根据 RT-Thread 设备驱动框架了,对接了其他通用定时器的 PWM 输出。

开始对接

创建PWM设备

之前该 BSP 中的 drv_pwm 已经对接了基本的接口,但只考虑了一个通道作为 PWM 输出,在实际的使用中具有较大的局限性,不能充分发挥作用。我们首先基于PWM设备基类结构派生出新的 PWM 设备结构体:

struct lpc_pwm
{
struct rt_device_pwm pwm_device;
CTIMER_Type * tim;
uint32_t channel;
char *name;
};

因为 PWM 设备不止一个 ,所以我们定义一个全局的 PWM 设备表来同时创建多个 PWM 设备:

static struct lpc_pwm lpc_pwm_obj[] =
{
#if defined(BSP_USING_CTIMER1_MAT0) || defined(BSP_USING_CTIMER1_MAT1) ||
defined(BSP_USING_CTIMER1_MAT2)
{
.tim = CTIMER1,
.name = "pwm1",
.channel = RT_NULL
},
#endif
#if defined(BSP_USING_CTIMER2_MAT0) || defined(BSP_USING_CTIMER2_MAT1) ||
defined(BSP_USING_CTIMER2_MAT2)
{
.tim = CTIMER2,
.name = "pwm2",
.channel = RT_NULL
},
#endif
};
/* 可以根据实际需求自行扩展 */

选择指定定时器的具体通道作为 PWM 输出:

static void pwm_get_channel(void)
{
#ifdef BSP_USING_CTIMER1_MAT0
lpc_pwm_obj[PWM1_INDEX].channel |= 1 << 0;
#endif
#ifdef BSP_USING_CTIMER1_MAT1
lpc_pwm_obj[PWM1_INDEX].channel |= 1 << 1;
#endif
#ifdef BSP_USING_CTIMER1_MAT2
lpc_pwm_obj[PWM1_INDEX].channel |= 1 << 2;
#endif
#ifdef BSP_USING_CTIMER2_MAT0
lpc_pwm_obj[PWM2_INDEX].channel |= 1 << 0;
#endif
#ifdef BSP_USING_CTIMER2_MAT1
lpc_pwm_obj[PWM2_INDEX].channel |= 1 << 1;
#endif
#ifdef BSP_USING_CTIMER2_MAT2
lpc_pwm_obj[PWM2_INDEX].channel |= 1 << 2;
#endif
}
/* 可以根据实际需求自行扩展 */

实现PWM设备的操作方法

PWM 设备只有一个 control 方法, control 方法使用设备控制字 cmd 来区分操作,分别有ENABLE、DISABLE、SET、GET。这部分原先已经基本实现过了,只需添加新的定时器判断分支即可。

注册PWM设备

原先是使用 rt_hw_pwm_init() 即可注册定时器2通道1这一个定时器设备,但现在需要注册的是多个 PWM 设备,于是编写 lpc_pwm_init() 将 PWM 设备表中的多个 PWM 设备逐个进行注册。

static int lpc_pwm_init(void)
{
int i = 0;
int result = RT_EOK;
pwm_get_channel();
for (i = 0; i < sizeof(lpc_pwm_obj) / sizeof(lpc_pwm_obj[0]); i++)
{
/* pwm init /
if (rt_hw_pwm_init(&lpc_pwm_obj[i]) != RT_EOK)
{
LOG_E("%s init failed", lpc_pwm_obj[i].name);
result = -RT_ERROR;
goto __exit;
}
else
{
LOG_D("%s init success", lpc_pwm_obj[i].name);
/
register pwm device */
if (rt_device_pwm_register(&lpc_pwm_obj[i].pwm_device, lpc_pwm_obj[i].name, &lpc_drv_ops, lpc_pwm_obj[i].tim) == RT_EOK)
{
LOG_D("%s register success", lpc_pwm_obj[i].name);
}
else
{
LOG_E("%s register failed", lpc_pwm_obj[i].name);
result = -RT_ERROR;
}
}
}
__exit:
return result;
}
INIT_DEVICE_EXPORT(lpc_pwm_init);

至此,对于该 BSP 的 drv_pwm 的重构基本完成,主要目的是更全面的对接 RT-Thread 设备框架,能够同时使用多路 PWM 输出,提高其适用性和灵活性。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • LPC
    LPC
    +关注

    关注

    8

    文章

    135

    浏览量

    77349
  • 定时器
    +关注

    关注

    23

    文章

    3148

    浏览量

    112059
  • CMD命令
    +关注

    关注

    0

    文章

    28

    浏览量

    8174
  • RT-Thread
    +关注

    关注

    31

    文章

    1150

    浏览量

    38911
  • PWM输出
    +关注

    关注

    1

    文章

    62

    浏览量

    5059
收藏 人收藏

    评论

    相关推荐

    LPC55S69-RT-Thread Micropython移植日志

    LPC55S69也成功移植了RT-Thread的FINSH组件,点击TAB键可查看Finsh控制台命令,我们可以看到有一个python命令行简单测试下micropython,下面使用python命令运行
    发表于 02-09 14:48

    LPC55S69对接RTduino的相关工作

    该文记录 LPC55S69 开发板体验期间,对接 RTduino 的相关工作。RTduino 是基于 RT-Thread 框架下进一步的封装,使得用户可以像开发 Arduino 一样快
    发表于 02-24 14:51

    LPC55S69开发板的PWM踩坑寄录

      LPC55S69 PWM踩坑寄录  在使用 lpc55s69_nxp_evk 开发板对接 rtduino 的过程,对接
    发表于 03-06 10:49

    LPC55S69 Flashmagic不编程的原因?

    我用 NXP LPC55S69 开发了一块电路板。我已经用 Xpresso IDE 开发了一个程序。我的应用程序在 SWD 端口上使用 Segger Jlink 运行良好。我在设计中在设备的USB1
    发表于 03-15 07:54

    LPC55S69对接RT-Thread PWM设备框架介绍

    LPC55S69对接RT-Thread PWM设备框架在使用
    发表于 03-16 14:01

    如何实现LPC55s69的USB固件更新?

    我们正在研究 LPC55s69,并计划通过 USB 而不是 ISP 更新固件。他们是否有任何类似的文章/代码项目引用了 LPC55s69 板。如果没有,那么我可以使用与文章中类似的类比来实现 LPC55s69 的 USB 固件更
    发表于 03-20 06:19

    如何将CMSIS-DSP库加载到基于LPC55S69的工程中?

    由于LPC55S69具有PowerQuad,在SDK示例代码中,FFT/FIR/IIR等DSP功能由Powerquad模块实现,而不是Cortex-CM33内核。 这是实现 DSP 功能
    发表于 04-06 08:40

    LPC55S69中的内存如何访问仲裁?

    我叫 Ted,我正在开发一个基于 Zephyr 的应用程序以在 LPC55S69 上运行。该应用程序实际上是一对固件项目,此时它们通过 LPC55S69 的处理器间邮箱 (IPM) 功能相互协调
    发表于 04-12 08:54

    LPC55S69 EVK调试期间出现Wire ACK错误怎么解决?

    使用 LPC55S69 EVK 调试时出现以下错误。我正在运行 SDK 中的 B2B SPI 示例进行测试。构建过程清除没有任何错误,但我在调试期间收到此错误。 任何解决方案?还有一种方法可以将 LPC55S69 EVK 板恢复出厂设置,例如恢复出厂设置?
    发表于 06-12 07:00

    RT-Thread文档_PWM 设备

    RT-Thread文档_PWM 设备
    发表于 02-22 18:35 1次下载
    <b class='flag-5'>RT-Thread</b>文档_<b class='flag-5'>PWM</b> <b class='flag-5'>设备</b>

    LPC55S69RT-Thread上的SDIO驱动和文件系统

    本篇将介绍如何在LPC55S69_EVK开发板上,使用RT-Thread的SDIO驱动和FATFS文件系统组件实现SD卡上的文件读写。
    的头像 发表于 03-08 14:13 763次阅读
    <b class='flag-5'>LPC55S69</b>在<b class='flag-5'>RT-Thread</b>上的SDIO驱动和文件系统

    LPC55S69RT-Thread上轻松搞定高速上网

    依然难觅,RW007便是其中之一。 本文使用LPC55S69_EVK开发板连接RW007 WiFi 模块,通过运行RT-Thread操作系统,让开发板轻松愉快的联网。
    的头像 发表于 03-27 16:06 526次阅读

    RT-Thread框架下的SMP支持

    最近报名参加了恩智浦社区的 LPC55S69 开发板测评活动,由于其搭载的是一颗 Cortex-M33 Dual Core 的 CPU,而且有大佬已经支持了 RT-Thread 的 BSP,就考虑
    的头像 发表于 10-11 10:34 513次阅读
    <b class='flag-5'>RT-Thread</b><b class='flag-5'>框架</b>下的SMP支持

    LPC55S69 PWM踩坑寄录

    在使用 lpc55s69_nxp_evk 开发板对接 rtduino 的过程,对接 PWM 部分的时候,遇到了不少坑,在此记录。
    的头像 发表于 10-11 15:30 289次阅读

    LPC55S69开发板对接RTduino的相关工作

    RTduino 是基于 RT-Thread 框架下进一步的封装,使得用户可以像开发 Arduino 一样快速上手。
    的头像 发表于 10-11 17:09 529次阅读
    <b class='flag-5'>LPC55S69</b>开发板<b class='flag-5'>对接</b>RTduino的相关工作