打印
[应用相关]

STM32之EXTI

[复制链接]
479|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
734774645|  楼主 | 2016-11-17 22:01 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
STM32, TI, ic, vi, AC

STM32因为具有NVIC使其中断体系大大提升,NVIC使用来管理异常与中断的,并且NVIC模块中还包含SysTick。

这次我们来讲一下EXTI外部中断。


1.在用到时我们必须要设置中断向量表,我们要将中断向量表存储在一个固定的位置,究竟是RAM还是FLASH就得看你的需求了。


2.STM32中中断优先级分组总共有四种分组方式,我们只能用其中的一组。所以在设置完毕中断向量表的存储位置后我们就得选择合适我们的中断优先级分组。(这一部分可以我的STM32之NVIC一文)


3.然后你要使用哪个外部中断就对此中断设置抢占优先级,亚优先级,以及打开。


4.然后就是相应中断的模式,方式,等配置了


5.设置相应的引脚为输入浮空


下面我们上两个框图看一下:


这里我们可以形象的看到STM32共有64个外部中断,公用16个外部中断通道,并与NVIC中断分组里的16级对应起来


通过这张图我们可以清楚的看到中断或者事件相应的过程,如果有什么不清楚的请回复我会继续补充


下面我们就把程序拿上来,供大家做参考(基于V3.3.0的库)


沙发
734774645|  楼主 | 2016-11-17 22:03 | 只看该作者
/********************************************************************************
  * [url=home.php?mod=space&uid=288409]@file[/url]    EXTI/main.c
  * [url=home.php?mod=space&uid=187600]@author[/url]  swei
  * [url=home.php?mod=space&uid=895143]@version[/url] V3.3.0
  * [url=home.php?mod=space&uid=212281]@date[/url]    04/16/2010
  * [url=home.php?mod=space&uid=247401]@brief[/url]   Main program body.
  ******************************************************************************/
#include "stm32f10x.h"
void RCC_Configuration(void);        //时钟配置函数
void NVIC_Configuration(void);        //NVIC配置函数
void EXTI_Configuration(void);        //外部中断配置函数
void GPIO_Configuration(void);        //GPIO配置函数
int main(void)
{
        RCC_Configuration();
        NVIC_Configuration();
        GPIO_Configuration();
        EXTI_Configuration();
        while(1)
        {
       
        }
}
void RCC_Configuration(void)                           //时钟配置,如果不明白请看我的STM32之RCC一文
{
        RCC_DeInit();
        RCC_HSEConfig(RCC_HSE_ON);
        while(!RCC_WaitForHSEStartUp());
        FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
        FLASH_SetLatency(FLASH_Latency_2);
        RCC_HCLKConfig(RCC_SYSCLK_Div1);
        RCC_PCLK2Config(RCC_HCLK_Div1);
        RCC_PCLK1Config(RCC_HCLK_Div2);
        RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);
        RCC_PLLCmd(ENABLE);
        while(!(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==SET));
        RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
        while(!(RCC_GetSYSCLKSource()==0x08));
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO,ENABLE);//打开相应模块的时钟
}
void NVIC_Configuration(void)
{
        NVIC_InitTypeDef NVIC_InitStructure;
#ifdef        VECT_TAB_RAM                                                                 //条件编译,对异常向量表进行配置(放在RAM还是FLASH)
        NVIC_SetVectorTable(NVIC_VectTab_RAM,0x0);
#else
        NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x0);
#endif
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);         //选择中断优先级分组,此处选择0。使0级抢占式优先级,16级亚优先级
        NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;                //相应的通道配置,此处选择中断通道
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;        //抢占式优先级配置
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;                        //亚优先级配置
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                //时能通道
        NVIC_Init(&NVIC_InitStructure);                                                                //使用结构体完成配置
}
void EXTI_Configuration(void)                                                                        //相应的中断配置
{
        EXTI_InitTypeDef EXTI_InitStructure;
        EXTI_DeInit();                                                                                                //还原到默认配置
        EXTI_InitStructure.EXTI_Line = EXTI_Line15;                                        //选择中断线
        EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;                        //选择中断模式
        EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;                //选择中断方式
        EXTI_InitStructure.EXTI_LineCmd = ENABLE;                                        //时能中断
        EXTI_Init(&EXTI_InitStructure);
}
void GPIO_Configuration(void)                                                                        //GPIO引脚的配置,如果不明白请看我的STM32之GPIO一文
{
        GPIO_InitTypeDef GPIO_InitStructure;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
        GPIO_Init(GPIOB,&GPIO_InitStructure);
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
        GPIO_Init(GPIOA,&GPIO_InitStructure);
}
/******************* (C) COPYRIGHT 2010 SWEI ********************END OF FILE****/


使用特权

评论回复
板凳
gaoyang9992006| | 2016-11-18 09:37 | 只看该作者
用库函数里的两个函数就搞定了,认真分析一下,然后就学会那个套路,多用心观察。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

196

主题

3436

帖子

14

粉丝