比如说按键中断
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寄存器
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)