STM32/51单片机编程入门(点亮LED)

一、使用51单片机编程点亮LED并使用Proteus软件仿真

第一步,先下载所需的proteus和keil软件,并完成相关设置。

然后打开keil新建工程,并完成对相关代码的编译工作

再生成相关的hex文件,由于本人生成hex文件的图片丢失并且工程也已被删除的情况下,这里就不放相关截图了。

然后打开protues并完成电路的设计,点击选择的51芯片把生成的hex文件导入,然后点击界面左下角的运行按钮,运行仿真电路,即可获得如视频所示的效果。

test

二、使用STM32点亮led

一、仿真调试

1、本次实验所选用的芯片为STM32F103RB,先新建一个keil的工程,并选择所要求的芯片,在选择之后完成相关设置,再然后生成相关文件main.c,如图:

然后需要右键点击右侧一栏中的Source Group 1,点击Add Existing Files to Group...并选中main.c文件,也就是把main.c文件添加到Source Group 1下。之后对其进行编译,点击左上角的编译按钮,此时显示0错误0警告标识成功。

2、stm32程序仿真测试。

(1)首先点击上面所说的生成hex文件的魔法棒,选择其中的Debug,勾选Use Simulator再选择ULINK2/ME Cortex Debugger,并点击Settings。(2)然后便可以开始调试了,点击带有红色d的放大镜开始调试,调试结果如下图所示。

二、点亮LED

使用proteus软件完成仿真,并把程序导入芯片中,点亮LED。

此处的程序与上面展示的程序有区别,但我做完仿真之后找不到程序了,就没有放相关图片。

三、嵌入式C程序代码对内存(RAM)中的各变量的修改操作,与对外部设备(寄存器--->对应相关管脚)的操作有哪些相同与差别?

相同点:

  1. 都需要通过特定的语法和函数来进行操作,例如使用赋值语句修改变量的值,使用特定的寄存器访问函数来操作外部设备。
  2. 都需要考虑访问权限和数据类型的匹配,确保正确地读写变量或操作外部设备。
  3. 都需要考虑并发访问的问题,例如使用互斥锁或者信号量来保护共享资源的访问。

差异点:

  1. 对内存中的变量的修改操作是在CPU和RAM之间进行的,而对外部设备的操作是通过寄存器和相关管脚进行的。
  2. 对内存中的变量的修改操作通常是直接的,可以随时进行读写操作,而对外部设备的操作通常需要遵循特定的时序和协议,例如设置特定的寄存器位或发送特定的命令序列。
  3. 对内存中的变量的修改操作通常是瞬时的,而对外部设备的操作可能需要持续的控制和监测,例如控制一个LED的亮灭或者读取一个传感器的数值。
  4. 对内存中的变量的修改操作通常是软件控制的,而对外部设备的操作可能需要硬件支持,例如使用特定的外设接口或者中断来进行操作。

四、为什么51单片机的LED点灯编程要比STM32的简单? 

51单片机的LED点灯编程相对于STM32来说更简单的原因有以下几点:

  1. 体系结构简单:51单片机采用的是8位体系结构,而STM32则是32位体系结构。8位体系结构相对较简单,指令集较小,编程难度较低。

  2. 开发环境简单:51单片机的开发环境相对来说更简单,通常使用Keil C51等集成开发环境,编程工具和调试器较为简单易用。而STM32则需要使用较为复杂的开发环境,如Keil MDK或者STM32CubeIDE,需要配置复杂的工程和调试环境。

  3. 资源限制少:51单片机的资源限制相对较少,一般只有几个KB的RAM和几十KB的Flash存储器。相比之下,STM32拥有更多的资源,包括更大的RAM和Flash存储器,以及更多的外设和功能模块。资源限制少的情况下,编程相对简单,不需要考虑过多的内存管理和资源分配问题。

  4. 传统广泛应用:51单片机是一种传统的单片机,广泛应用于各种嵌入式系统和电子设备中。因此,关于51单片机的编程资料和案例较为丰富,学习和使用起来相对容易。而STM32是一种相对较新的单片机,尽管也有很多相关资料和案例,但相对来说还不如51单片机那么丰富和成熟。

需要注意的是,虽然51单片机的LED点灯编程相对简单,但STM32拥有更强大的处理能力和更多的功能模块,适用于更复杂的应用场景。所以在选择单片机时,需要根据具体的需求和项目要求来决定使用哪种单片机。

五、与PC平台上的一般程序不同,嵌入式C程序经常会看见 register和volatile 关键字,请解释这两个变量修饰符的作用,并用C代码示例进行说明。

register关键字用于提示编译器将变量存储在CPU的寄存器中,以便快速访问。它是一个建议,编译器可以选择性地将变量存储在寄存器中。这可以提高程序的执行速度,特别是对于频繁访问的变量。

volatile关键字用于告诉编译器,该变量的值可能会被意外的改变,因此在每次访问该变量时都需要从内存中读取。这是因为嵌入式系统中,变量的值可能会被中断处理程序或其他并发操作修改。

下面是使用register和volatile关键字的C代码示例:

 

#include <stdio.h>

int main()

{ register int x = 10; // 将变量x存储在寄存器中

volatile int y = 20; // 告诉编译器y的值可能会被意外的改变

printf("x = %d\n", x);

printf("y = %d\n", y);

return 0; }

在上面的示例中,变量x被声明为register int类型,这样编译器可以将其存储在寄存器中,以便快速访问。变量y被声明为volatile int类型,这样每次访问y时都会从内存中读取其最新的值,以防止意外的改变。

请注意,register关键字只是一个建议,编译器可以选择忽略它。而volatile关键字则确保每次访问变量时都会从内存中读取最新的值。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值