嵌入式软件设计(点灯与闪烁)
Posted 费晓行
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了嵌入式软件设计(点灯与闪烁)相关的知识,希望对你有一定的参考价值。
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】
对于嵌入式开发的同学来说,好像点灯是绕不过去的坎。学fpga,要学点灯;学soc,要学点灯;等学stm32的时候,还是要学点灯。在mcu系统中,除了mcu之外,还需要输入系统和输出系统来进行辅佐。输入系统主要是外部输入信息,比如说按键、模电信号等等。而输出信号也很多,屏幕输出、蜂鸣器、led灯等等。一些复杂的外设,往往兼顾了输入输出两个方面,比如串口、spi、iic、usb等等。
今天,我们就聊一聊点灯是怎么完成的。如果用寄存器的方式,不使用函数库,那么点灯就是往具体的bit进行置位。这种置位可能是置1,也可能是置0,根据具体情况而定。
1、从汇编跳到c语言
在mcu中,一般汇编文件都是芯片厂商提供的。比如我们使用的这块stm32f103开发板,其汇编文件就是startup_stm32f10x_hd.s文件,这中间最重要的代码就是,
; Reset handler
Reset_Handler PROC
EXPORT Reset_Handler [WEAK]
IMPORT __main
IMPORT SystemInit
LDR R0, =SystemInit
BLX R0
LDR R0, =__main
BX R0
ENDP
2、初始化led环境
初始化led环境,这里主要是为点灯做一些环境铺垫,具体含义可以参考芯片手册。
void init_led()
RCC_APB2ENR |= (1<<3);
GPIOB_CRL &= ~( 0x0F<< (4*0));
GPIOB_CRL |= (1<<4*0);
3、开始点灯
点灯的程序非常简单,就是在init_led之后,往bit 0置0即可。
int main(void)
init_led();
while(1)
GPIOB_ODR &= ~(1<<0);
4、闪烁的原理
点灯之所以会闪烁,就是中间存在一个延时的过程。试想一下,如果bit 0置0,那么就是点灯。反之,就是灭灯。这中间时间等了多久,其实就是延时。延时多久,这完全可以当作是一个输入参数来完成,比如说,延时函数可以写成这样,
void delay(int num)
int i;
for(i =0; i < num;i++)
5、编写闪烁led代码
有了延时函数,那么编写led灯闪烁代码就不再是难事,只需要先点灯、延时,再灭灯、延时即可。编译完成后烧入板子,就可以获得想要的效果。
int main(void)
init_led();
while(1)
GPIOB_ODR &= ~(1<<0);
delay(0xffff);
GPIOB_ODR |= 1 << 0;
delay(0xffff);
以上是关于嵌入式软件设计(点灯与闪烁)的主要内容,如果未能解决你的问题,请参考以下文章