历史上的今天
返回首页

历史上的今天

今天是:2025年03月03日(星期一)

正在发生

2020年03月03日 | stvd+stm8l051F3(2): 外部中断

2020-03-03 来源:eefocus

stvd+stm8l051F3(一): 外部中断


stvd: ST Visual Develop Version 4.3.9

ic:stm8l051F3


1、原理图


按键接在stm8l051F3的PB1脚,LED接在stm8l051F3的PD0脚


2、建立stvd key项目

打开stvd新建stm8l051_key项目,并将stm8l15x.h,stm8l15x_it.h,stm8l15x_it.c,stm8l15x_conf.h,stm8l15x_exti.c,stm8l15x_gpio.c文件加入项目;

stm8l15x_gpio.c:io相关源文件;

stm8l15x_exti.c:中断相关源文件;


3、修改代码

main.c:

/* MAIN.C file

 * 

 * Copyright (c) 2002-2005 STMicroelectronics

 */

#include "stm8l15x.h"


//定义LED、按键端口

#define LED_PORT GPIOD

#define LED_PINS GPIO_Pin_0

#define KEY_PORT GPIOB

#define KEY_PINS GPIO_Pin_1

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

****入口参数:无

****出口参数:无

****函数备注:不精确延时函数

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

void Delay(__IO uint16_t nCount)

{

    /* Decrement nCount value */

    while (nCount != 0)

    {

        nCount--;

    }

}

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

****函数说明:主函数

****入口参数:无

****出口参数:无

****函数备注:按键按下后在外部中断1中将LED亮灭变换

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

void main(void)

{

  GPIO_Init(LED_PORT,LED_PINS,GPIO_Mode_Out_PP_Low_Slow);//初始化LED端口

  GPIO_Init(KEY_PORT, KEY_PINS, GPIO_Mode_In_PU_IT);//初始化按键,上拉输入,带中断

  

  

  EXTI_DeInit (); //恢复中断的所有设置 

  EXTI_SetPinSensitivity (EXTI_Pin_1,EXTI_Trigger_Falling);//外部中断1,下降沿触发,向量号9

  enableInterrupts();//使能中断

  

  while (1)//等待中断

  {

      

  }

}

stm8l15x.h:

打开芯片型号宏定义

/* Uncomment the line below according to the target STM8L15x device used in your

   application

  */

/* #define STM8L15X_LD */ /*!< STM8L15X_LD: STM8L15x Low density devices */

/* #define STM8L15X_MD */ /*!< STM8L15X_MD: STM8L15x Medium density devices */

/* #define STM8L15X_MDP */ /*!< STM8L15X_MDP: STM8L15x Medium density plus devices */

/* #define STM8L15X_HD */ /*!< STM8L15X_HD: STM8L15x/16x High density devices */

 #define STM8L05X_LD_VL */ /*!< STM8L05X_LD_VL: STM8L051xx3 Low density value line devices */

/* #define STM8L05X_MD_VL */ /*!< STM8L05X_MD_VL: STM8L052xx6 Medium density value line devices */

/* #define STM8L05X_HD_VL */ /*!< STM8L05X_HD_VL: STM8L052xx8 High density value line devices */

/* #define STM8AL31_L_MD */ /*!< STM8AL31_L_MD: STM8AL3x Medium density devices */

stm8l15x_conf.h:

关闭USE_FULL_ASSERT宏

/* Exported types ------------------------------------------------------------*/

/* Exported constants --------------------------------------------------------*/

/* Uncomment the line below to expanse the "assert_param" macro in the 

   Standard Peripheral Library drivers code */

/* #define USE_FULL_ASSERT (1) */ 


/* Exported macro ------------------------------------------------------------*/

stm8l15x_it.c:

修改中断向量9响应函数INTERRUPT_HANDLER(EXTI1_IRQHandler,9),在该函数中添加自定义中断处理函数

INTERRUPT_HANDLER(EXTI1_IRQHandler,9)

{

    /* In order to detect unexpected events during development,

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

    */

        

    EXTI_ClearITPendingBit (EXTI_IT_Pin1);//清除中断标志

    GPIO_ToggleBits(GPIOD, GPIO_Pin_0);//翻转LED端口电平

}

stm8_interrupt_vector.c:

注释@far @interrupt void NonHandledInterrupt (void)函数,添加#include "stm8l15x_it.h",解决重定义拨错问题,

将_vectab中irq9的中断处理函数由NonHandledInterrupt修改为EXTI1_IRQHandler

/*    BASIC INTERRUPT VECTOR TABLE FOR STM8 devices

 *    Copyright (c) 2007 STMicroelectronics

 */


/* 添加stm8l15x_it.h头文件 */

#include "stm8l15x_it.h"


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


struct interrupt_vector {

    unsigned char interrupt_instruction;

    interrupt_handler_t interrupt_handler;

};


/* 注释掉NonHandledInterrupt */

#if 0

@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;

}

#endif


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, EXTI1_IRQHandler}, /* irq9 */

    {0x82, NonHandledInterrupt}, /* irq10 */

    {0x82, NonHandledInterrupt}, /* 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 */

};

编译项目通过


4、测试

设置断点单步调试,按下按键led点亮,再按led熄灭。

推荐阅读

史海拾趣

Agere System(LSI Logic)公司的发展小趣事

Agere Systems(后来被LSI Logic收购)是一家在半导体行业具有重要影响力的公司之一。以下是该公司发展的五个相关故事:

  1. 公司成立和发展:Agere Systems成立于2000年,是由Lucent Technologies的微电子部门分拆而成。公司总部位于美国新泽西州的默里斯敦市。Agere Systems专注于开发半导体解决方案,包括通信芯片、存储芯片和无线网络技术。通过不断的技术创新和市场拓展,Agere Systems在短时间内成为半导体行业的领军企业之一。

  2. 无线通信技术:Agere Systems在无线通信技术方面取得了重大突破,推动了移动通信产业的发展。该公司开发了一系列的基带处理器和射频芯片,用于手机和其他移动设备中的无线通信。这些技术的应用使得移动通信设备具有更高的性能、更低的功耗和更广泛的覆盖范围,促进了全球移动通信市场的快速增长。

  3. 存储解决方案:除了在通信领域取得成功外,Agere Systems还致力于开发先进的存储解决方案。该公司生产的存储芯片和控制器广泛应用于硬盘驱动器、固态硬盘和存储系统中,为数据存储和处理提供了关键的技术支持。Agere Systems的存储产品以其高速、高效和可靠性而闻名,成为许多数据中心和企业用户的首选。

  4. 公司并购与重组:在Agere Systems发展的过程中,该公司进行了多次并购和重组以加强自身实力和市场竞争力。2007年,LSI Logic公司宣布收购Agere Systems,将两家公司的技术和资源整合在一起,共同致力于推动半导体行业的发展。通过这一合并,LSI Logic扩大了其在存储和通信领域的市场份额,进一步巩固了在全球半导体市场的领导地位。

  5. 技术创新与发展:Agere Systems始终把技术创新作为公司发展的核心驱动力。该公司投入大量资源用于研发,并与全球各地的科研机构和合作伙伴进行紧密合作。Agere Systems持续推出高性能、低功耗的芯片产品,并不断改进现有产品的性能和功能,以满足客户不断增长的需求。通过持续的技术创新和产品优化,Agere Systems在半导体行业保持了竞争优势,并为客户提供了更加先进和可靠的解决方案。

ept Connectors公司的发展小趣事

EPT Connectors公司一直注重产品品质的管理和提升。公司建立了严格的质量管理体系,从原材料采购到产品制造、检测等各个环节都进行严格把关。同时,EPT还积极引进先进的生产设备和技术,不断提升产品的质量和性能。这些努力使得EPT的产品在市场上赢得了良好的口碑和客户的信任。许多知名电子企业都选择EPT作为他们的连接器供应商,这也进一步推动了EPT的发展。

亿晶源(ekinglux)公司的发展小趣事

亿晶源(EKINGLUX)公司成立于2005年,总部位于深圳。创始人凭借对LED半导体行业的深刻理解和敏锐的市场洞察力,决定在这一领域深耕。公司成立之初,面临资金、技术和市场的多重挑战,但团队凭借不懈的努力和坚定的信念,逐步在市场中站稳脚跟。

Curtis Electromusic Specialties Inc公司的发展小趣事

在全球化的大背景下,供应链管理对于企业的运营效率至关重要。CUI公司高度重视供应链的优化和管理,通过建立完善的采购、生产和销售体系,实现了原材料的稳定供应和产品的快速交付。此外,公司还积极引入先进的生产设备和信息化管理系统,提高了生产效率和产品质量,为公司的快速发展提供了有力保障。

国芯佳品公司的发展小趣事

在全球化的大背景下,供应链管理对于企业的运营效率至关重要。CUI公司高度重视供应链的优化和管理,通过建立完善的采购、生产和销售体系,实现了原材料的稳定供应和产品的快速交付。此外,公司还积极引入先进的生产设备和信息化管理系统,提高了生产效率和产品质量,为公司的快速发展提供了有力保障。

西安航天民芯公司的发展小趣事

在宇航领域,动力电池管理芯片的性能要求极高。西安航天民芯凭借其在集成电路设计领域的深厚积累,成功研发出全国第一颗宇航级动力电池管理芯片。这一突破不仅打破了国外垄断的局面,也为中国宇航事业的发展做出了重要贡献。

问答坊 | AI 解惑

三洋818s伺服电机怎样提高速度

我这有一套用溧阳92-03伺服电机改三洋818s电机的速度系统,改过后,实际速度只有原来的1/5,请教高手我该怎么处理…

查看全部问答>

LPC1300中文手册(完整版)--无广告

我整理了一下,方便大家阅读,呵呵   …

查看全部问答>

关于手机开发和JavaEE开发哪个好?

毕业在即,是选择JAVAEE的培训还是接受老师推荐,去做手机开发呢,前提是我是一个没有任何嵌入式基础的专科生。…

查看全部问答>

如何将SMDK2440变成多个版本?例如我的产品210,对应的BSP是smdk2440210,产品220对应的是smdk2440220

本人菜鸟,现在碰到一个问题,希望向大家求助一下. 现在我的wince目录中的PLATFORM只有smdk2440一个bsp,这样产生了很多不方便的地方. 第一,目前有3个系列的产品,虽然都是基于2440的,但是在BSP上,还是有些地方是不同的,要维护这三个系列的产品.虽然 ...…

查看全部问答>

DDK编译程序出现的怪现象

DDK可以编译成两种版本。一个Free另外一个好象是Checked版本 有什么不同。 有时候我用Checked编译通过  Free不能通过编译  晕。 还有 VC里面不能 _asm mov ebp,esp 不能修改ebp的值吗?…

查看全部问答>

EVC中在基于对话框的情况下,怎样不使用按钮就能读取指定的路径呢?

用按钮的打开对话框我会,但是不用按钮直接读取得就不知道怎么弄了? 那位高手可以指点一下呢? 应该用哪个函数呢?…

查看全部问答>

急!ARM D/A转换程序实现多种波形输出

ARM D/A转换程序设计 1.编程实现多种波形(正弦波信号、三角波信号、方波信号)的输出,在 DA接口利用示波器观测实验输出。 2.在 LCD上显示信号…

查看全部问答>

stm32 i2c问题

我用的是神州stm32103系列的芯片,用开发板提供的程序i2c读写的读写函数放在液晶显示初始化ili9320的初始化程序下面就不能运行,我跟踪了程序,是在i2c读写函数的checkevent这里出现死循环, 导致程序没有办法继续往下执行,求指点,很急。 ...…

查看全部问答>

AVR与液晶的直接访问和间接访问

请假,利用AVR实现与液晶屏的访问,如果采用直接访问(给液晶屏分配一个地址空间),直接接到对应的地址和数据线上,对应的RD和WR信号分别接到AVR的RD和WR上。但是如果采用间接访问的话,液晶屏幕的RD和WR信号是不是一般不能接在对应AVR的RD和WR信 ...…

查看全部问答>