寄存器编写LED程序

1、环境

(1)原理图:PB1引脚控制LED灯。

(2)IDE:Keil MDK

(3)MCU:STM32F429IGT6

(3)目标:从零开始编写LED闪烁程序。

2、GPIO控制相关的寄存器

(1)通过查阅芯片参考手册的存储器映射,获取相应模块的基地址。

  • RCC基地址:0x40023800
  • GPIOB基地址:0x40020400

(2)GPIOB时钟使能的寄存器:0x40023800 + 0x30

(3)GPIO配置为输出模式的寄存器:0x40020400 + 0x00

(4)GPIO输出0/1寄存器:0x40020400 + 0x18

3、编写程序

3.1、创建工程

(1)创建空工程,选择新品型号即可。

(2)创建main.c文件和start.s文件。

3.2、main.c文件

(1)通过指针读写各个寄存器,实现LED闪烁。

复制代码
void delay(int i);

int main()
{
    unsigned int *pReg;

    /*使能GPIOB*/
    pReg = (unsigned int *)(0x40023800 + 0x30);
    *pReg |= (0x01 << 1);
    
    /*配置PB1为输出模式*/
    pReg = (unsigned int *)(0x40020400 + 0x00);
    *pReg |= (0x01 << 2);
    
    pReg = (unsigned int *)(0x40020400 + 0x18);
    while(1)
    {
        *pReg |= (0x01 << 1);   /*PB1输出1*/
        delay(1000000);
        
        *pReg |= (0x01 << 17);   /*PB1输出0*/
        delay(1000000);
    }
}

void delay(int i)
{
    while(i--);
}

3.3、start.s文件

复制代码
; 架构配置指令
PRESERVE8          ; 强制8字节堆栈对齐(符合AAPCS标准,确保函数调用时堆栈指针保持8字节对齐)
THUMB              ; 声明使用Thumb-2指令集(16/32位混合模式,代码密度与性能平衡方案)             
          

; Vector Table Mapped to Address 0 at Reset
                AREA    RESET, DATA, READONLY      ; 定义只读数据段,存放中断向量表
				EXPORT  __Vectors                  ; 导出向量表符号供外部链接
					
__Vectors       DCD     0                     ; [0x00] 初始堆栈指针值(复位后CPU自动加载到SP)
                DCD     Reset_Handler         ; [0x04] 复位向量 - 指向复位处理程序

; 代码段定义
AREA    |.text|, CODE, READONLY

; 复位处理程序(系统启动入口点)
Reset_Handler   PROC
				EXPORT  Reset_Handler             [WEAK]  ; 弱导出(允许其他模块覆盖实现)
                IMPORT  main                              ; 声明外部引用main()函数(C代码入口)
                
				LDR SP, =(0x20000000+0x30000)  ; 初始化堆栈指针(必须为复位后首要操作)
				BL main                        ; 调用main()函数

                ENDP   ; 结束过程定义
                
                 END   ; 结束汇编模块

4、ROM大小和RAM大小和起始地址

相关推荐
礼拜天没时间.1 小时前
深入Docker架构——C/S模式解析
linux·docker·容器·架构·centos
不做无法实现的梦~1 小时前
PX4各个模块的作用(3)
linux·stm32·嵌入式硬件·机器人·自动驾驶
清风6666661 小时前
基于单片机的喷漆机器人自动控制系统
单片机·嵌入式硬件·机器人·毕业设计·课程设计·期末大作业
啊森要自信1 小时前
CANN runtime 深度解析:异构计算架构下运行时组件的性能保障与功能增强实现逻辑
深度学习·架构·transformer·cann
WindrunnerMax1 小时前
从零实现富文本编辑器#11-Immutable状态维护与增量渲染
前端·架构·前端框架
不能跑的代码不是好代码1 小时前
STM32独立看门狗(IWDG)知识点及标准库使用指南
stm32·嵌入式硬件
vx-bot5556661 小时前
企业微信接口在金融级业务场景下的合规架构与实践
金融·架构·企业微信
jerwey1 小时前
OpenClaw 架构与组件说明
架构·openclaw
程序员良许1 小时前
嵌入式处理器架构
后端·单片机·嵌入式
sun03221 小时前
【架构基础】Spring中的PropertySourcesPlaceholderConfigurer介绍 (并非新知识,比较古老的一种使用方式)
java·spring·架构