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);
}
}
浙公网安备 33010602011771号