完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
#include "STM32f10x.h"
void gpio_init()//PA0为外部中断触发脚,PA2控制led { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOAtiNG; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_ResetBits(GPIOA , GPIO_Pin_2); } void EXTI_init()//PA0与EXTI_Line0连通 { EXTI_InitTypeDef EXTI_InitStructure; GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0); // 管脚选择 EXTI_ClearITPendingBit(EXTI_Line0); EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;// EXTI_Trigger_Rising EXTI_InitStructure.EXTI_Line = EXTI_Line0; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); } void NVIC_Config(void) { NVIC_InitTypeDef NVIC_InitStructure; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); NVIC_InitStructure.NVIC_IRQChannel = EXTI_Line0; //通道 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;// NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } int main(void) { gpio_init(); EXTI_init(); NVIC_Config(); while(1); } void EXTI0_IRQHandler(void) { if( EXTI_GetITStatus(EXTI_Line0) != RESET ) { EXTI_ClearITPendingBit(EXTI_Line0); GPIO_SetBits(GPIOA , GPIO_Pin_2); } } 这是中断服务函数,我硬件仿真过,进不来 为什么外部中断服务函数进不去呢? |
|
相关推荐
6个回答
|
|
又是一大堆的程序
|
|
|
|
邀请回答
一,你没说清楚PA0是否挂载按键,按键另外一端是Vcc还是接地 默认为外部中断挂载按键 若PA0挂载了按键且按键另外一端接地,则应设置PA0为上拉输入,触发方式为下降沿触发 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(GPIOA, &GPIO_InitStructure); EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; 若PA0挂载了按键且按键另外一端接Vcc,则应设置PA0为下拉 输入,触发方式为上升沿触发 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; GPIO_Init(GPIOA, &GPIO_InitStructure); EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; 修改中断handler函数 void EXTI0_IRQHandler(void) { if( EXTI_GetITStatus(EXTI_Line0) != RESET ) { EXTI_ClearITPendingBit(EXTI_Line0); GPIO_SetBits(GPIOA , GPIO_Pin_2); } } 定义PA2LED翻转函数 void Toggle_PA2() { if(GPIO_ReadOtputDataBit (GPIOA,GPIO_Pin_2)==1) { GPIO_WriteBit(GPIOA,GPIO_Pin_2,0); } if(GPIO_ReadOtputDataBit (GPIOA,GPIO_Pin_2)==0) { GPIO_WriteBit(GPIOA,GPIO_Pin_2,1); } } 为 (若PA0挂载按键且另一端接地,PA0为上拉输入的情况) void EXTI0_IRQHandler(void) { delay_ms(10); //消抖 if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)==0) { Toggle_PA2(); } EXTI_ClearITPendingBit(EXTI_Line0); //清除EXTI0线路挂起位 } (若PA0挂载按键且另一端接Vcc,PA0为下拉输入的情况) void EXTI0_IRQHandler(void) { delay_ms(10); //消抖 if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)==1) { Toggle_PA2(); } EXTI_ClearITPendingBit(EXTI_Line0); //清除EXTI0线路挂起位 } |
|
|
|
|
|
|
|
设置一下NVIC_IRQChannel
|
|
|
|
|
|
|
|
邀请回答
嗨,這行有錯誤喔 NVIC_InitStructure.NVIC_IRQChannel = EXTI_Line0; //通道 改成 NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; 以上希望有解決您的問題 |
|
|
|
只有小组成员才能发言,加入小组>>
800 浏览 0 评论
1156 浏览 1 评论
2531 浏览 5 评论
2863 浏览 9 评论
移植了freeRTOS到STMf103之后显示没有定义的原因?
2714 浏览 6 评论
keil5中manage run-time environment怎么是灰色,不可以操作吗?
1090浏览 3评论
195浏览 2评论
461浏览 2评论
374浏览 2评论
M0518 PWM的电压输出只有2V左右,没有3.3V是怎么回事?
456浏览 1评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-25 01:29 , Processed in 1.935927 second(s), Total 89, Slave 70 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号