【沁恒蓝牙开发】 LDE(外设)输出互补的PWM

文章目录

CH585 提供了LED 屏控制卡接口,内置2个4 字节FIFO,支持DMA 和中断,支持1/2/4/8路数据线接口。所以"LED"再本文特指外设LED 屏控制卡接口

可以用于控制ARGB灯(WS2812)、控制LED屏幕、生成互补的PWM等。本文就是介绍利用LDE生成互补PWM的。

1、代码

c 复制代码
__attribute__((__aligned__(4))) uint32_t tx_data[] = {0x55AA55AA,0x55AA55AA};

#define  LSB_HSB         1  // LED串行数据位序, 1:高位在前;  0:低位在前
#define  POLAR           0  // LED数据输出极性, 0:直通,数据0输出0,数据1输出1; 1为反相


/*********************************************************************
 * @fn      main
 *
 * @brief   主函数
 *
 * @return  none
 */
int LED_Init()
{
    //led clk
    GPIOA_ModeCfg( GPIO_Pin_4, GPIO_ModeOut_PP_5mA );

    //led data
    //LED 0
    GPIOA_ModeCfg( GPIO_Pin_0, GPIO_ModeOut_PP_5mA );
    //LED 1
    GPIOA_ModeCfg( GPIO_Pin_1, GPIO_ModeOut_PP_5mA );

    //配置分频和模式选择
    ch58x_led_controller_init(CH58X_LED_OUT_MODE_DOUBLE, 14);

    //开始发送,后面再发送就在中断里面发送了
    TMR_DMACfg(ENABLE, (uint16_t)(uint32_t)&tx_data, 2, Mode_Single);

#if LSB_HSB   //LSB HSB
    R8_LED_CTRL_MOD ^= RB_LED_BIT_ORDER;
#endif

#if POLAR     //极性
    R8_LED_CTRL_MOD ^= RB_LED_OUT_POLAR;
#endif

    LED_ENABLE();
    PFIC_EnableIRQ(LED_IRQn);

    while(1);
}

/*********************************************************************
 * @fn      LED_IRQHandler
 *
 * @brief   LED中断函数
 *
 * @return  none
 */
__INTERRUPT
__HIGH_CODE
void LED_IRQHandler(void)
{
    //清空中断标志
    if(LED_GetITFlag(RB_LED_IF_DMA_END))  // 获取中断标志
    {
       LED_ClearITFlag(RB_LED_IF_DMA_END); // 清除中断标志
       ch58x_led_controller_send(tx_data, 2);
    }
}

2、代码简介

2.1、初始化所需的IO

互补PWM需要的是2通道,所以初始化2个IO ;如果不需要时钟输出,不初始化GPIO即可,但是只要初始化就不可作为普通IO输出了,只能作为时钟。

综:时钟脚 不开启时,就是输出低电平;开始时,时钟

c 复制代码
//led clk
GPIOA_ModeCfg( GPIO_Pin_4, GPIO_ModeOut_PP_5mA );

//led data
//LED 0
GPIOA_ModeCfg( GPIO_Pin_0, GPIO_ModeOut_PP_5mA );
//LED 1
GPIOA_ModeCfg( GPIO_Pin_1, GPIO_ModeOut_PP_5mA );

不初始化时钟脚的效果如下:

2.2、初始化LED

c 复制代码
    //配置分频和模式选择
    ch58x_led_controller_init(CH58X_LED_OUT_MODE_DOUBLE, 14);

    //开始发送,后面再发送就在中断里面发送了
    TMR_DMACfg(ENABLE, (uint16_t)(uint32_t)&tx_data, 2, Mode_Single);

#if LSB_HSB   //LSB HSB    // LED串行数据位序, 1:高位在前;  0:低位在前
    R8_LED_CTRL_MOD ^= RB_LED_BIT_ORDER;
#endif

#if POLAR     //极性    // LED数据输出极性, 0:直通,数据0输出0,数据1输出1; 1为反相
    R8_LED_CTRL_MOD ^= RB_LED_OUT_POLAR;
#endif
 
    LED_ENABLE();   //LED输出使能
    PFIC_EnableIRQ(LED_IRQn); //LED中断使能

2.3、LDE中断回调

中断回调内,判断是LED中断标志后,清除标志位后,重新发送数据。

c 复制代码
__INTERRUPT
__HIGH_CODE
void LED_IRQHandler(void)
{
    //清空中断标志
    if(LED_GetITFlag(RB_LED_IF_DMA_END))  // 获取中断标志
    {
       LED_ClearITFlag(RB_LED_IF_DMA_END); // 清除中断标志
       ch58x_led_controller_send(tx_data, 2);
    }
}

3、实验

如下图就利用LED生成了一对互补的PWM通道分别是:

通道1:LED输出通道1

通道2:LED输出通道2

通道2:LED时钟(可关闭输出)

PWM频率

相关推荐
jianqiang.xue1 小时前
低功耗产品架构专项优化:电池供电设备休眠、唤醒、漏电流、待机功耗极致优化
stm32·单片机·mcu·物联网·架构·esp32
Mount2561 小时前
STM32CubeIDE使用教程(自用)
stm32·嵌入式硬件
ACP广源盛139246256731 小时前
端侧 AI 硬件架构实践@ACP#中端边缘整机 PCIe 扩展与 IX7012 器件分析
大数据·数据库·人工智能·嵌入式硬件·开源·硬件架构
ACP广源盛139246256731 小时前
端侧 AI 硬件架构探讨@ACP#多外设高密度整机 PCIe 扩展与 IX7024 器件分析
大数据·数据库·人工智能·嵌入式硬件·开源·硬件架构
智购科技自动售货机工厂1 小时前
2026自动售货机异常重启根因分析:从日志挖掘到内存取证的技术实践~YH
开发语言·数据库·单片机·嵌入式硬件·人机交互
jianqiang.xue2 小时前
专栏简介:《嵌入式 AI 智能体设计实战》
人工智能·stm32·单片机·物联网·架构·esp32
铅笔小新z2 小时前
【stm32】I2C 通信协议
stm32·单片机·嵌入式硬件
一条破秋裤2 小时前
GPIO输入输出
单片机·嵌入式硬件
单片机仿真设计2 小时前
【proteus仿真】基于 STM32 单片机货架巡检机器人设计(仿真图+程序)
stm32·单片机·嵌入式硬件·机器人·proteus·毕设
虎王物联11 小时前
STM32 HAL库串口DMA空闲中断:高效接收不定长Modbus数据帧
stm32·单片机·嵌入式硬件·dma·modbus