STM8S003/903 使用ADC中断功能

2020-02-12来源: elecfans关键字:STM8S003  903  ADC  中断功能

对使用STM8S003/903这个片子的ADC中断功能(包括两种情况),记录下自己的理解:


一、单通道使用ADC中断的场合:

如果项目中只需要采集一路模拟量,并且想使用中断方式来获取AD值,那么,设置如下:


void ADC1_Init(void)

{

    CLK->PCKENR2 |= CLK_PCKENR2_ADC;                                        //ADC Clock Enable

    ADC1->TDRL = 0x02;                                                                               //禁用对应AD通道的施密特触发器

    ADC1->CR2  &= ~ADC1_CR2_ALIGN;                                                //结果左对齐。

 


    /*使能中断的同时一定要同时设定ADC通道号。*/


    ADC1->CSR  |= ADC1_CSR_EOCIE;                                          //使能ADC中断

    ADC1->CSR  |= 0x02;                                                                   //选择通道



    ADC1->CR1  |= (0x20 );                                                                     //时钟4分频

    ADC1->CR1  |= (ADC1_CR1_ADON);                                              //开启ADC1电源


    //这里还需要开启全局中断,省略,一般放到main函数的初始化部分开启全局中断。

}  


void ADC1_Start(u8 channel)

{

    ADC1->CR1 |= ADC1_CR1_ADON; //启动ADC1开始转换

}


@far @interrupt void ADC1_IRQHandler(void)

{

    u8 adc_value = 0;


    ADC1->CSR &= ~ADC1_CSR_EOC;                //结束标志位清零

    adc_value = ADC1->DRH;


    //在这个中断服务函数中获取数据,你可以取高8位, 也可以把高8位和低8位全部取出来。看你的精度需要。


}


使用思路: 在main函数初始化阶段调用ADC1_Init(),在需要开启ADC采集的时候调用ADC1_Start(),在ADC1_IRQHandler()中断处理函数中,读取AD值。


二、多通道使用的场合:

要在STM8S003/903上使用ADC,特别是多通道又不是连续的通道(因为有时候PCB布线受限制,无法使用连续的ADC通道采集多路模拟量),并且你又需要采用单次转换加中断的方式读取AD值,而不是查询的方式, 那么,这种情况,有点特别的设定,设置如下:


void ADC1_Init(void)

{

    CLK->PCKENR2 |= CLK_PCKENR2_ADC;                                        //ADC Clock Enable

    ADC1->TDRL = 0x02;                                                                               //禁用对应AD通道的施密特触发器

    ADC1->CR2  &= ~ADC1_CR2_ALIGN;                                                //结果左对齐。

 


    /* 特别的地方:注释掉这两行,不需要在这里设置 */


    //ADC1->CSR  |= ADC1_CSR_EOCIE;                                          //使能ADC中断

    //ADC1->CSR  |= 0x02;                                                                   //选择通道



    ADC1->CR1  |= (0x20 );                                                                     //时钟4分频

    ADC1->CR1  |= (ADC1_CR1_ADON);                                              //开启ADC1电源


    //这里还需要开启全局中断,省略,一般放到main函数的初始化部分开启全局中断。

}  


void ADC1_Start(u8 channel)

{

   /*  特别的地方: 每次启动AD转换的时候设定通道号和开启中断 */

    ADC1->CSR  = channel;                              //选择通道

    ADC1->CSR  |= ADC1_CSR_EOCIE;          //使能ADC中断

    ADC1->CR1 |= ADC1_CR1_ADON;            //启动ADC1开始转换

}


@far @interrupt void ADC1_IRQHandler(void)

{

    u8 adc_value = 0;


    ADC1->CSR &= ~ADC1_CSR_EOC;                //结束标志位清零

    adc_value = ADC1->DRH;


    //这里获取你的数据,你可以取高8位, 也可以把高8位和低8位全部取出来。看你的精度需要。


    if( Enable_ch1_Flag )

    {

        Enable_ch1_Flag = 0;

        //这里读取数据到你的采样数组中。

    }

    else if( Enable_ch2_Flag )

    {

        Enable_ch2_Flag = 0;

        //这里读取数据到你的采样数组中。

    }

    else if( Enable_ch3_Flag )

    {

        Enable_ch3_Flag = 0;

        //这里读取数据到你的采样数组中。

    }


}


void ADC_Capture(void)

{

   static u8 getstep = 0;

    switch (getstep )

    {

        case 0:                                                     

            ADC1_Start(CH_AD1);                         

            Enable_ch1_Flag = 1;    

            Enable_ch2_Flag = 0;

            Enable_ch3_Flag = 0;

            getstep ++;

            break;

        case 1:       

            ADC1_Start(CH_AD2);                         

            Enable_ch2_Flag = 1;    

            Enable_ch1_Flag = 0;

            Enable_ch3_Flag = 0;

            getstep ++;

            break;

        case 2:  

            ADC1_Start(CH_AD3);                         

          Enable_ch3_Flag = 1;    

            Enable_ch1_Flag = 0;

            Enable_ch2_Flag = 0;

            getstep ++;

            break;

        default:

            break;

    }

}


使用思路: 在main函数初始化阶段调用ADC1_Init(),在一个500us定时器中断中调用ADC_Capture(),在ADC1_IRQHandler()中断处理函数中,读取AD值。

关键字:STM8S003  903  ADC  中断功能 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic487941.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:stm8s使用问题总结2——AD转换
下一篇:STM8 8位基本型定时器 TIM4

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

stm8s开发(三) UART的使用:串口通信
串口通信是单片机学习的一个最基本、最重要的功能之一。串口通信可以间接的当做调试接口使用,实现单片机与电脑之间的通信。当然可以与一些模块(比如蓝牙、wifi)通信,也可以作为和其他单片机通信的工具。STM8S的通用异步收发器(UART)主要特性:●  全双工的,异步通信●  可编程数据字长度(8位或9位) ●  可配置的停止位-支持1或2个停止位一般的,我们使用串口通信主要是关心几点参数:波特率、停止位、奇偶校验位。其次就是如何发送、如何接收数据,这里介绍的使用阻塞式发送数据、中断方式接收数据。以下代码是初始化串口,参数为:115200   1停止位   
发表于 2020-02-24
stm8s开发(三) UART的使用:串口通信
stm8s中UART的用法(四种UART中断)
。----------------------------------------------------------------------*/#include <STM8S207S8.h>#define LED_DDR  PB_DDR#define LED_PORT PB_ODR#define LED_CR1  PB_CR1#define LED_CR2  PB_CR2void Init_UART3(void){      UART3_CR1=0x00;      UART3_CR2=0x00;      UART3_CR3=0x00;      // 设置波特率,必须注意以下几点: 
发表于 2020-02-24
stm8s中UART的用法(四种UART中断)
STM8S003F使用I/O口模拟串口(一)发送数据
最近在使用STM8S003F模拟串口发送数据,网上资源很多,但是没有找到我需要的,因此自己写一篇文章,做一个总结,这篇文章主要是不用库函数实现发送简单的过程。1、串口通信原理和模拟串口发送数据的原理标准串口数据格式为:起始位(1bit)+数据位(8bit)+校验位(1bit)+停止位(1bit)。其中起始位为低电平,停止位为高电平。串口通讯需要设置波特率和检查COM口。思路是这样的,我们使用定时器TIM2来定时,每隔一端时间发送一个位,从而实现模拟串口发送数据。2、获得定时器ARR自动装载的值为了简便,我们不要校验位,因此共有10个位的数据。我以stm8中9600bit/s的波特率计算的过程为例(1秒钟传输9600位)。可以计算出
发表于 2020-02-24
STM8S单片机串口调试
    最近在STM8S单片机上调试遇到些问题,共享出来!    问题:STM8S在用IAR编译器调试过程中,中途暂停下,发现程序不能正常运行了,一直死在串口接收中断函数中。    分析:怀疑是串口接收中断函数未清标志位,但函数确实有相应的清中断语句,语句如下:   uint8_t tmp;UART3_ClearFlag(UART1_FLAG_RXNE);tmp = UART3_ReceiveData8();    进入UART3_ClearFlag(UART1_FLAG_RXNE)函数中查看代码:void
发表于 2020-02-24
快速使用STVP和ST-LINK下载STM8S003程序
连接配置:运行 Configure -> Configure ST Visual Programmer选择 ST-LINK, USB, SWIM, STM8S003F35. 选择程序:运行 File->Open,选择要下载的.hex或者.srec文件。6. 下载程序:运行 Program -> All tabs ,执行下载。
发表于 2020-02-22
快速使用STVP和ST-LINK下载STM8S003程序
stm8s swim 脚的复用
由于 临时改跳线的原因,需要用到swim脚来做为按钮输入。因为,swim是编程脚,还担心会有影响。于是,看了手册,发现swim是附加功能。主要功能 还是PD1 作为GPIO脚用的。于是 就直接 当 GPIO脚用。然后 烧写程序一切正常。重复烧程序也都正常。因此,说明 swim 做为GPIO脚用是 完全 没有问题的。也不影响 烧写程序。用的芯片型号是:STM8S003F3P6
发表于 2020-02-21
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 EEWORLD.com.cn, Inc. All rights reserved