完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
一丶在STM32的USART窗口通讯程序
开发板:野火指南者(STM32F103VE) STM32库版本:STM32F10x_StdPeriph_Lib_V3.5.0原理图: 编写程序 新建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打开ubunt的终端,创建一个丶c文件 mkdir text0cd text0vim text1.c 用gcc编译运行: gcc text1.cls./a.out 结果 分析: 1.对于 func1(),输出结果为 20,显然使用的是函数内部的 n,而不是外部的 n;func2() 也是相同的情况。func3() 输出 10,使用的是全局变量,因为在 func3() 函数中不存在局部变量 n,所以编译器只能到函数外部,也就是全局作用域中去寻找变量 n。堆与栈 在 C 语言中,内存分配方式不外乎有如下三种形式: 再次创建一个.c文件 gcc text2.c ls ./a.out 代码: #include #include int main(void) { /*在栈上分配*/ int i1=0; int i2=0; int i3=0; int i4=0; printf("栈:向下n"); printf("i1=0x%08xn",&i1); printf("i2=0x%08xn",&i2); printf("i3=0x%08xn",&i3); printf("i4=0x%08xnn",&i4); printf("--------------------nn"); /*在堆上分配*/ char *p1 = (char *)malloc(4); char *p2 = (char *)malloc(4); char *p3 = (char *)malloc(4); char *p4 = (char *)malloc(4); printf("p1=0x%08xn",p1); printf("p2=0x%08xn",p2); printf("p3=0x%08xn",p3); printf("p4=0x%08xn",p4); printf("堆:向上nn"); /*释放堆内存*/ free(p1); p1=NULL; free(p2); p2=NULL; free(p3); p3=NULL; free(p4); p4=NULL; return 0; } 编译运行: gcc text2.c ls ./a.out ` 结果: 分析: 内存中的栈区主要用于分配局部变量空间,处于相对较高的地址,其栈地址是向下增长的;而堆区则主要用于分配程序员申请的内存空间,堆地址是向上增长的。重温C语言程序里全局变量、局部变量、堆、栈等概念,在Keil中针对stm32系统进行编程,调试变量,进行验证; 通过串口输出信息到上位机,进行验证。 在一个STM32程序代码中,从内存高地址到内存低地址,依次分布着栈区、堆区、全局区(静态区)、常量区、代码区,其中全局区中高地址分布着.bss段,低地址分布着.data段。 (1)栈区(stack):由编译器自动分配和释放,存放函数的参数值、局部变量的值等,其操作方式类似于数据结构中的栈。例如: int a=0 // 始化区 char *p1; // 局未初始化区 ain() { nt b; har s[]=“abc”; ar *p3= “1234567”; //在文字常量区 tatic int c =0 ; //静态初始化区 p1= (char *)malloc(10); //堆区 trcpy(p1,“123456”); // "123456"放在常量区 } 所以堆和栈的区别: stack的空间由操作系统自动分配/释放,heap上的空间手动分配/释放。 tack的空间有限,heap是很大的自由存储区。将之前的main.c函数代码修改如下,并运行 #include "led.h" #include "delay.h" #include "key.h" #include "sys.h" #include "usart.h" #include int k1 = 1; int k2; static int k3 = 2; static int k4; int main(void) { static int m1=2, m2; int i = 1; char *p; char str[10] = "hello"; char *var1 = "123456"; char *var2 = "abcdef"; int *p1=malloc(4); int *p2=malloc(4); u16 t; u16 len; u16 times=0; free(p1); free(p2); delay_init(); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); uart_init(115200); LED_Init(); KEY_Init(); while(1) { for(t=0;t USART_SendData(USART1, USART_RX_BUF[t]); while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET); } USART_RX_STA=0; times++; if(times%500==0) { printf("rn嵌入式串口实验rn"); printf("hcr@1337461234qqcomrnrn"); printf("栈区-变量地址rn"); printf(" i:%prn", &i); printf(" p:%prn", &p); printf(" str:%prn", str); printf("n栈区-动态申请地址rn"); printf(" %prn", p1); printf(" %prn", p2); printf("rn.bss段rn"); printf("n全局外部无初值prn", &k2); printf("静态外部无初值prn", &k4); printf("静态内部无初值rn", &m2); printf("rn.data??rn"); printf("n全局外部有初值prn", &k1); printf("静态外部有初值prn", &k3); printf("静态内部有初值prn", &m1); printf("rn常量区n"); printf("文字常量地址prn",var1); printf("文字常量地址rn",var2); printf("rn代码区n"); printf("程序区pn",&main); printf("rn end rnrnrn"); } delay_ms(10); } } 进行烧录 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1641 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1562 浏览 1 评论
990 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
691 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1610 浏览 2 评论
1869浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
655浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
525浏览 3评论
541浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
514浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-26 15:16 , Processed in 0.772296 second(s), Total 78, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号