ARM开发环境入门

    科技2025-10-28  7

    ARM开发环境入门之STM32简单程序编译以及51程序设计仿真

    ARM开发环境简单介绍什么是ARMARM公司ARM框架 STM32简单程序编译什么是STM32完成一个STM32的简单程序的编译创建工程创建文件以及程序编写 STM32简单程序编译实验小结 51程序设计与仿真代码如下:仿真图如下51单片机程序设计与仿真实验小结

    ARM开发环境简单介绍

    什么是ARM

    ARM这个缩写其实有两个意思: 1.指ARM公司; 2.指ARM公司设计的低功耗CPU及其架构,包括ARM1~ARM11与Cortex,其中被广泛应用的有ARM7、ARM9、ARM11以及Cortex系列

    ARM公司

    ARM是全球领先的32位嵌入式RISC芯片内核设计公司。RISC的英文全称Reduced Instruction Set Computer,对应的中文意思是精简指令集计算机。它的特点是所有指令的格式都是一致的,所有的指令的指令周期也是相同的,并且采用流水线技术。ARM公司本身并不生产销售芯片,他以出售ARM内核的知识权为主要模式。

    ARM框架

    ARM的体系框架已经经历了8个版本(V1~V8)。每个版本有各自特色,定位也不同,彼此之间不能简单地相互代替。

    STM32简单程序编译

    什么是STM32

    STM32是意法半导体,较早推向市场的基于Cortex-M内核的微处理器系列产品,该系列产品具有成本低、功耗优、性能高、功能多等优势。目前我学习的系列是STM32F103系列。

    完成一个STM32的简单程序的编译

    创建工程

    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简单程序编译实验小结

    学习STM32和其他单片机的最好方法其实就是边学边做,我们所用的编译环境是KEIL5,之前也认识过KEIL4,keil4是所有库文件等等都在一个安装文件里。keil5安装的就是一个单纯的开发软件,不包含具体的器件相关文件,开发什么就安装对应的文件包。 我们可以从一个最简单的项目开始,比如控制发光的二极管,从而熟悉STM32应用系统开发的全过程,找到STM32开发的感觉。

    51程序设计与仿真

    下面是基于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分钟后电铃断开。结合万年历,可自动排除节假日和星期六星期日打铃操作,亦可手工按键设置打铃时间,修正节假日作息时间。

    代码如下:

    #include<reg51.h> sbit rs=P2^0; sbit rw=P2^1; sbit e=P2^2; sbit BZ=P2^7; unsigned char NIAN=20,YUE=4,ri=24,ZHOU=5,MIAO=55,FEN=59,SHI=7,Time; void DELAY(unsigned int i); void Lcd_W_C(unsigned char c); void Lcd_W_D(unsigned char dat); void main() { DELAY(500); Lcd_W_C(0x38); Lcd_W_C(0x06); Lcd_W_C(0x0c); Lcd_W_C(0x01); TMOD = 0x01; TH0=0X3c; TL0=0Xb0; EA = 1; ET0 = 1;TR0 = 1; while(1) { if(MIAO>=60) //秒满60清零 { MIAO=0; FEN++; if(FEN>=60) //分满60清零 { FEN=0; SHI++; if(SHI>=24) { SHI=0; ri++; ZHOU++; if(ZHOU>7) { ZHOU=0; } if(((YUE==1)||(YUE==3)||(YUE==5)||(YUE==7)||(YUE==8)||(YUE==10)||(YUE==12)) &&(RI==32) ) { RI=1; YUE++; if(YUE==13) { NIAN++; YUE=0; } } if(((YUE==4)||(YUE==6)||(YUE==9)||(YUE==11)) &&(RI==31) ) { RI=1; YUE++; } if((((NIAN%4)==0)&&(YUE==2)) &&(RI==30) ) { RI=1; YUE++; } if((((NIAN%4)!=0)&&(YUE==2)) &&(RI==29) ) { RI=1; YUE++; } } } } if((((SHI==8)&&(FEN==0))|| ((SHI==8)&&(FEN==45))|| ((SHI==8)&&(FEN==55))|| ((SHI==9)&&(FEN==40))|| ((SHI==10)&&(FEN==10))|| ((SHI==10)&&(FEN==55))|| ((SHI==11)&&(FEN==5))|| ((SHI==11)&&(FEN==50))|| ((SHI==14)&&(FEN==0))|| ((SHI==14)&&(FEN==40))|| ((SHI==14)&&(FEN==55))|| ((SHI==15)&&(FEN==40))|| ((SHI==16)&&(FEN==10))|| ((SHI==16)&&(FEN==55))|| ((SHI==17)&&(FEN==5))|| ((SHI==17)&&(FEN==50))) &&(ZHOU<=5)) { BZ=0; } else { BZ=1; } Lcd_W_C(0x80+3); Lcd_W_D('2'); Lcd_W_D('0'); Lcd_W_D('0'+NIAN/10); Lcd_W_D('0'+NIAN%10); Lcd_W_D(' '); Lcd_W_D('0'+YUE/10); Lcd_W_D('0'+YUE%10); Lcd_W_D(' '); Lcd_W_D('0'+ri/10); Lcd_W_D('0'+ri%10); Lcd_W_C(0xC0+4); Lcd_W_D('0'+SHI/10); Lcd_W_D('0'+SHI%10); Lcd_W_D(':'); Lcd_W_D('0'+FEN/10); Lcd_W_D('0'+FEN%10); Lcd_W_D(':'); Lcd_W_D('0'+MIAO/10); Lcd_W_D('0'+MIAO%10); } } void time0() interrupt 1 { TH0=0X3c; TL0=0Xb0; Time++; if(Time>=20) //1s { Time=0; MIAO++; } } void DELAY(unsigned int i) { while(i--); } void Lcd_W_C(unsigned char c) { DELAY(500); rs=0; rw=0; e=0; P0=c; e=1; DELAY(10); e=0; } void Lcd_W_D(unsigned char dat) { DELAY(500); rs=1; rw=0; e=0; P0=dat; e=1; DELAY(10); e=0; rs=0; }

    仿真图如下

    51单片机程序设计与仿真实验小结

    51单片机其实也可以用以解决问题,这次我解决的是学校打铃问题,通过此次实验我了解到了分析具体问题的流程是至关重要的,做51单片机的流程应该是分析实际问题,构件逻辑表达,转换成单片机语言,最后进行软件编程和调试,最后进行仿真测试。

    Processed: 0.019, SQL: 8