STM8学习笔记---点亮LED灯

发布者:MindfulBeing最新更新时间:2020-01-02 来源: eefocus关键字:STM8  点亮LED灯 手机看文章 扫描二维码
随时随地手机看文章

对单片机操作时一般有三个步骤,1.系统时钟选择。2.单片机外设初始化。3主程序编写。

同样要点亮LED灯时,也要按照这个步骤来。


首先选择系统时钟,打开STM8S中文参考手册,找到时钟寄存器

在这里插入图片描述

可以看到时钟寄存器有13个,那么该用哪个呢。STM8的主时钟源有4种,我们要用的是16M内部RC振荡器

在这里插入图片描述

所以只需要设置主时钟切换寄存器CLK_SWR寄存器即可。

在这里插入图片描述

寄存器值为0XE1时,HSI为主时钟,所以将CLK_SWR值设置为0xE1。


CLK_SWR = 0xe1; //HSI为主时钟源 16MHz CPU时钟频率


然后设置时钟分频值

在这里插入图片描述

时钟分频寄存器默认值为0x18也就是8分频,我们希望单片机16M时钟运行,不分频。所以将分频寄存器的值设置为0。

CLK_CKDIVR = 0x00; //CPU时钟0分频,系统时钟0分频


为了方便以后程序调用,将系统时钟设置封装为一个函数


//系统时钟初始化

void SysClkInit( void )

{

    CLK_SWR = 0xe1;       //HSI为主时钟源  16MHz CPU时钟频率

    CLK_CKDIVR = 0x00;    //CPU时钟0分频,系统时钟0分频

}


系统时钟设置好之后,下来需要设置IO口。

在中文参考手册中找到GPIO相关寄存器。

在这里插入图片描述

LED控制是输出口,所以需要设置 输出数据寄存器、数据方向寄存器、控制寄存器。

首先设置选择端口的数据方向

在这里插入图片描述

LED在PB5口接,所以需要将PB5口设置为1

PB_DDR |= 1 << 5 ;

然后设置控制寄存器

在这里插入图片描述

通过PB5口输出高低电平来控制LED灯的亮灭,所以输出模式选择推挽输出。

PB_CR1 |= 1 << 5 ;

在这里插入图片描述

控制寄存器2在输出模式时可以设置输出速度,由于我们输出口接的是LED,所以输出速度对LED亮灭来说影响不大。这个寄存器我们也可以不设置使用默认值0就行。

在这里插入图片描述

输出数据寄存器,向这个寄存器中写1输出为高电平,向寄存器中写0,输出为低电平。

这样循环的给这个寄存器ODR5位置写0,写1时,PB口接的LED灯就亮、灭、亮、灭。循环。

到这里寄存器就设置完了,然后在主程序中循环改变PB_ODR寄存器中ODR的值就可以实现LED灯的闪烁了。

led.c中程序如下:


//LED端口初始化

void LED_GPIO_Init( void )

{

    PB_DDR |= ( 1 << 5 );        //PB5 输出 led

    PB_CR1 |= ( 1 << 5 );        //PB5 推挽输出

}


Main.c中程序如下:


#include "iostm8s003F3.h"

#include "led.h"


//系统时钟初始化

void SysClkInit( void )

{

    CLK_SWR = 0xe1;       //HSI为主时钟源  16MHz CPU时钟频率

    CLK_CKDIVR = 0x00;    //CPU时钟0分频,系统时钟0分频

}

//延时函数

void delay_ms( unsigned int ms )

{

    unsigned char i;

    while( ms != 0 )

    {

        for( i = 0; i < 250; i++ );

        for( i = 0; i < 75; i++ );

        ms--;

    }

}


void main(void)

{

    SysClkInit();

    LED_GPIO_Init();

    while(1)

    {

      PB_ODR |= ( 1 << 5 );

      delay_ms(500);

      PB_ODR &= ~( 1 << 5 );

      delay_ms(500);

    }

}


进入main函数后,首先进行时钟选择,然后对LED端口初始化,下来进入死循环中,循环改变LED口的值。这样LED灯就可以一亮已灭的闪烁了。


程序的功能是让LED灯闪烁,但是从代码中直接操作寄存器看起来不直观,可以使用宏定义,给寄存器重新取个直观的名字。

在led.h 头文件中添加宏定义

#define LED PB_ODR_ODR5

这样就把PB_ODR寄存器中的第5位ODR5 重命名为 LED,这样就对LED赋值时,就相当于对 PB_ODR_ODR5 进行赋值。于是程序中的循环可以改为


void main( void )

{

    SysClkInit();

    LED_GPIO_Init();

    while( 1 )

    {

        LED = 1;

        delay_ms( 500 );

        LED = 0;

        delay_ms( 500 );

    }

}


这样通过宏定义处理后,程序的可读性就提高了很多。

关键字:STM8  点亮LED灯 引用地址:STM8学习笔记---点亮LED灯

上一篇:STM8学习笔记---IAR工程重命名
下一篇:STM8学习笔记---利用UID码实现开机产生随机数

推荐阅读最新更新时间:2024-11-10 07:02

STM8 AWU超低功耗模式
__interrupt void AWU_IRQHandler(void) { AWU- CSR = AWU- CSR; /* 清除更新中断标志位 */ } void Enter_Halt() { CLK_DeInit(); AWU_DeInit(); AWU_Cmd(ENABLE); CLK_SlowActiveHaltWakeUpCmd(ENABLE);//进入超低功耗模式 asm( halt ); } 欢迎使用Markdown编辑器写博客 本Markdown编辑器使用 StackEdit 修改而来,用它写博客,将会带来全新的体验哦: Markdown和扩展Mark
[单片机]
stm8 Error[Li005]: no definition for XXX 的解决办法
之前gpio.c文件有问题,重新在根文件夹/inc /src中添加了一个新的gpio.c,然后我在 stm8_board.c文件中编写串口函数,编译时报错 Error : no definition for”GPIO_Init“ 意思是:我没有定义这个GPIO_Init()函数?不可能啊??????????????????? 我检查了头文件,gpio.c中定义了,gpio.h中也声明了为啥说我没定义不让我调用???????????? 经检查发现:我添加c文件时没有Make 发现.c文件里有个#endif 然后把那行删去 (.C文件有问题) 编译成功
[单片机]
<font color='red'>stm8</font> Error[Li005]: no definition for XXX 的解决办法
stm8 tim4 测速显示
/******************************************************************* 实验名称及内容:PWM测速度并显示 配套书籍:《深入浅出STM8单片机入门、进阶与应用实例》《STM8实战》 实验平台及编程人员:骨灰级菜鸟 / #include iostm8s208mb.h //主控芯片的头文件 #include “stdio.h” /端口/引脚定义/ #define LCDRS_SET PF_ODR|=0x01 //置位PF0 #define LCDRS_CLR PF_ODR&=0xFE //清0PF0 #define LCDRW_SET PF_ODR|=0x0
[单片机]
<font color='red'>stm8</font> tim4 测速显示
stm单片机型号的意义 stm8和stm32的烧写程序的区别 stm8读取程序
stm单片机型号的意义 STM单片机型号一般由几个部分组成,每个部分都代表着不同的意义: 第一部分:STM或STM32或STM8,代表单片机的品牌和系列。STM32系列是基于ARM Cortex-M内核的单片机系列,而STM8系列则是基于ST8内核的单片机系列。 第二部分:数字,代表单片机的性能等级,数字越高代表性能越高,功能也更加强大。例如,在STM32系列中,STM32F0代表基本型号,STM32F1代表通用型号,STM32F2代表高性能型号,STM32F3代表模拟型号,STM32F4代表高性能数字信号控制型号等。 第三部分:字母,代表单片机的特性和功能。例如,在STM32F4系列中,H代表高速器件,C代表低功耗器件,E代
[单片机]
stm8 clock
stm8时钟源有4种: 1. 16MHz的高速内部时钟源HSI 2. 1到16MHz的高速外部时钟源HSE 3. 32.768KHz的低速外部时钟源LSE 4. 38KHz的低速内部时钟源LSI 这4种时钟源都可以作为系统时钟,大家也可以用示波器量一下59引脚,看输出的的时钟频率是否正确,在量之前需要做如下设置: void main(void) { GPIO_Init(GPIOC, GPIO_Pin_4, GPIO_Mode_Out_PP_High_Fast); //CLK_CCOConfig(CLK_CCOSource_HSI, CLK_CCODiv_1); /* 16MHz */ CLK_
[单片机]
stm8的18b20温度显示程序
单片机源程序如下: #include stm8s.h #include Cry12864.h #include temp.h #include tim1.h void LcdDisplay(int temp) ; uint a; void main( void ) { CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);//内部时钟1分频16m Ini_Lcd();//液晶初始化 Tim1_Init();//时钟初始化 while(1) {LcdDisplay(Ds18b20ReadTemp()); } }
[单片机]
ARM体系结构之点亮LED灯
首先看看我的板子,(s3c2440) 可以看出,要使LED灯管亮,只要将nLED1置为低电平即可,就是将对应的GPIO引脚置为低电平。 从上面两幅图可以发现,LED1、LED2、LED4对应着S3c2440的GPF端口,于是,通过查询手册 可以知道对应寄存器的地址。于是可以开始编程了 .text .global _start _start: @将GPF配置为输出引脚 LDR R0, =0x56000050 MOV R1, #0x00005500 STR R1, @输出低电平 LDR R0, =0x56000054 MOV R1, #0x00000050 STR R1, MAIN_LOOP
[单片机]
ARM体系结构之<font color='red'>点亮</font><font color='red'>LED灯</font>
STM8内部时钟切换
简介:在STM8内部有时钟切换功能,可以在需要时变换时钟的频率。板子为STM8_Discovery,LED为PD0。 程序如下: //功能:STM8的内部时钟分频切换 #include iostm8s105c6.h // 函数功能:延时函数 // 输入参数:ms -- 要延时的毫秒数,这里假设CPU的主频为2MHZ void DelayMS(unsigned int ms) { unsigned char i; while(ms != 0) { for(i=0;i 250;i++) { } for(i=0;i 75;i++) { } ms--; } } /
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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