2020-12-12

一、Ardunio 完成STM32板子的串口通信

1、安装Ardunio软件

安装包

提取码:q251

下载解压安装包后安装Ardunio,直接默认安装即可

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

 

2、配置Ardunio

将打包文件中的Arduino_STM32整个文件夹复制到Arduino安装目录下的hareware下
在这里插入图片描述

复制完成后打开Arduino,点击菜单栏\工具\开发板\开发板管理器
在这里插入图片描述
输入ARM关键字搜索,选中Cortex-M3系列的编译支持文件并安装
在这里插入图片描述

安装完成后,在工具\开发板选择芯片类型,由于本人使用的是stm32f103指南者,所以选择为Generic STM32F103V series。
在这里插入图片描述
接着Variant选择STM32F103VE
在这里插入图片描述

Upload method选择Serial
在这里插入图片描述
 

3、编写程序

程序要求:
(1)持续向串口输出“Hello world!”;
(2)当接收到“stop”时,停止输出。

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); // 延迟
}
}

 

4、烧录程序

连接开发板(本人用的是ST-Link连接线)
在这里插入图片描述

选择串口COM3

在这里插入图片描述
依次点击验证和上传
在这里插入图片描述
上传成功
在这里插入图片描述

LED灯开始闪烁
在这里插入图片描述
发现串口输出的显示有些不对,这是波特率设置的问题,该把波特率设置为115200。
在这里插入图片描述

输入stop,停止发送
在这里插入图片描述

 


 

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

1、标准外设库

标准外设库(Standard Peripherals Library)是对STM32芯片的一个完整的封装,包括所有标准器件外设的器件驱动器,可以让我们写代码时更简洁。这应该是目前使用最多的ST库,几乎全部使用C语言实现。但是,标准外设库也是针对某一系列芯片而言的,没有可移植性。
 

基于标准库的串口通信的代码

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

 

2、HAL库

HAL库是用来取代之前的标准外设库的。相比标准外设库,STM32Cube HAL库表现出更高的抽象整合水平,HAL API集中关注各外设的公共函数功能,这样便于定义一套通用的用户友好的API函数接口,从而可以轻松实现从一个STM32产品移植到另一个不同的STM32系列产品。而且HAL库不光实现了寄存器的集成,还实现了一些特定功能的集成,也就是说标准外设库有时需要用几行代码完成的,HAL库一行代码就可以完成。

 

基于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);   
		} 
    }
}

 

3、差异

1、标准库向串口输出的代码

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

2、HAL库向串口输出的代码

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

HAL库不光实现了寄存器的集成,还实现了一些特定功能的集成,也就是说标准外设库有时需要用几行代码完成的,HAL库一行代码就可以完成,使用HAL库将明显减少了开发时间。

 


 

三、stduino IDE的使用体会

1、Stduino IDE

Stduino IDE官网

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

 

官网界面
在这里插入图片描述

下载后软件界
在这里插入图片描述

编写程序

String data = "";

void setup() {
    // put your setup code here, to run once:
    pinMode(PB0, OUTPUT);
    Serial.begin(115200);
}

void loop() {
    // put your main code here, to run repeatedly:
    while (Serial.available() > 0)  
    {
      data += char(Serial.read());
      delay(2);
    }
    if (data == "stop!")
    {
      digitalWrite(PB0, HIGH);
      Serial.println("STM32 has stopped!\n");
      data = "";
      while(1);
    }
    digitalWrite(PB0, HIGH); //turn the LED on (HIGH is the voltage level)
    delay(1000); // wait for a second
    digitalWrite(PB0, LOW); //turn the LED off by making the voltage LOW
    delay(1000); // wait for a second
    Serial.println("Hello World!");
    delay(1000); // wait for a second
}

在这里插入图片描述
进行编译和烧录
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
打开串口监视器

在这里插入图片描述

 

使用体会:
与Arduino相比较,stduino极易掌握,同时有着足够的灵活性。不需要太多的单片机基础、编程基础,简单学习后,可以快速的进行开发,自带程序烧录,自带串口调试,软件界面简洁。stduino IDE可以在Windows、Macintosh OS X、Linux三大主流操作系统上运行。而且Arduino不只是开发板,还是开源的电子平台。

那么需要重新开发一个国人版的MCU集成开发平台来“再造车轮”吗?
回答是肯定的,目前国内绝大多数教育软件和工程软件都是用的外国公司的软件,如MATLAB等工科必需的软件
In order to contain the development of China’s science and technology, the Ugliest country banned the use of MATLAB by Harbin Institute of Technology and other universities. As a result, our educational software and engineering software are still being strangled in China
因此/开发一款国人版的MCU集成开发平台是很有意义的。

(英文部分自行翻译,防审查)

 


 

四、小结

通过对Arduino的初步认识与学习,感受到了Arduino的简单易用以及良好的编程环境,大大提高了我对Arduino开发板的兴趣。其中也遇到了不少问题,但在解决问题的同时,也提升了分析问题,解决问题的能力。希望自己日后可以腾出更多的时间来了解并学习Arduino。

5、参考资料

Ardunio IDE完成stm32f103指南者的串口通信

Arduino IDE开发STM32F10X

Arduino 的串口通信

Arduino中文社区

stduino IDE官网

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值