配置过程:
1:初始化GPIO和开启AFIO时钟并且选择好中断引脚
选择中断引脚函数GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);//选择那个引脚为中断引脚
2:初始化NVIC
3: 初始化EXTI
4:MIAN函数调用
注:一定要开启AFIO的时钟 不然不会中断,并且若有多个中断,不可以只开一次,(测过只在一个函数里使能AFIO,但只能那个用中断,其他的不可以)
NVIC中断函数在MISC里:首先要进行NVIC的组选择,然后配置NVIC的中断源,中断优先级,越小越中断优先级越高,先比较抢占优先级若抢占优先级相同则比较子优先级,若还是相同则由ST的硬件决定,手册有/STM32F10x.也有。抢占优先级 PreemptionPriority 子优先级SubPriority
EXTI:就正常配置 EXTI_Mode模式:中断/事件 EXTI_Trigger触发源:上/下 上下 使能 EXTI_line开启那个LIEN的中断。 LINE16_20是USB以太网的中断具体看看手册 line0——15 是GBIO的.
#include “exti.h”
/*
函数名称:void nvic_init(void)
功能:初始化总NVIV的配置,目前只有中断0和13的中断
参数:无
*/
void nvic_init(void)
{
NVIC_InitTypeDef NVIC_EXTI_LINE0_InitStruct;//中断0的结构体
NVIC_InitTypeDef NVIC_EXTI_LINE13_InitStruct;//中断1的结构体
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//NVIC分组 选择的是组2 建议只分一次或用单独的文件去初始化
NVIC_EXTI_LINE0_InitStruct.NVIC_IRQChannel=EXTI0_IRQn;//中断源选择
NVIC_EXTI_LINE0_InitStruct.NVIC_IRQChannelCmd=ENABLE;//使能
//优先级 数值越小 优先级越高
//先判断强占优先级优先级,若该优先级相同,则判断子优先级,若子优先级也相同,就是看STM的硬件优先级的,可在STM32F10X.H查看
NVIC_EXTI_LINE0_InitStruct.NVIC_IRQChannelPreemptionPriority=2;//强占优先级
NVIC_EXTI_LINE0_InitStruct.NVIC_IRQChannelSubPriority=1;//子优先级
NVIC_Init(&NVIC_EXTI_LINE0_InitStruct);//结构体初始化
//同上 line9-5 和line10-15是共用中断源的中断服务函数的,可以用中断标志位去判断,服务函数在startup文件中
NVIC_EXTI_LINE13_InitStruct.NVIC_IRQChannel=EXTI15_10_IRQn;
NVIC_EXTI_LINE13_InitStruct.NVIC_IRQChannelCmd=ENABLE;
NVIC_EXTI_LINE13_InitStruct.NVIC_IRQChannelPreemptionPriority=2;
NVIC_EXTI_LINE13_InitStruct.NVIC_IRQChannelSubPriority=2;
NVIC_Init(&NVIC_EXTI_LINE13_InitStruct);
}
/*
函数名称:void EXRI_GPIOA0_INIT(void)
功能:初始化GBIOA的配置/输出/开启中断/中断配置
参数:无
*/
void EXRI_GPIOA0_INIT(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
EXTI_InitTypeDef EXTI0_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//中断时钟开启(复用也要开这个)只要相关引脚使用就要开不可以说开过下一个就不开了
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPD;
GPIO_InitStruct.GPIO_Pin|=GPIO_Pin_0;
GPIO_Init(GPIOA,& GPIO_InitStruct);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);//选择那个引脚为中断引脚
EXTI0_InitStruct.EXTI_Line=EXTI_Line0;//中断选择
EXTI0_InitStruct.EXTI_LineCmd=ENABLE;//开启中断
EXTI0_InitStruct.EXTI_Mode=EXTI_Mode_Interrupt;//模式选择中断或开启事件(开AD,DMA啥的)
EXTI0_InitStruct.EXTI_Trigger=EXTI_Trigger_Rising;//触发沿选择 上升/下降 2个都可以
EXTI_Init(&EXTI0_InitStruct);
}
/*
函数名称:void EXRI_GPIOC13_INIT(void)
功能:初始化GBIOA的配置/输出/开启中断/中断配置
参数:无
*/
void EXRI_GPIOC13_INIT(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
EXTI_InitTypeDef EXTI13_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//中断时钟开启(复用也要开这个)只要相关引脚使用就要开不可以说开过下一个就不开了
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPD;
GPIO_InitStruct.GPIO_Pin|=GPIO_Pin_13;
GPIO_Init(GPIOC,& GPIO_InitStruct);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource13);
EXTI13_InitStruct.EXTI_Line=EXTI_Line13;
EXTI13_InitStruct.EXTI_LineCmd=ENABLE;
EXTI13_InitStruct.EXTI_Mode=EXTI_Mode_Interrupt;//模式选择中断或开启事件(开AD,DMA啥的)
EXTI13_InitStruct.EXTI_Trigger=EXTI_Trigger_Rising;//触发沿选择 上升/下降 2个都可以
EXTI_Init(&EXTI13_InitStruct);
}
/*
函数名称:void EXTI15_10_IRQHandler(void)
功能:LIEN15-10中断服务函数
参数:无
*/
void EXTI15_10_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line13))//中断挂起位,发生会为1 如果是其他的中断(15-10改一下就好了 也可以同时一起同)
{
LED_B_OFF;
}
EXTI_ClearITPendingBit(EXTI_Line13);//清除标志
}
/*
函数名称:void EXTI15_10_IRQHandler(void)
功能:LIEN15-10中断服务函数
参数:无
*/
void EXTI0_IRQHandler()
{
if(EXTI_GetITStatus(EXTI_Line0))
{
LED_B_ON;
}
EXTI_ClearITPendingBit(EXTI_Line0);
}
#include “exti.h”
/*
函数名称:void nvic_init(void)
功能:初始化总NVIV的配置,目前只有中断0和13的中断
参数:无
*/
void nvic_init(void)
{
NVIC_InitTypeDef NVIC_EXTI_LINE0_InitStruct;//中断0的结构体
NVIC_InitTypeDef NVIC_EXTI_LINE13_InitStruct;//中断1的结构体
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//NVIC分组 选择的是组2 建议只分一次或用单独的文件去初始化
NVIC_EXTI_LINE0_InitStruct.NVIC_IRQChannel=EXTI0_IRQn;//中断源选择
NVIC_EXTI_LINE0_InitStruct.NVIC_IRQChannelCmd=ENABLE;//使能
//优先级 数值越小 优先级越高
//先判断强占优先级优先级,若该优先级相同,则判断子优先级,若子优先级也相同,就是看STM的硬件优先级的,可在STM32F10X.H查看
NVIC_EXTI_LINE0_InitStruct.NVIC_IRQChannelPreemptionPriority=2;//强占优先级
NVIC_EXTI_LINE0_InitStruct.NVIC_IRQChannelSubPriority=1;//子优先级
NVIC_Init(&NVIC_EXTI_LINE0_InitStruct);//结构体初始化
//同上 line9-5 和line10-15是共用中断源的中断服务函数的,可以用中断标志位去判断,服务函数在startup文件中
NVIC_EXTI_LINE13_InitStruct.NVIC_IRQChannel=EXTI15_10_IRQn;
NVIC_EXTI_LINE13_InitStruct.NVIC_IRQChannelCmd=ENABLE;
NVIC_EXTI_LINE13_InitStruct.NVIC_IRQChannelPreemptionPriority=2;
NVIC_EXTI_LINE13_InitStruct.NVIC_IRQChannelSubPriority=2;
NVIC_Init(&NVIC_EXTI_LINE13_InitStruct);
}
/*
函数名称:void EXRI_GPIOA0_INIT(void)
功能:初始化GBIOA的配置/输出/开启中断/中断配置
参数:无
*/
void EXRI_GPIOA0_INIT(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
EXTI_InitTypeDef EXTI0_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//中断时钟开启(复用也要开这个)只要相关引脚使用就要开不可以说开过下一个就不开了
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPD;
GPIO_InitStruct.GPIO_Pin|=GPIO_Pin_0;
GPIO_Init(GPIOA,& GPIO_InitStruct);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);//选择那个引脚为中断引脚
EXTI0_InitStruct.EXTI_Line=EXTI_Line0;//中断选择
EXTI0_InitStruct.EXTI_LineCmd=ENABLE;//开启中断
EXTI0_InitStruct.EXTI_Mode=EXTI_Mode_Interrupt;//模式选择中断或开启事件(开AD,DMA啥的)
EXTI0_InitStruct.EXTI_Trigger=EXTI_Trigger_Rising;//触发沿选择 上升/下降 2个都可以
EXTI_Init(&EXTI0_InitStruct);
}
/*
函数名称:void EXRI_GPIOC13_INIT(void)
功能:初始化GBIOA的配置/输出/开启中断/中断配置
参数:无
*/
void EXRI_GPIOC13_INIT(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
EXTI_InitTypeDef EXTI13_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//中断时钟开启(复用也要开这个)只要相关引脚使用就要开不可以说开过下一个就不开了
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPD;
GPIO_InitStruct.GPIO_Pin|=GPIO_Pin_13;
GPIO_Init(GPIOC,& GPIO_InitStruct);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource13);
EXTI13_InitStruct.EXTI_Line=EXTI_Line13;
EXTI13_InitStruct.EXTI_LineCmd=ENABLE;
EXTI13_InitStruct.EXTI_Mode=EXTI_Mode_Interrupt;//模式选择中断或开启事件(开AD,DMA啥的)
EXTI13_InitStruct.EXTI_Trigger=EXTI_Trigger_Rising;//触发沿选择 上升/下降 2个都可以
EXTI_Init(&EXTI13_InitStruct);
}
/*
函数名称:void EXTI15_10_IRQHandler(void)
功能:LIEN15-10中断服务函数
参数:无
*/
void EXTI15_10_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line13))//中断挂起位,发生会为1 如果是其他的中断(15-10改一下就好了 也可以同时一起同)
{
LED_B_OFF;
}
EXTI_ClearITPendingBit(EXTI_Line13);//清除标志
}
/*
函数名称:void EXTI15_10_IRQHandler(void)
功能:LIEN15-10中断服务函数
参数:无
*/
void EXTI0_IRQHandler()
{
if(EXTI_GetITStatus(EXTI_Line0))
{
LED_B_ON;
}
EXTI_ClearITPendingBit(EXTI_Line0);
}
MIANd掉用
#include “stm32f10x.h” // Device header
#include “exti.h”
#include “rgb_drive.h”
int main(void)
{
rgb_init();
nvic_init();
EXRI_GPIOC13_INIT();
EXRI_GPIOA0_INIT();
LED_R_OFF;
LED_G_OFF;
LED_B_OFF;
while(1)
{
}
}
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
机房租用,北京机房租用,IDC机房托管, http://www.fwqtg.net
(一)嵌入式低功耗设备介绍 在物联网(IoT)领域,设备可以使用以太网和无线网进行网络连接。 以太网: 网络稳定,带宽高,延迟低,但是以太网需要拉网布线,设备安装邻活便利性能差。 无线网络:安装位置灵活,便利,但是网络信号容易受到干扰,带宽和速度有限。 常见的…