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开发使用更少的代码就能实现。对新手的友好性相信会让它在未来受到更多人的青睐,但现阶段还有编译速度慢等缺点,希望开发团队能不忘初心,继续努力完善。“再造车轮”是有必要的,因为我们需要优质的,国人自主开发的编译软件。