0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

STM32F030单片机的翻转引脚介绍

冬至配饺子 来源:TopSemic嵌入式 作者:TopSemic 2022-08-11 11:15 次阅读

1. 第一个工程 翻转引脚

上一篇文章我们详细介绍了 STM32F030 从复位时取得复位向量,系统初始化,然后跳转到 main( ) 函数的过程。下面我们结合一个最简单的例子,对 Cube 库的使用做一个简单的介绍。我们用 Keil 打开下面这个工程:STM32Cube_FW_F0_V1.11.0ProjectsSTM32F030R8-NucleoExamplesGPIOGPIO_IOToggleMDK-ARMProject.uvprojx

编译下载运行此代码,会看到一个 LED灯(连至MCU的 PA5引脚)不停地闪烁。为了完成这个简单的功能,我们看到这个工程里包含了不少文件:

pYYBAGL0cyCAB-0qAAEaDl99aj4274.png

如果是初次用这种库的方式做开发,乍一看还真感觉有点乱。不过让我们一个一个看一下这些文件,理清它们的关系后就会体会到这种方式的巨大优点。

2. 文件分类解释

工程里的文件分为五大类:启动代码,M0内核初始化,驱动,板级支持包(BSP),用户代码。一般来说我们开发应用程序,主要关注用户代码文件就行了。如果硬件电路板做了改动,则修改BSP里的内容。在早期的单片机开发中,芯片内资源很少,通常的情况是一个工程师就从硬件到软件编程都做了,是没有 BSP(Board Support Package)这种概念的。BSP概念来源于较复杂的CPU系统的开发,一般是厂家设计主板,并提供 BSP(包含启动代码,驱动,Bootloader等)。我们这里的 BSP 概念稍有不同,它是指对某一块儿以 MCU 为核心的电路板的支持代码包。启动代码,内核初始化和驱动,没有包含在内。BSP会调用驱动层的代码。对于 STM32 Nucleo 这块儿开发板来说,板上资源很少,所以BSP只提供了相应的按键(BUTTON)和指示灯(LED)支持代码。里面的ADC,SPI,LCD等代码是支持其它板子的,可以先忽略。

启动代码

为理解汇编代码,我们先熟悉一下这些伪指令:

ALIGN 变量或代码对齐。如:

ALIGN = 3 以8(2的3次方)字节对齐。

EQU 给标号赋值。如:

Stack_SizeEQU 0x400;

DCD 分配1个或多个字(words)的内存空间。如:

Data DCD 1,5,8; 定义3个字并赋值为 1,5 和 8。

AREA 定义一个代码或数据段(section),命名并指定属性。如:

AREA Func01, CODE, READONLY;

定义了一个名字为 Func01 的只读代码段。

SPACE 保留一段空间并初始化为 0。如:

Data SPACE 100; 为 Data 保留 100个字节初始化为 0 的内存空间。

IMPORT 导入其它文件中的标号,以在当前文件中引用。如:

IMPORT SystemInit

LDR R0, =SystemInit

BLX R0

从文件 system_stm32f0xx.c 中导入 SystemInit 这个函数并调用。

EXPORT 导出能被连接器(Linker)识别的标号。从ASM文件导出的标号可以在C中引用。

[WEAK] 如果在其它地方定义了相同的标号,则此处定义被覆盖。

PROC 定义一个函数的起始地址。

ENDP 标志当前函数结束。

例子:

SysTick_Handler PROC

EXPORT SysTick_Handler [WEAK]

B.

ENDP

导出 SysTick_Handler 这个中断处理函数。如果在其它地方定义了一个新的 SysTick_Handler 函数,那么新函数将覆盖此处定义的这个陷阱函数。汇编语句 B.为在当前语句死循环。下面我们看一下启动文件 startup_stm32f030x8.s

定义堆和栈:

poYBAGL0czaAeB7EAACy7Dd09s0266.png

中断向量表:

poYBAGL0c1aAE3g5AAGKgtNQHHU605.png

现在这个工程用到的只有绿线框中的几个向量:

__initial_sp

初始堆栈指针

Reset_Handler

复位向量,我们在上一篇文章已经讲到如何从复位向量一步一步执行到用户代码中的主程序main( )。

SysTick_Handler

系统时钟中断向量。此程序每 1ms 产生一次中断。

需要注意的是 SysTick_Handler 这个中断处理函数在用户代码文件stm32f0xx_it.c

中进行了重定义,所以当 SysTick 中断发生时,实际会跳转到用户代码的中断处理函数,而不是跳到下图所示的汇编代码中断处理函数进入死循环。

poYBAGL0c3iADFSSAAFbIKjnoBA640.png

再往下可以看到,对所有芯片级中断定义了一个共享的陷阱函数。用户在实际使用到某一个中断的时候,要在中断处理文件 stm32f0xx_it.c 中用相同的函数名定义,从而在中断发生时跳转到实际的中断处理函数。

poYBAGL0c46AXt0JAABuJLtK4v4181.png

在此文件的最下面的代码,是用来传递堆栈信息给库的:

poYBAGL0c6aAXjx_AAD7rxb-h78753.png

在芯片资源比较少时,可以通过选中 Options for Target->Target->Use MicroLIB 选项,使用简化版的库来实现 printf 等操作。若资源充足时使用标准库,库将调用下面的 __user_initial_stackheap 函数来获得堆栈信息。

M0 内核初始化

system_stm32f0xx.c此文件只有两个函数:SystemInit( ),在启动代码中调用,把系统时钟复位到初始默认状态(8MHz的高频内部时钟 HSI)。SystemCoreClockUpdate( ), 在用户调用库函数更改时钟配置后,需要调用此函数以更新全局系统时钟变量 SystemCoreClock。其它模块基于此时钟的计算才会正确。一般来说更改时钟配置的 HAL函数已经包含此函数的调用,如 HAL_RCC_ClockConfig( ), 无需用户再次调用。

驱动

stm32f0xx_hal_cortex.c包含 Cortex 内核中两个重要模块的驱动:可嵌套中断向量控制器 NVIC(Nested Vectored Interrupt Controller),系统滴答时钟 SYSTICK。

stm32f0xx_hal.c

此文件包含用户程序必须首先调用的 HAL_Init( ),它会使能数据和指令缓存,预取指令队列;配置系统滴答时钟产生 1ms 中断;调用 HAL_MspInit( )回调函数。

HAL_MspInit( )函数用来做系统级的初始化,配置某一模块相关的 时钟,引脚,DMA,中断等资源,但是在所有的例程中都没有实际用到此函数。可以先忽略。

stm32f0xx_hal_rcc.cstm32f0xx_hal_rcc_ex.c

RCC(Reset and Clock Controller)模块的驱动。一个模块为什么要两个驱动文件呢?前一个文件提供了基本的通用的功能驱动,后一个文件是扩展功能驱动,通常针对某一特定型号的芯片。如同我们吃饭需要餐具,_rcc.c 提供碗筷等常用必备工具,_rcc_ex 可能提供的就是酒杯,烛台等这些东西。

stm32f0xx_hal_gpio.c

GPIO 模块的驱动。

BSP 板级支持包

stm32f0xx_nucleo.c

针对 STM32 Nucleo 开发板的类型,宏定义,支持代码。

用户代码

main.c 主程序

stm32f0xx_it.c 中断处理

前面介绍了一大堆文件,主要是为了清除系统的工作流程。在开发中使用库还是很简单的。在主程序中调用库,只需要通过 main.h 包含下面这个头文件:stm32f0xx_hal.h如果有 BSP 则包含 BSP 的头文件,在本工程是:stm32f0xx_nucleo.h

使用到哪个模块就在配置文件中打开使能该模块的宏定义。

stm32f0xx_hal_conf.h

然后第一步必须调用 HAL_Init( )。

第二步,如果希望系统时钟工作在默认内部时钟(8MHz HIS)以外的频率,则需要调用 SystemClock_Config( )。此函数又调用 HAL_RCC_ClockConfig( ) 完成新配置。

下面是应用代码:

pYYBAGL0c76APetUAAGGBsrpi0Y741.png

所有模块一般都是这三个步骤:使能模块的时钟,初始化模块,使用模块的功能。

stm32f0xx_it.c 中的中断处理函数 SysTick_Handler( ) 很简单,每次进入就对滴答计时变量 uwTick 加1,其它 HAL 函数可以基于此变量计时。



审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    6030

    文章

    44501

    浏览量

    632288
  • led灯
    +关注

    关注

    22

    文章

    1592

    浏览量

    107776
  • 中断处理
    +关注

    关注

    0

    文章

    94

    浏览量

    10949
  • STM32F0
    +关注

    关注

    0

    文章

    61

    浏览量

    17078
收藏 人收藏

    评论

    相关推荐

    STM32F030数据手册

    本参考手册向应用程序开发人员提供关于如何使用STM32F030 微控制器的内存和外设所涉 及的信息。
    发表于 11-10 17:42 334次下载

    stm32f030原理图

    stm32f030原理图
    发表于 10-09 17:16 286次下载

    STM32F030之IAP代码编写

    程序收尾总想着以后更新的方便性,采用在应用编程(In Application Programming),通过Bootload引导单片机自己往程序存储器里写数据或修改程序。下面简介STM32F030
    发表于 04-24 14:12 1.2w次阅读
    <b class='flag-5'>STM32F030</b>之IAP代码编写

    STM32F030F4单片机的出厂程序详细资料免费下载

    本文档的主要内容详细介绍的是STM32F030F4单片机的出厂程序详细资料免费下载。
    发表于 10-10 08:00 163次下载
    <b class='flag-5'>STM32F030F</b>4<b class='flag-5'>单片机</b>的出厂程序详细资料免费下载

    使用STM32F030单片机读取温湿度传感器SHT20的C语言源代码免费下载

    本文档的主要内容详细介绍的是使用STM32F030单片机读取温湿度传感器SHT20的C语言源代码免费下载。
    发表于 06-10 17:07 116次下载
    使用<b class='flag-5'>STM32F030</b><b class='flag-5'>单片机</b>读取温湿度传感器SHT20的C语言源代码免费下载

    STM32F030新建工程模板资料免费下载

    本文档的主要内容详细介绍的是STM32F030新建工程模板资料免费下载 ,方便新建STM32F030所用,省略配置步骤。
    发表于 08-05 08:00 83次下载
    <b class='flag-5'>STM32F030</b>新建工程模板资料免费下载

    STM32F030单片机和TFT薄膜晶体管的电路原理图免费下载

    本文档的主要内容详细介绍的是STM32F030单片机和TFT薄膜晶体管的电路原理图免费下载。
    发表于 11-11 11:15 27次下载
    <b class='flag-5'>STM32F030</b><b class='flag-5'>单片机</b>和TFT薄膜晶体管的电路原理图免费下载

    STM32F030F4P6单片机的电路原理图免费下载

    本文档的主要内容详细介绍的是STM32F030F4P6单片机的电路原理图免费下载。
    发表于 10-26 08:00 102次下载
    <b class='flag-5'>STM32F030F</b>4P6<b class='flag-5'>单片机</b>的电路原理图免费下载

    stm32f030stm32f103功能差异

    stm32f030stm32f103功能差异主要表现在哪?
    的头像 发表于 07-22 09:35 2.2w次阅读

    STM32F030芯片的IAP升级

    昨天IAP升级差点翻水水,具体过程容我细细道来。。。单片机在线升级应该是IAP+APP。怎么做STM32F030的IAP程序我就简单介绍一下吧(其他大佬应该有详细的,我只说点我自己遇到的问题)。先
    发表于 11-29 16:36 16次下载
    <b class='flag-5'>STM32F030</b>芯片的IAP升级

    STM32F030低温下RTC不工作

    STM32F030低温下RTC不工作
    发表于 12-09 09:21 19次下载
    <b class='flag-5'>STM32F030</b>低温下RTC不工作

    stm32f030系列时钟介绍

    时钟是微处理器的驱动力,类似人的心脏,只有不停地跳动系统才能正常运行。Stm32不同系列的时钟基本结构类似,就是外设有些差别。这里以stm32f030系列为例来介绍
    的头像 发表于 03-23 10:10 3556次阅读
    <b class='flag-5'>stm32f030</b>系列时钟<b class='flag-5'>介绍</b>

    STM32F030在低温下无法启动

    STM32F030在低温下无法启动
    的头像 发表于 09-27 16:19 1584次阅读
    <b class='flag-5'>STM32F030</b>在低温下无法启动

    STM32F030在低温下无法启动

    电子发烧友网站提供《STM32F030在低温下无法启动.pdf》资料免费下载
    发表于 09-20 10:23 3次下载
    <b class='flag-5'>STM32F030</b>在低温下无法启动

    STM32F030单片机编程中文参考资料

    电子发烧友网站提供《STM32F030单片机编程中文参考资料.pdf》资料免费下载
    发表于 04-01 09:43 51次下载