历史上的今天
今天是:2025年02月08日(星期六)
2020年02月08日 | stm8——LED流水灯实现
2020-02-08 来源:eefocus
最近接触并学习了一款STM8系列的芯片。以前学习了的ARM9+Linux后,再来学习单片机就感到上手很快了。
芯片基本信息:
Type:STM8L151G6
8-bit ultralow power MCU,
up to 32 KB Flash,
1 KB Data EEPROM
RTC,
LCD,
timers,
USART,
I2C,
SPI,
ADC,
DAC,
comparators
具体可以查看datasheet:http://pdf-file.ic37.com/pdf4/STMICROELECTRONICS/STM8L_datasheet_892862/145357/STM8L_datasheet.pdf
现在来实现最简单的LED流水灯功能,在接触一块新的板子的时候,以LED入手,并快速熟悉整个的开发环境是比较合理的选择。
开发环境:IAR Embedded Workbench
调试工具:ST Link
关于IAR的安装、ST Link驱动的安装以及环境参数的设置不再赘述,可自行参考网上资料。
===========================================
对于LED来说,它是输出设备,是由CPU的某个引脚来控制给高/低电平,从而使灯亮/灭的。具体的就要查看原理图,注意LED是给的上拉还是下拉即可。
对于这个项目来说,我们只需要到以下这些库:
时钟、配置、GPIO。
接下来我们user只需要实现led.c和led.h两个文件即可:
led.c:
#include "stm8l15x.h"
#include "led.h"
void LED_Init(void)
{
GPIO_Init(GPIOB, (GPIO_Pin_1 | GPIO_Pin_2), GPIO_Mode_Out_PP_High_Fast); //初始化引脚:1, 2 ; 输出模式:高速推挽高电平输出
}
void delay(unsigned int s) //简单的延时,并不是很准确
{
unsigned int i,j;
for(i=s; i>0; i--)
for(j=150; j>0; j--);
}
led.h:
#ifndef __LED_H
#define __LED_H
#include "stm8l15x_gpio.h"
void LED_Init(void);
void delay(unsigned int s);
#define ON 0
#define OFF 1
/*使用宏定义,使在主函数中更简洁.都是GPIO的使用*/
#define LED1(status) if(ON == status) GPIO_ResetBits(GPIOB, GPIO_Pin_1);
else GPIO_SetBits(GPIOB, GPIO_Pin_1);
#define LED2(status) if(ON == status) GPIO_ResetBits(GPIOB, GPIO_Pin_2);
else GPIO_SetBits(GPIOB, GPIO_Pin_2);
#endif
主函数main.c:
#include "stm8l15x.h"
#include "led.h"
int main( void )
{
CLK_CCOConfig(CLK_CCOSource_HSI,CLK_CCODiv_1); //配置时钟,HSI内部高速时钟 16M
LED_Init();
while(1)
{
LED1(ON);
delay(500);
LED1(OFF);
LED2(ON);
delay(500);
LED2(OFF);
}
}
compile后,make,再下载到板子上就行了.可以看到两个LED灯循环亮灭。
这里不好的一点就是延时函数不能准确延时,只是用了简单的for循环。加以学习后使用精确延时再试试。
史海拾趣
|
老听比亚迪吹自己的铁电,前几天碰到一个要从比亚迪离职的工程师,说他们的电动汽车还是铅酸电池的,比亚迪的铁电到底行不行啊,巴菲特不会也被忽悠了吧。有知情的达人给解释下阿。… 查看全部问答> |
|
小弟做的驱动命名为TMRMON,编译也通过了,但是下到2440上运行却出现以下错误: TMRMON: DLL_PROCESS_ATTACH. Data Abort: Thread=83d71184 Proc=82026360 \'device.exe\' AKY=00000005 PC=01df185c(tmrmon.dll+0x0000185c) RA=01df184c(tmrmon ...… 查看全部问答> |
|
小弟最近在S3C2410+linux2.6.13的环境下,移植成功了SD卡驱动,可以成功挂载SD卡,但是向SD卡中读-写-比较数据速度比较慢,SD卡的控制模式采用SD模式,是直接占用CPU去读写数据,我预计改为由DMA去传输数据,速度会快些,不知这样的思路可否正确 ...… 查看全部问答> |
|
我在做Wince设备中某目录下的文件复制到PC时,用CeFindAllFiles函数返回为true, 但不能返回所有的文件名,有没有谁弄过的?能不能写一下CeFindAllFiles 的用法? 最好给个例子. … 查看全部问答> |
|
Screen.PrimaryScreen.WorkingArea獲取不到工作區域 如題,獲取的是設備屏幕的高和寬,包括了工作欄, WorkingArea獲取的是工作區域,不是不包括工作欄嗎?… 查看全部问答> |
|
请问如何控制CommandBar上的OK键和Help键的使能? const DWORD dwAdornmentFlags = CMDBAR_HELP | CMDBAR_OK; m_wndCommandBar.AddAdornments(dwAdornmentFlags); 以上代码VS2005下SDI程序缺省Cancel和Help打灰,Dialog程序却缺省全部可用, 有人遇到这种情况吗?… 查看全部问答> |
|
本帖最后由 paulhyde 于 2014-9-15 03:47 编辑 最近在做波形产生这一块,用到了DDS芯片,不太明白DDS到底怎么用,内部ROM只有正弦函数的数据表,但我们要求产生任意波形,DDS内部波形ROM 不能修改吧,求用过的高手给点意见,谢了! … 查看全部问答> |




