STM32F7xx —— 启动文件和HAL库

                          STM32F7xx —— 启动文件和HAL库

 

目录

STM32F7xx —— 启动文件和HAL库

一.库开发的优势

二.stm32F7xx几个重要文件

1. HAL库关键文件

2.stm32f7xx_it.c/h

3.stm32f7xx.h

 

4.stm32f767xx.h

5.system_stm32f7xx.c/h

6.stm32f7xx_hal_msp.c

7.startup_stm32f767xx.s

三.HAL库中__weak修饰符

四.程序的执行过程

五.启动文件

六.时钟设置(设置系统时钟)


 

 

一.库开发的优势

    开发速度快,便于移植。

 

二.stm32F7xx几个重要文件

1. HAL库关键文件

文件

描述

stm32f7xx_hal_ppp.c/h

基本外设的操作API

stm32f7xx_hal_ppp_ex.c/h

拓展外设特性的API

stm32f7xx_hal.c/h

HAL通用API(如HAL_Init, HAL_Delay等)

stm32f7xx_hal_conf.h

HAL的配置文件,选择使能某种功能

stm32f7xx_hal_def.h

HAL的通用数据类型和定义

stm32f7xx_ll_ppp.c/h

复杂外设的底层实现

 

2.stm32f7xx_it.c/h

         中断服务函数。基本都是空函数,我们可以去掉里面的函数,把中断服务函数写在任意可见的文件中。

 

3.stm32f7xx.h

         所有F7系列的顶层头文件。通过条件编译包含某型号的头文件(此宏一般在target——c/c++里面定义STM32F767xx,后面都以stm32f767为例)。

#if defined(STM32F756xx)#include "stm32f756xx.h"#elif defined(STM32F746xx)#include "stm32f746xx.h"#elif defined(STM32F745xx)#include "stm32f745xx.h"#elif defined(STM32F765xx)#include "stm32f765xx.h"#elif defined(STM32F767xx)#include "stm32f767xx.h"#elif defined(STM32F769xx)#include "stm32f769xx.h"#elif defined(STM32F777xx)#include "stm32f777xx.h"#elif defined(STM32F779xx)#include "stm32f779xx.h" #else#error "Please select first the target STM32F7xx device used in your application (in stm32f7xx.h file)"#endif

 

4.stm32f767xx.h

         主要就是寄存器的声明(一堆结构体和宏定义)。

 

5.system_stm32f7xx.c/h

         主要定义了SystemInit和SystemCoreClockUpdate两个函数,后续会在这个文件里面加一个SetSysClock()函数. SystemInit主要是时钟系统的初始化和中断向量偏移地址设置(有bootloader的向量偏移需要修改)。SystemCoreClock是一个全局的值(这个在FreeRTOS的时钟配置的时候需要)。

 

6.stm32f7xx_hal_msp.c

         带MspInit的函数进行MCU级别硬件初始化设置,通常被上一层调用(如HAL_UART_Init——HAL_UART_MspInit)。

 

7.startup_stm32f767xx.s

启动文件,上电先运行SystemInit,再运行到main。

; Reset handler

Reset_Handler    PROC

                 EXPORT  Reset_Handler             [WEAK]

        IMPORT  SystemInit

        IMPORT  __main

 

                 LDR     R0, =SystemInit

                 BLX     R0

                 LDR     R0, =__main

                 BX      R0

                 ENDP

 

三.HAL库中__weak修饰符

         weak:弱。被__weak修饰的函数就是“弱函数”,我们可以在自定义的文件中重新定义此函数(去掉__weak),编译器会执行我们自定义的函数。HAL库中一般在回调函数时用到。HAL中默认定义一个空的回调函数,保证编译器不会报错。

 

四.程序的执行过程

         Reset_Handler —— SystemInit —— main —— HAL_init —— SetSysClock —— xxxInit…(FreeRTOS:xTaskCreate —— xTaskCreate)

 

五.启动文件

主要指令:

指令名称 

作用

EQU

给数字常量取一个符号名,相当于 C语言中的 define

AREA

汇编一个新的代码段或者数据段

SPACE

分配内存空间

PRESERVE8

当前文件堆栈需按照 8字节对齐

EXPORT

声明一个标号具有全局属性,可被外部的文件使用

DCD

以字为单位分配内存,要求 4字节对齐,并要求初始化这些内存

PROC

定义子程序,与 ENDP 成对使用,表示子程序结束

WEAK

弱定义,如果外部文件声明了一个标号,则优先使用外部文件定义的标号,如果外部文件没有定义也不出错。要注意的是:这个不是 ARM的指令,是编译器的,这里放在一起只是为了方便

IMPORT

声明标号来自外部文件,跟 C语言中的 EXTERN 关键字类似

B

跳转

ALIGN

编译器对指令或者数据的存放地址进行对齐,一般需要跟一个立即数,缺省表示 4 字节对齐。要注意的是:这个不是 ARM 的指令,是编译器的,这里放在一起只是为了方便。

END

到达文件的末尾,文件结束

Stack——栈,Stack_Size EQU 0x00000400 (局部变量,函数形参,函数调用等),值可以人为修改(不能超过内部SRAM)。

Heap——堆,Heap_Size EQU 0x00000200(动态内存分配malloc/free)

向量表——中断向量服务函数

复位程序——先进入SystemInit——main

关于启动文件详细描述请参考:STM32启动文件详细说明

 

六.时钟设置(设置系统时钟)

/************************* PLL Parameters *************************************/
//时钟设置函数
//Fvco=Fs*(plln/pllm);
//Fsys=Fvco/pllp=Fs*(plln/(pllm*pllp));
//Fusb=Fvco/pllq=Fs*(plln/(pllm*pllq));//Fvco:VCO频率
//Fsys:系统时钟频率
//Fusb:USB,SDIO,RNG等的时钟频率
//Fs:PLL输入时钟频率,可以是HSI,HSE等.
//plln:主PLL倍频系数(PLL倍频),取值范围:64~432.
//pllm:主PLL和音频PLL分频系数(PLL之前的分频),取值范围:2~63.
//pllp:系统时钟的主PLL分频系数(PLL之后的分频),取值范围:2,4,6,8.(仅限这4个值!)
//pllq:USB/SDIO/随机数产生器等的主PLL分频系数(PLL之后的分频),取值范围:2~15.//外部晶振为25M的时候,推荐值:plln=432,pllm=25,pllp=2,pllq=9.
//得到:Fvco=25*(432/25)=432Mhz
//     Fsys=432/2=216Mhz
//     Fusb=432/9=48Mhz
#define PLL_M            25
#define PLL_Q            9
#define PLL_N            432
#define PLL_P            2void SetSysClock(void)
{HAL_StatusTypeDef ret = HAL_OK;RCC_OscInitTypeDef RCC_OscInitStructure;RCC_ClkInitTypeDef RCC_ClkInitStructure;// __HAL_RCC_PWR_CLK_ENABLE(); //使能PWR时钟RCC_OscInitStructure.OscillatorType = RCC_OSCILLATORTYPE_HSE;  //时钟源为HSERCC_OscInitStructure.HSEState = RCC_HSE_ON;                    //打开HSERCC_OscInitStructure.PLL.PLLState = RCC_PLL_ON;        //打开PLLRCC_OscInitStructure.PLL.PLLSource = RCC_PLLSOURCE_HSE;        //PLL时钟源选择HSERCC_OscInitStructure.PLL.PLLM = PLL_M; //主PLL和音频PLL分频系数(PLL之前的分频)RCC_OscInitStructure.PLL.PLLN = PLL_N; //主PLL倍频系数(PLL倍频)RCC_OscInitStructure.PLL.PLLP = PLL_P; //系统时钟的主PLL分频系数(PLL之后的分频)RCC_OscInitStructure.PLL.PLLQ = PLL_Q; //USB/SDIO/随机数产生器等的主PLL分频系数(PLL之后的分频)ret = HAL_RCC_OscConfig(&RCC_OscInitStructure); //初始化if(ret != HAL_OK) while(1);ret = HAL_PWREx_EnableOverDrive(); //开启Over-Driver功能if(ret != HAL_OK) while(1);//选中PLL作为系统时钟源并且配置HCLK,PCLK1和PCLK2RCC_ClkInitStructure.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);RCC_ClkInitStructure.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; //设置系统时钟时钟源为PLLRCC_ClkInitStructure.AHBCLKDivider = RCC_SYSCLK_DIV1; //AHB分频系数为1RCC_ClkInitStructure.APB1CLKDivider = RCC_HCLK_DIV4; //APB1分频系数为4RCC_ClkInitStructure.APB2CLKDivider = RCC_HCLK_DIV2; //APB2分频系数为2ret = HAL_RCC_ClockConfig(&RCC_ClkInitStructure, FLASH_LATENCY_7); //同时设置FLASH延时周期为7WS,也就是8个CPU周期。if(ret != HAL_OK) while(1);
}

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/465652.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机科学数学理论浅谈 (转载)

【来源:TSTC文档中心】 计算机自从其诞生之日起,它的主要任务就是进行各种各样的科学计算。文档处理,数据处理,图像处理,硬件设计, 软件设计等等,…

js实现倒计时函数

function updateEndTime() { //当前时间,距1970年1月1日的秒数   var date new Date();   var time (date.getTime())/1000; //到期时间,可由后台传 var end_time {$end_time}; //计算时间差并换算   var lag end_time - time;   var second Math.floor(lag % 60…

工作后和在学校最大的区别是什么?

昨晚有同学在群里问我问题,上图是问题和我的回复,今天想稍微展开来说说这个问题。新人(也就是刚进入工作岗位者)刚工作实际上有个很大的门槛。如何适应公司生活和规章制度?如何融入工作团队,处理好和同事领…

STM32F7xx —— 输出

STM32F7xx —— 输出 目录 STM32F7xx —— 输出 一、几个重要的IO口操作函数 二、几个重要的结构 三、封装两个GPIO初始化函数(普通GPIO,复用GPIO) 四、输出接口设计 一、几个重要的IO口操作函数 HAL_GPIO_Init(GPIO_TypeDef *GPIOx, …

VS2008水晶报表发布部署总结

如果你安装了VS2008,那么可以找到如下目录: C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bootstrapper\Packages\CrystalReports10_5 此目录下有如下文件: COPY到服务器上根据服务器CPU情况选择性地安装一下。 二、 将WEB项目打包成安装程…

VS2015配置环境支持opencv3库(网络方法总结)

今天安装了opencv3.4.1的版本,之前一直是在ubuntu上做的,本次在windows10上使用VS2015来开发。 VS2015是之前安装的,能正常的编译程序。 1. 安装opencv,下载opencv的exe文件,其他它就是一个压缩包,双击exe文…

话里话外: 信息化与高层参与度的关系

上周我去了一家装备制造业企业,客户找我们是想做梳理流程。为什么要在这个时间点去梳理流程,带着这个疑问,我去客户企业进行调研。调研得知集团已经决定,要在今年上一个管理系统,这个管理系统刚好他们的兄弟单位已经用…

STM32F7xx —— 输入

STM32F7xx —— 输入 目录 STM32F7xx —— 输入 一、输入配置 二、输入扫描 三、输入处理 一、输入配置 为了灵活使用,我们将输入的有效电平设置成可配置。同样是列表表示所有IO口。 // 配置有效电平 typedef enum {KEY_INIT_IS_ACTIVE 0,KEY_LOW_IS_ACTIVE …

Kernel中如何操作CPU及外设寄存器

01ARM Coretex-A9寄存器对于ARM Coretex-A9处理器而言其寄存器主要包括两大部分,分别是通用寄存器以及系统控制寄存器。上图所示的通用寄存器,主要是在代码运行过程中使用到,CPU通过该部分寄存器执行代码并完成相关的运算操作。对于调试过程中…

初识设计模式(装饰者模式)

前言:总结这两天学到的装饰者模式,并用java小小的实现一下。书中有写到:给爱用继承的人一个全新的设计眼界。(ps,本文最后有个小问题待解决) 什么是装饰者模式(Decorator Pattern)&a…

帮一个读者解锁手机

昨天晚上,深圳下了好大好大的雨,我还在加班的时候,小云就发消息说家里打雷很大,到了十点多,我打开手机准备打车,发现打车排队有800多人,然后我赶紧冲下楼,拿起两个雨衣,消…

STM32F7xx —— 96位唯一ID

STM32F7xx —— 96位唯一ID // 配置单片机型号 对外只有这个宏CONFIG_SYSTEM_HARDWARE_TYPE #define CONFIG_SYSTEM_HARDWARE_TYPE SOC_TYPE_STM32F7// SOC类型 typedef enum {SOC_TYPE_STM32F0,SOC_TYPE_STM32F1,SOC_TYPE_STM32F2,SOC_TYPE_STM32F3,SOC_TYPE_STM32F4,SOC_TY…

我喜欢这样的老大[10-24]

据说原图是奥巴马和一个小朋友打雪仗,下面的图片是众多恶搞作品中的一个。也是我最喜欢的一个,因为总统先生可爱,猫更可爱。。。。我喜欢这样的老大,一把年纪了还保有童真非常难得;作为一位总统,愿意把童真…

知识点:Mysql 数据库索引优化实战(4)

知识点:Mysql 索引原理完全手册(1) 知识点:Mysql 索引原理完全手册(2) 知识点:Mysql 索引优化实战(3) 知识点:Mysql 数据库索引优化实战(4) 一:插入订单 业务逻辑:插入订单数据,为了避免重复导单…

看漫画学电子,非常精彩!有些概念以前模糊现在真的懂了

来源:gadgetronicx.com,排版:晓宇微信公众号:芯片之家(ID:chiphome-dy)1、按键消抖,在机械按键断开与闭合时,按键的触电是有一点弹性的,按下去的时候不会马上…

STM32F7xx —— 串口通信

STM32F7xx —— 串口通信 目录 STM32F7xx —— 串口通信 一、串口初始化过程 二、几个重要的串口函数 三、几个重要的结构 四、基本接口设计 一、串口初始化过程 1、时钟使能; 2、GPIO初始化; 3、串口波特率设置; 4、串口控制&#…

一个跳楼博士生的遗书:这个世界是一沟绝望的死水

o(︶︿︶)o 唉北邮跳楼博士生给母亲堵塞遗书:这个世界是一沟绝望的死水 这个世界是一沟绝望的死水,我在这里再怎么折腾也激不起半点涟漪。所有的努力都会被既得利益集团踩在脚下,所有的奋斗都面临着举步维艰。冷漠的人,谢谢你…

jquery插件课程1 幻灯片、城市选择、日期时间选择、拖放、方向拖动插件

jquery插件课程1 幻灯片、城市选择、日期时间选择、拖放、方向拖动插件 一、总结 一句话总结:都是jquery插件,都还比较小,参数(配置参数、数据)一般都是通过json传递。 1、插件配置数据或者参数的时候用的是什么数据结…

由c语言转向c++,我们需要做什么?

点击上方蓝字添加关注在此送大家一份小礼物,公众号内回复linux0001即可获得一本Linux电子教程“c语言和c到底有什么不同和联系呢?”毫无疑问,c语言和c是两种不同的语言,但是又有着千丝万缕的联系。语法上c语言与c一脉相承&#xf…

黄聪:【强烈推荐】搜索引擎排名决定一切吗!

在点石看到一篇《搜索引擎排名决定一切么》,作者cqqc626。写的太赞的,Kyw看后都有点激动,希望天下所有要需要SEO服务的客户们,都能明白其中道理,明白排名不是一切。正文如下: 前段时间经常看到很多和自己差…