stm32中nvic的中端过程具体是怎么一步一步实现的?哪位高人浅显的解释一下?比如,第一步标志位出现,

stm32中nvic的中端过程具体是怎么一步一步实现的?哪位高人浅显的解释一下?比如,第一步标志位出现,,第1张

我也比如一下

比如说按键中断

1.要使能时钟和相关GPIO口(按键口)

2.使能中断嵌套程序NVIC,里面的关键是中断类型(在本例子中就是外部中断啦,所有的中断都要使能NVIC,否则不能中断),如果就一个中断,优先级可忽略

3.使能外部中断EXTI,其实就是按键中断了

4.主程序中一般是循环啦

举个例子,最简单的

mian()

{

RCC_config()

GPIO_config()

NVIC_config()

EXTI_Config()

while(1)

}

5.中断函数程序中,注意这个是在另一个文件下stm32f10x_it.c,而上面的所有步骤都是在main.c文件中的

编写中断程序

void EXTI9_5_IRQHandler(void)

{

delay()//延时函数

}

因为我用的是第8道,所以函数名是

EXTI9_5_IRQHandler

6.开始运行程序啦,从上往坦樱下走,配置完了时钟,GPIO,NVIC,EXTI后就进入while(1)死循环中,这时候当你按下按键后,会产生一个电平的变换1变0或0变1,对应的GPIO口接受到这个变换后就会发生中断,进入中断函数

EXTI9_5_IRQHandler,中断函数中是个延时函数,等延时完就会结束中断函数返回主函数啦。

贴一个我写的小例子,就是按键中断的。主函数中为橘孝点亮灯,中断函数为熄灭灯

#include "stm32f10x.h"

#include "stm32f10x_gpio.h"

#include "圆信稿stm32f10x_rcc.h"

#include "stm32f10x_exti.h"

void RCC_Configuration(void) //时钟配置函数

{

ErrorStatus HSEStartUpStatus

//使能外部晶振

RCC_HSEConfig(RCC_HSE_ON)

//等待外部晶振稳定

HSEStartUpStatus = RCC_WaitForHSEStartUp()

//如果外部晶振启动成功,则进行下一步 *** 作

if(HSEStartUpStatus==SUCCESS)

{

//设置HCLK(AHB时钟)=SYSCLK 将系统时钟进行分频后,作为AHB总线时钟

RCC_HCLKConfig(RCC_SYSCLK_Div1)

//PCLK1(APB1) = HCLK/2 将HCLK时钟2分频后给低速外部总线

RCC_PCLK1Config(RCC_HCLK_Div2)

//PCLK2(APB2) = HCLK HCLK时钟配置给高速外部总线

RCC_PCLK2Config(RCC_HCLK_Div1)

//外部高速时钟HSE 4倍频

RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_4)

//启动PLL

RCC_PLLCmd(ENABLE)

//等待PLL稳定

while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)

//系统时钟SYSCLK来自PLL输出

RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK)

//切换时钟后等待系统时钟稳定

while(RCC_GetSYSCLKSource()!=0x08)

}

// RCC system reset(for debug purpose) 下面这些都是外设总线上所挂的外部设备时钟的配置

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE)

}

extern void Delay(int cnt) //延时函数

{

int i,j

for (i=0i<cnti++)

{ for (j=0j<1000j++)

{

}

}

}

void GPIO_Configuration(void) //GPIO配置函数

{

//GPIO_DeInit(GPIOA)

GPIO_InitTypeDef GPIO_InitStructure

//RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE)

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz

GPIO_InitStructure.GPIO_Mode= GPIO_Mode_Out_PP

GPIO_Init(GPIOA,&GPIO_InitStructure)

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_12

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz

GPIO_InitStructure.GPIO_Mode= GPIO_Mode_Out_PP

GPIO_Init(GPIOB,&GPIO_InitStructure)

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8|GPIO_Pin_9

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz

GPIO_InitStructure.GPIO_Mode= GPIO_Mode_IPU

GPIO_Init(GPIOB,&GPIO_InitStructure)

}

void EXTI_Config(void)

{

EXTI_InitTypeDef EXTI_InitStructure

// 管脚选择

GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource8)

GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource9)

// 清除 EXTI线路挂起位

EXTI_ClearITPendingBit(EXTI_Line8|EXTI_Line9)

//

EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt

EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling

EXTI_InitStructure.EXTI_Line = EXTI_Line8

EXTI_InitStructure.EXTI_LineCmd = ENABLE

EXTI_Init(&EXTI_InitStructure)

}

void NVIC_Config(void)

{

NVIC_InitTypeDef NVIC_InitStructure

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0)

NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn// 注意名称是“_IRQn”,不是“_IRQChannel”

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0//

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0//

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE

NVIC_Init(&NVIC_InitStructure)

}

int main(void)

{

RCC_Configuration()

GPIO_Configuration()

EXTI_Config()

NVIC_Config()

while(1)

{

GPIO_ResetBits(GPIOB,GPIO_Pin_12)

GPIO_ResetBits(GPIOA,GPIO_Pin_4)

}

}

IT中的函数

void Delay()

void EXTI9_5_IRQHandler(void)

{

if ( EXTI_GetITStatus(EXTI_Line8) != RESET )

{

EXTI_ClearITPendingBit(EXTI_Line8)

GPIO_SetBits(GPIOA,GPIO_Pin_4)

//Delay(100)

while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_8)==0)

}

if ( EXTI_GetITStatus(EXTI_Line9) != RESET )

{

EXTI_ClearITPendingBit(EXTI_Line9)

//Delay(1000)

GPIO_SetBits(GPIOB,GPIO_Pin_12)

while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_9)==0)

}

}

NVIC_InitTypeDef 是结构体的类型 NVIC_InitStructure是结构体变量;

将结构体成员赋值后传给初始化函数NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);

初始化如下:

NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 //抢占优先级3

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3 //子优先级3

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE //IRQ通道使能或森

NVIC_Init(&NVIC_InitStructure) //根据指定启液的参数初悄团物始化VIC寄存器


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12426383.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存