以下内容源于朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除。
一、前言
本章节在裸机课程的SD卡启动部分。
本文讲述如何设置开发板,使得一按下电源键程序运行后即可松手不会断电,即供电置锁。
二、软开关的简介
电路设计一般使用拨码开关来做电源开关,开关打到一侧则接通电源,打到另一侧则关闭。这种设计方式很简单,但是电路过于简单,整个主板要么有电要么没电,无法做休眠、低功耗模式等。因此,软开关是比较接近于实际产品的。
三、X210开发板的软开关电路
X210开发板需要稳定的供电电压,而外部适配器的输出电压可能不满足要求,因此板载一个稳压芯片MP1482。当外部适配器电压在一定范围内变化时,稳压芯片的输出电压都是5V。
MP1482芯片有一个EN引脚,这个引脚的电平值可以决定稳压芯片是输出(EN为高电平时)还是关闭输出(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_2引脚。EINT0这个引脚是有复用设计的,一个是GPH0_2、一个是供电置锁PS_HOLD_CONTROL。
关于PS_HOLD的内容,在数据手册Section2.4 Power Management章节的4.10.5.8节。
供电置锁主要涉及PS_HOLD_CONTROL寄存器(0xE010E81C),共有3个位有用。
- bit0,0表示这个引脚为GPIO功能,1表示这个引脚为PS_HOLD功能。
- bit9,0表示这个引脚方向为输入,1表示这个引脚方向为输出。
- bit8,0表示这个引脚输出为低电平,1表示输出为高电平。
经过分析,我们要使用软启动置锁,则需要将bit0、8、9置为1。
五、代码实测
之前做裸机实验的时候,无论是以usb方式启动还是以sd卡启动方式,整个期间需要一直按着电源键,松手则会断电。根据上面的分析,我们需要给PS_HOLD_CONTROL这个寄存器的bit0、8、9写入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]// 写法3ldr r0, =0xE010E81Cldr r1, [r0]ldr r2, =0x301orr r1, r1, r2str r1, [r0]// 第1步:关看门狗(向WTCON的bit5写入0即可)ldr r0, =WTCONldr r1, =0x0str r1, [r0]//省略其他代码