历史上的今天
返回首页

历史上的今天

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

正在发生

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

2021-11-09 来源:eefocus

一、硬件设计

相同网络标号表示它们是连接在一起的,因此 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

上一篇:GPIO寄存器描述

下一篇:GPIO简介

推荐阅读

史海拾趣

Aptiv公司的发展小趣事

作为一家具有社会责任感的企业,Aptiv始终关注社会公益事业。公司积极参与各项社会活动和慈善捐赠,为改善社会环境和提升公众生活质量做出了积极贡献。同时,Aptiv还注重在运营所在城市推动社区发展,通过创造就业岗位、支持教育事业等方式,为当地社会经济的繁荣做出了贡献。

Electric Imp Inc.公司的发展小趣事

为了进一步提升品牌影响力和市场份额,Electric Imp Inc.公司开始实施国际化战略。公司先后在北美、欧洲、亚洲等地设立了研发中心和分支机构,以便更好地了解当地市场需求和技术趋势。同时,公司还积极参加国际展览、研讨会等活动,与全球同行交流经验、分享技术。这些努力使得公司的国际化水平不断提高。

Chip Quik公司的发展小趣事

为了进一步拓展业务,Chip Quik公司积极寻求与电子制造商、维修中心和分销商等合作伙伴建立合作关系。通过与这些合作伙伴的紧密合作,公司能够更好地了解市场需求,优化产品供应链,提高市场覆盖率。

Adamant Co Ltd公司的发展小趣事

随着企业规模的扩大,Adamant Co Ltd逐渐意识到社会责任的重要性。公司积极参与公益事业,为社会做出贡献。同时,公司还注重可持续发展,通过采用环保材料和生产工艺、降低能耗等方式,实现绿色生产。这些举措不仅提升了公司的社会形象,也为公司的长期发展注入了新的活力。

这些故事虽然基于虚构的Adamant Co Ltd公司,但其中所描述的挑战、机遇和策略在电子行业中是普遍存在的。通过这些故事,我们可以对电子行业企业的发展过程有一个大致的了解。

Holtek(合泰)公司的发展小趣事

随着企业规模的扩大,Adamant Co Ltd逐渐意识到社会责任的重要性。公司积极参与公益事业,为社会做出贡献。同时,公司还注重可持续发展,通过采用环保材料和生产工艺、降低能耗等方式,实现绿色生产。这些举措不仅提升了公司的社会形象,也为公司的长期发展注入了新的活力。

这些故事虽然基于虚构的Adamant Co Ltd公司,但其中所描述的挑战、机遇和策略在电子行业中是普遍存在的。通过这些故事,我们可以对电子行业企业的发展过程有一个大致的了解。

台湾丰宾(CapXon)公司的发展小趣事

面对日益激烈的市场竞争,CapXon公司始终坚持以技术创新为驱动,不断推动产业升级。公司投入大量资金用于研发新的技术和产品,以满足市场对高品质、高性能电容器的需求。通过不断的努力,CapXon成功研发出了一系列具有自主知识产权的高性能电容器产品,这些产品不仅具有更高的稳定性和可靠性,而且能够满足更广泛的应用场景需求。

问答坊 | AI 解惑

PIC单片机的C语言编程

PIC单片机的C语言编程…

查看全部问答>

有块 JCT028WA2 屏 谁能用单片机驱动啊?

从P4上拆下来的 彩屏 JCT028WA2 不知道怎么用单片机驱动 要不扔着也是浪费啊…

查看全部问答>

【T叔藏书阁】微型计算机电源原理与维修

目录 第一章 概述 第二章 微机及其外设电源电路 第三章 电源维修方面 第四章 不间断电源 第五章 微机直流稳压电源 第六章 显示器电源 第七章 打印机电源 [ 本帖最后由 wzt 于 2010-3-10 18:10 编辑 ]…

查看全部问答>

基于FT245BM的简易USB接口开发

1  概述   当前,USB外设的开发是一个热点。由于USB总线具有传输速度快、占用资源少及真正的即插即用等优点,越来越受到业界的青睐。可是,USB的开发要求设计人员对USB的标准、Firmware(固件)编程及驱动程序的编写等有较深入的理解,因 ...…

查看全部问答>

关于STM32,串口1和PWM间的问题

现在我用TIM4产生PWM,然后TIM2定时中断往TIM4扔音频数据,现在播放正常,但是发现在配置打开TIM4,TIM2后,USART1好像就失效了,就是串口1不能首发数据了,请问是TIM4,TIM2和串口一有冲突么?…

查看全部问答>

功能强大的串口工具:GhostyComm 4.0(万能通讯精灵)

                功能强大的串口工具:GhostyComm 4.0(万能通讯精灵) 本软件是本人在2002初从事单片机开发工作时为了方便调试而编写的,当时是win 98版本。2003年才开发win xp版本。直 ...…

查看全部问答>

嵌入式设计的一个简单问题?

请教一个简单的问题 数据选择器,寄存器,译码器 哪个是同步电路,哪个是异步电路?…

查看全部问答>

关于CEDDK的READ_PORT_UCHAR(<端口号地址>),其中的端口号地址是在哪里定义的呢?

小弟最近在写一个GPIO驱动,在GPI_Read()流接口函数中想用READ_PORT_UCHAR()从指定的GPIO的端口接受数据。我用的是PXA270,其中的GPIO的端口号地址是在哪里定义的呢?我看了PXA270的datasheet好像没有发现。…

查看全部问答>

问个wince5.0SD卡外部检测中断问题

昨天弄来一个标准5.0的BSP,发现和4.2差别太大了,于是看了一整天OAL的流程以及SD相关的东西, 现在有一些疑惑请大家帮个忙解答一下。 在启动的时候OEMInit函数会调用如下中断初始化函数 //---这个函数并没有初始化EINT16为双边触发啊?怎么回事 ...…

查看全部问答>

手机饰品的闪光原理

本帖最后由 jameswangsynnex 于 2015-3-3 19:54 编辑 一、CDMA手机饰品的闪光原理   为什么中国移动GSM手机饰品挂在中国联通CDMA手机上不闪光?这要从CDMA和GSM手机的工作原理谈起,GSM手机是采取将语音打包压缩后发射出去的,也就是说间隙脉冲工 ...…

查看全部问答>