ARM这个缩写其实有两个意思: 1.指ARM公司; 2.指ARM公司设计的低功耗CPU及其架构,包括ARM1~ARM11与Cortex,其中被广泛应用的有ARM7、ARM9、ARM11以及Cortex系列
ARM是全球领先的32位嵌入式RISC芯片内核设计公司。RISC的英文全称Reduced Instruction Set Computer,对应的中文意思是精简指令集计算机。它的特点是所有指令的格式都是一致的,所有的指令的指令周期也是相同的,并且采用流水线技术。ARM公司本身并不生产销售芯片,他以出售ARM内核的知识权为主要模式。
ARM的体系框架已经经历了8个版本(V1~V8)。每个版本有各自特色,定位也不同,彼此之间不能简单地相互代替。
STM32是意法半导体,较早推向市场的基于Cortex-M内核的微处理器系列产品,该系列产品具有成本低、功耗优、性能高、功能多等优势。目前我学习的系列是STM32F103系列。
1.打开KEIL5 2.选择project→uVision 3.完成上步骤出现下面窗口,输入文件名称 4.选择自己所需的芯片(本人选的STM32F103系列),点击ok 5.弹出下面窗口根据需要选择 至此,一个工程创建完毕
1.选择File→New 2.出现如下窗口 3.写一个程序,将下面程序复制到text1中
#define PERIPH_BASE ((unsigned int)0x40000000) #define APB2PERIPH_BASE (PERIPH_BASE + 0x10000) #define GPIOA_BASE (APB2PERIPH_BASE + 0x0800) #define GPIOB_BASE (APB2PERIPH_BASE + 0x0C00) #define GPIOC_BASE (APB2PERIPH_BASE + 0x1000) #define GPIOD_BASE (APB2PERIPH_BASE + 0x1400) #define GPIOE_BASE (APB2PERIPH_BASE + 0x1800) #define GPIOF_BASE (APB2PERIPH_BASE + 0x1C00) #define GPIOG_BASE (APB2PERIPH_BASE + 0x2000) #define GPIOA_ODR_Addr (GPIOA_BASE+12) //0x4001080C #define GPIOB_ODR_Addr (GPIOB_BASE+12) //0x40010C0C #define GPIOC_ODR_Addr (GPIOC_BASE+12) //0x4001100C #define GPIOD_ODR_Addr (GPIOD_BASE+12) //0x4001140C #define GPIOE_ODR_Addr (GPIOE_BASE+12) //0x4001180C #define GPIOF_ODR_Addr (GPIOF_BASE+12) //0x40011A0C #define GPIOG_ODR_Addr (GPIOG_BASE+12) //0x40011E0C #define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2)) #define MEM_ADDR(addr) *((volatile unsigned long *)(addr)) #define LED0 MEM_ADDR(BITBAND(GPIOA_ODR_Addr,8)) //#define LED0 *((volatile unsigned long *)(0x422101a0)) //PA8 typedef struct { volatile unsigned int CR; volatile unsigned int CFGR; volatile unsigned int CIR; volatile unsigned int APB2RSTR; volatile unsigned int APB1RSTR; volatile unsigned int AHBENR; volatile unsigned int APB2ENR; volatile unsigned int APB1ENR; volatile unsigned int BDCR; volatile unsigned int CSR; } RCC_TypeDef; #define RCC ((RCC_TypeDef *)0x40021000) typedef struct { volatile unsigned int CRL; volatile unsigned int CRH; volatile unsigned int IDR; volatile unsigned int ODR; volatile unsigned int BSRR; volatile unsigned int BRR; volatile unsigned int LCKR; } GPIO_TypeDef; #define GPIOA ((GPIO_TypeDef *)GPIOA_BASE) void LEDInit( void ) { RCC->APB2ENR|=1<<2; //GPIOA ???? GPIOA->CRH&=0XFFFFFFF0; GPIOA->CRH|=0X00000003; } //???? void Delay_ms( volatile unsigned int t) { unsigned int i,n; for (n=0;n<t;n++) for (i=0;i<800;i++); } int main( void ) { LEDInit(); while (1) { LED0=0; Delay_ms(500); LED0=1; Delay_ms(500); } }代码来源:链接: link 4.以.c格式保存
5.把.c文件加入工程,右键Source Group1,添加main.c
6.根据需要选择 7.根据我们的选择,现在就可以编译,执行并生成hex文件了
学习STM32和其他单片机的最好方法其实就是边学边做,我们所用的编译环境是KEIL5,之前也认识过KEIL4,keil4是所有库文件等等都在一个安装文件里。keil5安装的就是一个单纯的开发软件,不包含具体的器件相关文件,开发什么就安装对应的文件包。 我们可以从一个最简单的项目开始,比如控制发光的二极管,从而熟悉STM32应用系统开发的全过程,找到STM32开发的感觉。
下面是基于51单片机设计的以学校白天上课、下课及午休时间为依据,的自动打铃器。假定学校作息时间如下所示: 第1节课 8:00——8:45 第2节课 8:55——9:40 第3节课 10:10——10:55 第4节课 11:05——11:50 第5节课 14:00——14:40 第6节课 14:55——15:40 第7节课 16:10——16:55 第8节课 17:05——17:50 根据此作息时间表,每到上课或下课时控制电铃接通,接通1分钟后电铃断开。结合万年历,可自动排除节假日和星期六星期日打铃操作,亦可手工按键设置打铃时间,修正节假日作息时间。
51单片机其实也可以用以解决问题,这次我解决的是学校打铃问题,通过此次实验我了解到了分析具体问题的流程是至关重要的,做51单片机的流程应该是分析实际问题,构件逻辑表达,转换成单片机语言,最后进行软件编程和调试,最后进行仿真测试。
