最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 正文

STM32 中断程序

来源:动视网 责编:小OO 时间:2025-10-02 02:30:28
文档

STM32 中断程序

程序部分:1按键触发中断实现灯的闪亮硬件部分1).原理图2).程序部分/**文件名:main.c*内容简述:*从0开始创建一个工程,通过按键触发中断实现灯的闪亮**1个LED指示灯,对应的GPIO为:PC3*输出为0点亮LED*输出为1关闭LED*/#include"stm32f10x.h"/*延时函数*/voidDelay(__IOuint32_tnCount){//__IO就是volatile,加上这个后可以避免延时函数被编译器优化掉for(;nCount!=0;nCount--);}/*
推荐度:
导读程序部分:1按键触发中断实现灯的闪亮硬件部分1).原理图2).程序部分/**文件名:main.c*内容简述:*从0开始创建一个工程,通过按键触发中断实现灯的闪亮**1个LED指示灯,对应的GPIO为:PC3*输出为0点亮LED*输出为1关闭LED*/#include"stm32f10x.h"/*延时函数*/voidDelay(__IOuint32_tnCount){//__IO就是volatile,加上这个后可以避免延时函数被编译器优化掉for(;nCount!=0;nCount--);}/*
程序部分:

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且数字越小,优先级越高。

文档

STM32 中断程序

程序部分:1按键触发中断实现灯的闪亮硬件部分1).原理图2).程序部分/**文件名:main.c*内容简述:*从0开始创建一个工程,通过按键触发中断实现灯的闪亮**1个LED指示灯,对应的GPIO为:PC3*输出为0点亮LED*输出为1关闭LED*/#include"stm32f10x.h"/*延时函数*/voidDelay(__IOuint32_tnCount){//__IO就是volatile,加上这个后可以避免延时函数被编译器优化掉for(;nCount!=0;nCount--);}/*
推荐度:
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top