STM8S903K3基于ST Visual Develop开发定时器1中断示例
创始人
2024-01-21 15:59:59

STM8S903K3基于ST Visual Develop开发定时器1中断示例


  • 📌相关篇《STM8S903K3T6C基于IAR开发GPIO点灯示例》
  • 🎉在基于STVP环境下和IAR环境下,如果都使用寄存器操作,那么差异不大,主要在中断函数的书写上有差异。

📝本示例基于定时器1定时,产生中断来控制闪烁间隔时间,led引脚在PD7上。

🚩重装载值说明

如果是基于STVD寄存器开发,那么在写重装载寄存器的值时推荐将高低寄存器分开写,具体为什么,可以查看头文件寄存器地址具体位置就可以知道。

	TIM5_ARRH = 0x00; // 自动重载寄存器ARR=0x007cTIM5_ARRL = 0x7c; // 每1ms中断一次
TIM5_ARR = 0x7c;//自动重装的值,变成了每隔524ms一次了达不到预期。
  • 头文件寄存器地址:

例如TIM5重装载寄存器,的高8位寄存器的地址和TIM5_ARR是相同的,如果直接赋值那相当于将重装载值直接赋值给了高8位的寄存器TIMx_ARRH。这一点特别需要注意!

/* TIM5 Auto-reload register */
DEF_16BIT_REG_AT(TIM5_ARR,0x530f);
/* Data bits High */
DEF_8BIT_REG_AT(TIM5_ARRH,0x530f);
/* Data bits Low */
DEF_8BIT_REG_AT(TIM5_ARRL,0x5310);
  • ⚡TIM1也是如此
/* TIM1 Auto-reload register */
DEF_16BIT_REG_AT(TIM1_ARR,0x5262);
/* Data bits High */
DEF_8BIT_REG_AT(TIM1_ARRH,0x5262);
/* Data bits Low */
DEF_8BIT_REG_AT(TIM1_ARRL,0x5263);

🌼示例一

🔖使用外部8MHz时钟源定时,500ms,让PD7引脚led状态翻转。

#include"stm8s903k3.h"
unsigned char i=0;void Init_Timer1(void)
{CLK_ECKR = 0x01; //开启外部时钟寄存器CLK_SWR = 0xb4; //HSE外部时钟源作为主时钟源CLK_CKDIVR = 0x00;//不分频TIM1_CR1=0x01;//enable 使能计数器//TIM1_IER=0x00;//disable TIMERTIM1_IER=0x01;//更新中断使能TIM1_EGR=0x01;TIM1_CNTR=255;//计数器值TIM1_ARR=255;//自动重装的值,相当于**TIM1_ARRH**高位是0xffTIM1_PSCR=0x07;//分频值:2^7=128分频;T=128/8MHz=16us,16us*255*122=500ms}
void Init_GPIO(void)
{PD_DDR |=0x80;PD_CR1 |=0x80;PD_CR2 |=0x00;
}
void main()
{Init_GPIO();Init_Timer1();_asm("rim");while (1);
}@far @interrupt void TIM1_UPD_OVF_IRQHandler (void)
{i++;TIM1_SR1=0x00;// 清除更新中断标记,这步不能漏掉if(i==122){PD_ODR ^= 0x80;i=0;}return;
}
  • 📈逻辑分析仪采集的波形
    在这里插入图片描述

🌻示例二

🍁使用内部16MHz时钟源,定时1s,,让PD7引脚led状态翻转。

/* MAIN.C file* * Copyright (c) 2002-2005 STMicroelectronics*/
#include"stm8s903k3.h"
unsigned char i=0;void Init_Timer1(void)
{
//	CLK_ECKR = 0x01; //开启外部时钟寄存器
//  CLK_SWR = 0xb4; //HSE外部时钟源作为主时钟源
//  CLK_CKDIVR = 0x00;//不分频CLK_ICKR |= 0X01; //使能内部高速时钟 HSICLK_CKDIVR = 0x08; // 2分频while(!(CLK_ICKR&0x02)); //HSI准备就绪CLK_SWR =0xE1;//HSI内部时钟源作为主时钟源(复位值)  //TIM1_IER=0x00;//disable TIMERCLK_PCKENR1 |=0x80; //外设时钟门控寄存器TIM1_EGR=0x01;//计数器更新,可省略TIM1_PSCR=0x07;//分频值:8TIM1_CNTR=255;//计数器值TIM1_ARR=255;//自动重装的值TIM1_CR1=0x01;//enable 使能计数器TIM1_IER=0x01;//更新中断使能}
void Init_GPIO(void)
{PD_DDR |=0x80;PD_CR1 |=0x80;PD_CR2 |=0x00;
}
void main()
{_asm("sim");    //disable all interruptInit_GPIO();Init_Timer1();_asm("rim");//enable all interruptwhile (1);
}@far @interrupt void TIM1_UPD_OVF_IRQHandler (void)
{i++;TIM1_SR1=0x00;// 清除更新中断标记,这步不能漏掉if(i==122){PD_ODR ^= 0x80;i=0;}return;
}
  • 📈逻辑分析仪采集的波形
    在这里插入图片描述

  • 两个示例中的stm8_interrupt_vector.c代码相同,都是采用的TIM1,中断号:11

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 @far @interrupt void TIM1_UPD_OVF_IRQHandler (void);
extern void _stext();     /* startup routine */struct interrupt_vector const _vectab[] = {{0x82, (interrupt_handler_t)_stext}, /* reset */{0x82, NonHandledInterrupt}, /* trap  */{0x82, NonHandledInterrupt}, /* irq0  */{0x82, NonHandledInterrupt}, /* irq1  */{0x82, NonHandledInterrupt}, /* irq2  */{0x82, NonHandledInterrupt}, /* irq3  */{0x82, NonHandledInterrupt}, /* irq4  */{0x82, NonHandledInterrupt}, /* irq5  */{0x82, NonHandledInterrupt}, /* irq6  */{0x82, NonHandledInterrupt}, /* irq7  */{0x82, NonHandledInterrupt}, /* irq8  */{0x82, NonHandledInterrupt}, /* irq9  */{0x82, NonHandledInterrupt}, /* irq10 */{0x82, TIM1_UPD_OVF_IRQHandler}, /* irq11 */{0x82, NonHandledInterrupt}, /* irq12 */{0x82, NonHandledInterrupt}, /* irq13 */{0x82, NonHandledInterrupt}, /* irq14 */{0x82, NonHandledInterrupt}, /* irq15 */{0x82, NonHandledInterrupt}, /* irq16 */{0x82, NonHandledInterrupt}, /* irq17 */{0x82, NonHandledInterrupt}, /* irq18 */{0x82, NonHandledInterrupt}, /* irq19 */{0x82, NonHandledInterrupt}, /* irq20 */{0x82, NonHandledInterrupt}, /* irq21 */{0x82, NonHandledInterrupt}, /* irq22 */{0x82, NonHandledInterrupt}, /* irq23     */{0x82, NonHandledInterrupt}, /* irq24 */{0x82, NonHandledInterrupt}, /* irq25 */{0x82, NonHandledInterrupt}, /* irq26 */{0x82, NonHandledInterrupt}, /* irq27 */{0x82, NonHandledInterrupt}, /* irq28 */{0x82, NonHandledInterrupt}, /* irq29 */
};

示例二效果方式二(推荐)

与上面的主要的差异在于将分配寄存器进行高8位低8位进行了拆解。

#include"stm8s903k3.h"
void Init_Timer1(void)
{
//	CLK_ECKR = 0x01; //开启外部时钟寄存器
//  CLK_SWR = 0xb4; //HSE外部时钟源作为主时钟源
//  CLK_CKDIVR = 0x00;//不分频CLK_ICKR |= 0X01; //使能内部高速时钟 HSICLK_CKDIVR = 0x08; // 16M,2分频后8MHzwhile(!(CLK_ICKR&0x02)); //HSI准备就绪CLK_SWR =0xE1;//HSI内部时钟源作为主时钟源(复位值)  //TIM1_IER=0x00;//disable TIMERCLK_PCKENR1 |=0x80; //外设时钟门控寄存器TIM1_EGR=0x01;//计数器更新,可省略TIM1_PSCRH = 0x1F; // 8M系统时钟经预分频f=fck/(PSCR+1)TIM1_PSCRL = 0x3F; // PSCR=0x1F3F,f=8M/(0x1F3F+1)=1000Hz,每个计数周期1msTIM1_ARRH = 0x03; // 自动重载寄存器ARR=0x01F4=500;0X03E8=1000TIM1_ARRL = 0xE8; // 每记数500次产生一次中断,即500msTIM1_RCR = 0x00;    //重复计数器值TIM1_SR1 = ( ~0x01 );          //清除更新中断标志TIM1_CR1=0x01;//enable 使能计数器TIM1_IER=0x01;//更新中断使能}
void Init_GPIO(void)
{PD_DDR |=0x80;// 配置PD端口的方向寄存器PD7输出PD_CR1 |=0x80;// 设置PD7为推挽输出PD_CR2 |=0x00;
}
void main()
{_asm("sim");    //disable all interruptInit_GPIO();Init_Timer1();_asm("rim");while (1);
}@far @interrupt void TIM1_UPD_OVF_IRQHandler (void)
{TIM1_SR1 =0x00;// 清除更新中断标记,这步不能漏掉PD_ODR ^= 0x80;}

在这里插入图片描述

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
1和0什么意思网络用语 0和1... 最近,有网友给大家出了份考卷,卷面是几位“00后”的QQ对 话:dbq、xswl、nss、nbcs、...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
七大洲八大洋 七大洲简易图三角... 一、北美洲(中北美和加勒比海)北美洲面积约2471万平方公里,居世界第三。人口约5.79亿(2016...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...