历史上的今天
返回首页

历史上的今天

今天是:2025年02月11日(星期二)

正在发生

2020年02月11日 | STM8S003F3 使用ADC:固件库版本与寄存器版本

2020-02-11 来源:eefocus

STM8S003F3这款小型MCU,只有1K RAM与8K Flash,应用比较简单,AD采样,GPIO控制,PWM控制,还是不错的嵌入式的应用。


最近一个项目用到了几路AD采样,我平时一般喜欢下载最新的官方标准固件库,只是,这次遇到的问题是,在使用PWM与ADC采样后,代码大小竟然大于8K,编译失败!!!后来,看了下Debug下的map文件,发现,使用ADC的固件库,大小竟然有1K的代码空间。后来改为寄存器的,发现代码还不到100字节。


(1)固件库AD采样的代码如下,代码易懂,但编译后代码较大:单通道采样,多个的话,只需要一个一个采集。


#include "adc.h"

#include "stm8s.h"


void InitAD(uint8_t channel)

{

  /* De-Init ADC peripheral*/

  ADC1_DeInit();

  //通道初始化

  ADC1_Init(ADC1_CONVERSIONMODE_SINGLE,

            (ADC1_Channel_TypeDef)channel,

            ADC1_PRESSEL_FCPU_D18,

            ADC1_EXTTRIG_TIM,

            DISABLE,

            ADC1_ALIGN_RIGHT,

            (ADC1_SchmittTrigg_TypeDef)channel,

            DISABLE);

}

 

void AD_Start(void)

{

  ADC1_ScanModeCmd(ENABLE);//启用扫描模式

  ADC1_DataBufferCmd(ENABLE);//启用缓存寄存器存储数据

  //ADC1_ITConfig(ADC1_IT_EOCIE,DISABLE);//关闭中断功能 

  ADC1_Cmd(ENABLE);//启用ADC1

  ADC1_StartConversion();//开始转换*/

}

 

uint16_t getADCValue(uint8_t channel)

{

  InitAD(channel);

  AD_Start();

  while(ADC1_GetFlagStatus(ADC1_FLAG_EOC) == RESET);

  return ADC1_GetConversionValue();

}

调用的方法如下:


VccAdc = getADCValue(6);


(2)寄存器AD采样的代码如下:短小,能用,只是不看手册,很难理解。



#include "adc.h"

#include "stm8s.h"

 

void InitAD(void)

{

  ADC1->CR1 = 0x01;     //设置ADC不分频、单次转换

  ADC1->CR2 = 0x08;     //设置不外部触发也不开启中断、数据右对齐、不开启扫描

  ADC1->CSR = 0x06;     //清除转换标志 设置通道5为AD口

}

 

void setADCChannel(uint8_t channel)

{

  ADC1->CSR = (channel & 0x0F); //写入转换通道

}

 

uint16_t getADCValue(void)

{

  uint16_t adc = 0x00;

  ADC1->CR1 |= 0x01;                                    //启动ADC开始转换

  while((adc & 0x80) == 0x00){adc = ADC1->CSR;}         //等待转换完成

  adc = ADC1->DRL;

  adc |= (ADC1->DRH << 0x08);                           //获取ADC值

  return adc;

}


调用的方法:


 setADCChannel(VCC_AIN_CHANNEL);

 VccAdc = getADCValue();

 

测试下来,采样还算是比较准确的,并且速度也挺快的。


算是STM8S003的使用经验积累吧。


推荐阅读

史海拾趣

Gennum ( Semtech )公司的发展小趣事
如果电路不工作,可以逐步断开或替换部分元件,以确定问题所在。
Crameda Intersys公司的发展小趣事

在电子行业中,产品质量是企业生存和发展的关键。Crameda Intersys公司始终将质量管理放在首位,建立了严格的质量管理体系。公司从原材料采购、生产制造到产品检验等各个环节都严格把关,确保产品质量的稳定性和可靠性。这种对质量的执着追求赢得了客户的信任和好评,也为公司的长期发展奠定了坚实的基础。

AR RF/Microwave Instrumentation公司的发展小趣事

随着公司产品的不断完善和升级,AR RF/Microwave Instrumentation开始积极拓展市场。他们不仅在国内建立了广泛的销售网络,还积极寻求与国际合作伙伴的合作。通过与国外知名企业的合作,公司不仅引进了先进的技术和管理经验,还进一步提升了产品的国际竞争力。

Design Gateway公司的发展小趣事

随着Gateway业务的不断发展,公司开始寻求更多的市场曝光。1987年,Gateway在《Computer Shopper》杂志上投放了一版独特的广告,吸引了众多消费者的目光。1991年,公司推出了彰显其牧场起家背景的别具一格的奶牛花斑盒状商标,这一创新举措获得了全国消费者的认可,进一步提升了Gateway的品牌知名度和市场地位。

(请注意,由于篇幅限制,以上两个故事为简化版。在实际写作中,可以进一步扩展每个故事,包括更详细的背景信息、人物对话、市场反应等。)

由于篇幅所限,这里只提供了两个故事概要。如果需要更多关于Gateway或其他电子公司的发展故事,可以进一步研究和撰写。

Ho Chien Electronics Group Inc公司的发展小趣事

随着Gateway业务的不断发展,公司开始寻求更多的市场曝光。1987年,Gateway在《Computer Shopper》杂志上投放了一版独特的广告,吸引了众多消费者的目光。1991年,公司推出了彰显其牧场起家背景的别具一格的奶牛花斑盒状商标,这一创新举措获得了全国消费者的认可,进一步提升了Gateway的品牌知名度和市场地位。

(请注意,由于篇幅限制,以上两个故事为简化版。在实际写作中,可以进一步扩展每个故事,包括更详细的背景信息、人物对话、市场反应等。)

由于篇幅所限,这里只提供了两个故事概要。如果需要更多关于Gateway或其他电子公司的发展故事,可以进一步研究和撰写。

Bce Sud公司的发展小趣事

Bce Sud公司成立之初,专注于研发高效能的半导体芯片。面对市场上激烈的竞争,公司创始人凭借其在微电子领域的深厚积累,带领团队成功研发出一款具有低能耗、高稳定性的新型芯片,这一技术突破为公司在市场上打开了局面。随着这款芯片的推出,Bce Sud逐渐在电子行业树立了技术领先的形象。

问答坊 | AI 解惑

机器人讲座 第二讲

机器人讲座 第二讲   …

查看全部问答>

单片机原理和应用课件

正在学单片机传个课件上去 与大家共享了…

查看全部问答>

【晒电路】麦克风放大电路

前几天发过一个电路,有噪声.但没人给解答.后来又重新用TDA2822做了一个麦克风放大的,用在对讲电路中,效果很好,没有一点噪声. 因为开始自己寻找这方面的电路找了很久,但照图弄出来效果都不理想.所以就想把自己的贴出来,给需要的同行一点帮助. 本电 ...…

查看全部问答>

底板和芯片模块如何连接

有一个问题有点疑惑,以前没弄过焊接开发板的事,现在想想要是想把模块芯片焊接到开发板上那么引脚该怎么连啊,比如我想连接编解码芯片到开发板上,用iic总线传输控制信号,spi接口传输数据,通用i/o口传一些中断等信号,那么这块芯片怎么和开发板 ...…

查看全部问答>

串口通讯时断时续

主板rs232连接程序,过几个小时程序就会挂起。和硬件有关吗?(对通讯不太懂,麻烦说详细点可能原因)谢谢!…

查看全部问答>

PB编译时发生错误

想用VT6656 USB网卡,但安装驱动后编译出错,错误如图: 网上搜索了一下,毫无头绪,请问各位有没有碰到过类似的问题啊? 我用的是ATMEL 9261的bsp。…

查看全部问答>

视频设备开发

请教高手 我现在有几副图象要显示在电视机上,图象存在EEPROM中,不知用什么样的图象处理芯片?原先红白机中用了UM6538,但其象素太低,不知有何芯片替代? …

查看全部问答>

请问Windows Embedded CE 6.0 为什么只有评估版?

我在网上到处找Windows Embedded CE 6.0的正式版,但是没有。全都是评估版。请问各位哪里有正式版下载?谢谢。…

查看全部问答>

WinCE程序移植问题

我在原来的VC程序中用到了ltoa函数,把long型数据存在字符数组中,但是在WinCE中不支持,有什么其它的办法实现这个功能吗?请教各位了…

查看全部问答>

多功能调试测试助手-精密电压源AD5791

多功能调试测试助手-精密电压源AD5791 环境说明:CubeSuites+ 文件: AD5791.c   AD5791.h 函数: AD57XX_Init(AD5791); void AD57XX_SetRegisterValue(unsigned char registerAddress, unsigned long registerValue) unsigned ...…

查看全部问答>