新手入门
- 积分
- 17
- 金钱
- 17
- 注册时间
- 2019-4-28
- 在线时间
- 3 小时
|
发表于 2022-7-11 03:39:59
|
显示全部楼层
我自己改了按键实验,发现两个小瑕疵:1、main函数里EXTI_EMR寄存器不需要设置,2、清除SWIER标志手册里介绍的是通过往PR寄存器对应位写1来实现。下面是代码,通过3个按键控制2个LED和蜂鸣器翻转输出。
key.c文件代码:
#include "key.h"
#include "delay.h"
void KEY_Init()
{
GPIO_InitTypeDef GPIO_InitTypeDef_KEY;
NVIC_InitTypeDef NVIC_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOE,ENABLE);
GPIO_InitTypeDef_KEY.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitTypeDef_KEY.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_4;
GPIO_Init(GPIOE,&GPIO_InitTypeDef_KEY);
GPIO_InitTypeDef_KEY.GPIO_Mode = GPIO_Mode_IPD;
GPIO_InitTypeDef_KEY.GPIO_Pin = GPIO_Pin_0;
GPIO_Init(GPIOA,&GPIO_InitTypeDef_KEY);
NVIC_InitStruct.NVIC_IRQChannel = EXTI0_IRQn;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 3;
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;
NVIC_Init(&NVIC_InitStruct);
NVIC_InitStruct.NVIC_IRQChannel = EXTI1_IRQn;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 3;
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 2;
NVIC_Init(&NVIC_InitStruct);
NVIC_InitStruct.NVIC_IRQChannel = EXTI2_IRQn;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 3;
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 3;
NVIC_Init(&NVIC_InitStruct);
}
unsigned char KEY_Scan(unsigned char mode)
{
static unsigned char key_up_bit = 1;
if(mode)
{
key_up_bit =1;
}
if(key_up_bit && (KEY0 == 0 ||KEY1 == 0 ||KEY_UP == 1))
{
key_up_bit = 0;
delay_ms(15);
if(KEY0==0)
{
return 1;
}
else if(KEY1==0)
{
return 2;
}
else if(KEY_UP==1)
{
return 3;
}
}
else if(KEY0 == 1 && KEY1 == 1 && KEY_UP == 0)
{
key_up_bit = 1;
}
return 0;
}
void EXTI0_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line0) != 0)
{
if(GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_5) != 0)
{
GPIO_WriteBit(GPIOB,GPIO_Pin_5,Bit_RESET);
}else
{
GPIO_WriteBit(GPIOB,GPIO_Pin_5,Bit_SET);
}
}
EXTI->PR |= 0x0001 ;
}
void EXTI1_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line1) != 0)
{
if(GPIO_ReadOutputDataBit(GPIOE,GPIO_Pin_5) != 0)
{
GPIO_WriteBit(GPIOE,GPIO_Pin_5,Bit_RESET);
}else
{
GPIO_WriteBit(GPIOE,GPIO_Pin_5,Bit_SET);
}
}
EXTI->PR |= 0x0001<<1 ;
}
void EXTI2_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line2) != 0)
{
if(GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_8) != 0)
{
GPIO_WriteBit(GPIOB,GPIO_Pin_8,Bit_RESET);
}else
{
GPIO_WriteBit(GPIOB,GPIO_Pin_8,Bit_SET);
}
}
EXTI->PR |= 0x0001<<2 ;
}
main函数代码:
#include "stm32f10x.h"
#include "key.h"
#include "led.h"
#include "beep.h"
#include "delay.h"
int main()
{
unsigned char key_value;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
LED_Init();
BEEP_Init();
KEY_Init();
delay_init();
EXTI->IMR |= 0x07;//0000 0111
while(1)
{
key_value = KEY_Scan(0);
if(key_value)
{
switch(key_value)
{
case 1:
EXTI->SWIER |= 0x0001;break;
case 2:
EXTI->SWIER |= 0x0001<<1;break;
case 3:
EXTI->SWIER |= 0x0001<<2;break;
}
} else delay_ms(10);
}
}
|
|