当前位置:首页 > 单片机 > 单片机
[导读]开关机功能是使用电池供电系统的最基本功能。如果使用机械式开关(2段拨动开关,自锁开关等)等直接接通和切断电源,不说机械部件的可靠性,至少自动关机(一般在长时间不操作、电池电量低时需要自动关机)功能就比较

开关机功能是使用电池供电系统的最基本功能。如果使用机械式开关(2段拨动开关,自锁开关等)等直接接通和切断电源,不说机械部件的可靠性,至少自动关机(一般在长时间不操作、电池电量低时需要自动关机)功能就比较难实现。所以电池供电系统一般采用按钮开关,用一个按钮配合软件实现按一次开机、再按一次关机的功能及自动关机的功能。

这部分内容就讲述如何在STM8S上实现一键式的开关机功能。开关机功能要使用单片机的一个引脚(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_ITInput floating, no external interrupt
GPIO_MODE_IN_PU_NO_ITInput pull-up, no external interrupt
GPIO_MODE_IN_FL_ITInput floating, external interrupt
GPIO_MODE_IN_PU_ITInput pull-up, external interrupt

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

表示输出模式的取值有8种,分别是是否开漏输出、输出高低电平、是否高速输出的组合:
GPIO_MODE_OUT_OD_LOW_FASTOutput open-drain, low level, 10MHz
GPIO_MODE_OUT_PP_LOW_FASTOutput push-pull, low level, 10MHz
GPIO_MODE_OUT_OD_LOW_SLOWOutput open-drain, low level, 2MHz
GPIO_MODE_OUT_PP_LOW_SLOWOutput push-pull, low level, 2MHz
GPIO_MODE_OUT_OD_HIZ_FASTOutput open-drain, high-impedance level,10MHz
GPIO_MODE_OUT_PP_HIGH_FASTOutput push-pull, high level, 10MHz
GPIO_MODE_OUT_OD_HIZ_SLOWOutput open-drain, high-impedance level, 2MHz
GPIO_MODE_OUT_PP_HIGH_SLOWOutput 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_LOWInterrupt on Falling edge and Low level
EXTI_SENSITIVITY_RISE_ONLYInterrupt on Rising edge only
EXTI_SENSITIVITY_FALL_ONLYInterrupt on Falling edge only
EXTI_SENSITIVITY_RISE_FALLInterrupt on Rising and Falling edges
在这个应用中,按钮按下是产生下降沿,要选取EXTI_SENSITIVITY_FALL_ONLY模式。

设置中断模式后,还需要启用中断,使用enableInterrupts()函数启用。

4)外部中断处理程序

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

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

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

对一个初学单片机的人来说,学习的方法和途径非常重要。如果按教科书式的学法,上来就是一大堆指令、名词,学了半天还搞不清这些指令起什么作用,能够产生什么实际效果,那么也许用不了几天就会觉得枯燥无味而半途而废。所以学习与实践结...

关键字: 单片机入门 有效途径

今天查看STM32资料时,对输出速度2M 10M 50M不是很了解,再加上移植ARF2496K程序到STM32时出现意外情况。一、STM8S端作为接收端和发送端时接收到的数据都正常。二、发送端(STM8S),接收端(ST...

关键字: io口 stm32f stm8s 输出速率

STM8S单片机开发环境由三大部分组成,包括PC机上的开发软件(集成开发软件、驱动程序等)、调试&编程器ST-LINK、目标单片机电路板。如下图所示:1、PC机上开发软件PC机上的软件包括:ST-LINK驱动程序...

关键字: stm8s 单片机入门 开发环境

一直理解STM8S定时器有点问题,所以在做定时器时候,出现了好奇怪的问题.比如,今次在理解预装载值时候出现问题,导致动态调整预装载值均无法得到自己预期的效果.我们可以看参考手册定时器这块的描述,或者上网找一些文章

关键字: stm8s 定时器溢出 重装载

Ⅰ、写在前面完事开头难,只要肯努力;师傅领进门,修行看个人;当你看到本文,说明你是幸运的,作者接下来推出的一系列STM8S教程,将助你踏入STM8S的世界。本文是STM8S教程的开始,写给刚入门STM8S的朋友。学习本文

关键字: gpio stm8s 基础知识

一、 STM8S 外部中断进行唤醒先了解一下STM8S的中断资源再看看STM8S的中断管理。STM8S采用软件优先级和硬件优先级来控制一个中断的响应,先比较软件优先级只有当软件优先级一致时才会比较硬件优先级,由于硬件优先...

关键字: stm8s 窗口看门狗 中断唤醒 定时唤醒

前面讲过两个常用的串口,UART和SPI,这次这次讲解一下另一个常用的串口:IIC(I2C)通信科普IIC:一般有两根信号线,一根是双向的数据线SDA,另一根是时钟线SCL。所有接到IIC总线设备上的串行数据SDA都接到...

关键字: iic stm8s 主机通信

因为没有中断的清除标志位,这一点与其它单片机是不同的。EXTI_CR1 触发边沿的设置要在总中断没开时才能写入!PD7 是 不可屏蔽的最高优先级的硬件中断(TLI)设置顺序:最好先关中断 设置边沿 开启引脚 最后开总中断...

关键字: stm8s 外部中断

// PXn引脚的初始化// 输出配置void GPIO_Init(void){PX_DDR |= 1

关键字: gpio stm8s 引脚功能

STM8 电源管理2012-06-08 22:47:55|分类:STM8|字号订阅默认情况下在系统或电源复位后,MCU处于运行模式。在这种模式下,CPU由fCPU提供时钟并执行程序代码,系统时钟分别为各个处于激活状态的外...

关键字: stm8s 停机模式 电源管理
关闭
关闭