历史上的今天
返回首页

历史上的今天

今天是:2025年04月10日(星期四)

正在发生

2019年04月10日 | STM32F10X EXTI控制 LED 亮灭小教程

2019-04-10 来源:eefocus

这里我用的开发板时正点原子的MiniSTM32,芯片型号为STM32F103RCT6.   This is easy, so you can do that very easily!

***REMENBER STM32 is you! :)


我们在这里进行通俗的讲解,详细的内容,可以在以后再去看STM32手册。


这里我们先介绍中断的概念,中断举个例子就是,我现在正在吃饭,这时有人敲门,那我不得不去放下碗筷去开门,然后再回来继续吃饭。那为什么需要中断呢?因为我们肯定不想吃饭的时候,总是去看下门口有没有人,这样就占用了我吃饭的时间!这点在程序中的意义是重大的!


那么我们就想如果有很多中断怎么办呢?就像我在吃饭的时候,有人敲门,但是水又开了,这两者差不多同时出现,我到底改做什么呢?这时就有优先级的概念,谁重要,我就先去做谁!


这里我们采用开关控制LED这个例子来说明GPIO  EXTI   NVIC这三个内容的一些使用方法!


我们用到的LED灯接口是PA8, 我们用到的开关是PC5,  为上拉的模式


这里的例子是开关使用 EXTI 中断控制灯的亮灭(注意这里我们这里的代码是连续的):

//@Time:2018/2/16


//@author:junwencui

//@wether: sun

//@location: yunnan


void key_Config(void){

 

    GPIO_InitTypeDef GPIO_InitStructure;

EXTI_InitTypeDef EXTI_InitStructure;

NVIC_InitTypeDef NVIC_InitStructure;


RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);            //这里最好还是打开复用

以上是配置函数的开头,首先我们定义了结构体,然后我们就需要打开时钟,这里需要注意在KEIL中,打开时钟需要放在定义结构体的后面,不然会报错!


  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;     //这里采用上拉输入模式

  GPIO_Init(GPIOC,&GPIO_InitStructure);             //初始化结构体定义

这里的模式  GPIO_Mode_IPU  是在使用上拉输入的时候使用,当然也可以使用

GPIO_Mode_IPD   下拉输入

这里的区别是你的电路硬件!


  GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource5);   //这里将EXTI映射到PC5

 

  EXTI_InitStructure.EXTI_Line = EXTI_Line5;

  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;

  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;

  EXTI_InitStructure.EXTI_LineCmd = ENABLE;

  EXTI_Init(&EXTI_InitStructure);

这里因为定义的为PC5所以相应的EXTI_Line5,我们简单采用中断模式,因为PC5 接的是上拉电阻,所以这里当然是电平下降的时候触发了!就使用EXTI_Trigger_Falling

  NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;         //这里指定外部中断 为EXTI5~9

  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;   //设置抢占优先级为2

  NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;            //设置响应优先级为0

  NVIC_InitStructure.NVIC_IRQChannelCmd =ENABLE;              //使能NVIC

  NVIC_Init(&NVIC_InitStructure);                             //初始化结构体

 

 

}

这里的外部中断,用的是EXTI_Line5, 但是stm32库函数定义了 中断线5到9 ,都用EXTI9_5_IRQn,这里其实并无大碍,因为后面的中断函数内部我们还是要进行判断的! 中断的优先级 服从的规则是: 先看抢占优先级,后看响应优先级,当抢占优先级一样时,又是同时发生,就看响应优先级。他们都是数值越小,等级越高!所以当有多个中断的时候我们需要仔细安排这些有先级。

当然我们也可以定义我们的优先级组,例子:NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); 

                                                                    //抢占优先级可选0~3,响应优先级可选0~3;

这是优先级组选择范围,千万不可以超出范围!

以上就是EXTI中断配置的内容!接下来看中断函数:

static u8 led_red_flag =0;      //此为标志位

void EXTI9_5_IRQHandler(void){

 

    delay_ms(8);    //消抖

 

   if(!GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_5) && !led_red_flag){    //读取Pin_5的状态

   

      GPIO_ResetBits(GPIOA,GPIO_Pin_8); 

     led_red_flag =1;

   

  }else if(!GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_5) && led_red_flag){

   

    GPIO_SetBits(GPIOA,GPIO_Pin_8); 

     led_red_flag =0;      

  }

  

  EXTI_ClearITPendingBit(EXTI_Line5);

}


这里中断函数是固定的,我们可以在stm32f10x_it.h里面去查看,EXTI9_5_IRQHandler 从这个名字看就是中断线5~9,和我们上面的内容保持一致! 这里的消抖是常用操作,防止干扰! 在中断函数内,都会有消除中断标志位的语句, 就是EXTI_ClearITPendingBit(EXTI_Line5);

这里是至关重要的,每次都不会少!


void led_Congfig(void){

    

   GPIO_InitTypeDef GPIO_InitStructure;   //PA8

   

   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);

 

   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;     //采用推挽输出

   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;

   GPIO_InitStructure.GPIO_Speed  =GPIO_Speed_50MHz;

   GPIO_Init(GPIOA,&GPIO_InitStructure);

 

   GPIO_SetBits(GPIOA,GPIO_Pin_8);

}

这里是配置 led 的函数,采用推挽输出,50Mhz的工作速度!

int main(){

 

    led_Congfig();

   key_Config();

 

   while(1){

  

  }

return 0;

}


这里是我们的主函数!注意这里的 while(1{}, 不可以省略,否则程序直接退出,不会运行中断!!!


推荐阅读

史海拾趣

Galaxy Microelectronics公司的发展小趣事

江苏飞翼智能科技有限公司在无人机航模领域也有着深厚的积累。公司不仅自己购买零件组装各类航模,还积极参与国内航模比赛,凭借良好的飞机性能和一流的操控技术取得了不俗的成绩。尤其是涡喷航模,作为中高级的航模产品,其高难度的特技动作展示了飞翼智能在无人机技术方面的深厚功底。这些经验积累和技术创新为飞翼智能向无人机应用型企业转型奠定了坚实基础。

Greenconn Corp公司的发展小趣事
定期清洁冰箱内部和外部的灰尘和污垢,保持散热系统的畅通。
Hi-Optel Technologly Co Ltd公司的发展小趣事
如果经检查发现继电器或定时器故障,需要按照冰箱型号和规格要求更换新的部件。
Eagle-Picher公司的发展小趣事

在第二次世界大战期间,Eagle-Picher公司利用其在材料科学方面的专长,为美国军队生产蓄电池。公司使用硅藻土和锌等材料,为军队的通信设备和其他电子设备提供可靠的电源。这一时期的业务扩张不仅增强了Eagle-Picher的技术实力,也为其在电子行业树立了良好的声誉。

EIC [EIC discrete Semiconductors]公司的发展小趣事

EIC公司一直秉持着环保责任和社会责任感。公司在生产过程中积极采用环保材料和工艺,减少废弃物排放和能源消耗。同时,EIC还积极参与社会公益活动,为社会做出了积极贡献。这些举措不仅提升了公司的社会形象,也为公司的可持续发展奠定了坚实的基础。

Diotec Electronics Corp公司的发展小趣事

随着产品的不断成熟和市场的认可,Diotec开始积极拓展国内外市场。公司加强与国际知名电子企业的合作,不断提升产品的品质和技术水平。同时,Diotec还注重品牌建设,通过一系列的市场推广活动,提高了品牌的知名度和美誉度。这些努力使Diotec的产品在电子行业中占据了重要的地位,成为众多客户的首选供应商。

问答坊 | AI 解惑

在WINCE下图片被撕裂的问题?请高手看一下代码。

我在WINCE下用DDRAW做UI,发现图片有时被撕裂了。现在我想用三缓冲的方法去做,希望能解决这个问题。可是我怎么做好像都不成功。下面是代码。还请高手看一下。 LPDIRECTDRAW4               g_ ...…

查看全部问答>

求助:大家好,我是个新新手,想请教SIM300C无线数传的问题。

大家好! 我刚刚接触SIM300C,单片机通过串口连接SIM300C,要实现数据传输应该怎样设置SIM300C?哪位专家能否给我一个设置流程,万分感谢!…

查看全部问答>

作嵌入式驱动程序,现在想转硬件设计,不知道好不好转啊

一直在作音视频驱动,总是在和硬件打交道。感觉还是硬件那边稳定,不用再学好多乱七八糟得编程语言。 python,jsp,vbscript,C#,。。。 硬件那边只要把电路搞得很通就行了。爽啊。…

查看全部问答>

图象传感器的应用

1、CMOS图象传感器是否直接可以用AVR单片机来进行采集像素数据 2、目前的摄像头,大多用DSP和FPGA做的,能否用低端的8BIT的潜入式单片机来做,如果有请专家们提供设计参考,感激不尽 3、怎样调节采集像素的速率,目前我们所用的MCU速度较慢,是否 ...…

查看全部问答>

LDO没有输出电容

New LDO Offers High Speed Performance without Output Capacitor The new XC6503 series from Torex, integrates internal phase compensation circuitry, removing the need for expensive output capacitors and dramatically ...…

查看全部问答>

好消息,TI M3的9D96终于正式推出了

昨天才出的,英文网站已经更新,中文网站还要等几天http://focus.ti.com/docs/toolsw/folders/print/dk-lm3s9d96.html?HQS=mcu_firestorm_110724&DCMP=mytinwsltr_07_25_2011&sp_rid_pod3=LTc5NzAyMjkzOAS2&sp_mid_pod3=495039…

查看全部问答>

msp430f5438测频率成功,能测60K一下频率,误差50HZ以内!

#include #include \"LCD_12864.h\" #include \"CLOCK.h\" unsigned int end,start; unsigned char overflow; unsigned long fre; int main( void ) {   // Stop watchdog timer to prevent time out reset   WDTCTL ...…

查看全部问答>

Altium 10作出来的lm3s下载器,漂亮!

atlium 作出来的lm3s下载器,漂亮!   不多说,上传图片!   [ 本帖最后由 paulhyde 于 2012-5-17 10:20 编辑 ]…

查看全部问答>

请教下关于ti官方代理商那里购买芯片要注意什么?

从公司原来的深圳提供芯片那里询了下价,比ti官方价格*汇率要高不少啊。。不知道官方代理会怎么样。。 从ti官网看的k片参考价格。正式去代理商那里下单 k片购买有问题吗?会要加钱吗?没货怎么办? 请教下关于ti官方代理商那里购买芯片要注意什么 ...…

查看全部问答>