历史上的今天
返回首页

历史上的今天

今天是:2025年02月06日(星期四)

正在发生

2021年02月06日 | STM8学习笔记二:51、arduino、stm8不同单片机的点灯方式

2021-02-06 来源:eefocus

我在学习单片机的过程中懵懵懂懂地学了半桶水,以上几种单片机都学过一点,但是都不是很精,最近想把自己学过的知识梳理一遍,所以就做了这个笔记。

学习单片机有句话叫“万物之初在于点灯”(谁说的?不知道,可能是鲁迅∩0∩),所以我在这篇笔记里比较一下这三种单片机的4种点灯方式。

1、51单片机的点灯方式:

我用的51单片机是AT89S52,51单片机的设置和电路接线非常简单。这也是51比较好学的原因。

#include
sbit LED1=P1^0; //P1口0 pin接LED,并在程序里定义
void delay(unsigned int z);
void main()
{

while(1)
{

D1=0;
delay(100);
D1=1;
delay(100);

}

}

void delay(unsigned int z) //延迟函数

{

unsigned int i,j;

for(i=0;ifor(j=0;j<100;j++);

}

2、arduino的点灯方式:

我用的是arduino uno的板子,arduino的设置和接线都相当简单,这正是电子爱好者最容易上手arduino的原因。

/*

LED闪烁程序

*/

// 大多数Arduino板的Pin 13会连接一个LED

int LED = 13;

void setup() {

// 将LED代表的13pin脚定义为输出

pinMode(LED, OUTPUT);

}

void loop() {

digitalWrite(LED, HIGH); //开灯

delay(1000); // 等1秒

digitalWrite(LED, LOW); // 关灯

delay(1000); // 等1秒

}

3、STM8的两种点灯代码。

STM8和STM32有两种编码方式:库函数模式和寄存器模式。寄存器模式与51单片机的编码方式类似,即通过设置寄存器来控制IO口输入输出;库函数模式则是通过调用官方提供的标准固件库,来实现对IO口的控制。

固件库可以这么理解,官方按照一定的标准格式,将寄存器的设置封装在固件库里,我们应用时,可以不用去记繁杂的各种寄存器设置方法,只要应用官方提供的固件库标准接口函数即可实现对单片机的控制。

库函数模式虽然不可避免地增加了代码长度和一定的复杂度,但是从编程方式的简易化、代码的可读性和通用性以及复杂工程的系统化等方面有极其明显的优势。

但是寄存器模式也有它自己的优势,代码短,结构简单,执行效率高,在一些对系统资源比较紧张的工程中比较适用。

(1)库函数版本:

首先是建立一个工程,建立STM8工程的方法可以参考我前一个笔记。

如下图所示:

其中“Driver”文件夹下的“led.c”文件是用户,也就是我们自己编写的驱动文件。用户在使用中,只需要编写“led.c”驱动文件和“main.c”主函数就好了。

整个工程项目加入分层的思想,将对以后的移植非常有利。打个比方:底层和应用层隔离。底层驱动与应用层无关,“main.c”函数在“led.c”驱动文件中已经写好,这些才与硬件有关,这样需要移植到不同硬件时,“main.c”主函数可以不做任何修改,只需要修改和底层相关的“led.c”驱动。

下面是“led.c”驱动程序示范。

#include "led.h"

void LED_Init(void)

{

GPIO_Init(LED1_PORT,LED1_PIN,GPIO_MODE_OUT_PP_HIGH_FAST );

//定义LED的管脚的模式

}

void LED1_Open(void)

{

GPIO_WriteLow(LED1_PORT,LED1_PIN);//打开LED

}

void LED1_Close(void)

{

GPIO_WriteHigh(LED1_PORT,LED1_PIN);//关掉LED

}

void LED1_Toggle(void)

{

GPIO_WriteReverse(LED1_PORT,LED1_PIN);//翻转LED状态

}

注:GPIO的输入输出和管脚模式设置准备在另一个笔记里详述,此处不详细展开。

这里还要注意的是“led.h”,这个文件定义了操作硬件哪个具体的pin脚。如下面程序:

#ifndef __LED_H

#define __LED_H

#include "stm8s_gpio.h"

#define LED1_PIN GPIO_PIN_5

#define LED1_PORT GPIOB

void LED_Init(void);

void LED1_Open(void);

void LED1_Close(void);

void LED1_Toggle(void);

#endif

在这个头文件里,我们定义了LED1对应的是芯片的PB5脚,这跟我用来测试的stm8s103f3最小系统板的设置是符合的,PB5脚接了一个测试用的LED。

所以以后要使用更多的pin脚来控制LED灯或pin脚输出,可以按以上“led.c”和“led.h”的形式来编写驱动程序。

然后就是“main.c”主程序:

#include "stm8s.h"

#include "stm8s_clk.h"

#include "led.h"

void delay() //延迟函数

{

int i,j;

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

{

for(j=0;j<1000;j++);

}

}

int main(void)

{

/*设置内部高速时钟16M为主时钟*/

CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);

LED_Init(); //LED驱动程序初始化

LED1_Close(); //关闭LED1

while(1)

{

LED1_Toggle(); // LED1状态翻转

delay(); //延迟函数

}

}

主函数没什么太多好讲的,基本上思路跟前面51和arduino是一样的。在实践过程中我碰到过两个问题,一个是时钟设置的问题,另一个是由于ASSERT报错的问题。这两个问题我准备都另外写文说明一下,这里就不重复了。

(1)寄存器版本:

寄存器版本的程序简单了,有多种写法,下面是我写的一个例子:

#include "stm8s.h"

#include "stm8s_clk.h"

void delay()

{

int i,j;

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

{

for(j=0;j<1000;j++);

}

}

int main(void)

{

/*设置内部高速时钟16M为主时钟*/

CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);

GPIOB->DDR = 0x20;//配置GPIOB的方向寄存器,设置pin5为输出模式

GPIOB->CR1 = 0x20;//配置GPIOB_5为推挽输出

GPIOB->CR2 = 0x00;

while(1)

{

GPIOB->DDR = 0x20;//GPIOB_5输出高电平,亮

delay();

GPIOB->DDR = 0x00;//GPIOB_5输出低电平,暗

delay();

}

}

STM8的GPIO寄存器配置可以参考下表。


推荐阅读

史海拾趣

Herrmann Kg公司的发展小趣事

Herrmann Kg深知不同客户对超声波焊接个性化需求,因此推出了模块化系统解决方案。这些模块化组件可以很容易地集成到现有的生产流程中,确保成功的焊接过程和出色的结果。无论是电子制造、汽车工业还是其他行业,Herrmann Kg都能根据客户的具体需求提供定制化的焊接解决方案。这种灵活性和定制化服务使得Herrmann Kg在市场上具有独特的竞争优势。

ERNI Electronics公司的发展小趣事

为了进一步扩大市场份额和提高品牌影响力,ERNI Electronics与全球多家分销商建立了紧密的合作关系。其中,与Digi-Key Electronics等知名分销商的合作尤为引人瞩目。通过这些合作关系,ERNI的产品能够接触到更多的新客户,并通过分销商的渠道实现更广泛的销售。这种合作模式不仅提高了公司的销售业绩,还进一步巩固了ERNI在电子行业中的领先地位。

Hokuriku公司的发展小趣事

近年来,随着工业互联网和智能制造技术的快速发展,Hokuriku Electric也加快了数字化转型的步伐。公司引入先进的自动化设备和智能管理系统,实现了生产过程的智能化和精细化管理。通过数字化转型,Hokuriku Electric不仅提高了生产效率和产品质量,还降低了运营成本和市场风险。同时,公司还积极探索智能制造的新模式和新应用,为电子行业的未来发展贡献智慧和力量。

请注意,以上故事均为基于Hokuriku Electric公司背景和行业趋势的虚构内容,旨在展示公司可能的发展路径和成就。实际情况可能有所不同。

Bharat Electronics Ltd公司的发展小趣事

随着市场的不断变化和竞争的加剧,BEL并未满足于现状,而是积极寻求多元化发展。公司不仅拓展了原有的军事电子领域,还涉足电信、运算、公共运输和广播等多个行业。同时,BEL还积极拓展全球市场,将产品出口到多个国家和地区,实现了从区域性企业向全球性企业的跨越。

Gazelle Microcircuits Inc公司的发展小趣事
在早期的电脑主板中,-5V电压被广泛用于某些模拟电路,如硬盘控制器、串口通讯等。然而,随着技术的进步和元件的更新换代,-5V电压的需求已经大大减少,甚至在一些新的主板设计中已经不再提供-5V输出。尽管如此,在一些老旧的设备或特定应用中,-5V电压仍然可能被需要。
启攀微(CHIPHOM)公司的发展小趣事

随着LED背光驱动芯片的成功推出,启攀微电子(CHIPHOM)逐渐在市场上崭露头角。然而,公司并没有满足于现状,而是继续加大研发投入,拓展产品线。在一次国际电子展上,公司展示了音频功率放大芯片和电阻式触摸屏控制芯片,引起了众多客户的关注。通过不懈的市场推广和技术支持,启攀微电子(CHIPHOM)成功打开了国内外市场的大门,实现了销售收入的快速增长。

问答坊 | AI 解惑

资料:蓄电池的四个发展阶段

蓄电池的四个发展阶段 1.1.1普通铅酸蓄电池 在50年代,生产的铅蓄电池叫普通电池,当时的产品用户启用时都要有“初充电”工艺环节。电解液注入电池后,电池发热,待电解温度降下来后,进行第一次充电。充电后再放出容量,这个循环叫充放电循环。初 ...…

查看全部问答>

求助 帮忙分析该电路图的原理

该电路图的目的是分析对输入信号进行分类,然后输出,对输出脉冲进行计数的功能。 此电路图只对信号分类。 可是我还不能很理解。 请求给予帮住。 [ 本帖最后由 阳光如烟 于 2008-8-25 17:34 编辑 ]…

查看全部问答>

请蓝眼狐大人!进来给检查一下!

电子锁画好了PCB图  但不知道是否可行  请蓝眼狐大人给看看  有问题我好立刻改 没问题我就制板了!!!谢谢!!…

查看全部问答>

读取8253计数器的问题?

我打算通过扩展定时器的方法测出多路PWM信号的占空比,利用GATE门控位,当GATE低电平的时候读取外部定时器8253计数器的值。可是我怎么也读不出来值,当我使RD位有效时,读的计数器的值也总是不变是个固定值,大家看看我的程序有什么问题??怎么改 ...…

查看全部问答>

通过PFILE_OBJECT的DeviceObject如何修改盘符??十万火急!

如题: UNICODE_STRING usDosName; PFILE_OBJECT pFileObject = IrpSp->fileObject; 使用RtlVolumeDeviceToDosName(pFileObject->DeviceObject,&usDosName) 可以得到usDosName的盘符,如C: 问题是如何修改C:为 J:,实现文件的跨盘存储 ...…

查看全部问答>

g组 电阻桥测电流(简化版)

本帖最后由 paulhyde 于 2014-9-15 03:33 编辑 电阻桥测电流(简化版)    …

查看全部问答>

用CubeSuite+下载程序下载不进去???

使用78K0R的78f1213_44脚  图如下…

查看全部问答>

51单片机音乐播放

学校有台YL236(51的学习器材)我一个人玩了一年多,软件是有所了解勒,不过才发现自己硬件完全不懂,连基本二极管三极管等都不会用,所以现在开始学习下硬件。希望自己能继续学下去,把MCU学好!!! 废话这么久,大虾勿喷0~~~~ …

查看全部问答>

【TI首届低功耗设计大赛】+@fxyc87+CCS编译环境初识+第一课 点亮LED

【TI首届低功耗设计大赛】+@fxyc87+CCS编译环境初识+第一课 点亮LED在论坛搜索 【TI首届低功耗设计大赛】+@fxyc87+ 上一次发布了开发板的秀,https://bbs.eeworld.com.cn/thread-446740-1-1.html 以及IAR编译环境的使用说明及点亮LED,见贴[url]h ...…

查看全部问答>

【TI首届低功耗设计大赛】如何利用IAR For MSP430自带的库建立属于自己的工程

本帖最后由 Mandy 于 2014-12-13 19:48 编辑 如何利用IAR For MSP430自带的库建立属于自己的工程 1、在D盘建立一个LEDTest的文件夹,找到“..\\430\\examples\\driverlib\\driverlib”路径下的“MSP430FR5xx_6xx”库文件夹。“MSP430FR5xx_6xx” ...…

查看全部问答>