完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
基于寄存器与基于固件库的编程方式差异
固件库就是函数的集合,固件库函数的作用就是:向下负责与寄存器直接打交道,向上提供用户函数调用的接口(API)。使用固件库,目前比较多的例程是使用固件库编写的。官方的例子也都采用固件库方式。特点就是简单,易于理解,资料多。如果你没有CortexM系列内核的开发基础,建议从固件库开始玩起。等有一定基础,或是特别需要时再用寄存器。STM32的USART窗口通讯程序 功能实现: 1)设置波特率为115200,1位停止位,无校验位。 开发板:野火指南者(STM32F103VE)带3.2寸屏实验前提保证电脑与开发板连接正常,双击CH340安装驱动(CH340安装包在野火资料包里自行下载) 1、用野火多功能调试助手将串口调试助手里的波特率 2、串口通信的验证,打开官方资料库中的文件,文件路径如下: 3、keil5里把文件打开可以看到程序代码,为了达到目的需要修改部分代码,如下: ~将串口中断服务函数修改为下面代码所示 int i=0; uint8_t ucTemp[50]; void DEBUG_USART_IRQHandler(void) { if(USART_GetITStatus(DEBUG_USARTx,USART_IT_RXNE)!=RESET) { ucTemp = USART_ReceiveData(USART1); } if(ucTemp == '!') { 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); } } 4、编译生成Hex文件,然后传输到STM32里面 ~生成Hex文件 再keil里进行设置: ~传输 当上位机给stm32发送“Stop,stm32”后,stm32停止发送。 在ubuntu中针对stm32系统进行编程 打开ubantu,编写一个.c文件,代码如下代码定义了4个全局变量并输出它们的地址, #include #include int k1 = 1; int k2; static int k3 = 2; static int k4; int main( ) { 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); free(p1); free(p2); printf("栈区-变量地址n"); printf(" i:%pn", &i); printf(" p:%pn", &p); printf(" str:%pn", str); printf("n堆区-动态申请地址n"); printf(" %pn", p1); printf(" %pn", p2); printf("n.bss段n"); printf("全局外部无初值 k2:%pn", &k2); printf("静态外部无初值 k4:%pn", &k4); printf("静态内部无初值 m2:%pn", &m2); printf("n.data段n"); printf("全局外部有初值 k1:%pn", &k1); printf("静态外部有初值 k3:%pn", &k3); printf("静态内部有初值 m1:%pn", &m1); printf("n常量区n"); printf("文字常量地址 :%pn",var1); printf("文字常量地址 :%pn",var2); printf("n代码区n"); printf("程序区地址 :%pn",&main); return 0; } 栈区:主要用来存放局部变量, 传递参数, 存放函数的返回地址。.esp 始终指向栈顶, 栈中的数据越多, esp的值越小。 注意:在Keil中针对stm32系统进行编程 1、在Keil中针对stm32系统进行编程,调试变量, 通过串口输出信息到上位机。main.c修改为如下代码: #include "stm32f10x.h" #include "bsp_usart.h" char global1[16]; char global2[16]; char global3[16]; int main(void) { char part1[16]; char part2[16]; char part3[16]; USART_Config(); printf("part1: 0x%pn", part1); printf("part2: 0x%pn", part2); printf("part3: 0x%pn", part3); printf("global1: 0x%pn", global1); printf("global2: 0x%pn", global2); printf("global3: 0x%pn", global3); while(1) { } } 生成hex文件后,烧录到stm32中,打开串口调试助手,点击打开串口 就可以看到如下结果。 结论:前3个part变量为局部变量,它们储存到了栈中,地址依次减小。 后三个global为全局变量,它们储存到了静态区,地址依次增加。 再将变量存储到静态区和指针中进行观察,代码修改为如下: #include "stm32f10x.h" #include "bsp_usart.h" #include int main(void) { static char st1[16]; static char st2[16]; static char st3[16]; char *p1; char *p2; char *p3; USART_Config(); printf("st1: 0x%pn", st1); printf("st2: 0x%pn", st2); printf("st3: 0x%pn", st3); p1 = (char *)malloc(sizeof(char) * 16); p2 = (char *)malloc(sizeof(char) * 16); p3 = (char *)malloc(sizeof(char) * 16); printf("p1: 0x%pn", p1); printf("p2: 0x%pn", p2); printf("p3: 0x%pn", p3); while(1) { } } 重复之前的操作可以观察到如下结果: 结论:前三个静态变量储存到了静态区,地址依次增加。 后三个指针储存到了堆中,地址依次增加。 总结 此次实验开始接触硬件,是一次新的体验,开始的时候非常困难不知道从什么地方着手,但是知道方法了以后,实验进程明显快了很多。熟能生巧希望以后学习到更多新的技能和知识。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1780 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1621 浏览 1 评论
1081 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
728 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1679 浏览 2 评论
1938浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
731浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
570浏览 3评论
596浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
556浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-24 02:29 , Processed in 0.677212 second(s), Total 72, Slave 56 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号