1.Proteus使用并仿真51程序——LED流水灯
1.1绘制原理图

1.2编写51程序

1.3仿真结果

2.一个stm32简单程序编译(LED闪烁)
2.1绘制原理图

2.2编写源程序
int main(void)
{
//打开GPIOB的时钟
*(unsigned int *)0x40021018 |= (1 << 3);
//配置IO口为输出
*(unsigned int *)0x40010C00 |= (1 << (4*0));
// 控制 ODR 寄存器
*(unsigned int *)0x40010C0C &= ~(1 << 0); //(unsigned int *)将0x40010C0C强制转换为地址,前面再加指针进行指针的赋值操作
}
void SystemInit(void)
{
//函数外定义SystemInt(), 骗过编译器不报错
}
2.3仿真

3.思考
3.1嵌入式C程序代码对内存(RAM)中的各变量的修改操作,与对外部设备(寄存器--->对应相关管脚)的操作有哪些相同与差别?
相同:都需要通过特定的寄存器或变量使用特定的指令或库函数来进行数据传输和操作。
差别:对变量进行的操作速度相对较快,只需要更改代码,而对外部设备的操作需要考虑到的环节较多,需要一定时间,它涉及到硬件问题。
3.2为什么51单片机的LED点灯编程要比STM32的简单?
因为51单片机结构相对简单,所以通常多使用汇编语言和C语言编程。而STM32系列的开发工作,不会采用汇编语言,因为工程量巨大,寄存器太多了,位数也多,它需要深入理解每个寄存器每个bit位的含义,需要先打开对应的时钟,包括开启后打开外部时钟(晶振)才开始工作。
3.3与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;
}
用volatile修饰变量或地址,相当于告诉编译器这个值会随时发生变化,每次使用都要去内存中重新读取它的值。
实例:
long square(volatile int *ptr)
{
int a;
a = *ptr;
return a * a;
}
文章探讨了使用Proteus在51和STM32上实现LED编程的过程,比较了两者在内存操作、程序复杂性和使用register/volatile关键字的区别。
1815

被折叠的 条评论
为什么被折叠?



