STM32F103 HAL库基本使用(一)

HAL库基本使用系列的 全部博客是我重新学习HAL库的学习记录,仅作为学习记录。其中使用了正点原子Mini开发板和正点原子HAL库Demo,详细的资料请观看正点原子官网。

1、时钟

1.1 系统时钟的初始化

  HAL 库的 SystemInit 函数并没有像标准库的 SystemInit 函数一样进行时钟的初始化配置。HAL库的 SystemInit 函数除了打开 HSI 之外,没有任何时钟相关配置,所以使用 HAL 库我们必须编时钟配置函数。

HAL库的SystemInit 主要做了如下三个方面工作:
1) 复位 RCC 时钟配置为默认复位值(默认开始了 HIS)
2) 外部存储器配置
3) 中断向量表地址配置

sys.c文件中的时钟初始化函数 Stm32_Clock_Init 的内容,代码运行之前必须要初始化系统时钟:
在这里插入图片描述在主函数中调用 Stm32_Clock_Init(RCC_PLL_MUL9)时候设置的入口参数值,通过一层一层的查看,可以看到PLL input clock*9,
在这里插入图片描述

PLL 时钟为 PLLCLK=HSE9 =8MHz9=72MHz,同时我们选择系统时钟源为
PLL , 所 以 系 统 时 钟 SYSCLK=72MHz 。 AHB 分频系数为 1 ,故其频率为
HCLK=SYSCLK/1=72MHz。APB1 分频系数为 2,故其频率为 PCLK1=HCLK/2=36MHz。APB2
分频系数为 1,故其频率为 PCLK2=HCLK/1=72/1=72MHz。

SYSCLK(系统时钟) =72MHz
PLL 主时钟 =72MHz
AHB 总线时钟(HCLK=SYSCLK/1) =72MHz
APB1 总线时钟(PCLK1=HCLK/2) =36MHz
APB2 总线时钟(PCLK2=HCLK/1) =72MHz

1.2、时钟使能

时钟的定义,在stm32f1xx_hal_rcc.h 头文件中定义。
在这里插入图片描述
宏定义标识符__HAL_RCC_GPIOA_CLK_ENABLE(),
它的核心操作是通过下面这行代码实现的:

SET_BIT(RCC->APB2ENR, RCC_APB2ENR_IOPAEN)

我们只需要调用宏定义的标识就可以。

开启时钟:
__HAL_RCC_GPIOA_CLK_ENABLE();//使能 GPIOA 时钟
__HAL_RCC_DMA1_CLK_ENABLE();//使能 DMA1 时钟
__HAL_RCC_USART2_CLK_ENABLE();//使能串口 2 时钟
__HAL_RCC_TIM1_CLK_ENABLE();//使能 TIM1 时钟

关闭时钟:
__HAL_RCC_DMA1_CLK_DISABLE();//禁止 DMA1 时钟
__HAL_RCC_USART2_CLK_DISABLE();//禁止串口 2 时钟
__HAL_RCC_TIM1_CLK_DISABLE();//禁止 TIM1 时钟

2、Keil 查看代码API

  如此多的API函数我们也无法记忆,但是可以通过快捷的方式去查看这些API。
在这里插入图片描述
在这里插入图片描述

3、GPIO初始化

  在上面已经介绍了关于如何快速找到API函数,那下面就是调用API函数。通过 HAL_GPIO_Init 函数来实现的。
GPIO_InitTypeDef结构体构成:

typedef struct
{
  uint32_t Pin;       /*!< Specifies the GPIO pins to be configured.
                           This parameter can be any value of @ref GPIO_pins_define */

  uint32_t Mode;      /*!< Specifies the operating mode for the selected pins.
                           This parameter can be a value of @ref GPIO_mode_define */

  uint32_t Pull;      /*!< Specifies the Pull-up or Pull-Down activation for the selected pins.
                           This parameter can be a value of @ref GPIO_pull_define */

  uint32_t Speed;     /*!< Specifies the speed for the selected pins.
                           This parameter can be a value of @ref GPIO_speed_define */
} GPIO_InitTypeDef;

在这里插入图片描述

GPIO_InitTypeDef GPIO_Initure;     //结构体
GPIO_Initure.Pin = GPIO_PIN_8; 				//PA8
GPIO_Initure.Mode = GPIO_MODE_OUTPUT_PP;  	//推挽输出
GPIO_Initure.Pull = GPIO_PULLUP;          	//上拉
GPIO_Initure.Speed = GPIO_SPEED_FREQ_HIGH;  //高速
HAL_GPIO_Init(GPIOA, &GPIO_Initure);

GPIO_Initure.Pin = GPIO_PIN_2; 				//PD2
HAL_GPIO_Init(GPIOD, &GPIO_Initure);

4、Demo代码

使用到的API HAL_GPIO_WritePin GPIO写入值操作。

void HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)

参数 :
GPIO
GPIO 引脚
PinState(引脚值)GPIO_PIN_RESET = 0u, GPIO_PIN_SET

#include "sys.h"
#include "delay.h"
#include "usart.h"

void Delay(__IO uint32_t nCount);

void Delay(__IO uint32_t nCount)
{
    while(nCount--) {}
}

int main(void)
{
    GPIO_InitTypeDef GPIO_Initure;

    HAL_Init();                    	 			//初始化HAL库
    Stm32_Clock_Init(RCC_PLL_MUL9);   			//设置时钟,72M

    __HAL_RCC_GPIOA_CLK_ENABLE();           	//开启GPIOA时钟
    __HAL_RCC_GPIOD_CLK_ENABLE();           	//开启GPIOD时钟

    GPIO_Initure.Pin = GPIO_PIN_8; 				//PA8
    GPIO_Initure.Mode = GPIO_MODE_OUTPUT_PP;  	//推挽输出
    GPIO_Initure.Pull = GPIO_PULLUP;          	//上拉
    GPIO_Initure.Speed = GPIO_SPEED_FREQ_HIGH;  //高速
    HAL_GPIO_Init(GPIOA, &GPIO_Initure);

    GPIO_Initure.Pin = GPIO_PIN_2; 				//PD2
    HAL_GPIO_Init(GPIOD, &GPIO_Initure);

    while(1)
    {
        HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_SET);		//PA8置1
        HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);		//PD2置1
        Delay(0x7FFFFF);
        HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_RESET);		//PA8置0
        HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);		//PD2置0
        Delay(0x7FFFFF);
    }
}

  • 2
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
STM32F103 HAL是针对STM32F103系列微控制器的硬件抽象层(HAL。该提供了一组函数和驱动程序,用于方便地使用STM32F103系列芯片的各种外设和功能。HAL可以简化开发过程,提高代码的可重用性和可移植性。 在Cube固件包的Drivers文件夹下,可以找到HAL的源码文件夹。HAL基本使用可以参考引用中提供的博客,其中详细记录了HAL的学习过程。HAL使用可以通过初始化系统时钟、配置外设等方式来实现。 需要注意的是,HAL的SystemInit函数并不像标准的SystemInit函数那样进行时钟的初始化配置。它只会打开HSI(高速内部时钟),没有其他时钟相关的配置。因此,在使用HAL时,我们需要编写自己的时钟配置函数,来对系统时钟进行初始化和配置。 总结而言,STM32F103 HAL是为了方便开发者使用STM32F103系列微控制器而设计的硬件抽象层。它提供了一系列函数和驱动程序,可用于配置和控制STM32F103系列芯片的外设和功能。具体的使用方法可以参考相关文档和博客。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [STM32初识HAL](https://blog.csdn.net/Caramel_biscuit/article/details/130856712)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [STM32F103 HAL基本使用(一)](https://blog.csdn.net/weixin_45488643/article/details/119321607)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值