历史上的今天

今天是:2024年11月09日(星期六)

2021年11月09日 | 使用寄存器点亮第一个LED

发布者:来来去去来来 来源: eefocus关键字:寄存器  点亮  LED 手机看文章 扫描二维码
随时随地手机看文章

一、硬件设计

相同网络标号表示它们是连接在一起的,因此 DS0、DS1 发光二极管阴极是连接在 STM32 的 PB5、PE5 管脚上。


如果要使 DS0 指示灯亮,只需要控制 PB5 管脚输出低电平,如果要使 DS0 指示灯灭,只需控制 PB5 输出高电平。对于其他的 LED 控制方法一样。如果使用的是其他板子,连接 LED 的管脚和极性不一样,那么只需要在程序中修改对应的 GPIO 管脚和输出电平状态即可,原理是一样的。


点亮 DS0 发光二极管,即让 STM32 的 PB5 管脚输出一个低电平。


二、软件设计

2.1、 startup_stm32f10x_hd.s 启动文件

启动文件里边是使用汇编语言写好了基本程序,当 STM32 芯片上电启动的时候,首先会执行这里的汇编程序,从而建立起 C 语言的运行环境。因此称为启动文件。该文件使用的汇编指令是 Cortex-M3 内核支持的指令,可参考《Cortex-M3 权威指南中文》内指令集章节。


startup_stm32f10x_nd.s 文件(普中STM32F10x教程里面的名称)是由 ST 官方提供的,一般有需要也是在官方的基础上修改,不会自己完全重写。该文件可以从 KEIL5 安装目录找到,也可以从 ST 库里面找到,找到该文件后把启动文件添加到工程里面即可。不同型号的芯片以及不同编译环境下使用的汇编文件是不一样的,但功能相同。


启动文件的主要功能

初始化堆栈指针 SP。

初始化程序计数器指针 PC。

设置堆、栈的大小。

设置中断向量表的入口地址。

配置外部 SRAM 作为数据存储器(这个由用户配置,一般的开发板可没有外部 SRAM)。

调用 SystemInit() 函数配置 STM32 的系统时钟。

设置 C 库的分支入口“ __main”(最终用来调用 main 函数) 。

Reset_Handler    PROC

                 EXPORT  Reset_Handler             [WEAK]

     IMPORT  __main

     IMPORT  SystemInit

                 LDR     R0, =SystemInit

                 BLX     R0

                 LDR     R0, =__main

                 BX      R0

                 ENDP

128 行的是程序注释,在汇编里面注释用的是“;”,相当于 C 语言的“ //”注释符。

129行是定义了一个子程序: Reset_Handler。 PROC 是子程序定义伪指令。这里就相当于 C 语言里定义了一个函数,函数名为 Reset_Handler。


130行 EXPORT 表示 Reset_Handler 这个子程序可供其他模块调用。 相当于 C 语言的函数声明。关键字[WEAK] 表示弱定义,如果编译器发现在别处定义了同名的函数,则在链接时用别处的地址进行链接,如果其它地方没有定义,编译器也不报错,以此处地址进行链接,如果不理解 WEAK,那就忽略它好了。


131行和132行 IMPORT 说明 __main 和 SystemInit 这两个标号在其他文件,在链接的时候需要到其他文件去寻找。相当于 C 语言中,从其它文件引入函数声明。以便下面对外部函数进行调用。


SystemInit 需要由我们自己实现,即我们要编写一个具有该名称的函数,用来初始化 STM32 芯片的时钟,一般包括初始化 AHB、 APB 等各总线的时钟,需要经过一系列的配置 STM32 才能达到稳定运行的状态。__main 其实不是我们定义的(不要与 C 语言中的 main 函数混淆),当编译器编译时,只要遇到这个标号就会定义这个函数,该函数的主要功能是:负责初始化栈、堆,配置系统环境,准备好 C 语言并在最后跳转到用户自定义的 main 函数,从此来到 C 的世界。


133行把 SystemInit 的地址加载到寄存器 R0。

134行程序跳转到 R0 中的地址执行程序,即执行 SystemInit 函数的内容。

135 行把__main 的地址加载到寄存器 R0。

136 行程序跳转到 R0 中的地址执行程序,即执行__main 函数,执行完毕之后即可进入 main 函数。

137 行表示子程序的结束。

结论:我们需要在外部定义一个SystemInit 函数设置 STM32 的时钟;STM32 上电后,会执行 SystemInit 函数,最后执行我们 C 语言中的 main 函数。


2.1.1、startup_stm32f10x_md.s启动文件

;******************** (C) COPYRIGHT 2011 STMicroelectronics ********************

;* File Name          : startup_stm32f10x_md.s

;* Author             : MCD Application Team

;* Version            : V3.5.0

;* Date               : 11-March-2011

;* Description        : STM32F10x Medium Density Devices vector table for MDK-ARM 

;*                      toolchain.  

;*                      This module performs:

;*                      - Set the initial SP

;*                      - Set the initial PC == Reset_Handler

;*                      - Set the vector table entries with the exceptions ISR address

;*                      - Configure the clock system

;*                      - Branches to __main in the C library (which eventually

;*                        calls main()).

;*                      After Reset the CortexM3 processor is in Thread mode,

;*                      priority is Privileged, and the Stack is set to Main.

;* <<< Use Configuration Wizard in Context Menu >>>   

;*******************************************************************************

; THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS

; WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME.

; AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT,

; INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE

; CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING

; INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.

;*******************************************************************************

; Amount of memory (in bytes) allocated for Stack

; Tailor this value to your application needs

; Stack Configuration

;    Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>

;

Stack_Size      EQU     0x00000400

                AREA    STACK, NOINIT, READWRITE, ALIGN=3

Stack_Mem       SPACE   Stack_Size

__initial_sp

; Heap Configuration

;     Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>

;

Heap_Size       EQU     0x00000800

                AREA    HEAP, NOINIT, READWRITE, ALIGN=3

__heap_base

Heap_Mem        SPACE   Heap_Size

__heap_limit

                PRESERVE8

                THUMB

; Vector Table Mapped to Address 0 at Reset

                AREA    RESET, DATA, READONLY

                EXPORT  __Vectors

                EXPORT  __Vectors_End

                EXPORT  __Vectors_Size

__Vectors       DCD     __initial_sp               ; Top of Stack

                DCD     Reset_Handler              ; Reset Handler

                DCD     NMI_Handler                ; NMI Handler

                DCD     HardFault_Handler          ; Hard Fault Handler

                DCD     MemManage_Handler          ; MPU Fault Handler

                DCD     BusFault_Handler           ; Bus Fault Handler

                DCD     UsageFault_Handler         ; Usage Fault Handler

                DCD     0                          ; Reserved

                DCD     0                          ; Reserved

                DCD     0                          ; Reserved

                DCD     0                          ; Reserved

                DCD     SVC_Handler                ; SVCall Handler

                DCD     DebugMon_Handler           ; Debug Monitor Handler

                DCD     0                          ; Reserved

                DCD     PendSV_Handler             ; PendSV Handler

                DCD     SysTick_Handler            ; SysTick Handler

                ; External Interrupts

                DCD     WWDG_IRQHandler            ; Window Watchdog

                DCD     PVD_IRQHandler             ; PVD through EXTI Line detect

                DCD     TAMPER_IRQHandler          ; Tamper

                DCD     RTC_IRQHandler             ; RTC

                DCD     FLASH_IRQHandler           ; Flash

                DCD     RCC_IRQHandler             ; RCC

                DCD     EXTI0_IRQHandler           ; EXTI Line 0

                DCD     EXTI1_IRQHandler           ; EXTI Line 1

                DCD     EXTI2_IRQHandler           ; EXTI Line 2

[1] [2] [3]
关键字:寄存器  点亮  LED 引用地址:使用寄存器点亮第一个LED

上一篇:GPIO寄存器描述
下一篇:GPIO简介

推荐阅读

10月28日,美国约翰·霍普金斯大学计算机集成手术系统和技术研究中心主任Russell H. Taylor教授(手术机器人和计算机辅助手术系统领域奠基人,主持研发了世界首台骨科手术机器人ROBDOC,并著有计算机辅助手术方面的开山之作)与他的“得意门生”、北京航空航天大学生物与医学工程学院副教授王豫(参与研发中国首台骨科手术机器人系统、主被动混合式骨科...
  涡轮流量计的结构  涡轮流量计的原理示意图如图3-1所示。在管道中心安放一个涡轮,两端由轴承支撑。当流体通过管道时,冲击涡轮叶片,对涡轮产生驱动力矩,使涡轮克服摩擦力矩和流体阻力矩而产生旋转。在一定的流量范围内,对一定的流体介质粘度,涡轮的旋转角速度与流体流速成正比。由此,流体流速可通过涡轮的旋转角速度得到,从而可以计算得到通...
目前三星、华为等厂商已推出自家的折叠屏手机,其中三星拥有两种形态的折叠屏机型。  三星 Galaxy Z Flip 是三星电子于 2020 年 2 月 11 日与 Galaxy S20 一同发布,并于 2020 年 2 月 14 日发售的一款可折叠式智能手机。由于采用上下对折式折叠设计且深受女性用户喜爱,部分网友戏其称为 “化妆镜”。  之后摩托罗拉在...
11月9日上午消息,在今日的操作系统产业峰会2021上,华为携手社区全体伙伴共同将欧拉开源操作系统(openEuler)正式捐赠给开放原子开源基金会。这标志着欧拉从创始企业主导的开源项目演进到产业共建、社区自治。  今年9月,华为宣布升级欧拉,从服务器操作系统,升级为数字基础设施的操作系统,可广泛部署于服务器、云计算、边缘计算、嵌入式等各种形态...

史海拾趣

问答坊 | AI 解惑

高价求能检测被叫挂机的反极信号发生器

小弟现在搞通讯设备,,需要电话线路发送反极信号,但是电信局不给开,现有市场上的反极信号发生器没有检测被叫是否通话完毕挂机的功能,现在小弟高价求方案,或是成品。…

查看全部问答∨

DSP引导功能的使用(zz)

TI公司的高速数字信号处理器TMS320C6000系列DSP支持并行处理,采用甚长指令字(VLIW)体系结构,内部设置有8个功能单元(两个乘法器和6个ALU),8个功能单元可并行操作,最多可以在一个周期内同时执行八条32位指令。指令操作为“流水线”工作方式。应用 ...…

查看全部问答∨

09国赛的感谢与体会

本帖最后由 paulhyde 于 2014-9-15 09:24 编辑 国赛第一天,心得很多呀!参加比赛要有前瞻性眼光,保持心态------塞翁失马焉知非福。。。想做什么就去做吧,不要给自己留下遗憾!  …

查看全部问答∨

基于嵌入式无线视频采

摘要:本文设计了一个基于Intel PXA270的硬件平台及嵌入式Linux的软件平台进行无线视频采集的系统。实现了在嵌 入式LINUX中进行Ⅵ也下的视频采集以及MPEG-4编码和无线传输的功能,可以用于视频监控、口电话、视频会议等领域。…

查看全部问答∨

主流GPS相关芯片点评

从元器件角度看,GPS设备包含的关键元器件有七个,分别是天线、低噪音放大器(LNA)、RF接收转换(RF Section)、数字基带(Digital Baseband)、微处理器(Microprocessor)、微处理器周边外设(Processor Peripherals)、输入输出和驱动(I/O and Driver)。 ...…

查看全部问答∨

protel99se 覆铜

大家好:     小弟画了一块板子,现在PCB布线已经搞好,就差覆铜了,不规则覆铜,就是在顶层需要覆铜的地方才覆,不需覆铜的地方不覆,这样板子上覆铜的边缘就不是直线了,请问怎样实现不规则的覆铜,怎样设置,如何操作才能达到效果! ...…

查看全部问答∨

单片机发送AT命令的问题

char send_AT[]="at\\r"; 我把这个字符串用单片机发送出去(我调试过单片机能发送到电脑),这样说明发出数据没问题; 但是我把单片机和TC35i连接,让单片机发送给他就是没反应; 能不能说下是什么原因…

查看全部问答∨

代理商进来,103ZC

103ZC量产了?有货么?价格短信发来?含税不到50元?看到的,ZE比较多,但,不需要那么大的片内存储器。…

查看全部问答∨

关于AD转换的问题请教大家

请问各位高手,我在用MSP430F133单片机实现AD转换的时候,测量输入电压后,程序显示的转换的结果与采用公式计算的结果不符,并且在不同的输入电压下,AD转换的结果并非线性关系,请教各位高手原因在那,以下是我写的程序:(系统采用内部2.5伏参考电 ...…

查看全部问答∨

单片机控制可控硅

那位能说一说单片机控制可控硅的原理呀,…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved