历史上的今天
返回首页

历史上的今天

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

2020年02月03日 | STM32单片机实现外部中断的步骤及方法

2020-02-03 来源:elecfans

先从最简单的问题开始,用STM32外部中断的方法实现PB.0按键控制PA.0LED灯:

先总的说下实现中断的步骤:


1,配置NVIC寄存器(函数),设置中断为第几组,占先优先级和次优先级;

函数方法:

void NVIC_Configuration()

{

NVIC_InitTypeDef NVIC_InitStruct;

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

NVIC_InitStruct.NVIC_IRQChannel=EXTI0_IRQn;

NVIC_InitStruct.NVIC_IRQChannelPreempTIonPriority=0;

NVIC_InitStruct.NVIC_IRQChannelSubPriority=1;

NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;

NVIC_Init(&NVIC_InitStruct);

}

以上为配置优先级的一般步骤:设置优先级分组,设置中断通道,分别设置先占优先级,次占优先级,使能等;

STM32单片机实现外部中断的步骤及方法

2,配置EXTI寄存器及(函数),设置中断线,中断方式,等;

voidEXTI_Configuration()

{

EXTI_InitTypeDefEXTI_InitStructure;

EXTI_ClearITPendingBit(EXTI_Line0);

GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource0);

EXTI_InitStructure.EXTI_Line=EXTI_Line0;

EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;

EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;

EXTI_InitStructure.EXTI_LineCmd=ENABLE;

EXTI_Init(&EXTI_InitStructure);

}

和配置NVIC一样,这也是EXTI配置的一般步骤:清除相应中断线标志位(这个很重要,刚开始一直没找到这个问题),联结端口与中断线(也可以在GPIO初始化时配置),选择中断线,设置中断模式,中断方式,使能等;


3,写中断服务函数

中断服务程序一般写在STM32F10X_it.c文件里:

voidEXTI0_IRQHandler(void)

{

if(EXTI_GetITStatus(EXTI_Line0)==SET)

{

EXTI_ClearITPendingBit(EXTI_Line0);

if(GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_0)==Bit_RESET)

{

GPIO_SetBits(GPIOA,GPIO_Pin_0);

}

else

{

GPIO_ResetBits(GPIOA,GPIO_Pin_0);

}

}

}


其中最重要的一点:需要注意进入服务程序后清除中断标志位;

说几点容易忽略的地方:

1.中断服务程序一定要清除中断标志位;

2.联结相应端口与中断线;

3.按键端口设置成上拉输入;

4.在配置EXTI时清除中断标志位;

按键部分的短路自己连的:

STM32单片机实现外部中断的步骤及方法

下面是直接操作寄存器的方法:

1.GPIO初始化:这里只要注意GPIOB.0设置成上拉输入(不光要设置GPIOB-》CRL=0X08,还要设置GPIOB-》ODR=0X01,为了和下拉区分)

voidGPIO_Config()

{

GPIOA-》CRL=0X03;

GPIOA-》ODR=0X01;

GPIOB-》CRL=0X08;

GPIOB-》ODR=0X01;

}

2. NVIC 初始化:

直接上代码:

voidNVIC_Configuration()

{

u32temp;

temp=SCB-》AIRCR;

temp&=0x0000f8ff;

temp|=0x05fa0000;

temp|=0x0700;

SCB-》AIRCR=temp;

NVIC-》ISER[0]=1《《6;

NVIC-》IP[1]=0;

}

3. EXTI初始化

和用函数方法差不多,设置几个寄存器;有点不明白的是这里好像可以不用清除标志位;

voidEXTI_Configuration()

{

AFIO-》EXTICR[0]=0X0001;

EXTI-》IMR=0X01;

EXTI-》RTSR=0X01;

}

然后是中断服务程序:

voidEXTI0_IRQHandler(void)

{

if(EXTI_GetITStatus(EXTI_Line0)==SET)

{

EXTI-》PR=0X01;

if(GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_0)==Bit_RESET)

{

GPIO_SetBits(GPIOA,GPIO_Pin_0);

}

else

{

GPIO_ResetBits(GPIOA,GPIO_Pin_0);

}

}

}

下面是整个用函数代码:

#include“stm32f10x.h”

voidGPIO_Config();

voidNVIC_Configuration();

voidEXTI_Configuration();

voidSysclkConfiguration();

intmain()

{

SysclkConfiguration();

GPIO_Config();

EXTI_Configuration();

NVIC_Configuration();

while(1);

return0;

}

voidSysclkConfiguration()

{

RCC_DeInit();

RCC_HSEConfig(RCC_HSE_ON);

if(RCC_WaitForHSEStartUp()==SUCCESS)

{

RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);

RCC_PLLCmd(ENABLE);

while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET);

RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

while(RCC_GetSYSCLKSource()!=0X08);

RCC_HCLKConfig(RCC_SYSCLK_Div1);

RCC_PCLK1Config(RCC_HCLK_Div2);

RCC_PCLK2Config(RCC_HCLK_Div1);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO,ENABLE);

}

}

voidGPIO_Config()

{

GPIO_InitTypeDefGPIO_InitStructure;

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_10MHz;

GPIO

推荐阅读

史海拾趣

Alpha & Omega Semiconductor(万国半导体)公司的发展小趣事

Alpha & Omega Semiconductor(简称AOS)是一家全球领先的半导体公司,致力于设计、制造和销售高性能、高可靠性的功率半导体产品。以下是Alpha & Omega Semiconductor公司发展的相关故事:

  1. 公司成立和早期发展: Alpha & Omega Semiconductor公司于2000年成立于美国加利福尼亚州的Santa Clara市。公司成立之初,专注于研发和生产功率半导体器件,包括功率MOSFET、IGBT、功率IC和电源管理器件等。通过不断创新和技术突破,公司迅速在市场上建立了良好的声誉,并吸引了投资者的关注。

  2. 技术创新和产品发展: Alpha & Omega Semiconductor公司在功率半导体领域不断进行技术创新和产品研发。他们不断推出新的产品系列,包括低压、中压和高压功率MOSFET、IGBT和功率集成电路等,以满足不同应用领域的需求。公司还专注于提高产品性能、降低功耗,并不断优化产品结构和工艺流程。

  3. 全球化布局和生产基地: 随着业务的不断扩张,Alpha & Omega Semiconductor公司逐步建立了全球化的运营和生产体系。除了总部位于美国的研发中心外,公司还在亚洲地区建立了多个生产基地和销售办事处,包括中国、台湾、韩国和菲律宾等地。这些生产基地不仅提高了产品供应的灵活性和效率,还加强了与当地客户和合作伙伴的合作关系。

  4. 持续投入研发和创新: Alpha & Omega Semiconductor公司持续投入大量资源用于研发和创新,致力于提供行业领先的功率半导体解决方案。公司与全球顶尖的研究机构和合作伙伴合作,共同探索新的材料、工艺和器件结构,以应对不断变化的市场需求和技术挑战。通过持续的技术创新,公司不断拓展产品线,拓展业务领域,并保持了在市场上的竞争优势。

  5. 持续发展和业务拓展: Alpha & Omega Semiconductor公司持续保持业务的稳健增长和发展态势,不断拓展业务范围和市场份额。公司在汽车电子、工业控制、通信设备、消费电子和电源供应等领域取得了广泛的应用,成为了全球领先的功率半导体供应商之一。同时,公司还通过并购和合资等方式,加速业务拓展,拓展了在新兴领域的市场地位。

以上是Alpha & Omega Semiconductor公司发展的相关故事,展示了他们在功率半导体领域的持续创新和不断发展的势头。

BUSSMANN公司的发展小趣事

随着全球经济的不断融合和发展,Bussmann公司也开始了其全球化战略。公司在全球范围内设立生产基地和研发中心,吸引和培养了大量的优秀人才。同时,公司也加大了对新技术和新产品的研发投入,不断推出具有竞争力的新产品。在全球市场上,Cooper Bussmann的电路保护方案广泛应用于各行各业,并获得了UL、CE、CSA等认证机构的认可。

这些故事展示了BUSSMANN公司在电子行业中的发展历程和取得的成就。从创业初期的艰辛与坚持,到汽车熔断器的崛起,再到库柏工业的收购与融合,以及芯片保险丝的创新突破和全球化战略的实施,BUSSMANN公司始终秉持着创新、质量和服务的理念,不断推动电子行业的发展和进步。

请注意,以上故事是基于BUSSMANN公司的历史和发展情况创作的,具体细节可能并不完全准确。如需了解更多关于BUSSMANN公司的信息,建议查阅相关的历史资料或访问其官方网站。

ECLIPTEK公司的发展小趣事

为了进一步扩大市场份额,ECLIPTEK公司决定实施国际扩张战略。公司先后在亚洲、欧洲和北美等地设立了分支机构,并在当地建立了生产基地。为了更好地满足当地客户的需求,ECLIPTEK还实施了本地化战略,根据市场特点调整产品设计和生产流程。这一举措不仅提高了公司的市场覆盖率,还增强了其国际竞争力。

博通集成(BEKEN)公司的发展小趣事

博通集成自成立以来,始终致力于无线通讯技术的研发与创新。公司团队不断攻克技术难关,推出了多款具有市场竞争力的产品。其中,公司自主研发的首款Wi-Fi宽带收发样片在2015年成功通过测试,这一技术突破为公司在无线通讯领域的发展奠定了坚实基础。此后,公司不断推出创新产品,涵盖无线数传芯片和无线音频芯片等多个领域,广泛应用于智能家居、智能交通等领域。

超音(CY)公司的发展小趣事

品质是超音一直以来的追求。公司注重产品质量管理,建立了完善的质量检测体系,确保每一件产品都符合高标准的质量要求。同时,超音还加强了品牌建设,通过广告宣传、赞助活动等方式提升品牌知名度和美誉度。这些努力使得超音在消费者心中树立了良好的品牌形象,为公司的长期发展奠定了坚实的基础。

Flambeau公司的发展小趣事

在追求经济效益的同时,Flambeau公司始终不忘履行社会责任和环保使命。公司积极响应全球可持续发展号召,将环保理念融入产品研发、生产和销售的各个环节。通过采用环保材料、优化生产工艺、推广循环经济等措施,Flambeau有效降低了产品生命周期中的环境影响。此外,公司还积极参与环保公益活动和社会责任项目,为推动电子行业的绿色可持续发展贡献力量。

问答坊 | AI 解惑

USB接口中文资料

USB接口中文资料…

查看全部问答>

分频程序老编译不过去,,如何整????

library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity fenpin is port(clk:in std_logic;--输入时钟 cmd:in std_logic_vector(7 downto 0);--分频指令cmd clkout:out std_logic);--输出时钟 end fenpin; ...…

查看全部问答>

STM32芯片的看门狗与休眠的冲突

各位大虾:      最近要做一个手持设备,需要使用stm32F103的STOP模式,但同时我又开了独立看门狗,每当我一进入STOP模式看门狗马上就给我复位了,我怎样才能在进入STOP模式的时候让看门狗不起作用啊?…

查看全部问答>

外企招聘工程师

某大型美资企业,诚聘英才:待遇在行业内属领先水平,人性化管理,弹性工作制,能 接触到世界尖端技术;一年多次出国培训、旅游机会,可以解决深圳户口。招聘职位如下, 有意向加入者请将简历发送至:sunny.yang@51job.com,我们会尽快与您联系。1. ...…

查看全部问答>

C语言的视频那位仁兄在网上看到有

单片机的C语言的却是个好东西,自学有点难,偶尔在网上看到有个视频讲座.很好.可惜.当时没有把网给记下来.现在找,可就是找不到了.那位仁兄如果知道有这方面的视频讲座,请告诉我约.在下谢谢你了!…

查看全部问答>

调试st的用uart的IAP出问题

是不是  直接把程序通过jlink下载到班子上,然后再调试。怎么我下完后,屏幕白屏。   我还是搞不懂,到底是怎么个演示顺序。         希望大家弄过的帮帮忙!…

查看全部问答>

在TI或者RFSTORM电池板BB运行上Light_switch程序

以前的帖子,重新整理到这个版面。   在TI或者RFSTORM电池板BB运行上TI CC2530CC2530-Software Examples中light_switch程序的方法。ZBDC51BB(SMARTRF05BB)板和ZBDC51MB(SMARTRF05EB)最主要的区别就是有没有LCD显示。TI的Light_Switch默 ...…

查看全部问答>

低价出售相关芯片

本帖最后由 paulhyde 于 2014-9-15 09:11 编辑 低价出售相关MAXIN,LINEAR,TI相关运放芯片,另外还有一些滤波器芯片,具体有需要请联系 QQ 240341406  …

查看全部问答>

mov a,#83h

8051系统中 mov a,#83h mov ip ,a 问:执行以上程序后,中断优先级高的是————————;中断优先级低的是————————————————;…

查看全部问答>

DS18B20调试通过

#include                         //包含\"位\"操作头文件 #include #include #include \"xianshi.c\" #define uchar unsigned char        #define ui ...…

查看全部问答>