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

发布者:创意航海最新更新时间:2017-09-02 来源: elecfans关键字:STM8S  单片机入门  关机模式  开关机按钮 手机看文章 扫描二维码
随时随地手机看文章

    开关机功能是使用电池供电系统的最基本功能。如果使用机械式开关(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锂电池的正负极。  

[转载]STM8S单片机入门2(关机模式开关机按钮)

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端口的外部中断处理函数,所以要在这个中断处理函数中增加开关机的内容:


INTERRUPT_HANDLER(EXTI_PORTD_IRQHandler, 6)

{
 
}

    5)整体程序设计和源代码

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

[转载]STM8S单片机入门2(关机模式开关机按钮)

    具体源代码如下,关键点前面已经介绍,就不再详细说明了:

    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左右:

[转载]STM8S单片机入门2(关机模式开关机按钮)
    按18650锂电池的典型容量2500mah计算,关机后可以支持2500mah/0.04ma/24小时/365天=7.1年,已经超过电池的充电循环使用寿命了,基本可以接受,不过应该还没有达到最低值,还可以研究Datasheet,继续优化软件,进一步减低关机电流。

  

4、总结

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

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

   2、设置各个引脚的输入、输出模式设置方法

   3、进入和退出停机模式的方法

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


关键字:STM8S  单片机入门  关机模式  开关机按钮 引用地址:STM8S单片机入门2(关机模式开关机按钮)

上一篇:STM8S003定时器2产生PWM
下一篇:STM8S单片机入门1(开发环境搭建)

推荐阅读最新更新时间:2024-03-16 15:35

STM8SPWM频率调节方式
CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);// 有些硬件会自动八分频 导致后面的计算出现错误 CLK_HSICmd(ENABLE); //打开内部的时钟函数 GPIO_Init(GPIOB, GPIO_PIN_0, GPIO_MODE_OUT_PP_LOW_FAST); //TIM2_PWM_Init(); /* * TIM2 Frequency = TIM2 counter clock/(ARR + 1) * 这里设置TIM2的计数频率为 24M/8/(2999+1)=1K 在这里计算频率 */ TIM2_TimeBaseIni
[单片机]
PCF8563 时钟芯片驱动程序 (STM8S/STM8L)
模拟I2C读取时钟芯片PCF8563中的日期时间 #define SCLK_Clr() GPIO_ResetBits(GPIOD, GPIO_PIN_1)//SDA IIC接口的时钟信号 #define SCLK_Set() GPIO_SetBits(GPIOD, GPIO_PIN_1) #define SDIN_Clr() GPIO_ResetBits(GPIOD, GPIO_PIN_2)//SCL IIC接口的数据信号 #define SDIN_Set() GPIO_SetBits(GPIOD, GPIO_PIN_2) u8 buf ; void SDA_IN(u8 in) { if(in) GPIO_I
[单片机]
stm8s io配置
stm8s的io有DDR,IDR,ODR,CR1,CR2这几个寄存器。对于io的配置,其实看懂下面这张表就懂了。一般用到的也就是推挽输出,浮空输入和上拉输入。 下面以PC1脚为例说明该如何配置这三种模式。 推挽输出: PC_DDR_DDR1 = 1;//io方向:输出 PC_CR1_C11 = 1;//因为DDR为1,所以CR1置1表示推挽输出模式 PC_ODR_ODR1 = 1;//1:输出高 , 0:输出低 说明,io的CR2寄存器默认为0,一般我不会去修改它的值。只有一次做模拟串口发送时将CR2配置为1 浮空输入: PC_DDR_DDR1 = 0;//io方向:输入 PC_CR1_C11=0;
[单片机]
<font color='red'>stm8s</font> io配置
单片机有前景吗?单片机入门基础知识
任何一个行业,都难免会看到一群喷子,喷行业辣鸡,喷职业苦逼。 最近看到很多喷单片机这个行业的,说这个行业工资低,学的东西又多,没前途。 还不如去学习纯软件,收入上限高。 一、无际对这个行业的看法(当小说看) 首先从工资上来说,在前几年,这个行业确实像大家说的工资没纯软件高。 不过谈论这个没有意义,虽然都需要学编程,但本身是两个不同的行业,所学的知识体系和学习深度都不一样,没有可比性。 还有就是纯软件基本没什么硬件成本,产品卖出去大多数都是纯利润。 但是每个行业都肯定有优缺点,纯软虽然成本低利润高,但也面临着激烈的竞争,实际情况并没想象这么美好。 做电子产品开发的公司虽然有硬件成本,但产品相对没那么容易被替代,因为涉及到外壳、
[单片机]
STM8S】 FLASH与EEPROM读写操作
以下为FLASH操作: #include flash.h #include stm8s_flash.h void Flash_Write_bytes(uint32_t Address , uint8_t * DataBuff,uint16_t length) { uint16_t Count=0; for( Count=0 ; Count length ; Count++ ) { FLASH_ProgramByte_User(Address+Count,DataBuff ); } } void FLASH_ProgramByte_User(uint32_t Address, uint8_t
[单片机]
我的瑞萨单片机入门
关于瑞萨单片机,就在两周前我一无所知。由于工作的需要,使我不得不转入对瑞萨单片机的学习。 刚开始的学习有点枯燥,一点头绪都没有。通过一天的了解(通过看应用资料),大致掌握了瑞萨单片机的开发流程。到现在为止两个礼拜过去了,现对过去两个礼拜的学习总结如下: 第一:学习要有兴趣,同时也要有压力。说实话,兴趣是最好的老师。在学瑞萨单片机之前,我也是仅仅对51系列的单片机有一定的了解,记得我曾经一直学PIC单片机,资料也找了很多,可时时入不了门,现在看来是自己没有学习动机。 第二:要从全局上把握瑞萨单片机开发环境所需资料。关于瑞萨单片机开发环境,一个是硬件环境,一个是软件环境。软件环境包
[单片机]
STM8S独立按键IO口设置及按下事件问题
GPIO设置 按键检测 1 连续按键检测短按 关键代码 1 GPIO设置 STM8 I/O 口引脚配置表 Px_DDR Px_CR1 Px_CR2 I/O 方式 引脚状态 0 0 0 输入 悬浮输入 0 0 1 输入 上拉输入 0 1 0 输入 中断悬浮输入 0 1 1 输入 中断上拉输入 1 0 0 输出 开漏输出 1 1 0 输出 推挽输出 1 x 1
[单片机]
STM8s外部时钟晶振失效时钟安全系统CSS启动演示
使用的最小系统晶振是8m的。 这里说下配置过程: 时钟自动切换,开启切换中断 在中断里面清除中断标志,使能CSS并开启CSS中断 CSS中断发生,清除CSS中断标志,将HSI二分频,即16M/2=8M,与外部晶振相同,这样不会影响串口波特率 窗口输出配置信息: 用手触碰PA1、PA2引脚使外部晶振失效 串口输出CSS中断
[单片机]
<font color='red'>STM8s</font>外部时钟晶振失效时钟安全系统CSS启动演示
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved