【经验】如何正确使用8位MCU的PortMatch功能
SILICON LABS的很多8位MCU(C8051和EFM8)都具有PortMatch功能,此功能允许一个或多个端口IO引脚上的逻辑电平变化触发系统事件。例如GPIO的输入电平与配置的电平不匹配时可以触发中断事件,并且这一功能可以将MCU从Sleep模式唤醒。但是很多工程师在使用PortMatch功能时,总会遇到很多问题,本文为大家讲解如何正确使用PortMatch功能,MCU选用低功耗的EFM8SB系列为例。
端口PortMatch的功能通过设置PnMASK寄存器的相关位来启动,如配置P0.0引脚使能PortMatch功能的语句P0MASK |= 0x01;。另外,如果引脚模式被配置成了模拟则PortMatch功能无法使用,因此寄存器PnMDIN和PnMDOUT的相关位需要配置引脚作为数字输入(即open-drain)模式P0MDIN |= 0x01; P0MDOUT &= 0xFE。 然后需要配置的是引脚匹配的电平值,这是用于设置引脚是高电平还是低电平触发事件的。需要注意的是,PortMatch事件是引脚的电平与设置的电平值不一致时触发,因此配置P0.0是低电平触发,需要配置P0MAT |= 0x01;。如需产生PortMatch中断,需要使能PortMatch中断,将寄存器EIE1的EMAT位置1,并使能总中断EA。若只是用PortMatch功能来唤醒MCU,则不必一定开启中断,只要PortMatch事件被触发就可以唤醒MCU。使用图形化配置如下:
上面配置后,PortMatch事件是可以正确触发了,但在实际应用中,还是会遇到一些问题,现总结如下。
1、PortMatch中断函数的入口只有一个,即所有IO触发PortMatch中断时,都会执行同一个中断服务函数,当配置多个IO具有PortMatch中断时,如何判断此次中断是哪一个IO触发的?
在中断服务函数读取Pn寄存器来判断是哪个引脚的电平发生变化触发的,这里还是以P0.0引脚在低电平触发为例,假设P0.0外部是按键来控制电平,按键不按时是高电平,按键按下时是低电平。代码实现如下:
SI_SBIT (Pin0_0,SFR_P0,0); //定义P0.0为Pin0_0
SI_INTERRUPT (PMATCH_ISR, PMATCH_IRQn)
{
if(Pin0_0 = 0)//判断P0.0是不是低电平,因为低电平触发中断,如果是,则执行相关内容
{}
}
2、PortMatch触发是电平触发,当开启中断,电平不匹配时,则会一直触发中断,代码会循环地执行中断函数。如何才能实现类似边沿触发的方式?
这可以在中断函数里通过重新配置PnMAT寄存器来实现。例如按键按下低电平触发,那么就将P0.0改成低电平匹配,这样中断服务函数执行完后,就不会再次执行。当按键松开IO电平变高电平时,会再次执行中断服务函数,将P0.0再改回低电平匹配。这就相当于实现了边沿触发,上升沿和下降沿各执行中断一次。代码实现如下:
SI_INTERRUPT (PMATCH_ISR, PMATCH_IRQn)
{
uint8_t P0_sample = P0;
uint8_t P1_sample = P1;
P0MAT = P0_sample;
P1MAT = P1_sample;
}
3、配置低电平触发唤醒MCU,寄存器配置和电路设计需要注意的地方是什么?
如果是低电平触发,表示这个引脚平时需要保持高电平状态。寄存器配置如上面所述,将此引脚配置成数字开漏模式(PnMDIN和PnMDOUT),内部电平锁存值配置成高(Pn),即内部下拉关闭,匹配电平配置成高电平(PnMAT),使能匹配功能即可(P0MASK)。开漏模式的引脚内部上拉无法使用,EFM8SB内部有若上拉功能,但是为了降低功耗,建议电路设计上使用较大阻值的外部上拉电阻,关闭内部若上拉功能(XBR2的WEAKPUD位置1)。
4、配置高电平触发唤醒MCU,寄存器配置和电路设计需要注意的地方是什么?
如果是高电平触发,表示这个引脚平时需要保持低电平状态。寄存器配置方面,将此引脚配置成数字开漏模式(PnMDIN和PnMDOUT),内部电平锁存值配置成高(Pn),即内部下拉关闭,匹配电平配置成低电平(PnMAT),使能匹配功能即可(P0MASK)。需要注意的是内部电平锁存值需要配置成高电平,因为如果配置成低电平的话,当外部将此引脚拉高时,消耗的电流会比较大。外部驱动能力强的话,还可以将引脚电平拉高,如果驱动能力弱的话,就无法将引脚电平拉高了,从而无法唤醒MCU。电路设计上建议外部使用较大阻值的外部下拉电阻,关闭内部若上拉功能(XBR2的WEAKPUD位置1)。
世强元件电商版权所有,转载请注明来源及链接。
- |
- +1 赞 0
- 收藏
- 评论 1
本网站所有内容禁止转载,否则追究法律责任!
相关推荐
【经验】8位MCU C8051F350完美替换C8051F352,解决缺货烦恼
24位ADC的C8051F350与16位ADC的C8051F352是同一系列的芯片,芯片的封装及引脚的分配是完全相同的,所以在硬件上可以完全替换。
设计经验 发布时间 : 2017-08-14
【产品】小蜜蜂8位MCU助您轻松迎接物联网时代
Silicon labs推出了一款集小封装和高性价比于一身的多用途8位MCU EFM8BB1,可轻松替代普通8051家族的MCU产品。
新产品 发布时间 : 2019-07-05
EFM8LB低功耗8位MCU在使用BOOTLOADER时,如何让程序进入BOOTLOADER?
EFM8LB的芯片进入BOOTLOADER有三种方法。第一种:上电后如果0X0000地址的数据为0XFF,程序会直接进入BOOTLOADER. 第二种:在上电复 位时,如果C2D引脚保持低电平超过50uS,程序会进入BOOTLOADER.第三种: 应用程序将R0赋值为0XA5,然后执行软启动,启动后程序会自动进入 BOOTLOADER。
技术问答 发布时间 : 2017-10-10
【技术】预安装BOOT的新一代的8位MCU
Silicon labs的EFM8系列MCU是C8051F的升级换代产品。较C8051F不同的是,其在出厂时已经固化好BOOT程序。
技术探讨 发布时间 : 2019-07-11
为什么在8位MCU C8051F392上运行正常的程序增加了一个全局变量后就无法执行到主程序中?
8位MCU C8051F392芯片内部集成有看门狗功能,这个功能默认是开启的,当全局变量过多时,在C语言的程序初始化没有结束时看门狗已经复位了,所以无法执行到主程序中,解决 办法是将STARTUP.A51添加到项目中,并在STARTUP.A51文件中将看门狗关闭。
技术问答 发布时间 : 2017-10-10
推荐一款带ADC的小封装8位MCU,适用于对模拟性能、MCU性能以及电路板尺寸有比较高要求的场合。
推荐EFM8LB11系列8位MCU,该系列MCU内部集成了高精度ADC(14位)、4个12位DAC、内置温度传感器、模拟比较器以及丰富的数字外设和通信接口,FLASH大小为16/32KB,RAM为1.25/2.25KB,封装包括QFN24、QFN32、QFP32以及QSOP24,最小封装3x3mm,具有高性能、低功耗、小封装等特性,非常适用于高性能、低功耗、小封装,对模拟外设有更高要求的应用设计。
技术问答 发布时间 : 2017-05-05
8位MCU c8051f040内部时钟振荡器是否可以用于产生波特率的时基?
8位MCU c8051f040器件的内部时钟振荡器精度为±2%,可用于产生波特率。
技术问答 发布时间 : 2017-10-10
8位MCU C8051F020使用比较大的程序进行仿真,仿真失败,怎么回事?大程序无法仿真是芯片本身特征决定的还是开发环境,或仿真器的问题?
软件断点支持数量和开发环境有关系和程序大小没有关系。可以尝试升级KEIL C51到比较新的版本,确保编译的程序能执行到断点处。可以在需要打断点的地方配置一个GPIO输出低,200ms高,200ms低,用示波器或者LED灯来测试程序。
技术问答 发布时间 : 2017-07-06
何立民教授:8位MCU可能是永续的不死鸟
在市场多样化的背景下MCU的机遇被无限放大,最终8位、32位和64位MCU将三分天下,呈技术互补的发展趋势。本文是业内知名专家何立民教授深入地分析了8位MCU的蜕变及发展。
新技术 发布时间 : 2016-07-04
8位MCU EFM8UB1可以使用哪些仿真器?
EFM8系列MCU仍然使用了C2接口,所以C8051F使用的仿真器都可以与其通信。目前有如下类型: EFM8 STK 上的J-Link,这种仿真器由Segger开发 Silabs的UDA、第三方的仿真器(比如新华龙) Silabs的TOOL STICK
技术问答 发布时间 : 2017-10-10
C8051F350 8位MCU中未使用的模拟输入(模拟数字转换器,比较器)该如何处理?
未使用的专用模拟输入通常直接与信号地相连, 但也可以悬空。专用模拟输入是仅可用于模拟输入的引脚(例如它们不能被用于数字输入输出口)。对于多用途IO引脚,如既可以 用作模拟,也可以用作数字的I/O引脚可以悬空,或者将其配置为具有固定电平的数字输出引脚。
技术问答 发布时间 : 2017-10-10
8位MCU C8051F020上电不能启动,不断的重启,怎么回事?
单片机的不断的重启,通过测量一下VDD 和/RST信号是正常。然后通过软件做输出波形测试点用波器测量观查,发现单片机开机后很快就输出信号就变化,重复出现。判定为开启看门狗的问题。重新设定watch dog时间,再启动看门狗。用blinky代码测试问题解决。
技术问答 发布时间 : 2017-10-10
8位MCU EFM8LB1需要在中断服务程序中写保护 SFRPAGE 寄存器吗?
在会更改SFR分页的函数中保护 SFRPAGE 寄存器值是一个被高度推荐的做法,由此极大减少 SFR 分页代码错误。 尽管如此,对于具有一个 SFRPAGE 堆栈的器件,在中断服务程序中保护 SFRPAGE 寄存器并非必须的。这些器件中硬件会在执行 RETI指令后自动恢复 SFRPAGE寄存器值。对于诸如’F9xx器件,在切换 SFRPAGE时,中断必须被关闭。
技术问答 发布时间 : 2017-10-10
8位MCU EFM8BB21F16,是否可以在编译代码时指定MCU lock 字节的值 ?
在使用Keil C51工具链时,通过BL51或LX51来实现 首先,需要在代码中的某个位置初始化lock 字节的设定。如,创建”lockbyte.c”,然后加入: #include const uint8_t code lockbyte = 0x00; 这段代码将会在flash中占用一个byte,且其初始值为0。为了将这个字节放置在flash的lock字节位置,需要使用到链接器。 关于lock字节的地址,请查阅相应MCU的参考手册。例如EFM8BB1F8的lock 字节在flash的0x1FFF位置。 如果使用Simplicity Studio,链接器的指令在如下位置修改,Project -> Properties -> C/C++ Build -> Settings-> Keil 8051 Linker >Miscellaneous。然后在[Additional Flags]中添加链接器指令。 如果使用LX5(1)请在[Additional Flags]中添加如下命令: SEGMENTS(?CO?LOCKBYTE(C:0x1FFF))
技术问答 发布时间 : 2017-10-10
8位MCU C8051F340芯片的USB数据线(D+和D-)需要上拉或者串联电阻吗?
USB数据线上无需上拉或者串联电阻。USB标准兼容所需电阻已经包含在芯片内,在USB数据线上另外再加电阻可能会导致USB不能正常工作。
技术问答 发布时间 : 2017-10-10
电子商城
现货市场
服务
可定制板装式压力传感器支持产品量程从5inch水柱到100 psi气压;数字输出压力传感器压力范围0.5~60inH2O,温度补偿范围-20~85ºС;模拟和数字低压传感器可以直接与微控制器通信,具备多种小型SIP和DIP封装可选择。
提交需求>
定制水冷板尺寸30*30mm~1000*1000 mm,厚度1mm~50mm,散热能力最高50KW,承压可达3MPA;液冷机箱散热能力达500W~100KW。项目单次采购额需满足1万元以上,或年需求5万元以上。
提交需求>
登录 | 立即注册
提交评论