这是我参与8月更文挑战的第24天,活动详情查看:8月更文挑战
在调试STM8单片机的ADC模拟看门狗功能时,发现了中文手册中对于模拟看门狗上下限电压设置的寄存器介绍是错误的。
首先看芯片手册上对于模拟看门狗的介绍
手册中说明ADC_HTR和ADC_LTR寄存器是用于设置模拟看门狗的上下限电压值。
ADC_HTRH这个寄存器用于设置上限值的高2位。
ADC_HTRL这个寄存器用于设置上限值的低8位。
ADC_LTRH这个寄存器用于设置下限值的高2位。
根据文档中的寄存器模式设置上下限值寄存器
//设置上限门槛值
ADC_HTRH = 0x03; //存放10位数据的高8位
ADC_HTRL = 0xe8;
//设置下限门槛值
ADC_LTRH = 0x00; //存放10位数据的高8位
ADC_LTRL = 0x64;
将上限值设置为0x03e8也就是十进制的1000,将下限值设置为0x0064也就是100.当采样的模拟电压值小于100或者大于1000时,看门狗就会触发。
根据文档的描述ADC_HTRH寄存器存储高2位值,ADC_HTRL存储低8为值。
通过计算器可以看出1000刚好是10个bit,最高的2个bit位都为1也就是3,低8位是 1110 1000也就是E8,所以ADC_HTRH寄存器值设置为0x03,ADC_HTRL寄存器的值设置为0xe8.
数字100的最高两个bit都为0,低8位是 0110 01000 也就是0x64,所以ADC_LTRH寄存器设置为0x00,ADC_LTRL寄存器值设置为0x64。
然后通过IAR软件在线调试,观察这两个寄存器的值是否设置成功。
在设置寄存器前,通过右侧的便利观察可以看出ADC_HTRH寄存器默认值为0x03,ADC_HTRL寄存器默认值为0xFF,ADC_LTRH寄存器和ADC_LTRL寄存器默认值都为0。
然后执行寄存器设置
可以看到寄存器值设置的这4行代码执行完成之后,ADC_HTRH寄存器值为0x03,ADC_HTRL寄存器值为0x00,ADC_LTRH寄存器和ADC_LTRL寄存器值都为0。
也就是说这四个寄存器的值并不是代码中设置的值,那么这是为什么呢?
于是找到了一个官方的库函数代码,在库函数中找到了对这四个寄存器的操作函数。
在stm8s_adc1.c这个文件中,有两个函数是专门用来设置模拟看门狗上下限值的。
通过这几行代码观察可以发现一个问题,那就是寄存器的高位存储的数据值为 设置的数据右移2位之后的值,也就是说高位寄存器的值是10位寄存器值的高8位,而低位寄存器存储的是10位寄存器值的低2位。 具体是不是这样呢?直接把库函数中的设置方法放到代码里面测试。
在设置寄存器前,通过右侧的便利观察可以看出ADC_HTRH寄存器默认值为0x03,ADC_HTRL寄存器默认值为0xFF,ADC_LTRH寄存器和ADC_LTRL寄存器默认值都为0。
接下来用库函数中的方法设置寄存器值
设置完成之后可以看到ADC_HTRH值为0xC8,ADC_HTRL值为0x00,ADC_LTRH值为0x4B,ADC_LTRL寄存器值为0x00。
那么这个值是不是设置的值呢?将这四个寄存器的值用二进制方式显示。
按照 高8位 和 低2位的组合将这组寄存器的值组合起来,那么
ADC_HTR寄存器的值为 11 0010 0000
转换为10进制数为
ADC_LTR寄存器的值为 01 0010 1100
上限值为800,下限值为300,和代码中设置的值一样
说明按照这样方法操作寄存器才是正确的,为了验证这个想法,于是找了stm8单片机的英文版资料。
通过英文版的资料可以明确的看出,高位寄存器存储的是bit2到bit9位,也就是数据的高8位,低位寄存器存储的是数据的bit0和bit1位,也就是数据的低两位,这个和程序验证的完全一样,说明英文版的手册是正确的,而在官方下载的中文版手册,这几个寄存器的介绍是错误的。