由Arduino uno 到STC89C52再到STM32的综合概括

总述

           对于刚接触硬件电路的同学来说,Arduino无疑是一个很好的入门工具,但随着认知和技术的提升,我们不再满足于单纯的调用库函数,而是要去思考库函数从何而来。这就不得不接触库函数的底层结构,例如配置寄存器、分析时序图等等。创作此篇博客的原因,只是想和大家分享一些我个人学习的经验以及认知,若有技术性错误或是其他细节问题,望海涵。

 

1.为什么选择Arduino作为入门: 
  • 凭借其简单易用的用户体验,Arduino已用于成千上万不同的项目和应用程序中。Arduino软件对于初学者来说易于使用,但对于高级用户而言足够灵活。它可以在Mac,Windows和Linux上运行。
  • 丰富的函数库:Arduino有丰富的函数库可以方便地控制各种传感器和执行器等外设。
  • 快速开发:使用Arduino可以快速地开发出原型和实验,提高开发效率和效果。Arduino还简化了使用微控制器的过程,但与其他系统相比,它为教师,学生和感兴趣的业余爱好者提供了一些优势:
  • 下图所示代码为Arduino 驱动LED闪烁的代码,我们可以清楚的看到他的代码结构,delay函数,digital Write()函数,pinMode() 函数,由官方封装好,用户可以直接调用,IO口的操作,既不用选择输出方式,也不用配置时钟,只需要在void setup()函数中直接初始化对应IO口即可。
int ledPin = 10; //定义数字10 接口
void setup()
{
pinMode(ledPin, OUTPUT);//定义小灯接口为输出接口
}

void loop()
{
digitalWrite(ledPin, HIGH); //点亮小灯
delay(1000); //延时1 秒
digitalWrite(ledPin, LOW); //熄灭小灯
delay(1000); // 延时1 秒
}
    2.为什么摒弃arduino进入C51的学习
  • Arduino的性能和扩展能力相对较弱,不能满足一些高性能和复杂的应用需求。例如定时器资源,中断数,等
  • Arduino的可靠性和稳定性相对较差,因为它是一种开源硬件平台,没有经过严格的测试和认证。
  • 由于单片机控制是定制化的开发,经过了严格的测试和认证,因此可靠性和稳定性相对较高。
  • 下图所示是51单片机的驱动LED闪烁的代码,通过对比,不难发现51单片机中,没有封装好的延时函数,需要我们自己编写void Delay500ms()函数,头文件中还引用了INTRINS.h文件,对于P0=0XFE,就有些类似于寄存器操作的思想了
#include <REGX52.H>
#include <INTRINS.H>

void Delay500ms()		//@12.000MHz
{
	unsigned char i, j, k;

	_nop_();
	i = 4;
	j = 205;
	k = 187;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}


void main()
{
	while(1)
	{
		P0=0xFE;	//1111 1110
		Delay500ms();
		P0=0xFF;	//1111 1111
		Delay500ms();
	}
}
3.从C51到ARM:
  • 51单片机是8位微控制器,其处理能力相对较低。它的处理速度和存储容量有限,不适合处理复杂的计算和大规模数据处理任务。而且内存容量通常较小,尤其是RAM。这也限制了复杂应用的开发和扩展性。
  • STM32微控制器基于32位ARM Cortex-M内核,具有较高的处理能力和运算速度。它可以处理复杂的算法和任务,适用于要求较高性能的应用,并且STM32系列提供了丰富的外设和通信接口。

  • STM32生态系统非常健全,有大量的开发工具、软件库和文档可用。STMicroelectronics提供了一流的集成开发环境(IDE)和调试工具,并且STM32微控制器被广泛应用于各种领域,包括工业自动化、消费电子、汽车电子、医疗设备等。

  • 如下图所示,是STM32单片机实现LED闪烁的代码。他和Arduino或许是有相通之处的,都是可以直接调用官方的库函数进行基本的操作,与Arduino不同的是,他需要了解STM32片内外设挂在了那个总线上,对应时钟如何配置等问题。与C51对比,STM32多出了时钟控制、GPIO模式控制,配置STM32相关启动文件,CMSIS Cortex-M3核心外设接入层源文件,CMSIS Cortex-M3设备外围接入层系统源文件,主中断服务例程文件。STM32会用并不难,真正搞懂却不简单。

 

#include "stm32f10x.h"                  // Device header


int main(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//开启时钟
	
	GPIO_InitTypeDef GPIO_InitStructure;//定义一个结构体
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	while (1)
	{
		GPIO_ResetBits(GPIOA, GPIO_Pin_6);
		Delay_ms(1000);
	    GPIO_SetBits(GPIOA, GPIO_Pin_6);
        Delay_ms(1000);
		
		
	}
}

void Delay_us(uint32_t xus)
{
	SysTick->LOAD = 72 * xus;				//设置定时器重装值
	SysTick->VAL = 0x00;					//清空当前计数值
	SysTick->CTRL = 0x00000005;				//设置时钟源为HCLK,启动定时器
	while(!(SysTick->CTRL & 0x00010000));	//等待计数到0
	SysTick->CTRL = 0x00000004;				//关闭定时器
}


void Delay_ms(uint32_t xms)
{
	while(xms--)
	{
		Delay_us(1000);
	}
}
 

void Delay_s(uint32_t xs)
{
	while(xs--)
	{
		Delay_ms(1000);
	}
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值