看门狗的功能大家都知道,而这个模拟看门狗又是什么东西呢?

  简单的说就是这个模拟看门狗可以实时监控ADC采样的数据,当采样的数据值小于设置的最小值或者大于设置的最大值时,单片机就会触发ADC中断。这个在温度监控中非常实用,比如现在要监控设备的温度值,当温度值不在设置范围内的时候,就会自动触发中断,而不需要程序一直去采集ADC通道的值,然后使用软件来判断当前的温度值是否超出正常范围。

官方介绍如下:

  下面直接通过代码来演示一下这个模拟看门狗的功能:

#include "adc.h"
#include "main.h"u16  DATAH = 0;                          //ADC转换值高8位
u16  DATAL = 0;                          //ADC转换值低8位
_Bool ADC_flag = 0;                     //ADC转换成功标志//AD通道引脚初始化
void ADC_GPIO_Init( void )
{PD_DDR &= ~( 1 << 3 );              //PD3 设置为输入      电流PD_CR1 &= ~( 1 << 3 );              //PD3 设置为悬空输入
}
void ADC_CH_Init( u8 ch )
{char l = 0;ADC_CR1  = 0x00;                    //fADC = fMASTER/2, 8Mhz  单次转换,禁止转换ADC_CSR  |= ch ;                     //控制状态寄存器 选择要 AD输入通道  如:PD2(AIN3)ADC_CR2  = 0x00;                    //默认左对齐 读数据时先读高在读低ADC_TDRL = ( 1 <<  ch  );           //禁止相应通道 施密特触发功能 1左移ch+1位ADC_CR1 |= 0x01;                    //使能ADC并开始转换//设置上限门槛值ADC_HTRH = ( u8 )( 800 >> ( u8 )2 );    //存放10位数据的高8位ADC_HTRL = ( u8 )800;                   //存放10位数据的低8位//设置下限门槛值ADC_LTRH = ( u8 )( 300 >> ( u8 )2 );    //存放10位数据的高8位ADC_LTRL = ( u8 )300;                   //存放10位数据的低8位ADC_CSR |= 0x10;                       // 使能看门狗中断for( l = 0; l < 100; l++ );         //延时,保证ADC模块的上电完成 至少7usADC_CR1 = ADC_CR1 | 0x01;           //再次将CR1寄存器的最低位置1 使能ADC 并开始转换
}//采集PD2电压值
u16 ReadVol_CH3( void )
{u16 voltage = 0;while( ( ADC_CSR & 0x80 ) == 0 );      //等待转换结束if( ADC_CSR & 0x80 ){DATAH = ADC_DRH;                    // 读出ADC结果的高8位DATAL = ADC_DRL;                    // 读出ADC结果的低8位voltage = ( DATAH << 2 ) + DATAL ; //得到十位精度的数据  0--1024ADC_CR1 = ADC_CR1 | 0x01;          //再次将CR1寄存器的最低位置1  启动下一次转换ADC_CSR &= 0x7F;};return voltage;
}//AD中断服务函数 中断号22
#pragma vector = 24                     // IAR中的中断号,要在STVD中的中断号上加2
__interrupt void ADC_Handle( void )
{ADC_CSR &= ~0x40;//处理温度异常事件
}

ADC使用单次触发模式,然后设置ADC_HTR寄存器为上限报警值,这里设置为800,ADC_LTRL设置下限报警值,这里设置为300,也就是说当ADC的采样值大于800或者小于300的时候,ADC就会产生中断,然后将ADC_CSR寄存器的第4位,也就是AWDIE位设置为1,开启模拟看门狗中断。接下来在主函数中循环读取ADC采样值。

主程序代码如下:

#include "iostm8s103f3.h"
#include "led.h"
#include "adc.h"void SysClkInit( void )
{CLK_SWR = 0xe1;       //HSI为主时钟源  16MHz CPU时钟频率CLK_CKDIVR = 0x00;    //CPU时钟0分频,系统时钟0分频
}u16 val1 = 0;
void main( void )
{SysClkInit();__asm( "sim" );                       //禁止中断LED_GPIO_Init();ADC_CH_Init( 3 );__asm( "rim" );                       //开启中断while( 1 ){LED = !LED;                      //采样val1 = ReadVol_CH3();}
}

val1为采样的电压值,全速运行程序,在观察窗口中观察采样值:

当采样电压值在300到800之内时,ADC中断函数不会触发。

当电压值低于300时,ADC中断触发,ADC_CSR寄存器的第6位置位,说明产生了一次模拟看门狗中断。

当采样值大于800时,同样可以产生中断
产生中断后,需要在中断中手动清除AWD标志位。

在这里要特别注意一个问题,就是在设置模拟看门狗的上下限值时,高位寄存器存储的是10位值的高8位,低位寄存器存储的是10位值的低2位。

这里要参考英文手册中的寄存器设置,中文参考手册中这4个寄存器介绍是错误的。如果按照中文手册中的方法设置,模拟看门狗就会永远在中断中出不来。一定要注意。


中文手册中这几个寄存器介绍是错误的


这里的中文参考手册都是在ST官网上下载的,不知道是官方人员疏忽些写错了,还是翻译的时候搞错了。在使用模拟看门狗时一定要注意这个四个寄存器的设置。

STM8单片机ADC模拟看门狗功能实现相关推荐

  1. STM8单片机 ADC模拟看门狗中文资料错误

      在调试stm8单片机的adc模拟看门狗功能时,不管怎么设置ADC_HTR和ADC_LTR寄存器的值,然后通过IAR软件单步调试时观察这两个寄存器的值都不对.   根据中文手册上看,高位寄存器存储的 ...

  2. 【干货】STM32通过ADC模拟看门狗实现掉电保存

    1.前言 很多时候我们需要将程序中的一些参数.数据等存储在EEPROM或者Flash中,达到掉电保存的目的.但有些情况下,程序需要频繁的修改这些参数,如果每次修改参数都进行一次保存,那将大大降低存储器 ...

  3. 模拟看门狗如何实现?

    关注.星标公众号,不错过精彩内容 作者:逸珺 转自:STM32 对于看门狗大家或许不陌生,但对于模拟看门狗有的朋友可能就不甚了解了.本文来聊聊模拟看门狗,旨在梳理相应的概念,理解模拟看门狗原理.与常规 ...

  4. [STM32F1官方例程讲解2] 模拟看门狗Analog Watchdog

    [STM32F1官方例程讲解2] 模拟看门狗 第一章 模拟看门狗简介 第二章 STM32F1模拟看门狗相关配置函数介绍 第三章 电路原理图与库函数配置 3.1 程序逻辑 3.2 硬件原理(LED灯) ...

  5. c语言看门狗的作用,51单片机 c语言看门狗程序怎么写

    51单片机 c语言看门狗程序怎么写 51单片机 c语言看门狗程序怎么写 看门狗在51单片机电路里的作用是防止程序 "跑飞"."死机"后,系统不动作,而采取复位的 ...

  6. (29)基于FPGA实现看门狗功能(FPGA不积跬步101)

    1 引言  微处理(ARM.单片机)在特殊的环境下,运行代码或程序会跑到非预期状态,也就是说系统可能会进入死循环,这种情况微处理器无法进行自我恢复,只能通过复位或者重启进行解决.看门狗就是解决这种情况 ...

  7. Python 看门狗功能实现

    前言: 用 python 实时实现监控一个文件夹功能,将监控到的 Excel(笔者目前用于解析excel文件)解析写到 mysql 中,起功能和 sparkStreaming 中的 textFileS ...

  8. HC32F460开发之看门狗功能

    文章目录 前言 一.看门狗是什么? 二.看门狗的使用 1.简介 2.启动 3.刷新看门狗计数器 总结 前言 在一些设备需要长时间稳定运行的场合中,看门狗功能可以说是必不可少的.但在一些低功耗设备中,硬 ...

  9. c语言看门狗指令pic,PIC单片机的窗口看门狗定时器.PDF

    PIC单片机的窗口看门狗定时器 TB3123 PIC® 单片机的窗口看门狗定时器 作者: Ashutosh Tiwari Microchip Technology Inc. 简介 窗口看门狗定时器(W ...

最新文章

  1. R语言scan函数读取文件为向量或者列表格式实战
  2. Bash: Removing leading zeroes from a variable
  3. 数据分析处理库Pandas——merge操作
  4. redis 哨兵_Redis哨兵配置
  5. 在SQLSERVER EXPRESS 2005中安装northwind和pubs数据库。
  6. mysql buffer size_mysql中join_buffer_size的建议最大值是多少?
  7. 文华软件登录显示请选择服务器,文华财经提示先登录云服务器
  8. JavaWeb --第三章 HTTP协议详解
  9. Antd Mobile Design输入框组件InputItem错误显示方式封装
  10. 20145322 Exp5 MS08_067漏洞测试
  11. CSS动态绑定背景图片
  12. 我的世界minecraft最新版1.16.5服务器及其Python开发环境搭建
  13. 安装oracle12f 闪退,安装oracle ,调用图形界面java卡死,
  14. 计算机二级基础知识点全部讲解,计算机二级基础知识点整理
  15. Android Studio实现内容丰富的安卓小说阅读平台
  16. 笔记本电脑性能分析记
  17. boost库用property_tree读xml文件
  18. android设备显示电脑内容,安卓手机怎样用电脑查看记事本内容
  19. Using insecure protocols with repositories, without explicit opt-in, is unsupported. Switch Maven...
  20. IntelliJ IDEA中文网

热门文章

  1. Android隐藏标题设置全屏,设置背景
  2. javascript中动态加载js、vbs脚本或者css样式表
  3. 映射内网ftp服务器到公网报错问题解决
  4. 分布式技术追踪 2018年第二期
  5. BZOJ 2956 模积和
  6. firfox post plugin test
  7. 如何简单快速的修改Bootstrap
  8. C# 二进制数据、图片存入、读出 sql server 数据库
  9. 【MySQL】MySQL中的查询语句的详解----等值连接、左连接、右连接、全连接
  10. Java中int为什么占四个字节?