在KEY点亮LED源码的基础上

USER下新建EXIT文件夹,新建bsp_exit.c和bsp_exit.h,添加到工程中(魔术棒添加头文件所在文件夹)

bsp_exit.h内容

#ifndef BSP_EIXT_H_
#define BSP_EIXT_H_ #include "stm32f10x.h" void GPIOA_EXTI_Config(void);
void EXTI_NVIC_config(void);
#endif

bsp_exit.c内容

#include "bsp_exit.h"

void GPIOA_EXTI_Config(){

	 GPIO_InitTypeDef GPIO_InitStruct;
EXTI_InitTypeDef EXTI_InitStruct; //变量声明不允许在语句执行之后 EXTI_NVIC_config();
//初始化GPIOC
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0;
GPIO_Init(GPIOA, &GPIO_InitStruct); //初始化GPIOC_13做为EXTI的输入线
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); EXTI_InitStruct.EXTI_Line=EXTI_Line0;
EXTI_InitStruct.EXTI_LineCmd=ENABLE;
EXTI_InitStruct.EXTI_Mode=EXTI_Mode_Interrupt;
EXTI_InitStruct.EXTI_Trigger=EXTI_Trigger_Rising;
EXTI_Init(&EXTI_InitStruct);
} static void EXTI_NVIC_config(){ //只能被本文将内的调用
NVIC_InitTypeDef NVIC_InitStruct;
NVIC_PriorityGroupConfig( NVIC_PriorityGroup_1); NVIC_InitStruct.NVIC_IRQChannel= EXTI0_IRQn; //设置中断源注意(就是EXTI输入线)
NVIC_InitStruct.NVIC_IRQChannelCmd= ENABLE ; //打开
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority= 1 ;
NVIC_InitStruct.NVIC_IRQChannelSubPriority= 1 ; NVIC_Init(&NVIC_InitStruct);
}

sstm32f10x_it.c(引入LED和EXTI的相应头文件)

 void EXTI0_IRQHandler(void){
if(EXTI_GetITStatus(EXTI_Line0)!=RESET){ //判断中断源是否为点亮LED的中断源
LED_TOGGLE;
}
EXTI_ClearITPendingBit(EXTI_Line0);//清除中断 }

main函数内容

#include "stm32f10x.h"   // 相当于51单片机中的  #include <reg51.h>
#include "bsp_led.h"
#include "bsp_exit.h" int main(void)
{
// 来到这里的时候,系统的时钟已经被配置成72M。
LED_GPIO_Config();
GPIOA_EXTI_Config();
LED_OFF;
while(){ }
}

bsp_led.c内容

#include "bsp_led.h"

void LED_GPIO_Config(){
GPIO_InitTypeDef GPIO_InitStruct; RCC_APB2PeriphClockCmd(LED_GPIOC_CLOCK, ENABLE);
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Pin=LED_GPIO_PIN;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(LED_GPIO_PORT, &GPIO_InitStruct);
} void Delay( uint32_t count){
for( ;count!=;count--); }

bsp_led.h内容

#ifndef BSP_LED_H_
#define BSP_LED_H_ #include "stm32f10x.h" #define LED_GPIO_PIN GPIO_Pin_2
#define LED_GPIO_PORT GPIOC
#define LED_GPIOC_CLOCK RCC_APB2Periph_GPIOC #define digitalHi(p,i) {p->BSRR=i;}
#define digitalToggle(p,i) {p->ODR ^=i;}
#define digitalLo(p,i) {p->BRR=i;} #define LED_OFF digitalHi(LED_GPIO_PORT,LED_GPIO_PIN)
#define LED_ON digitalLo(LED_GPIO_PORT,LED_GPIO_PIN)
#define LED_TOGGLE digitalToggle(LED_GPIO_PORT,LED_GPIO_PIN)
void LED_GPIO_Config(void);
void Delay( uint32_t count); #endif

总结

1-初始化要连接到EXTI的GPIO

初始化GPIO(配置为浮空输入,无速度),调用GPIO_EXTILineConfig( , ),将该GPIO作为输入线连接到EXTI输入线上;

开启相应的时钟.(外设都要有时钟)

2-初始化EXTI用于产生中断/事件

EXTI_Linex  x为0-19

开启相应的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE)

3-初始化NVIC,用于处理中断

初始化EXTI 和NVIC(NVIC_PriorityGroupConfig( )设置其优先级不在结构体中)结构体, (并在EXIT中调用NVIC的初始化函数).

初始化NVIC结构体时候,特别注意NVIC_IRQChannel的值不是递增的规律, EXTI15_10_IRQn ,EXTI9_5_IRQn  EXTIx_IRQn x为0-4

(内核外设没有时钟)

4-编写中断服务函数

中断服务函数的名字要在启动文件(startup_stm32f10x_hd.s)中需要,一定要对照好,否则即便是错误的也不会报错. 同NVIC的中断源一样也不是递增的.

步骤一般为先判断是否有中断,然后执行中断内容,最后清除中断.
5-main函数

调用LED和EXTI初始化函数,while无限循环空操作.

EXTI中断开关点亮LED源码的更多相关文章

  1. 琐碎-将hadoop源码作为工程导入eclipse

    之前写过如何用eclipse看hadoop源码,虽然非官方版的,但是可以达到目的,最重要是简单方便快速 官方版(hadoop2.2.0)的也有: 源码目录为: 和之前的源码目录有很大的不同 编译的时候 ...

  2. [一起读源码]走进C#并发队列ConcurrentQueue的内部世界

    决定从这篇文章开始,开一个读源码系列,不限制平台语言或工具,任何自己感兴趣的都会写.前几天碰到一个小问题又读了一遍ConcurrentQueue的源码,那就拿C#中比较常用的并发队列Concurren ...

  3. 全网最详细的AbstractQueuedSynchronizer(AQS)源码剖析(二)资源的获取和释放

    上期的<全网最详细的AbstractQueuedSynchronizer(AQS)源码剖析(一)AQS基础>中介绍了什么是AQS,以及AQS的基本结构.有了这些概念做铺垫之后,我们就可以正 ...

  4. JUC锁:核心类AQS源码详解

    目录 1 疑点todo和解疑 2 AbstractQueuedSynchronizer学习总结 2.1 AQS要点总结 2.2 细节分析 2.2.1 插入节点时先更新prev再更新前驱next 2.2 ...

  5. imx6ul linux4.1.15 LED驱动配置及heartbeat源码分析【转】

    本文转载自:https://blog.csdn.net/u010444107/article/details/78328807 1)查看内核配置wujun@wj-vBox:~/freescale/li ...

  6. 鸿蒙内核源码分析(中断管理篇) | 江湖从此不再怕中断 | 百篇博客分析OpenHarmony源码 | v44.02

    百篇博客系列篇.本篇为: v44.xx 鸿蒙内核源码分析(中断管理篇) | 江湖从此不再怕中断 | 51.c.h .o 硬件架构相关篇为: v22.xx 鸿蒙内核源码分析(汇编基础篇) | CPU在哪 ...

  7. 基于ReentrantLock的AQS的源码分析(独占、非中断、不超时部分)

    刚刚看完了并发实践这本书,算是理论具备了,看到了AQS的介绍,再看看源码,发现要想把并发理解透还是很难得,花了几个小时细分析了一下把可能出现的场景尽可能的往代码中去套,还是有些收获,但是真的很费脑,还 ...

  8. linux中断源码分析 - 软中断(四)

    本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 在上一篇文章中,我们看到中断实际分为了两个部分,俗称就是一部分是硬中断,一部分是软中断.软中断是专门用于处理中断 ...

  9. linux中断源码分析 - 中断发生(三)

    本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 回顾 上篇文章linux中断源码分析 - 初始化(二)已经描述了中断描述符表和中断描述符数组的初始化,由于在初始 ...

随机推荐

  1. Layui + 微信小程序 + PC端 + GatewayWorker + 移动端即时聊天系统

  2. 米津玄師 - Lemon

    Lemon 词:米津玄師 曲:米津玄師 夢(ゆめ)ならば どれほどよかったでしょう 未(いま)だにあなたのことを夢(ゆめ)にみる 忘(わす)れた物(もの)を 取(と)りに帰(かえ)るように 古(ふる) ...

  3. python人生如初见之初见yield

    今天学习爬虫Scrapy框架搭建的时候,了解了yield的用法.了解一个东西,无外乎 WHAT? HOW? WHY? WHAT yield英文意思是屈服,退位,放弃.额...其实它是Python中的一 ...

  4. mybatis设置Map空值返回

    mybatis时,设置Map返回,当值为空时属性也会没有 在application.properties中加入下面配置,将会解决这个问题. #当查询数据为空时字段返回为null,不加这个查询数据为空时 ...

  5. delphi 解决android 9上无法使用http协议

    delphi 解决android 9上无法使用http协议 安卓9不让客户端通过非https方式访问服务端数据(不允许发送明文http请求)的问题. 解决方法: 1.选择安卓平台编译一次程序,在项目根 ...

  6. ST Debug (printf) Viewer for Jlink

    Debug (printf) Viewer http://www.keil.com/support/man/docs/uv4/uv4_db_dbg_serialwin.htm Serial Windo ...

  7. laravel 查询数据库first()返回的数据转数组

    使用 get_object_vars()可以将他抓转为数组get_object_vars — 返回由对象属性组成的关联数组: 在laravel中其实还可以用 toArray(); json_decod ...

  8. 知乎千万级高性能长连接网关 https://zhuanlan.zhihu.com/p/66807833

    知乎千万级高性能长连接网关揭秘 9 天前 · 来自专栏 知乎技术专栏 实时的响应总是让人兴奋的,就如你在微信里看到对方正在输入,如你在王者峡谷里一呼百应,如你们在直播弹幕里不约而同的 666,它们的背 ...

  9. wordpress插件开发流程梳理

    1.声明一个插件 首先我们必须明白,wordpress的插件可以是单文件,也可以是多文件,css/html都不是必须的,以下举例暂且在单文件模式下 比如我们要创建一个名为 hellophp的插件,那我 ...

  10. Android:导入所需的系统jar包到Android studio

    1. 修改对于的AIDL文件,根据编译信息获知所需的jar包. mmm /frameworks/base/ show commands > log.txt 2>&1 out/tar ...