目录

  • 一、STM32的USART窗口通讯程序
    • 1.安装驱动以及调试助手
    • 2.代码以及调试
  • 二、Ubuntu系统下验证C语言内存分配
  • 三、STM32系统下C语言内存分配

一、STM32的USART窗口通讯程序

1.安装驱动以及调试助手

• 下载地址:野火stm32指南版
提取码:pfm1

• 安装如下驱动:右键点击下载

• 驱动下载后直接点击安装:

安装成功后即可。
• 安装调试助手:右键点击下载

• 安装mcuisp烧录软件:右键点击下载

2.代码以及调试

• 在下载网盘资源下载:

• 之后打开安装文件:
选择21-USART—串口通信->USART1接发->Project->RVMDK(uv5)
打开BH-103。
• 项目中USER部分的stm32f10x_it.c文件的串口中断服务函数部分改为如下:

// 串口中断服务函数
int i=0;
uint8_t ucTemp[50];
void DEBUG_USART_IRQHandler(void)
{if(USART_GetITStatus(DEBUG_USARTx,USART_IT_RXNE)!=RESET){ucTemp[i] = USART_ReceiveData(USART1);  }if(ucTemp[i] == '!'){if(ucTemp[i-1] == '2'&&ucTemp[i-2] == '3'&&ucTemp[i-3] == 'm'&&ucTemp[i-4] == 't'&&ucTemp[i-5] == 's'&&ucTemp[i-6] == ' ')if(ucTemp[i-7] == 'p'&&ucTemp[i-8] == 'o'&&ucTemp[i-9] == 't'&&ucTemp[i-10] == 's'){printf("收到!");while(1);}}i++;
}

其他部分保持不变。
• 将main函数修改如下:

#include "stm32f10x.h"
#include "bsp_usart.h"void delay(uint32_t count)
{while(count--);
}
int main(void)
{   USART_Config();while(1){    printf("hello windows 10!\n");delay(5000000);}
}

• 之后点击项目选项勾选生成hex文件:

• 之后依次编译->创建->重新构建,结果如下(显示产生了hex文件):

• 连接开发板到电脑上。
• 打开所下载的mcuisp将程序烧录到stm32里,修改相关数据如下:

• 点击bps修改为115200,点击···添加所创建的hex文件,在开始编程右边勾选检验和编程后执行(如图),在最下边一栏选择DTR的低电平复位,RTS高电平进Bootloader(如图),点击搜索串口选择开发板。
点击开始编程。
• 打开调试助手文件:

直接打开exe文件。
• 打开后的调试助手如下:
此处应确保调试助手和烧录软件的串口都为开发板

• 点击打开串口:
发送stop stm32!后停止发送。

若需重新开始调试需关闭串口重新启用mcuisp烧录软件点击开始编程,再打开串口即可。

二、Ubuntu系统下验证C语言内存分配

• 关于C语言程序里全局变量、局部变量、堆、栈等概念可详细参考该博主
• 在Ubuntu下创建.c文件输入代码如下;

#include <stdio.h>
#include <string.h>
#include <stdlib.h>char g_buf[16]; //定义全局变量
char g_buf2[16];
char g_buf3[16];
char g_buf4[16];
char g_i_buf[]="123"; //定义全局常量
char g_i_buf2[]="123";
char g_i_buf3[]="123";int main(int argc, char **argv)
{char l_buf[16]; //定义局部变量char l_buf2[16];char l_buf3[16];static char s_buf[16]; //定义静态变量static char s_buf2[16];static char s_buf3[16];char *p_buf; //定义指针char *p_buf2;char *p_buf3;p_buf = (char *)malloc(sizeof(char) * 16);//定义堆中指针p_buf2 = (char *)malloc(sizeof(char) * 16);p_buf3 = (char *)malloc(sizeof(char) * 16);printf("全局变量地址:\n");printf("g_buf: 0x%x\n", g_buf);printf("g_buf2: 0x%x\n", g_buf2);printf("g_buf3: 0x%x\n", g_buf3);printf("g_buf4: 0x%x\n", g_buf4);printf("全局常量地址:\n");printf("g_i_buf: 0x%x\n", g_i_buf);printf("g_i_buf2: 0x%x\n", g_i_buf2);printf("g_i_buf3: 0x%x\n", g_i_buf3);printf("局部变量地址:\n");printf("l_buf: 0x%x\n", l_buf);printf("l_buf2: 0x%x\n", l_buf2);printf("l_buf3: 0x%x\n", l_buf3);printf("静态变量地址:\n");printf("s_buf: 0x%x\n", s_buf);printf("s_buf2: 0x%x\n", s_buf2);printf("s_buf3: 0x%x\n", s_buf3);printf("指针地址:\n");printf("p_buf: 0x%x\n", p_buf);printf("p_buf2: 0x%x\n", p_buf2);printf("p_buf3: 0x%x\n", p_buf3);if (argc > 1){strcpy(l_buf, argv[1]);}return 0;
}

• 保存退出,在终端输入命令执行该程序得到结果如下:

• 由于C语言内存分为:栈区、堆区、全局(静态)区、常量区
• 其中局部变量存储在栈中,指针存储在堆中,静态变量存储在静态区。
• 所以由得到的结果可知:
• 全局常量地址是向上增长,静态变量向下增长。栈地址向下增长,堆地址向上增长。
可得地址分配如下得到验证。

三、STM32系统下C语言内存分配

• 打开之前串口通讯实验BH-103项目,修改main.c文件如下:

#include "stm32f10x.h"
#include "bsp_usart.h"char g_buf1[16];//定义全局变量
char g_buf2[16];
char g_buf3[16];int main(void)
{   char l_buf1[16];//定义局部变量char l_buf2[16];char l_buf3[16];USART_Config();printf("全局变量地址为:\n");printf("g_buf1: 0x%p\n", g_buf1);printf("g_buf2: 0x%p\n", g_buf2);printf("g_buf3: 0x%p\n", g_buf3);printf("局部变量地址为:\n");printf("l_buf1: 0x%p\n",l_buf1);printf("l_buf2: 0x%p\n",l_buf2);printf("l_buf3: 0x%p\n",l_buf3);while(1){   }
}

• 之后点击编译->构建->重新构建生成hex文件。
• 在烧录软件中选择刚生成的hex文件(此次烧录软件其余部分保持和之前实验不变)。
• 点击开始编程。
• 打开调试助手,打开串口得到结果如下:
• 此处若打开串口不行,应点击reset键重置开发板

• 全局变量存储在静态区地址依次增大,局部变量存储在栈区地址依次减小。
• 继续将main.c函数修改为如下:

#include "stm32f10x.h"
#include "bsp_usart.h"
#include <stdlib.h>int main(void)
{   static char st1[16];//定义静态变量static char st2[16];static char st3[16];char *p1;//定义指针char *p2;char *p3;USART_Config();printf("静态变量地址:\n");printf("st1: 0x%p\n", st1);printf("st2: 0x%p\n", st2);printf("st3: 0x%p\n", st3);p1 = (char *)malloc(sizeof(char) * 16);//定义堆中指针p2 = (char *)malloc(sizeof(char) * 16);p3 = (char *)malloc(sizeof(char) * 16);printf("堆指针地址:\n");printf("p1: 0x%p\n", p1);printf("p2: 0x%p\n", p2);printf("p3: 0x%p\n", p3);while(1){    }
}

• 重复上个烧录和调试步骤得到调试结果:

• 静态变量存储在静态区地址依次增大,指针存储在堆区地址依次增大。
• 由两个实验结果可得:
• 在内存分配中,栈的位置最高,然后是堆,再是静态区
• 参考:内存的堆分配和栈分配

stm32串口通信以及C语言程序里的内存分配相关推荐

  1. STM32串口通信详解以及通信异常或者卡死常见问题分析

    STM32串口通信详解以及通信异常或者卡死常见问题分析 目录 STM32串口通信详解以及通信异常或者卡死常见问题分析 一.常见的异常问题 二.STM32的串口简介 1.串口的通讯方式 ①按数据传输方向 ...

  2. C语言程序里全局变量、局部变量、堆、栈内存地址分配

    C语言程序里全局变量.局部变量.堆.栈内存地址分配 1 名词解读 2 基于ubuntu编程,调试验证 2.1 编写文件 2.2 结果分析 3 基于stm32编程,调试验证 3.1 编写代码 3.2 运 ...

  3. stm32串口通信(初学者对于串口通信的理解)

    stm32串口通信(初学者对于串口通信的理解) 标签: stm32串口通信单片机 2015-01-24 10:12 987人阅读 评论(0) 收藏 举报  分类: stm32 版权声明:本文为博主原创 ...

  4. 安装STM32CubeMX,stm32串口通信

    目录 一.串口通信和RS-232标准 1.串口通信 波特率 数据位 停止位 奇偶校验 2.RS-232标准 二.安装STM32CubeMX,搭建STM32的开发环境 1.安装jdk 2.安装STM32 ...

  5. 【串口通信】K210与STM32串口通信、K210与OpenMV串口通信

    [串口通信]K210与STM32串口通信.K210与OpenMV串口通信 串口通信 前言 为何需要串口通信 K210如何进行串口通信 K210串口配置 K210串口发送相关定义 K210串口发送测试 ...

  6. 嵌入式作业(七):基于Ardunio的STM32串口通信

    嵌入式作业(七) 0 作业要求 1 Ardunio 完成STM32的串口通信 (1)安装Ardunio IDE (2)stm32串口通信 2 基于串口通信的标准库与hal库的区别 (1)hal库 (2 ...

  7. 【STM32串口通信】

    STM32串口通信 学习计划 一.串口通信知识点 二.硬件部分 1.所需硬件 2.部分硬件连接 三.阻塞式 0.串口阻塞式发送和接收概念 1.STM32CUBEMX配置 2.编写阻塞式串口发送与接收代 ...

  8. STM32串口通信中使用printf发送数据配置方法 开发环境 Keil

    STM32串口通信中使用printf发送数据配置方法(开发环境 Keil RVMDK) 已有 12456 次阅读2011-6-29 23:29 | 在STM32串口通信程序中使用printf发送数据, ...

  9. Ardunio下的STM32串口通信

    文章目录 任务要求 Ardunio下的STM32串口通信 软件准备 编译烧录 标准库函数与HAL库函数的stm32编程方式差异 国人版的MCU集成开发平台 stduino IDE 总结 任务要求 安装 ...

  10. STM32串口通信学习总结

                                                                             STM32串口通信学习总结 1.概述 1.1学习目的 ...

最新文章

  1. 1029 Median
  2. 算法刷题宝典.pdf
  3. 逻辑模型三要素-数据操作
  4. Spring Cloud Stream 学习小清单
  5. 计算机专业英语06章在线测试,《计算机专业英语》第06章在线测试.doc
  6. String.format()方法使用说明
  7. 【js实例】Array类型的9个数组方法,Date类型的41个日期方法,Function类型
  8. [转]IntelliJ IDEA 2019.3正式发布,给我们带来哪些新特性?
  9. java中datetime类型转换,Java中日期格式和其他类型转换详解
  10. 计算机在平面设计中的作用,比例设计在平面设计中的作用与意义
  11. z变换解差分方程例题_某些常见微分方程的一般解法(工具向)
  12. python读hadoop_python读取hdfs并返回dataframe教程
  13. 【干货】美团大脑系列之商品知识图谱的构建及应用.pdf(附下载链接)
  14. Learn OpenGL(四)——片段着色器(Fragment Shader)
  15. 测试计划的范围_【新书连载05】软件测试流程设计—系统测试计划
  16. [转]vs2010 crystal report使用
  17. Eprime的txt数据转换为excel
  18. kepware怎么读modbus/tcp数据_注塑机设备联网?EUROMAP 63?Kepware快速帮您搞定!
  19. 95后阿里P7晒出工资单:真的是狠狠扎心了...
  20. 采样频率和带宽的关系_真正专业DSP的灵魂3——采样率

热门文章

  1. 音视频多媒体开发基础概述之颜色空间(1)CIE色度模型 RGB颜色空间
  2. 面试笔试杂项积累-Unity
  3. 深度强化学习方法(DQN)玩转Atari游戏(pong)
  4. RFS实例登录126邮箱/利用cookie登陆百度
  5. 计算机DNS怎么配置,dns设置,教您怎么设置dns地址
  6. Docker设置DNS
  7. 计算机课程 图层关系认识 课件,全国“xx杯”计算机类说课大赛课件一等奖作品:图层蒙版说课课件...
  8. NVIDIA-SMI
  9. ffmpeg快速将mkv转mp4
  10. git如何选择性合并_git - 如何挑选一系列提交并合并到另一个分支?