stm32中断学习总结

发布者:Huixin8888最新更新时间:2017-09-13 来源: eefocus关键字:STM32  中断学习 手机看文章 扫描二维码
随时随地手机看文章

经过了两天,终于差不多能看懂32的中断了,由于是用的库函数操作的,所以有些内部知识并没有求甚解,只是理解知道是这样的。但对于要做简单开发的我来说这些已经够了。


我学习喜欢从一个例程来看,下面的程序是我粘贴但是改编的,大部分都做了注释。

主要是感谢这位博主的文章:http://www.cnblogs.com/chineseboy/archive/2013/03/14/2956782.html

其实主要步骤就是:

1、将GPIO口配置成中断输入模式。

void Init_LED(void)
{
GPIO_InitTypeDef GPIO_InitStructure; //定义一个GPIO结构体变量

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE | RCC_APB2Periph_GPIOG, ENABLE);
//使能各个端口时钟,
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14; //板上LED编号 D2
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOG, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; //板上LED编号 D5
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOD, &GPIO_InitStructure);
}

 

2、这个例程是做的按键,就是你要哪个地方产生中断,然后将其所在的总线配置成中断源,然后照猫画虎,填写中断结构体成员,就是配置外部事件的模式、触发条件、使能外部触发,

但是别忘了打开复用功能(现在我还不理解)

void Init_TI_KEY(void)
{

EXTI_InitTypeDef EXTI_InitStructure; //定义一个EXTI结构体变量

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //使能IO复用功能,使用中断功能重要!!!

/* 引脚选择 */
GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource13);//配置端口C的13引脚为中断源 重要!! 板上标号INT2
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource0); //配置端口E的0引脚为中断源 重要!! 板上标号INT1


/* 设置外部中断结构体的成员*/
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //中断模式为中断模式
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发
EXTI_InitStructure.EXTI_Line = EXTI_Line0 | EXTI_Line13;
EXTI_InitStructure.EXTI_LineCmd = ENABLE; //使能中断线
EXTI_Init(&EXTI_InitStructure); //根据参数初始化中断寄存器
}

 

3、现在就该配置中断了。也即是配置中断分组,以及中断优先级。

不说了,直接上程序,看注释。

void Init_NVIC(void)

NVIC_InitTypeDef NVIC_InitStructure;

// #ifdef VECT_TAB_RAM //向量表基地址选择

// NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); //将0x20000000地址作为向量表基地址(RAM)
// #else

// NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0); //将0x08000000地址作为向量表基地址(FLASH) 
// #endif

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置中断优先级分组2

NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn; //设定中断源为PC13
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //中断占优先级为2
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //副优先级为0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能中断
NVIC_Init(&NVIC_InitStructure); //根据参数初始化中断寄存器

NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; //设定中断源为PE0
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //中断占优先级为1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //副优先级为0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能中断
NVIC_Init(&NVIC_InitStructure); //根据参数初始化中断寄存器
}

 

4、最后一步了,也是很重要的一步,配置中断服务函数,也有叫什么入口函数的。说白了,就是你想让你的这个中断做什么。

/*************************************************************
注意,中断服务程序虽然简单,但是在写入口函数的时候,注意函数名的写法,只有如下3种命名方式。
(1)EXTI0_IRQHandler;EXTI Line 0
EXTI1_IRQHandler;EXTI Line 1
EXTI2_IRQHandler;EXTI Line 2
EXTI3_IRQHandler;EXTI Line 3
EXTI4_IRQHandler;EXTI Line 4
(2)
EXTI9_5_IRQHandler;EXTI Line 5-9
(3)
EXTI15_10_IRQHandler;EXTI Line 10-15

只要是中断线5后的就不能像前四个那样命名,他们有自己的方式。
************************************************************/
void EXTI15_10_IRQHandler(void) //pc13中断服务程序,也是中断子函数
{
//检测按键之前一般有个消抖延时,直接调用下面的延时函数即可

if(EXTI_GetITStatus(EXTI_Line13)!= RESET) //判断是否发生中断,发生则中断标志置1
{
// LED1=0;

// LED2=1;

GPIO_ResetBits(GPIOG, GPIO_Pin_14); //GPIOG设置为低电平,
GPIO_SetBits(GPIOD, GPIO_Pin_13); //GPIOD设置为高电平,其实这一部分也是可以写在主函数中的,在while那个死循环中。

}

EXTI_ClearITPendingBit(EXTI_Line13); //利用库函数清除中断标志位,进入中断服务程序之后。首先就是清除标志位,
} //否则他会不响应中断,不进入中断函数

 

 

好了,基本上就是这些了,希望对像我这样的初学者有一定的帮助。终于可以说一句,其实32也不是很难。


关键字:STM32  中断学习 引用地址:stm32中断学习总结

上一篇:stm32的定时器学习
下一篇:stm32中的延时函数

推荐阅读最新更新时间:2024-03-16 15:36

STM32位带操作详细介绍
前言 //在STM32中,如果我们要使PB0端口输出低电平,可以用如下语句 GPIOB- ODR |= 0 0; //在51单片机中我们是这样的 P0 = 0xff; //总线操作 //还有一种方法 sbit LED1 = P0^0; LED1 = 0;//位操作 在STM32中能不能实现位操作呢,当然是可以的,这种方法我们叫做位带操作。位操作就是可以单独的对一个比特位读和写。 1.位带简介 在STM32中,有两个地方实现了位带,一个是 SRAM 区的最低 1MB 空间,另一个是外设区最低 1MB 空间。这两个 1MB 的空间除了可以像正常的 RAM 一样操作外,他们还有自己的位带别名区,位带别名区把这 1MB 的空
[单片机]
<font color='red'>STM32</font>位带操作详细介绍
STM32 I2C从机发送数据
stm32 I2C主机发送功能在网上有很多例程,调试也很容易,从机发送数据的介绍很少,鉴于本人刚开始调试单片机程序不久,花了一整天也没调试通,最后在部门领导的帮助下,通过示波器及单步调试程序,查看寄存器状态值,终于实现了。下面主要介绍下从机发送数据注意事项。(附带例程) 1、相信使用I2C的都知道,从机是不能主动发送数据的,开始条件都是由主机生成。 2、根据参考文档,I2C默认是从机模式,只有在生成起始条件后,才会从从机模式自动切换到主机模式。所以作为从机模式使用时不能生成起始条件。 3、附图1,为从机发送器的传送时序图,截图于参考手册,图中说明部分讲述了怎样能清除事件,这点很重要,每次事件是都要去清除才可以去检测下一
[单片机]
<font color='red'>STM32</font> I2C从机发送数据
51单片机学习——8.1外部中断0和1
外部中断原理 外部中断0:(P3.2)可由IT0(TCON.0)选择其为低电平有效还是下降沿有效。当CPU检测到P3.2引脚上出现有效的中断信号时,中断标志IE0(TCON.1)置1,向CPU申请中断。 外部中断1:(P3.3)可由IT1(TCON.2)选择其为低电平有效还是下降沿有效。当CPU检测到P3.3引脚上出现有效的中断信号时,中断标志IE1(TCON.3)置1,向CPU申请中断。 编程原理(外部中断0) 首先我们对中断允许控制寄存器IE赋值,打开中断总开关,令EA=1. 然后我们还需要打开外部中断0的开关,令EX0=1 EX0(IE.0),外部中断0允许位; ET0(IE.1),定时/计数器T0中断允许位;
[单片机]
51单片机<font color='red'>学习</font>——8.1外部<font color='red'>中断</font>0和1
STM32八种输入输出模式详解
最近在看数据手册的时候,发现在Cortex-M3里,对于GPIO的配置种类有8种之多: (1)GPIO_Mode_AIN 模拟输入 (2)GPIO_Mode_IN_FLOATING 浮空输入 (3)GPIO_Mode_IPD 下拉输入 (4)GPIO_Mode_IPU 上拉输入 (5)GPIO_Mode_Out_OD 开漏输出 (6)GPIO_Mode_Out_PP 推挽输出 (7)GPIO_Mode_AF_OD 复用开漏输出 (8)GPIO_Mode_AF_PP 复用推挽输出 对于刚入门的新手,我想这几个概念是必须得搞清楚的,平时接触的最多的也就是推挽输出、开漏输出、上拉输入这三种,但一直未曾对这些做过归纳。因此,在这
[单片机]
STM32串口通信测试程序
// 5个串口均可工作,已经把定时器中断、 串口中断和配置函数写在一个文件中 晶振 8Mhz #include stm32f10x_lib.h #include stdio.h #define uchar unsigned char #define uint unsigned int #define ulong unsigned long uint TimingDelay; #define YES 1 #define NO 0 #define COM1_TX_EN GPIO_ResetBits(GPIOC,GPIO_Pin_1) // GPIOC- BSRR=0xfd //&=0
[单片机]
STM32USART串口调节与printf重定义
首先,printf重定义后可以直接使用printf函数从串口发送数据 在usart.c中添加代码: #ifdef __GNUC__ /* With GCC/RAISONANCE, small printf (option LD Linker- Libraries- Small printf set to 'Yes') calls __io_putchar() */ #define PUTCHAR_PROTOTYPE int __io_putchar(int ch) #else #define PUTCHAR_PROTOTYPE int fputc(int ch, F
[单片机]
STM32库函数USART_SendData的缺陷和解决方法
2.1 问题及现象 使用USART_SendData()函数非连续发送单个字符是没有问题的;当连续发送字符时(两个字符间没有延时),就会发现发送缓冲区有溢出现象。若发送的数据量很小时,此时串口发送的只是最后一个字符,当发送数据量大时,就会导致发送的数据莫名其妙的丢失。 如: for(TxCounter = 0;TxCounter RxCounter; TxCounter++) USART_SendData(USART1, RxBuffer ); 2. 原因 此API函数不完善,函数体内部没有一个判断一个字符是否发送完毕的语句,而是把数据直接放入发送缓冲区,当连续发送数据时,由于发送移位寄存器的速度限制(与通信波特率有关),导
[单片机]
STM32硬件IIC操作解析
  IIC 即Inter-Integrated Circuit(集成电路总线),这种总线类型是由飞利浦半导体公司在八十年代初设计出来的一种简单、双向、二线制、同步串行总线,主要是用来连接整体电路(ICS) ,IIC是一种多向控制总线,也就是说多个芯片可以连接到同一总线结构下,同时每个芯片都可以作为实时数据传输的控制源。这种方式简化了信号传输总线接口。   I2C串行总线一般有两根信号线,一根是双向的数据线SDA,另一根是时钟线SCL。所有接到I2C总线设备上的串行数据SDA都接到总线的SDA上,各设备的时钟线SCL接到总线的SCL上。   为了避免总线信号的混乱,要求各设备连接到总线的输出端时必须是漏极开路(OD)输出或
[单片机]
<font color='red'>STM32</font>硬件IIC操作解析
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved