stm8s的c语言编程例程.docx

上传人:b****2 文档编号:1439800 上传时间:2023-05-01 格式:DOCX 页数:38 大小:27.16KB
下载 相关 举报
stm8s的c语言编程例程.docx_第1页
第1页 / 共38页
stm8s的c语言编程例程.docx_第2页
第2页 / 共38页
stm8s的c语言编程例程.docx_第3页
第3页 / 共38页
stm8s的c语言编程例程.docx_第4页
第4页 / 共38页
stm8s的c语言编程例程.docx_第5页
第5页 / 共38页
stm8s的c语言编程例程.docx_第6页
第6页 / 共38页
stm8s的c语言编程例程.docx_第7页
第7页 / 共38页
stm8s的c语言编程例程.docx_第8页
第8页 / 共38页
stm8s的c语言编程例程.docx_第9页
第9页 / 共38页
stm8s的c语言编程例程.docx_第10页
第10页 / 共38页
stm8s的c语言编程例程.docx_第11页
第11页 / 共38页
stm8s的c语言编程例程.docx_第12页
第12页 / 共38页
stm8s的c语言编程例程.docx_第13页
第13页 / 共38页
stm8s的c语言编程例程.docx_第14页
第14页 / 共38页
stm8s的c语言编程例程.docx_第15页
第15页 / 共38页
stm8s的c语言编程例程.docx_第16页
第16页 / 共38页
stm8s的c语言编程例程.docx_第17页
第17页 / 共38页
stm8s的c语言编程例程.docx_第18页
第18页 / 共38页
stm8s的c语言编程例程.docx_第19页
第19页 / 共38页
stm8s的c语言编程例程.docx_第20页
第20页 / 共38页
亲,该文档总共38页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

stm8s的c语言编程例程.docx

《stm8s的c语言编程例程.docx》由会员分享,可在线阅读,更多相关《stm8s的c语言编程例程.docx(38页珍藏版)》请在冰点文库上搜索。

stm8s的c语言编程例程.docx

stm8s的c语言编程例程

实例一:

控制灯的亮灭(或者蜂鸣器响,只要连接相应端口就可以了):

#include"stm8s.h"//头文件

#defineulongunsignedlong

///////////////////////////////////////////////////////////////////////////////

voiddelay(ulongi)

{ulongj;

for(j=0;j

{;}

}////////////延时函数

voidmain(void)////////////主函数

{

GPIO_DeInit(GPIOD);

GPIO_Init(GPIOD,GPIO_PIN_1,GPIO_MODE_OUT_PP_LOW_FAST);

while

(1)

{

GPIO_WriteHigh(GPIOD,GPIO_PIN_1);

delay(10000);

delay(10000);

delay(10000);

GPIO_WriteLow(GPIOD,GPIO_PIN_1);

delay(10000);

delay(10000);

delay(10000);

}

}

第二步:

控制灯按照一定的频率闪烁:

频率可以使用时钟!

Stm8启动时,主时钟默认为HSIRC时钟的8分频,HSIRC是可以提供一个低成本的16MHz时钟源,

#include"stm8s.h"//头文件

voidCLK_Configuration(void);

voidmain(void)////////////主函数

{

GPIO_DeInit(GPIOD);

GPIO_Init(GPIOD,GPIO_PIN_1,GPIO_MODE_OUT_PP_LOW_FAST);

CLK_Configuration();

while

(1)

{

GPIO_WriteReverse(GPIOD,GPIO_PIN_1);

}

}

voidCLK_Configuration(void)

{

/*Fmaster=16MHz*/

CLK_HSIPrescalerConfig(CLK_PRESCALER_HISDIV1);

}

例题三:

灯闪亮的同时蜂鸣器响

#include"stm8s.h"//头文件

#defineulongunsignedlong

///////////////////////////////////////////////////////////////////////////////

voiddelay(ulongi)

{ulongj;

for(j=0;j

{;}

}////////////延时函数);

voidmain(void)////////////主函数

{

GPIO_DeInit(GPIOD);

GPIO_DeInit(GPIOB);

GPIO_Init(GPIOD,GPIO_PIN_1,GPIO_MODE_OUT_PP_LOW_FAST);

GPIO_Init(GPIOB,GPIO_PIN_0,GPIO_MODE_OUT_PP_LOW_FAST);

while

(1)

{

GPIO_WriteHigh(GPIOD,GPIO_PIN_1);

delay(10000);

delay(10000);

GPIO_WriteLow(GPIOD,GPIO_PIN_1);

delay(10000);

delay(10000);

GPIO_WriteHigh(GPIOB,GPIO_PIN_0);

delay(10000);

delay(10000);

GPIO_WriteLow(GPIOB,GPIO_PIN_0);

delay(10000);

delay(10000);

}

}

时钟控制器功能强大而且灵活易用。

其目的在于使用用户在获得最好性能的同时,亦能保证消耗的功率最低。

用户可以独立管理各个时钟源,并将它们分配到CPU或者各个外设。

主时钟和CPU的时钟均带有分频器。

主时钟源:

四种时钟源可以作为主时钟源:

1.1—24MHz高速外部晶体振荡器(HSE)

2.最大24MHz高速外部时钟信号(HSEuser-ext)

3.16MHz高速部RC振荡器(HSI)

4.128KHz低速部RC(LSI)

各个时钟源可独立打开或者关闭,从而优化功耗。

HSE:

高速外部时钟信号,由两个时钟源产生:

HSE外部晶体/瓷谐振器;HSE用户外部有源时钟。

(为了最大限度的减少输出失真和减少启动失真的稳定时间,谐振器和负载电容应尽可能的靠近谐振器引脚。

负载电容值应根据所选的谐振器进行调整。

外部1至24MHz的振荡器其优点在于能够产生精确的占空比为50%的主时钟信号。

为使系统快速启动,复位后时钟控制器自动使用HSI的8分频(HSI/8)做为主时钟。

其原因为HSI的稳定时间短,而8分频可保证系统在较差的VDD条件下安全启动。

时钟设置的目的到底是什么?

时钟设置肯定会出现中断?

貌似是这样的:

运用合适的时钟配置可以使得功耗降低,有时候计数频率很大,需要很大的计数或者怎么样时,需要使用其他的时钟,即非默认的时钟!

暂且这样解释!

例题四:

利用中断

按键控制灯的亮灭。

#include"stm8s.h"//头文件

voidmain(void)////////////主函数

{

GPIO_DeInit(GPIOD);

GPIO_DeInit(GPIOB);

GPIO_Init(GPIOD,GPIO_PIN_1,GPIO_MODE_OUT_PP_LOW_FAST);

GPIO_Init(GPIOB,GPIO_PIN_0,GPIO_MODE_IN_FL_IT);

EXTI_DeInit();

EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOB,EXTI_SENSITIVITY_FALL_ONLY);///////定义端口的外部中断

enableInterrupts();//////////////////这个一定不能丢,中断使能

while

(1)

{

}

}

#pragmavector=6//中断编号+2

__interruptvoidEXIT_PORTB_IRQHander(void)

{

if((GPIO_ReadInputData(GPIOB)&GPIO_PIN_0)==0x00)/////检查是否按下

{

GPIO_WriteReverse(GPIOD,GPIO_PIN_1);

}

}

//////默认的时钟为HSI的8分频,即上电默认的频率。

中断设置为上升沿触发:

则程序会有微小的变化:

#include"stm8s.h"//头文件

voidmain(void)////////////主函数

{

GPIO_DeInit(GPIOD);

GPIO_DeInit(GPIOB);

GPIO_Init(GPIOD,GPIO_PIN_1,GPIO_MODE_OUT_PP_LOW_FAST);

GPIO_Init(GPIOB,GPIO_PIN_0,GPIO_MODE_IN_FL_IT);

EXTI_DeInit();

EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOB,EXTI_SENSITIVITY_RISE_ONLY);///////定义端口的外部中断

enableInterrupts();//////////////////这个一定不能丢,中断使能

while

(1)

{

}

}

#pragmavector=6//中断编号+2

__interruptvoidEXIT_PORTB_IRQHander(void)

{

if((GPIO_ReadInputData(GPIOB)&GPIO_PIN_0)==0x01)/////检查是否按下

{

GPIO_WriteReverse(GPIOD,GPIO_PIN_1);

}

}

时钟这里到底是怎么回事啊?

LSI等如何配置,配置时钟做什么用的?

例题五:

设计一个程序使得当按键按下后发光二极管按照不同的频率闪烁。

分析:

不同的频率闪烁,可以设置为按照100,500,1000,2000Hz的频率闪烁。

定时器timer4的使用:

该定时器由一个带可编程预分频器的8位可位自动重载的向上计数器所组成,它可以用来做时基发生器,具有溢出中断功能。

Timer6同时钟/触发信号控制器一起用于定时器同步和级联。

Time4的主要功能包括:

1.8位向上计数的自动重载计数器(既然是向上计数,那么计算初值时?

2.3位可编程的与分配器(可在运行中修改),提供1,2,4,8,16,32,64,和128这8种分频比例。

3.中断产生

——在计数器更新时:

计数器溢出。

Timer6的主要功能:

1.8位向上计数的自动重载计数器

2.3位可编程的与分配器(可在运行中修改),提供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位的计数器。

由于该控制寄存器是带缓冲的所以它可以在系统运行中被改变。

可以分频计速器的时钟频率为1到128之间的2的任意次幂。

预分频器的值是通过一个预装载寄存器来载入的。

一旦LS字节被写入时,保存当前要被使用值影子寄存器的值就被立即载入。

对TIMX_PSCR寄存器的读操作是访问预装载寄存器,因此在读的过程中没有什么特别要注意的地方。

中断使能寄存器:

TIMx_IER

位7:

保留,须保持清零

位6:

TIE:

触发中断使能:

0:

触发中断禁止;1:

触发中断使能;

位5:

1保留,须保持清零

位0:

UIE:

更新中断使能:

0:

更新中断禁止;1:

更新中断使能

状态寄存器1(TIMX_SR1)

位7:

保留,须保持清零

位6:

TIF:

触发中断标志位(此位在触发事件发生时(检测到TRGI信号的有效沿,在选择门控模式时硬件置位。

可以由软件清零。

)0:

无触发事件产生;1:

触发事件发生,此位当寄存器更新时由硬件置位(在timer4中该位保留)

位5:

1保留,须保持清零

位0:

UIF:

更新中断标志(此位在更新事件发生时由硬件置位。

可以由软件清零)

0:

无更新事件产生;1:

跟新事件发生。

此位当寄存器更新时由硬件置位。

1.如果TIM4_CR1中的UDIS=0,则发生在计数器溢出时。

2.如果TIM4_CR1中的UDIS=0和URS=0,则发生在通过设置TIM4_EGR的UG位产生软件重新初始化计数时。

时间产生寄存器(TIM4_EGR)

位7:

保留,须保持清零

位0:

TG:

触发事件产生:

可用软件对该位置位以产生一个触发事件。

该位由硬件自动清零。

0:

无触发发生;1:

TIM4_SR1中TIF标志被置1.如果TIE位为1则产生中断。

(注意:

在TIM4中该位保留)

位5:

1保留,须保持清零

位0:

UG更新事件产生0:

无更新事件产生;1:

计数器重新初始化并产生寄存器更新。

(注意:

分频计数器也同时清零)

计数器(TIMX_CNTR)

位7:

0计数器值

预分频寄存器(TIMX_PSCR)

位7:

3保留,须保持清零

位2:

0PSC分频器值分频器的值除分频时钟CLK_PSC

计数器时钟频率:

PSC中包含了每次更新事件(包含当通过TIM4_EGR寄存器的UG产生的更新事件)需要加载到实际分频寄存器的值。

这就意味着为了使新的分频器值启用,必须产生一个更新事件。

自动重装载寄存器(TIMX_ARR)

位7:

0自动重装载的值

 

一、16位通用定时器(TIM2,TIM3,TIM5)

1.通用定时器TIM2有3个通道,TIM3有2个通道,TIM5与TIM2类似但是带有两个额外的寄存器,用于定时器的同步和级联。

通用寄存器由带有可编程预分频器的16位自动装载计数器构成。

2.适合的场合:

基本的定时;测量输入信号的脉冲长度(输入捕获);产生输出波形(输出比较,PWM和单脉冲);与其他定时器或者外部信号同步(外部时钟,复位,触发和使能信号)(仅针对带有TIM5的芯片)

定时器可由部时钟驱动。

3.TIM2和TIM3的主要功能:

16位向上计数和自动装载计数器;

4位可编程预分频器,计数器时钟频率的分频系数为1~32768之间2的幂

3个独立通道:

输入捕获,输出比较,PWM生成(边缘对齐模式),单脉冲模式输出

如下事件发生时产生中断:

更新:

计数器向上溢出,计数器初始化(通过软件);

输入捕获;

输出比较;

4.TIM5的主要功能:

16位向上计数和自动装载计数器;

4位可编程预分频器,计数器时钟频率的分频系数值为1~32768之间2的幂;

3个独立通道:

输入捕获;

输出比较;

PWM生成(边缘对齐模式);

但脉冲模式输出;

如下事件发生时产生中断:

更新:

计数器向上溢出,计数器初始化(通过软件)

输入捕获;

输出比较;

5.时基单元包含:

16位向上计数器;预分频器;16位自动装载寄存器

没有重复寄存器。

计数器使用部时钟Fmaster,它由CK_PSC提供,并经过预分频器分频产生计数器时钟CK_CNT。

预分频器的实现:

预分频器基于4位寄存器的16位计数器,由于寄存器带有缓冲器所有可以随时修改预分频的数值。

计数器可以取值为1到32768质检单饿2的幂进行分频。

计数器时钟频率的计算公式:

fCK_CNT=fCK_PSC/2(PSCR[3:

0])]

预分频器的值由预装载寄存器写入。

一旦写入预装载寄存器的LS字节时,带有当前使用值的影子寄存器就被写入了新的值。

新的预分频值在下一个周期时生效(在下一个更新事件之后)。

对TIMX_PSCR寄存器的读操作通过预装载寄存器实现,因此可以随时读取而不受限制。

5.计数器的操作

时钟/触发控制器(这个以及相应的TIMX_CR2和TIMX_SMCR寄存器仅仅存在于TIM5中)

捕获/比较通道:

输入部分:

定时器有两个输入通道,通道1在部到比较器。

6.中断:

通用定时器包括4个中断源:

捕获/比较3中断;捕获/比较2中断;捕获/比较1中断;更新中断

使用中断功能时,需要先设置TIMX_IER寄存器的CC3IE位或CC2IE或者CC1IE位使能中断请求。

通过软件设置TIMX_EGR寄存器的相应位也能产生不同的中断源。

7.TIM2,3,5寄存器

控制寄存器1(TIMX_CR1)

位7ARPE自动重装载允许位0:

TIMX_ARR寄存器没有预装载寄存器可以缓冲;可以直接对其进行写操作;1:

TIMX_ARR寄存器通过预装载寄存器可以缓冲。

位3OPM单脉冲模式0:

在发生更新事件时,计数器不停止;1:

当发生下一次更新事件时(清除CNE),计数器停止;

位2URS更新请求源0:

当更新请求源使能时,只要寄存器被更新了就产生更新中断;1当更新请求使能时,只有计数器溢出才产生更新中断。

位1UDIS禁止更新软件通过该位允许或者禁止UEV事件的产生

0:

只要计数器溢出,或者产生了软件更新,或者通过时钟/触发模式控制器产生了硬件复位,就产生更新事件。

1:

不产生更新事件,影子寄存器(ARR,PSC,CRRX)保持它们的值,如果设置了UG则计数器和预分频器被重新初始化。

位0CEN使能计数器0:

禁止计数器1:

使能计数器

8.控制寄存器2(TIM5_CR2)

该寄存器只有TIM5中才有。

触发从模式控制寄存器(TIM5_SMCR)

中断使能寄存器(TIMX_IER)

位7TIE触发中断使能0:

触发中断禁用1:

触发中断使能

位5:

4保留

位3CC3IE允许捕获/比较3中断0:

禁止捕获/比较3中断;1:

允许捕获/比较3中断

位2CC2IE允许捕获/比较2中断0:

禁止捕获/比较2中断;1:

允许捕获/比较2中断

位1CC1IE允许捕获/比较1中断0:

禁止捕获/比较1中断;1:

允许捕获/比较1中断

位0UIE允许更新中断0:

禁止更新中断;1:

允许更新中断;

状态寄存器1(TIMX_SR1)

位7保留

位6TIF触发中断标志当发生触发事件时该位由硬件设置置1(在TRGI信号上检测到有效的触发沿,当选择门控模式时,上升及下降沿都有效)。

它由软件清0.

0:

没有触发事件发生;1:

触发中断悬挂注意在TIM2和TIM3中该位保留。

位5:

4保留

位3CC3IF捕获/比较3中断标志

位2CC2IF捕获/比较2中断标志

位1CC1IF捕获/比较1中断标志

如果通道CC1配置位输出模式,当计数器值与比较值匹配时该位由硬件置1,由软件清零。

0:

无匹配发生;

1:

TIMX_CNT的值与TIMX_CCR1的值匹配

如果通道CC1配置位输入模式,它由软件清零或通过读TIMX_CCR1L清零

0:

无输入捕获产生;

1:

计数器值已被捕获(拷贝)到TIMX_CCR1(在IC1上检测到所选极性相同的边沿)。

位0UIF更新中断标志

当产生更新事件该位由硬件置1,软件清零。

0:

无更新事件发生;

1:

更新事件等待响应。

当寄存器更新时该位由硬件置1;

——若TIMX_CR1寄存器的UDIS=0.计数器溢出;

——若TIMX_CR1寄存器的UDIS=0,URS=0,当TIMX_EGR寄存器的UG=1时产生更新事件(软件对计数器CNT重新初始化)

状态寄存器2(TIMX_SR2)

位7:

4保留

位3CC3OF捕获/比较3过捕获标志

位2CC2OF捕获/比较2过捕获标志

位1CC1OF捕获/比较1过捕获标志

只有当对应通道设置为输入捕获模式下,才会被硬件置位;软件写0清除该位。

0:

没有检测到过捕获;

1:

CC1IF标志已经置位的情况下,计数器的值又被捕获到TIMX_CCR1寄存器中。

位0保留硬件强制为0

事件发生寄存器(TIMX_EGR)

位7保留

位6TG产生触发事件该位由软件置1,用于产生一个触发事件,由硬件自动清0

0:

无动作;

1:

TIMX_SR1的TIF标志被置1.如果TIE为1则产生一个中断。

注意在TIM2和TIM3中,该位保留

位5:

4保留

位3CC3G产生捕获/比较3事件

位2CC2G产生捕获/比较2事件

位1CC1G产生捕获/比较1事件该位由软件置1,用于产生一个捕获/比较事件,由硬件自动清零。

0:

无动作;

1:

在通道CC1上产生一个捕获/比较事件

若通道CC1设置位输出:

设置CC1IF=1,若开启对应的中断,则产生相应的中断。

若通道CC1配置位输入:

当前的计数器值捕获至TIMX_CCR1寄存器,设置CC1IF=1,若开启对应的中断,则产生相应的中断。

若CC1IF已经为1,则设置CC1OF=1.

位0UG产生更新事件该位由软件置1,由硬件自动清零

0:

无动作;

1:

重新初始化计数器,并产生一个更新事件。

注意预分频器的计数器也被清零。

 

计数器高位(TIMX_CNTRH)

位7:

0CNT计数器的值(MSB)

计数器低位(TIMX_CNTRL)

位7:

0CNT计数器的值(LSB)

预分频器(TIMX_PSCR)

位7:

4保留

位3:

0PSC预分频器的值预分频器对输入的CK_PSC时钟进行分频计数器的时钟频率Fck_cnt等于Fck_psc/2的(PSC[3:

0]).PSC[7:

4]由硬件清零。

PSC包含了当更新事件产生时装入当前预分频器的值(包括由于清除TIMX_EGR寄存器的UG位产生的计数器清除事件)。

这意味着如要新的预分频值生效,必须产生更新事件。

自动装载寄存器高位(TIMX_ARRH)

位7:

0ARR自动装载值(MSB)

ARR是自动装载的值,挡自动装载的值为0时,计数器不工作。

自动装载寄存器低位(TIMX_ARRL)

位7:

0ARR自动装载值(LSB)

 

例题:

利用定时器定时使得灯闪亮,按键按下就停止闪亮,再次按下,又闪亮:

#include"stm8s.h"

#defineucharunsignedchar

#defineuintunsignedint

#defineulongunsignedlong

unsignedinttemp;

voiddelay(ulongi)

{

ulongj;

for(j=0;j

{;}

}

voidCLK_Configuration(void);

voidGPIO_Configuration(void);

voidTIM2_Configuration(void);

voidEXIT_Configuration(void);

voidmain(void)

{

CLK_Configuration();

GPIO_Configuration();

EXIT_Configuration();

TIM2_Configuration();

enableInterrupts();

while

(1)

{

}

}

voidCLK_Configuration(void)

{

/*Fmaster=16MHz*/

CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);

}

voidGPIO_Configuration(void)

{

/*GPIODreset*/

GPIO_DeInit(GPIOB);

GPIO_DeInit(GPIOD);

/*ConfigurePD1(LED1)asoutputpush-pulllow(ledswitchedon)10MHZ*/

GPIO_Init(GPIOD,GPIO_PIN_2,GPIO_MODE_OUT_PP_LOW_FAST);

GPIO_Init(GPIOB,GPIO_PIN_1,GPIO_MODE_IN_FL_IT);

}

voidTIM2_Configuration(void)

{

TIM2_DeInit();///设置timer2定时器

TIM2_TimeBaseInit(TIM2_PRESCALER_2048,8000);/*对TIM2时钟进行预分频得到计数时钟*/

TIM2_ITConfig(TIM2_IT_UPDATE,ENABLE);/*允许更新中断使能*/

//TIM2_GenerateEvent(TIM2_EVENTSOURCE_UPDATE);/*设置事件源为更新事件*/

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 法律文书 > 调解书

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2