完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
使用的是STM32f107vc芯片,想要达到的效果是LED1亮,按下Key1,LED1灭,再按下Key1,LED1灯亮,如此循环:
#include "stm32f10x.h" #define BitBand(addr,n) *(volatile unsigned long*)((addr & 0xf0000000)+0x20000000+(addr & 0xfffff)*32+n*4) //位绑定公式 #define GPIOC_ODR_A (GPIOC_BASE+0x0c) #define GPIOC_IDR_A (GPIOC_BASE+0x08) #define GPIOD_ODR_A (GPIOD_BASE+0x0c) #define GPIOD_IDR_A (GPIOD_BASE+0x08) #define PCout(n) BitBand(GPIOC_ODR_A,n) #define PCin(n) BitBand(GPIOC_IDR_A,n) #define PDout(n) BitBand(GPIOD_ODR_A,n) #define PDin(n) BitBand(GPIOD_IDR_A,n) #define Key1 PCin(4) #define LED1 PDout(2) void RCC_Configuration(void); void GPIO_Configuration(void); void EXTI_Configuration(void); void NVIC_Configuration(void); int main(void) { RCC_Configuration(); GPIO_Configuration(); EXTI_Configuration(); NVIC_Configuration(); LED1=0; //开始点亮LED灯 while(1); } void RCC_Configuration(void) { RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); } void GPIO_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC,&GPIO_InitStructure); GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOD,&GPIO_InitStructure); } void EXTI_Configuration(void) { EXTI_InitTypeDef EXTI_InitStructure; EXTI_InitStructure.EXTI_Line = EXTI_Line4; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); } void NVIC_Configuration(void) { NVIC_InitTypeDef NVIC_InitStructure; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource4); NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } void EXTI4_IRQHandler(void) { delay_ms(10); if(Key1==0) //判断是否有中断 { LED1=!LED1; //LEd灯翻转 } EXTI_ClearITPendingBit(EXTI_Line4); //清空中断标志位 } |
|
相关推荐
14个回答
|
|
可能是你IO口配置的问题,模式设为_ipu看下,设为上拉
|
|
|
|
|
|
|
|
|
|
|
|
先说明你的问题现象吧,这样好判断,如果连中断都没进入,那讨论中断程序也没什么意义
|
|
|
|
STM32吗?
|
|
|
|
|
|
|
|
现象就是没什么反应,按下Key1 没变化,我在主程序在写个其他判断程序在试试,看看进没进中断 |
|
|
|
|
|
|
|
如果软件没有问题的话,先用万用表测一下你那个设置的中断引脚到底有没有发生中断(电压的变化)。
|
|
|
|
尼玛。。。。。问题找到了,是位绑定公式写错了!!!!0x20000000多写了个0改成0x200000!!位绑定函数是粘贴复制之前的,没检查。。。。真是大问题!
|
|
|
|
解决了吗? 我初学,和你碰到一样的问题,卡这过不去了。中断似乎没响应,不知道怎样去验证》
|
|
|
|
自己解决了,太气人了,函数初始化没写在main里,初学没有注意书写格式,main函数下面的函数名有的在main函数前面声明了,有的在main里初始化了,以为是一样的,其实一个是声明,一个是初始化。 #include "stm32f10x.h" #include "stm32f10x_gpio.h" #include "stm32f10x_rcc.h" #include "stm32f10x_exti.h" void delay_ms(u16 time_ms) { u16 i=0; while(time_ms --) { i=12000; while(i--); } } void key_gpio_init(void); void NVIC_init (void ); void EXTI1_init(void ); int main(void) { key_gpio_init(); NVIC_init (); EXTI1_init(); GPIO_SetBits (GPIOB,GPIO_Pin_8 ); while(1); } |
|
|
|
嘻嘻嘻嘻嘻嘻嘻嘻嘻嘻嘻嘻嘻嘻嘻嘻嘻嘻嘻
|
|
|
|
建议近debug,看看代码跑到了什么位置,有没有进入中断。新手的调试代码的方式,printf
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
1441 浏览 1 评论
AD7686芯片不传输数据给STM32,但是手按住就会有数据。
1373 浏览 3 评论
3018 浏览 0 评论
如何解决MPU-9250与STM32通讯时,出现HAL_ERROR = 0x01U
1519 浏览 1 评论
hal库中i2c卡死在HAL_I2C_Master_Transmit
1949 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-3 21:43 , Processed in 0.882067 second(s), Total 99, Slave 83 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号