<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
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

    瀏覽量

    77342
  • 定時器
    +關注

    關注

    23

    文章

    3147

    瀏覽量

    112034
  • CMD命令
    +關注

    關注

    0

    文章

    28

    瀏覽量

    8173
  • RT-Thread
    +關注

    關注

    31

    文章

    1148

    瀏覽量

    38868
  • PWM輸出
    +關注

    關注

    1

    文章

    61

    瀏覽量

    5053
收藏 人收藏

    評論

    相關推薦

    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 ?756次閱讀
    <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 ?522次閱讀

    RT-Thread框架下的SMP支持

    最近報名參加了恩智浦社區的 LPC55S69 開發板測評活動,由于其搭載的是一顆 Cortex-M33 Dual Core 的 CPU,而且有大佬已經支持了 RT-Thread 的 BSP,就考慮
    的頭像 發表于 10-11 10:34 ?508次閱讀
    <b class='flag-5'>RT-Thread</b><b class='flag-5'>框架</b>下的SMP支持

    LPC55S69 PWM踩坑寄錄

    在使用 lpc55s69_nxp_evk 開發板對接 rtduino 的過程,對接 PWM 部分的時候,遇到了不少坑,在此記錄。
    的頭像 發表于 10-11 15:30 ?285次閱讀

    LPC55S69開發板對接RTduino的相關工作

    RTduino 是基于 RT-Thread 框架下進一步的封裝,使得用戶可以像開發 Arduino 一樣快速上手。
    的頭像 發表于 10-11 17:09 ?525次閱讀
    <b class='flag-5'>LPC55S69</b>開發板<b class='flag-5'>對接</b>RTduino的相關工作
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>