keil5纯手敲代码,实现按键中断,对中断的理解更近一步,当然离不开New Bing 的帮助。
关于New Bing:之前在使用GPT 3.5和其他大语言模型,相比之下,New Bing的回答速度稍慢些,但是准确率和人性化的程度丝毫不逊色,感觉使用的是GPT-4模型(一些奇葩问题也能作答)。
使用方法:首先注册微软账号,打开EDGE浏览器,然后绕过重定向,进入网址https://bing.com/.之后需要将设置中的国家和地区更改一下。
言归正传,本次实验的文件树就是最基本的STM32工程模板,具体方法有很多经验帖子介绍
用keil5新建STM32工程(超详细的图解操作)_keil5stm32_小治成长记的博客-优快云博客
keil5新建STM32工程文件--实践篇手把手教学(以STM32F103为例)_stm32keil5新建工程_专揍小Wuwu的博客-优快云博客
代码部分:
#include "stm32f30x.h"
#include "stm32f30x_exti.h"
#include "stm32f30x_misc.h"
volatile uint16_t i;
volatile uint8_t stop_breathing=0;//呼吸灯停止标志
void EXTI15_10_IRQHandler(void);
void delay(uint16_t n)
{
while(n--)
{
if(stop_breathing)
break;
}
}
int main(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOB, &GPIO_InitStructure);
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOC, EXTI_PinSource13);
EXTI_InitStructure.EXTI_Line = EXTI_Line13;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn ;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
while(1)
{
if(!stop_breathing)
{
for(i=0;i<2000;i++)
{
GPIO_SetBits(GPIOB,GPIO_Pin_13);
delay(i);
GPIO_ResetBits(GPIOB,GPIO_Pin_13);
delay(2000-i);
}
for(i=0;i<2000;i++)
{
GPIO_ResetBits(GPIOB,GPIO_Pin_13);
delay(i);
GPIO_SetBits(GPIOB,GPIO_Pin_13);
delay(2000-i);
}
}
}
}
void EXTI15_10_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line13) == SET)
{
/*if(GPIO_ReadOutputDataBit( GPIOB, GPIO_Pin_13)==RESET)
GPIO_SetBits(GPIOB, GPIO_Pin_13);
else
GPIO_ResetBits(GPIOB, GPIO_Pin_13);
//delay(20000);*/
delay(1000);
if(GPIO_ReadInputDataBit( GPIOC, GPIO_Pin_13)==RESET)
stop_breathing=!stop_breathing;
EXTI_ClearITPendingBit(EXTI_Line13);
}
}
实验现象,上电后LED实现呼吸灯效果,按键控制呼吸灯开关