HT32F54253 -- ESK32-30519 / ESK32-21001测评 2022-10-17

 HT32F54253芯片集成了LED控制器,用来驱动8段数码管进行显示,相比于之前MCU+LED驱动芯片的方案来说,集成度提高的同时,也节省了BOM成本;给需要LED显示应用的客户了提供了最优解决方案。具体的LEDC特性如下所示:

▆ 驱动多达 N 个 8 段数码管
● 对于 HT32F54231/HT32F54241, N = 8
● 对于 HT32F54243/HT32F54253, N = 12
▆ 支持共阳极或共阴极的 8 段数码管
▆ 支持帧中断
▆ 三种频率来源: LSI、 LSE、 PCLK
▆ 可由死区时间设定控制 LED 亮 / 暗
LED 控制器用来驱动 8 段数码管, HT32F54231/HT32F54241 系列单片机最多可以驱动 8 个 8段数码管, HT32F54243/HT32F54253 系列单片机最多可以驱动 12 个 8 段数码管。可根据数码管数量不同,弹性配置 COM 的出脚位置和序号,一个完整的帧会依序由小到大扫描所使能的COM 口。假设使用到 4 个 8 段数码管并且始能 COM0、 COM5、 COM6 和 COM7,则一个完整的帧会依序扫描 COM0、 COM5、 COM6 和 COM7,且每一段 COM 口扫描时间均等于 1/4 Frame。
每一段 COM 口扫描时间可细分成死区时间 Duty 以及 COM 口 Duty,可通过调整死区时间 Duty来改变 LED 亮暗。
 
 
原理图
 
 
 
实现功能
对LED的控制引脚COM和SEG进行初始化,对LEDC的控制时序和参数进行配置;通过调用MultiTimer组件实现LED字符的循环显示;
通过结构体定义38个LED可显示字符的编码对照表,ch表示显示的字符,data表示显示ch时各个SEG段的状态,1表示点亮,0表示熄灭;data的bit0~bit7依次表示abcdefg以及dp这8个段;
在显示一个字符时,通过查表的方式先找到ch对应的data,即SEG对照表,然后再根据原理图的硬件连接,将SEG对照表换算成实际的显示数据,具体参考LEDC_GetCode这个函数的实现;
 
 
实现代码
复制
/* Includes ------------------------------------------------------------------*/
 
#include "LEDC.h"
 
 
 
 
 
/* Private typedef -----------------------------------------------------------*/
 
typedef struct
 
{
 
    char    ch;
 
    uint8_t Data;
 
} LED_CODING_TypeDef;
 
 
 
 
 
/* Private define ------------------------------------------------------------*/
 
/* Private macro -------------------------------------------------------------*/
 
 
 
 
 
/* Private variables ---------------------------------------------------------*/
 
MultiTimer LEDC_MultiTimer;
 
 
 
 
 
/* Private variables ---------------------------------------------------------*/
 
const LED_CODING_TypeDef LED_CODE_Table[38] = 
 
{
 
    {' ', 0x00},
 
    {'0', 0x3F},
 
    {'1', 0x06},
 
    {'2', 0x5B},
 
    {'3', 0x4F},
 
    {'4', 0x66},
 
    {'5', 0x6D},
 
    {'6', 0x7D},
 
    {'7', 0x07},
 
    {'8', 0x7F},
 
    {'9', 0x6F},
 
    {'A', 0x77},
 
    {'b', 0x7C},
 
    {'c', 0x58},
 
    {'C', 0x39},
 
    {'d', 0x5E},
 
    {'E', 0x79},
 
    {'F', 0x71},
 
    {'g', 0x6F},
 
    {'H', 0x76},
 
    {'h', 0x74},
 
    {'i', 0x04},
 
    {'I', 0x30},
 
    {'J', 0x1E},
 
    {'l', 0x30},
 
    {'L', 0x38},
 
    {'n', 0x54},
 
    {'o', 0x5C},
 
    {'O', 0x3F},
 
    {'P', 0x73},
 
    {'q', 0x67},
 
    {'r', 0x50},
 
    {'S', 0x6D},
 
    {'t', 0x78},
 
    {'u', 0x1C},
 
    {'U', 0x3E},
 
    {'y', 0x6E},
 
    {'-', 0x40},
 
};
 
 
 
 
 
/* Private function prototypes -----------------------------------------------*/
 
/* Private functions ---------------------------------------------------------*/
 
 
 
 
 
/* Exported variables --------------------------------------------------------*/
 
/* Exported function prototypes ----------------------------------------------*/
 
 
 
 
 
/*******************************************************************************
 
 * [url=home.php?mod=space&uid=247401]@brief[/url]       
 
 * @param       
 
 * @retval      
 
 * [url=home.php?mod=space&uid=93590]@Attention[/url]   
 
*******************************************************************************/
 
uint8_t LEDC_GetCode(char ch)
 
{
 
    uint8_t SEGn[8] = 
 
    {
 
        0x10, /* a :SEG4 */
 
        0x80, /* b :SEG7 */
 
        0x04, /* c :SEG2 */
 
        0x20, /* d :SEG5 */
 
        0x08, /* e :SEG3 */
 
        0x01, /* f :SEG0 */
 
        0x40, /* g :SEG6 */
 
        0x02, /* dp:SEG1 */
 
    };
 
 
 
    for(uint8_t i = 0; i < 38; i++)
 
    {
 
        if(ch == LED_CODE_Table[i].ch)
 
        {
 
            uint8_t Data = 0;
 
            uint8_t Temp = LED_CODE_Table[i].Data;
 
 
 
            for(uint8_t j = 0; j < 8; j++)
 
            {
 
                if((Temp >> j) & 0x01) Data += SEGn[j];
 
            }
 
 
 
            return Data;
 
        }
 
    }
 
 
 
    return 0x00;
 
}
 
 
 
 
 
/*******************************************************************************
 
 * [url=home.php?mod=space&uid=247401]@brief[/url]       
 
 * @param       
 
 * @retval      
 
 * [url=home.php?mod=space&uid=93590]@Attention[/url]   
 
*******************************************************************************/
 
void LEDC_MultiTimerCallback(MultiTimer *timer, void *userData)
 
{
 
    static uint8_t Index = 0;
 
 
 
    LEDC_SetData(4, LEDC_GetCode(LED_CODE_Table[Index].ch));
 
    LEDC_SetData(5, LEDC_GetCode(LED_CODE_Table[Index].ch));
 
    LEDC_SetData(6, LEDC_GetCode(LED_CODE_Table[Index].ch));
 
    LEDC_SetData(7, LEDC_GetCode(LED_CODE_Table[Index].ch));
 
 
 
    Index = (Index + 1) % 38;
 
 
 
    MultiTimerStart(&LEDC_MultiTimer, 250, LEDC_MultiTimerCallback, "LEDC");
 
}
 
 
 
 
 
/*******************************************************************************
 
 * @brief       
 
 * @param       
 
 * @retval      
 
 * @attention   
 
*******************************************************************************/
 
void LEDC_Configuration(void)
 
{
 
    LEDC_InitTypeDef LEDC_InitStruct;
 
 
 
    CKCU_PeripClockConfig_TypeDef CKCUClock = {{0}};
 
    CKCUClock.Bit.LEDC       = 1;
 
    CKCUClock.Bit.AFIO       = 1;
 
    CKCU_PeripClockConfig(CKCUClock, ENABLE);
 
 
 
    /* SEG0~7 */
 
    AFIO_GPxConfig(GPIO_PA, AFIO_PIN_0, AFIO_FUN_LEDC);
 
    AFIO_GPxConfig(GPIO_PA, AFIO_PIN_1, AFIO_FUN_LEDC);
 
    AFIO_GPxConfig(GPIO_PA, AFIO_PIN_2, AFIO_FUN_LEDC);
 
    AFIO_GPxConfig(GPIO_PA, AFIO_PIN_3, AFIO_FUN_LEDC);
 
    AFIO_GPxConfig(GPIO_PD, AFIO_PIN_4, AFIO_FUN_LEDC);
 
    AFIO_GPxConfig(GPIO_PD, AFIO_PIN_5, AFIO_FUN_LEDC);
 
    AFIO_GPxConfig(GPIO_PD, AFIO_PIN_2, AFIO_FUN_LEDC);
 
    AFIO_GPxConfig(GPIO_PA, AFIO_PIN_7, AFIO_FUN_LEDC);
 
 
 
    /* COM0~4 */
 
    AFIO_GPxConfig(GPIO_PC, AFIO_PIN_4, AFIO_FUN_LEDC);
 
    AFIO_GPxConfig(GPIO_PC, AFIO_PIN_5, AFIO_FUN_LEDC);
 
    AFIO_GPxConfig(GPIO_PC, AFIO_PIN_6, AFIO_FUN_LEDC);
 
    AFIO_GPxConfig(GPIO_PC, AFIO_PIN_7, AFIO_FUN_LEDC);
 
 
 
    /* Frame = fCK_LED / (LEDC_DutyClockNumber * COM Number) */
 
    /*       = 1600 / (8*4) =  50Hz */
 
    LEDC_InitStruct.LEDC_ClockSource     = LEDC_SRC_LSI;    /* LSI = 32Khz */
 
    LEDC_InitStruct.LEDC_ClockPrescaler  = 20 - 1;          /* fCK_LED = 32Khz / 20 = 1600 Hz */
 
    LEDC_InitStruct.LEDC_DutyClockNumber = LEDC_DTYNUM_8;   /* Duty CLock Number = 8 Clock */
 
    LEDC_InitStruct.LEDC_COMxEN          = LEDC_COM4EN | LEDC_COM5EN | LEDC_COM6EN | LEDC_COM7EN;
 
 
 
    /* Change the brightness, the parameter range is 0~Duty (CLock Number-1.) */
 
    /* 0: the brightest, 7: the darkest. */
 
    LEDC_InitStruct.LEDC_DeadTime        = 0; 
 
    LEDC_Init(&LEDC_InitStruct);
 
 
 
    /* Set the LEDC mode to COMMON_CATHODE. */
 
    LEDC_SetPolarityMode(LEDC_COM4POL | LEDC_COM5POL | LEDC_COM6POL | LEDC_COM7POL,
 
                         LEDC_SEG0POL | LEDC_SEG1POL | LEDC_SEG2POL | LEDC_SEG3POL | LEDC_SEG4POL | LEDC_SEG5POL | LEDC_SEG6POL | LEDC_SEG7POL,
 
                         COMMON_CATHODE);
 
 
 
    LEDC_IntConfig(ENABLE);
 
    NVIC_EnableIRQ(LEDC_IRQn);
 
 
 
    LEDC_Cmd(ENABLE);
 
 
 
    MultiTimerStart(&LEDC_MultiTimer, 250, LEDC_MultiTimerCallback, "LEDC");
 
}
 
 
 
 
 
/*******************************************************************************
 
 * @brief       
 
 * @param       
 
 * @retval      
 
 * @attention   
 
*******************************************************************************/
 
void LEDC_IRQHandler(void)
 
{
 
    if(LEDC_GetFlagStatus())
 
    {
 
        LEDC_ClearFlagStatus();
 
    }
 
}
 
 
运行结果
 
 
 
软件工程源代码
 Project.zip (974.68 KB)
 
---------------------
 
作者:xld0932
 
链接:https://bbs.21ic.com/icview-3258702-1-1.html
 
来源:21ic.com
 
此文章已获得原创/原创奖标签,著作权归21ic所有,任何人未经允许禁止转载。

勘误纠正/技术交流/采购需求/批量供应(Correction/Technical/Perchase/Wholesale)(共0条评论)
  • 暂无评论
E-mail:
AA:
Contents:
  Code: captcha