1
完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
对单片机操作时一般有三个步骤,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 ); } } 这样通过宏定义处理后,程序的可读性就提高了很多。 |
|
|
|
只有小组成员才能发言,加入小组>>
3310 浏览 9 评论
2991 浏览 16 评论
3492 浏览 1 评论
9055 浏览 16 评论
4086 浏览 18 评论
1174浏览 3评论
603浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
596浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2333浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1894浏览 2评论
小黑屋| 手机版| Archiver| 德赢Vwin官网 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-21 21:08 , Processed in 1.333858 second(s), Total 77, Slave 59 queries .
Powered by 德赢Vwin官网 网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
德赢Vwin官网 观察
版权所有 © 湖南华秋数字科技有限公司
德赢Vwin官网 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号