赞
踩
- 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仿真
相同:都需要通过特定的寄存器或变量使用特定的指令或库函数来进行数据传输和操作。
差别:对变量进行的操作速度相对较快,只需要更改代码,而对外部设备的操作需要考虑到的环节较多,需要一定时间,它涉及到硬件问题。
因为51单片机结构相对简单,所以通常多使用汇编语言和C语言编程。而STM32系列的开发工作,不会采用汇编语言,因为工程量巨大,寄存器太多了,位数也多,它需要深入理解每个寄存器每个bit位的含义,需要先打开对应的时钟,包括开启后打开外部时钟(晶振)才开始工作。
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;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。