历史上的今天
返回首页

历史上的今天

今天是:2025年02月20日(星期四)

正在发生

2021年02月20日 | STM8单片机ADC、Timer、USART实用例程

2021-02-20 来源:eefocus

简介:这是一个我花了较长时间摸索出来的STM8L-051的例程,它控制LED灯,Timer2定时100us进入中断,软件启动ADC,采样10 次后取平均,将结果通过UASART发送至PC机,在超级终端上显示的实用程序,因其内存极小,不能用printf等函数,因此对于想用这款资源极少的MCU的开发者来说,读这篇文章会大大节约你的研发时间。


#include


#include "stm8l15x.h"


#include "iostm8l051f3.h"


#define LED_GPIO_PORT GPIOA


#define LED_GPIO_PINS GPIO_Pin_2 | GPIO_Pin_3


#define ADC1_DR_ADDRESS ((uint16_t)0x5344)


#define BUFFER_SIZE ((uint8_t) 0x02)


#define BUFFER_ADDRESS ((uint16_t)(&Buffer))


#define ASCII_NUM_0 ((uint8_t) 48)


#define ADC_RATIO ((uint16_t) 806)


#define SampleADC ((uint8_t) 0x0A)


uint8_t Buffer[4] = {0, 0, 0, 0};


uint16_t ADCdata = 0;


uint16_t ADCvalue = 0;


unsigned char LED =1;


unsigned char c = 8;


uint16_t acode = 1234; //43 "+" 0x2B;


void Delay(__IO uint16_t nCount)


{


while (nCount != 0)


{


nCount--;


}


}


//int putchar(int c)


//{


// while ((USART1_SR&0x80)==0x00);


// UART2_sendchar((u8)c);


// return (c);


//}


static void CLK_Config(void)


{


CLK_SYSCLKSourceSwitchCmd(ENABLE);


CLK_SYSCLKSourceConfig(CLK_SYSCLKSource_HSI);


CLK_SYSCLKDivConfig(CLK_SYSCLKDiv_1);


while (CLK_GetSYSCLKSource() != CLK_SYSCLKSource_HSI)


{}


CLK_PeripheralClockConfig(CLK_Peripheral_ADC1, ENABLE);


// CLK_PeripheralClockConfig(CLK_Peripheral_DMA1, ENABLE);


CLK_PeripheralClockConfig(CLK_Peripheral_TIM2, ENABLE);


CLK_PeripheralClockConfig(CLK_Peripheral_USART1, ENABLE);


}


static void GPIO_Config(void)


{


PC_DDR = 0X20;


PC_CR1 = 0X20;


PA_DDR = 0X0C;


PA_CR1 = 0X0C;


}


static void USART1_Config(void)


{


// ADCvalue = USART1_DR;


USART1_BRR2 = 0x03;


USART1_BRR1 = 0x68; //16M/9600=683


USART1_CR2 = 0x0C; //Transmitter & receiver enable


}


static void ADC_Config(void)


{


ADC1_CR2 = 0x27; //risign edge, trigger 3, sampling time 384


ADC1_CR3 = 0x10; //16channel


// ADC_ChannelCmd(ADC1, ADC_Channel_17, ENABLE);


}


void TIM2_Config(void)


{


TIM2_PSCR = 0x07; // 应是16,但只能置三位,所以是111 fCK_PSC / 2(PSC[2:0]).


// TIM2_PSCRL = 0x3F; // PSCR=0x1F3F,f=8M/(0x1F3F+1)=1000Hz,每个计数周期1ms


TIM2_ARRH = 0x00; // 自动重载寄存器ARR=0x01F4=500


TIM2_ARRL = 0x18; // 24X4us=96us 每记数500次产生一次中断,即500ms


TIM2_IER = 0x01; // 允许更新中断


TIM2_CR1 = 0x05; // 计数器使能,开始计数,只允许更新中断请求


}


void Delay (uint16_t nCount);


//#pragma vector = ADC1_EOC_vector


//__interrupt void ADC1_EOC(void)


//{


// ADCdata = ADC_GetConversionValue(ADC1);


// }


#pragma vector =TIM2_OVR_UIF_vector


__interrupt void TIM2_OVR_UIF(void)


{


asm("sim");


static uint8_t measurements = SampleADC;


static uint32_t accumulator = 0;


uint32_t average = 0;


uint16_t factor10 = 1000;


int8_t i ;


ADCdata = 0;


TIM2_SR1 = 0x00; //Clear UIF


ADC1_SR = 0x00; //Clear EOC


ADC1_CR1 = 0x03; // EOC interrupt unable, software set start, ADC enable


// while (!(ADC1_SR & 0x01));


Delay(0x000F);


ADCdata = (uint16_t)(ADC1_DRH);


ADCdata = (uint16_t)((uint16_t)((uint16_t)ADCdata << 8) | ADC1_DRL);


accumulator += ADCdata;


if(measurements == 0)


{


LED= !LED;


measurements = SampleADC;


average = accumulator/SampleADC;


ADCvalue = (uint16_t)((uint32_t)((uint32_t)average * (uint32_t)ADC_RATIO) / (uint32_t)1000);


accumulator = 0;


while(!USART1_SR_TXE);


for (i = 3; i >= 0; i--)


{


Buffer[i] = (ADCvalue/factor10) % 10 + 48; //提取十进制每一位,并转换成ASCII码


factor10 = factor10 / 10;


while(!USART1_SR_TXE);


USART1_DR = Buffer[i]; //发送每一位,先发高位


}


while(!USART1_SR_TXE);


USART1_DR = 32; //发送空格


}


measurements--;


asm("rim");


}


void main(void)


{


asm("sim");


GPIO_Config();


GPIO_Init(LED_GPIO_PORT, LED_GPIO_PINS, GPIO_Mode_Out_PP_Low_Fast);


CLK_Config();


ADC_Config();


TIM2_Config();


USART1_Config();


//DMA_Config();


asm("rim");


while (1) {


PA_ODR_ODR2 = LED;


PA_ODR_ODR3 = LED; }


}


推荐阅读

史海拾趣

Formosa MS公司的发展小趣事

在电子行业,Formosa MS(美丽微半导体股份有限公司)的发展过程中,有几个关键的故事可以体现其成长历程。以下是根据公开信息整理的五个相关故事:

1. 创立与初期发展

Formosa MS成立于民国八十五年七月(即1996年),由杨照霞女士创办。公司初期便确立了“新速勤俭、创造利润、热诚信义、前瞻未来”的经营理念,致力于在二极管领域进行创新。在整流二极管逐渐转移至中国大陆生产的背景下,Formosa MS选择专注于生产附加值较高的产品,如萧基二极管,这一战略决策为公司后续发展奠定了坚实基础。

2. 产品创新与多元化

随着技术的不断进步,Formosa MS不断推出新产品以满足市场需求。公司现有产品分类广泛,从0.1安培至三十安培的各类二极管均有产制,且产能规划每月超过200KK,涉及焊接、成型、测试等多个生产环节。此外,公司还实现了产品的多元化,包括一般、快速及超快速二极管等多种类型,进一步增强了市场竞争力。

3. 国际化布局

Formosa MS在发展过程中,积极拓展国际市场。公司的销售客户遍布全球,不仅服务于国内半导体制造商的OEM及中间电子零件贸易商,还通过自有品牌行销,赢得了世界各地客户的广泛好评。其应用类别涵盖通信、车用、AI及穿戴装置等多个领域,展现了公司在电子行业中的广泛影响力。

4. 品质至上与服务优先

Formosa MS始终将品质视为企业的生命线,坚持“品质至上、服务优先、顾客满意”的质量政策。公司严格遵循戴明博士的品质理念,致力于提供满足顾客需求的产品与服务。这种对品质的执着追求,使得Formosa MS在电子行业中树立了良好的口碑,赢得了客户的信赖与支持。

5. 应对行业变革与持续创新

面对电子行业的快速变革,Formosa MS始终保持敏锐的洞察力,积极应对市场变化。公司不断投入研发,推动技术创新,以适应行业发展的新趋势。同时,公司还注重人才培养和团队建设,为企业的持续发展提供了有力保障。正是凭借这种持续创新的精神和强大的团队实力,Formosa MS在电子行业中不断取得新的突破和发展。

需要注意的是,由于具体细节可能涉及公司内部的商业秘密,以上故事主要基于公开信息进行概括和整理。如需更详细的信息,建议直接访问Formosa MS的官方网站或查阅相关行业报告。

Alpha Wire公司的发展小趣事

Alpha Wire公司是一家在电子行业中知名的制造商,专注于生产高性能电线、电缆和线束。虽然我无法提供准确的发展故事,但我可以向你介绍一些关于Alpha Wire公司的背景和其在行业中的重要性。

  1. 公司成立:Alpha Wire公司成立于1922年,总部位于美国新泽西州。创始人是一位名叫韦尔纳·布雷德的工程师,他创立了Alpha Wire公司,旨在为不同领域的电子设备提供高质量的电线和电缆。

  2. 技术创新:Alpha Wire公司在其发展历程中一直致力于技术创新和产品质量的提升。公司不断投资于研发,并采用最新的材料和生产工艺,以确保其产品在性能和可靠性方面处于行业领先地位。

  3. 产品线扩展:随着时间的推移,Alpha Wire公司不断扩展其产品线,以满足不断变化的市场需求。除了标准的电线和电缆产品外,公司还开发了各种特种电线和线束,如耐高温、耐化学腐蚀、防火等特性的产品,以满足不同行业和应用的需求。

  4. 全球市场拓展:Alpha Wire公司在其发展过程中不断拓展其市场份额,通过建立全球分销网络和合作伙伴关系,将其产品销往世界各地。公司不仅在北美市场占据重要地位,还在欧洲、亚洲和其他地区建立了业务和生产基地,以更好地服务全球客户。

  5. 质量和可靠性:作为一家具有悠久历史的公司,Alpha Wire始终将质量和可靠性视为其产品的核心竞争力。公司严格遵循国际标准和质量管理体系,对原材料进行严格筛选和检验,并采用先进的生产工艺和严格的质量控制程序,以确保产品的稳定性和一致性。

以上是关于Alpha Wire公司的一些基本信息,虽然我无法提供具体的发展故事,但希望这些信息能够帮助你了解该公司在电子行业中的重要性和影响力。

Beckhoff Automation GmbH公司的发展小趣事

在环保日益受到重视的今天,BCD Semi公司积极响应国家环保政策,将环保理念融入公司的生产和经营中。公司采用环保材料和工艺,减少生产过程中的污染排放,提高资源利用效率。同时,BCD Semi还加强了对员工的环保培训和教育,提高员工的环保意识,共同推动公司的可持续发展。

Continental Industries公司的发展小趣事

在电子行业的初期,Continental Industries凭借其深厚的技术积累,成功研发出了一款固态继电器。这款继电器以其高度可靠性、长寿命和减少电磁干扰的特性,迅速在市场中占据了重要地位。公司不断投入研发资源,优化产品性能,逐渐在工业自动化和建筑环境控制领域树立起了技术领先的形象。

科山芯创(COSINE)公司的发展小趣事

自成立以来,科山芯创始终坚持技术创新。他们投入大量资源用于研发,不断推出新产品。其中,COS8820射频收发芯片、COS6212线驱动器功放芯片等产品,凭借其优异的性能和稳定性,在市场上获得了广泛认可。这些产品的成功,不仅证明了科山芯创的技术实力,也为其在电子行业中树立了良好的口碑。

Cystech公司的发展小趣事

随着全球环保意识的不断提高,C-TECH Co., Ltd积极响应环保号召,将环保理念融入公司的发展之中。公司在2007年就通过了ISO 14001环境管理体系认证,并在生产过程中采用环保材料和工艺,减少废弃物排放和能源消耗。此外,公司还积极参与环保公益活动,推动行业绿色发展。通过践行环保理念,C-TECH Co., Ltd在电子行业树立了良好的企业形象。

问答坊 | AI 解惑

单片机的应用领域

单片机广泛应用于仪器仪表、家用电器、医用设备、航空航天、专用设备的智能化管理及过程控制等领域,大致可分如下几个范畴:   1.在智能仪器仪表上的应用   单片机具有体积小、功耗低、控制功能强、扩展灵活、微型化和使用方便等优点,广泛应用 ...…

查看全部问答>

no cpu is delected

串口是USB转的 并口是PCI转的 可以连上JTAG 但是烧写程序的时候显示这个错误~!…

查看全部问答>

tinyos能不能移植到CC2430上

我现在做毕业设计,准备将tinyos移植到CC2430上,请问能不能做到,难度有多大?…

查看全部问答>

哪位好心人帮帮我发一个keil软件给我

我的keil 老是出错, 比如: void main(void) { unsigned int w; w=10; } 程序执行到‘}’结束符就出错。 ***   error   65:   access   violation   at   C:0x0A00  &nb ...…

查看全部问答>

vs2005 编写 wince6.0程序问题

小弟这两天碰到一个很诡异的问题。 我在以前写的工程中加入代码调试运行时,新写的代码不运行。具体如下: 假如先前函数代码: [code]OnBnClickedBtnPrint1() {         int a=0;         a++; &nb ...…

查看全部问答>

pxa310开发板

Marvell? PXA310?开发板简要介绍 产品图片 Product Photo PXA310 简介 PXA310 处理器专门为手持设备、GPS 定位系统、无线手持和其他消费类电子设备而设计。基于第三代Intel XScale 技术的这一Marvell PXA3XX 应用处理器系列产品(内部称为Mon ...…

查看全部问答>

请问多个不同的硬件中断号(IRQ)能否关联到同一个逻辑中断(SYSINT)?

还有就是一个硬件中断号是否可以关联多个逻辑中断号? 希望大家讨论讨论!!…

查看全部问答>

纹波电压

  最近在看一本外国的书籍 电子电路分析与设计   刚开始看不久   看到一个纹波电路 纹波电压   好像以前没看过呢   这个纹波电压是做什么呢??   请问   (本人系菜鸟,如果问的问题比较弱智, ...…

查看全部问答>

STM8I2C是400K?4M?

今天看了一下ST的datasheet: RM0016 Reference manual December 2009 I2C  是400K? 4M? 400k.JPG (80.43 KB) 下载次数:2 2010-9-15 22:01 4M.JPG (75. ...…

查看全部问答>