打印
[应用相关]

意法半导体STM8点亮LED教程分享!

[复制链接]
665|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 o_dream 于 2020-9-3 19:11 编辑


在对单片机操作时通常有三个步骤:首先是系统时钟选择,其次是单片机外设初始化,最后是主程序编写。要点亮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分频,为了方便以后程序调用,将系统时钟设置封装为一个函数。

系统时钟设置好之后,下来需要设置IO口,在中文参考手册中找到GPIO相关寄存器。

LED控制是输出口,所以需要设置 输出数据寄存器、数据方向寄存器、控制寄存器。
首先设置选择端口的数据方向,LED在PB5口接,所以需要将PB5口设置为1,PB_DDR |= 1 << 5 ;通过PB5口输出高低电平来控制LED灯的亮灭,所以输出模式选择推挽输出。控制寄存器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 );
       }
}
这样通过宏定义处理后,程序的可读性就提高了很多。








使用特权

评论回复
沙发
usysm| | 2020-9-9 17:18 | 只看该作者
时钟的配置和结构以及具体编程的实现

使用特权

评论回复
板凳
typeof| | 2020-9-9 17:18 | 只看该作者
stm8的timer2利用溢出中断,实现1s,LED闪烁一次

使用特权

评论回复
地板
yujielun| | 2020-9-9 17:19 | 只看该作者
谢谢分享的      

使用特权

评论回复
5
htmlme| | 2020-9-9 17:19 | 只看该作者
可以初始化哪个led使能  

使用特权

评论回复
6
pklong| | 2020-9-9 17:19 | 只看该作者
stm32和stm8有啥区别

使用特权

评论回复
7
touser| | 2020-9-9 17:19 | 只看该作者
STM8L和STM8S到底选哪个好

使用特权

评论回复
8
myiclife| | 2020-9-9 17:20 | 只看该作者
同时亮灭循环怎么写程序  

使用特权

评论回复
9
uytyu| | 2020-9-9 17:20 | 只看该作者
单片机操作简单。      

使用特权

评论回复
10
iyoum| | 2020-9-9 17:21 | 只看该作者
STM8断电后如何让其IO的电平为0

使用特权

评论回复
11
jkl21| | 2020-9-9 17:21 | 只看该作者
源代码谁有?        

使用特权

评论回复
12
htmlme| | 2020-9-9 17:21 | 只看该作者
AD控制2个LED灯PWM调光

使用特权

评论回复
13
yujielun| | 2020-9-9 17:21 | 只看该作者
            

使用特权

评论回复
14
pklong| | 2020-9-9 17:21 | 只看该作者
stm8库文件在哪里?  

使用特权

评论回复
15
typeof| | 2020-9-9 17:21 | 只看该作者
通过pwm控制8个led的亮度

使用特权

评论回复
16
touser| | 2020-9-9 17:21 | 只看该作者
stm8多少认为是高电平,多少认为是低电平

使用特权

评论回复
17
usysm| | 2020-9-9 17:21 | 只看该作者
如果使用开漏输出,则不能使LED点亮。

使用特权

评论回复
18
myiclife| | 2020-9-9 17:21 | 只看该作者
STM8如何定义端口?  

使用特权

评论回复
19
jkl21| | 2020-9-9 17:21 | 只看该作者
芯片ID有没有可能被擦掉   

使用特权

评论回复
20
iyoum| | 2020-9-9 17:21 | 只看该作者
STM8S 的触摸库是如何在主程序中查询键的呢

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

211

主题

1124

帖子

9

粉丝