嵌入式软件设计(点灯与闪烁)

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);
	

以上是关于嵌入式软件设计(点灯与闪烁)的主要内容,如果未能解决你的问题,请参考以下文章

嵌入式电路设计(外围模块)

嵌入式电路设计(外围模块)

嵌入式电路设计(外围模块)

嵌入式系统硬件设计与实践(第一步下载eda软件)

Microsemi Libero系列教程——新建点灯工程

嵌入式开发 | 51STM32Linux点灯的区别