历史上的今天
返回首页

历史上的今天

今天是:2024年09月06日(星期五)

正在发生

2019年09月06日 | STM32F249按键中断控制LED+USART中断控制LED

2019-09-06 来源:eefocus

首先,这节用移植会比较快


USART中断控制LED我很早就已经解决了,这个是在我第二版本的基础上,将按键变成了中断,就这么简单,话不多说,开始


1.需要移植的文件首先是bsp_exti.c


/**

  ******************************************************************************

  * @file    bsp_exti.c

  * @author  fire

  * @version V1.0

  * @date    2015-xx-xx

  * @brief   I/O线中断应用bsp

  ******************************************************************************

  * @attention

  *

  * 实验平台:秉火  STM32 F429 开发板 

  * 论坛    :http://www.firebbs.cn

  * 淘宝    :https://fire-stm32.taobao.com

  *

  ******************************************************************************

  */

  

#include "./key_exti/bsp_exti.h"


 /**

  * @brief  配置嵌套向量中断控制器NVIC

  * @param  无

  * @retval 无

  */

static void NVIC_Configuration(void)

{

  NVIC_InitTypeDef NVIC_InitStructure;

  

  /* 配置NVIC为优先级组1 */

  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

  

  /* 配置中断源:按键1 */

  NVIC_InitStructure.NVIC_IRQChannel = KEY1_INT_EXTI_IRQ;

  /* 配置抢占优先级:1 */

  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;

  /* 配置子优先级:1 */

  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;

  /* 使能中断通道 */

  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

  NVIC_Init(&NVIC_InitStructure);

  

  /* 配置中断源:按键2,其他使用上面相关配置 */  

  NVIC_InitStructure.NVIC_IRQChannel = KEY2_INT_EXTI_IRQ;

  NVIC_Init(&NVIC_InitStructure);

}


 /**

  * @brief  配置 PA0 为线中断口,并设置中断优先级

  * @param  无

  * @retval 无

  */

void EXTI_Key_Config(void)

{

    GPIO_InitTypeDef GPIO_InitStructure; 

    EXTI_InitTypeDef EXTI_InitStructure;

  

    /*开启按键GPIO口的时钟*/

    RCC_AHB1PeriphClockCmd(KEY1_INT_GPIO_CLK|KEY2_INT_GPIO_CLK ,ENABLE);

  

  /* 使能 SYSCFG 时钟 ,使用GPIO外部中断时必须使能SYSCFG时钟*/

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);

  

  /* 配置 NVIC */

  NVIC_Configuration();

    

    //配置GPIO

  

    /* 选择按键1的引脚 */ 

  GPIO_InitStructure.GPIO_Pin = KEY1_INT_GPIO_PIN;

  /* 设置引脚为输入模式 */ 

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;                

  /* 设置引脚不上拉也不下拉 */

  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;

  /* 使用上面的结构体初始化按键 */

  GPIO_Init(KEY1_INT_GPIO_PORT, &GPIO_InitStructure); 

    

    //配置EXTI中断源1


    /* 连接 EXTI 中断源 到key1引脚 */

  SYSCFG_EXTILineConfig(KEY1_INT_EXTI_PORTSOURCE,KEY1_INT_EXTI_PINSOURCE);


  /* 选择 EXTI 中断源 */

  EXTI_InitStructure.EXTI_Line = KEY1_INT_EXTI_LINE;

  /* 中断模式 */

  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;

  /* 下降沿触发 */

  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;  

  /* 使能中断/事件线 */

  EXTI_InitStructure.EXTI_LineCmd = ENABLE;

  EXTI_Init(&EXTI_InitStructure);

  

    

        //配置EXTI中断源2以及相应的GPIO口

    

  /* 选择按键2的引脚 */ 

  GPIO_InitStructure.GPIO_Pin = KEY2_INT_GPIO_PIN;  

  /* 其他配置与上面相同 */

  GPIO_Init(KEY2_INT_GPIO_PORT, &GPIO_InitStructure);      


    /* 连接 EXTI 中断源 到key2 引脚 */

  SYSCFG_EXTILineConfig(KEY2_INT_EXTI_PORTSOURCE,KEY2_INT_EXTI_PINSOURCE);


  /* 选择 EXTI 中断源 */

  EXTI_InitStructure.EXTI_Line = KEY2_INT_EXTI_LINE;

  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;

  /* 上升沿触发 */

  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;  

  EXTI_InitStructure.EXTI_LineCmd = ENABLE;

  EXTI_Init(&EXTI_InitStructure);

}

/*********************************************END OF FILE**********************/

 


2.接着是bsp_exti.h


#ifndef __EXTI_H

#define    __EXTI_H


#include "stm32f4xx.h"


//引脚定义

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

#define KEY1_INT_GPIO_PORT                GPIOA

#define KEY1_INT_GPIO_CLK                 RCC_AHB1Periph_GPIOA

#define KEY1_INT_GPIO_PIN                 GPIO_Pin_0

#define KEY1_INT_EXTI_PORTSOURCE          EXTI_PortSourceGPIOA

#define KEY1_INT_EXTI_PINSOURCE           EXTI_PinSource0

#define KEY1_INT_EXTI_LINE                EXTI_Line0

#define KEY1_INT_EXTI_IRQ                 EXTI0_IRQn


#define KEY1_IRQHandler                   EXTI0_IRQHandler


#define KEY2_INT_GPIO_PORT                GPIOC

#define KEY2_INT_GPIO_CLK                 RCC_AHB1Periph_GPIOC

#define KEY2_INT_GPIO_PIN                 GPIO_Pin_13

#define KEY2_INT_EXTI_PORTSOURCE          EXTI_PortSourceGPIOC

#define KEY2_INT_EXTI_PINSOURCE           EXTI_PinSource13

#define KEY2_INT_EXTI_LINE                EXTI_Line13

#define KEY2_INT_EXTI_IRQ                 EXTI15_10_IRQn


#define KEY2_IRQHandler                   EXTI15_10_IRQHandler


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



void EXTI_Key_Config(void);


#endif /* __EXTI_H */

 


在移植的过程中,一定要注意在user文件夹当中,这两个文件需要放置在你新建的一个文件夹中,所以头文件的书写要注意哟


 


3.再在stm32f4xx_it.c文件中,添加两个中断的函数。中断服务函数的书写,依旧是重点考虑中断标志位和中断函数名字!!!而且别忘记了中断里面产生的哪些行为所要的头文件哟


 


#include "./key_exti/bsp_exti.h"


void EXTI0_IRQHandler(void)

{

  //确保是否产生了EXTI Line中断

    if(EXTI_GetITStatus(KEY1_INT_EXTI_LINE) != RESET) 

    {

        // LED1 取反        

        LED1_TOGGLE;

    //清除中断标志位

        EXTI_ClearITPendingBit(KEY1_INT_EXTI_LINE);     

    }  

}


void  EXTI15_10_IRQHandler(void)

{

  //确保是否产生了EXTI Line中断

    if(EXTI_GetITStatus(KEY2_INT_EXTI_LINE) != RESET) 

    {

        // LED2 取反        

        LED3_TOGGLE;

    //清除中断标志位

        EXTI_ClearITPendingBit(KEY2_INT_EXTI_LINE);     

    }  

}


4.在最后的main文件中,需要添加的是:


#include "./key_exti/bsp_exti.h"


    EXTI_Key_Config();


大功告成!!写了中断服务函数以后,程序从main开始以后直接进入中断哟


推荐阅读

史海拾趣

EMMICRO公司的发展小趣事

作为一家具有社会责任感的企业,EMMICRO公司始终关注环保和社会公益事业。公司积极参与环保活动和公益捐赠,推动企业的可持续发展和社会进步。同时,公司还积极承担对员工的培训和发展责任,为员工提供良好的职业发展平台和福利待遇。这种对社会责任的担当也赢得了社会的广泛赞誉和尊重。

EMC Technology RF Labs公司的发展小趣事

在追求经济效益的同时,RF Labs也注重可持续发展和环保责任。他们积极采用环保材料和绿色生产工艺,降低生产过程中的能耗和排放。同时,RF Labs还积极参与环保公益活动,推动电子行业的绿色发展。这些举措不仅体现了RF Labs的社会责任感,也为公司的长期发展奠定了坚实的基础。

Antex公司的发展小趣事

随着业务的不断扩展,Antex在1980年决定将工厂从东京都大田区羽田迁至茨城县高萩市。这一搬迁不仅为公司提供了更广阔的发展空间,也标志着Antex开始向着全球化布局迈进。此后,公司积极寻求国际合作,与全球各地的供应商和客户建立了紧密的合作关系。

Cressall Power Resistors公司的发展小趣事

Cressall一直注重企业文化建设和团队建设。公司倡导“创新、协作、诚信、责任”的核心价值观,鼓励员工勇于创新、敢于担当。同时,公司还加强了对员工的培训和激励,为员工提供了良好的职业发展平台。这些措施有效提升了员工的凝聚力和归属感,为公司的持续发展提供了有力的人才保障。

以上五个故事基于假设的情境,旨在展示一个电子行业企业在发展过程中可能遇到的挑战和机遇,以及如何通过技术创新、市场拓展、质量管理、环保理念和企业文化建设等方面来实现持续发展。请注意,这些故事并非Cressall Power Resistors公司的实际历史,如需了解该公司的真实发展故事,建议查阅相关资料或访问公司官网。

Antelec公司的发展小趣事

在电子行业竞争日益激烈的环境下,Antelec公司深知持续创新的重要性。公司不断加大研发投入,引进先进的研发设备和人才,推动技术升级和产品创新。同时,公司还积极关注行业发展趋势和客户需求变化,及时调整产品策略和市场布局,保持了在市场中的领先地位。

American Power Design Inc公司的发展小趣事

在电子行业的早期,American Power Design Inc(简称APDI)由一群热衷于电力电子技术的工程师创立。他们研发出了一种高效的电源管理芯片,显著降低了电子设备的能耗和热量产生。这一创新很快吸引了市场的关注,APDI迅速获得了多家大型电子制造商的合作意向。随着技术的不断完善和市场的扩大,APDI逐渐在电源管理领域建立了领导地位。

问答坊 | AI 解惑

汽车电子上下游寻求联动2

摩托罗拉(中国)电子有限公司副总裁及总经理林信孚:    车载通信系统在中国发展前景巨大   摩托罗拉不只在无线通信、宽带通信领域具备相当经验和相当 实力,业已在汽车电子市场浸润了七十多年,在汽车通信领域也奠定 了其领先地位。摩 ...…

查看全部问答>

关于汇编语言转换为C语言

我有一个程序是用汇编写的(网上下载的),本人不会汇编,那位老师汇编好,帮忙看看,能不能翻译一下: ;************************************* ;STC89C51RC单片机,6M晶振 ;CH375A,D0--D7接S51,P2.0--P2.7 ;P0.7为红外输入 ;P0.6为无线电信 ...…

查看全部问答>

新手求助:Wince下的网络编程

要开发一个类似C/S模式的网络软件 我刚开始接触 什么都不了解 不知哪位达人能发个简单的例程给我看看?? …

查看全部问答>

请教

我用EVC 4编译了一个程序,如何从PC机上传送到硬件设备上,除了生成的EXE文件,还用到哪个DLL文件,请指点. 我的平台是用了WINCE 4.1模拟器,如果用VS2003开发的话除了EXE文件还需要哪个DLL文件,谢谢!…

查看全部问答>

关于单片机向串口发送数据的问题

我想用单片机(89c51)用下面的代码向串口发送数据,可不知道为什么不行。 不仅不能发送字符串,就连16进制的数都不能发。 main() {         TMOD=0x20;         TH1=0xe8;       &nb ...…

查看全部问答>

诚聘嵌入式开发人员,急急。。。

上海 外企诚聘嵌入式开发工程师/嵌入式开发主管,薪资是OPEN的,可以达到15K左右 1,主管(高级嵌入式开发软件工程师)   本科5年以上(不要求英文) 职位描述: 1、负责软件产品的系统分析和架构设计 2、指导工程师进行模块设计,解决工作 ...…

查看全部问答>

wince数据库,附代码,请教

{                 DWORD err = GetLastError();                 if…

查看全部问答>

MSP430F169如何与ADS931(一款AD芯片)连接

本人欲采用外部的AD模块进行模数转换,ADC芯片是TI的ADS931——我的办法是数据口与430的IO直接连,这样连接是否有问题?第二个问题是ADS931的CLK引脚和430该如何连接?谢谢 [ 本帖最后由 周星星在哈工程 于 2011-8-23 14:58 编辑 ]…

查看全部问答>

msp430单片机18B20测温程序

msp430单片机18B20测温程序 #include \"msp430x22x4.h\" typedef unsigned char uchar; typedef unsigned int  uint; #define DQ1 P2OUT |= BIT4 #define DQ0 P2OUT &= ~BIT4 #define DQ_in   P2DIR &= ~BIT4 #define DQ_o ...…

查看全部问答>