历史上的今天
返回首页

历史上的今天

今天是:2024年09月30日(星期一)

正在发生

2021年09月30日 | stm8s 定时器1 延时_STM8S_库函数_定时器自动装载TIM1

2021-09-30 来源:eefocus

这里说下使用库函数方式控制STM8S103F3P6片上的定时器1,也就是TIM1,这是个高级定时器。


首先,咱们看一下STM8S103F3P6上有几个定时器,打开数据手册,可以看到如下内容:

791755fc4d3b1fbe0436548ce10e615b.png?imageView2/2/w/550

可以看到,咱们使用的单片机,有三个定时器:TIM1、TIM2、TIM4。而TIM1是一个高级控制定时器。具体有多高级,咱们看下介绍。由于内容比较多,我这里直接放数据手册里的截图:

400fe7582ed0464aab03025336c9acf1.png?imageView2/2/w/550

1e2cd262f2e79eb0f4dc369efc60585d.png?imageView2/2/w/550

可以看到,TIM1的功能是非常丰富的,从基本的定时、自动装载、PWM输出、输入捕获、输出比较、单脉冲输出到各种事件的中断,都有相应的功能。


稍后的几节内容,会依次展示三个例程:


1、自动装载计时


2、测量输入信号的脉冲宽度


3、输出PWM


这一节主要说自动装载计时。 接下来,通过代码实现一个功能:


1秒的一个定时,时间到了以后,板上的LED闪烁,用到的功能:分频,向上计数,自动重装载,重复计数器。代码如下,首先看主函数:


/* Includes ------------------------------------------------------------------*/


#include "stm8s.h"


#include "timer1_config.h"


/* Private defines -----------------------------------------------------------*/


/* Private function prototypes -----------------------------------------------*/


/* Private functions ---------------------------------------------------------*/


void main(void)


{

GPIO_Init(GPIOB, GPIO_PIN_4, GPIO_MODE_OUT_PP_HIGH_SLOW);


timer1_init();


while (1);


}


主函数里进行两个操作:PB4初始化、TIM1初始化。PB4不用说了,外接一个LED,低电平点亮,前面的内容里说过了。


TIM1初始化的代码我们看下:


/***************************************


* TIMER1初始化


* 1秒一次中断


***************************************/


void timer1_init(void)


{

disableInterrupts();


TIM1_DeInit();


TIM1_TimeBaseInit(0x0063, TIM1_COUNTERMODE_UP, 0x03e8, 0x13);


TIM1_Cmd(ENABLE);


TIM1_ITConfig(TIM1_IT_UPDATE, ENABLE);


enableInterrupts();


}


由于库函数的命名比较规范,所以可以从函数名字猜出每个函数的功能:


1、关闭全局中断


2、TIM1寄存器恢复默认设置


3、TIM1时基初始化,这个函数的具体内容下面说


4、TIM1使能,也就是开始计数


5、TIM1的向上计数溢出中断使能


6、全局中断使能


这里面相对复杂的是第三步,我们详细看下这个函数:


/**


* @brief Initializes the TIM1 Time Base Unit according to the specified parameters.


* @param TIM1_Prescaler specifies the Prescaler value.


* @param TIM1_CounterMode specifies the counter mode from @ref TIM1_CounterMode_TypeDef .


* @param TIM1_Period specifies the Period value.


* @param TIM1_RepetitionCounter specifies the Repetition counter value


* @retval None


*/


void TIM1_TimeBaseInit(uint16_t TIM1_Prescaler,


TIM1_CounterMode_TypeDef TIM1_CounterMode,


uint16_t TIM1_Period,


uint8_t TIM1_RepetitionCounter)


这是库函数里面的函数定义部分,我只取了注释部分和函数名称部分,具体的代码不需要看。


结合注释和括号里的参数名称,我们可以知道这几个参数的功能:


TIM1_Prescaler-分频系数


TIM1_CounterMode-计数模式


TIM1_Period-定时周期


TIM1_RepetitionCounter-重复定时次数


STM8S相比8051的定时器有两个突出的地方,一个是计数模式,我们可以选择向上计数、向下计数、中央对其模式。


另一个就是重复定时次数,51里面,要实现一个比较长的定时,需要自己定一个变量,每次定时结束,变量加一;STM8S这里不需要,有一个专门的寄存器完成这个功能。


所以,上面那个函数的功能就是:


TIM1_TimeBaseInit(0x0063, TIM1_COUNTERMODE_UP, 0x03e8, 0x13);


系统时钟做100(0x63=99)分频,向上计数模式,定时周期1000(分频后的时钟),重复计数20(0x13=19)次。


最后,在中断函数里,我们控制LED进行状态的翻转,代码如下:


INTERRUPT_HANDLER(TIM1_UPD_OVF_TRG_BRK_IRQHandler, 11)


{

/* In order to detect unexpected events during development,


it is recommended to set a breakpoint on the following instruction.


*/


TIM1_ClearITPendingBit(TIM1_IT_UPDATE);


GPIO_WriteReverse(GPIOB, GPIO_PIN_4);


}


内容很简单,清中断标志,然后PB4状态翻转。


编译、下载、上电,功能正常!很简单,打完收工!

推荐阅读

史海拾趣

敦泰(FOCALTECH)公司的发展小趣事
调节冰箱温度时,应根据季节和存放食物的需求进行调整。一般来说,冷藏室的温度应设置在2-8℃之间,冷冻室的温度应设置在-18℃以下。可以通过冰箱上的温度调节按钮或触摸屏进行设置。同时,注意避免将温度设置过低或过高,以免影响食物的保鲜效果和冰箱的能耗。
Dover Corporation公司的发展小趣事

进入21世纪后,Dover Corporation开始实施多元化发展战略。除了电梯业务外,公司逐渐将业务扩展到其他领域,如工程产品、燃料解决方案、成像和身份识别等。这一战略的实施使Dover能够更好地应对市场变化,实现业务的持续增长。

Dawn Electronics Inc公司的发展小趣事

Dawn Electronics Inc公司成立于上世纪末,当时电子市场竞争激烈,新公司难以立足。公司创始人凭借对技术的热爱和对市场的敏锐洞察,决定专注于研发高性能的定制电子元件。初创期,公司面临着资金紧张、人才短缺的困境,但创始人带领团队日夜兼程,攻克技术难题,终于在市场上推出了具有竞争力的产品,赢得了客户的认可。

ETTINGER公司的发展小趣事

作为英国翘楚皮具品牌,Ettinger有幸获得了H.R.H威尔士王的皇家保证。这一荣誉不仅是对Ettinger产品质量的认可,也为品牌的发展带来了更多的机遇。随着品牌知名度的提升,Ettinger逐渐成为了英国人最喜爱的皮具品牌之一,并在全球范围内拥有了广泛的粉丝群。

展恒电子(Broadic)公司的发展小趣事

2011年,展恒电子自主研发的首款485功能芯片——HD588成功问世,并成功应用到电网产品中。这一突破不仅证明了展恒电子在芯片设计领域的实力,也为公司在电力行业的拓展奠定了坚实的基础。随后,公司继续加大研发力度,不断推出更多具有竞争力的产品,逐步在电子行业中树立了良好的口碑。

EOS POWER INDIA Pvt公司的发展小趣事

在追求经济效益的同时,EOS也注重可持续发展和环保责任。公司积极采用环保材料和绿色生产工艺,降低生产过程中的能耗和排放。EOS还投入资金建设了环保设施,确保生产过程中的废弃物得到有效处理。此外,公司还积极参与环保公益活动,推动电子行业的绿色发展。这些举措不仅体现了EOS的社会责任感,也为公司的长期发展奠定了坚实的基础。

问答坊 | AI 解惑

单片机怎样处理LM331送来的信号

本帖最后由 paulhyde 于 2014-9-15 09:41 编辑 当将模拟信号转换成方波脉冲后,再将脉冲信号送入单片机,那么单片机是怎样处理这个脉冲信号的?  …

查看全部问答>

8051fxxx IDE出现下列问题

note:usb address and data registers will not valid until usb clock is running 这是什么造成的呢?…

查看全部问答>

技术在于积累!-------谈谈偶做LED驱动电源的经历

技术在于积累!        第一次刚接触LED驱动是从一块DEMO板: DC输入,输出是低电流大致200MA的; 因为客户的需求,后来公司头一次想用SMD802开发一块非隔离的7*1w 450MA驱动板;那时候没买样板,也没找专门的IC厂商,要求技 ...…

查看全部问答>

关于AT89S52单篇机,

你好,我刚买了上面那个型号,,但是,我烧写时,出现了编程器不存在,什么回事?…

查看全部问答>

用软件如何实现蓝牙接收的数据转换

最近做了一个题目,使用蓝牙接收到的数据在LED点阵上显示出来,但是前提是不知道要接收的数据的内容。该如何实现接收到的数据用编程直接转换成LED点阵上能识别的二进制数。是该做一个字库还是有其他什么别的方法。请专业人士帮忙解决一下。谢谢。…

查看全部问答>

windows ce stream driver wizard

搜遍了整个网络也没有找到windows ce stream driver wizard这个工具,哪位大哥大姐弟弟妹妹能够慷慨解囊,帮小弟一把,不胜感激。小弟的邮箱是:cougarz@somagic.com.cn…

查看全部问答>

哪位达人用过《EVC高级编程及其应用开发》这本书上基础数据库的例子?

我在wince下试了这个程序,可是不好使阿,添加不了,也删除不了,请问是还需要安装什么程序还是本身实例程序有问题啊?…

查看全部问答>

今天用Proteus仿真的ADC0809。。。但实际0809不工作啊。。。。

  单片机的对应ST脚的P口接上0809时就被拉低了。Proteus仿真什么问题都没有。0809要注意什么问题么?有两个问题:1,我希望设定的是500K,用定时器方式2也是设成255。可从P口出来的就是50K 啊。2,ST脚被拉低,但不接0809时单片机P口是正常的 ...…

查看全部问答>

【求助】JTAG下载遇到问题:-(

我在使用msp430F149的JTAG模块下载时,一开始还能下载运行,试了有两三天,突然一天不能下载了,后来就再也不能下了,软件提示不能发现目标。然后又贴了一块板子,结果这块好了半天就又出现和前面一样的现象。很是郁闷 量了下载口各个引脚的电压 ...…

查看全部问答>

I2C连续读写请教

想通过I2C连续写数据和读数据,用for循环来操作,写入的都是第一个数据,后面的就没有写入了,读也是这样。但如果不用for循环写,直接写入两个数据可以实现,但是读得时候也不能实现;在网上搜了下也是用for循环啊,但是我的怎么不能实现呢?请大家 ...…

查看全部问答>