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 的内容,代码运行之前必须要初始化系统时钟:
在主函数中调用 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);
}
}