视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
STM32 中断程序
2025-10-02 02:30:28 责编:小OO
文档
程序部分:

1 按键触发中断实现灯的闪亮

硬件部分

1).原理图

2).程序部分 

/* 

* 文件名: main.c

* 内容简述: 

* 从0开始创建一个工程,通过按键触发中断实现灯的闪亮

*

* 1个LED指示灯,对应的GPIO为 : PC3

* 输出为0点亮LED

* 输出为1关闭LED

*/

#include "stm32f10x.h"

/* 延时函数 */

void Delay(__IO uint32_t nCount)

{

//__IO 就是volatile,加上这个后可以避免延时函数被编译器优化掉

for(;nCount != 0; nCount--);

}

/* GPIO配置函数 */

void GPIO_Configuration(void)

{

/*定义2个结构体变量 */

GPIO_InitTypeDef GPIO_InitStructure;

/*开启GPIOB,GPIOC ,复用口时钟的 时钟 */

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

/*给GPIOC_Pin_3 GPIOB_Pin_7一个初始值*/ 

GPIO_SetBits(GPIOC, GPIO_Pin_1 );

//GPIO_SetBits(GPIOB, GPIO_Pin_7 );

/*给GPIO_InitStructure.GPIO_Pin GPIO_InitStructure.GPIO_Mode GPIO_InitStructure.GPIO_Speed付初始值*/

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 ;

// 将连接LED3的GPIO设置为推挽输出

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

//设置为10MHZ的速度

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;

//初始化GPIOC

GPIO_Init(GPIOC, &GPIO_InitStructure);

/*给KEY_InitStructure.GPIO_Pin KEY_InitStructure.GPIO_Mode KEY_InitStructure.GPIO_Speed付初始值*/

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_7;

//设置为上拉输入

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU ;

//设置为10MHZ的速度

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;

//初始化GPIOB

GPIO_Init(GPIOB, &GPIO_InitStructure);

//设置GPIOB的中断标志位

GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource7);

}

/******配置EXTI**********/

void EXTI_Configuration(void)

{ //定义一个结构体

EXTI_InitTypeDef EXTI_InitStructure;

//设置中段线

EXTI_InitStructure.EXTI_Line = EXTI_Line7;

//使能中断线

EXTI_InitStructure.EXTI_LineCmd = ENABLE ;

//设置中断模式

EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; 

//设置中断触发方式

EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;

//初始化中断

EXTI_Init(&EXTI_InitStructure); 

}

/********配置优先级*****************/

void NVIC_Configuration(void)

//定义一个结构体

NVIC_InitTypeDef NVIC_InitStructure;

//设置优先级组

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0) ;

//设置存入寄存器

NVIC_SetVectorTable (NVIC_VectTab_FLASH ,0x0);

//设置 外部中断5-9线

NVIC_InitStructure.NVIC_IRQChannel =EXTI9_5_IRQn;

//使能优先级

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

//配置抢断优先级

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =0;

//配置响应优先级

NVIC_InitStructure.NVIC_IRQChannelSubPriority =0;

//初始化优先级

NVIC_Init(&NVIC_InitStructure); 

}

//主函数

int main(void)

{

/*

这个函数是ST库中的函数,函数实体在

Libraries\\CMSIS\\Core\\CM3\\system_stm32f10x.c

配置内部Flash接口,初始化PLL,配置系统时钟的频率

系统时钟缺省配置为72MHz

*/

//SystemInit(); 由于头文件包含

//调用初始化GPIO函数

GPIO_Configuration ();

EXTI_Configuration ();

NVIC_Configuration ();

while(1)

;

}

}

在it.c中的程序:

void EXTI9_5_IRQHandler(void) 

{

if( EXTI_GetITStatus (EXTI_Line7) == 1 ) 

EXTI_ClearITPendingBit (EXTI_Line7); 

while(1)

{

GPIOC -> ODR ^=0x08;//采用直接进入寄存器修改值 

Delay (0x00ffffff) ;

}

//__disable_irq();

}

3).写程序心得:

1.写中断无非就是分几个部分:1.GPIO的配置 2.初始化中断 3.配置优点级

2.在调程序时千万不要忘了给复用口也给上时钟RCC_APB2PeriphClockCmd (RCC_APB2Periph_AFIO, ENABLE); 

2.通过按键1触发中断1实现灯1的闪亮 ,再通过按键2触发中断抢占中断1实现小灯2的闪亮 

1.硬件如上图程序一相同

2.程序代码:

/* 

* 文件名: main.c

* 内容简述: 

* 从0开始创建一个工程,通过按键1触发中断1实现灯1的闪亮 

* 再通过按键2触发中断抢占 中断1实现小灯2的闪亮

*

* 2个LED指示灯,对应的GPIO为 : PC3 PC1

* 输出为0点亮LED

* 输出为1关闭LED

* 2个按键 对应 PB7 PA11

*/

#include "stm32f10x.h"

/* 延时函数 */

void Delay(__IO uint32_t nCount)

{

//__IO 就是volatile,加上这个后可以避免延时函数被编译器优化掉

for(;nCount != 0; nCount--);

}

/* GPIO配置函数 */

void GPIO_Configuration(void)

{

/*定义2个结构体变量 */

GPIO_InitTypeDef GPIO_InitStructure;

/*开启GPIOB,GPIOC ,复用口时钟的 时钟 */

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

/*给GPIOC_Pin_3 GPIOB_Pin_7一个初始值*/ 

// GPIO_SetBits(GPIOC, GPIO_Pin_1 );

// GPIO_SetBits(GPIOC, GPIO_Pin_3 );

/*给GPIO_InitStructure.GPIO_Pin GPIO_InitStructure.GPIO_Mode GPIO_InitStructure.GPIO_Speed付初始值*/

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_1;

// 将连接LED3的GPIO设置为推挽输出

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

//设置为10MHZ的速度

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;

//初始化GPIOC

GPIO_Init(GPIOC, &GPIO_InitStructure);

/*给KEY_InitStructure.GPIO_Pin KEY_InitStructure.GPIO_Mode KEY_InitStructure.GPIO_Speed付初始值*/

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_7;

//设置为上拉输入

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU ;

//设置为10MHZ的速度

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;

//初始化GPIOB

GPIO_Init(GPIOB, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_11;

//设置为上拉输入

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU ;

//设置为10MHZ的速度

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;

//初始化GPIOB

GPIO_Init(GPIOA, &GPIO_InitStructure);

//设置GPIOB的中断标志位

GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource7);

GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource11);

}

/******配置EXTI**********/

void EXTI_Configuration(void)

{ //定义一个结构体

EXTI_InitTypeDef EXTI_InitStructure;

//设置中段线

EXTI_InitStructure.EXTI_Line = EXTI_Line7;

//使能中断线

EXTI_InitStructure.EXTI_LineCmd = ENABLE ;

//设置中断模式

EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; 

//设置中断触发方式

EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;

//初始化中断

EXTI_Init(&EXTI_InitStructure); 

//设置中段线

EXTI_InitStructure.EXTI_Line = EXTI_Line11;

//使能中断线

EXTI_InitStructure.EXTI_LineCmd = ENABLE ;

//设置中断模式

EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; 

//设置中断触发方式

EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;

//初始化中断

EXTI_Init(&EXTI_InitStructure); 

}

/********配置优先级*****************/

void NVIC_Configuration(void)

{

//定义一个结构体

NVIC_InitTypeDef NVIC_InitStructure;

//设置优先级组

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1) ;

//设置存入寄存器

NVIC_SetVectorTable (NVIC_VectTab_FLASH ,0x0);

//设置 外部中断5-9线

NVIC_InitStructure.NVIC_IRQChannel =EXTI9_5_IRQn;

//使能优先级

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

//配置抢断优先级

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =1;

//配置响应优先级

NVIC_InitStructure.NVIC_IRQChannelSubPriority =0;

//初始化优先级

NVIC_Init(&NVIC_InitStructure);

//设置优先级组

//NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1) ;

//设置存入寄存器

//NVIC_SetVectorTable (NVIC_VectTab_FLASH ,0x0);

//设置 外部中断10-15线

NVIC_InitStructure.NVIC_IRQChannel =EXTI15_10_IRQn;

//使能优先级

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

//配置抢断优先级

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =0;

//配置响应优先级

NVIC_InitStructure.NVIC_IRQChannelSubPriority =1;

//初始化优先级

NVIC_Init(&NVIC_InitStructure); 

}

//主函数

int main(void)

{

/*

这个函数是ST库中的函数,函数实体在

Libraries\\CMSIS\\Core\\CM3\\system_stm32f10x.c

配置内部Flash接口,初始化PLL,配置系统时钟的频率

系统时钟缺省配置为72MHz

*/

//SystemInit(); 由于头文件包含

//调用初始化GPIO函数

GPIO_Configuration ();

EXTI_Configuration ();

NVIC_Configuration ();

while(1)

;

}

it.c中的程序:

void EXTI15_10_IRQHandler(void) 

{

if( EXTI_GetITStatus (EXTI_Line11) == 1 ) 

EXTI_ClearITPendingBit (EXTI_Line11); 

while(1)

{

GPIOC -> ODR ^=0x02;//采用直接进入寄存器修改值 

Delay (0x00ffffff) ;

}

}

void EXTI9_5_IRQHandler(void)

{

if( EXTI_GetITStatus (EXTI_Line7) == 1 ) 

EXTI_ClearITPendingBit (EXTI_Line7); 

while(1)

{

GPIOC -> ODR ^=0x08;//采用直接进入寄存器修改值 

Delay (0x00ffffff) ;

}

//__disable_irq();

}

编程心得:

1.在初始化优先级时,不能在不同的组中进行比较,即一个初始化中只能存在一个NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1) 不能存在多个,这就好比在一个屋子里的两个人可以比较,因为彼此都能看见对方,谁强谁弱一看就知道,而在不同两个屋子里的两个人是不能进行比较的,因为彼此都看不见。

2.在初始化优先级中写NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority 和 NVIC_InitStructure.NVIC_IRQChannelSubPriority 时一定要注意,它们的范围是0-15且数字越小,优先级越高。下载本文

显示全文
专题