历史上的今天
今天是: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
点击(此处)折叠或打开
/* MAIN.C file
*
* Copyright (c) 2002-2005 STMicroelectronics
*/
#include "stm8s.h"
#include "stm8s003f3p.h"
#include "stm8s_conf.h"
void GPIOInit(void);
void Time1_Init(void);
void main(void)
{
CLK_HSECmd(DISABLE); //关闭外部高速振荡器
CLK_HSICmd(ENABLE); //启用内部高速时钟
CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1); //设置 内部 时钟16M 为主时钟(默认是8分配2MHz)
GPIOInit();
Time1_Init();
while (1){
}
}
void GPIOInit(void)
{
GPIO_Init(GPIOC, GPIO_PIN_3, GPIO_MODE_OUT_PP_LOW_FAST);
GPIO_Init(GPIOC, GPIO_PIN_4, GPIO_MODE_OUT_PP_LOW_FAST);
}
void Time1_Init(void)
{
TIM1_DeInit(); //恢复为默认值
TIM1_TimeBaseInit(0x0000, TIM1_COUNTERMODE_UP, 0x3e80, 0x00); //不分频16MHz 计数值16000 1ms中断一次
TIM1_GenerateEvent(TIM1_EVENTSOURCE_UPDATE); //手册里有说明,不设置的话就不会产生中断
TIM1_ITConfig(TIM1_IT_UPDATE, ENABLE); //配置更新中断
TIM1_Cmd(ENABLE); //使能定时器
enableInterrupts(); //开启总中断
}
@far @interrupt void Timer4_interrupt_handler_t(void) //1ms定时中断
{
static unsigned int count = 0;
static unsigned char falg = 0;
TIM1_ClearITPendingBit(TIM1_IT_UPDATE); //TIM1_SR = 0,清除中断标志
if(count<1000){
GPIO_WriteHigh(GPIOC, GPIO_PIN_4);
GPIO_WriteLow(GPIOC, GPIO_PIN_3);
}
else if(count>=1000)
{
GPIO_WriteHigh(GPIOC, GPIO_PIN_3);
GPIO_WriteLow(GPIOC, GPIO_PIN_4);
}
if(count >=2000)count =0;
count++;
}
然后还有一个很重要的地方,就是在stm8_interrupt_vector.c中注册中断服务函数。
stm8_interrupt_vector.c
点击(此处)折叠或打开
/* BASIC INTERRUPT VECTOR TABLE FOR STM8 devices
* Copyright (c) 2007 STMicroelectronics
*/
typedef void @far (*interrupt_handler_t)(void);
struct interrupt_vector {
unsigned char interrupt_instruction;
interrupt_handler_t interrupt_handler;
};
@far @interrupt void NonHandledInterrupt (void)
{
/* in order to detect unexpected events during development,
it is recommended to set a breakpoint on the following instruction
*/
return;
}
extern void _stext(); /* startup routine */
extern @far @interrupt void Timer4_interrupt_handler_t(void);
struct interrupt_vector const _vectab[] = {
{0x82, (interrupt_handler_t)_stext}, /* reset */
{0x82, NonHandledInterrupt}, /* trap */
{0x82, NonHandledInterrupt}, /* TLI */
{0x82, NonHandledInterrupt}, /* AWU */
{0x82, NonHandledInterrupt}, /* CLK */
{0x82, NonHandledInterrupt}, /* EXTI0 Port A */
{0x82, NonHandledInterrupt}, /* EXTI1 Port B */
{0x82, NonHandledInterrupt}, /* EXTI2 Port C */
{0x82, NonHandledInterrupt}, /* EXTI3 Port D */
{0x82, NonHandledInterrupt}, /* EXTI4 Port E */
{0x82, NonHandledInterrupt}, /* CAN RX */
{0x82, NonHandledInterrupt}, /* CAN TX */
{0x82, NonHandledInterrupt}, /* SPI (End of transfer) */
{0x82, (interrupt_handler_t)Timer4_interrupt_handler_t}, /* TIM1 update/ overflow/ underflow/trigger/ break */
{0x82, NonHandledInterrupt}, /* TIM1 capture/ compare */
{0x82, NonHandledInterrupt}, /* TIM2 update/ overflow */
{0x82, NonHandledInterrupt}, /* TIM2 capture/ compare */
{0x82, NonHandledInterrupt}, /* TIM3 update/ overflow */
{0x82, NonHandledInterrupt}, /* TIM3 capture/ compare */
{0x82, NonHandledInterrupt}, /* UART1 Tx complete */
{0x82, NonHandledInterrupt}, /* UART1 Receive register DATA FULL */
{0x82, NonHandledInterrupt}, /* I2C interrupt */
{0x82, NonHandledInterrupt}, /* UART2/3 Tx complete */
{0x82, NonHandledInterrupt}, /* UART2/3 Receive register DATA FULL */
{0x82, NonHandledInterrupt}, /* ADC1 end of conversion/ analog watchdog interrupt */
{0x82, NonHandledInterrupt}, /* TIM4 update/ overflow */
{0x82, NonHandledInterrupt}, /* Flash EOP/WR_PG_DIS */
{0x82, NonHandledInterrupt}, /* irq25 */
{0x82, NonHandledInterrupt}, /* irq26 */
{0x82, NonHandledInterrupt}, /* irq27 */
{0x82, NonHandledInterrupt}, /* irq28 */
{0x82, NonHandledInterrupt}, /* irq29 */
};
通过上述的简单设置就可以使用高级定时器1了。
现象是一个LED以1s的间隔在亮灭间转换。
上一篇:STM8S CPU主时钟
下一篇:stm8s 定时器 延时 心得
史海拾趣
|
北京—全球领先的混合信号多媒体半导体供应商矽玛特公司(SigmaTel,NASDAQ 交易代号:SGTL)宣布基于STMP3600的优化多媒体播放器已准备就绪,可以开始供货。这些播放器可支持每秒30帧的QCIF格式或每秒24帧的QVGA格式视频播放,为矽玛特客户的 ...… 查看全部问答> |
|
中星九号广播电视直播卫星点火发射| “中星九号”广播电视直播卫星(腾讯科技配图) 2008年6月9日20时15分,“中星九号”广播电视直播卫星点火发射。 中新网西昌六月九日电(唐振宇 齐彬)北京时间六月九日晚八时十五分,中国在西昌用“长征三号 ...… 查看全部问答> |
|
郁闷的是我只能做到双向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… 查看全部问答> |
|
我们的程序需要时钟保持着对SATA硬盘的检测,当硬盘被拔掉或者插上时,都应该要有提示信息。那么在Linux下面,我需要去读取、检测哪儿才能获取该信息呢?如果有人对USB的热插拔也比较了解的,欢迎过来帮我扫盲!(我大致看了驱动层,整个SATA的中断 ...… 查看全部问答> |
|
在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 ...… 查看全部问答> |
|
小弟最近研究vxworks时遇到一个问题,请大侠们多指教! 我的板子把ip地址设置成192.168.1.135,子网掩码设置为255.255.0.0,主机ip为192.168.1.45,子网掩码是255.255.0.0,我从板子上去ping主机,出现问题,ping不通,而相同情况下板子跑linux系统 ...… 查看全部问答> |




