《stm8s的c语言编程例程.doc》由会员分享,可在线阅读,更多相关《stm8s的c语言编程例程.doc(26页珍藏版)》请在金锄头文库上搜索。
1、实例一:控制灯的亮灭(或者蜂鸣器响,只要连接相应端口就可以了):#include stm8s.h/头文件#define ulong unsigned long/void delay(ulong i) ulong j; for(j=0;ji;j+) ; /延时函数void main(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);
2、delay(10000); GPIO_WriteLow(GPIOD, GPIO_PIN_1); delay(10000); delay(10000); delay(10000); 第二步:控制灯按照一定的频率闪烁:频率可以使用时钟!Stm8启动时,主时钟默认为HSIRC时钟的8分频,HSIRC是可以提供一个低成本的16MHz时钟源,#include stm8s.h/头文件void CLK_Configuration(void);void main(void)/主函数 GPIO_DeInit(GPIOD); GPIO_Init(GPIOD, GPIO_PIN_1, GPIO_MODE_OUT_P
3、P_LOW_FAST); CLK_Configuration(); while(1) GPIO_WriteReverse(GPIOD, GPIO_PIN_1); void CLK_Configuration(void) /* Fmaster = 16MHz */ CLK_HSIPrescalerConfig( CLK_PRESCALER_HISDIV1);例题三:灯闪亮的同时蜂鸣器响#include stm8s.h/头文件#define ulong unsigned long/void delay(ulong i) ulong j; for(j=0;ji;j+) ; /延时函数);void m
4、ain(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)
5、; GPIO_WriteHigh(GPIOB, GPIO_PIN_0); delay(10000); delay(10000); GPIO_WriteLow(GPIOB, GPIO_PIN_0); delay(10000); delay(10000); 时钟控制器功能强大而且灵活易用。其目的在于使用用户在获得最好性能的同时,亦能保证消耗的功率最低。用户可以独立管理各个时钟源,并将它们分配到CPU或者各个外设。主时钟和CPU的时钟均带有分频器。主时钟源:四种时钟源可以作为主时钟源:1.124MHz高速外部晶体振荡器(HSE)2.最大24MHz高速外部时钟信号(HSE user-ext)3.16M
6、Hz高速内部RC振荡器(HSI)4.128KHz低速内部RC(LSI)各个时钟源可独立打开或者关闭,从而优化功耗。HSE:高速外部时钟信号,由两个时钟源产生:HSE外部晶体/陶瓷谐振器;HSE用户外部有源时钟。(为了最大限度的减少输出失真和减少启动失真的稳定时间,谐振器和负载电容应尽可能的靠近谐振器引脚。负载电容值应根据所选的谐振器进行调整。)外部1至24MHz的振荡器其优点在于能够产生精确的占空比为50%的主时钟信号。 为使系统快速启动,复位后时钟控制器自动使用HSI的8分频(HSI/8)做为主时钟。其原因为HSI的稳定时间短,而8分频可保证系统在较差的VDD条件下安全启动。 时钟设置的目的
7、到底是什么?时钟设置肯定会出现中断?貌似是这样的:运用合适的时钟配置可以使得功耗降低,有时候计数频率很大,需要很大的计数或者怎么样时,需要使用其他的时钟,即非默认的时钟!暂且这样解释!例题四:利用中断按键控制灯的亮灭。#include stm8s.h/头文件void main(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
8、_DeInit(); EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOB , EXTI_SENSITIVITY_FALL_ONLY );/定义端口的外部中断 enableInterrupts();/这个一定不能丢,中断使能 while(1) #pragma vector=6/中断编号+2_interrupt void EXIT_PORTB_IRQHander(void) if(GPIO_ReadInputData(GPIOB)&GPIO_PIN_0)=0x00)/检查是否按下GPIO_WriteReverse(GPIOD,GPIO_PIN_1);/默认的时钟为H
9、SI的8分频,即上电默认的频率。中断设置为上升沿触发:则程序会有微小的变化:#include stm8s.h/头文件void main(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_
10、RISE_ONLY );/定义端口的外部中断 enableInterrupts();/这个一定不能丢,中断使能 while(1) #pragma vector=6/中断编号+2_interrupt void EXIT_PORTB_IRQHander(void) if(GPIO_ReadInputData(GPIOB)&GPIO_PIN_0)=0x01)/检查是否按下GPIO_WriteReverse(GPIOD,GPIO_PIN_1);时钟这里到底是怎么回事啊?LSI等如何配置,配置时钟做什么用的?例题五:设计一个程序使得当按键按下后发光二极管按照不同的频率闪烁。分析:不同的频率闪烁,可以设置
11、为按照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,
12、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的任意次幂。预分频器的值是通过一个预装载寄存器来载
13、入的。一旦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