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

一、HAL结构

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

我开发板的芯片型号是stm32f10x系列,基础的芯片结构如下:
stm32.cube(二)——HAL结构及初始化_第1张图片

这时官网上下载的cube包里hal内容:
stm32.cube(二)——HAL结构及初始化_第2张图片

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

二、HAL的初始化

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

HAL全局结构
stm32.cube(二)——HAL结构及初始化_第3张图片

由于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里提供相应和函数和宏来支持这两项操作。

你可能感兴趣的:(嵌入式)