不错啊!!继续关注
外部中断的实验
循着正点的《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
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
与电子爱好者谈读图四被打赏50分 | |
与电子爱好者谈读图二被打赏50分 | |
【FRDM-MCXN947评测】Core1适配运行FreeRtos被打赏50分 | |
【FRDM-MCXN947评测】双核调试被打赏50分 | |
【CPKCORRA8D1B评测】---移植CoreMark被打赏50分 | |
【CPKCORRA8D1B评测】---打开硬件定时器被打赏50分 | |
【FRDM-MCXA156评测】4、CAN loopback模式测试被打赏50分 | |
【CPKcorRA8D1评测】--搭建初始环境被打赏50分 | |
【FRDM-MCXA156评测】3、使用FlexIO模拟UART被打赏50分 | |
【FRDM-MCXA156评测】2、rt-thread MCXA156 BSP制作被打赏50分 |