历史上的今天
今天是:2025年01月02日(星期四)
2020年01月02日 | STM8学习笔记---点亮LED灯
2020-01-02 来源:eefocus
对单片机操作时一般有三个步骤,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 );
}
}
这样通过宏定义处理后,程序的可读性就提高了很多。
史海拾趣
|
万年历不知那里错了,,写入1302里的程序,读出来数码管显示的不是数字,只有见到秒数那里在跳动,请大家帮手看看那里错了。。谢谢 SCLK EQU P3.2 IO EQU P3.3 RST EQU P3.4 YEAR DATA 66H ...… 查看全部问答> |
|
恳求各位前辈帮忙 从12864读数据,用现有的子程序调试,若给某地址(如0x80)写数据,下面一句紧跟着读数据的话,可以读出刚写数据的ASCII码(我把读回的数据用P1口LED灯显示)。但如果是先在不同地址写出多个数据,再对某一地址进行读数据操作,结 ...… 查看全部问答> |
|
最近小弟写了一个基于s3c2440的裸机i2c驱动可是怎么都不好使,调试时能写入但是不能读出为什么 编译环境keil uvion 4.01b 代码 这个是ii2.h #include \"S3C2440.h\" //引脚配置+电源配置+频率配置+iic配置 //函数iic写一个数据 iic读一个数据 ii ...… 查看全部问答> |
|
求一CE5.0下有开发经验的师傅一名,帮助小弟开发一个简单程序.重分相谢....急 小弟碰一项目,用pda扫描rfid. 小弟有程序开发经验.脑袋还算灵活 现求一高人在开发中指点一二. 重分相谢 留下QQ联系方式..谢谢.. 急,很急… 查看全部问答> |
|
有几个问题没懂: 1-TouchScreenCallbackSet(WidgetpointMessage); 2-WidgetMessageQueuePrecess(); 这个两句到底是传递的什么? 讨论下 ...… 查看全部问答> |
|
replyreload += \',\' + 1325359;今天是端午节放假第一天,正好有时间,就把LaunchPaD的题答了。刚把三个级别的题都答完。答题过程连猜带查资料,选择题都对了。不知道那几个填空题怎么样。 幸好是不限时,不然好多题肯定就做不对了。通过答题,觉 ...… 查看全部问答> |
|
大家好,我最近在学习boost电路,我有点不太明白,就是电感的两个峰值电流I1和I2,他们的平均电流IL到底是和输入电流相等,还是和输出电流相等啊?有的资料上是和输入,有的是和输出,希望大家帮忙指教。谢谢了……! 还有一个问题就是boost电路的 ...… 查看全部问答> |
|
请教STM32F103ZET FSMC 访问MT9076失败 E:/9076时序.jpg --------------FSMC 总线 存储器参数配置------------------------------*/ p.FSMC_AddressSetupTime =0x0F; //地址建立时间  ...… 查看全部问答> |




