初级会员
- 积分
- 94
- 金钱
- 94
- 注册时间
- 2019-7-20
- 在线时间
- 26 小时
|
1金钱
#include "sys.h"
#include "usart.h"
#include "delay.h"
#define GPIO_A 0
#define GPIO_B 1
#define GPIO_C 2
#define GPIO_D 3
#define GPIO_E 4
#define GPIO_F 5
#define GPIO_G 6
#define FTIR 1 //下降沿触发
#define RTIR 2 //上升沿触发
#define PA0 PAin(0)
// sys.h 里有 中断优先级先不看,手册没讲寄存器
void Ex_NVIC_Config(u8 GPIOx,u8 BITx,u8 TRIM)
{
u8 EXTADDR;
u8 EXTOSET;
EXTADDR|=BITx/4;
EXTOSET|=(BITx%4)*4;//移到相应组里
RCC->APB2ENR|=0X01; //开启AFIO使能
AFIO->EXTICR[EXTADDR]&=0XFFF0<<EXTOSET;
/* stm32f10x.h里每个组16位,对应中断位开始都被置了1,32中文参考手册那里选PA~G是没有1111的 所以先将那组清零,为下一步 */
AFIO->EXTICR[EXTADDR]|=GPIOx<<EXTOSET;
/* 设置是PA~G的哪个 */
//哪个IO口呢,下面
EXTI->IMR|=1<<BITx;//开启哪个中断线
if(TRIM&0x01)EXTI->FTSR|=1<<BITx;//line BITx上事件下降沿触发
if(TRIM&0x02)EXTI->RTSR|=1<<BITx;//line BITx上事件上升降沿触发
}
void key_init()
{
RCC->APB2ENR|=1<<2;
GPIOA->CRL&=0XFFFFFFF0;
GPIOA->CRL|=0X00000008; //PA0下拉
}
void led_init()
{
RCC->APB2ENR|=1<<3;
GPIOB->CRL&=0XFF0FFFFF;
GPIOB->CRL|=0X00300000;//PB5推挽
PBout(5)=1;
}
int main(void)
{
Stm32_Clock_Init(9); //系统时钟设置
delay_init(72); //延时初始化
uart_init(72,115200); //串口初始化为 115200
key_init();
led_init();
MY_NVIC_Init(2,3,EXTI0_IRQn,2); //抢占2,子优先级3,组2
// MY_NVIC_Init(2,3,EXTI1_IRQn,2);
Ex_NVIC_Config(GPIO_A,0,RTIR);
//Ex_NVIC_Config(GPIO_A,1,RTIR);
while(1)
{
//EXTI->SWIER|=1<<1;
//delay_ms(300);
}
}
void EXTI0_IRQHandler()
{
delay_ms(10);
if(PA0==1)
{
PBout(5)=~PBout(5);
}
EXTI->PR=1<<0; //清除对应中断标志
}
//void EXTI1_IRQHandler()
//{
//
//
// PBout(5)=~PBout(5);
//
// EXTI->PR=1<<1; //清除对应中断标志
//}
|
|