博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
EXTI中断开关点亮LED源码
阅读量:5166 次
发布时间:2019-06-13

本文共 3327 字,大约阅读时间需要 11 分钟。

在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 
#include "bsp_led.h"#include "bsp_exit.h"int main(void){ // 来到这里的时候,系统的时钟已经被配置成72M。 LED_GPIO_Config(); GPIOA_EXTI_Config(); LED_OFF; while(1){ }}

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!=0;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无限循环空操作.

 

 

 

 

转载于:https://www.cnblogs.com/wenshinlee/p/8922412.html

你可能感兴趣的文章
WP开发图片保存到独立存储并从独立存储中读取
查看>>
TYVJ-P1864 守卫者的挑战 题解
查看>>
【福利】论机房如何关闭方正软件保护卡
查看>>
Android自定义控件:动画类(六)----ValueAnimator高级进阶(一)
查看>>
五一放假作业4.30 用正则表达式写一个计算器!去掉括号,计算式子结果!
查看>>
51Nod1353 树
查看>>
Jzoj5455【NOIP2017提高A组冲刺11.6】拆网线
查看>>
Android 聊天室(一)
查看>>
web性能优化
查看>>
用SugarORM快速开发需要同步和保存大量数据的Android互联网客户端
查看>>
单实例和多实例的区别以及用途
查看>>
ETHREAD APC 《寒江独钓》内核学习笔记(4)
查看>>
Tensorflow做阅读理解与完形填空
查看>>
[RxJS] Stream Processing With RxJS vs Array Higher-Order Functions
查看>>
特定字符序列的判断(1028)
查看>>
记一次报错信息
查看>>
判断数组内是否有几个元素之和等于m
查看>>
ExtJS(三)Ext.MessageBox工具类举例
查看>>
条件、循环、函数定义 练习
查看>>
RestAssured接口自动化测试之基础方法
查看>>