历史上的今天
返回首页

历史上的今天

今天是:2024年10月08日(星期二)

正在发生

2021年10月08日 | STM8 定时器Time1使用

2021-10-08 来源:eefocus

1、定时器概述
STM8S提供三种类型的 TIM 定时器:高级控制型(TIM1)、通用型(TIM2/TIM3/TIM5)和基本型定时器(TIM4/TIM6)。它们虽有不同功能但都基于共同的架构。此共同的架构使得采用各个定时器来设计应用变得非常容易与方便(相同的寄存器映射,相同的基本功能)。

2、现在来介绍高级定时器1的配置和应用。


代码如下:
main.c

点击(此处)折叠或打开

  1. /* MAIN.C file

  2.  *

  3.  * Copyright (c) 2002-2005 STMicroelectronics

  4.  */

  5. #include "stm8s.h"

  6. #include "stm8s003f3p.h"

  7. #include "stm8s_conf.h"


  8. void GPIOInit(void);

  9. void Time1_Init(void);


  10. void main(void)

  11. {

  12.     

  13.     CLK_HSECmd(DISABLE); //关闭外部高速振荡器

  14.     CLK_HSICmd(ENABLE);     //启用内部高速时钟

  15.     CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1); //设置 内部 时钟16M 为主时钟(默认是8分配2MHz)

  16.     GPIOInit();

  17.     Time1_Init();

  18.     while (1){

  19.         

  20.     }

  21. }


  22. void GPIOInit(void)

  23. {

  24.         GPIO_Init(GPIOC, GPIO_PIN_3, GPIO_MODE_OUT_PP_LOW_FAST);

  25.         GPIO_Init(GPIOC, GPIO_PIN_4, GPIO_MODE_OUT_PP_LOW_FAST);

  26.         

  27. }


  28. void Time1_Init(void)

  29. {

  30.     TIM1_DeInit();                                                                //恢复为默认值

  31.     TIM1_TimeBaseInit(0x0000, TIM1_COUNTERMODE_UP, 0x3e80, 0x00); //不分频16MHz 计数值16000 1ms中断一次

  32.     TIM1_GenerateEvent(TIM1_EVENTSOURCE_UPDATE);    //手册里有说明,不设置的话就不会产生中断

  33.     TIM1_ITConfig(TIM1_IT_UPDATE, ENABLE);                //配置更新中断

  34.     TIM1_Cmd(ENABLE);                                                            //使能定时器

  35.     enableInterrupts();                                                        //开启总中断

  36. }

  37.     

  38.     

  39. @far @interrupt void Timer4_interrupt_handler_t(void) //1ms定时中断

  40. {

  41.         static unsigned int count = 0;

  42.         static unsigned char falg = 0;

  43.     

  44.     TIM1_ClearITPendingBit(TIM1_IT_UPDATE); //TIM1_SR = 0,清除中断标志    

  45.         

  46.         if(count<1000){

  47.                 

  48.                 GPIO_WriteHigh(GPIOC, GPIO_PIN_4);    

  49.                 GPIO_WriteLow(GPIOC, GPIO_PIN_3);

  50.         }

  51.         else if(count>=1000)

  52.         {

  53.             

  54.             GPIO_WriteHigh(GPIOC, GPIO_PIN_3);

  55.             GPIO_WriteLow(GPIOC, GPIO_PIN_4);

  56.         }

  57.     

  58.         if(count >=2000)count =0;

  59.         count++;

  60. }



然后还有一个很重要的地方,就是在stm8_interrupt_vector.c中注册中断服务函数。

stm8_interrupt_vector.c

点击(此处)折叠或打开

  1. /*    BASIC INTERRUPT VECTOR TABLE FOR STM8 devices

  2.  *    Copyright (c) 2007 STMicroelectronics

  3.  */


  4. typedef void @far (*interrupt_handler_t)(void);


  5. struct interrupt_vector {

  6.     unsigned char interrupt_instruction;

  7.     interrupt_handler_t interrupt_handler;

  8. };


  9. @far @interrupt void NonHandledInterrupt (void)

  10. {

  11.     /* in order to detect unexpected events during development,

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

  13.     */

  14.     return;

  15. }


  16. extern void _stext(); /* startup routine */

  17. extern @far @interrupt void Timer4_interrupt_handler_t(void);

  18. struct interrupt_vector const _vectab[] = {

  19.     {0x82, (interrupt_handler_t)_stext}, /* reset */

  20.     {0x82, NonHandledInterrupt}, /* trap */

  21.     {0x82, NonHandledInterrupt}, /* TLI */

  22.     {0x82, NonHandledInterrupt}, /* AWU */

  23.     {0x82, NonHandledInterrupt}, /* CLK */

  24.     {0x82, NonHandledInterrupt}, /* EXTI0 Port A */

  25.     {0x82, NonHandledInterrupt}, /* EXTI1 Port B */

  26.     {0x82, NonHandledInterrupt}, /* EXTI2 Port C */

  27.     {0x82, NonHandledInterrupt}, /* EXTI3 Port D */

  28.     {0x82, NonHandledInterrupt}, /* EXTI4 Port E */

  29.     {0x82, NonHandledInterrupt}, /* CAN RX */

  30.     {0x82, NonHandledInterrupt}, /* CAN TX */

  31.     {0x82, NonHandledInterrupt}, /* SPI (End of transfer) */

  32.     {0x82, (interrupt_handler_t)Timer4_interrupt_handler_t}, /* TIM1 update/ overflow/ underflow/trigger/ break */

  33.     {0x82, NonHandledInterrupt}, /* TIM1 capture/ compare */

  34.     {0x82, NonHandledInterrupt}, /* TIM2 update/ overflow */

  35.     {0x82, NonHandledInterrupt}, /* TIM2 capture/ compare */

  36.     {0x82, NonHandledInterrupt}, /* TIM3 update/ overflow */

  37.     {0x82, NonHandledInterrupt}, /* TIM3 capture/ compare */

  38.     {0x82, NonHandledInterrupt}, /* UART1 Tx complete */

  39.     {0x82, NonHandledInterrupt}, /* UART1 Receive register DATA FULL */

  40.     {0x82, NonHandledInterrupt}, /* I2C interrupt */

  41.     {0x82, NonHandledInterrupt}, /* UART2/3 Tx complete */

  42.     {0x82, NonHandledInterrupt}, /* UART2/3 Receive register DATA FULL */

  43.     {0x82, NonHandledInterrupt}, /* ADC1 end of conversion/ analog watchdog interrupt */

  44.     {0x82, NonHandledInterrupt}, /* TIM4 update/ overflow */

  45.     {0x82, NonHandledInterrupt}, /* Flash EOP/WR_PG_DIS */

  46.     {0x82, NonHandledInterrupt}, /* irq25 */

  47.     {0x82, NonHandledInterrupt}, /* irq26 */

  48.     {0x82, NonHandledInterrupt}, /* irq27 */

  49.     {0x82, NonHandledInterrupt}, /* irq28 */

  50.     {0x82, NonHandledInterrupt}, /* irq29 */

  51. };


通过上述的简单设置就可以使用高级定时器1了。

现象是一个LED以1s的间隔在亮灭间转换。


推荐阅读

史海拾趣

Elektron公司的发展小趣事

随着技术的不断进步和市场需求的不断变化,Elektron公司不断进行技术创新和产品升级。公司成功开发出适用于船上使用的单点和多点焊接整流器以及弧光灯的电影整流器等产品,进一步扩大了市场份额。同时,Elektron还注重产品质量和性能的提升,通过引进先进的生产设备和工艺,不断提高产品的可靠性和耐用性。

Coleman Cable Inc公司的发展小趣事

品质一直是Coleman Cable的生命线。公司建立了严格的质量控制体系,从原材料采购、生产过程到成品检验,每一个环节都严格把关。这种对品质的执着追求,使得Coleman Cable的产品在市场上享有良好的声誉。同时,公司还积极听取客户反馈,不断改进产品和服务,赢得了客户的信赖和忠诚。

Dongguan City Niuhang Electronics Co.LTD公司的发展小趣事

在技术创新的基础上,Dongguan City Niuhang Electronics Co.LTD开始积极拓展市场。公司先后在安徽省池州市、江苏省扬州市和宿迁市等地设立生产基地,形成了覆盖全国的销售网络。同时,公司还加强品牌建设,通过参加行业展会、举办技术研讨会等方式,提升品牌知名度和影响力。随着市场的不断扩大,公司的销售业绩也实现了快速增长。

Euroquartz公司的发展小趣事

Euroquartz Limited成立于1982年,其发展历程中,1987年的一次收购具有重要意义。这一年,Euroquartz收购了Brookes Crystals,这是一家在第二次世界大战期间形成的英国石英晶体制造商。这一收购使Euroquartz在石英晶体领域获得了重要的技术积累和市场地位,成为了英国重要的变频控制产品制造商。

HBControls公司的发展小趣事
确保冰箱周围有足够的空间,以便散热和通风,避免冰箱过热影响电路和制冷效果。
Aavid Niagra公司的发展小趣事

随着电子产品的更新换代速度加快,散热技术也面临着更高的要求。Aavid Niagra公司敏锐地捕捉到了这一市场变化,加大了在研发方面的投入,推出了一系列创新性的散热产品。这些产品不仅提高了电子设备的性能稳定性,还大大降低了能耗,赢得了客户的广泛好评。公司的技术创新能力成为了其持续发展的核心竞争力。

问答坊 | AI 解惑

矽玛特推出基于STMP3600的优化视频参考平台

北京—全球领先的混合信号多媒体半导体供应商矽玛特公司(SigmaTel,NASDAQ 交易代号:SGTL)宣布基于STMP3600的优化多媒体播放器已准备就绪,可以开始供货。这些播放器可支持每秒30帧的QCIF格式或每秒24帧的QVGA格式视频播放,为矽玛特客户的 ...…

查看全部问答>

我国广播电视直播卫星 中星9号

中星九号广播电视直播卫星点火发射| “中星九号”广播电视直播卫星(腾讯科技配图) 2008年6月9日20时15分,“中星九号”广播电视直播卫星点火发射。 中新网西昌六月九日电(唐振宇 齐彬)北京时间六月九日晚八时十五分,中国在西昌用“长征三号 ...…

查看全部问答>

哪位大虾了解EM78P458单片机

在网上很少有其资料。还有这种51内核20引脚的单片机如果用40引脚的开发办可以烧写程序么?…

查看全部问答>

今天做了个网口转串口模块

郁闷的是我只能做到双向9600bps,单向115200bps,人家8位单片机都能做到双向56000bps,受打击了,我再优化算法。。。。       2011.1.8总结汇报,这个模块已经完成了很久了,当时主要问题不是8962或者算法的问题,而是上位机测试 ...…

查看全部问答>

printf 和 RETAILMSG 打印出来的消息不一致?

wince6.0 下win32 api 写的代码。 char inFilename[128]; memset(inFilename, 0x00, sizeof(inFilename)); wcscpy(inFilename,_T(\"\\\\Temp\\\\test_420_1599_1198.jpg\")); DNW串口打印消息: RETAILMSG(1,(TEXT(\"[RETAILMSG] inFilename : ...…

查看全部问答>

为什么串口得到的发动机转速是 字节乘以256的权?为什么是256的权呢?

看不懂  串口啊    老大  帮帮我啊    怎么个算小数点的位置啊        申明情况下要转为二进制要转为ASC2   申明情况下用16进制处理呢?????555…

查看全部问答>

Linux下如何检测SATA热插拔?

我们的程序需要时钟保持着对SATA硬盘的检测,当硬盘被拔掉或者插上时,都应该要有提示信息。那么在Linux下面,我需要去读取、检测哪儿才能获取该信息呢?如果有人对USB的热插拔也比较了解的,欢迎过来帮我扫盲!(我大致看了驱动层,整个SATA的中断 ...…

查看全部问答>

ADS scatter描述文件

在ADS的“ARM Link”中设置 “-info totals -info unused -entry 0x40000000 -mangled -map -symbols -scatter D:\\work-wincetest\\uC-GUI\\ucosforphilips\\scatter.scf -info veneers -info sizes -xref  -callgraph” 生成了EXET_E ...…

查看全部问答>

PDA图像显示问题

在EVC4下做图像显示当图像大小大于1M时,图片无法加载,请问高手怎么解决~ 格式是JPG…

查看全部问答>

关于vxworks中网络的问题?

小弟最近研究vxworks时遇到一个问题,请大侠们多指教! 我的板子把ip地址设置成192.168.1.135,子网掩码设置为255.255.0.0,主机ip为192.168.1.45,子网掩码是255.255.0.0,我从板子上去ping主机,出现问题,ping不通,而相同情况下板子跑linux系统 ...…

查看全部问答>