zoukankan      html  css  js  c++  java
  • stm8笔记1-搭建工程+孤独的小灯闪烁

    这里使用的单片机是stm8s105s6,IDE是使用的IAR for stm8;

    1,首先说一下stm8的时钟:

    每一款cup都需要时钟,才能跑起来,就像小车需要发动机一样。

    stm8的时钟源有三个,分别是外部晶振/外部时钟,内部高速RC振荡器和内部低速RC振荡器。

    1.1 外部晶振和外部时钟信号(HSE)的不同点是,外部晶振是通过晶体谐振器,两个负载电容和单片机内部的电路想配合而产生时钟信号;而外部时钟信号是一个质量好且稳定的信号直接为单片机提供时钟。

    两种模式的连接示意图:

    1.2 高速内部RC振荡器(HSI)

    hsi信号由内部16MHZRC振荡器与一个可编程分频器(分频因子从1~8)产生。分频因子由寄存器CLK_CKDIVR设置决定。精度较低,但是稳定时间短。

    注意,启动的时候,主时钟源默认为HSI RC时钟的8分频。

    1.3 低速内部RC振荡器(LSI)

    128khz的内部RC振荡器LSI产生的时钟是一个低功耗,低成本的可选主时钟源。

    1.4 HSE设置为主时钟源

    因为此时钟源精度较高,所以一般设置它为时钟源,但是单片机启动时默认为HSI的8分频作为时钟源,所以需要程序切换,这里介绍自动切换方法。

    具体步骤:

    a.设置切换控制寄存器(CLK_SWCR)中的位SWEN,使能切换机制。

    b.向主时钟切换寄存器(CLK_SWR)写入时钟源,寄存器CLK_SWCR中的SWBSY被硬件置位,目标源振荡器启动,原时钟源依然被用于驱动内核和外设。一旦目标源稳定,寄存器CLK_SWR中的值将被复制到主时钟状态寄存器CLK_CMSR中去。此时SWBSY位被硬件清除,新时钟源替代旧时钟源。寄存器CLK_SWCR中的标志位swif被置位,如果SWIFN为1,则会产生一个中断。

    2 IO口寄存器

    每一个端口都有个输出数据寄存器 (ODR),一个引脚输入寄存器 (IDR)和一个数据方向寄存器(DDR) ,控制寄存器1(CR1)和控制寄存器2(CR2)用于对输入/输出进行配置。任何一个I/O引脚可以通过
    DDR,ODR,CR1CR2寄存器的相应位进行编程来配置。

     

     

     

     

    3 工程模板搭建

    3.1 当你安装好 IAR,在 IAR 安装的目录下(stm8inc),你可以找到所有的stm8的头文件,根据自己的单片机信号选择,包括的main.c中就可以,stm8不像stm32一样,还需要添加驱动文件等,它反而和51有点像。
    3.2 搭建工程

    3.2.1 打开软件,file-new-workspace,新建工作空间。

    3.2.2 project-create new project,新建一个空工程(emply project),保存(最好自己新建一个文件夹放这些东西,方便管理)。

    3.2.3 save workspace,保存到工程文件夹下。

    3.2.4 右键工程,添加一个group,名字自由定义,我是user。

    3.2.5 新建一个main.c文件,这里面将是我们写代码的地方,保存到工程目录,然后在右键我们建立的组,添加刚刚新建的文件进来。

    这里注意,如果我们添加进来的文件不在工程文件夹下,需要设置一下他们的路径,让编译器能找到他们。

    【project-options-c/c++ compler-preprocessor-additional include directories:  

    1、$PROJ_DIR$ :IAR工程目录。

    2、"    " 代表根目录。

    3、" . ." 表示返回上一级目录。

    举例一下:$PROJ_DIR$..LibrariesSTM8S_StdPeriph_Driverinc

    3.2.6 配置工程 project-options

    选择单片机型号,在General Options --> Target --> Device下选择

    在Debugger 下的 Setup 里的Driver 选择 ST-LINK

    库配置 General Options- Library Configration:如果需要使用某些标准的库函数接口(如我们使用的printf and scanf),就需要选择Full

     4 配上代码,孤独的小灯闪烁

    #include "iostm8s105s6.h"
    
    void delay(unsigned int t);
    
    void main()
    {
      if(CLK_CMSR!=0XB4)//判断当前时钟,如果不是HSE则自动切换成HSE
      {
        CLK_SWCR|=0X02;//SWEN置1,使能切换
        CLK_SWR=0XB4;//目标时钟源为HSE外部晶振
        while((CLK_SWCR&0X08)==0);//等待,直到切换成功,SWIF被置位
        CLK_SWCR=0;//清除标志位
      }
      PG_DDR=0X01;//配置PG0为输出
      PG_CR1=0X01;//配置PG0为推挽输出
      PG_CR2=0X00;//输出速率=2MHz
      while(1)
      {
        PG_ODR|=0X01;//小灯亮
        delay(50000);
        PG_ODR&=0XFE;//小灯灭
        delay(50000);
      }
    }
    
    void delay(unsigned int t)
    {
      while(t--); 
    }
  • 相关阅读:
    selenium 清空文本几种方法
    python之Chrome 启动参数
    python, selenium 之屏蔽提示框
    myeclipse 安装flex插件后变为中文 修改配置文件切换到英文界面
    用ant编译打包时 警告:编码 GBK 的不可映射字符
    redhat5.1上安装oracle 10.2g客户端及配置使用
    tomcat 1)启动时不识别执行启动命令 2)启动报错 3)关闭不了,用myEclipse启动时显示jvm_bind,端口占用
    virtualBox redhat 共享文件夹 安装增强功能
    ant 内存空间不足
    Linux (ubuntu和redhat) 常用命令及细节
  • 原文地址:https://www.cnblogs.com/caiya/p/11103145.html
Copyright © 2011-2022 走看看