对单片机操作时一般有三个步骤,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学习笔记---IAR工程重命名
下一篇:STM8学习笔记---利用UID码实现开机产生随机数
推荐阅读最新更新时间:2024-11-10 07:02
设计资源 培训 开发板 精华推荐
- 具有电源排序功能的 LTC3589EUJ-1 8 输出降压稳压器的典型应用电路
- LM5175PMPR主控自动升降压模块,锁定12V@6A输出
- 采用单端 15V 输入电源的 LTC3265MPDHC 低功率 ±20V 电源的典型应用电路
- 用于工业应用的 LT3973EMSE-3.3 5V 降压转换器的典型应用
- LT8631EFE 5V、低纹波 1A 降压转换器的典型应用电路
- ikea继电器
- ADP3309 任何 CAP 100mA 低压差线性稳压器的典型应用
- 【训练营_进阶班】wifi+433+物理开关-741110A
- AD8062AR-EB,AD8062ARZ 双通道高速运算放大器评估板,采用 8 引脚 SOIC 封装
- PCB封装尺
- 【唤新】微信寄语2018年STM32峰会,赢取ST精美板卡
- 直播主题: 助力“双碳”目标 — ADI 智能工厂方案
- 邀您观看 微信直播:户外照明智能互连解决方案 让TE连接光明与智能未来
- 直播已结束|Littelfuse 智能楼宇电子设备安全与可靠性解决方案
- 趣味电子技术史话之通信技术史——科技与人文的结合,传奇故事在这里!
- ST工业峰会开启报名中!(10月29日,深圳)
- 聊聊你眼中的仙童,超值极品拿到手!
- 2021年STM32中国峰会暨粉丝狂欢节 报名啦!
- EE邀你一起来玩NXP RAPID IOT套件
- 有奖直播:安世半导体先进 SiC MOSFET 助力提升 EV-Charger 和 OBC 应用能效