STM32
直播中

李麒铭

7年用户 1393经验值
私信 关注
[问答]

Ardunio是怎样去完成STM32板子的串口通信的

怎样去安装Ardunio软件呢?
Ardunio是怎样去完成STM32板子的串口通信的?

回帖(1)

李莉

2021-11-19 11:25:21
  一、Ardunio 完成STM32板子的串口通信
  1、安装Ardunio软件
  下载解压安装包后安装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[]=“stopn”;
  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 = Serial.read();
  //从串口的缓冲区取出并读取一个Byte的数据
  delay(10);
  i++ ;
  }
  if(Stop=inByte)
  {
  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(“rn您发送的消息为:rnrn”);
  for(t=0;t《len;t++)
  {
  USART_SendData(USART1, USART_RX_BUF[t]);//向串口1发送数据
  while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束
  }
  printf(“rnrn”);//插入换行
  USART_RX_STA=0;
  }else
  {
  times++;
  if(times%5000==0)
  {
  printf(“rn精英STM32开发板 串口实验rn”);
  printf(“正点原子@ALIENTEKrnrn”);
  }
  if(times%200==0)printf(“请输入数据,以回车键结束rn”);
  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(“rn您发送的消息为:rn”);
  HAL_UART_Transmit(&UART1_Handler,(uint8_t*)USART_RX_BUF,len,1000); //发送接收到的数据
  while(__HAL_UART_GET_FLAG(&UART1_Handler,UART_FLAG_TC)!=SET); //等待发送结束
  printf(“rnrn”);//插入换行
  USART_RX_STA=0;
  }else
  {
  times++;
  if(times%5000==0)
  {
  printf(“rnALIENTEK 精英STM32开发板 串口实验rn”);
  printf(“正点原子@ALIENTEKrnrnrn”);
  }
  if(times%200==0)printf(“请输入数据,以回车键结束rn”);
  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的初步认识与学习,感受到了Arduino的简单易用以及良好的编程环境,大大提高了我对Arduino开发板的兴趣。其中也遇到了不少问题,但在解决问题的同时,也提升了分析问题,解决问题的能力。希望自己日后可以腾出更多的时间来了解并学习Arduino。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分