狱中联欢STM32F103HAL库基本使⽤(⼀)
STM32F103
HAL库基本使⽤系列的 全部博客是我重新学习HAL库的学习记录,仅作为学习记录。其中使⽤了正点原⼦Mini开发板和正点原⼦HAL库Demo,详细的资料请观看正点原⼦官⽹。
1、时钟
1.1 系统时钟的初始化
HAL 库的 SystemInit 函数并没有像标准库的 SystemInit 函数⼀样进⾏时钟的初始化配置。HAL库的 SystemInit 函数除了打开 HSI 之外,没有任何时钟相关配置,所以使⽤ HAL 库我们必须编时钟配置函数。
HAL库的SystemInit 主要做了如下三个⽅⾯⼯作:
1) 复位 RCC 时钟配置为默认复位值(默认开始了 HIS)单眼皮怎么画眼影
2) 外部存储器配置
assistant怎么读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 时钟
atsushi__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
{
rearwindowuint32_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 lected 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 lected pins.
This parameter can be a value of @ref GPIO_pull_define */
varcharuint32_t Speed ; /*!< Specifies the speed for the lected 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)
会计电算化软件>imax什么意思{
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);
}
}