1.前言
从事硬件开发近二十年,最近在医院做完体检后,医生看过体检单后告知我:我目前的血糖偏高。医生说造成这种病情的原因大多都是因为生活饮食不规律,缺少运动导致。同时医生叮嘱道,血糖高一定要控制好,否则会引发各种并发症。

添加图片注释,不超过 140 字(可选)
做了二十年牛马身体终于扛不住了,接下来的时间,我建立了规律的生活管理:每日三餐定时定量,减少碳水化合物摄入;每日进行60分钟的中等强度有氧运动。为实现血糖的动态监测,我还网购了一个家用的血糖仪,每天定时测量血糖数据。经过1个月的饮食控制和运动锻炼,血糖终于回归到了正常生理区间。
2.好奇
由于自己是一个硬件工程师,也是从事多年的仪器仪表行业,对这个每天用来测血糖的小仪器充满好奇,想看看这个“小家伙”的内部结构和电路,但是又怕拆开之后影响仪器的测量精度,犹豫了很久。后面还是耐不住好奇,心想:拆开看看,如果影响了测量精度就重新买一个。
说拆就拆,拆开之后直接惊掉了下巴,盯着电路板,看了好几遍,最终确认了一个事实:整个电路板只有一颗芯片。

添加图片注释,不超过 140 字(可选)
对于测血糖来说,需要完成微小的生物电化学信号测量,需要驱动段码液晶屏显示,需要检测按键实现用户交互,还需要测量温度和电池电量数据,这么复杂的功能居然通过一个芯片就能完成,真是神奇。特别是测量微小的生物电化学信号,由于信号非常小,是不能直接使用芯片ADC进行测量的,通常是要搭建外部的信号放大电路。

添加图片注释,不超过 140 字(可选)
于是我怀着忐忑的心情查阅了这个神奇的芯片资料,查到资料之后我便恍然大悟,原来这个芯片是 Holtek(合泰半导体)推出的一款专用于血糖仪的单片机BH67F2472,集成了LCD 驱动功能,集成了信号放大电路适用于血糖测量,整合度高、外部零件少,特别适用于小体积的LCD血糖仪。

添加图片注释,不超过 140 字(可选)
3.下载程序
根据电路和芯片手册,我发现仪器的制造商居然把芯片程序的下载口预留出来了,一个念头如野草般疯长:倘若购置相应的下载器,是否就能将自写的代码,注入这个奇特的芯片中呢?

添加图片注释,不超过 140 字(可选)
说干就干,我网购了一个Holtek的下载器,同时我又重新买了一个全新的血糖仪(用于我日常动态监测血糖),然后安装了下载器厂家提供的开发工具HT-IDE3000。

添加图片注释,不超过 140 字(可选)
由于没有找到BH67F2472的工程源码,但是我到找了BH67F2495(型号越接近代码越兼容),基于BH67F2495代码我写了一个BH67F2472的简单的GPIO控制程序。万事俱备开始下载,连接、上电、点击烧录……期待的火花瞬间被错误提示浇灭。多次尝试失败后,联系下载器厂家,厂家建议我用先升级下载器固件。反复折腾几次后,终于将这个简单的GPIO控制程序下载到了芯片中。
熟悉开发工具和下载器后,发现这款芯片不支持仿真,下载器确实也只有下载功能!在这种情况下程序开发的难度将会大幅增加,就像航船失去了灯塔的指引在暗礁丛中摸索前行。但好在电路板上预留了UART接口,可以通过UART输出调试信息提高调试效率。
4.电路原理图
虽然下载了GPIO控制程序下载到了芯片中,但是由于电路的引脚和程序没有对应,所以并没有实现什么实际效果。为了真正控制电路板上的外设,打破程序与硬件“不匹配”的僵局,我拿出出万用表,打开BH67F2495芯片官方技术手册中的引脚说明。我先将万用表调到通断检测档,逐个追溯电路外设与芯片引脚的连接情况。经过一段时间的细致排查,所有外设与芯片引脚的对应关系都标注完成,反推出了电路板的原理图。电路原理框图如下:

添加图片注释,不超过 140 字(可选)
5.第一个程序设计
得到原理图后,就可以通过程序控制电路板上的设备。第一个程序力求简单,最简单的程序莫过于GPIO控制程序(类似一个hello world),通过MCU的IO口PB6的电平驱动蜂鸣器,让蜂鸣器发出声音,值得注意的是蜂鸣器不像LED那样,通过固定的高电平来点亮LED,蜂鸣器需要一定频率(如1KHZ)的高低交替电平信号控制,电路框图如下:

添加图片注释,不超过 140 字(可选)
程序代码通过控制PB6的电平,实现蜂鸣器的驱动,让蜂鸣器发出声音。关键代码如下:
/**
*********************************************************************************************************
* bh67f2472
* (c) Copyright 2025-2035
* All Rights Reserved
*
* [url=home.php?mod=space&uid=1455510]@file[/url] :
* @By : liwei
* [url=home.php?mod=space&uid=644434]@version[/url] : V0.01
*
*********************************************************************************************************
**/
/*
*********************************************************************************************************
Includes
*********************************************************************************************************
*/
#include "BH67F2472.h"
/*
*********************************************************************************************************
Define
*********************************************************************************************************
*/
#define PIN_ModeOutput(p, n) { _##p##c##n = 0;}
#define PIN_ModeInput(p, n) { _##p##c##n = 1;}
#define PIN_OutputHigh(p, n) { _##p####n = 1;}
#define PIN_OutputLow(p, n) { _##p####n = 0;}
/*
*********************************************************************************************************
Typedef
*********************************************************************************************************
*/
/*
*********************************************************************************************************
Variables
*********************************************************************************************************
*/
/*
*********************************************************************************************************
Function
*********************************************************************************************************
*/
/********************************************************************************************************
初始化io
********************************************************************************************************/
void initialization(void)
{
PIN_ModeOutput(pb,6);
}
/********************************************************************************************************
设置IO输出
********************************************************************************************************/
void gpio_set(unsigned char cmd )
{
if(cmd == 0)
{
_pb6 = 1; //输出高电平
}
else
{
_pb6 = 0; //输出低电平
}
}
/********************************************************************************************************
延时函数 单位为ms
********************************************************************************************************/
void delay_ms(unsigned long int ms)
{
while(ms--)
GCC_DELAY(2000);//主频8Mhz,执行一条指令为0.5us。一条指令周期等于四条机器周期——》 1/8Mhz * 4 = 0.5us
}
/********************************************************************************************************
时钟配置
********************************************************************************************************/
void oscillators_cfg(void)
{
//选择内部时钟
_fhs = 0;
//系统时钟设置为8000000
_hircc = 0x05;
// Wait HIRC Oscillator Stable
while (!_hircf);
}
/********************************************************************************************************
主函数
********************************************************************************************************/
void main(void)
{
//配置系统时钟
oscillators_cfg();
//关闭看门狗
_wdtc = 0b10101000;
//设置为输出
initialization();
while(1)
{
gpio_set(1); //输出高电平
delay_ms(10); //延时10ms
gpio_set(0); //输出低电平
delay_ms(10); //延时10ms
}
}
/***********************************************END*****************************************************/
完成程序设计后,编译、上电、下载,屏息凝神,轻轻一点,“滴——”的一声清响,宣告着程序与硬件已经调试完成。
6.分享
完成GPIO这个最简单的程序设计后,觉得这个芯片非常有意思,后面又花了一段时间设计了7个demo程序,每个demo力求做到简单易懂。这7个demo程序分别是:ADC程序、按键程序、DAC程序、GPIO程序、LCD程序、定时器程序、串口通信程序。

添加图片注释,不超过 140 字(可选)
同时也详细的核对了原理图,并整理成Altium Designer 格式,电路板的原理图如下:

添加图片注释,不超过 140 字(可选)
后续将持续更新BH67F2472这个系列,感兴趣的小伙伴,希望获取资料的小伙伴,可以评论区留言或者私信作者。