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