Ardunio和HAL库函数编程

Ardunio和HAL库函数编程

一,安装 Ardunio IDE 和相关软件支持库,在Ardunio 完成STM32板子的串口通信程序

(一)关于Ardunio的简介
Arduino是一款便捷灵活、方便上手的开源电子原型平台。包含硬件(各种型号的Arduino板)和软件(ArduinoIDE)。由一个欧洲开发团队于2005年冬季开发。其成员包括Massimo Banzi、David Cuartielles、Tom Igoe、Gianluca Martino、David Mellis和Nicholas Zambetti等。
它构建于开放原始码simple I/O介面版,并且具有使用类似Java、C语言的Processing/Wiring开发环境。主要包含两个的部分:硬件部分是可以用来做电路连接的Arduino电路板;另外一个则是Arduino IDE,你的计算机中的程序开发环境。你只要在IDE中编写程序代码,将程序上传到Arduino电路板后,程序便会告诉Arduino电路板要做些什么了。
Arduino能通过各种各样的传感器来感知环境,通过控制灯光、马达和其他的装置来反馈、影响环境。板子上的微控制器可以通过Arduino的编程语言来编写程序,编译成二进制文件,烧录进微控制器。对Arduino的编程是通过 Arduino编程语言 (基于 Wiring)和Arduino开发环境(基于 Processing)来实现的。基于Arduino的项目,可以只包含Arduino,也可以包含Arduino和其他一些在PC上运行的软件,他们之间进行通信 (比如 Flash, Processing, MaxMSP)来实现。
(二)安装和配置Ardunio
(1)安装
双击arduino-1.8.12-windows.exe正常安装,一直按默认方式安装下去就行。(安装包在官网)

(2)配置
(a)下载完成后,将Arduino_STM32拷贝在你安装Ardunio的hardware目录下

(b)打开Arduino,点击菜单栏\工具\开发板…\第一栏的开发板管理器。

搜索ARM,下载Cortex-M3系列的编译支持文件并安装
(三)烧录程序(stm32f103指南者)
(1)开发板连接与下载配置烧录软件
(a)连接stm32f103指南者开发板
直接用usb线把开发板与电脑相连即可。但注意usb线连接的开发板的"usb转串口"这个接口。然后用跳帽将BOOT0与3v3相连,BOOT1与GND相连,RXD与A9相连,TXD与A10相连。


(b)下载配置烧录软件
打开烧录程序


选择合适的驱动程序

完成。
(2)实战烧录
(a)编写代码
代码要求:
1)持续向串口输出“Hello world!”;
2)当接收到“stop”时,停止输出。
3) 小灯闪烁。

int flag=1;   
char Stop[]="stop\n";
void setup() {
//初始化
pinMode(PB0, OUTPUT);//PB0为绿色,PB1为蓝色,PB5为红色,可根据需要改动
Serial.begin(115200);
}
void loop() {
int i=0,flag_s=0;
char inByte[50];
digitalWrite(PB0, HIGH); //小灯亮
delay(500); // 延迟
digitalWrite(PB0, LOW); //小灯灭
delay(500); // 延迟
while (Serial.available()> 0)     //当发送缓冲区有数据时
{
        inByte[i] = Serial.read();    //从串口的缓冲区取出并读取一个Byte的数据
        delay(10); 
        i++ ;                              
}
if(Stop[i]=inByte[i])
{
  if(Stop[i-1]==inByte[i-1]&&Stop[i-2]==inByte[i-2]&&Stop[i-3]==inByte[i-3])
  {
  flag=0;
  Serial.println("收到!");
  }//当收到stop命令时停止并回复收到
}
if(flag==1)
{  
Serial.println("Hello World!");//向串口发送数据
delay(100); // 延迟
}
}

(b)烧录与监视
在菜单栏\工具下配置好开发板型号系列,开发板: 我这里选择 Genuic STM32F103Z series。Variant选择STM32F103ZE。Upload mode 选择serial。CPUSpeed选择…72Mhz…。Optimize选择Smallest(default)。
点击验证

点击上传

打开串口监视器

输入"stop"

观察闪灯

总结:(1)每一次烧录文件前一定要按开发板上的RESET按钮。(2)注意监视器处波特率的设置为115200波特率。

二,分析基于标准库函数与基于HAL库函数的stm32编程方式的差异

(一)HAL库简介
HAL库是ST公司目前主力推的开发方式,全称就是Hardware Abstraction Layer(抽象印象层)。它的出现比标准库要晚,但其实和标准库一样,都是为了节省程序开发的时期,而且HAL库尤其的有效,如果说标准库把实现功能需要配置的寄存器集成了,那么HAL库的一些函数甚至可以做到某些特定功能的集成。也就是说,同样的功能,标准库可能要用几句话,HAL库只需用一句话就够了。并且HAL库也很好的解决了程序移植的问题,不同型号的stm32芯片它的标准库是不一样的,例如在F4上开发的程序移植到F3上是不能通用的,而使用HAL库,只要使用的是相通的外设,程序基本可以完全复制粘贴,注意是相通外设,意思也就是不能无中生有,例如F7比F3要多几个定时器,不能明明没有这个定时器却非要配置,但其实这种情况不多,绝大多数都可以直接复制粘贴。是而且使用ST公司研发的STMcube软件,可以通过图形化的配置功能,直接生成整个使用HAL库的工程文件,可以说是方便至极,但是方便的同时也造成了它执行效率的低下,在各种论坛帖子真的是被吐槽的数不胜数。
(二) HAL库和lib库的区别和联系
(1)联系
HAL库和lib库都是一套API软件接口,通过不同的API接口实现相同的用户功能,本质上都是ST公司为了用户高效开发而做出的一套软件。
(2)区别
1.HAL库相对来说兼容性更强,可以在不同的ST平台下只需要修改最底层的硬件配置就可以实现在不同平台的移植。而lib库兼容性就没有那么强,F1和F4平台的差异化比较大,兼容性不是很强
2.HAL库和STM32CubeMux图形化裁剪工具软件强强联手,通过STM32CubeMux软件可以配置裁剪后自动生成HAL库形式的软件包,对底层相对不是很熟悉的用户也可以实现快速化的开发,有点更高级一点语言的分层开发,驱动层和应用层剥离开
3.第三方组件的配置,比如USB驱动库,Freertos,FATS,Lwip等第三方的配置更加方便,更加兼容,lib库开发的一些需要用户移植的第三方库在HAL库的开发过程中可以完全省略掉。
4.软件执行效率上来看,lib库的软件执行效率,代码的精简性更胜一筹,而HAL库的API接口更加丰富,执行效率上来看差lib库一些
5.未来的发展来看:HAL库会逐步替代lib库,所以掌握HAL库的整体架构是非常有必要的,包括
整个以HAL库为基础的软件开发流程,HAL库整体软件架构。使用者如何将这个HAL库能整体全局把握+底层外设驱动结合+逻辑层的分层实现+第三方库使用和移植?以上这几个点全部掌握才能做出稳定的产品,也能提高工程师自身的专业技能

(三)比较标准库与HAL库性能差异(资源来自野火官网)
标准库

int main(void)
 {		
 	u16 t;  
	u16 len;	
	u16 times=0;
	delay_init();	    	 //延时函数初始化	  
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
	uart_init(115200);	 //串口初始化为115200
 	LED_Init();			     //LED端口初始化
	KEY_Init();          //初始化与按键连接的硬件接口
 	while(1)
	{
		if(USART_RX_STA&0x8000)
		{					   
			len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度
			printf("\r\n您发送的消息为:\r\n\r\n");
			for(t=0;t<len;t++)
			{
				USART_SendData(USART1, USART_RX_BUF[t]);//向串口1发送数据
				while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束
			}
			printf("\r\n\r\n");//插入换行
			USART_RX_STA=0;
		}
 }

HAL库

int main(void)
{
	u8 len;	
	u16 times=0;
	
    HAL_Init();                    	 	//初始化HAL库    
    Stm32_Clock_Init(RCC_PLL_MUL9);   	//设置时钟,72M
	delay_init(72);               		//初始化延时函数
	uart_init(115200);					//初始化串口
	LED_Init();							//初始化LED	
	KEY_Init();							//初始化按键
	
    while(1)
    {
			
       if(USART_RX_STA&0x8000)
		{					   
			len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度
			printf("\r\n您发送的消息为:\r\n");
			HAL_UART_Transmit(&UART1_Handler,(uint8_t*)USART_RX_BUF,len,1000);	//发送接收到的数据
			while(__HAL_UART_GET_FLAG(&UART1_Handler,UART_FLAG_TC)!=SET);		//等待发送结束
			printf("\r\n\r\n");//插入换行
			USART_RX_STA=0;
		}
}

易观察到HAL库的集成度要高一些,如:
标准库

			for(t=0;t<len;t++)
			{
				USART_SendData(USART1, USART_RX_BUF[t]);//向串口1发送数据
				while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束
			}

HAL库

			HAL_UART_Transmit(&UART1_Handler,(uint8_t*)USART_RX_BUF,len,1000);	//发送接收到的数据

总结:lib库的软件注重执行效率,代码的精简性;HAL库的API接口更加丰富,追求易开发。

三,stduino IDE试玩体会

下载并试着编译几个程序

总结:Stduino IDE有一个明显的优点:简单易上手,适合新手使用。同样情况下在开发板实现相同的功能,Stduino IDE开发比keil开发使用更少的代码就能实现。对新手的友好性相信会让它在未来受到更多人的青睐,但现阶段还有编译速度慢等缺点,希望开发团队能不忘初心,继续努力完善。“再造车轮”是有必要的,因为我们需要优质的,国人自主开发的编译软件。

要使用 HAL 库函数编写 LED 灯闪烁程序,我们通常会在嵌入式开发环境中,如 STM32 或者基于 Arduino 的项目中操作。这里我将提供一个简化的示例,假设你正在使用 Keil MDK 和 STM32Cube HAL。首先,确保安装了对应的 HAL 驱动,并设置好硬件。 ```c #include "stm32f1xx_hal.h" #include <stdio.h> #include <delay.h> // 使用延时函数 // 定义 LED 变量,假设 LED0 对应 GPIOA 的 PA0 引脚 GPIO_TypeDef *ledGPIO = GPIOA; GPIO_PIN_InitTypeDef ledPinInit; int main(void) { // 初始化 HAL HAL_Init(); // LED 设置为推挽模式并配置为 OUT ledPinInit.Pin = GPIO_PIN_0; // LED0 ledPinInit.Mode = GPIO_MODE_OUTPUT_PP; ledPinInit.Pull = GPIO_NOPULL; ledPinInit.Speed = GPIO_SPEED_FREQ_VERY_HIGH; HAL_GPIO_Init(ledGPIO, &ledPinInit); // 初始状态设置为低 HAL_GPIO_WritePin(ledGPIO, GPIO_PIN_0, GPIO_PIN_RESET); // 定义闪烁间隔 uint8_t interval = 500; // 初始为500毫秒 uint8_t direction = 1; // 1 表示逐渐增加,-1表示逐渐减少 for(;;) { // 开始闪烁 HAL_GPIO_WritePin(ledGPIO, GPIO_PIN_0, GPIO_PIN_SET); delay_ms(interval); // 指定时间后关闭 LED HAL_GPIO_WritePin(ledGPIO, GPIO_PIN_0, GPIO_PIN_RESET); // 根据方向调整间隔 if (direction > 0) { // 增加 interval += 50; // 每次增加50毫秒 if (interval > 2000) { // 达到最大值后反转方向 direction = -1; } } else { // 减少 interval -= 50; // 每次减少50毫秒 if (interval <= 500) { // 最小值时恢复增长方向 direction = 1; } } } return 0; }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值