以下内容源于朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除。
一、前言
本章节内容在裸机课程的SD卡启动部分。
之前做裸机实验的时候,无论是以USB启动方式还是以SD卡启动方式,整个期间需要一直按着电源键,松手则会断电。
本文讲述如何设置开发板,使得一按下电源键程序运行后即可松手不会断电,即供电置锁。
二、软开关的简介
电路设计一般使用拨码开关来做电源开关,开关打到一侧则接通电源,打到另一侧则关闭。但是这种电路过于简单,整个主板要么有电要么没电,无法做休眠、低功耗模式等功能。
在实际产品中,我们一般使用软启动电路,即软开关。
三、X210开发板的软开关电路
X210开发板需要稳定的供电电压,但外部适配器的输出电压可能不满足要求,因此板载一个稳压芯片 MP1482。当外部适配器电压在一定范围内变化时,稳压芯片MP1482的输出电压都是5V。
如何控制 MP1482芯片是输出还是关闭呢?该芯片有一个EN引脚,由该引脚的电平决定该芯片是否输出电压:当电平值是高电平时稳压芯片输出电压,当电平值是低电平时稳压芯片关闭。
影响EN引脚的电平的因素有两个:第一个是POWER按键(SW1),POWER按键按下时EN为高电平,POWER按键弹起时EN为低电平;第二个是POWER_LOCK引脚(EINT0),当此引脚为POWER_LOCK模式下的高电平,则EN为高;当此引脚为EINT0模式或者POWER_LOCK模式下的低电平,则EN为低。
图中还有EINT1引脚,它主要用来做中断,来唤醒CPU的。
四、X210开发板供电置锁原理
X210开发板的软开关在设计时有一个置锁电路,用EINT0引脚来控制。
EINT0这个引脚是复用的,分别用作 GPH0_0,以及供电置锁PS_HOLD_CONTROL。
当EINT0这个引脚用作供电置锁时,涉及PS_HOLD_CONTROL寄存器,该寄存器如下所示:
经过分析,我们要使用软启动置锁,则需要将 bit0、bit8、bit9 都置为1。
- bit0,0表示这个引脚为GPIO功能,1表示这个引脚为PS_HOLD功能。
- bit9,0表示这个引脚方向为输入,1表示这个引脚方向为输出。
- bit8,0表示这个引脚输出为低电平,1表示输出为高电平。
关于PS_HOLD的更多内容,在数据手册Section2.4 Power Management章节的4.10.5.8节。
五、代码实测
根据上面的分析,我们需要给PS_HOLD_CONTROL这个寄存器的 bit0、bit8、bit9 写入1,以实现供电置锁,这样在程序运行后松手也不会断电。此时开发板已经置锁,POWER按键已经失效,因此松手也不会断电,关机时需要按下复位按键。
开发板供电置锁的代码:
#define WTCON 0xE2700000
#define SVC_STACK 0xd0037d80
.global _start
_start:
// 第0步:开发板置锁
// 写法1
ldr r0, =0xE010E81C
ldr r1, =0x301
str r1, [r0]
// 写法2
//ldr r0, =0xE010E81C
//ldr r1, [r0]
//orr r1, r1, #0x300
//orr r1, r1, #0x01
//str r1, [r0]
// 写法3
//ldr r0, =0xE010E81C
//ldr r1, [r0]
//ldr r2, =0x301
//orr r1, r1, r2
//str r1, [r0]
// 第1步:关看门狗(向WTCON的bit5写入0即可)
ldr r0, =WTCON
ldr r1, =0x0
str r1, [r0]
//省略其他代码