在使用 RT-Thread 的 bsp pwm 的時(shí)候,注意到 lpc55sxx 系列只對接了通用定時(shí)器2中的通道1作為 PWM 輸出。但其實(shí) LPC55S69 具備非常多的 PWM 資源。于是根據(jù) RT-Thread 設(shè)備驅(qū)動框架了,對接了其他通用定時(shí)器的 PWM 輸出。
開始對接
創(chuàng)建PWM設(shè)備
之前該 BSP 中的 drv_pwm 已經(jīng)對接了基本的接口,但只考慮了一個(gè)通道作為 PWM 輸出,在實(shí)際的使用中具有較大的局限性,不能充分發(fā)揮作用。我們首先基于PWM設(shè)備基類結(jié)構(gòu)派生出新的 PWM 設(shè)備結(jié)構(gòu)體:
struct lpc_pwm
{
struct rt_device_pwm pwm_device;
CTIMER_Type * tim;
uint32_t channel;
char *name;
};
因?yàn)?PWM 設(shè)備不止一個(gè) ,所以我們定義一個(gè)全局的 PWM 設(shè)備表來同時(shí)創(chuàng)建多個(gè) PWM 設(shè)備:
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
};
/* 可以根據(jù)實(shí)際需求自行擴(kuò)展 */
選擇指定定時(shí)器的具體通道作為 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
}
/* 可以根據(jù)實(shí)際需求自行擴(kuò)展 */
實(shí)現(xiàn)PWM設(shè)備的操作方法
PWM 設(shè)備只有一個(gè) control 方法, control 方法使用設(shè)備控制字 cmd 來區(qū)分操作,分別有ENABLE、DISABLE、SET、GET。這部分原先已經(jīng)基本實(shí)現(xiàn)過了,只需添加新的定時(shí)器判斷分支即可。
注冊PWM設(shè)備
原先是使用 rt_hw_pwm_init() 即可注冊定時(shí)器2通道1這一個(gè)定時(shí)器設(shè)備,但現(xiàn)在需要注冊的是多個(gè) PWM 設(shè)備,于是編寫 lpc_pwm_init() 將 PWM 設(shè)備表中的多個(gè) PWM 設(shè)備逐個(gè)進(jìn)行注冊。
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 的重構(gòu)基本完成,主要目的是更全面的對接 RT-Thread 設(shè)備框架,能夠同時(shí)使用多路 PWM 輸出,提高其適用性和靈活性。
-
LPC
+關(guān)注
關(guān)注
8文章
136瀏覽量
77623 -
定時(shí)器
+關(guān)注
關(guān)注
23文章
3246瀏覽量
114719 -
CMD命令
+關(guān)注
關(guān)注
0文章
28瀏覽量
8306 -
RT-Thread
+關(guān)注
關(guān)注
31文章
1285瀏覽量
40081 -
PWM輸出
+關(guān)注
關(guān)注
1文章
66瀏覽量
5135
發(fā)布評論請先 登錄
相關(guān)推薦
評論