这里写目录标题
一丶在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)
{
/*在栈上分配*/