使用Arduino完成STM32的串口通信

一、Arduino

Arduino IDE开发的优点是更简单,易用,上手,适合新手使用。缺点是省去了更多代码配置环节,不便于底层理解。但这不影响Arduino IDE开发的强大性,一般情况下开发板实现相同的功能,Arduino IDE开发比keil开发使用更少的代码就能实现,这一点有点类似编程界的Python与其他编程语言的对比吧。想在底层方面了解更多,如亲自操作开发板寄存器的话,建议还是使用keil+库函数开发吧。

1、Arduino下载

可以直接去Arduino官网进行下载,这里为了方便,可以直接进入云盘进行接下来完整的资料的下载:
https://pan.baidu.com/s/1kqpP1YGKtY2WRz9GNT0Z7w
提取码: q251

得到下面的文件即可
在这里插入图片描述
然后我们直接点击选中的程序进行安装Arduino IDE,安装过程基本就是默认即可
在这里插入图片描述
接下来要进行的是把整个Arduino_STM32整个文件夹拷贝到Arduino IDE安装目录下的hareware下,如图所示:

在这里插入图片描述
这样就可在开发板选项中看到各种STM32开发板了:
在这里插入图片描述
接下来进行安装编译支持文件:首先打开应用中的“工具”界面,选择如图所示选项:
在这里插入图片描述
进入界面以后在搜索框中输入“ARM”选中第一个就可以进行安装,完成以后退出即可。
在这里插入图片描述

2、Arduino实验示例

a、开发板设置

首先把STM32开发板和电脑进行连接好,注意连接的是“USB转串口”接口。如图:
在这里插入图片描述
接下来需要将BOOT引脚的默认方式修改一下:用跳帽将BOOT0与3v3相连,BOOT1与GND相连,如上图连接即可。

调整好跳帽以后就打开电源即可。

b、Arduino编译烧录

首先我们打开Arduino软件,新建一个工程:
在这里插入图片描述
然后直接把以下程序复制进去,该程序完成持续向串口输出“Hello world”,然后输入“stop”即停止。

int flag=1;   
char Stop[]="stop\n";
void setup() {
//初始化
pinMode(PB1, OUTPUT);//PB0为绿色,PB1为蓝色,PB5为红色,可根据需要改动
Serial.begin(115200);
}
void loop() 
{
  int i=0,flag=1;
  char inByte[1000];
  digitalWrite(PB1, HIGH); //小灯亮
  delay(500); // 延迟
  digitalWrite(PB1, 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;
      }
   }
  if(flag==0)
   {
    Serial.println("收到!");//当收到stop命令时停止并回复收到!
    while(1)
    {continue;}
    }
   if(flag==1)
   {
    Serial.println("Hello world!");//向串口发送数据
    delay(100); // 延迟
    }
 }

输入完成以后进行先进行保存,然后在选择对应的开发板。

我们买的是STM32103VET6指南者

因此我们选择STM32103VE即可;
在这里插入图片描述
在这里插入图片描述
接下来的上传方式选择如图所示:
在这里插入图片描述
接下来选择端口:端口的选择可以通过开关开发板电源来知道,如果打开电源,新出现的端口就是所需端口,除此之外,还可以我的电脑中通过设备管理器进行明确。
在这里插入图片描述

基本设置完以后,就可以进行编译
在这里插入图片描述
显示编译完成,此时要注意,先不要直接上传,先按一下开发板的复位键,然后在进行上传烧录
在这里插入图片描述
此时可以看到开发板上的灯亮了
在这里插入图片描述
此时点击Arduino软件左上角工具->串口监视器
在这里插入图片描述
将波特率设置为115200波特率。
然后打开监视器就可以看到程序结果了,与作业的要求一致

在这里插入图片描述

二、基于STM32两种库

标准库函数

  • 标准外设库(Standard Peripherals Library)是对STM32芯片的一个完整的封装,包括所有标准器件外设的器件驱动器。这应该是目前使用最多的ST库。几乎全部使用C语言实现。但是,标准外设库也是针对某一系列芯片而言的,没有可移植性。相对于HAL库,标准外设库仍然接近于寄存器操作,主要就是将一些基本的寄存器操作封装成了C函数。开发者需要关注所使用的外设是在哪个总线之上,具体寄存器的配置等底层信息。

注意:标准外设库不支持从STM32 L0,L4和F7开始的之后的STM32系列芯片也是针对某一系列芯片而言的,没有可移植性。

  • ST为各系列提供的标准外设库稍微有些区别。例如,STM32F1x的库和STM32F3x的库在文件结构上就有些不同,此外,在内部的实现上也稍微有些区别,这个在具体使用(移植)时,需要注意一下!但是,不同系列之间的差别并不是很大,而且在设计上是相同的。STM32的标准外设库涵盖以下3个抽象级别:
  • 包含位,位域和寄存器在内的完整的寄存器地址映射
  • 涵盖所有外围功能(具有公共API的驱动器)的例程和数据结构的集合。
  • 一组包含所有可用外设的示例,其中包含最常用的开发工具的模板项目。

HAL库函数

  • HAL是Hardware Abstraction Layer的缩写,中文名:硬件抽象层。HAL库是ST为STM32最新推出的抽象层嵌入式软件,可以更好的确保跨STM32产品的最大可移植性。该库提供了一整套一致的中间件组件,如RTOS,USB,TCP / IP和图形等。
  • HAL库是基于一个非限制性的BSD许可协议(Berkeley Software Distribution)而发布的开源代码。 ST制作的中间件堆栈(USB主机和设备库,STemWin)带有允许轻松重用的许可模式, 只要是在ST公司的MCU 芯片上使用,库中的中间件(USB 主机/设备库,STemWin)协议栈即被允许随便修改,并可以反复使用。至于基于其它著名的开源解决方案商的中间件(FreeRTOS,FatFs,LwIP和PolarSSL)也都具有友好的用户许可条款。

可以说HAL库就是用来取代之前的标准外设库的。相比标准外设库,STM32Cube HAL库表现出更高的抽象整合水平,HAL API集中关注各外设的公共函数功能,这样便于定义一套通用的用户友好的API函数接口,从而可以轻松实现从一个STM32产品移植到另一个不同的STM32系列产品。HAL库是ST未来主推的库,从前年开始ST新出的芯片已经没有STD库了,比如F7系列。目前,HAL库已经支持STM32全线产品

下面就给出两种对应的程序可以查看差异:

标准库函数:

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;
		}else
		{
			times++;
			if(times%5000==0)
			{
				printf("\r\n精英STM32开发板 串口实验\r\n");
				printf("正点原子@ALIENTEK\r\n\r\n");
			}
			if(times%200==0)printf("请输入数据,以回车键结束\r\n"); 
			if(times%30==0){LED0=!LED0; LED1=!LED1;}//闪烁LED,提示系统正在运行.
			delay_ms(10);   
		}
	}	 
 }

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;
		}else
		{
			times++;
			if(times%5000==0)
			{
				printf("\r\nALIENTEK 精英STM32开发板 串口实验\r\n");
				printf("正点原子@ALIENTEK\r\n\r\n\r\n");
			}
			if(times%200==0)printf("请输入数据,以回车键结束\r\n");  
			if(times%30==0)LED0=!LED0;//闪烁LED,提示系统正在运行.
			delay_ms(10);   
		} 
    }
}

观察代码可以看出在函数内容上是有所不同的:

在这里插入图片描述
在这里插入图片描述

通过这两个部分可以看出HAL库比起标准库具有很简洁,很方便的特点。

三、Stduino

Stduino软件可以在官网进行下载:
http://www.stduino.com/pindex.php

简介:

Stduino IDE是一款面向32位处理器快速入门学习的集成开发平台,已率先支持Arduino_Core_STM32框架,集聚快捷、高效、免费、开源、易得于一身,软件还集成了GDB调试功能!

IDE当前支持的功能有:
GDB调试
封装库下载安装
代码自动补全提示
中英文模式
UTF-8\GBK编码格式
代码快速格式化
SWD\串口程序下载&调试(已验证)
DFU程序下载方式(待验证)
USB HID程序下载方式(待验证)
maple DFU程序下载方式(待验证)
maple DFU2程序下载方式(待验证)
MassStorage程序下载方式(待验证)
更多功能细节请搜索stduino.com进行了解

已经支持的芯片&板型列表:
Stduino UNO&Nano
Nucleo 144 boards
Nucleo 64 boards
Nucleo 32 boards
Discovery boards
Eval boards
STM32MP1 series coprocessor boards
Generic STM32F0 boards
Generic STM32F1 boards
Generic STM32F3 boards
Generic STM32F4 boards
Generic STM32H7 boards
Generic STM32L0 boards
(免安装,解压后双击Stduino.exe即可运行)

下面是Stduino IDE的界面:
在这里插入图片描述

Arduino和Stduino对比:
通过两个简单的程序来属性使用Stduino IDE,可以发现它跟Ardunio还比较类似,尤其是在代码编写上风格基本一致。但是,两者在界面上却存在比较大的差别,Ardunio更加简单,没有过多的渲染,而Stduino就比较丰富,界面上做的更加精美。总的来说,其实两者在使用上是没有什么差别的。与keil相比来说,这个开发工具跟Ardunio一样,对于那些对keil操作不太熟练的人来说,这个开发工具的操作方式更加简单,更加容易上手。每种工具的出现,都是在一些软件的基础之上加以改进了。就像Stduino跟Ardunio很类似,但是,在界面方面却做更加精美,对于一些使用者来说,可能更具吸引力。


版权声明:本文为qq_45907958原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。