STM32F103

  • 1、时钟
  • 1.1 系统时钟的初始化
  • 1.2、时钟使能
  • 2、Keil 查看代码API
  • 3、GPIO初始化
  • 4、Demo代码


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 的内容,代码运行之前必须要初始化系统时钟:

harmonyos 怎么使用coap库 hal库使用_系统时钟

在主函数中调用 Stm32_Clock_Init(RCC_PLL_MUL9)时候设置的入口参数值,通过一层一层的查看,可以看到PLL input clock*9,

harmonyos 怎么使用coap库 hal库使用_harmonyos 怎么使用coap库_02

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 头文件中定义。

harmonyos 怎么使用coap库 hal库使用_初始化_03


宏定义标识符__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。

harmonyos 怎么使用coap库 hal库使用_harmonyos 怎么使用coap库_04


harmonyos 怎么使用coap库 hal库使用_API_05

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;

harmonyos 怎么使用coap库 hal库使用_初始化_06

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);
    }
}