基于ARM,用汇编语言在Keil_V5和Proteus仿真下实现点灯操作
1、打开keil创建新工程
由于Proteus不支持STM32F103ZET6的芯片,所以我们这里选择C6的芯片。
ARM的CMSIS已经把开发所需要的软件组件都封装好了,因此直接选择即可,把启动文件加进去
在Source组中添加New Item
创建Asm File文件
写入代码,如图所示
这里操作的是GPIOA的第0口,如果有其他端口要求可以自行更改(需要把端口物理地址做映射)
BIT2 EQU 0X00000004
LED0 EQU 0X00000001
GPIOA EQU 0X40010800 ;GPIOA端口的地址
GPIOA_CRL EQU 0X40010800 ;A口CRL设置低寄存器的地址
GPIOA_CRH EQU 0X40010804 ;A口CRH配置高寄存器的地址
GPIOA_ODR EQU 0X4001080C ;输出,偏移0Ch,A口ODR寄存器的地址
GPIOA_BSRR EQU 0X40010810 ;清除/设置偏移地址10h,A口BSRR寄存器的地址
GPIOA_BRR EQU 0X40010814 ;清除,偏移地址14h,A口BRR寄存器的地址
IOPAEN EQU BIT2 ;APB2ENR外设使能时钟寄存器IOPAEN的地址
RCC_APB2ENR EQU 0X40021018 ;APB2ENR外设使能时钟寄存器地址
AREA MYCODE, CODE
ENTRY
EXPORT __main
__main
LDR R1, =RCC_APB2ENR
LDR R0, [R1] ;读
LDR R2, =IOPAEN
ORR R0, R2 ;改
STR R0, [R1] ;使能GPIOA时钟
MOV R0, #0x0003 ;PA.0口输出的状态和速度
LDR R1, =GPIOA_CRL ;PA.0在低寄存器
STR R0, [R1] ;LED0--PA.0推挽输出,50MHZ
NOP
NOP
LDR R1, =GPIOA_ODR ;PA.0在高寄存器
LDR R2,=0x0000001 ;将PA.0输出高电平
LOOP
STR R2,[R1] ;输出状态
MOV R0, #4500 ;4500/9=500ms
BL.W DELAY_NMS ;延时
EOR R2, #LED0 ;翻转LED0的输出状态
B LOOP
DELAY_NMS
PUSH {R1}
DELAY_NMSLOOP
SUB R0, #1
MOV R1,#100
DELAY_ONEUS
SUB R1, #1
NOP
NOP
NOP
CMP R1, #0
BNE DELAY_ONEUS
CMP R0, #0
BNE DELAY_NMSLOOP
POP {R1}
BX LR
NOP
END
在编译之前选择下图选中的图标或者点击Project中的options for Target"Target1"
在Output一栏中勾选Create HEX File(默认不勾选),没有勾选的话,在Proteus中没有对应的.hex文件。然后在Debug中勾选仿真Use Simulator,注意左下角的参数设置。
接下来就可以编译,调试了。
打开Proteus仿真软件,创建新工程
添加STM32F103C6的芯片,同样的在Library中添加电阻和led灯
加上电源power,配置电网,连接元件
双击芯片,更改频率为8MHZ,将在keil中生成的.hex文件打开,点击ok,然后开始仿真。仿真结果为闪烁截图,led灯以0.5s为周期闪烁。