当前位置:网站首页>ARM开发环境入门
ARM开发环境入门
2022-07-17 05:20:00 【大马哈鱼拌柠檬】
ARM开发环境入门之STM32简单程序编译以及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单片机的流程应该是分析实际问题,构件逻辑表达,转换成单片机语言,最后进行软件编程和调试,最后进行仿真测试。
边栏推荐
猜你喜欢
随机推荐
C language specifies how many days to display from the date
Part of the second Shanxi Network Security Skills Competition (Enterprise Group) WP (II)
MySQL MySQL calculates the number of weekends this year (Saturday and Sunday)
Experiment class II and object definition initialization
Google browser cannot modify cookies manually, and cookies are marked red
Hand in hand building a home NAS universal server (1) | configuration selection and preparation
Query of database (II)
Daily eye contact detection uses unsupervised gaze target detection
Vscode Tips 1
Learning non posture gaze deviation with head movement
TCP/IP协议学习
F5LTM(一)逻辑关系图
redis
DSL implements bucket aggregation
Operation of documents in index library
STM32的PWM和DAC练习中生成音频和波形
用Altium Designer绘制PCB图
CUDA与大数组的双调排序
[antdv: Each record in table should have a unique `key` prop,or set `rowKey` to an unique.....
DSL realizes automatic completion query







