寄存器编写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 天前
PlantUML--结合大模型快速出土
架构
清风6666661 天前
基于单片机的智慧校园自动打铃系统设计
数据库·单片机·嵌入式硬件·毕业设计·课程设计·期末大作业
czhaii1 天前
51的DSP来了, 100MHz, STC32G144K246
stm32·单片机·fpga开发
2301_800399721 天前
stm32 printf重定向到USART
java·stm32·算法
小龙报1 天前
《嵌入式成长系列之51单片机 --- Keil5创建工程》
c语言·开发语言·c++·单片机·嵌入式硬件·51单片机·学习方法
点灯小铭1 天前
基于单片机的自行车速度与里程检测报警系统设计
单片机·嵌入式硬件·毕业设计·课程设计·期末大作业
眠りたいです1 天前
基于脚手架微服务的视频点播系统-脚手架开发部分(完结)elasticsearch与libcurl的简单使用与二次封装及bug修复
c++·elasticsearch·微服务·云原生·架构·bug
2501_915106321 天前
iOS性能调优的系统化实践,从架构分层到多工具协同的全流程优化指南(开发者深度版)
android·ios·小程序·架构·uni-app·iphone·webview
DogDaoDao1 天前
大语言模型四大核心技术架构深度解析
人工智能·语言模型·架构·大模型·transformer·循环神经网络·对抗网络
今夜有雨.1 天前
51单片机--DHT11温湿度传感器实验代码
单片机·嵌入式硬件·51单片机