stm32按键中断程序和中断的区别

按键中断:,最全面的按键中断:文章 - 电子工程世界网
在电子工程世界为您找到如下关于“按键中断:”的新闻
按键中断:资料下载
的独立式键盘输入实验 64
实例70:软件消抖的独立式键盘输入实验 64
实例71:CPU控制的独立式键盘扫描实验 65
实例72:定时器中断控制的独立式键盘扫描实验 68
实例73:独立式键盘控制的4级变速流水灯 71
实例74:独立式键盘的按键功能扩展:\&以一当四\& 73
实例75:独立式键盘调时的数码时钟实验 75
实例76:独立式键盘控制步进电机实验 79...
4×4行列式按键开关的使用第7章 ATMEGAl6(L)的中断系统使用 7.1 ATMEGA16(L)的中断系统 7.2 相关的中断控制寄存器 7.3 INT1外部中断实验 7.4 INTO/INTl中断计数实验 7.5 INTO/INTl中断嵌套实验 7.6 2路防盗报警器实验 7.7 低功耗睡眠模式下的按键中断 7.8 4×4行列式按键的睡眠模式中断唤醒设计第8章...
6_3:基于中断带消隐的数码管动态显示示例,所在章节6.5
6_t4:练习题4,在lesson6_3多位数字显示的基础上不显示高位的0,所在章节6.6
6_t5:练习题5,变更lesson6_3的正计数为倒计数,所在章节6.6
lesson7 (第7章):
7_1:基于数码管计时程序的静态变量演示,所在章节7.2
7_2:点亮LED点阵上的一个点,所在...
软件延时在数码管上显示1234ABCD。这是比较普遍的数码管显示。P14接通
12-disp1234int -- 采用硬件延时在数码管上显示1234ABCD。利用中断可以节约资源,这个程序比10更好。P14接通
13-adddec -- 使用两个按键S22,S23控制数码管上显示的数加减,具有去抖动功能。主要讲如何进行数码管动态显示并且怎样对键盘去抖动。P14接通...
 3.33 用计数器中断实现100以内的按键计数
 3.34 10 000s以内的计时程序
 3.35 定时器控制数码管动态显示
 3.36 8×8 LED点阵屏显示数字
 3.37 按键控制8×8 LED点阵屏显示图形
 3.38 用定时器设计的门铃
 3.39 演奏音阶
 3.40 按键控制定时器选播多段音乐
 3.41 定时器控制交通...
单片机指令系统分析   1.3.1指令系统的寻址方式   1.3.2指令系统的使用要点   1.3.3指令系统分类总结   1.4串行接口与定时/计数器   1.4.1串行接口简介   1.4.2定时器/计数器的结构   1.4.3定时器/计数器的四种工作模式   1.4.4定时器/计数器对输入信号的要求   1.4.5定时器/计数器的编程和应用   1.5中断系统   1.5.1中断请求源...
3 keyint -- 按键中断测试 该项目在SDT2.51下编译调试。主程序是while空循环,中断服务程序对应四个按键做相应的处理,key1 按键点亮D1灯,并在串口打印信息,因为没有加按键去抖动程序,所以,一次按键,产生几次中断。...
实时性任务&& 实时突发性任务;实时周期性任务&弱实时性任务 强实时性任务实时突发性任务:任务的发生具有随机性和突发性,是一种异步中断事件。主要包括故障中断(急停,机械限位、硬件故障等)、机床PLC中断、硬件(按键)操作中断等。实时周期性任务:任务是精确地按一定时间间隔发生的。主要包括插补运算、位置控制等任务。为保证加工精度和加工过程的连续性,这类任务处理的实时性是关键...
MSP430入门教程专题(六)——IO中断方式按键检测//MSP430F14-利用IO中断方式实现按键检测程序
/*************************************************************************/
//以下是结合MC430F14开发板来实现的按键检处理程序实验.
实现pc机键盘(p/s2接口)与8位单片机连接使用原理:键盘时钟接在p3.2口,既8051的外部中断int0上,键盘数据接到p1.0上每次按键,键盘会向单片机发脉冲使单片机发生外部中断,数据有p1.0口一位一位传进来传回的数据格式为:1位开始位(0),8位数据位(所按按键的通码,用来识别按键),1位校验位(奇校验)1位结束位(1)实现:将键盘发回的数据放到一个缓冲区里(数组),当按键结束后发生...
按键中断:相关帖子
与单片机连接,输入字符;输出设备是超级终端和12864的液晶。scanf从串口读入字符,printf输出字符到串口和液晶。
scanf还可以从按键读取信息,可以参考移置方法自行移置。程序实现:
printf单片机在调用printf时,printf是负责将数据解析成ASCII码流,通过调用putchar函数依次将字符发出。如果在putchar内编写从串口发送一字节数据,则printf的结果将从单片机...
外部触发信号的检测:一种是基于实时性的要求,比如可控硅的控制,突发性信号的检测等;而另一种情况则是省电的需要;
信号频率的测量:可以通过上升沿或者下降沿触发中断;
按键的检测和系统的唤醒:对于进入休眠状态的MCU,一般需要通过外部中断来进行唤醒,最基本的形式则是按键,通过按键的动作来产生电平的变化;
通讯接口:MCU所提供的通讯接口一般包括SPI接口,UART,I2C接口等,其分别...
本帖最后由 ljj3166 于
00:18 编辑
开始撸CH554的卖点之一
就是触摸按键
第一次玩触摸,有点小小的紧张
先看看原理图
其实PCB板上的按键有两种方式
自感和互感
第一次了解触摸,不知道理解对不对
自感触摸按键可能就是端口对某个固定点的电容值
譬如K3和K4,就是检测P14和P15单独端口的对地或者对哪里感应电容
互感就像K1和K2...
5、PxSEL,Px功能选择寄存器(IO中断只有在普通IO下才能使用)
0普通的I/O(默认)
1有连接外围电路的特殊用途
6、PxDS,Px 口输出驱动能力寄存器(我都是用的默认)
0减弱输出驱动能力(默认)
1全力输出驱动能力
三 普通IO使用举例
说明:本例程是流水灯加按键控制,每次S1按下,便在等待S2按下,否则,所有LED一直闪烁。若无按键按下,则八盏灯以流水灯方式显示...
最近做一个项目,用到低功耗。进入低功耗模式,如何唤醒呢?
在例程里有通过按键唤醒的,可是板子上没有按键?
请问高手,如何唤醒呢?可不可以用定时器唤醒或者串口中断唤醒?谢谢!
进入低功耗模式如何唤醒 可以 谢谢!我看看 一般都是用定时器来唤醒的,也可以用外部中断来唤醒,串口中断只是外部中断的一种,还有好多外部中断可以唤醒的...
zigbee按键中断出现:Warning: Possible IDATA stack overflow detected.
To see the instruction that caused the possible overflow, choose Debug&Break and close this message box. To continue execution...
并不只是为了读取有用的数据,而是为了取消状态变化的硬件信号,以便顺利清除RBIF标志位,为下一次中断做好准备。
二是,由于端口PORTB是引脚电子变化中断,即无论引脚出现上升沿还是下降沿都会产生中断请求,所以必须处理好不需要的虚假中断。
三是,一般都利用PIC单片机的引脚功能来检测按键,所以必须处理好按键消抖的问题。
引脚中断程序设计
在主程序里先设置有关的寄存器
设置TRISB寄存器,使...
研究了半天没有搞明白
CH554开发板的触摸按键是什么工作原理? 有个触摸按键定时器,开启它就扫描,1MS或2MS一次;
检查完毕定期器产生中断或者置个标记(主要看你是查询还是中断方式)。
然后就读那个数(电容值)。
读出后跟没按下时比较。这样就知道有没有按键按下。...
ROM和RAM大小接近的型号。
& && &点击对话框中OK按键后,会弹出一个对话框,问是否加入一个启动文件,选择“是”按键。
& && &接下来在建好的项目框架中增加沁恒的例子程序。
C4h&&TKEY_DATL 和 TKEY_DATH 组成 16 位 SFR&&00xxh&&就是从这里读出触摸按键数据
Touch-Key 控制寄存器(TKEY_CTRL):
位7&&bTKC_IF&&RO定时中断标志。
位[6:5]&&保留&&nbsp...
按键中断:视频
你可能感兴趣的标签
热门资源推荐大家有什么好的外部中断按键去抖的方法吗??都快崩溃了。。。 - 【stm32/stm8】 - 电子工程世界-论坛
后使用快捷导航没有帐号?
请完成以下验证码
查看: 16473|回复: 53
大家有什么好的外部中断按键去抖的方法吗??都快崩溃了。。。
在线时间109 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 145, 距离下一级还需 55 积分
一粒金砂(中级), 积分 145, 距离下一级还需 55 积分
大家有什么好的外部中断按键去抖的方法吗??因为比赛的需要,要让输出步进可调,所以打算在外部中断里面改输出值,但是按键抖个不停啊,已经软件延时消抖了,还是抖啊。用的是stm32f407。
代码如下,有什么需要改的吗?? void EXTI2_IRQHandler(void) { &&EXTI-&IMR&=~(1&&2); &&if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_2)==0)& & & &&& &&{ & & delay_ms(30); & & if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_2)==0) & & { & && &vtg-=200; & && &DAC_SetVol(vtg); & & } &&} &&EXTI_ClearITPendingBit(EXTI_Line2);&& &&EXTI-&IMR|=1&&2; }复制代码
&&&&&&&&&&
在线时间109 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 145, 距离下一级还需 55 积分
一粒金砂(中级), 积分 145, 距离下一级还需 55 积分
中断IO口设置有问题吧?
不是吧,帮忙看看呢。void Key_Init() { &&GPIO_InitTypeDef GPIOC_InitS &&GPIOC_InitStruct.GPIO_Mode=GPIO_Mode_IN; &&GPIOC_InitStruct.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3; &&GPIOC_InitStruct.GPIO_PuPd=GPIO_PuPd_UP; &&GPIOC_InitStruct.GPIO_Speed=GPIO_Speed_50MHz; &&GPIO_Init(GPIOC,&GPIOC_InitStruct); }复制代码void Exti_Init() { &&NVIC_InitTypeDef NVIC_InitS &&EXTI_InitTypeDef EXTI_InitS &&RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);//使能SYSCFG时钟 &&SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOC, EXTI_PinSource0); &&SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOC, EXTI_PinSource1); &&SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOC, EXTI_PinSource2); &&SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOC, EXTI_PinSource3); && &&EXTI_InitStruct.EXTI_Line=EXTI_Line0|EXTI_Line1|EXTI_Line2|EXTI_Line3; &&EXTI_InitStruct.EXTI_Mode=EXTI_Mode_I &&EXTI_InitStruct.EXTI_Trigger=EXTI_Trigger_F &&EXTI_InitStruct.EXTI_LineCmd=ENABLE; &&EXTI_Init(&EXTI_InitStruct); && &&NVIC_InitStruct.NVIC_IRQChannel = EXTI0_IRQn;//外部中断0 &&NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0x03;//抢占优先级3 &&NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0x02;//子优先级2 &&NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;//使能外部中断通道 &&NVIC_Init(&NVIC_InitStruct);//配置 & & & &
&&NVIC_InitStruct.NVIC_IRQChannel = EXTI1_IRQn;//外部中断1 &&NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0x03;//抢占优先级3 &&NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0x02;//子优先级2 &&NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;//使能外部中断通道 &&NVIC_Init(&NVIC_InitStruct);//配置 & & & &
&&NVIC_InitStruct.NVIC_IRQChannel = EXTI2_IRQn;//外部中断2 &&NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0x01;//抢占优先级1 &&NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0x02;//子优先级2 &&NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;//使能外部中断通道 &&NVIC_Init(&NVIC_InitStruct);//配置 && &&NVIC_InitStruct.NVIC_IRQChannel = EXTI3_IRQn;//外部中断3 &&NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0x01;//抢占优先级1 &&NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0x02;//子优先级2 &&NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;//使能外部中断通道 &&NVIC_Init(&NVIC_InitStruct);//配置 && } 复制代码
在线时间109 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 145, 距离下一级还需 55 积分
一粒金砂(中级), 积分 145, 距离下一级还需 55 积分
楼主的 & 软件延时消抖 & 的延迟时间再调长一些。
估计要多长呢。。。
在线时间109 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 145, 距离下一级还需 55 积分
一粒金砂(中级), 积分 145, 距离下一级还需 55 积分
一个按键给一个中断好浪费是说,在其他任务里面定时(比如100ms)查询一次多好
本来是想在定时器中断里面查询的。。。但是频繁进中断会不会对正在运行的程序产生影响??
在线时间109 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 145, 距离下一级还需 55 积分
一粒金砂(中级), 积分 145, 距离下一级还需 55 积分
50--100mS后再次读,然后比较数值,必要时可连续判断两次。这是常规消抖算法,如果还有问题,说明要么你编程有误,要么开关有问题。
要50-100ms那么久啊。。。。我可以保证中断进去了
在线时间109 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 145, 距离下一级还需 55 积分
一粒金砂(中级), 积分 145, 距离下一级还需 55 积分
真是麻烦透顶,为何要用中断?只有需要快速响应的地方才会用中断,按键这种地方不但不需要快速响应,响应快了反而会带来更多问题。别用中断了,改用扫描吧。每几十ms读一次,每两次值一样时才当成一次正确的值。
额。。。其实是AGC电路要快速调整输出电压,而且需要步进,所以才在中断里面处理的,在主函数里面两个while(1)死循环
在线时间109 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 145, 距离下一级还需 55 积分
一粒金砂(中级), 积分 145, 距离下一级还需 55 积分
可以不用中断判断,主循环中,查询,检测到按键按下,延时0.1s判断一次,如果符合,再延时0.1s判断一次。
主要问题是主函数两个子函数都是死循环
在线时间109 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 145, 距离下一级还需 55 积分
一粒金砂(中级), 积分 145, 距离下一级还需 55 积分
解释下为什么建议不用外部中断。
用外部中断的话无非是两种:①电平中断 或 ②跃变沿中断。
①.若用电平中断
 按下键后即入中断服务,此时为防反复发生中断(抖动),须判断到按键安定释放后才能正常接收下一次按键,程序写得不好的话会憋死别的处理,极大浪费CPU资源。
②.若用跃变沿中断
 每次抖动都是一个跃变沿,自找的麻烦。
用的下降沿中断,一进中断就已经把中断源屏蔽了,也加了软件延时去抖,还是有问题啊。。。
有可能跃变沿中断会被锁存的,如是这样,光屏蔽还不够,还应在延迟之后清除掉被锁存的中断请求。&
在线时间109 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 145, 距离下一级还需 55 积分
一粒金砂(中级), 积分 145, 距离下一级还需 55 积分
你哥while循环能有多长呀,假如100ms查询一次只是转态而已,很快滴~
好的。。。我来试试
在线时间109 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 145, 距离下一级还需 55 积分
一粒金砂(中级), 积分 145, 距离下一级还需 55 积分
只要是人按的,再快也快不到哪里去。你拿个按键试下,你1秒钟能不能按10次?即便能按10次,每次也才100ms。给你建议如下:
1. 系统里面做一个周期定时中断,比如1ms定时一次,用一个变量在定时中断中做加1计数,当成系统时间基准;
2. 在主循环中读取系统时间,看看是否到5ms,没到就执行其他程序,到了就读一次按键;
3. 多次按键值相比较,只有相同的按键值才当成正确的,不同的直接丢弃。
有些人嫌这样麻烦,那你可以直接在中断中读按键值,将定时中断设置成比如5ms或者什么的,每中断一次读一次按键值,多次值相同才当成正确,不同则丢弃。
嗯。。。我在两次定时器中断里面读键值,如果一样就处理,不一样就不处理,好像有一些效果了。。。。
在线时间109 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 145, 距离下一级还需 55 积分
一粒金砂(中级), 积分 145, 距离下一级还需 55 积分
按键是用定时器检测的,不是用中断的!
只是想快速响应,不想太打搅主函数里正在执行的函数
在线时间109 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 145, 距离下一级还需 55 积分
一粒金砂(中级), 积分 145, 距离下一级还需 55 积分
状态机,可参考马源老师的AVR教材。
谢啦。。。。现在用的定时器的中断去扫描键值,还可以
在线时间109 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 145, 距离下一级还需 55 积分
一粒金砂(中级), 积分 145, 距离下一级还需 55 积分
尽量不要用死循环。这样容易使系统卡死。可以设置一个限制。每部分都有最大执行时间,超过,就退出。
就是两种不同的状态,一种实时显示波形,一种显示对采样信号做FFT的结果,用按键切换。。
在线时间109 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 145, 距离下一级还需 55 积分
一粒金砂(中级), 积分 145, 距离下一级还需 55 积分
st有边沿跳变中断,按键低电平触发的话,在下降沿启动计数器,上升沿读数值判断按键时间,就可以做长短键,也可以消抖
谢谢啦。。。我试试
在线时间109 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 145, 距离下一级还需 55 积分
一粒金砂(中级), 积分 145, 距离下一级还需 55 积分
单片机编程中,系统要高效稳定,任何时间第一时间不要去用delay。
这个很简单,定时器10ms的间隔去扫描那个IO的状态,连续十次有效则产生按键(注意定时器中不要处理该事件,只置标志位),不到十次扫描无效状态清0.
我们做的车载电子,基本按键持续100ms认为有效。量产N年了,稳定
现在还有一个问题啊。。。。用的是定时器50ms中断一次去扫描键值,扫描两次如果键值一样才处理键值,但是中断外的程序有可能正在对信号采样,如果采样的时候进去中断了,采样出的波形就不对了啊,采到信号之后还要做fft,更加不准了啊
你理解错了。
如果你用下降沿中断,你软件延时,中断触发依旧是存在的,并不会因为你的延时就不存在中断触发了,就算是用软件去关中断,之前也抖了N次了。
但是既然存在中断按键这种操作,并且必须操作,就有解决&
在线时间109 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 145, 距离下一级还需 55 积分
一粒金砂(中级), 积分 145, 距离下一级还需 55 积分
把按键扫描放定时器里面,分成几个状态来做,做的更好,可以加队列缓存,然后供后台程序 ...
谢啦,已经解决了,我的键值设置为全局变量的,后来用的定时器查询的方法,每20ms查询一下是否有键按下,连续三次检测都是有键按下的话就认定为一次有效按下,更新一下键值。。。
在线时间109 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 145, 距离下一级还需 55 积分
一粒金砂(中级), 积分 145, 距离下一级还需 55 积分
为什么那么多人推荐使用扫描的方式检测按键呢?可以在按键的中断服务程序里启动一个定时器,然后累加到一定 ...
现在是定时器中断查询了啊。。。。。。
楼上说的是中断里控制定时器的开和关,你说的是定时器中的中断,两码事。&
EEWORLD 官方微信
EE福利 唾手可得
Powered bystm32中断初识与实践(下) - 知乎专栏
{"debug":false,"apiRoot":"","paySDK":"/api/js","wechatConfigAPI":"/api/wechat/jssdkconfig","name":"production","instance":"column","tokens":{"X-XSRF-TOKEN":null,"X-UDID":null,"Authorization":"oauth c3cef7c66aa9e6a1e3160e20"}}
{"database":{"Post":{"":{"contributes":[{"sourceColumn":{"lastUpdated":,"description":"慢慢填上stm32的坑。\n(专栏所用开发板为stm32f103,并且默认读者已掌握C语言基础)","permission":"COLUMN_PUBLIC","memberId":8861144,"contributePermission":"COLUMN_PRIVATE","translatedCommentPermission":"all","canManage":true,"intro":"stm32在工作学习中的总结和分享","urlToken":"stm32","id":25819,"imagePath":"v2-55e5995714bca1f22207fff606ac2614.jpg","slug":"stm32","applyReason":"0","name":"stm32","title":"stm32","url":"/stm32","commentPermission":"COLUMN_ALL_CAN_COMMENT","canPost":true,"created":,"state":"COLUMN_NORMAL","followers":861,"avatar":{"id":"v2-55e5995714bca1f22207fff606ac2614","template":"/{id}_{size}.jpg"},"activateAuthorRequested":false,"following":false,"imageUrl":"/v2-55e5995714bca1f22207fff606ac2614_l.jpg","articlesCount":24},"state":"accepted","targetPost":{"titleImage":"/v2-a742effcad5407_r.jpg","lastUpdated":,"imagePath":"v2-a742effcad5407.jpg","permission":"ARTICLE_PUBLIC","topics":[96522],"summary":"上篇介绍了中断的相关基础内容,如NVIC、优先级等,对中断管理系统有了一个全局的认识,这一部分我们来看看中断的应用。上篇文章请点这里: 这一部分我们将使用按键作为触发源,在产生中断时,实现控制LED灯的亮灭…","copyPermission":"ARTICLE_COPYABLE","translatedCommentPermission":"all","likes":0,"origAuthorId":0,"publishedTime":"T21:50:33+08:00","sourceUrl":"","urlToken":,"id":1957825,"withContent":false,"slug":,"bigTitleImage":true,"title":"stm32中断初识与实践(下)","url":"/p/","commentPermission":"ARTICLE_ALL_CAN_COMMENT","snapshotUrl":"","created":,"comments":0,"columnId":21171,"content":"","parentId":0,"state":"ARTICLE_PUBLISHED","imageUrl":"/v2-a742effcad5407_r.jpg","author":{"bio":"@知乎管理:我女友是法学院高材生,她知道我的回答是不是需要“被修改”。","isFollowing":false,"hash":"ddb3f406dec667c51da1dc29bd894b2e","uid":76,"isOrg":false,"slug":"chen-xiao-ting-91-67","isFollowed":false,"description":"","name":"陈小挺","profileUrl":"/people/chen-xiao-ting-91-67","avatar":{"id":"a462da0dfb536eeae6a91","template":"/{id}_{size}.jpg"},"isOrgWhiteList":false},"memberId":8861144,"excerptTitle":"","voteType":"ARTICLE_VOTE_CLEAR"},"id":514325}],"title":"stm32中断初识与实践(下)","author":"chen-xiao-ting-91-67","content":"上篇介绍了中断的相关基础内容,如NVIC、优先级等,对中断管理系统有了一个全局的认识,这一部分我们来看看中断的应用。上篇文章请点这里:这一部分我们将使用按键作为触发源,在产生中断时,实现控制LED灯的亮灭状态切换。在具体应用前,我们还需先认识认识EXTI。EXTI全称为External interrupt/event controller,即外部中断/事件控制器。其管理了20个中断/事件线,每条线都有对应的一个边沿检测器,用于输入信号上升沿和下降沿的检测。如图6-1为stm32参考手册里的EXTI框图。图6-1图中有两条走向的线路,蓝色线路用于产生中断,绿色线路产生事件。我们从右往左看图。查阅按键原理图可知,按键按下时,电平状态由低变高,会在输入线呈现出一个上升沿信号,这个信号到达边沿检测电路后,会被上升沿触发选择寄存器(EXTI_RTSR)检测并触发,输出有效信号1给编号3电路,否则输出无效信号0。如果电平由高变低,则会被下降沿触发选择寄存器(EXTI_FTSR)检测触发。触发的信号到达编号3电路,这是一个或门电路,它的输入信号除了来源于边沿检测电路,还有来自软件中断事件寄存器(EXTI_SWIER)。无论是来自EXTI_SWIER或边沿检测电路的信号,只要有一个是有效信号1,那么便可以输出有效信号1给编号3电路。编号3电路之后,分为两条线,一条产生中断,一条产生事件。信号沿着蓝色线路产生中断,编号3输出信号到编号4。编号4是一个与门电路,它的另一个信号来源是中断屏蔽寄存器(EXTI_IMR)。众所周知,与门电路要求输入信号都为1才能输出1,换言之,如果EXTI_IMR置为0,那么编号4电路输出的信号都为0,只有EXTI_IMR置1时,编号4输出的信号才由编号3决定。这样一来我们可以通过EXTI_IMR来控制是否产生中断。随后,编号4电路输出的信号会被保存到挂起寄存器(EXTI_PR)内。最后将EXTI_PR里的值输出到NVIC,实现中断控制。信号沿着绿色线路产生事件,最终会输出一个脉冲信号。编号3输出信号到编号5,编号5也是一个与门电路,信号来源于编号3电路和事件屏蔽寄存器(EXTI_EMR)。和编号4的与门电路一样,我们可以通过EXTI_EMR来控制是否产生事件。当编号5输出有效信号1时会在脉冲发生器(Pulse generator)输出一个脉冲信号(无效信号不会输出脉冲)。这个脉冲信号可以给其他外设电路使用,如TIM、ADC等等,一般用来触发TIM或ADC开始转换。EXTI的中断/事件线EXTI有20条中断/事件线,其中有16条用于GPIO线上的外部中断/事件,占用EXTI0~EXTI15,其他4条用于特定外设的外部中断/事件。如图6-2。图6-2图6-2可以通过操作AFIO的四个外部中断配置寄存器(AFIO_EXTICR1~AFIO_EXTICR4)的EXTIx[3:0]位选择配置PAx、PBx、PCx...PGx等引脚。如图6-3为AFIO_EXTICR1寄存器描述。图6-3图6-3EXTI_InitTypeDefEXTI_InitTypeDef是EXTI初始化结构体,其定义在stm32f10x.h文件中,如图6-4所示。图6-4图6-4有四个结构体成员,EXTI_Line:中断/事件线,可选择EXTI0~EXTI19,如图6-2所示;EXTI_Mode:EXTI模式,可设置产生中断(EXTI_Mode_Interrupt)或产生事件(EXTI_Mode_Event);EXTI_Trigger:EXTI边沿触发,可选择上升沿触发(EXTI_Trigger_Rising)、下降沿触发(EXTI_Trigger_Falling)或者上升沿下降沿都触发(EXTI_Trigger_Rising_Falling);EXTI_LineCmd:使能(ENABLE)/失能(DISABLE)EXTI线。开始实验按键按下时,产生电平变化,EXTI检测到上升沿信号,触发中断,执行中断服务函数,实现LED灯的亮灭切换。简要分析下编程要点:初始化产生中断的外设(GPIO);配置NVIC;初始化EXTI;中断服务函数;main函数NVIC配置我们先对NVIC进行配置,将其封装为函数NVIC_Configuration(),供后续调用。/**\n
NVIC配置\n
* @retval 无\n
*/\nstatic void NVIC_Configuration(void)\n{\n
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
// 配置优先级分组\n\t\n
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
// 配置按键中断源\n
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; // 抢占优先级为1\n
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
// 子优先级为1\n
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
// 使能中断寄存器\n\n
NVIC_Init(&NVIC_InitStructure);\n}\nNVIC配置部分,需要配置优先级分组、中断源、抢占优先级、子优先级以及使能中断寄存器等。关于优先级分组配置以及NVIC_InitTypeDef结构体分析,已在里详细说明,读者可点击进入阅读。EXTI中断配置/**\n
EXTI按键中断配置\n
* @retval 无\n
*/\nvoid EXTI_Key_Config(void)\n{\n
GPIO_InitTypeDef GPIO_InitStructure;\n
EXTI_InitTypeDef EXTI_InitStructure;\n\t\n
/* 调用函数配置NVIC */\n
NVIC_Configuration();\n\t\n
/* 初始化GPIO */\n
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE);\n
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;\n
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
// 浮空输入\n
GPIO_Init(GPIOA, &GPIO_InitStructure);\n\t\n
/* 初始化EXTI */\n
// 配置中断线的输入源\n
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0); \n\n
EXTI_InitStructure.EXTI_Line = EXTI_Line0;
// 配置中断线为EXTI0\n
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
// 配置为中断模式\n
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;// 上升沿触发中断\t
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
// 使能中断\n
EXTI_Init(&EXTI_InitStructure);\n}\n这个配置函数里用到了GPIO和EXTI两个初始化结构体,对其分别进行初始化配置,同时调用NVIC_Configuration()函数配置NVIC。其中,GPIO_EXTILineConfig()固件函数是对AFIO_EXTICR1的操作,所以我们需要开启AFIO时钟;需要把GPIO配置为输入模式(浮空输入),由外部电路决定引脚状态;通过查阅按键原理图可得,按键引脚为PA0,可得GPIO端口源和引脚源,并将其中断线配置为EXTI0;由按键原理图可得,按键按下时为高电平,所以使用上升沿触发中断。中断服务函数里已经说明中断服务函数名应在启动文件里找到,并统一写在stm32f10x_it.c文件中。/**\n
EXTI0线中断服务函数\n
* @retval 无\n
*/\nvoid EXTI0_IRQHandler(void)\n{\n
if(EXTI_GetITStatus(EXTI_Line0) != RESET) // 确保产生了EXTI0线中断\n
LED_TOGGLE;
// LED灯状态切换 \n
EXTI_ClearITPendingBit(EXTI_Line0);// 清除中断标志位\n
}\n}\n需要先确保是否产生了中断,这一步我们直接调用stm32f10x_exti.c文件里的库函数EXTI_GetITStatus(),通过其返回值判断。EXTI_GetITStatus()函数操作的是中断屏蔽寄存器(EXTI_IMR)和挂起寄存器(EXTI_PR),通过两个寄存器的值判断是否产生中断,。由图6-1功能框图可得,如果相应线的EXTI_IMR和EXTI_PR都置1,则返回“SET”,即产生中断。具体的源码实现可查看3.5版本的stm32f10x固件库。LED_TOGGLE是一个宏,在宏里实现LED状态切换。具体的实现在文章里已经有过说明,读者可移步阅读。中断服务实现后,需要清除该中断线的中断标志位,以免下次程序判断失误。main函数int main(void)\n{\t\n
LED_GPIO_Config();
// LED端口初始化\n
EXTI_Key_Config();
// EXTI按键中断配置\n
while(1){}
// 等待中断产生\n}\n当按键按下时,即进入中断,执行中断服务函数,完成实验。至此,stm32的中断总结完成了,文字有点多,耐心看完,肯定会有所收获。--------------------------------------------------------------------文章首发于知乎,转载请私信,并注明原文出处。","updated":"T13:50:33.000Z","canComment":false,"commentPermission":"anyone","commentCount":0,"collapsedCount":0,"likeCount":3,"state":"published","isLiked":false,"slug":"","lastestTipjarors":[],"isTitleImageFullScreen":true,"rating":"none","titleImage":"/v2-a742effcad5407_r.jpg","links":{"comments":"/api/posts//comments"},"reviewers":[],"topics":[{"url":"/topic/","id":"","name":"中断"}],"adminClosedComment":false,"titleImageSize":{"width":1800,"height":1080},"href":"/api/posts/","excerptTitle":"","tipjarState":"activated","tipjarTagLine":"好好工作天天向上","sourceUrl":"","pageCommentsCount":0,"tipjarorCount":0,"annotationAction":[],"hasPublishingDraft":false,"snapshotUrl":"","publishedTime":"T21:50:33+08:00","url":"/p/","lastestLikers":[{"bio":"电子工程师","isFollowing":false,"hash":"f2b205c6d18b3dfbb016aff84a55ee89","uid":510100,"isOrg":false,"slug":"qiu-jian-qin-60","isFollowed":false,"description":"","name":"丘建勤","profileUrl":"/people/qiu-jian-qin-60","avatar":{"id":"da8e974dc","template":"/{id}_{size}.jpg"},"isOrgWhiteList":false},{"bio":"学生","isFollowing":false,"hash":"fd21ab58a79b821b76a0e1fc","uid":352600,"isOrg":false,"slug":"leonard463","isFollowed":false,"description":"","name":"leonard463","profileUrl":"/people/leonard463","avatar":{"id":"v2-3beff881061fdb","template":"/{id}_{size}.jpg"},"isOrgWhiteList":false},{"bio":"好好学习","isFollowing":false,"hash":"7f6e280e61dca99fdcc2","uid":216200,"isOrg":false,"slug":"zhang-xiao-hong-61-63","isFollowed":false,"description":"","name":"小旋风","profileUrl":"/people/zhang-xiao-hong-61-63","avatar":{"id":"v2-053c3a8aee68c76cf5449e","template":"/{id}_{size}.jpg"},"isOrgWhiteList":false}],"summary":"上篇介绍了中断的相关基础内容,如NVIC、优先级等,对中断管理系统有了一个全局的认识,这一部分我们来看看中断的应用。上篇文章请点这里: 这一部分我们将使用按键作为触发源,在产生中断时,实现控制LED灯的亮灭…","reviewingCommentsCount":0,"meta":{"previous":{"isTitleImageFullScreen":true,"rating":"none","titleImage":"/50/v2-09d713a4f562f2eea56cde409a008c7a_xl.jpg","links":{"comments":"/api/posts//comments"},"topics":[{"url":"/topic/","id":"","name":"中断"},{"url":"/topic/","id":"","name":"异常"},{"url":"/topic/","id":"","name":"优先级"}],"adminClosedComment":false,"href":"/api/posts/","excerptTitle":"","author":{"bio":"@知乎管理:我女友是法学院高材生,她知道我的回答是不是需要“被修改”。","isFollowing":false,"hash":"ddb3f406dec667c51da1dc29bd894b2e","uid":76,"isOrg":false,"slug":"chen-xiao-ting-91-67","isFollowed":false,"description":"","name":"陈小挺","profileUrl":"/people/chen-xiao-ting-91-67","avatar":{"id":"a462da0dfb536eeae6a91","template":"/{id}_{size}.jpg"},"isOrgWhiteList":false},"content":"先吐个槽好了。这段时间下基层,一直在生产线上待着,每天累得跟狗似的,所以好久没写文章了。好在订单要结束了,可以继续研究了。这不,赶紧来写写文章,做个总结,把这段时间落下的赶紧补回来。好了,进入正题。stm32中断的讲解我分为两部分,即两篇文章,上半部分做一个总结性的概览,有一个初步认识,下半部分会通过一个实例来讲解中断的应用。本文即为上半部分的总结性概览。所谓“中断”,通俗地讲,就是CPU在遇到一个需要即时处理的情况时,暂时中止当前程序的执行,转而处理新情况。在stm32参考手册中的中断和异常向量表里可查阅到,其内核的异常响应系统里有10个系统异常(含Reset和HardFault),60个外部中断。具体的定义可在库文件stm32f10x.h头文件的IRQn_Type枚举里查到。如图5-1。图5-1 在进行中断配置前,有两个概念需要先弄清楚——NVIC、优先级定义及分组。NVICNVIC即为嵌套向量中断控制器,控制着整个芯片的中断相关,是Cortex-M3内核里的一个外设。其在库文件core_cm3.h里定义如下:图5-2其中ISER(中断使能寄存器NVIC_ISERx)、ICER(中断清除寄存器NVIC_ICERx)、IP(8bit中断优先级寄存器NVIC_IPRx)会在配置中断的时候用到。我们可在core_cm3.h库文件里找到相关寄存器操作的函数声明,如操作ISER的NVIC_EnableIRQ()函数,操作ICER的NVIC_DisableIRQ()函数,操作IP的NVIC_SetPriority()函数等。优先级定义及分组NVIC里有一个中断优先级寄存器NVIC_IPRx,用来配置外部中断的优先级。IPR的宽度为8bit,而ST公司的F103芯片只用了高4bit来配置优先级,即每个外部中断可配置的优先级为0~15。这4bit被分组为抢占优先级(pre-emption priority)和子优先级(subpriority),数值越小,优先级越高。首先会比较抢占优先级,如果相同则比较子优先级,还是相同则继续比较各自的硬件中断编号(编号可在参考手册里的异常向量表查到,编号越小,优先级越高)。优先级分组由内核外设SCB的AIRCR(应用程序中断及复位控制寄存器)的PRIGROUP[10:8]位决定,在F103里分成了5组。如图5-3。图5-3上图中的表格里显示了5组的优先级,由于只用了高4位,所以级数最多为16(0~15,有16个级数)。优先级分组配置可调用NVIC_PriorityGroupConfig()函数实现,函数声明和定义分别在库文件misc.h和misc.c中。该函数便是封装了对SCB_AIRCR寄存器的操作。中断配置编程经以上了解后,可以开始进入程序环节了。一般中断编程按以下三点来完成:使能外设中断。具体由相应外设的相关中断使能位控制,如串口收/发完成中断等。配置中断优先级分组。前文已经说明可以调用NVIC_PriorityGroupConfig()函数实现。初始化NVIC_InitTypeDef结构体。用于设置抢占优先级和子优先级,及使能中断。编写中断服务函数。启动文件中已经预先为每个中断定义了一个空的中断服务函数,用于初始化中断向量表。而实际中我们需要重新定义这些函数,可统一定义在stm32f10x_it.c中。其中,在第3点,NVIC_InitTypeDef结构体是在库文件misc.h中定义的。如图5-4。图5-4由图中库函数源码可知,NVIC_IRQChannel:中断源。每个中断都有其单独的中断源,不能写错,否则会致不响应中断,程序也不会报错。具体配置如图5-1的IRQn_Type枚举类型定义,这个枚举类型包含了所有的中断源。NVIC_IRQChannelPreemptionPriority:抢占优先级。由前文描述可知,可配置的优先级为0~15,有16个优先级数。NVIC_IRQChannelSubPriority:子优先级。同抢占优先级。NVIC_IRQChannelCmd:使能(ENABLE)或失能(DISABLE)中断寄存器。操作的是NVIC_ISER和NVIC_ICER寄存器。在第4点,需要注意的是,函数名必须和启动文件里设置的一样,否则系统无法在中断向量表里找到中断服务函数入口,便会转而跳到启动文件里的空函数,从而进入死循环。如图5-5为启动文件预先定义的函数。图5-5至此,对中断已经有了一个大致的认识,第一步算是圆满完成啦。那么接下来的下半部分会开始借用一个实例来帮助巩固实践。--------------------------------------------------------------------文章首发于知乎,转载请私信,并注明原文出处。","state":"published","sourceUrl":"","pageCommentsCount":0,"canComment":false,"snapshotUrl":"","slug":,"publishedTime":"T00:12:28+08:00","url":"/p/","title":"stm32中断初识与实践(上)","summary":"先吐个槽好了。这段时间下基层,一直在生产线上待着,每天累得跟狗似的,所以好久没写文章了。好在订单要结束了,可以继续研究了。这不,赶紧来写写文章,做个总结,把这段时间落下的赶紧补回来。好了,进入正题。stm32中断的讲解我分为两部分,即两篇文章…","reviewingCommentsCount":0,"meta":{"previous":null,"next":null},"commentPermission":"anyone","commentsCount":0,"likesCount":4},"next":{"isTitleImageFullScreen":true,"rating":"none","titleImage":"/50/v2-13c0ca55f0be0cb7efdcda8ee7642671_xl.jpg","links":{"comments":"/api/posts//comments"},"topics":[{"url":"/topic/","id":"","name":"定时器(程序开发)"},{"url":"/topic/","id":"","name":"延时"}],"adminClosedComment":false,"href":"/api/posts/","excerptTitle":"","author":{"bio":"@知乎管理:我女友是法学院高材生,她知道我的回答是不是需要“被修改”。","isFollowing":false,"hash":"ddb3f406dec667c51da1dc29bd894b2e","uid":76,"isOrg":false,"slug":"chen-xiao-ting-91-67","isFollowed":false,"description":"","name":"陈小挺","profileUrl":"/people/chen-xiao-ting-91-67","avatar":{"id":"a462da0dfb536eeae6a91","template":"/{id}_{size}.jpg"},"isOrgWhiteList":false},"content":"SysTick即为系统定时器,又称嘀嗒定时器,是Cortex-M3内核的一个外设,集成在NVIC中。SysTick是一个24bit的向下递减的计数器,每计数一次的时间为1/SYSCLK(SYSCLK一般为72MHz)。操作系统需要执行多任务管理,用SysTick产生中断,确保单个任务不会锁定整个系统。同时SysTick还可用于闹钟定时、时间测量等。由于Cortex-M3芯片都有SysTick,所以软件可以很容易地在Cortex-M3的产品间移植。我们待会儿将利用SysTick产生1s的时基,让LED一秒钟闪烁一次,以完成SysTick的定时实验。注:本文所用芯片为stm32f103。SysTick寄存器SysTick定时器由四个寄存器控制,如图7-1所示。图7-1上图是对四个寄存器各个位的描述。其中最后一个校准值寄存器(STK_CALIB)在定时实验中并没有用到,这里暂且不介绍,有兴趣的读者可以自行查找其他资料阅读。编程要点向SysTick重装载值寄存器(STK_LOAD)写入新的重装载值;配置中断优先级;写SysTick当前值寄存器(STK_VAL),将当前值清0;写SysTick控制及状态寄存器(STK_CTRL),启动SysTick。SysTick属于内核外设,其相关的寄存器定义和库函数都在core_cm3.h中。如图7-2为core_cm3.h头文件里配置SysTick的源码截图。图7-2SysTick_Config()库函数即是按照上述的编程要点完成SysTick配置的。我们在实际项目中时可以直接调用这个库函数来完成配置。而形参ticks用来设置STK_LOAD的值,最大不超过2^24。然后配置中断优先级,清空STK_VAL,最后配置STK_CTRL。其中,在配置中断优先级时调用了NVIC_SetPriority()库函数,传入的优先级实参为(1&&__NVIC_PRIO_BITS) - 1,其中宏__NVIC_PRIO_BITS为4,则可得其优先级为15,则可以看出其默认设置的优先级在内核外设中是最低的。那么如果我们同时设置了内核外设和片上外设的优先级,该如何判断孰高孰低呢?在里说过,在配置外设中断优先级时,需要先分组,再设置抢占优先级及子优先级,那么我们把内核外设的优先级也用同一配置方式分解为这三个部分。假设配置一个外设的中断优先级分组为3,抢占优先级为2,子优先级为1,而SysTick优先级为4。则将SysTick优先级4转换为二进制,为0100(0b),在分组为3时,SysTick抢占优先级为010(0b),即为2,子优先级为0。我们先比较抢占优先级,发现相同,那么比较子优先级,此时SysTick子优先级为0,而我们假设的外部中断子优先级为1,所以SysTick优先级大于假设的外设优先级(数值越小,优先级越高)。中断时间计算SysTick的计数器执行的是倒计时,我们要计算中断计数时间,需要知道计数总量(STK_LOAD的值)、时钟源频率等两个参数。打个比方,这相当于我们要计算运动时间,需要知道距离和速度,那么STK_LOAD的值即为距离,时钟源频率即为速度。则中断计数时间为(假设STK_LOAD的值为VALUE,时钟源频率为CLK,中断计数时间为T):T = VALUE / CLK(其中,CLK为72MHz)当STK_LOAD的值VALUE减到0时,即可产生中断。如果设置VALUE=72000,那么中断一次的时间T = 72000 / 72MHz = 1ms。定时时间计算得出中断一次的时间后,我们可以设置一个变量n,用来记录中断次数,那么最终的定时时间即为T*n。回到开头的实验说明中,我们需要产生1s时基,来实现LED灯1s闪烁一次,则n为1000时满足要求。#define SysTick_CTRL_ENABLE_Pos
\n#define SysTick_CTRL_ENABLE_Msk
(1ul && SysTick_CTRL_ENABLE_Pos)\n\n/**\n
毫秒级的定时函数\n
n:毫秒数,如n为1000,则计时1000*1ms=1s\n
* @retval 无\n
*/\nvoid SysTick_Delay_ms(uint32_t n){\n
uint32_t i;\n
SysTick_Config(72000);
// 产生1ms的中断(72000 / 72MHz = 1ms)\n\t\n
for(i=0; i&n; i++){\n\twhile(!((SysTick-&CTRL)&(1&&16)));\n
SysTick-&CTRL &= ~SysTick_CTRL_ENABLE_Msk;
// 失能SysTick\n}\n由于SysTick不会自动停止,所以我们需要在异常/中断处理中将其停止,即失能SysTick。到这里为止,一个简单的SysTick定时实验完成了,之后只要在main函数中调用SysTick_Delay_ms(1000)函数,即可实现1s的精确SysTick定时,而不是使用普通的不精确延时函数。使用的则是普通延时函数实现流水灯效果。--------------------------------------------------------------------文章首发于知乎,转载请私信,并注明原文出处。","state":"published","sourceUrl":"","pageCommentsCount":0,"canComment":false,"snapshotUrl":"","slug":,"publishedTime":"T16:37:55+08:00","url":"/p/","title":"SysTick定时器的一个简单应用","summary":"SysTick即为系统定时器,又称嘀嗒定时器,是Cortex-M3内核的一个外设,集成在NVIC中。SysTick是一个24bit的向下递减的计数器,每计数一次的时间为1/SYSCLK(SYSCLK一般为72MHz)。操作系统需要执行多任务管理,用SysTick产生中断,确保单个任务不会锁定整个…","reviewingCommentsCount":0,"meta":{"previous":null,"next":null},"commentPermission":"anyone","commentsCount":3,"likesCount":2}},"annotationDetail":null,"commentsCount":0,"likesCount":3,"FULLINFO":true}},"User":{"chen-xiao-ting-91-67":{"isFollowed":false,"name":"陈小挺","headline":"","avatarUrl":"/a462da0dfb536eeae6a91_s.jpg","isFollowing":false,"type":"people","slug":"chen-xiao-ting-91-67","bio":"@知乎管理:我女友是法学院高材生,她知道我的回答是不是需要“被修改”。","hash":"ddb3f406dec667c51da1dc29bd894b2e","uid":76,"isOrg":false,"description":"","profileUrl":"/people/chen-xiao-ting-91-67","avatar":{"id":"a462da0dfb536eeae6a91","template":"/{id}_{size}.jpg"},"isOrgWhiteList":false,"badge":{"identity":null,"bestAnswerer":null}}},"Comment":{},"favlists":{}},"me":{},"global":{"experimentFeatures":{"ge3":"ge3_9","ge2":"ge2_1","nwebStickySidebar":"sticky","newMore":"new","liveReviewBuyBar":"live_review_buy_bar_2","liveStore":"ls_a2_b2_c1_f2","isOffice":"false","homeUi2":"default","answerRelatedReadings":"qa_recommend_with_ads_and_article","remixOneKeyPlayButton":"headerButton","qrcodeLogin":"qrcode","newBuyBar":"livenewbuy3","newMobileColumnAppheader":"new_header","zcmLighting":"zcm","favAct":"default","appStoreRateDialog":"close","mobileQaPageProxyHeifetz":"m_qa_page_nweb","iOSNewestVersion":"4.2.0","default":"None","wechatShareModal":"wechat_share_modal_show","qaStickySidebar":"sticky_sidebar","androidProfilePanel":"panel_b"}},"columns":{"next":{}},"columnPosts":{},"columnSettings":{"colomnAuthor":[],"uploadAvatarDetails":"","contributeRequests":[],"contributeRequestsTotalCount":0,"inviteAuthor":""},"postComments":{},"postReviewComments":{"comments":[],"newComments":[],"hasMore":true},"favlistsByUser":{},"favlistRelations":{},"promotions":{},"switches":{"couldAddVideo":false},"draft":{"titleImage":"","titleImageSize":{},"isTitleImageFullScreen":false,"canTitleImageFullScreen":false,"title":"","titleImageUploading":false,"error":"","content":"","draftLoading":false,"globalLoading":false,"pendingVideo":{"resource":null,"error":null}},"drafts":{"draftsList":[],"next":{}},"config":{"userNotBindPhoneTipString":{}},"recommendPosts":{"articleRecommendations":[],"columnRecommendations":[]},"env":{"edition":{},"isAppView":false,"appViewConfig":{"content_padding_top":128,"content_padding_bottom":56,"content_padding_left":16,"content_padding_right":16,"title_font_size":22,"body_font_size":16,"is_dark_theme":false,"can_auto_load_image":true,"app_info":"OS=iOS"},"isApp":false},"sys":{},"message":{"newCount":0},"pushNotification":{"newCount":0}}

我要回帖

更多关于 stm32 按键外部中断 的文章

 

随机推荐