CH585是支持LED点阵屏接口:支持1/2/4/8路数据线,该接口除了用来驱动LED点阵屏还可以用来驱屏和驱灯。

芯片提供了LED屏控制卡接口,内置2个4字节FIFO,支持DMA和中断,节约CPU处理时间, 支持1/2/4/8路数据线接口。

LED 配置:

(1)、设置R8_LED_CLOCK_DIV 选择LED 输出时钟频率;

(2)、设置R16_LED_DMA_BEG 指向准备输出数据的起始地址;

(3)、设置R8_LED_CTRL_MOD,选择通道模式、输出极性、位顺序、启用中断和DMA功能等;

(4)、设置LEDC和必要的LED0~LED7引脚方向为输出,可选地,设置相应I/O的驱动能力;

(5)、设置DMA计数寄存器R16_LED_DMA_CNT,启动DMA发送,或者用写FIFO的方式发送数据。

在EVT/EXAM目录下提供了LED例程:

#include "CH58x_common.h"
#include "ch58x_drv_ledc.h"

__attribute__((__aligned__(4))) uint32_t tx_data[8] = {0x01020408,0x10204080,0x03,0x04,0x05,0x06,0x07,0x08};

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

/*********************************************************************
 * @fn      DebugInit
 *
 * @brief   调试初始化
 *
 * @return  none
 */
void DebugInit(void)
{
    GPIOA_SetBits(GPIO_Pin_14);
    GPIOPinRemap(ENABLE, RB_PIN_UART0);
    GPIOA_ModeCfg(GPIO_Pin_15, GPIO_ModeIN_PU);
    GPIOA_ModeCfg(GPIO_Pin_14, GPIO_ModeOut_PP_5mA);
    UART0_DefInit();
}

/*********************************************************************
 * @fn      main
 *
 * @brief   主函数
 *
 * @return  none
 */
int main()
{
    HSECFG_Capacitance(HSECap_18p);
    SetSysClock(SYSCLK_FREQ);
    /* 配置串口调试 */
    DebugInit();
    PRINT( "Start @ChipID=%02X\n", R8_CHIP_ID );

    //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 );
    //LED 2
    GPIOA_ModeCfg( GPIO_Pin_2, GPIO_ModeOut_PP_5mA );
    //LED 3
    GPIOA_ModeCfg( GPIO_Pin_3, GPIO_ModeOut_PP_5mA );
    //lED 4
    GPIOA_ModeCfg( GPIO_Pin_5 , GPIO_ModeOut_PP_5mA );
    //lED 5
    GPIOA_ModeCfg( GPIO_Pin_6 , GPIO_ModeOut_PP_5mA );
    //lED 6
    GPIOA_ModeCfg( GPIO_Pin_7 , GPIO_ModeOut_PP_5mA );
    //lED 7
    GPIOA_ModeCfg( GPIO_Pin_8 , GPIO_ModeOut_PP_5mA );

    //配置分频和模式选择
    ch58x_led_controller_init(CH58X_LED_OUT_MODE_SINGLE, 128);

    //开始发送,后面再发送就在中断里面发送了
    LED_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_INT))  // 获取中断标志
    {
       LED_ClearITFlag(RB_LED_IF_DMA_INT); // 清除中断标志
       ch58x_led_controller_send(tx_data, 2);
    }
}

 

posted on 2026-10-08 14:35  WCH蓝牙应用分享  阅读(10)  评论(0)    收藏  举报