Ardunio和HAL库函数编程
一、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是一款面向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。