stm32串口通信以及C语言程序里的内存分配
目录
- 一、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语言程序里的内存分配相关推荐
- STM32串口通信详解以及通信异常或者卡死常见问题分析
STM32串口通信详解以及通信异常或者卡死常见问题分析 目录 STM32串口通信详解以及通信异常或者卡死常见问题分析 一.常见的异常问题 二.STM32的串口简介 1.串口的通讯方式 ①按数据传输方向 ...
- C语言程序里全局变量、局部变量、堆、栈内存地址分配
C语言程序里全局变量.局部变量.堆.栈内存地址分配 1 名词解读 2 基于ubuntu编程,调试验证 2.1 编写文件 2.2 结果分析 3 基于stm32编程,调试验证 3.1 编写代码 3.2 运 ...
- stm32串口通信(初学者对于串口通信的理解)
stm32串口通信(初学者对于串口通信的理解) 标签: stm32串口通信单片机 2015-01-24 10:12 987人阅读 评论(0) 收藏 举报 分类: stm32 版权声明:本文为博主原创 ...
- 安装STM32CubeMX,stm32串口通信
目录 一.串口通信和RS-232标准 1.串口通信 波特率 数据位 停止位 奇偶校验 2.RS-232标准 二.安装STM32CubeMX,搭建STM32的开发环境 1.安装jdk 2.安装STM32 ...
- 【串口通信】K210与STM32串口通信、K210与OpenMV串口通信
[串口通信]K210与STM32串口通信.K210与OpenMV串口通信 串口通信 前言 为何需要串口通信 K210如何进行串口通信 K210串口配置 K210串口发送相关定义 K210串口发送测试 ...
- 嵌入式作业(七):基于Ardunio的STM32串口通信
嵌入式作业(七) 0 作业要求 1 Ardunio 完成STM32的串口通信 (1)安装Ardunio IDE (2)stm32串口通信 2 基于串口通信的标准库与hal库的区别 (1)hal库 (2 ...
- 【STM32串口通信】
STM32串口通信 学习计划 一.串口通信知识点 二.硬件部分 1.所需硬件 2.部分硬件连接 三.阻塞式 0.串口阻塞式发送和接收概念 1.STM32CUBEMX配置 2.编写阻塞式串口发送与接收代 ...
- STM32串口通信中使用printf发送数据配置方法 开发环境 Keil
STM32串口通信中使用printf发送数据配置方法(开发环境 Keil RVMDK) 已有 12456 次阅读2011-6-29 23:29 | 在STM32串口通信程序中使用printf发送数据, ...
- Ardunio下的STM32串口通信
文章目录 任务要求 Ardunio下的STM32串口通信 软件准备 编译烧录 标准库函数与HAL库函数的stm32编程方式差异 国人版的MCU集成开发平台 stduino IDE 总结 任务要求 安装 ...
- STM32串口通信学习总结
STM32串口通信学习总结 1.概述 1.1学习目的 ...
最新文章
- 1029 Median
- 算法刷题宝典.pdf
- 逻辑模型三要素-数据操作
- Spring Cloud Stream 学习小清单
- 计算机专业英语06章在线测试,《计算机专业英语》第06章在线测试.doc
- String.format()方法使用说明
- 【js实例】Array类型的9个数组方法,Date类型的41个日期方法,Function类型
- [转]IntelliJ IDEA 2019.3正式发布,给我们带来哪些新特性?
- java中datetime类型转换,Java中日期格式和其他类型转换详解
- 计算机在平面设计中的作用,比例设计在平面设计中的作用与意义
- z变换解差分方程例题_某些常见微分方程的一般解法(工具向)
- python读hadoop_python读取hdfs并返回dataframe教程
- 【干货】美团大脑系列之商品知识图谱的构建及应用.pdf(附下载链接)
- Learn OpenGL(四)——片段着色器(Fragment Shader)
- 测试计划的范围_【新书连载05】软件测试流程设计—系统测试计划
- [转]vs2010 crystal report使用
- Eprime的txt数据转换为excel
- kepware怎么读modbus/tcp数据_注塑机设备联网?EUROMAP 63?Kepware快速帮您搞定!
- 95后阿里P7晒出工资单:真的是狠狠扎心了...
- 采样频率和带宽的关系_真正专业DSP的灵魂3——采样率
热门文章
- 音视频多媒体开发基础概述之颜色空间(1)CIE色度模型 RGB颜色空间
- 面试笔试杂项积累-Unity
- 深度强化学习方法(DQN)玩转Atari游戏(pong)
- RFS实例登录126邮箱/利用cookie登陆百度
- 计算机DNS怎么配置,dns设置,教您怎么设置dns地址
- Docker设置DNS
- 计算机课程 图层关系认识 课件,全国“xx杯”计算机类说课大赛课件一等奖作品:图层蒙版说课课件...
- NVIDIA-SMI
- ffmpeg快速将mkv转mp4
- git如何选择性合并_git - 如何挑选一系列提交并合并到另一个分支?