stm32.cube(二)——HAL结构及初始化

发布者:polkmm最新更新时间:2018-05-01 来源: eefocus关键字:stm32  cube  HAL结构  初始化 手机看文章 扫描二维码
随时随地手机看文章

一、HAL结构

HAL的作用是将基础的寄存器读写操作抽象掉,使程序员只需要关心对芯片模块的行为级操作。stm32的cube包以类似面向对象的思想来进行设计,每一个芯片模块都被抽象成一个类,它的私有成员用以辅助算法的实现,公有成员被用作一个方法供外部调用。

我开发板的芯片型号是stm32f10x系列,基础的芯片结构如下: 
这里写图片描述

这时官网上下载的cube包里hal内容: 
这里写图片描述

对比之后发现几乎所有的模块都已经被包含进HAL层。

二、HAL的初始化

HAL层被调用前要先运行初始化函数HAL_init(),它包含在针对HAL自身的全局操作操作的源文件hal.c里。

HAL全局结构 
这里写图片描述

由于Hal_init函数不长,就直接上原型了:

HAL_StatusTypeDef HAL_Init(void)

{

  /* Configure Flash prefetch */

#if (PREFETCH_ENABLE != 0)

#if defined(STM32F101x6) || defined(STM32F101xB) || defined(STM32F101xE) || defined(STM32F101xG) || \

    defined(STM32F102x6) || defined(STM32F102xB) || \

    defined(STM32F103x6) || defined(STM32F103xB) || defined(STM32F103xE) || defined(STM32F103xG) || \

    defined(STM32F105xC) || defined(STM32F107xC)


  /* Prefetch buffer is not available on value line devices */

  __HAL_FLASH_PREFETCH_BUFFER_ENABLE();

#endif

#endif /* PREFETCH_ENABLE */


  /* Set Interrupt Group Priority */

  HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4);


  /* Use systick as time base source and configure 1ms tick (default clock after Reset is MSI) */

  HAL_InitTick(TICK_INT_PRIORITY);


  /* Init the low level hardware */

  HAL_MspInit();


  /* Return function status */

  return HAL_OK;

}


首先打开flash预取缓存加快flash的读取,接下来的工作主要是初始化一个time base。用 systick定时器产生一个1ms为周期的中断,这个中断主要被用于OS产生时钟节拍,为内核提供运行环境。每一次此中断发生时,HAL定义的uwTick计数器将被加一。这样,许多外设的延时都可以通过调用GetTick()函数定时读取这个变量的值来实现。

HAL_Init不仅初始化了定时器的溢出时间,而且将定时器中断指定了相应的优先级。

HAL_MspInit()和HAL_MspDeInit()是用户函数,原型是空函数。

三、其他HAL全局操作

HAL_DeInit()函数通过写复位寄存器,将所有模块复位。

Tick

HAL_IncTick(),用于将uwTick加一。

HAL_Delay(),利用查询uwTick的值来进行延时。

HAL_SuspendTick()和HAL_ResumeTick()用于挂起和恢复定时器中断,这在进行一些需要中断屏蔽的操作时(临界段代码),很有用。

Mode

为了降低功耗,在CPU不运行时,可以将芯片设置位sleep、stop或者standby模式。

而在CPU运行时,也可以通过关闭外设的时钟来降低功耗。

HAL.c里提供相应和函数和宏来支持这两项操作。


关键字:stm32  cube  HAL结构  初始化 引用地址:stm32.cube(二)——HAL结构及初始化

上一篇:stm32.cube(三)——HAL.GPIO
下一篇:stm32.cube(一)——系统架构及目录结构

推荐阅读最新更新时间:2024-03-16 16:01

学习分享:STM32时钟系统小结
在STM32中,有五个时钟源,为HSI、HSE、LSI、LSE、PLL。 、HSI是高速内部时钟,RC振荡器,频率为8MHz。 ②、HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~16MHz。 ③、LSI是低速内部时钟,RC振荡器,频率为40kHz。 ④、LSE是低速外部时钟,接频率为32.768kHz的石英晶体。 ⑤、PLL为锁相环倍频输出,其时钟输入源可选择为HSI/2、HSE或者HSE/2。倍频可选择为2~16倍,但是其输出频率最大不得超过72MHz。 其中40kHz的LSI供独立看门狗IWDG使用,另外它还可以被选择为实时时钟RTC的时钟源。另外,实时时钟RTC的时钟源还可以选择L
[单片机]
在MDK上建立一个C++的STM32开发工程
最近,我惊讶地发现居然可以用C++进行嵌入式程序开发,甚至是裸系统程序。之前,做单片机开发、STM32上程序开发,想到的都是C语言、汇编语言,根本就没有考虑过还可以用C++语言做开发。近日,在学习公司的项目之后,发现C++有其独道之处。开发起来比C语言更方便架构搭建与程序管理。 我之前对C++有曲解,总认为C++只适合做上层应用软件开发,不适用于单片机开发。一方面是因为C++喜欢来不不就new一个对象。对于内存空间非常紧张的单片机,只能望海兴叹。二是C++生成的代码量较C庞大,效率上可能没有C高。对于主频较低的单片机,也用一点勉强。但是,这并不能掩盖C++的优势。C++是面向对象的程序语言,能非常灵活地进行继承与派生
[单片机]
s3c44b0存储器初始化简介
s3c44b0存储器初始化的问题困扰已久,今天总算是搞明白了点,如下总结吧。 贴段代码先: SMRDATA DATA DCD BWSCON_val ;bank0=OM bank1-bank7=16bit bank2=8bit DCD ((B0_Tacs 13)+(B0_Tcos 11)+(B0_Tacc 8)+(B0_Tcoh 6)+(B0_Tah 4)+(B0_Tacp 2)+(B0_PMC));bankcon0 DCD ((B1_Tacs 13)+(B1_Tcos 11)+(B1_Tacc 8)+(B1_Tcoh 6)+(B1_Tah 4)+(B1_Tacp 2)+(B1_PMC));bankcon1 DCD
[单片机]
STM32学习--PWM测试
  今天针对通用定时器的输入捕获和PWM输出进行了学习测试,使用库函数进行。 1. PWM输出测试 1.1 测试方法   输出测试使用软件调试方法,直接在MDK调试界面的逻辑分析仪进行。软件调试设置网上一堆一堆的,我只描述一下遇到问题点。   图中,软件仿真只用设1、2项,加入硬件调需设第3项。 打开逻辑分析仪,在setup中输入想看的端口,如下图设置。   在端口号上右击,选择bit,然后运行即可看PWM输出的效果。 1.2测试的程序 ① GPIO设置,主要是时钟、复用时钟、推挽输出、由于用默认的映射所以不用GPIO_PinRemapConfig。 void PWMOut_GPIO_Init() { GP
[单片机]
<font color='red'>STM32</font>学习--PWM测试
STM32系列第16篇--RTC实时时钟
RCT特征: 可编程的预分频系数,分频系数最高2的20次方。 32位可编程计数,用于较长时间段的测量。 2个分离的时钟。 可以选择三种RTC时钟源:HSE/128;LSE振荡器;LSI振荡器。 2个独立的复位类型:APB1由系统复位;RTC由后备域复位。 三个专门的可屏蔽中断:闹钟中断;秒中断(一个可编程周期,最长可达1s);溢出中断。 RTC工作原理框图 RTCCLK经过RTC_DIV预分频,RTC_PRL设置预分频系数,然后得到TR_CLK时钟信号,我们一般设置其周期为1s,RTC_CNT计数器计数,假如1970设置为时间起点为0s,通过当前时间的秒数计算得到当前的时间。RTC_ALR是设置闹钟时间,RTC
[单片机]
<font color='red'>STM32</font>系列第16篇--RTC实时时钟
STM32 嵌入式学习入门(1)——STM32简介及STM32学习方法简介
STM32是新的基于ARM内核的32位MCU系列,该内核为ARM公司为要求高性能、低成本、低功耗的嵌入式应用专门设计的Cortex-M内核,该内核采用标准的ARM架构。该内核具有超前的体系结构以及高性能、低电压、低功耗,且拥有创新的内核以及外设等特点...... 具体地可能很难对STM32下一个定义。而且我估计零基础接触嵌入式、接触STM32的同学看完上面这句话还是没懂STM32到底是什么东西,以及我们能用STM32做什么。因为这句话对零基础的人来说有太多的没听过的名词。 博主现在是大二学生。一年多以前,自己加入了学校的嵌入式实验室,在学长介绍下开始接触STM32。当时买了正点原子的开发板,开发板配套的资料确实很全,但是对
[单片机]
STM32寄存器映射
我们知道,存储器本身没有地址,给存储器分配地址的过程叫存储器映射,那什么叫寄存器映射?寄存器到底是什么? 在存储器Block2 这块区域,设计的是片上外设,它们以四个字节为一个单元,共32bit,每一个单元对应不同的功能,当我们控制这些单元时就可以驱动外设工作。我们可以找到每个单元的起始地址,然后通过C 语言指针的操作方式来访问这些单元,如果每次都是通过这种地址的方式来访问,不仅不好记忆还容易出错,这时我们可以根据每个单元功能的不同,以功能为名给这个内存单元取一个别名,这个别名就是我们经常说的寄存器,这个给已经分配好地址的有特定功能的内存单元取别名的过程就叫寄存器映射。 比如,我们找到GPIOB 端口的输出数据寄存器ODR 的地址
[单片机]
<font color='red'>STM32</font>寄存器映射
STM32单片机特性解析
STM32单片机 由ST厂商推出的STM32系列单片机,行业的朋友都知道,这是一款性价比超高的系列单片机,应该没有之一,功能及其强大。其基于专为要求高性能、 低成本、低功耗的嵌入式应用专门设计的ARM Cortex-M内核,同时具有一流的外设:1μs的双12位ADC,4兆位/秒的UART,18兆位/秒的SPI等等,在功耗和集成度方面也有不俗的表现,当然和MSP430的功耗比起来是稍微逊色的一些,但这并不影响工程师们对它的热捧程度,由于其简单的结构和易用的工具再配合其强大的功能在行业中赫赫有名。其强大的功能主要表现在: 特性 1、内核:ARM32位Cortex-M3CPU,最高工作频率72MHz,1.25DMIPS/MHz,单周
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved