【无标题】

STM32/51单片机入门编程

​​​​​​​​​​​​​​​​​​​​一.完成一个C51程序与仿真
安装protues完添加元器件作图
在这里插入图片描述

二.在keli中新建项目程序编写
在这里插入图片描述
生成hex文件
​​在这里插入图片描述
三.进行仿真
在这里插入图片描述
成功点亮
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
二.完成一个stm32的简单的通过寄存器方式,用某一个GPIO端口点亮LED

安装keil并配置相关环境及初始化引脚
在这里插入图片描述
在这里插入图片描述

测试灯亮
在这里插入图片描述
三.嵌入式C程序代码对内存(RAM)中的各变量的修改操作,与对外部设备(寄存器—>对应相关管脚)的操作有哪些相同与差别?为什么51单片机的LED点灯编程要比STM32的简单?

嵌入式C程序中对内存中变量的修改操作与对外部设备的操作有以下相同和差别:

相同之处:

  1. 存储方式:变量和外部设备都需要在内存中分配空间来存储数据。无论是修改变量值还是向外部设备发送数据,都需要进行内存操作。
  2. 数据传输:无论是变量的修改还是对外部设备的操作,都需要通过数据传输来完成。内存操作和外部设备操作都需要将数据从内存中读取或写入到指定位置。

差异之处:

  1. 访问速度:对内存中变量的修改操作通常是在CPU内部进行,速度相对较快。而对外部设备的操作通常需要通过外设接口进行,速度相对较慢。
  2. 操作对象:对内存中变量的修改操作是在软件层面进行,与具体的硬件设备无关。而对外部设备的操作需要考虑设备的寄存器结构和相关管脚的控制。
  3. 接口方式:对内存中变量的修改操作可以直接通过编程语言提供的语法和函数进行,不需要额外的硬件支持。而对外部设备的操作通常需要使用特定的硬件接口和协议来与设备进行通信,如GPIO、SPI、I2C等。
    总的来说,对内存中变量的修改操作和对外部设备的操作虽然有相同的地方,但在实现方式、速度和操作对象等方面存在一定的差异。

51单片机和STM32是两种不同的嵌入式系统,它们在架构、性能和功能上存在一些差异,导致51单片机的LED点灯编程相对简单的原因如下:

  1. 简单的架构:51单片机基于经典的8051架构,具有较为简单的指令集和寄存器结构。它的架构相对较为简单,易于理解和使用。而STM32系列微控制器采用了较为复杂的ARM Cortex-M架构,其指令集和寄存器结构更加丰富,需要更多的配置和设置。

  2. 低级接口直接性:51单片机通常具有直接控制IO口电平的引脚,可以直接将引脚配置为输出模式,并通过设置相应的寄存器将引脚电平设置为高或低电平来点亮或熄灭LED。这种低级接口的直接性使得编写简单的LED点灯程序变得容易。

  3. 丰富的库函数支持:51单片机的开发环境通常会提供一些针对IO口控制和LED操作的库函数,这些库函数封装了底层的操作细节,通过调用库函数可以很方便地实现LED点灯功能。STM32也提供了强大的库函数支持,但相比之下,由于其更复杂的架构和功能,库函数的使用可能需要更多的配置和参数设置,对初学者来说略显复杂。

  4. 开发环境和工具链:51单片机的开发通常使用较为简单和易用的集成开发环境(IDE)和工具链。常见的51单片机开发环境如Keil C51等提供了丰富的代码模板和示例程序,使得编写LED点灯程序更加简单。而STM32的开发环境相对复杂,使用的IDE和工具链可能较为庞大、功能复杂,对初学者来说上手难度较大。

四.嵌入式C程序经常会看见 register和volatile 关键字,请解释这两个变量修饰符的作用,并用C代码示例进行说明。

register和volatile是两个用于变量修饰的关键字,它们在嵌入式C程序中具有不同的作用。

  1. register关键字:
    · register关键字用于告诉编译器将变量存储在寄存器中,而不是内存中。这样可以提高访问速度,因为寄存器存取速度比内存更快。
    · 使用register关键字只是对编译器提供一个建议,指示将变量存储在寄存器中。编译器可以自行决定是否将变量放入寄存器,也可以忽略register关键字。
    · register关键字只能用于非静态、非外部的自动变量,因为静态变量和外部变量已经有了固定的存储位置,无法存储在寄存器中。

下面是一个使用register关键字的示例:

void function() {
    register int count = 0;  // 声明一个寄存器变量

    while (count < 10) {
        count++;
    }
}
  1. volatile关键字:
    · volatile关键字用于告诉编译器该变量的值可能会在意料之外的时间被修改,从而防止对变量的优化操作。
    · 当一个变量被声明为volatile时,编译器不能对该变量进行优化,保证每次读取和写入都是直接从内存中进行的,而不是使用寄存器缓存的值。
    · 常用于多线程、中断处理或外设通信等场景中,确保对变量的读写操作的一致性和可见性。

下面是一个使用volatile关键字的示例:

volatile int flag = 0;  // 声明一个volatile变量

void interrupt_handler() {
    flag = 1;  // 在中断中修改volatile变量的值
}

int main() {
    while (flag == 0) {
        // 等待中断修改flag的值
    }
    
    // 执行其他操作
    return 0;
}

在上述示例中,中断处理函数会修改volatile变量flag的值。由于flag被声明为volatile,主循环中对flag的判断和访问操作不会被编译器优化,保证了对flag值的实时感知。

需要注意的是,嵌入式C程序中对register和volatile关键字的使用需要谨慎,要根据具体情况判断是否使用它们,并了解编译器对这些关键字的支持程度。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值