OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5065|回复: 1

我做外部中断的实验,是按键下降沿触发,led灯状态变一次,可是有时候能成功,有时候就是不行啊

[复制链接]

50

主题

385

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1126
金钱
1126
注册时间
2014-8-24
在线时间
146 小时
发表于 2014-11-22 10:42:34 | 显示全部楼层 |阅读模式
5金钱
[mw_shl_code=c,true]//?à??×??? typedef unsigned char bool; typedef unsigned char u8; typedef unsigned short u16; #define True 1 #define False 0 //SET BIT. Example: a |= SETBIT0 enum { SETBIT0 = 0x0001, SETBIT1 = 0x0002, SETBIT2 = 0x0004, SETBIT3 = 0x0008, SETBIT4 = 0x0010, SETBIT5 = 0x0020, SETBIT6 = 0x0040, SETBIT7 = 0x0080, SETBIT8 = 0x0100, SETBIT9 = 0x0200, SETBIT10 = 0x0400, SETBIT11 = 0x0800, SETBIT12 = 0x1000, SETBIT13 = 0x2000, SETBIT14 = 0x4000, SETBIT15 = 0x8000 }; //CLR BIT. Example: a &= CLRBIT0 enum { CLRBIT0 = 0xFFFE, CLRBIT1 = 0xFFFD, CLRBIT2 = 0xFFFB, CLRBIT3 = 0xFFF7, CLRBIT4 = 0xFFEF, CLRBIT5 = 0xFFDF, CLRBIT6 = 0xFFBF, CLRBIT7 = 0xFF7F, CLRBIT8 = 0xFEFF, CLRBIT9 = 0xFDFF, CLRBIT10 = 0xFBFF, CLRBIT11 = 0xF7FF, CLRBIT12 = 0xEFFF, CLRBIT13 = 0xDFFF, CLRBIT14 = 0xBFFF, CLRBIT15 = 0x7FFF }; //CHOSE BIT. Example: a = b&CHSBIT0 enum { CHSBIT0 = 0x0001, CHSBIT1 = 0x0002, CHSBIT2 = 0x0004, CHSBIT3 = 0x0008, CHSBIT4 = 0x0010, CHSBIT5 = 0x0020, CHSBIT6 = 0x0040, CHSBIT7 = 0x0080, CHSBIT8 = 0x0100, CHSBIT9 = 0x0200, CHSBIT10 = 0x0400, CHSBIT11 = 0x0800, CHSBIT12 = 0x1000, CHSBIT13 = 0x2000, CHSBIT14 = 0x4000, CHSBIT15 = 0x8000 }; /* INCLUDES */ //MCU #include "stm32f10x_rcc.h" #include "stm32f10x_gpio.h" #include "stm32f10x_exti.h" //?è??PB10×??? STM32-MINI??·?°???LED???? void SetPB10(bool sta) { static bool StartFlag = True; if(StartFlag) { GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); StartFlag = False; } if(!sta) GPIO_SetBits(GPIOB, GPIO_Pin_10); else GPIO_ResetBits(GPIOB, GPIO_Pin_10); } //???????????? ????PB8 void ExtINTConfig(void) { GPIO_InitTypeDef GPIO_InitStructure; EXTI_InitTypeDef EXTI_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; //???????????? EXTI_DeInit(); //??PB???±?? RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE); //IO???? PB8 ???????? GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; GPIO_Init(GPIOB, &GPIO_InitStructure); //PB8???????? ?è?? GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource8); EXTI_InitStructure.EXTI_Line = EXTI_Line8; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //????????·? EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); //?????????? NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } //???????????í void EXTI9_5_IRQHandler(void) { static bool flag = 0; //??????×??? if(EXTI_GetITStatus(EXTI_Line8)) { //???????? EXTI_ClearFlag(EXTI_Line8); //????±ê???? EXTI_ClearITPendingBit(EXTI_Line8); //???????????í SetPB10(flag); flag = !flag; } } /*------------------------------------------------------------------------------------------------------- * ???ò?????????? * ±????ò?¨??PB8???????? ±???LED×???(??PB8??????3.3V LED????·??ú×?????±?) * STM32?? 3.3V?©?? ??5V??????MCU -------------------------------------------------------------------------------------------------------*/ int main(void) { //--------------------------- CLK INIT, HSE PLL ---------------------------- ErrorStatus HSEStartUpStatus; //RCC reset RCC_DeInit(); //?????????±?? ???????????? RCC_HSEConfig(RCC_HSE_ON); //?????????±??×?±??? HSEStartUpStatus = RCC_WaitForHSEStartUp(); //?????§°? ?????????? while(HSEStartUpStatus == ERROR); //?è??????×????±?? RCC_HCLKConfig(RCC_SYSCLK_Div1); RCC_PCLK1Config(RCC_HCLK_Div1); RCC_PCLK2Config(RCC_HCLK_Div1); //?????±????8M ????±?????72M RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); RCC_PLLCmd(ENABLE); while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); while(RCC_GetSYSCLKSource() != 0x08); //----------------------------- CLOSE HSI --------------------------- //??±??????±??HSI RCC_HSICmd(DISABLE); //??PB???±?? RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //???????? 2-level interrupt NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //??×????? __enable_irq(); //???????????? ExtINTConfig(); //???????? while(1); } [/mw_shl_code]
注释好像都乱码了……忽略注释吧,反正是下降沿触发,但是实际图是这样的


channel1是 按键
channel2是 led
不全是下降沿触发的呀

最佳答案

查看完整内容[请看2#楼]

好吧……自己加了个延时防抖就行了…… 因为在波形检测时,在us级别也没看到任何抖动,就觉得不用加,但是加了之后就好了
找一份喜欢的工作,这样每天工作的8个小时是快乐的。 找一个喜欢的人,这样每天工作之外的16个小时也是快乐的。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

50

主题

385

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1126
金钱
1126
注册时间
2014-8-24
在线时间
146 小时
 楼主| 发表于 2014-11-22 10:42:35 | 显示全部楼层
好吧……自己加了个延时防抖就行了……
因为在波形检测时,在us级别也没看到任何抖动,就觉得不用加,但是加了之后就好了
找一份喜欢的工作,这样每天工作的8个小时是快乐的。 找一个喜欢的人,这样每天工作之外的16个小时也是快乐的。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-29 02:51

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表