ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

合泰HT32单片机Keil5开发环境搭建与下载调试避坑指南

合泰HT32单片机Keil5开发环境搭建与下载调试避坑指南 在嵌入式这一行折腾久了你会发现真正难的不是写代码而是把开发环境搞到能跑通的那一步。最近因为项目需要我开始碰合泰的HT32系列单片机第一反应是这芯片性价比看着真不错Cortex-M内核、外设给得也挺全价格还压得低。但等到我准备动手写代码时才发现网上关于HT32开发环境搭建的教程要么太老、要么只讲一半连个正常能编译下载的流程都凑不齐硬生生踩了好几天坑。这篇是《合泰单片机HT32开发笔记》的第一篇先把最难啃的骨头啃下来Keil5环境怎么搭、芯片包怎么装、第一个工程怎么建、下载调试有哪些坑。这篇文章适合第一次接触HT32的人也适合一直用STM32想换换口味的工程师后面我会继续写GPIO、串口、定时器这些外设的实战用法你可以先把这套环境配好后面跟着跑代码会顺畅很多。1. 合泰HT32与Keil5的搭配逻辑1.1 HT32到底是什么定位合泰这个牌子很多人不陌生做8位单片机起家的比如HT66F系列在家电、小家电里出货量很大。但HT32是完全不同的产品线它用的是ARM Cortex-M0、M3、M4内核主频从40MHz到200MHz不等Flash从几十KB到512KB都有外设覆盖了USART、SPI、I2C、ADC、DAC、PWM、DMA、USB、以太网这些常用模块部分型号还内置了硬件触摸按键检测单元做触摸面板、电动工具、家电控制板、工业传感器这类应用非常合适。HT32的命名规则大概是这样HT32F开头后面跟系列号比如HT32F1755、HT32F52352不同系列内核和外设资源不同。你拿到开发板或者打样芯片后先确认具体型号后面选芯片包、建工程都要用到这个型号千万别搞混这个细节我在后面会反复提到。它和STM32的定位比较接近但价格通常更有优势而且不少型号有国产供应链保障的优势。不过它也有明显的软肋生态和工具链不如STM32那么省心官方资料虽然齐全但很多藏在官网犄角旮旯里新手找起来费劲。这也是我写这一系列笔记的初衷。1.2 为什么选Keil5而不是其他工具链HT32官方其实也提供自己的IDE合泰自己的HT-IDE和e-Link32调试器配合起来也能开发HT32。但我个人还是推荐Keil MDK 5理由很简单大多数嵌入式工程师对Keil的操作界面、调试方式、工程管理逻辑已经很熟了从STM32之类转过来基本零成本。另外Keil MDK 5的Pack软件包机制对HT32支持得不错你只要装上合泰官方提供的芯片支持包就能像用STM32一样在Device选择界面里选到HT32型号编译、下载、调试全部打通。IAR理论上也支持但国内用的人少遇到问题想找资料都难。还有一个重要原因Keil MDK 5的调试器配置非常灵活官方e-Link32走的是CMSIS-DAP协议Keil直接原生支持不需要装额外的DLL插件在Debug设置里选CMSIS-DAP就可以。这种开箱即用的顺畅感对一个刚接触的新平台很重要至少能让你少焦虑一半。2. Keil MDK 5安装的细节与避坑点2.1 版本选择用5.3x到5.38之间最稳先说一个最容易踩的坑Keil MDK 5的版本选择。有人喜欢追新直接上5.39、5.40这些新版本结果发现HT32的芯片包在特别新的编译器环境下偶尔会冒出一堆编译警告虽然不影响功能但看着心烦。也有人还停留在5.20甚至4.7的老版本那更麻烦因为新版Pack不一定支持旧版IDE。我的建议是选5.30到5.38这个区间尤其推荐5.34或5.36这两个版本我用下来和合泰的Pack兼容性最好。不要觉得版本越新越好嵌入式开发工具链求的是稳定不是追新。以我实测来看HT32官方提供的一些例程工程基于MDK 5.23到5.36之间创建都能正常打开但如果你用5.40以上版本打开老工程Keil会提示升级升级后某些编译选项会变可能引入一些莫名其妙的问题。这里还涉及一个很多人容易混淆的点Keil MDK-ARM和Keil C51是两个完全不同的工具MDK-ARM是用来编译ARM内核芯片的C51是用来编译8051内核的。你电脑上完全可以让它们共存安装在不同目录就行互不干扰。网上很多教程说要改什么配置文件让C51和STM32共存那都是老黄历了现在这两款IDE各自独立安装不需要额外操作。2.2 安装路径和组件选择的讲究安装Keil MDK 5的时候有几个细节值得注意。第一个是安装路径尽量别带中文也别装到系统C盘深处我一般是装在D盘根目录下比如D:\Keil_v5这样后面工程路径短编译速度也快一点。Keil对中文路径的兼容性一直不算好虽然现在新版好很多但没必要给自己埋雷。第二个是组件的选择安装过程中会让你选要装哪些组件ARM Compiler是我们必须的这是编译HT32代码的编译器核心。Pack Installer默认会勾选保持默认即可。安装结束后它会自动弹出Pack Installer窗口这时候可以先关掉等装完芯片包再回来用。第三个是关于许可证的问题MDK安装完后默认是评估版有代码大小限制通常只能编译一定大小以内的程序对复杂项目来说不太够用。许可证的获取方式我建议通过正规渠道比如你是企业用户可以直接找ARM或者代理商购买授权学生或个人开发者可以用评估版将就或者申请社区版授权。千万别去下载什么注册机这类工具的来源不可控很容易给自己电脑带来安全风险而且出了问题没人帮你。2.3 安装完成后的第一件事安装完Keil MDK 5先不要急着建工程我一般会做两件事。第一件事是确认编译器的版本我习惯于打开一个空白工程然后编译一次确保ARM Compiler能正常工作这一步能提前暴露一些环境问题。第二件事是打开Pack Installer看一下当前Pack仓库的路径和状态因为在装HT32芯片包之前你至少要知道Pack的默认安装位置在哪里后面手动导入Pack文件时要用到。默认情况下Pack安装到C:\Users\你的用户名\AppData\Local\Arm\Packs这个目录下。如果你像我一样想把Pack也放到非系统盘可以在Pack Installer的Configuration里修改Repository路径但注意修改路径后需要重新安装所有需要的Pack因为Keil不会自动迁移已安装的Pack。3. HT32芯片支持包的安装与验证3.1 芯片包从哪里下载HT32的芯片支持包主要有两个来源一个是合泰官网另一个是Keil官方的Pack仓库在线下载。我推荐优先用Keil自带的Pack Installer在线搜索安装速度快而且版本会比较新。具体操作打开Keil MDK 5点击工具栏上的Pack Installer图标然后在搜索框输入HT32你会看到合泰官方发布的Pack通常命名带有Holtek或者HT32字样。选中它直接点InstallKeil就会自动从服务器下载并安装。如果你所在环境网络不太好在线安装老是失败也可以去合泰官网找HT32的下载页面里面有一个专门的Pack安装文件通常是一个.pack后缀的文件。下载后直接在Windows上双击它就会自动调用Keil的Pack安装机制完成安装。这个方式不需要登录Keil账号操作上更直接。3.2 手动安装Pack的具体操作双击.pack文件这种方式很多新手不知道其实和装普通软件差不多。双击后Keil会自动识别这个Pack弹出一个安装确认窗口你点OK等它跑完就行。安装完成后可以通过Pack Installer看到HT32的Pack出现在Installed列表里。如果你双击.pack没反应十有八九是文件关联出了问题。这时候可以打开Pack Installer点击File菜单选择Import然后从文件浏览器里选中你下载的.pack文件手动导入效果是一样的。手动导入时注意Pack文件路径也不要带中文否则可能导入失败我踩过这个坑。3.3 验证芯片包是否生效装完后别急着新建工程先验证一下芯片包有没有真正生效。方法很简单在Keil里新建一个空白工程Project - New uVision Project保存到指定目录后它会弹出Device选择窗口。在左侧搜索框里输入HT32如果能看到Holtek或HT32的展开项下面列出了HT32F1755、HT32F52352等具体型号说明Pack安装成功了。如果搜不到多半是Pack没装进正确的位置或者安装中断导致文件损坏。我的排查习惯是先看Pack Installer里HT32 Pack是不是处于Installed状态如果是绿色对勾就说明正常。如果显示红色叉号或者错误标记则卸载后重新安装一次。另外还有一种情况是Pack只支持某些特定版本的MDK如果你的MDK版本太老Pack Installer会提示版本不兼容这时候就得更新MDK版本了。4. 创建第一个HT32工程并点亮LED4.1 下载官方固件库和模板工程HT32和STM32类似官方提供了一套完整的固件库Firmware Library里面包含了寄存器定义、外设驱动函数、例程代码和模板工程。这套库是开发HT32的基础强烈不建议自己造轮子去直接操作寄存器除非你特别追求极致性能或者想深入学习内核。去合泰官网的HT32产品页面找到“开发工具”或者“下载中心”栏目里面会有HT32 Firmware Library的压缩包通常还配套一份用户手册建议一起下载。解压后你会看到这样的目录结构Examples里面是各种外设例程Library里面是固件库源码Template里面是模板工程也就是我们建工程时用的起点。使用官方模板工程省去了自己添加启动文件、系统时钟初始化代码的麻烦特别适合第一次接触HT32的开发者。直接基于模板改比自己从零建工程要靠谱得多。4.2 模板工程的修改点和关键配置打开Template目录里的Keil工程比如HT32_StdProject或者类似命名后缀为.uvprojx的文件。第一次打开后你先做三件事第一件是确认Device型号。在Options for Target对话框快捷键是AltF7的Device选项卡里确认当前选中的芯片型号和你手头的板子一致。如果模板默认选了HT32F52352而你实际用的是HT32F1755那就要在Device列表里手动选成HT32F1755。这个匹配相当重要选错了编译器会用错误的启动文件和Flash算法编译能过但下载必失败。第二件是确认C/C选项卡里的Define宏。HT32固件库通过一个全局宏来区分芯片型号比如HT32F52352型号对应定义HT32F52352。这个宏在官方模板里通常已经写好了但你换成其他型号时必须同步修改否则外设库代码判断错误编译时会报一堆找不到寄存器的错误。第三件是检查Include Path。在C/C选项卡的Include Paths里需要确保包含固件库头文件的路径。模板工程一般已经配置好了从工程目录到Library的相对路径但如果你把固件库文件夹移动了位置这里的相对路径就会失效。我自己的习惯是把整个工程目录保持相对稳定不要在编译前到处挪文件。4.3 点灯代码的编写模板工程配置好后我习惯先写一个最简单的点灯程序验证整条链路这也是嵌入式领域的hello world。在main.c中先包含ht32.h这个总头文件然后在main函数里配置时钟、配置GPIO方向、把IO口拉到指定电平。以HT32F52352为例大概逻辑是这样的#include ht32.h void Delay_Init(void) { /* 简单延时函数初始化具体以官方库为准 */ } int main(void) { CKCU_PeripClockConfig_TypeDef CKCUClock {{ 0 }}; /* 使能GPIOA时钟和外设时钟 */ CKCUClock.Bit.AFIO 1; CKCUClock.Bit.GPIOA 1; CKCU_PeripClockConfig(CKCUClock, ENABLE); /* 配置PA0为推挽输出 */ GPIO_DirectionConfig(HT_GPIOA, GPIO_PIN_0, GPIO_DIR_OUT); GPIO_SetOutBits(HT_GPIOA, GPIO_PIN_0); while(1) { /* 翻转电平实现LED闪烁 */ GPIO_WriteOutBits(HT_GPIOA, GPIO_PIN_0, 0); delay(); GPIO_WriteOutBits(HT_GPIOA, GPIO_PIN_0, 1); delay(); } }这里有几个地方要注意。第一HT32固件库的API和STM32标准库类似但不完全一样函数名和参数类型有差异不能把STM32的代码直接拷过来用。第二不同芯片的GPIO时钟控制宏可能不同有的型号需要额外使能某个外设时钟这点要对照手册或者官方例程。第三延时函数不要随便用for循环空转编译器开优化后循环会被优化掉导致灯不闪或者频率不对最好用官方提供的延时实现或者SysTick定时器。写完后编译如果一切正常你会看到0 Error 0 Warning的输出这时候环境搭建基本就成功了一半。接下来要解决的是怎么把程序烧进芯片这可是另一个大坑。5. 编译下载遇到的那些坑与排查实录5.1 仿真器和驱动的问题我第一次把合泰官方开发板插上电脑时系统能识别到一个USB设备但Keil里死活找不到调试器。后来才发现问题出在驱动上。HT32官方配套的调试器叫e-Link32它走的是CMSIS-DAP协议Windows 10以上系统通常能自动识别但有些精简版系统或者老版本的Windows需要手动安装驱动。合泰官网的HT32工具链页面里有e-Link32的驱动包下载安装后重启Keil问题就解决了。识别调试器的方法是在Keil的Options for Target里打开Debug选项卡右侧选择CMSIS-DAP Debugger然后点击Settings。如果Negotiated Speed和SW Device里能读出芯片型号说明仿真器连接正常。如果这里空白首先检查USB线是不是纯充电线很多数据线看着没问题但根本没有数据通道这个坑我遇到过不止一次。5.2 Flash Download失败的常见原因编译能过但点击下载时提示Flash Download failed - Cortex-M3这是最常见的错误。排查思路按顺序来第一检查Utilities选项卡里的Flash Download设置是否正确。点开Settings在Programming Algorithm列表里必须有HT32对应型号的Flash算法比如HT32 Flash 256KB之类的条目。如果列表为空说明芯片包没装好或者Device型号选错重新选中正确的芯片型号一般能带出对应的Flash算法。第二确认芯片是否处于可编程状态。HT32芯片的BOOT引脚和复位引脚状态会影响下载。有些开发板上有BOOT拨码开关需要保证它处于Flash启动模式而不是ISP模式。另外芯片供电是否稳定个别情况下供电不足会导致Flash下载时擦写失败。第三下载速度设置问题。在Debug设置的CMSIS-DAP选项里把下载速度从默认值往低调比如从8MHz调到1MHz再试试看。很多情况下高速下载不稳定是罪魁祸首降速后一切正常。5.3 编译告警和报错的速查表我把几个HT32建工程时容易出现的编译问题整理了下方便你对照排查现象可能原因处理办法Error: Unknown type name vu32头文件路径缺失或宏定义错误检查Include Path是否指向Library源码目录检查Define宏是否写了正确型号Error: L6211E: Ambiguous symbol重复定义检查工程里是不是同时添加了多个启动文件或重复源文件Warning: #1-D: last line of file ends without a newline源码末尾缺换行符在文件末尾加一个空行即可不算大问题Error: #5: cannot open source file ht32_board_config.h工程依赖了额外的板级配置文件确认工程是否包含必要的板级支持文件模板里别随便删文件编译极慢开启了高优化或者工程路径太深降低优化等级把工程放到路径短一点的目录在排查编译问题时我的土办法是先用官方模板原封不动编译确认排除环境问题后再逐步添加自己的代码。很多人一上来就猛改模板结果报错了不知道是哪一步引起的越改越乱。5.4 实操中的几个独家心得踩了几轮坑之后我总结出几条自己的习惯供你参考。第一拿到开发板第一件事不是去下载固件库而是把官方提供的PDF用户手册和开发板原理图先翻一遍尤其要看跳线帽和BOOT配置部分。我做过的几个项目里至少有两次下载失败都跟板上跳线帽起跳位置不对有关。第二Keil工程的Options配置里有一个编译器版本的坑。如果你用ARM Compiler 6编译HT32的老工程有可能会遇到一堆语法兼容问题因为这些工程当初是用ARM Compiler 5写的。在C/C选项卡的ARM Compiler下拉框里手动改回Version 5大部分问题都会消失。很多人在这个坑里转了半天才出来这里提前给你打个预防针。第三如果你手头有多个不同厂商的调试器插在电脑上Keil有时会选错调试器导致连接失败。在Debug设置页面的CMSIS-DAP Settings里可以直接看到当前连接的所有调试器手动选择正确的那一个就行。这个小问题经常被忽略排查起来还特别费时间。第四建议把官方固件库里的Example例程都看一遍尤其是和LCD、串口相关的例程里面包含了很多板级初始化的思路这些是文档里不会详细写的。我自己的习惯是每接触一个新的HT32型号先跑通官方几个典型例程再开始设计自己的代码结构会省下很多Debug时间。最后再分享一个小技巧整个环境跑通之后我习惯做一个备份操作把Keil的Pack目录、固件库解压目录、模板工程目录三个位置固定下来写进自己的一个开发环境说明文档里。这样以后在不同电脑之间切换或者隔了几个月再回来开发时照着文档重新恢复环境十分钟就搞定不用从头再踩一遍坑。HT32这套环境搭起来虽然比STM32多费些功夫但配置好之后工程编译、下载、在线调试的体验其实相当顺畅。尤其当你手里有项目的BOM表预算压力时HT32的性价比优势会非常明显。下一篇我准备写HT32的GPIO和串口实际应用包括中断处理、printf调试重定向这些实用内容如果你正在往这个平台上迁移可以先把这个环境准备起来到时候直接拿代码上板子验证就行。
返回列表