优秀的编程知识分享平台

网站首页 > 技术文章 正文

使用keil汇编语言编写STM32F103ZET6驱动PE5口led闪烁程序

nanyue 2024-12-20 17:44:45 技术文章 5 ℃

; Vector Table Mapped to Address 0 at Reset

AREA RESET, DATA, READONLY

DCD 20003000 ; Top of Stack

DCD Reset_Handler ; Reset Handler


AREA |.text|, CODE, READONLY


; Reset handler

Reset_Handler

;EXPORT Reset_Handler [WEAK]

LDR R1, =0x40021018 ; RCC_APB2ENR寄存器地址

LDR R0, [R1]

LDR R2, =0x00000040 ; 对应使能GPIOE时钟的位值(BIT6)

ORR R0, R2

STR R0, [R1]

; 配置PE5为推挽输出模式

LDR R1, =0x40011800 ; GPIOE_CRL寄存器地址,与GPIOE基地址相同,用于配置PE0 - PE7引脚

LDR R0, [R1]

; 清除PE5对应的配置位(20 - 23位)

BIC R0, #(0x0F << 20)

; 设置PE5为推挽输出模式(速度50MHz)对应的配置位(20 - 23位)

ORR R0, #(0x1 << 20)

STR R0, [R1]

MAIN_LOOP

; 设置PE5引脚输出高电平

LDR R1, =0x4001180C ; GPIOE_ODR寄存器地址,用于设置GPIOE端口引脚的输出电平

MOV R2, #(1 << 5) ; 将代表PE5引脚的位设置为1,即高电平

STR R2, [R1]

BL DELAY ; 调用延时函数,保持高电平一段时间

; 设置PE5引脚输出低电平

LDR R1, =0x4001180C ; GPIOE_ODR寄存器地址

MOV R2, #0

STR R2, [R1]

BL.W DELAY ; 调用延时函数,保持低电平一段时间

B MAIN_LOOP ; 跳回主循环,继续循环执行,实现闪烁效果


DELAY

MOV R5, #1000 ; 外层循环次数,可调整该值改变延时长短

MOV R6, #1000 ; 内层循环次数

DELAY_LOOP_OUTER

MOV R6, #1000 ; 每次进入外层循环时,重置内层循环次数

DELAY_LOOP_INNER

SUBS R6, #1 ; 内层循环每次减1

BNE DELAY_LOOP_INNER ; 如果R6不为0,继续内层循环

SUBS R5, #1 ; 外层循环每次减1

BNE DELAY_LOOP_OUTER ; 如果R5不为0,继续外层循环,进入下一轮内层循环

BX LR

NOP

END

Tags:

最近发表
标签列表