1. 安装并熟悉Proteus 电路仿真软件,完成一个C51程序设计和仿真
[参考](https://blog.csdn.net/ssj925319/article/details/108929227
https://blog.csdn.net/qq_43279579/article/details/108908566
https://blog.csdn.net/xwmrqqq/article/details/108838225
http://m.elecfans.com/article/581557.html)
首先将Proteus和keil安装好,然后在keil中按照参考资料中的详细步骤编写51程序,得到与proteus连结的hex文件。在keil中首先需要新建工程,选中我们将要在实验中运用到的AT89C51,然后编写main.c文件,最后编译生成.hex文件。
在keil c51中创建一个新工程
再创建一个新文件,将代码粘贴上去
//头文件
#include <reg51.h>
#include <intrins.h>
//延时函数
void delay_ms(int a)
{
int i,j;
for(i=0;i<a;i++)
{
for(j=0;j<1000;j++) _nop_();
}
}
void main(void)
{
while(1)
{
P0=0xfe;
delay_ms(50);
P0=0xfd;
delay_ms(50);
P0=0xfb;
delay_ms(50);
P0=0xf7;
delay_ms(50);
P0=0xef;
delay_ms(50);
P0=0xdf;
delay_ms(50);
P0=0xbf;
delay_ms(50);
P0=0x7f;
delay_ms(50);
}
}
生成hex文件
然后在Proteus中的原理图界面,找到AT89C51,LED,RES等元器件,然后用导线连接形成原理图。
最后双击AT89C51,选中之前生成的.hex文件,进行调试仿真,得到仿真结果。
然后进行仿真
2.安装mdk5软件和stm32包,熟悉mdk开发环境,完成一个stm32的简单的通过寄存器方式,用某一个GPIO端口点亮LED等程序。安装过程、示例程序可以参考网上代码(注意:没有stm32开发板硬件之前,可只做程序的编译和仿真测试)
[参考](https://blog.csdn.net/ssj925319/article/details/108919862
https://blog.csdn.net/xwmrqqq/article/details/108838225)
首先按照参考文件安装好keil软件和stm32pack,再对keil进行一系列简单设置,如设置编码形式,设置文字大小颜色和字体。设置好编程背景后即可进行一个stm32的简单程序编译。
首先新建工程再选择STM32F103RB器件,然后新建main.c文件,并将main.c文件加入Source Group。配置端口输出数据寄存器
然后配置端口低寄存器
原理图绘制如下
最后编译程序并进行调试。如下图所示。
通过这个实验,我学会了如何独立安装MDK软件,以及如何建立工程,编写代码,并最终对其进行仿真调试。
3. (理论概念-常见嵌入式岗位面试题) 通过以上实践,结合阅读ARM、STM32技术手册,深入思考STM32F103系列芯片的地址映射和寄存器映射原理,GPIO端口的初始化设置的一般步骤。回答:1)嵌入式C程序代码对内存(RAM)中的各变量的修改操作,与对外部设备(寄存器—>对应相关管脚)的操作有哪些相同与差别?
2)为什么51单片机的LED点灯编程要比STM32的简单?
[参考](https://blog.csdn.net/qq_46467126/article/details/120737655
https://blog.csdn.net/geek_monkey/article/details/86291377
https://blog.csdn.net/geek_monkey/article/details/86293880)
1)寄存器就是存放指令、数据或地址的地方。在嵌入式c程序代码中,对内存或外部设备都要用到而对外部设备的操作需要用到对GPIO引脚的控制
2)因为开发模式不同:51单片机直接操作寄存器来使用外围设备,而stm32直接调用库函数来使用外围设备,因此比51开发更有效。而且程序架构也不同:相比较stm32,对于资源紧张的51单片机,在产品开发时一般以功能实现为中心,不考虑程序架构的扩展性和可移植性,这是因为ROM和RAM不允许。在LED灯的编程中,在51单片机只需要操作寄存器来完成一系列的模拟调试即可,编程语言也相对简单。而在STM32上要知晓每一个接口的名字作用,再来进行一系列操作和调试,更为抽象。
4. (理论概念-常见嵌入式岗位面试题) 与PC平台上的一般程序不同,嵌入式C程序经常会看见 register和volatile 关键字,请解释这两个变量修饰符的作用,并用C代码示例进行说明。
如果定义一个变量用register关键字,那么意味着编译器尽可能会把变量存放在CPU内部寄存器中,这样就不必通过内存寻址来访问变量,提高访问效率。如
#include <stdio.h>
int main()
{
register int i;
int tmp=0;
for(i=1;i<=100;i++)
tmp+=i;
printf(“总和为 %d\n”,tmp);
return 0;
}
将i变量存放在了cpu的内部寄存器中,提高了运行效率。
volatile的作用在于在修饰变量或地址的时候告诉编译器这个值会随时发生变化,每次使用都要去内存中重新读取它的值。在嵌入式开发中对寄存器或I/O端口的操作都要用volatile。在多任务环境下各任务间共享的标志应该加volatile,存储器映射的硬件寄存器通常也要加volatile说明,因为每次对它的读写都可能由不同意义。如
long square(volatile int *ptr)
{
int a;
a = *ptr;
return a * a;
}
用a指向指针ptr,这样就算*ptr改变成了其他值,返回的也是所需要的一个数的平方。
总结:
通过本次作业,我深入了解了Keil和Proteus的一些基本应用,也对比了C51和STM32的难易程度,对本门课程有了更深的掌握