熟悉Proteus及stm32流水灯设计
提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
例如:第一章 Python 机器学习入门之pandas的使用
提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
一、Proteus电路仿真及C51程序设计
1.仿真电路图
2.相关代码
#include<reg51.h>
sbit led=P1^0;
int main()
{
led=0;
while(1);
}
3.将生成的hex文件下载进去
二、完成stm32简单流水灯设计
1.搭建环境
1.创建相关文件
2.插入文件
3.设置
2.相关代码
#include "stm32f10x.h" // Device header
#include "Delay.h"
int main(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0 | GPIO_Pin_1 |GPIO_Pin_2;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
while(1)
{
GPIO_Write(GPIOA,~0x0001); //0000 0000 0000 0001
Delay_ms(500);
GPIO_Write(GPIOA,~0x0002); //0000 0000 0000 0010
Delay_ms(500);
GPIO_Write(GPIOA,~0x0004); //0000 0000 0000 0100
Delay_ms(500);
}
}
3.实物图连接
4.运行演示
总结
通过本次设计实验,了解到了stm32实物版的连线,各端口的功能,在程序设计中,了解到了keil5的编码原理,以及创建新工程的方法。
三、问答题
1.嵌入式C程序代码对内存(RAM)中的各变量的修改操作,与对外部设备(寄存器—>对应相关管脚)的操作有哪些相同与差别?
嵌入式C程序对内存(RAM)中的变量的修改操作类似于对外部设备(寄存器—>对应相关管脚)的操作,都需要通过读取和写入操作进行。对于内存中的变量,可以使用赋值操作符(=)来修改其值,而对于外部设备,需要通过特定的寄存器或相关管脚来进行读取和写入操作。但是,它们之间也存在一些差别。
相同之处:
都需要通过特定的操作来修改变量的值或对外部设备进行相应的操作。
都需要遵循相应的编程规范和语法,以确保正确的操作和数据传输。
差异之处:
内存中的变量可以通过直接访问其内存地址进行修改,而外部设备的操作需要通过特定的寄存器或相关管脚进行。
内存中的变量可以在程序执行过程中被修改,而外部设备的操作需要在特定的时机和条件下进行。
内存中的变量可以被多个线程或进程同时访问和修改,而外部设备的操作可能需要进行同步或互斥控制,以防止冲突和竞态条件。
2.为什么51单片机的LED点灯编程要比STM32的简单?
51单片机的LED点灯编程相比于STM32来说更简单,主要有以下几个原因:
STM32的外设资源更多,启动文件更复杂,初学者可能会在这些繁琐的设置上感到困惑。
STM32的寄存器编程相对于51单片机来说更为复杂,需要对寄存器的位操作有更深入的理解。
51单片机的开发环境和工具链较为成熟,有更多的资料和教程可供参考,初学者更容易上手。
四、与PC平台上的一般程序不同,嵌入式C程序经常会看见 register和volatile 关键字,请解释这两个变量修饰符的作用,并用C代码示例进行说明。
register关键字用于告诉编译器将变量存储在寄存器中,以便于快速访问。寄存器是位于CPU内部的一种高速存储器,可以更快地读写数据。使用register关键字可以提高程序的执行效率。然而,由于嵌入式系统的资源有限,通常只有少量的寄存器可用,所以register关键字不一定能够被完全实现。
volatile关键字用于告诉编译器该变量可能在任何时刻都会被改变,因此编译器不会对该变量进行优化。在嵌入式系统中,由于硬件的特殊性,某些变量可能会被外部设备或者其他中断程序修改,因此需要使用volatile关键字来确保程序正确地读取和写入这些变量的值。
相关代码
register int counter; // 使用register关键字声明一个计数器变量
void delay(volatile int num) {
while(num > 0) {
num--;
}
}
int main() {
volatile int flag = 0; // 使用volatile关键字声明一个标志变量
counter = 10; // 将计数器初始化为10
while(counter > 0) {
if(flag == 1) {
delay(counter);
counter--;
flag = 0;
}
}
return 0;
}