不错啊!!继续关注



外部中断的实验
循着正点的《STM32不完全手册》蹒跚前行,实验4 的外部中断实验,涉及到:3个按键(2个定义口不同),4个LED灯(原2个,扩到4个,定义口不同),中断(源、线、程序)。
按键的触发作为中断源,2个LED的变化,是对中断的响应,2个LED作为工作状态指示。
按键的预定义及初始程序
#define KEY0 PFin(11) //PF11 USER BUTTER
#define KEY1 PCin(13) //PC13 Anti-Tamper
#define KEY2 PAin(0) //PA0 WAKE_UP
初始程序#define KEY0 PFin(11) //PF11 USER BUTTER
#define KEY1 PCin(13) //PC13 Anti-Tamper
#define KEY2 PAin(0) //PA0 WAKE_UP
void KEY_Init(void)
{
RCC->APB2ENR|=1<<2; //使能PORTA时钟
RCC->APB2ENR|=1<<4; //使能PORTc时钟
RCC->APB2ENR|=1<<7; //使能PORTf时钟
GPIOA->CRL&=0XFFFFFFF0;//PA0设置成输入
GPIOA->CRL|=0X00000008;
GPIOF->CRH&=0XFFFF0FFF;//PF11设置成输入
GPIOF->CRH|=0X00008000;
GPIOF->ODR|=1<<11 ;
GPIOC->CRH&=0XFF0FFFFF;//PC13设置成输入
GPIOC->CRH|=0X00800000;
GPIOC->ODR|=1<<13 ;
}
//LED端口定义
#define LED0 PEout(4)// PE4 RED LED (LD5)
#define LED1 PEout(5)// PE5 GREEN LED (LD6)
#define LED2 PEout(2)// PE2 RED LED (LD3)
#define LED3 PEout(3)// PE3 RED LED (LD4)
//LED初始程序
void LED_Init(void)
{
RCC->APB2ENR|=1<<6; //使能PORTE时钟
GPIOE->CRL&=0XFF0000FF;
GPIOE->CRL|=0X00333300;//PE2~5推挽输出
GPIOE->ODR|=0X003c; //PE2~5输出高
}
//中断初始程序
void EXTIX_Init(void)
{
RCC->APB2ENR|=1<<2; //使能PORTA时钟
RCC->APB2ENR|=1<<4; //使能PORTC时钟 //
RCC->APB2ENR|=1<<7; //使能PORTF时钟 //
JTAG_Set(JTAG_SWD_DISABLE);//关闭JTAG和SWD
GPIOA->CRL&=0XFFFFFFF0;//PA0设置成输入
GPIOA->CRL|=0X00000008;
// GPIOA->CRH&=0X0F0FFFFF;//PA13,15设置成输入
// GPIOA->CRH|=0X80800000;
// GPIOA->ODR|=1<<13; //PA13上拉,PA0默认下拉
// GPIOA->ODR|=1<<15; //PA15上拉
GPIOF->CRH&=0XFFFF0FFF;//PF11设置成输入
GPIOF->CRH|=0X00008000;
GPIOF->ODR|=1<<11 ;
GPIOC->CRH&=0XFF0FFFFF;//PC13设置成输入
GPIOC->CRH|=0X00800000;
GPIOC->ODR|=1<<13 ;
Ex_NVIC_Config(GPIO_A,0,RTIR); //上升沿触发
Ex_NVIC_Config(GPIO_F,11,FTIR);//下降沿触发 //
Ex_NVIC_Config(GPIO_C,13,FTIR);//下降沿触发 //
// Ex_NVIC_Config(GPIO_A,13,FTIR);//下降沿触发 //
// Ex_NVIC_Config(GPIO_A,15,FTIR);//下降沿触发 //
MY_NVIC_Init(2,2,EXTI0_IRQChannel,2); //抢占2,子优先级2,组2
MY_NVIC_Init(2,1,EXTI15_10_IRQChannel,2);//抢占2,子优先级1,组2
}
被注解的,是原有的语句,为学习对比,仍保留着
int main(void)
{
Stm32_Clock_Init(9); //系统时钟设置
delay_init(72); //延时初始化
uart_init(72,115200); //串口初始化
LED_Init(); //初始化与LED连接的硬件接口
EXTIX_Init(); //外部中断初始化
LED3=0; //led test
while(1)
{
printf("OK\n");
delay_ms(1000);
LED2=!LED2 ; //闪
LED3=!LED3;
}
}
主程序,只增加了2个LED闪动,交替的闪动,说明运行在主程序的循环里,否则,哈,找原因去吧。(曾利用这点,找到了中断程序中问题:未正确清除中断标志位,而一直处在中断状态,无暇去闪动LED)

JACKWANG帮在EEPW视频平台发布了2段视频:
“sacq”的STM32运行uCGUI演示的视频片段1
"sacq"的STM32运行uCGUI演示的视频片段2
或 http://forum.eepw.com.cn/thread/210625/4#35


回复
打赏帖 | |
---|---|
C语言函数宏的三种封装方式被打赏50分 | |
【STM32F769】记一次由于开启D-Cache之后DMA数据传输出错的问题查找与解决被打赏35分 | |
嵌入式LinuxC语言程序调试和宏使用技巧被打赏50分 | |
让代码中包含最新的编译时间信息被打赏50分 | |
【分享开发笔记,赚取电动螺丝刀】STM32F769LVGL优化显示被打赏26分 | |
rtthread硬件加密--2crc加密分析被打赏10分 | |
【分享开发笔记,赚取电动螺丝刀】STM32F769驱动ST7789以及显示优化被打赏36分 | |
【分享开发笔记,赚取电动螺丝刀】S32K146 PAL模拟I2C驱动适配被打赏23分 | |
我想要一部加热台+电源硬件设计规范被打赏16分 | |
我想要一部加热台+LED背光驱动芯片RT9293知识被打赏18分 |