您的位置 首页 基础

STM8S单片机入门2(关机形式开关机按钮)

开关机功能是使用电池供电系统的最基本功能。如果使用机械式开关(2段拨动开关,自锁开关等)等直接接通和切断电源,不说机械部件的可靠性,至少自动关机

开关机功用是运用电池供电体系的最根本功用。假如运用机械式开关(2段拨动开关,自锁开关等)等直接接通和堵截电源,不说机械部件的可靠性,至少主动关机(一般在长期不操作、电池电量低时需求主动关机)功用就比较难完成。所以电池供电体系一般选用按钮开关,用一个按钮合作软件完成按一次开机、再按一次关机的功用及主动关机的功用。

这部分内容就叙述怎么在上完成一键式的开关机功用。开关机功用要运用单片机的一个引脚(PD4)作为输入端,连接到按钮,接纳按纽按下发生的电信号,然后再运用另一个引脚(PD3)作为输出端去驱动由三极管8550构成的一个电子开关完成对体系电源的操控。而STM8S单片机本身就直接接在电池上,运用单片机的停机形式,将单片机本身的电流降低到μA级,对电池的耗费就能够忽略不计了。

1、电路规划

电路图如下,C1是STM8S单片机VCAP电容,坚持内部1.8V电压的安稳,是STM8S单片机仅有有必要接要的外部元件,选用容量为1μF的瓷片电容,并且从电路可靠性讲,这个电容越接近单片机IC越好。

K1是按钮,一端接到单片机的PD4引脚上,另一端接地,这样按钮被按下就会发生一个低电平的脉冲。

Q1是三极管,经过发光二极管D1和限流电阻R1接到单片机的PD3上。这样当PD3输出低电平时,Q1导通,VCC上有电压,能够对体系供电,反之PD3输出高电平时,Q1截止VCC没有电压。

发光二极管D1还兼作电源指示灯的效果, Q1导通时发光反之不发光。

剩下的C2~C5都是电源退藕电容,用于消除电源上的搅扰信号。P1、P2两个接线端别离接3.6V锂电池的正负极。

2、软件规划

软件要完成的功用是,在PD4引脚上监控按钮按下发生的低电压脉冲信号,并依据这个信号来设置PD3引脚的输出电平去操控Q1的导通和截止,以及设置单片机本身的作业状况,以此完成对电源供电的操控。

1)引脚作业形式设置

首先要做的,便是设置单片机引脚的作业形式,把PD4设置为输入形式,D3设置为输出形式。

在STM8S_StdPeriph_Lib库中,能够运用这个函数进行设置:

void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef GPIO_Pin, GPIO_Mode_TypeDef GPIO_Mode)

GPIOx是端口编号,取值有GPIOA、GPIOB、GPIOC、GPIOD,别离对应单片机的PAx、PBx、PCx、PDx端口,GPIO_Pin是引脚编号,取值有GPIO_PIN_1~GPIO_PIN_7,函数经过GPIOx和GPIO_Pin两个参数指定一个仅有的引脚。

GPIO_Mode是作业形式了。表明输入形式的取值有四种,别离是要不要上拉,要不要中止的四种组合:

GPIO_MODE_IN_FL_NO_IT Input floating, no external interrupt

GPIO_MODE_IN_PU_NO_IT Input pull-up, no external interrupt

GPIO_MODE_IN_FL_IT Input floating, external interrupt

GPIO_MODE_IN_PU_IT Input pull-up, external interrupt

要上拉的话,单片机内部会主动为引脚供给一个上拉电流,在没有外部输入的情况下,引脚便是高电平了。

表明输出形式的取值有8种,别离是是否开漏输出、输出凹凸电平、是否高速输出的组合:

GPIO_MODE_OUT_OD_LOW_FAST Output open-drain, low level, 10MHz

GPIO_MODE_OUT_PP_LOW_FAST Output push-pull, low level, 10MHz

GPIO_MODE_OUT_OD_LOW_SLOW Output open-drain, low level, 2MHz

GPIO_MODE_OUT_PP_LOW_SLOW Output push-pull, low level, 2MHz

GPIO_MODE_OUT_OD_HIZ_FAST Output open-drain, high-impedance level,10MHz

GPIO_MODE_OUT_PP_HIGH_FAST Output push-pull, high level, 10MHz

GPIO_MODE_OUT_OD_HIZ_SLOW Output open-drain, high-impedance level, 2MHz

GPIO_MODE_OUT_PP_HIGH_SLOW Output push-pull, high level, 2MHz

在这个运用中,需求把PD4设置为带上拉(由于按钮未按下时要呈高电平)、有中止的输入形式。开机时,PD3要设置为低电平的输出形式(低电平才能让Q1导通)。关机时PD3要设置为不带上拉的输入形式,所以这部分代码要这样写:

GPIO_Init(GPIOD, GPIO_PIN_4, GPIO_MODE_IN_PU_IT); //PD4设置为带上拉、有中止的输入形式

GPIO_Init(GPIOD, GPIO_PIN_3, GPIO_MODE_OUT_PP_LOW_FAST); //开机时把PD3设置低电平的输入模

GPIO_Init(GPIOD, GPIO_PIN_3, GPIO_MODE_IN_FL_NO_IT);//关机时把PD3设置低电平的输入形式

额定提一下,除了GPIO_Init函数能够设置引脚是输出高电平仍是低电平,还能够用下面四个函数持续引脚的凹凸电平:

void GPIO_Write(GPIO_TypeDef* GPIOx, uint8_t PortVal) //输出PortVal指定的电平

void GPIO_WriteHigh(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef PortPins) //输出高电平

void GPIO_WriteLow(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef PortPins) //输出低电平

void GPIO_WriteReverse(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef PortPins) //凹凸电平翻转一次

2)停机形式设置

STM8S单片机有停机形式,在停机形式下,单片机功耗降到最低,一切时钟停止作业,但能够保存RAM和寄存器的值,停机形式只能能够经过下面几种办法退出:

-外部中止(GPIO)

-CAN接纳中止

-SPI传输完毕

-I2C中止(从地址匹配)

-复位

经过履行HALT指令,也便是履行库函数的halt()函数进入停机形式。

3)设置外部中止

外部中止经过SetExtIntSensitivity函数设置:

void EXTI_SetExtIntSensitivity(EXTI_Port_TypeDef Port, EXTI_Sensitivity_TypeDef SensitivityValue)

其间Port是要设置外部中止的端口,取值有GPIOA、GPIOB、GPIOC、GPIOD,别离对应单片机的PAx、PBx、PCx、PDx端口;

SensitivityValue是外部中止类型,有以下几种取值,别离表明下降沿和低电平触发中止、上升沿触发中止、下降沿触发中止、上升沿和下降沿触发中止:

EXTI_SENSITIVITY_FALL_LOW Interrupt on Falling edge and Low level

EXTI_SENSITIVITY_RISE_ONLY Interrupt on Rising edge only

EXTI_SENSITIVITY_FALL_ONLY Interrupt on Falling edge only

EXTI_SENSITIVITY_RISE_FALL Interrupt on Rising and Falling edges

在这个运用中,按钮按下是发生下降沿,要选取EXTI_SENSITIVITY_FALL_ONLY形式。

设置中止形式后,还需求启用中止,运用enableInterrupts()函数启用。

4)外部中止处理程序

在ST官方供给的STM8S_StdPeriph_Lib库自带的模板中,中止处理程序都在stm8s_it.c中完成。stm8s_it.c中现已依据中止向量设置好了每种中止处理程序的进口函数。只需在相应函数中填入内容即可。

这个运用中是要编写GPIOD端口的外部中止处理函数,所以要在这个中

这个运用中是要编写GPIOD端口的外部中止处理函数,所以要在这个中止处理函数中添加开关机的内容:

INTERRUPT_HANDLER(EXTI_PORTD_IRQHandler, 6)

{

}

5)全体程序规划和源代码

单片机程序流程图如下,包含主程序main()的流程和stm8s_it.c的外部中止处理程序流程:

具体源代码如下,要害点前面现已介绍,就不再具体说明晰:

A)main.c的源代码:

void Delay(uint16_t nCount)//界说延时函数,FFFF大约是0.2s

{

while (nCount != 0)

{

nCount–;

}

}

bool fPowerOn_flag =FALSE;//界说开关机标志

void main(void)

{

GPIO_Init(GPIOD,GPIO_PIN_4,GPIO_MODE_IN_PU_IT);

EXTI_SetExtIntSensitivity(EXTI_PORT_POWER_KEY,EXTI_SENSITIVITY_FALL_ONLY);

enableInterrupts();

while (1)

{

if(fPowerOn_flag == FALSE)

{

GPIO_Init(GPIOD, GPIO_PIN_3, GPIO_MODE_IN_FL_NO_IT);//PD3脚设置为输入形式,Q1截止

halt();//进入停机形式

}else

{

GPIO_Init(GPIOD, GPIO_PIN_3, GPIO_MODE_OUT_PP_LOW_FAST);//PD3脚设置为输出形式且为低电平,Q1导通

///////

//刺进用户自界说的代码

//////

}

}

}

B)stm8s_it.c的源代码:

void Delay(uint16_t nCount); //Delay函数在main.c中界说

extern bool fPowerOn_flag; //fPowerOn_flag在main.c中界说,所以这儿要声明成外部变量

INTERRUPT_HANDLER(EXTI_PORTD_IRQHandler, 6)

{

Delay(6000); //延时消抖

if(!GPIO_ReadInputPin(GPIOD, GPIO_PIN_3))//判别是不是按钮被按下

{

if(fPowerOn_flag)

{

fPowerOn_flag=FALSE;

}else

{

fPowerOn_flag=TRUE;

}

}

}

3、关机后实测成果

运用STM8S开发板实测关机电流,为40μA左右:

按18650锂电池的典型容量2500mah核算,关机后能够支撑2500mah/0.04ma/24小时/365天=7.1年,现已超越电池的充电循环运用寿命了,根本能够承受,不过应该还没有到达最低值,还能够研讨Datasheet,持续优化软件,进一步减低关机电流。

4、总结

开关机部分就讲完了,最终总结一下,这部分学习到的知识点包含:

1、单片机硬件规划,至少需求一个VCAP电容接到VCAP引脚和地之间,选用容量为1μF的瓷片电容,电在路布局上,这个%&&&&&%越接近单片机%&&&&&%越好。

2、设置各个引脚的输入、输出形式设置办法

3、进入和退出停机形式的办法

4、设置外部中止和中止处理程序

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/zhishi/jichu/154604.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部