文章目录
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频率
