打印
[开发板与模块]

【ESK32-30519 + ESK32-21001测评】01.新建工程+LED+KEY+USART

[复制链接]
815|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
收到了开发板好久了,由于工作和其它事一直没有开始测评……从本周开始,将根据测评计划来一一完成,对主办方和合泰先表示歉意,没有按时规定的时间来发布测评帖子


开发板靓照
收到的开发有2块,一块是搭载HT32F54253芯片的核心板ESK32-30519 V1.0,另外一块是ESK32-2x001扩展底板,为核心板扩展了丰富的外接接口和应用,如下图所示:



准备工作
ESK32-30519 V1.0核心板板载了elink32-lite调试工具,通过S1这个拨码开关来连接到HT32F54253芯片的SWD烧录引脚;但我们在接下来的测评中,将会使用外接的J-LINK调试工具连接到ESK32-2x001扩展底板,对HT32F54253芯片进行下载和调试,所以我们需要将核心板上的S1拨码开关全部拨到OFF的状态!

我们需要准备一个USB转RS-232的接口线,连接到ESK32-2x001扩展底板的RS-232接口上,与HT32F54253芯片的USART1进行通讯/数据交互,我们也是通过这个RS-232接口进行打印消息输出的。

最后我们就是到官网上去下载对应的一些资料啦,对于原理图、数据手册等如下所示,对应的软件包(HT32_STD_5xxxx_FWLib_V1.1.1_5938)可以到官网上去下载,文件太大了,上传不了,如下所示:
simHT32F54231_241_243_253_Datasheetv110.pdf (3.84 MB)
e-link32_Lite_V2.4.pdf (150.53 KB)
ESK32-2x001使用手册.pdf (2.21 MB)
ESK32-30519_HT32F54253_SK_v1.0_20211115.pdf (248.21 KB)
Touch_7SEG_LED.pdf (93.45 KB)


安装KEIL芯片支持包
在软件包文件夹中有一个Holtek.HT32_DFP.latest文件,这个就是HT在KEIL软件中进行开发的芯片支持包,如果之前没有开发过合泰的项目,第一个步骤就需要安装此项,要不然就连打开软件包中的示例工程都会提示找不到对应的芯片型号的!双击运行,根据安装向导完成安装,如下图所示:



新建工程
在合泰官方提示的软件包中,Library文件夹中提供了芯片底层的驱动程序,我们参考官方示例工程,新建一个适合自己的工程模板(官方的工程模板有点复杂,大而全的工程),具体步骤如下图所示:



添加工程文件



配置工程



编写驱动代码
通过SysTick产生1ms的中断,作为系统的时基;使用MultiTimer组件实现系统任务的注册、调度和运行;使用MultiButton组件结合按键实现按键检测和回调函数的执行;使用USART通过重载fputc函数实现printf消息的打印输出,具体代码如下所示:
  • USART

/*******************************************************************************
* [url=home.php?mod=space&uid=247401]@brief[/url]      
* @param      
* @retval      
* [url=home.php?mod=space&uid=93590]@Attention[/url]   
*******************************************************************************/
void USART1_Init(void)
{
    CKCU_PeripClockConfig_TypeDef CKCUClock = {{0}};
    USART_InitTypeDef             USART_InitStructure;

    USART_InitStructure.USART_BaudRate   = 115200;
    USART_InitStructure.USART_WordLength = USART_WORDLENGTH_8B;
    USART_InitStructure.USART_StopBits   = USART_STOPBITS_1;
    USART_InitStructure.USART_Parity     = USART_PARITY_NO;
    USART_InitStructure.USART_Mode       = USART_MODE_NORMAL;

    CKCUClock.Bit.USART1  = 1;
    CKCUClock.Bit.AFIO    = 1;
    CKCU_PeripClockConfig(CKCUClock, ENABLE);

    AFIO_GPxConfig(GPIO_PA, AFIO_PIN_4, AFIO_FUN_USART_UART);
    AFIO_GPxConfig(GPIO_PA, AFIO_PIN_5, AFIO_FUN_USART_UART);

    USART_Init(HT_USART1, &USART_InitStructure);

    USART_TxCmd(HT_USART1, ENABLE);
    USART_RxCmd(HT_USART1, ENABLE);

    NVIC_EnableIRQ(USART1_IRQn);
}


/*******************************************************************************
* @brief      
* @param      
* @retval      
* @attention   
*******************************************************************************/
void USART1_IRQHandler(void)
{
}

/*******************************************************************************
* @brief      
* @param      
* @retval      
* @attention   
*******************************************************************************/
int fputc(int ch, FILE *f)
{
    HT_USART1->DR = (uint8_t)ch;
    while((HT_USART1->SR & USART_FLAG_TXC) == RESET);

    return ch;
}



  • KEY

/* Private typedef -----------------------------------------------------------*/
typedef struct
{
    HT_GPIO_TypeDef* HT_GPIOx;
    uint8_t          Index;
    uint16_t         GPIO_PIN_n;
    FlagStatus       ActiveLevel;
} KEY_TypeDef;


/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/


/* Private variables ---------------------------------------------------------*/
KEY_TypeDef KEY_TAB[3] =
{
    {HT_GPIOB, GPIO_PB, GPIO_PIN_12, SET},
    {HT_GPIOB, GPIO_PB, GPIO_PIN_2,  RESET},
    {HT_GPIOD, GPIO_PD, GPIO_PIN_3,  RESET},
};


/* Private variables ---------------------------------------------------------*/
struct Button btnKn[3];


/* Private variables ---------------------------------------------------------*/
MultiTimer KEY_MultiTimer;


/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/


/* Exported variables --------------------------------------------------------*/
/* Exported function prototypes ----------------------------------------------*/


/*******************************************************************************
* @brief      
* @param      
* @retval      
* @attention   
*******************************************************************************/
uint8_t read_pin_level(uint8_t pin_id)
{
    return GPIO_ReadInBit(KEY_TAB[pin_id].HT_GPIOx, KEY_TAB[pin_id].GPIO_PIN_n);
}


/*******************************************************************************
* @brief      
* @param      
* @retval      
* @attention   
*******************************************************************************/
void KEY_Handler(void *btn)
{
    Button *key = btn;

    char *KEY_NAME[3]  = {"Wakeup", "Key1", "Key2"};

    switch(key->event)
    {
        case PRESS_DOWN:
            printf("\r\n%s : PRESS_DOWN",       KEY_NAME[key->button_id]);
            break;

        case PRESS_UP:
            printf("\r\n%s : PRESS_UP",         KEY_NAME[key->button_id]);
            break;

        case SINGLE_CLICK:
            printf("\r\n%s : SINGLE_CLICK",     KEY_NAME[key->button_id]);
            break;

        case DOUBLE_CLICK:
            printf("\r\n%s : DOUBLE_CLICK",     KEY_NAME[key->button_id]);
            break;

        case LONG_PRESS_START:
            printf("\r\n%s : LONG_PRESS_START", KEY_NAME[key->button_id]);
            break;

        case LONG_PRESS_HOLD:
            printf("\r\n%s : LONG_PRESS_HOLD",  KEY_NAME[key->button_id]);
            break;

        default:
            break;
    }
}


/*******************************************************************************
* @brief      
* @param      
* @retval      
* @attention   
*******************************************************************************/
void KEY_RepeatHandler(void *btn)
{
    Button *key = btn;

    switch(key->button_id)
    {
        case 0 : printf("\r\nK1 : PRESS_REPEAT"); break;
        case 1 : printf("\r\nK2 : PRESS_REPEAT"); break;
        case 2 : printf("\r\nK3 : PRESS_REPEAT"); break;
        case 3 : printf("\r\nK4 : PRESS_REPEAT"); break;
        default: break;
    }
}


/*******************************************************************************
* @brief      
* @param      
* @retval      
* @attention   
*******************************************************************************/
void KEY_MultiTimerCallback(MultiTimer *timer, void *userData)
{
    button_ticks();

    MultiTimerStart(&KEY_MultiTimer, 5, KEY_MultiTimerCallback, "KEY");
}


/*******************************************************************************
* @brief      
* @param      
* @retval      
* @attention   
*******************************************************************************/
void KEY_Init(void)
{
    CKCU_PeripClockConfig_TypeDef CKCUClock = {{0}};

    CKCUClock.Bit.PB    = 1;
    CKCUClock.Bit.PD    = 1;
    CKCUClock.Bit.AFIO  = 1;
    CKCU_PeripClockConfig(CKCUClock, ENABLE);

    for(uint8_t i = 0; i < 3; i++)
    {
        AFIO_GPxConfig(KEY_TAB[i].Index, KEY_TAB[i].GPIO_PIN_n, AFIO_FUN_GPIO);

        GPIO_PullResistorConfig(KEY_TAB[i].HT_GPIOx, KEY_TAB[i].GPIO_PIN_n, GPIO_PR_DISABLE);
        GPIO_DirectionConfig(   KEY_TAB[i].HT_GPIOx, KEY_TAB[i].GPIO_PIN_n, GPIO_DIR_IN);
        GPIO_InputConfig(       KEY_TAB[i].HT_GPIOx, KEY_TAB[i].GPIO_PIN_n, ENABLE);

        button_init(  &btnKn[i], read_pin_level, KEY_TAB[i].ActiveLevel, i);
        button_attach(&btnKn[i], SINGLE_CLICK,   KEY_Handler);
        button_start( &btnKn[i]);
    }


    MultiTimerStart(&KEY_MultiTimer, 250, KEY_MultiTimerCallback, "KEY");
}



  • LED

/* Private variables ---------------------------------------------------------*/
MultiTimer LED_MultiTimer;


/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/


/* Exported variables --------------------------------------------------------*/
/* Exported function prototypes ----------------------------------------------*/


/*******************************************************************************
* @brief      
* @param      
* @retval      
* @attention   
*******************************************************************************/
void LED_MultiTimerCallback(MultiTimer *timer, void *userData)
{
    HT_GPIOD->DOUTR ^= GPIO_PIN_1;
    HT_GPIOC->DOUTR ^= GPIO_PIN_14;
    HT_GPIOC->DOUTR ^= GPIO_PIN_15;

    MultiTimerStart(&LED_MultiTimer, 250, LED_MultiTimerCallback, "LED");
}


/*******************************************************************************
* @brief      
* @param      
* @retval      
* @attention   
*******************************************************************************/
void LED_Init(void)
{
    CKCU_PeripClockConfig_TypeDef CKCUClock = {{0}};

    CKCUClock.Bit.PC    = 1;
    CKCUClock.Bit.PD    = 1;
    CKCUClock.Bit.AFIO  = 1;
    CKCU_PeripClockConfig(CKCUClock, ENABLE);

    AFIO_GPxConfig(GPIO_PD, GPIO_PIN_1,  AFIO_FUN_GPIO);
    AFIO_GPxConfig(GPIO_PC, GPIO_PIN_14, AFIO_FUN_GPIO);
    AFIO_GPxConfig(GPIO_PC, GPIO_PIN_15, AFIO_FUN_GPIO);

    HT_GPIOD->SRR = GPIO_PIN_1;
    HT_GPIOC->SRR = GPIO_PIN_14;
    HT_GPIOC->SRR = GPIO_PIN_15;

    GPIO_PullResistorConfig(HT_GPIOD, GPIO_PIN_1,  GPIO_PR_DISABLE);
    GPIO_DriveConfig(       HT_GPIOD, GPIO_PIN_1,  GPIO_DV_8MA);
    GPIO_DirectionConfig(   HT_GPIOD, GPIO_PIN_1,  GPIO_DIR_OUT);

    GPIO_PullResistorConfig(HT_GPIOC, GPIO_PIN_14, GPIO_PR_DISABLE);
    GPIO_DriveConfig(       HT_GPIOC, GPIO_PIN_14, GPIO_DV_8MA);
    GPIO_DirectionConfig(   HT_GPIOC, GPIO_PIN_14, GPIO_DIR_OUT);

    GPIO_PullResistorConfig(HT_GPIOC, GPIO_PIN_15, GPIO_PR_DISABLE);
    GPIO_DriveConfig(       HT_GPIOC, GPIO_PIN_15, GPIO_DV_8MA);
    GPIO_DirectionConfig(   HT_GPIOC, GPIO_PIN_15, GPIO_DIR_OUT);

    MultiTimerStart(&LED_MultiTimer, 250, LED_MultiTimerCallback, "LED");
}



运行结果
LED灯间隔250ms切换一次显示状态,当用户按下按键并抬起后,能够正确识别到对应的按键,并通过RS-232打印输出提示信息:



软件工程源代码
Project.zip (842.44 KB)


后续
第一次使用合泰的MCU/开发板,在参考示例工程报建新的工程时,需要注意在进行工程配置时,C/C++选项表和ASM选项表中预定义宏的配置,如果配置不正确会有相应的编译错误提示;另外就是startup和system文件后面是以数字序号的形式体现的,需要参考示例工程才知道添加哪一个,不是很习惯;在程序中对于外设时钟的初始化也是习惯的一个过程,与ST或者是国内其它MCU厂家的编程风格还是有些区别的,需要好好熟悉和适应一下,但整体第一次尝试,感觉还是挺好的,没有遇到卡壳的问题。

使用特权

评论回复

相关帖子

沙发
xld0932|  楼主 | 2022-10-7 15:41 | 只看该作者
本文完成了熟悉开发板、新建工程、GPIO(LED、KEY)功能实验、USART(RS-232)功能实验

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:上海灵动微电子股份有限公司资深现场应用工程师
简介:诚信·承诺·创新·合作

69

主题

2998

帖子

31

粉丝