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

news2025/7/20 20:53:46

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


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

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

🚩重装载值说明

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

	TIM5_ARRH = 0x00; // 自动重载寄存器ARR=0x007c
   TIM5_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 TIMER
		TIM1_IER=0x01;//更新中断使能
		TIM1_EGR=0x01;
		TIM1_CNTR=255;//计数器值
		TIM1_ARR=255;//自动重装的值,相当于**TIM1_ARRH**高位是0xff
		TIM1_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; //使能内部高速时钟 HSI
     CLK_CKDIVR = 0x08; // 2分频
    while(!(CLK_ICKR&0x02)); //HSI准备就绪
      CLK_SWR =0xE1;//HSI内部时钟源作为主时钟源(复位值)  
       
  //TIM1_IER=0x00;//disable TIMER
  CLK_PCKENR1 |=0x80; //外设时钟门控寄存器
		TIM1_EGR=0x01;//计数器更新,可省略
		TIM1_PSCR=0x07;//分频值:8
		TIM1_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 interrupt
	Init_GPIO();
	Init_Timer1();
	_asm("rim");//enable all interrupt

	while (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; //使能内部高速时钟 HSI
     CLK_CKDIVR = 0x08; // 16M,2分频后8MHz
    while(!(CLK_ICKR&0x02)); //HSI准备就绪
      CLK_SWR =0xE1;//HSI内部时钟源作为主时钟源(复位值)  
			
  //TIM1_IER=0x00;//disable TIMER
		CLK_PCKENR1 |=0x80; //外设时钟门控寄存器
		TIM1_EGR=0x01;//计数器更新,可省略
		TIM1_PSCRH = 0x1F; // 8M系统时钟经预分频f=fck/(PSCR+1)
    TIM1_PSCRL = 0x3F; // PSCR=0x1F3F,f=8M/(0x1F3F+1)=1000Hz,每个计数周期1ms
    TIM1_ARRH = 0x03; // 自动重载寄存器ARR=0x01F4=500;0X03E8=1000
    TIM1_ARRL = 0xE8; // 每记数500次产生一次中断,即500ms

	  TIM1_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 interrupt
	Init_GPIO();
	Init_Timer1();
	_asm("rim");

	while (1);
}

@far @interrupt void TIM1_UPD_OVF_IRQHandler (void)
{

      TIM1_SR1 =0x00;// 清除更新中断标记,这步不能漏掉
	 PD_ODR ^= 0x80;
   
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/7888.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

QSystemTrayIcon——实现系统托盘

QSystemTrayIcon类 QSystemTrayIcon QSystemTrayIcon是qt中专门用于处理系统托盘的类 头文件#include qmakeQT widgetsSinceQt 4.2InheritsQObject QSystemTrayIcon 支持Windows、macos和部分Linux桌面环境,可以通过 QSystemTrayIcon::isSystemTrayAvailable()方…

0基础学习——了解操作符的那些事(一)

小叮当的任意门操作符分类1. 算数操作符2. 移位操作符二进制(小插曲)左移动操作符右移操作符3. 位操作符& 按位与 &按位或 |按位异或 ^赋值操作符复合赋值符单目操作符操作符分类 在这里我们有:算数操作符 移位操作符 等 今天我们就先…

uni-App获取地图address与高德地图API配合

现在使用获取地图,不需要再去安装sdk,只需要和我一样执行下方代码可以解决问题(这里会从先获取经纬度,再到经纬度转成具体的地址,最后补充定位当前位置),并且当中会提及到很多,自己开…

深度学习模型的参数、计算量和推理速度统计

在没有过拟合的情况下,相同模型结构下,一般模型的参数量和计算量与最终的性能成正比,在比较不同模型性能时,最好能保持模型参数量和计算量在相同水平下,因此相应参数的统计很重要。这里只进行理论计算,最终…

MySQL的下载与安装

1. 下载地址 官网:https://www.mysql.com 2. 打开官网,点击DOWNLOADS 然后,点击 MySQL Community(GPL) Downloads 3. 点击 MySQL Community Server 这里在Windows 系统下推荐下载 MSI安装程序 ; 点击 My Go to Download Page…

中国医药院外流通市场分析

医药流通行业概览 医药流程市场主要分为院内、院外。 与院内市场终端相比,院外市场终端(特别是基层医疗层级终端)数量更多、规模更 小以及分布分散。此外,院外市场终端的服务区域半径有限,仅服务于一定地理区域内的 终端客户。因此&#xff…

【面试题】 ES6 类聊 JavaScript 设计模式之行为型模式(二)

本文是《ES6 类聊 JavaScript 设计模式》的第四篇,介绍第三种类型的设计模式行为设计模式,其特别关注对象之间的通信。 在软件工程中, 行为型模式为设计模式的一种类型,用来识别对象之间的常用交流模式并加以实现。如此&#xff0…

【Linux】进程控制

目录🌈前言🌸1、进程创建🍡1.1、概念🍢1.2、fork()之后执行顺序🍧1.3、fork()返回值🍨1.4、写时拷贝🍩1.5、fork创建失败问题🍁2、进程终止🍲2.1、概念🍱2.2、…

【附源码】Python计算机毕业设计数据学院工作量管理系统

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

力扣刷题day48|583两个字符串的删除操作、72编辑距离

文章目录583. 两个字符串的删除操作动态规划思路一动态规划思路二动态规划五部曲72. 编辑距离思路动态规划五部曲583. 两个字符串的删除操作 力扣题目链接 给定两个单词 word1 和 word2 ,返回使得 word1 和 word2 相同所需的最小步数。 每步 可以删除任意一个字符…

K_A05_001 基于 STM32等单片机驱动8X8点阵模块(MAX7219)显示0-9

目录 一、资源说明 二、基本参数 1、参数 2、引脚说明 三、通信协议说明 工作时序 对应程序: 四、部分代码说明 1、接线说明 1.1、STC89C52RC8X8点阵模块(MAX7219) 1.2、STM32F103C8T68X8点阵模块(MAX7219) 2、亮度调节 五、基…

Python中内置数据库!SQLite使用指南!

💡 作者:韩信子ShowMeAI 📘 Python3◉技能提升系列:https://www.showmeai.tech/tutorials/56 📘 本文地址:https://www.showmeai.tech/article-detail/390 📢 声明:版权所有&#xf…

Docker数据卷

Docker数据卷、Docker安全Docker数据卷Docker数据卷管理bind mountdocker数据卷两种方式不同和相同卷插件简介convoy卷插件实践Docker数据卷 主要解决存储问题、容器数据滞留 Docker数据卷管理 bind mount “-v”宿主机路径容器内nginx发布目录 新建一个首页 现在容器内目录…

猿创征文|工具百宝箱-编辑器-笔记工具-日常小工具-原型设计工具

这篇文主要介绍了开发者工具之外的一些日常小工具,我用这些小工具主要完成什么工作。分享给大家 官方活动入口:「猿创征文 」第四季 | 2022 年我的开发者工具 猿创征文|工具百宝箱-代码编辑器-版本控制工具-终端神器-项目与事务跟踪工具-SFTP…

pdf文件转txt怎么转?这几个方法你值得收藏

平时我们在网络上搜索资料的时候,会发现很多资料都是以PDF格式显示的,虽然这种文件格式很方便我们查看,但是如果将其保存到手机中,又太占用内存了。其实我们可以将其转换成txt格式,因为我发现它不仅不占空间&#xff0…

助力数据中心双碳发展,存储如何变得越来越绿?

2022年11月10日,我看到曙光发了首款液冷存储,目标锁定数据中心PUE1.1以下。在“双碳”发展趋势下,聚焦液冷存储与液冷服务器的创新,曙光对绿色数据中心的可持续发展将带来行业引领效应。 双碳大趋势下,绿色存储呼之欲出…

计算机网络复习

考试重点 要掌握OSI七层模型, 会根据数据画模拟和数字信号的图,尤其是TCP和UDP所提供的服务, 掌握TCP连接建立和释放的完整过程, 掌握滑动窗口的概念, 还要了解端到端的含义, 了解ARP、ICMP、CIDR等协议的…

干了3年软件测试,2022年我离职了...

今天在网上刷到一个帖子,说软件测试岗,在公司呆了三年,由于疫情原因,公司效益不是很好,加上自己的技术一直停留在功能测试,在公司可有可无,被公司裁后找不到工作… 逛百度贴吧、逛技术论坛&…

[附源码]java毕业设计基于servlet技术实现游戏娱乐平台

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

FFplay文档解读-48-多媒体过滤器二

32.8 ebur128 EBU R128扫描仪滤光片。此过滤器将音频流作为输入并以不变的方式输出。默认情况下,它以10Hz的频率记录消息,具有瞬时响度(由M标识),短期响度(S),集成响度(…