您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > stm8s的c语言编程例程应用
实例一:控制灯的亮灭(或者蜂鸣器响,只要连接相应端口就可以了):#includestm8s.h//头文件#defineulongunsignedlong///////////////////////////////////////////////////////////////////////////////voiddelay(ulongi){ulongj;for(j=0;ji;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时钟源,#includestm8s.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);}例题三:灯闪亮的同时蜂鸣器响#includestm8s.h//头文件#defineulongunsignedlong///////////////////////////////////////////////////////////////////////////////voiddelay(ulongi){ulongj;for(j=0;ji;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条件下安全启动。时钟设置的目的到底是什么?时钟设置肯定会出现中断?貌似是这样的:运用合适的时钟配置可以使得功耗降低,有时候计数频率很大,需要很大的计数或者怎么样时,需要使用其他的时钟,即非默认的时钟!暂且这样解释!例题四:利用中断按键控制灯的亮灭。#includestm8s.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分频,即上电默认的频率。中断设置为上升沿触发:则程序会有微小的变化:#includestm8s.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~
本文标题:stm8s的c语言编程例程应用
链接地址:https://www.777doc.com/doc-2860989 .html