基于STM32串口通信USART

本文通过STM32的USART串口通信实例,介绍了如何配置并使用USART进行数据传输。同时,结合C语言的全局变量、局部变量、堆和栈的概念,详细讲解了它们在STM32编程中的应用,通过串口输出验证了变量的使用和内存分配。
摘要由CSDN通过智能技术生成

一丶在STM32的USART窗口通讯程序

开发板:野火指南者(STM32F103VE) STM32库版本:STM32F10x_StdPeriph_Lib_V3.5.0
IDE:KEIL5
代码编写工具:Source Insight 4.0(跟读代码、编写代码的最佳工具)
使用到的串口:USART1

原理图:
在这里插入图片描述

编写程序

新建NVIC.h、NVIC.c、User_USART.h、User_USART.c、main.c 5个文件,并从
STM32官方库的例子中将stm32f10x_it.c、stm32f10x_it.h、stm32f10x_conf.h拷贝到自己的工程目录下。

NVIC.h:
在这里插入图片描述
NVIC.c
在这里插入图片描述
User_USART.h
在这里插入图片描述
User_USART.c
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
stm32f10x_it.c
在这里插入图片描述
main.c
在这里插入图片描述最后的界面:
在这里插入图片描述

运行:
在这里插入图片描述
成功!
接下来
把程序烧录到stm32f103核心板
通过ST-link连接stm32核心板,下载官方STM32 STLink驱动
在这里插入图片描述
烧录成功:
在这里插入图片描述
运行仿真:
在这里插入图片描述

打开野火串口调试助手
在这里插入图片描述

通过串口转接线连接stm32核心板和电脑
开始发送数据:
在这里插入图片描述
参考资料:
链接: link.

C语言程序里全局变量、局部变量、堆、栈

在这里插入图片描述

全局与局部变量:

在所有函数外部定义的变量称为全局变量(Global Variable),它的作用域默认是整个程序,也就是所有的源文件,包括 .c 和 .h
文件。

定义在函数内部的变量称为局部变量(Local Variable),它的作用域仅限于函数内部, 离开该函数后就是无效的,再使用就会报错。

打开ubunt的终端,创建一个丶c文件

mkdir text0
cd text0
vim text1.c

在这里插入图片描述用gcc编译运行:

gcc text1.c
ls
./a.out

结果在这里插入图片描述
分析:

1.对于 func1(),输出结果为 20,显然使用的是函数内部的 n,而不是外部的 n;func2() 也是相同的情况。func3() 输出 10,使用的是全局变量,因为在 func3() 函数中不存在局部变量 n,所以编译器只能到函数外部,也就是全局作用域中去寻找变量 n。
2.由{ }包围的代码块也拥有独立的作用域,printf() 使用它自己内部的变量 n,输出 40。C语言规定,只能从小的作用域向大的作用域中去寻找变量,而不能反过来,使用更小的作用域中的变量。
3.对于 main() 函数,即使代码块中的 n 离输出语句更近,但它仍然会使用 main() 函数开头定义的 n,所以输出结果是 30。

堆与栈

在 C 语言中,内存分配方式不外乎有如下三种形式:
从静态存储区域分配:它是由编译器自动分配和释放的,即内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在,直到整个程序运行结束时才被释放,如全局变量与
static 变量。
在栈上分配:它同样也是由编译器自动分配和释放的,即在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元将被自动释放。需要注意的是,栈内存分配运算内置于处理器的指令集中,它的运行效率一般很高,但是分配的内存容量有限。
从堆上分配:也被称为动态内存分配,它是由程序员手动完成申请和释放的。即程序在运行的时候由程序员使用内存分配函数(如 malloc
函数)来申请任意多少的内存,使用完之后再由程序员自己负责使用内存释放函数(如 free
函数)来释放内存。也就是说,动态内存的整个生存期是由程序员自己决定的,使用非常灵活。需要注意的是,如果在堆上分配了内存空间,就必须及时释放它,否则将会导致运行的程序出现内存泄漏等错误。

再次创建一个.c文件

gcc text2.c
ls
./a.out

代码:

#include <stdio.h>
#include <malloc.h>
int main(void)
{
   
    /*在栈上分配*/
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值