这节课的结果是在上节课的基础上更改的:电路图为:用一个开关来模拟外部时钟的高低电平的变化。
当然也可以配置一个外部时钟来模拟,也是可以的:
由于这节课的代码是在上节课的基础上有一点修改而来的,所以就只把更改的地方展示出来吧:其他的地方没有变化:
其他的地方和原来是一样的,直接编译仿真就能运行了:如果有什么不明白的地方去看上一片文章吧!
***************************************************************************************************************
下面是重新学习野火的中断视频做中断的记录:
使用中断的五个步骤:
/*
第一条:初始化NVIC,用于处理中断
第二条:初始化要连接的EXTI的GPIO
第三条:初始化EXTI用于产生中断/事件
第四条:编写中断服务函数
第五条:main函数
*/
下面是代码
my_exti.c:
#include "my_exti.h" // Device header
#include "led.h"
/*
第一条:初始化NVIC,用于处理中断
第二条:初始化要连接的EXTI的GPIO
第三条:初始化EXTI用于产生中断/事件
第四条:编写中断服务函数
第五条:main函数
*/
//第一条:初始化NVIC,用于处理中断
void EXTI_NVIC_Init(void)
{
NVIC_InitTypeDef NVIC_InitStruct; // 定义NVIC结构体变量
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); //NVIC分组
NVIC_InitStruct.NVIC_IRQChannel = EXTI2_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStruct);
}
void MY_EXTI_Init(void)
{
//第一步:初始化NVIC,用于处理中断
EXTI_NVIC_Init();
RCC_APB2PeriphClockCmd(KEY1_INT_GPIO_CLK, ENABLE);
// 第二步:初始化要连接的EXTI的GPIO
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU; //初始化成上拉输入模式
GPIO_InitStruct.GPIO_Pin = KEY1_INT_GPIO_PIN;
GPIO_Init(KEY1_INT_GPIO_PORT, &GPIO_InitStruct);
// 第三步:初始化EXTI用于产生中断/事件
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //打开AFIO的时钟
GPIO_EXTILineConfig(GPIO_PortSourceGPIOx, GPIO_PinSourcex); //外部中断输入线选择函数(实际上操作的是AFIO的寄存器)
EXTI_InitTypeDef EXTI_InitStruct;
EXTI_InitStruct.EXTI_Line = EXTI_Line2;
EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_InitStruct.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStruct);
}
// 第四条:编写中断服务函数(函数名去启动文件中去找)
void EXTI2_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line2) == SET)
{
LED_TOGGE;
EXTI_ClearITPendingBit(EXTI_Line2);
}
}
my_exti.h:
#ifndef __MY_EXTI_H
#define __MY_EXTI_H
#include "stm32f10x.h" // Device header
#define KEY1_INT_GPIO_PORT GPIOA
#define KEY1_INT_GPIO_PIN GPIO_Pin_2
#define KEY1_INT_GPIO_CLK RCC_APB2Periph_GPIOA
#define GPIO_PortSourceGPIOx GPIO_PortSourceGPIOA //中断输入线选择端口
#define GPIO_PinSourcex GPIO_PinSource2 // 中断输入线选择Pin
void MY_EXTI_Init(void);
#endif
led.c:
#include "led.h" // Device header
void LED_Init(void)
{
RCC_APB2PeriphClockCmd(GPIO_CLK, ENABLE);
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Pin = GPIO_PIN;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOx, &GPIO_InitStruct);
}
led.h:
#ifndef __LED_H
#define __LED_H
#include "stm32f10x.h" // Device header
#define GPIOx GPIOB
#define GPIO_PIN GPIO_Pin_0
#define GPIO_CLK RCC_APB2Periph_GPIOB
#define ON 1
#define OFF 0
#define LED(x) if(x)\
GPIO_ResetBits(GPIOx, GPIO_PIN);\
else \
GPIO_SetBits(GPIOx, GPIO_PIN);
#define LED_TOGGE {GPIOx->ODR ^= GPIO_PIN;}
void LED_Init(void);
#endif
main.c:
#include "stm32f10x.h" // Device header
#include "my_exti.h"
#include "led.h"
int main(void)
{
MY_EXTI_Init();
LED_Init();
while(1)
{
}
}