[开发板与模块] 【ESK32-30519 + ESK32-21001测评】01.新建工程+LED+KEY+USART

[复制链接]
 楼主| xld0932 发表于 2022-10-7 15:30 | 显示全部楼层 |阅读模式
<
收到了开发板好久了,由于工作和其它事一直没有开始测评……从本周开始,将根据测评计划来一一完成,对主办方和合泰先表示歉意,没有按时规定的时间来发布测评帖子


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


准备工作
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, 下载次数: 4)
e-link32_Lite_V2.4.pdf (150.53 KB, 下载次数: 3)
ESK32-2x001使用手册.pdf (2.21 MB, 下载次数: 3)
ESK32-30519_HT32F54253_SK_v1.0_20211115.pdf (248.21 KB, 下载次数: 3)
Touch_7SEG_LED.pdf (93.45 KB, 下载次数: 3)


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


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


添加工程文件
10.jpg


配置工程
11.jpg 12.jpg 13.jpg 14.jpg 15.jpg 16.jpg 17.jpg 18.jpg 19.jpg


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

  1. /*******************************************************************************
  2. * [url=home.php?mod=space&uid=247401]@brief[/url]      
  3. * @param      
  4. * @retval      
  5. * [url=home.php?mod=space&uid=93590]@Attention[/url]   
  6. *******************************************************************************/
  7. void USART1_Init(void)
  8. {
  9.     CKCU_PeripClockConfig_TypeDef CKCUClock = {{0}};
  10.     USART_InitTypeDef             USART_InitStructure;

  11.     USART_InitStructure.USART_BaudRate   = 115200;
  12.     USART_InitStructure.USART_WordLength = USART_WORDLENGTH_8B;
  13.     USART_InitStructure.USART_StopBits   = USART_STOPBITS_1;
  14.     USART_InitStructure.USART_Parity     = USART_PARITY_NO;
  15.     USART_InitStructure.USART_Mode       = USART_MODE_NORMAL;

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

  19.     AFIO_GPxConfig(GPIO_PA, AFIO_PIN_4, AFIO_FUN_USART_UART);
  20.     AFIO_GPxConfig(GPIO_PA, AFIO_PIN_5, AFIO_FUN_USART_UART);

  21.     USART_Init(HT_USART1, &USART_InitStructure);

  22.     USART_TxCmd(HT_USART1, ENABLE);
  23.     USART_RxCmd(HT_USART1, ENABLE);

  24.     NVIC_EnableIRQ(USART1_IRQn);
  25. }


  26. /*******************************************************************************
  27. * @brief      
  28. * @param      
  29. * @retval      
  30. * @attention   
  31. *******************************************************************************/
  32. void USART1_IRQHandler(void)
  33. {
  34. }

  35. /*******************************************************************************
  36. * @brief      
  37. * @param      
  38. * @retval      
  39. * @attention   
  40. *******************************************************************************/
  41. int fputc(int ch, FILE *f)
  42. {
  43.     HT_USART1->DR = (uint8_t)ch;
  44.     while((HT_USART1->SR & USART_FLAG_TXC) == RESET);

  45.     return ch;
  46. }



  • KEY

  1. /* Private typedef -----------------------------------------------------------*/
  2. typedef struct
  3. {
  4.     HT_GPIO_TypeDef* HT_GPIOx;
  5.     uint8_t          Index;
  6.     uint16_t         GPIO_PIN_n;
  7.     FlagStatus       ActiveLevel;
  8. } KEY_TypeDef;


  9. /* Private define ------------------------------------------------------------*/
  10. /* Private macro -------------------------------------------------------------*/


  11. /* Private variables ---------------------------------------------------------*/
  12. KEY_TypeDef KEY_TAB[3] =
  13. {
  14.     {HT_GPIOB, GPIO_PB, GPIO_PIN_12, SET},
  15.     {HT_GPIOB, GPIO_PB, GPIO_PIN_2,  RESET},
  16.     {HT_GPIOD, GPIO_PD, GPIO_PIN_3,  RESET},
  17. };


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


  20. /* Private variables ---------------------------------------------------------*/
  21. MultiTimer KEY_MultiTimer;


  22. /* Private function prototypes -----------------------------------------------*/
  23. /* Private functions ---------------------------------------------------------*/


  24. /* Exported variables --------------------------------------------------------*/
  25. /* Exported function prototypes ----------------------------------------------*/


  26. /*******************************************************************************
  27. * @brief      
  28. * @param      
  29. * @retval      
  30. * @attention   
  31. *******************************************************************************/
  32. uint8_t read_pin_level(uint8_t pin_id)
  33. {
  34.     return GPIO_ReadInBit(KEY_TAB[pin_id].HT_GPIOx, KEY_TAB[pin_id].GPIO_PIN_n);
  35. }


  36. /*******************************************************************************
  37. * @brief      
  38. * @param      
  39. * @retval      
  40. * @attention   
  41. *******************************************************************************/
  42. void KEY_Handler(void *btn)
  43. {
  44.     Button *key = btn;

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

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

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

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

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

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

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

  66.         default:
  67.             break;
  68.     }
  69. }


  70. /*******************************************************************************
  71. * @brief      
  72. * @param      
  73. * @retval      
  74. * @attention   
  75. *******************************************************************************/
  76. void KEY_RepeatHandler(void *btn)
  77. {
  78.     Button *key = btn;

  79.     switch(key->button_id)
  80.     {
  81.         case 0 : printf("\r\nK1 : PRESS_REPEAT"); break;
  82.         case 1 : printf("\r\nK2 : PRESS_REPEAT"); break;
  83.         case 2 : printf("\r\nK3 : PRESS_REPEAT"); break;
  84.         case 3 : printf("\r\nK4 : PRESS_REPEAT"); break;
  85.         default: break;
  86.     }
  87. }


  88. /*******************************************************************************
  89. * @brief      
  90. * @param      
  91. * @retval      
  92. * @attention   
  93. *******************************************************************************/
  94. void KEY_MultiTimerCallback(MultiTimer *timer, void *userData)
  95. {
  96.     button_ticks();

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


  99. /*******************************************************************************
  100. * @brief      
  101. * @param      
  102. * @retval      
  103. * @attention   
  104. *******************************************************************************/
  105. void KEY_Init(void)
  106. {
  107.     CKCU_PeripClockConfig_TypeDef CKCUClock = {{0}};

  108.     CKCUClock.Bit.PB    = 1;
  109.     CKCUClock.Bit.PD    = 1;
  110.     CKCUClock.Bit.AFIO  = 1;
  111.     CKCU_PeripClockConfig(CKCUClock, ENABLE);

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

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

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


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



  • LED

  1. /* Private variables ---------------------------------------------------------*/
  2. MultiTimer LED_MultiTimer;


  3. /* Private function prototypes -----------------------------------------------*/
  4. /* Private functions ---------------------------------------------------------*/


  5. /* Exported variables --------------------------------------------------------*/
  6. /* Exported function prototypes ----------------------------------------------*/


  7. /*******************************************************************************
  8. * @brief      
  9. * @param      
  10. * @retval      
  11. * @attention   
  12. *******************************************************************************/
  13. void LED_MultiTimerCallback(MultiTimer *timer, void *userData)
  14. {
  15.     HT_GPIOD->DOUTR ^= GPIO_PIN_1;
  16.     HT_GPIOC->DOUTR ^= GPIO_PIN_14;
  17.     HT_GPIOC->DOUTR ^= GPIO_PIN_15;

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


  20. /*******************************************************************************
  21. * @brief      
  22. * @param      
  23. * @retval      
  24. * @attention   
  25. *******************************************************************************/
  26. void LED_Init(void)
  27. {
  28.     CKCU_PeripClockConfig_TypeDef CKCUClock = {{0}};

  29.     CKCUClock.Bit.PC    = 1;
  30.     CKCUClock.Bit.PD    = 1;
  31.     CKCUClock.Bit.AFIO  = 1;
  32.     CKCU_PeripClockConfig(CKCUClock, ENABLE);

  33.     AFIO_GPxConfig(GPIO_PD, GPIO_PIN_1,  AFIO_FUN_GPIO);
  34.     AFIO_GPxConfig(GPIO_PC, GPIO_PIN_14, AFIO_FUN_GPIO);
  35.     AFIO_GPxConfig(GPIO_PC, GPIO_PIN_15, AFIO_FUN_GPIO);

  36.     HT_GPIOD->SRR = GPIO_PIN_1;
  37.     HT_GPIOC->SRR = GPIO_PIN_14;
  38.     HT_GPIOC->SRR = GPIO_PIN_15;

  39.     GPIO_PullResistorConfig(HT_GPIOD, GPIO_PIN_1,  GPIO_PR_DISABLE);
  40.     GPIO_DriveConfig(       HT_GPIOD, GPIO_PIN_1,  GPIO_DV_8MA);
  41.     GPIO_DirectionConfig(   HT_GPIOD, GPIO_PIN_1,  GPIO_DIR_OUT);

  42.     GPIO_PullResistorConfig(HT_GPIOC, GPIO_PIN_14, GPIO_PR_DISABLE);
  43.     GPIO_DriveConfig(       HT_GPIOC, GPIO_PIN_14, GPIO_DV_8MA);
  44.     GPIO_DirectionConfig(   HT_GPIOC, GPIO_PIN_14, GPIO_DIR_OUT);

  45.     GPIO_PullResistorConfig(HT_GPIOC, GPIO_PIN_15, GPIO_PR_DISABLE);
  46.     GPIO_DriveConfig(       HT_GPIOC, GPIO_PIN_15, GPIO_DV_8MA);
  47.     GPIO_DirectionConfig(   HT_GPIOC, GPIO_PIN_15, GPIO_DIR_OUT);

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



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


软件工程源代码
Project.zip (842.44 KB, 下载次数: 7)


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

 楼主| xld0932 发表于 2022-10-7 15:41 | 显示全部楼层
本文完成了熟悉开发板、新建工程、GPIO(LED、KEY)功能实验、USART(RS-232)功能实验
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:King.Xu

77

主题

3023

帖子

38

粉丝
快速回复 在线客服 返回列表 返回顶部
个人签名:King.Xu

77

主题

3023

帖子

38

粉丝
快速回复 在线客服 返回列表 返回顶部