Wiki:知识&笔记 Wiki:知识&笔记
首页
  • 学习笔记

    • 《JavaScript教程》笔记
  • 嵌入式

    • STM32
  • 技术文档
归档
GitHub (opens new window)
首页
  • 学习笔记

    • 《JavaScript教程》笔记
  • 嵌入式

    • STM32
  • 技术文档
归档
GitHub (opens new window)
  • 基础

  • 底层&寄存器

  • HAL库外设

    • HAL库函数
      • HAL库
        • HAL_Delay
        • HAL_GetTick
      • GPIO 操作
        • HALGPIOWritePin
        • HALGPIOTogglePin
        • HALGPIOReadPin
      • 定时器操作
        • HALTIMIRQHandler
        • HALTIMBase_Start
        • HALTIMBaseStartIT
        • _HALTIM_SetCompare
        • _HALTIM_PRESCALER
        • HALTIMPWM_Start
      • ADC 操作
        • HALADCConfigChannel
        • HALADCStart
        • HALADCPollForConversion
        • HALADCGetValue
      • 串口操作
        • HALUARTTransmit
        • HALUARTReceive_IT
        • _HALUARTENABLEIT
        • _HALUARTGETFLAG
        • _HALUARTCLEARIDLEFLAG
      • 中断返回函数
        • HALTIMPeriodElapsedCallback
        • HALGPIOEXIT_Callback
        • HALUARTRxCpltCallback
    • HAL结构
    • GPIO各种点亮LED
    • 定时器
    • PWM控制LED颜色
    • 按键外部中断
    • ADC使用
    • 串口与DMA
    • FLASH 读写
    • IIC通信
    • SPI 通信
    • CAN
  • STM32
  • HAL库外设
2020-08-20
HAL库
HAL_Delay
HAL_GetTick
GPIO 操作
HALGPIOWritePin
HALGPIOTogglePin
HALGPIOReadPin
定时器操作
HALTIMIRQHandler
HALTIMBase_Start
HALTIMBaseStartIT
_HALTIM_SetCompare
_HALTIM_PRESCALER
HALTIMPWM_Start
ADC 操作
HALADCConfigChannel
HALADCStart
HALADCPollForConversion
HALADCGetValue
串口操作
HALUARTTransmit
HALUARTReceive_IT
_HALUARTENABLEIT
_HALUARTGETFLAG
_HALUARTCLEARIDLEFLAG
中断返回函数
HALTIMPeriodElapsedCallback
HALGPIOEXIT_Callback
HALUARTRxCpltCallback

HAL库函数

学习库函数最好的方法是看手册

# HAL库

# HAL_Delay

HAL 库提供了用于毫秒级延迟的函数:HAL_Delay 函数(使用_weak 修饰符说明该函数是可以用户重定义的)

__weak void HAL_Delay(uint32_t Delay)
1
函数名 HAL_Delay
函数作用 使系统延迟对应的毫秒级时间
返回值 void
参数 Delay,对应的延迟毫秒数,比如延迟 1 秒就为 1000

# HAL_GetTick

uwTick变量中存储的是从STM32的 Systick 初始化以来所经过的时间(ms),uwTick的存在相当于给整个程序提供了一个绝对的时间基准,访问其值可用如下函数:

函数名 HAL_GetTick
函数作用 返回当前的uwTick值
返回值 当前的uwTick值

# GPIO 操作

# HAL_GPIO_WritePin

定义如下:

void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
1
函数名 HAL_GPIO_WritePin
函数作用 使得对应的引脚输出高电平或者低电平
返回值 void
参数 1:GPIOx 对应 GPIO 总线,其中 x 可以是 A…I。例如 PH10,则输入 GPIOH
参数 2:GPIO_Pin 对应引脚数,可以是 0-15。例如 PH10,则输入 GPIO_PIN_10
参数 3:PinState GPIO_PIN_RESET:输出低电平;GPIO_PIN_SET:输出高电平

# HAL_GPIO_TogglePin

定义如下:

void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
1
函数名 HAL_GPIO_TogglePin
函数作用 翻转对应引脚的电平
返回值 void
参数 1:GPIOx 对应 GPIO 总线,其中 x 可以是 A…I。例如 PH10,则输入 GPIOH
参数 2:GPIO_Pin 对应引脚数。可以是 0-15。例如 PH10,则输入 GPIO_PIN_10

# HAL_GPIO_ReadPin

定义如下:

GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
1
函数名 HAL_GPIO_ReadPin
函数作用 返回引脚电平
返回值 GPIO_PinState,如果是高电平则返回GPIO_PIN_SET(对应为1),如果是低电平则返回GPIO_PIN_RESET(对应为0)
参数 1              对应 GPIO 总线,其中 x 可以是 A…I。例如 PH10,则输入 GPIOH
参数 2 对应引脚数。可以是 0-15。例如 PH10,则输入 GPIO_PIN_10

# 定时器操作

# HAL_TIM_IRQHandler

void HAL_TIM_IRQHandler(TIM_HandleTypeDef *htim)
1
函数名 HAL_TIM_IRQHandler
函数作用 HAL对涉及(定时器)中断的寄存器进行处理
返回值 void
参数 *htim 定时器的句柄指针,如定时器1就输入&htim1,定时器2就输入&htim2

在这个函数对寄存器进行配置之后,程序将会自动调用中断回调函数

_weak void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
1

和上面一样,它的参数也是定时器的句柄指针。我们在main.c中就是需要重新将中断的内容写入这个回调函数,定时器中断更多请内容查看此处

# HAL_TIM_Base_Start

如果不开启中断,仅让定时器以定时功能工作,为了使定时器开始工作,需要调用HAL库提供的函数

HAL_StatusTypeDef HAL_TIM_Base_Start(TIM_HandleTypeDef *htim)
1
函数名 HAL_TIM_Base_Start
函数作用 使对应的定时器开始工作
返回值 HAL_StatusTypeDef,HAL库定义的几种状态,如果成功使定时器开始工作,则返回HAL_OK
参数 *htim 定时器的句柄指针,如定时器1就输入&htim1,定时器2就输入&htim2

此函数需要在主循环while(1)之前调用

# HAL_TIM_Base_Start_IT

接上面的函数,如果不仅需要开启定时器,还需要使用定时中断,则需要调用此函数

HAL_StatusTypeDef HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim)
1
函数名 HAL_TIM_Base_Start_IT
函数作用 使对应的定时器开始工作,并使能其定时中断
返回值 HAL_StatusTypeDef,HAL库定义的几种状态,如果成功使定时器开始工作,则返回HAL_OK
参数 *htim 定时器的句柄指针,如定时器1就输入&htim1,定时器2就输入&htim2

此函数也需要在主循环while(1)之前调用

# __HAL_TIM_SetCompare

这是在定时器进行 PWM 输出的时候,对储存比较值的寄存器 TIMx_CCRx 赋值的函数

#define __HAL_TIM_SET_COMPARE(__HANDLE__, __CHANNEL__, __COMPARE__) \
(((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCR1 = (__COMPARE__)) :\
((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCR2 = (__COMPARE__)) :\
((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCR3 = (__COMPARE__)) :\
((__HANDLE__)->Instance->CCR4 = (__COMPARE__)))
1
2
3
4
5
函数名 __HAL_TIM_SetCompare
函数作用 在程序运行时对储存比较值的寄存器 TIMx_CCRx 赋值,修改比较值
参数1 输入*htim 定时器的句柄指针即可,如定时器1就输入&htim1,定时器2就输入&htim2
参数2 定时器的频道号,如TIM_CHANNEL_1, TIM_CHANNEL_2
参数3 要赋给 TIMx_CCRx 寄存器的值,此值要小于 TIMx_ARR 内的重装载值

# __HAL_TIM_PRESCALER

其实它和 __HAL_TIM_SET_PRESCALER是等效的,因为此句:

#define __HAL_TIM_PRESCALER    __HAL_TIM_SET_PRESCALER
1

但其原始定义为:

#define __HAL_TIM_SET_PRESCALER(__HANDLE__, __PRESC__)       ((__HANDLE__)->Instance->PSC = (__PRESC__))
1
函数名 __HAL_TIM_PRESCALER
函数作用 在程序运行时对储存预分频比的寄存器 TIMx_PSR 赋值,修改预分频比
参数1 输入*htim 定时器的句柄指针即可,如定时器1就输入&htim1,定时器2就输入&htim2
参数2 要赋给 TIMx_PSR 寄存器的新预分频比值

# HAL_TIM_PWM_Start

HAL库提供的PWM初始化函数,为定时器初始化 PWM

函数名 HAL_TIM_PWM_Start
函数作用 使对应定时器的对应通道开始PWM输出
返回值 HAL_StatusTypeDef,HAL库定义的几种状态,如果成功使定时器开始工作,则返回HAL_OK
参数1 *htim定时器的句柄指针,如定时器1就输入&htim1,定时器2就输入&htim2
参数2 Channel 定时器PWM输出的通道,比如通道1为TIM_CHANNEL1

# ADC 操作

# HAL_ADC_ConfigChannel

HAL_StatusTypeDef HAL_ADC_ConfigChannel(ADC_HandleTypeDef* hadc, ADC_ChannelConfTypeDef* sConfig)
1
函数名 HAL_ADC_ConfigChannel
函数作用 设置ADC通道的各个属性值,包括转换通道,序列排序,采样时间等
返回值 HAL_StatusTypeDef,HAL库定义的几种状态,如果成功使ADC开始工作,则返回HAL_OK
参数1 TIM_HandleTypeDef * hadc即ADC的句柄指针,如果是adc1就输入&hadc1,adc2就输入&hadc2
参数2 ADC_ChannelConfTypeDef* sConfig 即指向ADC设置的结构体指针。我们先对sConfig结构体进行赋值,然后再将其指针作为参数输入函数

这个函数非常关键,直接指明了接下来对 ADC 操作的一些详细参数,包括端口号等,所以在改变 ADC 读取数据的配置时一定要记得改一下此函数的参数,其使用例见这里 (opens new window)

# HAL_ADC_Start

HAL_StatusTypeDef HAL_ADC_Start(ADC_HandleTypeDef* hadc)
1
函数名 HAL_ADC_Start
函数作用 开启ADC的采样
返回值 HAL_StatusTypeDef,HAL库定义的几种状态,如果成功使ADC开始工作,则返回HAL_OK
参数1 TIM_HandleTypeDef * hadc即ADC的句柄指针,如果是adc1就输入&hadc1,adc2就输入&hadc2

# HAL_ADC_PollForConversion

HAL_StatusTypeDef HAL_ADC_PollForConversion(ADC_HandleTypeDef* hadc, uint32_t Timeout)
1
函数名 HAL_ADC_PollForConversion
函数作用 等待ADC转换结束
返回值 HAL_StatusTypeDef,HAL库定义的几种状态,如果成功使ADC开始工作,则返回HAL_OK
参数1 TIM_HandleTypeDef * hadc即ADC的句柄指针,如果是adc1就输入&hadc1,adc2就输入&hadc2
参数2 uint32_t Timeout等待的最大时间

# HAL_ADC_GetValue

函数名 HAL_ADC_GetValue
函数作用 获取ADC值
返回值 HAL_StatusTypeDef,HAL库定义的几种状态,如果成功使ADC开始工作,则返回HAL_OK
参数1 TIM_HandleTypeDef * hadc即ADC的句柄指针,如果是adc1就输入&hadc1,adc2就输入&hadc2

# 串口操作

# HAL_UART_Transmit

HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
1
函数名 HAL_UART_Transmit
函数作用 从指定的串口发送一段数据
返回值 HAL_StatusTypeDef,HAL库定义的几种状态,如果成功发送本次数据,则返回HAL_OK
参数1 UART_HandleTypeDef *huart 要进行发送的串口的句柄指针,如串口1就输入&huart1,串口2就输入&huart2
参数2 uint8_t *pData 要发送的数据的首地址,比如要发送buf[]=”Helloword”则输入buf,也可以直接输入要发送的字符串
参数3 uint16_t Size 要发送的数据的大小,即输入的字符串的长度,也可以通过sizeof关键字获取数据大小
参数4 uint32_t Timeout 发送超时时间,如果发送时间超出该时间则取消本次发送

# HAL_UART_Receive_IT

HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
1
函数名 HAL_UART_Receive_IT
函数作用 使能一个串口的接收中断
返回值 HAL_StatusTypeDef,HAL库定义的几种状态,如果成功发送本次数据,则返回HAL_OK
参数1 UART_HandleTypeDef *huart 要进行发送的串口的句柄指针,如串口1就输入&huart1,串口2就输入&huart2
参数2 uint8_t *pData 要接收本次数据的缓冲变量的地址
参数3 uint16_t Size 要接收的数据的大小,即输入的字符串的长度,只有收够这个长度的数据才会进入中断

这个函数需要注意的是,它才触发一次中断后会将中断标志位清除,所以需要重复调用才能持续接收

# __HAL_UART_ENABLE_IT

#define __HAL_UART_ENABLE_IT(__HANDLE__, __INTERRUPT__)   ((((__INTERRUPT__) >> 28U) == UART_CR1_REG_INDEX)? ((__HANDLE__)->Instance->CR1 |= ((__INTERRUPT__) & UART_IT_MASK)): \
                                                           (((__INTERRUPT__) >> 28U) == UART_CR2_REG_INDEX)? ((__HANDLE__)->Instance->CR2 |= ((__INTERRUPT__) & UART_IT_MASK)): \
                                                           ((__HANDLE__)->Instance->CR3 |= ((__INTERRUPT__) & UART_IT_MASK)))
1
2
3
宏名 __HAL_UART_ENABLE_IT
宏作用 使能某个串口中断类型
参数1 __HANDLE__要进行使能的串口的句柄指针,如串口1就输入&huart1
参数2 __INTERRUPT__要使能的中断类型,UART_IT_RXNE接收中断,UART_IT_IDLE空闲中断

# __HAL_UART_GET_FLAG

#define __HAL_UART_GET_FLAG(__HANDLE__, __FLAG__) (((__HANDLE__)->Instance->SR & (__FLAG__)) == (__FLAG__))
1
宏名 __HAL_UART_GET_FLAG
宏作用 测试某个串口的某个 FLAG 位的状态
返回值 FLAG 的两种状态:SET 与 RESET
参数1 __HANDLE__要进行测试的串口的句柄指针,如串口1就输入&huart1
参数2 __FLAG__是要测试的 FLAG 名称,空闲中断位是UART_FLAG_IDLE,基本为这个格式

# __HAL_UART_CLEAR_IDLEFLAG

宏名 __HAL_UART_GET_FLAG
宏作用 清除IDLE的中断标志位的宏定义
参数1 __HANDLE__要删除标志位的串口的句柄指针,如串口1就输入&huart1

# 中断返回函数

# HAL_TIM_PeriodElapsedCallback

这是定时器中断的回调函数,其原始定义为:

__weak void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
1

我们需要在main.c或其他我们自己的位置重新定义其内容

函数名 HAL_TIM_PeriodElapsedCallback
函数作用 定义定时器中断的中断执行内容
返回值 void
参数1 发生定时器中断的定时器句柄指针,是由系统在调用时自动填写的;如 &htim1, &htim2 等

# HAL_GPIO_EXIT_Callback

这是 GPIO 外部中断的回调函数,其原始定义为:

__weak void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
1

我们需要在main.c或其他我们自己的位置重新定义其内容

函数名 HAL_GPIO_EXIT_Ballback
函数作用 定义 GPIO 外部中断的中断执行内容
返回值 void
参数1 发生外部中断的引脚(组)号,是由系统在调用时自动填写的;如 PA0, PB1 等

# HAL_UART_RxCpltCallback

这是 UART 接收中断的回调函数,其原始定义为:

__weak void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
1
函数名 HAL_UART_RxCpltCallback
函数作用 定义 UART 接收中断的内容
返回值 void
参数1 发生接收中断的串口句柄指针,是由系统在调用时自动填写的;如 &huart1 等
编辑 (opens new window)
上次更新: 2020/11/18, 13:11:00
GPIO位带操作
HAL结构

← GPIO位带操作 HAL结构→

Theme by Vdoing | Copyright © 2020-2025 Jack :) | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式