完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
实现四个按钮分别控制四个LED灯,按一次亮,再按一次熄灭。
掌握芯片的终端机制,并学会进行中断配置。 GPIO控制器 -> SYSCFG选择器 -> EXTI外部中断控制器 -> NVIC中断控制器 startup_stm32f40x.s中修改成如下: 记得IMPORT,否则报错BADSymbol: rj_led.h代码: #ifndef LED_H #define LED_H #include "stm32f4xx.h" void led_init(void); void led_ctrl(int led_n); void delay(int num); void led_loop(void); #endif rj_led.c代码: #include "rj_led.h" #include "systick.h" void led_init() { GPIO_InitTypeDef P; /*使能GPIOD的时钟*/ RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE); /*配置PD0,PD1,PD2,PD3,为输出模式,输出类型为输出推挽, 速率为50MHz,无上拉下拉电阻*/ P.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3; P.GPIO_Mode = GPIO_Mode_OUT; P.GPIO_OType = GPIO_OType_PP; P.GPIO_Speed = GPIO_Speed_50MHz; P.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOD, &P); } void led_ctrl(int led_n) { switch(led_n) { case 1: { /*控制LED1亮,其他灯熄灭,给PD0端口置1,PD1,PD2,PD3端口置0*/ GPIO_SetBits(GPIOD, GPIO_Pin_0); GPIO_ResetBits(GPIOD, GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3); break; } case 2: { /*控制LED2亮,其他灯熄灭,给PD1端口置1,PD0,PD2,PD3端口置0*/ GPIO_SetBits(GPIOD, GPIO_Pin_1); GPIO_ResetBits(GPIOD, GPIO_Pin_0|GPIO_Pin_2|GPIO_Pin_3); break; } case 3: { /*控制LED3亮,其他灯熄灭,给PD2端口置1,PD1,PD0,PD3端口置0*/ GPIO_SetBits(GPIOD, GPIO_Pin_2); GPIO_ResetBits(GPIOD, GPIO_Pin_1|GPIO_Pin_0|GPIO_Pin_3); break; } case 4: { /*控制LED4亮,其他灯熄灭,给PD3端口置1,PD1,PD2,PD0端口置0*/ GPIO_SetBits(GPIOD, GPIO_Pin_3); GPIO_ResetBits(GPIOD, GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_0); break; } default: break; } } void delay(int num) { while(num--); } void led_loop() //LED等循环点亮; { int led_count=1; for(led_count=1;led_count<5;led_count++) { led_ctrl(led_count); delay_ms(200); } } rj_init_key.h代码: #ifndef KEY_INT_H #define KEY_INT_H #include "stm32f4xx.h" void key_int_init(void); void key_irqHandler(void); #endif rj_init_key.c代码: #include "stm32f4xx.h" /* KEY -> PA -> EXTI -> NVIC -> CPU EXTI_IRQHandler */ void key_int_init(void) { //时钟使能; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOE,ENABLE); /*配置端口,为输入模式,速率为50MHz,不上拉*/ GPIO_InitTypeDef p; p.GPIO_Pin=GPIO_Pin_0; p.GPIO_Mode=GPIO_Mode_IN; p.GPIO_Speed=GPIO_Speed_50MHz; //p.GPIO_OType=GPIO_OType_PP; //输出推挽; p.GPIO_PuPd=GPIO_PuPd_NOPULL; GPIO_Init(GPIOA,&p); p.GPIO_Pin=GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4; GPIO_Init(GPIOE,&p); /*SYSCFG选择器的配置*/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); //时钟使能; SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA,EXTI_PinSource0); //选择PA0作为外部中断的输入引脚; SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE,EXTI_PinSource2); //PE2 SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE,EXTI_PinSource3); //PE3 SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE,EXTI_PinSource4); //PE4 /*外部中断控制器的配置*/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_EXTIT, ENABLE);//时钟使能; EXTI_InitTypeDef e; e.EXTI_Line=EXTI_Line0|EXTI_Line2|EXTI_Line3|EXTI_Line4; e.EXTI_Mode=EXTI_Mode_Interrupt; //中断模式; e.EXTI_LineCmd=ENABLE; e.EXTI_Trigger=EXTI_Trigger_Rising; //上升沿; EXTI_Init(&e); /*NVIC的控制*/ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//pre:2,sub:2 NVIC_InitTypeDef n; n.NVIC_IRQChannel=EXTI0_IRQn; n.NVIC_IRQChannelCmd=ENABLE; //n.NVIC_IRQChannelPreemptionPriority = 0x02; //n.NVIC_IRQChannelSubPriority = 0x02; NVIC_Init(&n); n.NVIC_IRQChannel=EXTI2_IRQn; NVIC_Init(&n); n.NVIC_IRQChannel=EXTI3_IRQn; NVIC_Init(&n); n.NVIC_IRQChannel=EXTI4_IRQn; NVIC_Init(&n); } //uint8_t status = 0; //void key_irqHandler(void) //{ // // 1.EXTI_GetITStatus // if (EXTI_GetITStatus(EXTI_Line0) == SET) // { // status = 1; // //EXTI_ClearFlag 清除中断标识,否则会一直产生中断; // EXTI_ClearFlag(EXTI_Line0); // } // //} //中断函数,按一下亮,再按一下灭 int f1 = 0, f2 = 0, f3 = 0, f4 = 0; void key_irqHandler(void) { if (EXTI_GetITStatus(EXTI_Line0) == SET) { if (f1 == 0) { GPIO_SetBits(GPIOD, GPIO_Pin_0); f1 = 1; } else { GPIO_ResetBits(GPIOD, GPIO_Pin_0); f1 = 0; } EXTI_ClearITPendingBit(EXTI_Line0); } if (EXTI_GetITStatus(EXTI_Line2) == SET) { if (f2 == 0) { GPIO_SetBits(GPIOD, GPIO_Pin_1); f2 = 1; } else { GPIO_ResetBits(GPIOD, GPIO_Pin_1); f2 = 0; } EXTI_ClearITPendingBit(EXTI_Line2); } if (EXTI_GetITStatus(EXTI_Line3) == SET) { if (f3 == 0) { GPIO_SetBits(GPIOD, GPIO_Pin_2); f3 = 1; } else { GPIO_ResetBits(GPIOD, GPIO_Pin_2); f3 = 0; } EXTI_ClearITPendingBit(EXTI_Line3); } if (EXTI_GetITStatus(EXTI_Line4) == SET) { if (f4 == 0) { GPIO_SetBits(GPIOD, GPIO_Pin_3); f4 = 1; } else { GPIO_ResetBits(GPIOD, GPIO_Pin_3); f4 = 0; } EXTI_ClearITPendingBit(EXTI_Line4); } } main.c #include "main.h" #include "rj_led.h" #include "rj_int_key.h" #include "systick.h" //#include "rj_buzzer.h" //extern uint8_t status; int main(void) { //status=0; led_init(); key_int_init(); while (1) { } } |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1614 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1541 浏览 1 评论
970 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
682 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1592 浏览 2 评论
1863浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
644浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
515浏览 3评论
531浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
504浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 00:39 , Processed in 0.683810 second(s), Total 77, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号