STM8单片机时钟应用
- 格式:pdf
- 大小:87.23 KB
- 文档页数:2
深入浅出stm8单片机入门、进阶与应用实例STM8单片机是一款性能优越、功能丰富的微控制器,被广泛应用于嵌入式系统中。
本文将从深入浅出的角度,为大家介绍STM8单片机入门、进阶以及实际应用案例。
一、STM8单片机入门1. STM8单片机概述STM8单片机是意法半导体公司推出的一款8位微控制器,采用了高性能的STM8内核和丰富的外设资源。
相比其他8位单片机,STM8单片机具有更高的性能、更丰富的功能和更低的功耗。
2. STM8单片机编程语言STM8单片机支持多种编程语言,包括C语言、汇编语言、BASIC语言等。
其中,C语言是最常用的一种编程语言,具有语法简单、易于理解等优点。
3. STM8单片机开发环境STM8单片机开发环境包括开发工具和编程器。
常用的开发工具有IAR Embedded Workbench、ST Visual Develop、Keil uVision等。
编程器可以选择ST-Link/V2、ST-Link/V3、J-Link等。
4. STM8单片机基础知识STM8单片机基础知识包括IO口、定时器、中断等。
掌握这些基础知识是学习STM8单片机的基础。
其中,IO口用于接收或输出数字信号,定时器用于计时、测量时间等,中断用于实现程序的异步处理。
二、STM8单片机进阶与实践1. STM8单片机外设应用STM8单片机具有丰富的外设资源,包括GPIO、I2C、SPI、USART、ADC等。
这些外设可以满足不同应用场景的需求。
例如,GPIO用于控制LED等外围设备,I2C和SPI用于连接外部设备,USART用于串口通信,ADC用于模拟信号的采集。
2. STM8单片机通信协议STM8单片机支持多种通信协议,包括UART、I2C、SPI等。
这些通信协议可以实现与其他设备的通信,例如与传感器、显示器、无线模块等设备的通信。
不同的通信协议有着不同的特点和应用场景,需要根据实际需求选择合适的协议。
3. STM8单片机中断技术中断是STM8单片机中的一项重要技术,可以实现程序的异步处理。
STM8 单片机ADC、Timer、USART实用例程这是一个我花了较长时间摸索出来的STM8L-051的例程,它控制LED灯,Timer2定时100us进入中断,软件启动ADC,采样10 次后取平均,将结果通过UASART发送至PC 机,在超级终端上显示的实用程序,因其内存极小,不能用printf等函数,因此对于想用这款资源极少的MCU的开发者来说,读这篇文章会大大节约你的研发时间。
有不会的问题请发邮件***************。
#include <stdio.h>#include "stm8l15x.h"#include "iostm8l051f3.h"#define LED_GPIO_PORT GPIOA#define LED_GPIO_PINS GPIO_Pin_2 | GPIO_Pin_3/* Private function prototypes -----------------------------------------------*/#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) /*ADC_RATIO = ( 3.3 * 1000 * 1000)/4095*/#define SampleADC ((uint8_t) 0x0A)/* Private variables ---------------------------------------------------------*/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){/* Decrement nCount value */while (nCount != 0){nCount--;}}//int putchar(int c)//{// while ((USART1_SR&0x80)==0x00);// UART2_sendchar((u8)c);// return (c);//}static void CLK_Config(void){/* Select HSI as system clock source */CLK_SYSCLKSourceSwitchCmd(ENABLE);CLK_SYSCLKSourceConfig(CLK_SYSCLKSource_HSI); /*High speed external clock prescaler: 1*/CLK_SYSCLKDivConfig(CLK_SYSCLKDiv_1);while (CLK_GetSYSCLKSource() != CLK_SYSCLKSource_HSI){}/* Enable ADC1 clock */CLK_PeripheralClockConfig(CLK_Peripheral_ADC1, ENABLE);/* Enable DMA1 clock */// CLK_PeripheralClockConfig(CLK_Peripheral_DMA1, ENABLE);/* Enable TIM2 clock */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=683USART1_CR2 = 0x0C; //Transmitter & receiver enable}static void ADC_Config(void){ADC1_CR2 = 0x22; //risign edge, softwae start, sampling time 16 ADC clockADC1_SQR3 = 0x80; //ADC = 15channelADC1_TRIGR1 = 0x10; //use internal ref,sampling time 16 ADC clock for RefRI_ASCR1 = 0x00;}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=500TIM2_ARRL = 0x18; // 24X4us=96us 每记数500次产生一次中断,即500msTIM2_IER = 0x01; // 允许更新中断TIM2_CR1 = 0x05; // 计数器使能,开始计数,只允许更新中断请求}void Delay (uint16_t nCount);/* Private functions ---------------------------------------------------------*///#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 UIFADC1_SR = 0x00; //Clear EOCADC1_CR1 = 0x03; // EOC interrupt unable, software set start, ADC enable// while (!(ADC1_SR & 0x01));/*最后一位不是1,结果就是全零,结果为False,!则是True,循环下去;若是1,则跳出。
AD转换例程简单介绍本开发板上采用了STM8S208RB芯片,它提供的是10位的A/D,提供16个输入通道。
一、首先对ADC进行简单的了解:1.ADC开启:通过ADC_CR1寄存器的ADON位来开启ADC需要注意的是,当首次置位ADON时,ADC从低功耗模式下唤醒,需要再次置位来启动ADC转换,转换结束后ADC会保持在上电状态,之后只要置位ADON2.ADCADC由分频因子3.0-通道15)4.ADC描模式,连续扫描模式。
其中:●ADC_CR1寄存器的CONT位为0时,ADC设为单次转换●ADC_CR1寄存器的CONT位为1时,ADC设为连续转换(例程中采用的就是此模式,此模式下,转换结果被保存在ADC_DR寄存器中,同时EOC标志被置位)●ADC_CR1寄存器CONT位为1且ADC_CR3寄存器的DBUF置1(缓存功能被使能)时,ADC设为带缓存的连续转换5.数据对齐对齐方式分为:右对齐,左对齐。
由ADC_CR2寄存器的ALIGN位决定右对齐:8个低位数据被写入ADC_DRL寄存器中,其余的高位数据被写入ADC_DRH寄存器。
左对齐:8个高位数据被写入ADC_DRH寄存器中,其余的低位数据被写入ADC_DRL寄存器。
6.读取转换结果要根据数据对齐的方式来决定如何读取转换结果右对齐:读取时必须先读低位再读高位左对齐:读取时必须先读高位再读低位二、例程分析:例程中要实现的功能:读取光敏电阻对应的AD值,当值小于200时,LED4亮1.首先对ADC进行初始化设置:●设置ADC时钟及转换模式ADC2->CR1=0x72;//fADC=fMASTER/18时钟分频系数18使能连续转换模式●设置数据对齐方式ADC2->CR2=0x00;//数据左对齐●●唤醒ADCADC2->CR1|=0x01;//把ADC从低功耗模式下唤醒●ADC开启ADC2->CR1|=0x01;//启动AD转换2.读取AD值●while((ADC2->CSR&0x80)==0);//等待转换完成●转换结束后首先要清标志位ADC2->CSR&=~0x80;//清EOC转换结束标志●根据我们之前设置的左对齐方式,这里要先读高8位,再读低8位tempH=ADC2->DRH;//先读高8位字节tempL=ADC2->DRL;//再读低8位字节。
网络教育学院《单片机原理及应用》大作业题目:单片机电子时钟设计学习中心:层次:专业:年级:学号:学生姓名:题目一:单片机电子时钟设计一、引言单片机技术在计算机中作为独立的分支,有着性价比高、集成度高、体积少、可靠性高、控制功能强大、低功耗、低电压、便于生产、便于携带等特点,越来越广泛的被应用于实际生活中。
单片机全称,单片机微型计算机,从应用领域来看,单片机主要用来控制系统运行,所以又称微控制器或嵌入式控制器,单片机是将计算机的基本部件微型化并集成在一块芯片上的微型计算机。
二、时钟的基本原理分析利用单片机定时器完成计时功能,定时器0计时中断程序每隔0.01s中断一次并当作一个计数,设定定时1秒的中断计数初值为100,每中断一次中断计数初值减1,当减到0时,则表示1s到了,秒变量加1,同理再判断是否1min钟到了,再判断是否1h到了。
为了将时间在LED数码管上显示,可采用静态显示法和动态显示法,由于静态显示法需要译码器,数据锁存器等较多硬件,可采用动态显示法实现LED显示,通过对每位数码管的依次扫描,使对应数码管亮,同时向该数码管送对应的字码,使其显示数字。
由于数码管扫描周期很短,由于人眼的视觉暂留效应,使数码管看起来总是亮的,从而实现了各种显示。
三、时钟设计分析针对要实现的功能,采用AT89S51单片机进行设计,AT89S51 单片机是一款低功耗,高性能CMOS8位单片机,片内含4KB在线可编程(ISP)的可反复擦写1000次的Flash只读程序存储器,器件采用高密度、非易失性存储技术制造,兼容标准MCS- 51指令系统及80C51引脚结构。
这样,既能做到经济合理又能实现预期的功能。
在程序方面,采用分块设计的方法,这样既减小了编程难度、使程序易于理解,又能便于添加各项功能。
程序可分为闹钟的声音程序、时间显示程序、日期显示程序,秒表显示程序,时间调整程序、闹钟调整程序、定时调整程序,延时程序等。
运用这种方法,关键在于各模块的兼容和配合,若各模块不匹配会出现意想不到的错误。
手动开关手动开关没有自动切换为直接的但它提供给用户的切换事件时间的精确控制。
参照图20中的流程图。
1。
写使用系统时钟开关选择目标时钟源的8位值寄存器(clk_swr)。
然后swbsy位是由硬件,和目标源振荡器开始。
古老的时钟源继续驱动CPU和外设。
2。
该软件具有等到目标时钟源准备(稳定的)。
这是在clk_swcr寄存器和快捷旗由中断如果swien位设置显示。
3。
最终软件的作用是设置,在所选择的时间,在clk_swcr的赛文点寄存器来执行开关。
在手动和自动切换模式,旧的系统时钟源不会自动关闭的情况下是由其他模块(LSI混凝土可用于例如独立的看门狗驱动)。
时钟源可以关机使用在内部时钟寄存器的位(clk_ickcr)和外部时钟寄存器(clk_eckcr)。
如果时钟开关不因任何原因的工作,软件可以通过清除swbsy标志复位电流开关操作。
这将恢复clk_swr注册到其以前的内容(旧的系统时钟)。
注意:在清理swbsy标志具有复位时钟主开关的程序,应用程序必须等到后产生新的主时钟切换请求之前有一段至少两个时钟周期。
9.7周门控时钟(PCG)外周时钟门控(PCG)模式选择性地启用或禁用系统时钟(SYSCLK)连接到外围设备在运行或慢速模式的任何时间来优化功耗。
设备复位后,所有的外设时钟被禁用。
唯一的一点是在复位状态是默认启用pcken27因为它用于启动。
软件已被正确地写入关掉ROM Bootloader执行后的时钟。
您可以启用时钟的任何外围设置在clk_pckenrx周围门控时钟寄存器的相应pcken点。
●使周围,首先使在clk_pckenr相应的pcken点寄存器然后设置使点周围的外围控制寄存器。
●禁用适当的外围,先禁用在周边的适当位控制寄存器,然后停止相应的时钟。
注:蜂鸣器,RTC和液晶显示器是由不同的SYSCLK特定的时钟,使他们继续运行,即使时钟门控的外设寄存器是断言。
9.8时钟安全系统(CSS)9.8.1时钟安全系统对HSE时钟安全系统(CSS)监控HSE晶体时钟源故障时安全作为系统时钟。