完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
一、基于寄存器与基于固件库的stm32 LED流水灯例子的编程方式有什么差异
使用固件库,目前比较多的例程是使用固件库编写的。官方的例子也都采用固件库方式。特点就是简单,易于理解,资料多。如果你没有CortexM系列内核的开发基础,建议从固件库开始玩起。等有一定基础,或是特别需要时再用寄存器。 使用寄存器,想要深入理解CortexM3内核或是需要为了获得更好的可移植性,学习寄存器编程会比较有帮助。但是从专业的角度上看,寄存器更贴近底层,对外设的工作原理和运行机理会有更深的理解。 二、STM32的USART窗口通讯程序 完成这次任务用到的是stm32核心板,根据原理图连好线后应该如下图所示: 要求完成以下任务: 1)设置波特率为115200,1位停止位,无校验位。 2)STM32系统给上位机(win10)连续发送“hello windows!”,上位机接收程序可以使用“串口调试助手“,也可自己编程。 3)当上位机给stm32发送“Stop,stm32”后,stm32停止发送。 续经过以下操作完成: 步骤1:准备工作 1、keil5软件,版本最好在5.20以上,野火串口调试助手。 2、stm32核心板、u***转TTL线、TL-link下载线。 3、现成的keil工程(用于完成任务的工程代码,可在野火官网下载) 步骤2:烧录 打开现成的keil工程 打开后如下:
具体过程如下图: 可以看到要求已经实现,会连续发送woshiweishien,输入Stop,stm32时,会停止发送。 相关代码:(因为在野火官网可以下载现成的,故只给出main函数部分) #include "led.h" #include "delay.h" #include "key.h" #include "sys.h" #include "usart.h" #include int hcr=1; int main(void) { char stop[]={'S','t','o','p',',','s','t','m','3','2'}; u16 t; u16 len; u16 times=0; delay_init(); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); uart_init(115200); LED_Init(); KEY_Init(); while(hcr) { if(USART_RX_STA&0x8000) { len=USART_RX_STA&0x3fff; printf("rnhello windows!:rnrn"); for(t=0;t for(t=0;t USART_SendData(USART1, USART_RX_BUF[t]); while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET); } printf("rnrn");//²åÈë»»ÐÐ USART_RX_STA=0; } else { times++; if(times%100==0) { printf("rnwoshiiweishenrn"); } delay_ms(10); } } } 三、重温C语言程序里全局变量、局部变量、堆、栈等概念,并在ubuntu系统中编程,输出信息进行验证 1、全局变量与局部变量 在所有函数外部定义的变量称为全局变量(Global Variable),它的作用域默认是整个程序,也就是所有的源文件,包括 .c 和 .h 文件。 定义在函数内部的变量称为局部变量(Local Variable),它的作用域仅限于函数内部, 离开该函数后就是无效的,再使用就会报错。 局部变量和全局变量的zhongh综合示例演示: 代码: #include int n = 10; //全局变量 void func1(){ int n = 20; //局部变量 printf("func1 n: %dn", n); } void func2(int n){ printf("func2 n: %dn", n); } void func3(){ printf("func3 n: %dn", n); } int main(){ int n = 30; //局部变量 func1(); func2(n); func3(); //代码块由{}包围 { int n = 40; //局部变量 printf("block n: %dn", n); } printf("main n: %dn", n); return 0; } 在Ubuntu下编译运行 分析:
在 C 语言中,内存分配方式不外乎有如下三种形式:
代码: #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; } 在Ubuntu下编译运行 分析: 从运行结果中不难发现,内存中的栈区主要用于分配局部变量空间,处于相对较高的地址,其栈地址是向下增长的;而堆区则主要用于分配程序员申请的内存空间,堆地址是向上增长的。 四、重温C语言程序里全局变量、局部变量、堆、栈等概念,在Keil中针对stm32系统进行编程,调试变量,进行验证; 通过串口输出信息到上位机,进行验证。 1、栈区(stack) 临时创建的局部变量存放在栈区。 函数调用时,其入口参数存放在栈区。 函数返回时,其返回值存放在栈区。 const定义的局部变量存放在栈区。 2、堆区(heap) 堆区用于存放程序运行中被动态分布的内存段,可增可减。 可以有malloc等函数实现动态分布内存。 有malloc函数分布的内存,必须用free进行内存释放,否则会造成内存泄漏。 3、.bss段 未初始化的全局变量存放在.bss段。 初始化为0的全局变量和初始化为0的静态变量存放在.bss段。 .bss段不占用可执行文件空间,其内容有操作系统初始化。 4、.data段 已经初始化的全局变量存放在.data段。 静态变量存放在.data段。 .data段占用可执行文件空间,其内容有程序初始化。 const定义的全局变量存放在.rodata段。 在串口通信工程中将main函数代码改成如下: #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); //ÉèÖÃNVICÖжϷÖ×é2:2λÇÀÕ¼ÓÅÏȼ¶£¬2λÏìÓ¦ÓÅÏȼ¶ uart_init(115200); //´®¿Ú³õʼ»¯Îª115200 LED_Init(); //LED¶Ë¿Ú³õʼ»¯ KEY_Init(); //³õʼ»¯Óë°´¼üÁ¬½ÓµÄÓ²¼þ½Ó¿Ú while(1) { for(t=0;t USART_SendData(USART1, USART_RX_BUF[t]);//Ïò´®¿Ú1·¢ËÍÊý¾Ý while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//µÈ´ý·¢ËͽáÊø } USART_RX_STA=0; times++; if(times%500==0) { printf("rnǶÈëʽ´®¿ÚʵÑérn"); printf("hcr@2219491180qqcomrnrn"); 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È«¾ÖÍⲿÎÞ³õÖµ k2£º%prn", &k2); printf("¾²Ì¬ÍⲿÎÞ³õÖµ k4£º%prn", &k4); printf("¾²Ì¬ÄÚ²¿ÎÞ³õÖµ m2£º%prn", &m2); printf("rn.data¶Îrn"); printf("nÈ«¾ÖÍⲿÓгõÖµ k1£º%prn", &k1); printf("¾²Ì¬ÍⲿÓгõÖµ k3£º%prn", &k3); printf("¾²Ì¬ÄÚ²¿ÓгõÖµ m1£º%prn", &m1); printf("rn³£Á¿Çøn"); printf("ÎÄ×Ö³£Á¿µØÖ· £º%prn",var1); printf("ÎÄ×Ö³£Á¿µØÖ· £º%prn",var2); printf("rn´úÂëÇøn"); printf("³ÌÐòÇøµØÖ· £º%pn",&main); printf("rn end rnrnrn"); } delay_ms(10); } } 在keil中如下图: 在进行烧录,烧录过程在STM32的USART窗口通讯程序中已经给出。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1618 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1545 浏览 1 评论
979 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
683 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1597 浏览 2 评论
1864浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
645浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
516浏览 3评论
532浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
505浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 23:38 , Processed in 0.757472 second(s), Total 76, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号