STM8教程-第十四章 STM8S207 PWM 模块及其应用实例
STM8教程-第八章 STM8S207时钟编程及其实例
第八章STM8S207时钟编程及其实例本章介绍STM8S207 的时钟编程。
STM8S207 时钟控制器功能强大而灵活易用,允许程序运行中将主时钟从一个时钟源切换到另一个时钟源,而且同一个时钟源可以任意更改分频系数。
8.1 STM8 时钟控制简介时钟控制器功能强大而且灵活易用。
其目的在于使用户在获得最好性能的同时,亦能保证消耗的功率最低。
用户可独立地管理各个时钟源,并将它们分配到CPU 或各个外设。
主时钟和CPU 时钟均带有预分频器。
具有安全可靠的无故障时钟切换机制,可在程序运行中将主时钟从一个时钟源切换到另一个时钟源。
抗电磁干扰时钟配置寄存器为了避免由电磁干扰造成的对应用程序误写操作或系统挂起,大多数关键的时钟配置寄存器都有一个互补寄存器与之相对应。
系统将会自动检测这些关键寄存器与其互补寄存器之间是否匹配。
如果不匹配,则产生一个EMS 复位,从而使应用程序恢复到正常操作。
详情请参见时钟寄存器描述。
1、主时钟源介绍下面4种时钟源可用做主时钟1、1-24MHz 高速外部晶振(HSE)2、最大24MHz 高速外部时钟信号3、16MHz 高速内部RC 振荡器(HSI)4、128KHz 低速内部RC(LSI)所以总的来说可以分为三种时钟源,HSE、HSI、LSI2、时钟树,如下图所示由上图可以发现,作为f_cpu 的时钟源可以来源于f_hse、f_hsi 经过HSIDIV分频后的时钟、f_lsi 这三个时钟源。
而选择开关在CKM[7:0]中。
由此事实上可以作为f_master 的时钟源频率有:外部HSE 24MHz内部高速HSI 16MHz、2 分频的8MHz、4 分频的4MHz、8 分频的2MHz(复位默认时钟源)内部低速LSI 128KHz上面得到的频率是f_master 的频率,然后f_master 还可以通过CPUDIV 来分频后提供f_cpu 的时钟,CPUDIV 可以为1、2、4、8、16、32、64、128 分频,最终得到是CPU 的时钟频率f_cpu。
STM教程STMS定时器模块及其应用实例
S T M教程S T M S定时器模块及其应用实例集团标准化工作小组 [Q8QX9QT-X8QQB8Q8-NQ8QJ8-M8QMN]第十三章 STM8S207 定时器模块及其应用实例这一节,我们将向大家介绍如何使用 STM8 的定时器中的基本定时功能,STM8 的定时器功能十分强大,有 TIM1 高级定时器,也有 TIM2、TIM3 等通用定时器,还有TIM4 基本定时器。
在 STM8S 参考手册里面,定时器的介绍占了 1/3 的篇幅,足见其重要性。
这一节,我们分别介绍 TIM1 到 TIM4 定时器中的基本定时功能。
例程一、16 位高级控制定时器(TIM1)简介:TIM1 由一个 16 位的自动装载计数器组成,它由一个可编程的预分频器驱动。
TIM1 有 4 个通道,分别是 1 到 4。
分别对应于四个不同的捕获/比较通道。
高级控制定时器适用于许多不同的用途:基本的定时测量输入信号的脉冲宽度(输入捕获)产生输出波形(输出比较,PWM 和单脉冲模式)对应与不同事件(捕获,比较,溢出,刹车,触发)的中断与 TIM5/TIM6 或者外部信号(外部时钟,复位信号,触发和使能信号)同步高级控制定时器广泛的适用于各种控制应用中,包括那些需要中间对齐模式PWM 的应用,该模式支持互补输出和死区时间控制。
高级控制定时器的时钟源可以是内部时钟,也可以是外部的信号,可以通过配置寄存器来进行选择。
这一节我们实现的功能是基本的定时,关于 PWM 的编程留下以后的章节中。
还有建议大家研究更为深入的功能TIM1 的时基单元包括,如下图所示:● 16 位向上/向下计数器● 16 位自动重载寄存器●重复计数器●预分频器16 位计数器,预分频器,自动重载寄存器和重复计数器寄存器都可以通过软件进行读写操作。
自动重载寄存器由预装载寄存器和影子寄存器组成。
可在在两种模式下写自动重载寄存器:●自动预装载已使能(TIM1_CR1 寄存器的 ARPE 位置位)。
STM8教程-第八章 STM8S207时钟编程及其实例
第八章STM8S207时钟编程及其实例本章介绍 STM8S207 的时钟编程。
STM8S207 时钟控制器功能强大而灵活易用,允许程序运行中将主时钟从一个时钟源切换到另一个时钟源,而且同一个时钟源可以任意更改分频系数。
STM8 时钟控制简介时钟控制器功能强大而且灵活易用。
其目的在于使用户在获得最好性能的同时,亦能保证消耗的功率最低。
用户可独立地管理各个时钟源,并将它们分配到 CPU 或各个外设。
主时钟和CPU 时钟均带有预分频器。
具有安全可靠的无故障时钟切换机制,可在程序运行中将主时钟从一个时钟源切换到另一个时钟源。
抗电磁干扰时钟配置寄存器为了避免由电磁干扰造成的对应用程序误写操作或系统挂起,大多数关键的时钟配置寄存器都有一个互补寄存器与之相对应。
系统将会自动检测这些关键寄存器与其互补寄存器之间是否匹配。
如果不匹配,则产生一个 EMS 复位,从而使应用程序恢复到正常操作。
详情请参见时钟寄存器描述。
1、主时钟源介绍下面 4种时钟源可用做主时钟1、1-24MHz 高速外部晶振(HSE)2、最大 24MHz 高速外部时钟信号3、16MHz 高速内部 RC 振荡器(HSI)4、128KHz 低速内部 RC(LSI)所以总的来说可以分为三种时钟源,HSE、HSI、LSI2、时钟树,如下图所示由上图可以发现,作为 f_cpu 的时钟源可以来源于 f_hse、f_hsi 经过 HSIDIV分频后的时钟、f_lsi 这三个时钟源。
而选择开关在 CKM[7:0]中。
由此事实上可以作为 f_master 的时钟源频率有:外部 HSE 24MHz内部高速 HSI 16MHz、2 分频的8MHz、4 分频的4MHz、8 分频的2MHz(复位默认时钟源)内部低速 LSI 128KHz上面得到的频率是 f_master 的频率,然后 f_master 还可以通过 CPUDIV 来分频后提供 f_cpu 的时钟,CPUDIV 可以为 1、2、4、8、16、32、64、128 分频,最终得到是 CPU 的时钟频率 f_cpu。
STM8教程-第七章STM8S207GPIO模块及其应用
STM8教程-第七章STM8S207GPIO模块及其应用第七章STM8S207 GPIO模块及其应用本章终于开始STM8S207 的例程编写了,通过前面章节的学习,相信对STM8S207 已经有了一定的认识。
本章从STM8S207 最简单的IO 口模块开始STM8S207 的编程。
7.1 GPIO 简介STM8S207 内部有非常丰富的输入、输出端口资源,同时也集成了多种功能模块,其输入、输出引脚大多为复用引脚。
STM8S207 单片机的IO 口包括PA、PB、PC、PD、PE、PF、PG、PI 等52 个IO 口通用输入/输出口用于芯片和外部进行数据传输。
一个IO 端口可以包括多达8 个引脚,每个引脚可以被独立编程作为数字输入或者数字输出口。
另外部分口还可能会有如模拟输入,外部中断,片上外设的输入/输出等复用功能。
但是在同一时刻仅有一个复用功能可以映射到引脚上。
复用功能的映射是通过选项字节控制的。
请参考数据手册关于选项字节的描述。
每个IO 口都有 5 个对应的寄存器,IO 的工作方式也由这 5 个寄存器控制,它们分别为:1、数据方向寄存器2、配置寄存器13、配置寄存器24、输出数据寄存器5、输入数据寄存器一个I/O 口工作在输入还是输出是取决于该口的数据方向寄存器的状态。
7.1.1 GPIO 主要功能1、端口的各个位可以被单独配置2、可选择的输入模式:浮动输入和带上拉输入3、可选择的输出模式:推挽式输出和开漏输出4、数据输入和输出采用独立的寄存器5、外部中断可以单独使能和关闭6、输出摆率控制用以减少EMC 噪声7、片上外设的I/O 功能复用8、当作为模拟输入时可以关闭输入施密特触发器来降低功耗9、在数据输出锁存时支持读-修改-写10、输入兼容5V 电压11、I/O 口工作电压范围为1.6 V 到VDDIOmaxGPIO 模块框图7.2 IO 口的配置和使用每一个端口都有一个输出数据寄存器(ODR),一个引脚输入寄存器(IDR)和一个数据方向寄存器(DDR)。
STM8学习笔记——PWM模块
STM8学习笔记——PWM模块首先将管脚配置为推挽输出。
下面以向上计数模式为例来讲述PWM 产生的原理:TIMx 开始向上计数,TIMx_CNT 为计数值,计数一次加1,TIMx_ARR 确定了计数的上限,达到上限后计数器从0 开始重新计数,所以一次PWM 频率就由TIMx_ARR 来确定了,即计数器时钟*(TIMx_ARR-1),频率确定了,接下来就是占空比。
占空比是由TIMx_CCRx 来确定的,PWM模式1 下当TIMx_CNT=TIMx_CCRx 时,输出OCiREF 无效电平,至于有效电平是0 还是1,要设置TIMx_CCERx,这样产生了一个PWM 波形,可以说配置非常灵活,当TIMx_CCRx 为0 时,占空比就为0,当TIMx_CCRx 大于TIMx_ARR 时,就一直输出高电平(占空比100%)。
下图是个例子:以下是我写的一个参考程序,测试通过void TIM1_Init(void){//定时器1 初始化CLK_PCKENR1|=0x80;//开启定时器1 外设时钟TIM1_EGR=0x01;//重新初始化TIM1 TIM1_EGR|=0x20;//重新初始化TIM1 TIM1_ARRH=0x00;//设定重装载值TIM1_ARRL=254; TIM1_PSCRH=0;//预分频TIM1_PSCRL=9; TIM1_CR1=0;//边沿对齐,向上计数} void TIM1_PWM_Init(){ //TIM1_CCER1=0x03;//低电平有效//TIM1_CCMR1=0x70;//PWM 模式2TIM1_CCER1=0x01;//高电平有效TIM1_CCMR1=0x60;//PWM 模式1TIM1_CCR1H=0;//占空比TIM1_CCR1L=50; TIM1_CR1|=0x01;//向上计数,无缓存,使能TIM1_BKR=0x80;//开启刹车}tips:感谢大家的阅读,本文由我司收集整编。
stm8s的c语言编程例程
实例一:控制灯的亮灭(或者蜂鸣器响,只要连接相应端口就可以了):#include ""大24MHz高速外部时钟信号(HSE user-ext)高速内部RC振荡器(HSI)低速内部RC(LSI)各个时钟源可独立打开或者关闭,从而优化功耗。
HSE:高速外部时钟信号,由两个时钟源产生:HSE外部晶体/陶瓷谐振器;HSE用户外部有源时钟。
(为了最大限度的减少输出失真和减少启动失真的稳定时间,谐振器和负载电容应尽可能的靠近谐振器引脚。
负载电容值应根据所选的谐振器进行调整。
)外部1至24MHz的振荡器其优点在于能够产生精确的占空比为50%的主时钟信号。
为使系统快速启动,复位后时钟控制器自动使用HSI的8分频(HSI/8)做为主时钟。
其原因为HSI的稳定时间短,而8分频可保证系统在较差的V条件下安全启动。
时钟设置的目的到底是什么时钟设置肯定会出现中断貌似是这样的:运用合适的时钟配置可以使得功耗降低,有时候计数频率很大,需要很大的计数或者怎么样时,需要使用其他的时钟,即非默认的时钟!暂且这样解释!例题四:利用中断按键控制灯的亮灭。
#include ""断产生——在计数器更新时:计数器溢出。
Timer6的主要功能:位向上计数的自动重载计数器位可编程的与分配器(可在运行中修改),提供1,2,4,8,16,32,64,和128这8种分频比例。
3.用于和外部信号相连和定时器级联的同步电路4.中断产生:——在计数器更新时:计数器溢出——在触发信号输入时。
Timer4和timer6中断:该定时器的时钟源是内部时钟(Fmaster)。
该时钟源是直接连接到CK_PSC时钟的,CK_PSC 时钟通过预分频器分频后给定时器提供CK_CNT时钟。
预分频器功能如下:1.预分频器是基于由一个3位寄存器(在TIMX_PSCR寄存器中)来控制的一个7位的计数器。
由于该控制寄存器是带缓冲的所以它可以在系统运行中被改变。
单片机实践-8位PWM应用举例
CONTENTS
任务要求 绘制原理图 编写代码 观察现象
1 任务要求
任 务 : 利用PCA模块的PWM功能,在P1.1引脚上输出占空比为25%的PWM脉冲 ;PCA计数器每溢出中断100次,P1.3引脚电平取反;PWM由低变高产生中断,每中 断2000次,P1.4引脚电平取反一次。采用示波器监测PWM波形,并观察P1.3和P1.4 两引脚LED闪烁速度,设晶振为24MHz。。
4 观察效果
1、在Proteus中导入HEX文件,点击运行图标,用示波器测量P1.3、P1.4、 P1.1的波形。 2、使用STC-ISP下载HEX文件到 单 片 机 , 用 示 波 器 测 量 P1.3 、 P1.4、P1.1脚的波形。
THANK YOU
3 编写代码
②采用PWM/PCA的模块0, PCA模块的计数时钟源决定 PWM输出脉冲的频率,但与 PWM的占空比无关,PWM的 占空比=(256 -(CCAP0L)) / 256 = 25%,所以CCAP0L为 C0H。另外,PWM无须设置中 断,但PCA模块的计数器必须设 置中断。
① 置位CCAPM0寄存器的ECOM0、CAPPn、PWM0和ECCF0,即CCAPM0=0x63。
具体要求: 1、使用Proteus设计电路图; 2、编写代码,实现PWM输出; 4、在Proteus和实训板上面观察效果。
2 绘制电路原理图
从器件库中找到3个器件: (1)STC15W4K58S4 ( LQFP44 封 装 ) (2)电阻RES (1)LED-RED
放置示波器,测量P1.1脚波形。
一款基于STM8S系列单片机的洗碗机控制器设计及实现
一款基于STM8S系列单片机的洗碗机控制器设计及实现摘要:文章简要介绍了全自动洗碗机的工作原理及主要功能,分析了洗碗机的几个主要检测对象及控制对象的具体控制需求。
给出了一款以STM8S系列单片机为控制核心的洗碗机控制器的具体设计方案,介绍了系统各主要功能模块的原理图设计、软件总体框架结构以及部分软件模块的设计思路等。
该方案同时考虑了兼容性设计的问题,可兼容两种显示方案,三种类型的洗涤电机以及多种运行参数选择。
关键词:STM8S;单片机;兼容性设计;洗碗机控制器;软件结构洗碗机在欧美已广泛应用于普通家庭的厨房中,有数据统计,在欧美主要国家,洗碗机的普及率已达到70%以上,几乎是家家户户必备的厨房生活电器。
而在中国,由于生活习惯的影响,洗碗机一直无法得到普及,但随着现代都市生活品质的不断提高,人们越来越关注生活中能带来更多便利的电器,洗碗机也在吸引着更多中国消费者的眼球,它的便利性正逐步得到人们的认可。
目前市场上Electrolux、SIEMENS、Whirlpool、SANYO、Hair、Midea等国内外著名品牌均推出其洗碗机产品,洗碗机产品具有很广阔的市场前景。
1工作原理及主要功能洗碗机是用于洗碗的机器,它可用于自动清洗碗、盘、碟、勺子、筷子等餐具。
根据洗碗机的用途、洗涤方式、安装方式、控制方式、开门方式等,可将它分为多种种类及型号。
本文主要讨论的是家用喷淋式全自动洗碗机的设计方案及实现方式,该产品也是目前家用洗碗机中最主要的产品形式。
此类型洗碗机的主要工作原理就是用水泵将加热后的水抽送到旋转喷臂,在水压的作用下喷臂会旋转,水通过旋转喷臂上的小孔向上下左右强力喷淋,辅助以清洁剂等物品,将碗碟上的油污等冲洗干净,从而达到清洗碗碟的目的。
喷淋式洗碗机工作原理如图1所示。
洗碗机的主要功能包括洗涤、消毒、烘干、预约、水质软化、掉电自动记忆、学习功能等,系统提供多种洗涤程序供用户选择,用户可根据需要选择普通、快速、强力、夜间、精细、自保养等洗涤模式。
ST单片机STM8S开发入门教程
ST单片机STM8S开发入门教程最近ST在国内大力推广他的8位高性价比单片机STM8S系列,感觉性能上还是非常不错的,网上稍微看了点资料,打算有机会还是学习一下,先入门为以后做好技术积累。
好了,长话短说。
手上拿到一套ST最近做活动赠送的三合一学习套件,上面包括STM32F小板、ST LINK小板、STM8S小板,做工很精致,相信很多朋友也收到了。
既然当初去申请了,人家也送了,总得把用起来吧,放着吃灰尘是很可惜的^_^ 。
好,步入正题,刚开始在论坛上逛了一圈,感觉STM8S的资料实在太少,都是官方的应用资料,没有什么入门介绍,连需要安装什么软件都搞不清楚。
偶的电脑光驱坏了,所以也读不出光盘里有什么东西,所以只能到处瞎摸,还是ourdev论坛好,嘿嘿,仔细看了几个帖子,总算明白大概是什么样的开发环境了。
用C语言开发STM8S,需要安装两个软件:1、STVD IDE开发环境;2、COSMIC for STM8 C编译器。
STVD可以到官网下载,下载地址:/stonline/products/support/micro/files/sttoolset.exeCOSMIC 需要申请LICENSE,比较繁琐,刚好坛子有人传了一个免安装无限制版本的,偶就赶紧下载了,大家可以去下载,仅做为个人学习使用。
下载地址:/bbs/bbs_content.jsp?bbs_sn=3229327&bbs_page_no=1&bbs_id=3020 软件下载后,只需安装STVD。
从上面地址下载的COSMIC不用安装,只要解压到硬盘即可。
后面建立工程的时候设置好路径即可。
下面一步一步开始啦~一、安装好STVD后,桌面上建立了两个快捷图标,ST Visual Develop就是STVD了。
ST Visual Programmer是编程软件,可以配合ST LINK对STM8S进行编程烧录。
二、双击运行ST Visual Develop,启动STVD开发环境。
PWM 模块原理及使用
PWM模块原理及使用F28027有8路PWM(四个模块),4路HRPWM,特别对设计高精度电源提供了方便,每个PWM模块中又包括以下几个子模块:时基(Time-base)模块、计数比较(Counter-compare)模块、功能限定(Action-qualifier)模块、死区控制(Dead-band)模块、斩波(PWM-chopper)模块、事件触发(Event-trigger)(不知道这样翻译恰当否)模块、数字比较(Digital Compare)模块、制动(Trip-zone)模块。
从这些模块的命名上看,用它来做个电源,是再恰当不过的了。
一、时基子模块(TB)每一个ePWM模块,都有自己的TB,它产生PWM的所有定时事件,且有同步逻辑,可以使多个PWM模块有序工作。
TBPRD:PWM的计数周期寄存器。
TBPHS:相位控制寄存器,在多个PWM模块级联时,可以控制每路输出的相位。
当时基模块的同步脉冲到来时,使计数器从TBPHS设置的值开始计数(丢弃当前计数值)。
TBCTL:TB的控制寄存器,可以对相位方向(只在up-down时有用)控制,决定是上计数时同步(PHSDIR=1)还是下计数时同步(PHSDIR=0);决定TB 输入时钟的分频系数;向下一级输出的同步脉冲的输出方式;计数值重装方式、计数方式、同步允许等控制。
TBCTR:计数寄存器。
TB模块的当前计数值。
TBSTS:TB的状态寄存器。
二、计数比较子模块(CC)此模块实现与TB的比较及控制。
产生CMPA、CMPB比较事件;控制PWM 的占空比。
CMPCTL:计数比较控制寄存器。
决定是否使用影子寄存器及计数值的重装方法。
CMPA:计数比较值设定寄存器ACMPAM:CMPA的影子寄存器。
CMPB:计数比较值设定寄存器B三、功能限定子模块(AQ)这个子模块主要对TB及CC模块产生的事件,作出相应的响应,如计数器到达设定同期时、到达0时、到达CMPA时、到达CMPB时,相应的EPWMxA、EPWMxB的输出状态。
IAR FOR STM8例程
IAR+STM8——EXTI外部中断控制寄存器2013-03-21 23:23:15| 分类:STM8|举报|字号订阅这块三合一的开发板上有且只有一个按键,没办法,就拿这唯一的按键来用吧。
吸取前面UART3的教训,先看开发板的原理图吧。
这个按键被接到了STM8S207SB的PD7上,已做了上拉处理。
为了简单明了,还是点LED1吧。
按一下LED1亮,再按一下LED1灭。
好了,写程序吧。
#i nclude <iostm8s207sb.h>#define LED1_FLASH PD_ODR_ODR3 = !PD_ODR_ODR3 // 开发板上的LED1接在PD3上void GPIO_init(void){PD_DDR = 0x08; // 配置PD端口的方向寄存器PD3输出PD_CR1 = 0x08; // 设置PD3为推挽输出PD_CR2 = 0x80; // 使能PD7外部中断}void EXTI_init(void){EXTI_CR1 = 0x80; // PD口下降沿触发中断}#pragma vector=0x02 // 这里很关键!看下面说明。
__interrupt void EXTI_PD7_TLI(void){LED1_FLASH;}void init_devices(void){asm("sim"); // 关全局中断GPIO_init();EXTI_init();asm("rim"); // 开全局中断}void main( void ){init_devices();// 主循环里没有程序需要执行while(1);}这里着重要说明的一点是PD7的外部中断程序。
看了一下芯片手册,PD口外部中断EXTI3的中断向量号是6,想当然,又是想当然,按IAR的规矩中断向量要加2,就这样写#pragma vector=0x08,结果就是按下按键,程序没响应了,一直在中断里不出来。
STM8的C语言编程(14)-- PWM
STM8的C语言编程(14)--PWM在单片机应用系统中,也常常会用到PWM信号输出,例如电机转速的控制。
现在很多高档的单片机也都集成了PWM功能模块,方便用户的应用。
对于PWM信号,主要涉及到两个概念,一个就是PWM信号的周期或频率,另一个就是PWM信号的占空比。
例如一个频率为1KHZ,占空比为30%,有效信号为1的PWM信号,在用示波器测量时,就是高电平的时间为300uS,低电平的时间为700uS的周期波形。
在单片机中实现PWM信号的功能模块,实际上就是带比较器的计数器模块。
首先该计数器循环计数,例如从0到N,那么这个N就决定了PWM的周期,PW M周期=(N+1)*计数器时钟的周期。
在计数器模块中一定还有一个比较器,比较器有2个输入,一个就是计数器的当前值,另一个是可以设置的数,这个数来自一个比较寄存器。
当计数器的值小于比较寄存器的值时,输出为1(可以设置为0),当计数器的值大于或等于比较寄存器的值时,输出为0(也可设置为1,与前面对应)。
了解了这个基本原理后,我们就可以使用STM8单片机中的PWM模块了。
下面的实验程序首先将定时器2的通道2设置成PWM输出方式,然后通过设置自动装载寄存器TIM2_CCR2,决定PWM信号的周期。
在程序的主循环中,循环修改占空比,先是从0逐渐递增到128,然后再从128递减到0。
当把下面的程序在ST的三合一板上运行时,可以看到发光二极管LD1逐渐变亮,然后又逐渐变暗,就这样循环往复。
如果用示波器看,可以看到驱动LD1的信号波形的占空比从0变到50%,然后又从50%变到0。
同样还是利用ST的开发工具,生成一个C语言程序的框架,然后修改其中的m ain.c,修改后的代码如下。
// 程序描述:用PWM输出驱动LED#include "STM8S207C_S.h"void CLK_Init(void);void TIM_Init(void);// 函数功能:延时函数// 输入参数:ms -- 要延时的毫秒数,这里假设CPU的主频为2MHZ// 输出参数:无// 返回值:无// 备注:无void DelayMS(unsigned int ms){unsigned char i;while(ms != 0){for(i=0;i<250;i++){}for(i=0;i<75;i++){}ms--;}}// 函数功能:初始化时钟// 输入参数:无// 输出参数:无// 返回值:无// 备注:无void CLK_Init(){CLK_CKDIVR = 0x11; // 10: fHSI = fHSI RC output/ 4// = 16MHZ / 4 =4MHZ// 001: fCPU=fMASTER/2. = 2MHZ}// 函数功能:初始化定时器2的通道2,用于控制LED的亮度// 输入参数:无// 输出参数:无// 返回值:无// 备注:无void TIM_Init(){TIM2_CCMR2 = TIM2_CCMR2 | 0x70;// Output mode PWM2.// 通道2被设置成比较输出方式// OC2M = 111,为PWM模式2,// 向上计数时,若计数器小于比较值,为无效电平// 即当计数器在0到比较值时,输出为1,否则为0TIM2_CCER1 = TIM2_CCER1 | 0x30;// CC polarity low,enable PWM ou tput */// CC2P = 1,低电平为有效电平// CC2E = 1,开启输出引脚//初始化自动装载寄存器,决定PWM方波的频率,Fpwm=4000000/256=1562 5HZTIM2_ARRH = 0;TIM2_ARRL = 0xFF;//初始化比较寄存器,决定PWM方波的占空比TIM2_CCR2H = 0;TIM2_CCR2L = 0;// 初始化时钟分频器为1,即计数器的时钟频率为Fmaster=4MHZTIM2_PSCR = 0;// 启动计数TIM2_CR1 = TIM2_CR1 | 0x01;}main(){unsigned char i;CLK_Init(); // 初始化时钟TIM_Init(); // 初始化定时器while(1) // 进入无限循环{// 下面的循环将占空比逐渐从0递增到50%for(i=0;i<128;i++){TIM2_CCR2H = 0;TIM2_CCR2L = i;DelayMS(5);}// 下面的循环将占空比逐渐从50%递减到0for(i=128;i>0;i--){TIM2_CCR2H = 0;TIM2_CCR2L = i;DelayMS(5);}}}。
关于stm8s207的定时器同时进入中断的问题
关于stm8s207的定时器同时进入中断的问题调试stm8s207 时候,发现拔掉电源后,再插上电源,程序莫名其妙的死了。
起初以为是单片机没有复位,查看电容0.1uf,还好啊。
没问题,配上10k 的电阻t=rc=1ms,再说以前的都是这样的设计。
后来发现我开通了两个定时器,T1 和T2,并且两者的中断时间竟然一样,都是50ms,难道是一上电,同时进入中断卡死了。
函数名:TIM1_Init 功能:计数器管理说明:(64/Sys_Clk) *125*50=50ms //Sys_Clk/(7+1)x(9999+1) = 10ms//*******************************************************************************/void TIM1_Init(void){TIM1_DeInit(); //定时器1 相关寄存器复位TIM1_TimeBaseInit(64, TIM1_COUNTERMODE_UP, 125*50, 0); //中断时间50ms// TIM1_TimeBaseInit(7, TIM1_COUNTERMODE_UP, 9999, 0); //中断时间10ms// TIM1_TimeBaseInit(8, TIM1_COUNTERMODE_UP, 1500, 0); //中断时间msTIM1_ITConfig(TIM1_IT_UPDATE, ENABLE); ITC_SetSoftwarePriority(ITC_IRQ_TIM1_OVF, ITC_PRIORITYLEVEL_2);//设置d 定时器中断优先级2TIM1_Cmd(ENABLE); //使能TIM1}voidTIM2_Init(void){TIM2_DeInit();TIM2_TimeBaseInit(TIM2_PRESCALER_64,125*50);//50ms 中断TIM2_ITConfig(TIM2_IT_UPDATE, ENABLE); //使能中断ITC_SetSoftwarePriority(ITC_IRQ_TIM2_OVF, ITC_PRIORITYLEVEL_2);//设置d 定时器中断优先级2TIM2_Cmd(ENABLE);//使能定时器1}后来,我将定时器1 中断时间改为10msvoid TIM1_Init(void){TIM1_DeInit(); //定时器1 相关寄存器复位// TIM1_TimeBaseInit(64, TIM1_COUNTERMODE_UP, 125*50, 0); //中断时间50msTIM1_TimeBaseInit(7, TIM1_COUNTERMODE_UP, 9999, 0); //中断时。
STM8功耗控制
STM8S时钟控制器功能强大而且灵活易用,其目的在于使用户在获得最好的性能同时,亦能保证消耗的功率最低用户可以单独地管理各个时钟源,并将它们分配到CPU和各个外设。
主时钟和CPU时钟均带有预分频器,注意的是STM8S系列是没有锁相环倍频功能的。
这一节我们主要是对主时钟的编程,片内外设的时钟留到对应的外设章节中说明。
STM8具有安全可靠的无故障时钟切换机制,可在程序运行中将主时钟源切换到另一个时钟源。
之所以我们在这一节内容安排在第三节,是因为STM8S有默认时钟源而且简单IO 口编程相对于入门来说更容易接受,所以我们特意安排在第三节。
抗电磁干扰时钟配置寄存器为了避免由电磁干扰造成的对应用程序误写操作或系统挂起,大多数关键的时钟配置寄存器都有一个互补寄存器与之相对应。
系统将会自动检测这些关键寄存器与其互补寄存器之间是否匹配。
如果不匹配,则产生一个EMS复位,从而使应用程序恢复到正常操作。
详情请参见时钟寄存器描述。
这在特定环境下是很有帮助的。
主时钟源介绍下面4中时钟源可用做主时钟1、1-24MHz高速外部晶振(HSE)2、最大24MHz高速外部时钟信号3、16MHz高速内部RC振荡器(HSI)4、128KHz低速内部RC(LSI)各个时钟源可以单独打开或者关闭,从而优化功耗HSE高速外部时钟信号可由下面两个时钟源产生HSE外部晶体/陶瓷谐振器HSE用户外部有源时钟HISHIS信号由内部16MHz RC振荡器与一个可编程分频器(分频因子从1到8)产生。
分频因子由寄存器CLK——CKDIVR决定。
LSI128KHz的LSI RC时钟是一个低功耗的可选主时钟源,也可在停机(Halt)模式下作为维持独立看门狗的低功耗时钟源。
2、主时钟切换时钟切换功能为用户提供了一种易用、快速、安全的从一个时钟源切换到另一个时钟源的途径。
2.1系统启动为使系统快速启动,复位后时钟控制器自动使用HSI的8分频(HSI/8)做为主时钟(2MHz)。
pwm应用电路
pwm应用电路
PWM (Pulse Width Modulation) 即脉宽调制技术,是一种控制信号的方式,可以用于电机驱动、LED 控制等领域。
下面介绍一个PWM 应用电路的实现方法。
该电路可以控制 LED 的亮度,其基本原理是通过控制 PWM 信号的脉冲宽度,从而控制 LED 的平均亮度。
具体方法如下:
1. 准备材料:Arduino 控制板、LED 灯、电阻、电容。
2. 连接电路:将电阻和电容连线,连接到 Arduino 控制板的数字输出端口,连接 LED 电路。
3. 编写程序:利用 Arduino 开发环境编写程序,控制 PWM 模块的输出,实现对 LED 亮度的控制。
4. 调试测试:上传程序到 Arduino 控制板,并进行测试,根据需要修改 PWM 频率和脉宽,实现不同的亮度调节效果。
该电路可以广泛应用于 LED 灯控制、电机速度控制等领域,具有调节灵活、控制精度高等优点。
STM8 PWM模式
STM8 PWM模式STM8的脉冲宽度调制(PWM)模式可以产生一个由TIM1_ARR寄存器确定频率、由TIM1_CCRi寄存器确定占空比的信号。
在TIM1_CCMRi寄存器中的OCiM位写入'110'(PWM模式1)或'111'(PWM模式2),能够独立地设置每个OCi输出通道产生一路PWM。
必须设置TIM1_CCMRi寄存器的OCiPE位使能相应的预装载寄存器,也可以设置TIM1_CR1寄存器的ARPE位使能自动重装载的预装载寄存器(在向上计数模式或中央对称模式中)。
由于仅当发生一个更新事件的时候,预装载寄存器才能被传送到影子寄存器,因此在计数器开始计数之前,必须通过设置TIM1_EGR寄存器的UG位来初始化所有的寄存器。
OCi的极性可以通过软件在TIM1_CCERi寄存器中的CCiP位设置,它可以设置为高电平有效或低电平有效。
OCi的输出使能通过(TIM1_CCERi和TIM1_BKR寄存器中)CCiE、MOE、OISi和OSSR位和OSSI 位的组合来控制。
详见TIM1_CCERi寄存器的描述。
在PWM模式(模式1或模式2)下,TIM1_CNT和TIM1_CCRi始终在进行比较,(依据计数器的计数方向)以确定是否符合TIM1_CCRi≤TIM1_CNT或者TIM1_CNT≤TIM1_CCRi。
根据TIM1_CR1寄存器中CMS位域的状态,定时器能够产生边沿对齐的PWM信号或中央对齐的PWM 信号。
PWM边沿对齐模式向上计数配置当TIM1_CR1寄存器中的DIR位为低的时候执行向上计数。
下面是一个PWM模式1的例子。
当TIM1_CNT<TIM1_CCRi时,PWM参考信号OCiREF为高,否则为低。
如果TIM1_CCRi中的比较值大于自动重装载值(TIM1_ARR),则OCiREF保持为'1'。
如果比较值为0,则OCiREF保持为'0'。
基于STM8S207单片机的测试架系统设计
基于STM8S207单片机的测试架系统设计作者:王娟陈致水袁成宇王东劲来源:《现代电子技术》2012年第22期摘要:为了对电子行业中的PCB板电压进行测试,采用STM8S207单片机控制继电器的测试架,通过PC实时检测电压并显示。
通过单片机控制继电器对一些强电进行控制的实验,它可以控制5V和12V电压的输出和一定范围的交直流检测,并且可以通过485通信把检测的结果传送到PC机。
实验结果证明,该测试架具有可以用于对不同电路适时的控制,对一些新产品的PCB板测试,在测试过程中只要把对应的XH2连接好,就可直接在PC机上进行相应的测试,使用便捷,性能可靠。
关键词:STM80S207M单片机;测试架;PCB电压测试;实时检测中图分类号:TN191934;TP206 文献标识码:A 文章编号:1004373X(2012)220138050引言随着信息科学技术的发展,工业生产扩大和产品种类的增加,在科研与生产中,检测成为每一个电子产品必不可缺少的一个环节。
对测试的要求也越来越高,有时因为对一块电路板要同时测试好多功能,而无法同时检测而影响产品质量。
基于STM8S207单片机的强大功能,最高fCPU可达24MHz,基于哈佛结构并带有3级流水线扩展指令集,最高20MIPS@24 MHz[13]。
程序存储器:最多128KB FLASH,10千次擦写后在55℃环境下数据可保存20年;数据存储器:最多2KB真正的数据E2PROM[4];可达30万次擦写RAM:最多6KB。
时钟、复位和电源管理2.95~5.5V工作电压灵活的时钟控制,4个主时钟源,低功率晶体振荡器,外部时钟输入,用户可调整的内部16MHzRC,内部低功耗128 kHzRC,带有时钟监控的时钟安全保障系统,低功耗模式(等待、活跃停机、停机),外设的时钟可单独关闭,永远打开的低功耗上电和掉电复位[5]。
带有32个中断的嵌套终端控制器,6个外部中断向量,最多37个外部中断。
stm8s电动车方案
引言电动车正成为城市交通工具的热门选择之一。
通过使用嵌入式系统,可以实现对电动车的精确控制和监控。
在本文档中,将介绍基于STM8S单片机的电动车控制方案。
电动车控制系统概述电动车控制系统由多个部分组成,包括电机控制模块、电池管理模块、控制器、显示器等。
本方案主要关注电机控制模块的设计和实现。
硬件设计STM8S单片机选择选择适合电动车控制的STM8S单片机。
需要考虑单片机的性能、功耗、外设以及成本等方面。
为了满足电动车控制的需求,推荐选择性能较高的STM8S207系列单片机。
电机驱动电路设计电机驱动电路用于控制电机的转速和方向。
通常采用H桥电路来控制电机的正/反转和调速。
使用适合电动车需求的功率MOSFET来构建H桥电路,能够提供足够的驱动能力和效率。
传感器接口设计为了获取电动车的运行状态信息,需要连接适合的传感器到系统中。
例如,可以使用速度传感器来测量车轮转速,采用电流传感器来监测电机电流。
通过设计合适的传感器接口电路,可以将传感器的数据准确地传输给STM8S单片机。
电源供应设计电动车系统需要一个稳定可靠的电源供应。
可以通过电池组和相关电源管理电路来提供电源。
确保电源供应满足STM8S单片机和其他外设的工作电压要求,并采取必要的保护措施,如过流保护和电池过放保护。
软件设计控制算法设计电动车的控制算法是实现电机精确控制的关键。
可以采用闭环控制来实现对电机速度和方向的控制。
采用PID控制算法可以稳定地控制电机的转速,并通过适当的参数调整来满足不同的需求。
通信协议设计为了实现与其他模块的通信,如显示器或上位机,需要设计合适的通信协议。
可以选择UART、SPI或I2C等通信协议,并根据不同模块的通信需求进行设计和实现。
界面设计电动车控制系统需要一个用户界面,以便用户监控和操作电动车。
可以采用LCD显示屏或其他合适的显示设备来显示相关信息。
并通过按键或触摸屏等方式实现用户交互。
总结本文档介绍了基于STM8S单片机的电动车控制方案。
stm8控制电源的函数
STM8微控制器的电源控制通常是通过编程GPIO(通用输入/输出)引脚来实现的。
以下是一个简单的示例,说明如何使用STM8微控制器控制电源的开启和关闭。
首先,你需要知道你要控制的电源是通过哪个GPIO引脚连接的。
假设我们使用GPIO A的第0位(PA0)作为示例。
```c
#include "stm8s.h"
void Power_On() {
// 设置GPIO A的第0位为高电平(通常是电源开启)
GPIO_WriteBit(GPIOA, BIT0, ENABLE);
}
void Power_Off() {
// 设置GPIO A的第0位为低电平(通常是电源关闭)
GPIO_WriteBit(GPIOA, BIT0, DISABLE);
}
int main(void) {
// 初始化系统
SystemInit();
// 开启电源
Power_On();
// 这里是你的代码,例如启动某个模块等
// 关闭电源
Power_Off();
while (1) {
// 主循环,可以什么都不做,或者等待中断等
}
}
```
以上代码只是一个基本示例,具体的GPIO初始化(如果需要的话)和系统初始化步骤会根据具体的STM8微控制器型号和应用需求有所不同。
请参考你的微控制器数据手册和参考手册,以了解如何正确配置和使用GPIO引脚。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第十四章STM8S207 PWM 模块及其应用实例
上一节我们学习了定时器中的基本定时器编程,这一节学习定时器里面一个PWM模块。
当终于到了PWM 模块编程时,有些许怀念,怀念过去的一年之中的日以继夜相对的PWM。
忘了介绍我们的团队---风驰,也就是第六届飞思卡尔比赛中的一个队伍。
1、PWM 介绍
脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。
简单一点,就是对脉冲宽度的控制。
PWM 在实际应用很广,例如上面提到的飞思卡尔智能车就用到PWM 控制舵机以及电机。
关于舵机是如何用PWM 控制的,这里不详细说明,有兴趣的建议查询相关知识。
这些在模型制作中应用十分广泛。
关于PWM 如果控制电机的这里略为说明,因为和本节有些许关联
普通直接电机在通电时以全电压工作,在没有PWM 控制电机之前是运用继电器通过不停开断实现对电机的速度控制。
引入PWM 就可以更为灵活控制电机。
PWM 是脉冲宽度可调的方波,在10K 左右的频率下,通过不同的占空比就可以得到近似稳定的电压。
例如输入5V,占空比为50%时,电压近似 2.5V。
我们这节实验也是应用PWM 这个特性。
利用PWM 中的占空比调节LED 的亮度。
关于PWM 的说明这里也简要说明,PWM 第一个参数是PWM 的周期,也就是一个PWM 的时间。
这个可以通过对应的寄存器进行设置,而我们的STM8S207 通过PSCR 设置定时器的时钟源CK_CNT,然后再通过ARR 寄存器设置周期。
例如我们这节的实验使用了16M 内部时钟源,LED4 是接着PD3 的,也就是TIM2_CH2,PSCR只能是2 的次幂,我们选择了4 分频。
CK_CNT = 4M,然后ARR 设置为200,分频200 后直接提供PWM 的时钟,所以f_pwm = 4M/200 = 20KHz。
20KHz 也是我们小车的频率啊,怀念!
第二个参数是占空比,例如30%,就是一个占30%,空70%,也可以在STM8S里面的解析为30%为无效电平,70%为有限电平。
所以这样在20KHz 的周期中高电平占了70%,30%为低电平。
当然这里只是举例说明,这些并非固定。
因为有效电平是可以程序设置的。
不同的单片机可以设置的参数也不尽相同。
例如之前使用的S12 单片机还有对齐方式等等功能设置。
2、PWM 寄存器设置
STM8S207 的PWM 功能是高级定时器或者通用定时器的一个附加功能,这和MC9S12XS128 的有些区别,但是唯一的不同是STM8S207 的PWM 会占用相应的定时器功能,两者是对立的,不能同时使用。
这里使用了除定时器章节中所使用的寄存器外,还添加了
捕获/比较模式寄存器TIMx_CCMRx
捕获/比较使能寄存器TIMx_CCERx
捕获/比较寄存器TIMx_CCRx
2.1 捕获/比较模式寄存器TIMx_CCMR2
因为这里使用的是TIM2_CH2 作为输出,所以介绍TIM2_CCMR2,其它的类似设置,详细内容请见STM8S 微控制器参考手册。
通道可用于输入(捕捉模式)或输出(比较模式),通道的方向由对应的CC2S定义。
该寄存器其它为的作用在输入和输出模式不同。
OCxx 描述了通道在输出模式下的功能,ICxx
描述了通道在输入模式下的功能。
因此必须注意,同一位在输出和输入模式下功能是不同的。
这里我们主要说明输出模式,也就是PWM 模式。
输出模式为:
OC2M:输出比较2 通道模式
000:冻结
001:匹配时设置通道2 为有效电平
010:匹配时设置通道2 为无效电平
011:翻转。
100:强制为无效电平
101:强制为有效电平
110:PWM 模式1。
向上计数时,一旦TIMx_CNT < TIMx_CCR1 时通道2 为有效电平,否则无效
向下计数时,一旦TIMx_CNT <=TIMx_CCR1 时通道2 有无效电平,否则有效111:PWM 模式2.
向上计数时,一旦TIMx_CNT < TIMx_CCR1 时通道2 为无效电平,否则有效
向下计数时,一旦TIMx_CNT <=TIMx_CCR1 时通道2 有有效电平,否则无效OC2PE:输出比较2 预装载使能,PWM 模式下一定要使能
0:禁止预装载使能,可随时写入TIMx_CCR2 寄存器,并且新写入的数据立即生效1:开启预装载使能,读写操作仅对预装载寄存器操作。
CC2S:捕获/比较2 选择。
这里定义了通道的方向,及输入脚的选择
00:CC2 通道配配置为输出
01:CC2 通道被配置为输入,IC2 映射在TI2FP2 上
10:CC2 通道被配置为输入,IC2 映射在TI1FP2 上
11:保留
配置为输人模式时
IC2F:输入捕获2 滤波器。
设置了采用频率以及数字滤波长度,详细请见数据手册IC2PSC:输入捕获2 预分频器。
定义了输入捕获的分频系数
CC2S:和输出模式一样,不再详细介绍。
2.2 捕获/比较使能寄存器TIMx_CCERx
这里只以TIM2 为例,如下:
CC2P:输入/输出通道2 输出极性
CC2 通道配置为输出时:
0:OC2 高电平有效
1:OC2 低电平有效
CC2 通道配置为输入时:
0:捕获发生在上升沿
1:捕获发生在下降沿
CC2E:输入/输出使能
CC2 通道配置为输出时:
0:关闭
1:开启
CC2 通道配置输入时:
0:禁止
1:使能
CC1P:与CC2P 对应
CC1E:与CC2E 对应
2.3 捕获比较寄存器
在输出模式下,该寄存器的值与CNT 的值比较,根据比较结果产生相应动作。
利用这点,我们通过修改这个寄存器的值,就可以控制PWM 的输出脉宽了。
#include "iostm8s207rb.h"
void CLK_Init(void);
void TIM2_PWM2_Init(void);
void delay_ms(int value);
main()
{
unsigned char i;
CLK_Init(); // 初始化时钟
TIM2_PWM2_Init(); // 初始化定时器的PWM功能
while(1) // 进入无限循环
{
// 下面的循环将占空比逐渐从0递增到50%
for(i=0;i<100;i++)
{
TIM2_CCR2H = 0;
TIM2_CCR2L = i;
delay_ms(10);
}
// 下面的循环将占空比逐渐从50%递减到0
for(i=100;i>0;i--)
{
TIM2_CCR2H = 0;
TIM2_CCR2L = i;
delay_ms(10);
}
}
}
// 函数功能:初始化定时器2的通道2,用于控制LED的亮度
void TIM2_PWM2_Init()
{
TIM2_CCMR2 = TIM2_CCMR2 | 0x70;// Output mode PWM2.
// 通道2被设置成比较输出方式
// OC2M = 111,为PWM模式2,
// 向上计数时,若计数器小于比较值,为无效电平
// 即当计数器在0到比较值时,输出为1,否则为0
TIM2_CCER1 = TIM2_CCER1 | 0x10;// CC polarity low,enable PWM output
// CC2P = 0,高电平为有效电平
// CC2E = 1,开启输出引脚
//初始化自动装载寄存器,决定PWM方波的频率,Fpwm=4000000/200=20KHZ TIM2_ARRH = 0;
TIM2_ARRL = 0xC8; //200
//初始化比较寄存器,决定PWM方波的占空比
TIM2_CCR2H = 0;
TIM2_CCR2L = 0;
// 初始化时钟分频器为4,即计数器的时钟频率为Fmaster=16MHZ,CK_CNT = 4M TIM2_PSCR = 2;
// 启动计数
TIM2_CR1 = TIM2_CR1 | 0x01;
}
void CLK_Init()
{
CLK_CKDIVR = 0x00; //16M主频
}
/*
********************************************
简单延时程序
******************************************** */
void delay_ms(int value)
{
int i,j;
if(value < 1)
value = 1;
for(i=0;i!=value;++i)
for(j=0;j!=5000;++j);
}。