常用HAL库

宏定义

#define LED1_PIN  GPIO_PIN_12    //定义引脚别名
#define LED1_GPIO_PORT  GPIOB    // GPIO_PIN_12 + GPIOB确定指定引脚
#define LED1_GPIO_CLK_ENABLE()   __HAL_RCC_GPIOA_CLK_ENABLE()  //定义方法别名
#define LED1(a) HAL_GPIO_WritePin(LED1_GPIO_PORT,LED1_PIN,a)  //带参宏

常用方法

SystemClock_Config();  //系统时钟初始化 在所有操作之前
HAL_Delay(1000)       //延迟函数

GPIO口初始化:
void GPIO_Config(void)
 {
     GPIO_InitTypeDef GPIO_InitStructure;
     /*开启GPIO口的时钟*/
     __HAL_RCC_GPIOA_CLK_ENABLE()
     /*选择引脚*/
     GPIO_InitStructure.Pin = GPIO_PIN;
     /*设置引脚为输入模式或输出模式*/
     GPIO_InitStructure.Mode = GPIO_MODE_INPUT;
     /*设置引脚不上拉也不下拉*/
     GPIO_InitStructure.Pull = GPIO_NOPULL;
     /*使用上面的结构体初始化*/
     HAL_GPIO_Init(GPIO_PORT, &GPIO_InitStructure);
 }
__HAL_RCC_GPIOA_CLK_ENABLE()    //GPIO A组 时钟使能,使能后GPIO口才能使用
HAL_GPIO_WritePin(LED1_GPIO_PORT,LED1_PIN,state)  //设置GPIO高低电平,state=0或1
HAL_GPIO_ReadPin(GPIOx,GPIO_Pin)  //读取GPIO电平
HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_12)  //反转GPIO电平
按键检测:
uint8_t Key_Scan(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin)
 {
     /*检测是否有按键按下 */
     if (HAL_GPIO_ReadPin(GPIOx,GPIO_Pin) == KEY_ON ) {
         /*等待按键释放 */
         while (HAL_GPIO_ReadPin(GPIOx,GPIO_Pin) == KEY_ON);
         return  KEY_ON;
     } else
         return KEY_OFF;
 }


串口:
/* UART 重定向 printf函数 */
#include "stdio.h"
#ifdef __GNUC__
  #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
  #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif
PUTCHAR_PROTOTYPE
{
  HAL_UART_Transmit(&UartHandle, (uint8_t *)&ch, 1, 0xFFFF);  //阻塞方式打印,串口
  return ch;
}

/* UART handler declaration */
UART_HandleTypeDef UartHandle;
UartHandle.Instance        = USARTx;  //USART1句柄
UartHandle.Init.BaudRate   = 9600;   //波特率
UartHandle.Init.WordLength = UART_WORDLENGTH_8B;  //8位字长
UartHandle.Init.StopBits   = UART_STOPBITS_1;  //一个停止位
UartHandle.Init.Parity     = UART_PARITY_ODD;  //奇偶校验
UartHandle.Init.HwFlowCtl  = UART_HWCONTROL_NONE;  //无硬件流控
UartHandle.Init.Mode       = UART_MODE_TX_RX;  //收发模式
if (HAL_UART_Init(&UartHandle) != HAL_OK)
{
    /* Initialization Error */
    Error_Handler();
}
// __HAL_UART_ENABLE_IT(&UartHandle,UART_IT_RXNE);   //串口未使能时需要手动使能
printf("hell world\n");

 /*****************不使用printf,手动发送字符串 **********************/
 void Usart_SendString(uint8_t *str)
 {
     unsigned int k=0;
     do {
         HAL_UART_Transmit( &UartHandle,(uint8_t *)(str + k) ,1,1000);
         k++;
     } while (*(str + k)!='\0');
 }


定时器:
定时时间 = (Prescaler + 1) × (Period + 1) ÷ 时钟频率    //定时时间单位:秒  时钟频率:Hz   1MHz=1000000Hz
编写中断回调函数
void HAL_TIM_PeriodElapsedCallback (TIM_HandleTypeDef *htim)
{
	if(htim == &htim7) // 判断触发溢出中断的定时器
	{
		//usercode
	}
}
__HAL_TIM_CLEAR_IT(&htim3, TIM_IT_UPDATE);  // 清除定时器初始化过程中的更新中断标志,避免定时器一启动就中断
HAL_TIM_Base_Start_IT(&htim3)    //启动定时器3,定时器会开始计数,计数溢出时会产生UEV事件,并触发中断。
HAL_TIM_Base_Stop_IT(&htim3)   //停止中断工作方式的定时器
HAL_TIM_Base_GetState(&htim3)   //获取基础定时器的当前状态
__HAL_TIM_SET_AUTORELOAD(&htim3,1000)   //动态修改Period

防止头文件重复导入

 #ifndef __LED_H
 #define __LED_H

 /*此处省略头文件的具体内容*/

 #endif /* end of __LED_H */
<think>好的,我现在需要帮助用户查找HAL常用的函数列表及其用法。用户提供了四个引用内容,我需要先仔细看看这些引用内容里有什么信息,可能对回答有帮助。 首先看引用[1],它提到了列表项初始化的函数`vListInitialiseItem`,不过这可能和HAL关系不大,可能是FreeRTOS或其他RTOS的内容。但用户现在问的是HAL,所以这个引用可能不直接相关,但需要确认是否有HAL中的初始化函数需要提到。 引用[2]讨论了u8g2的初始化函数,提到了`u8g2_Setup_ssd1306_i2c_128x64_noname_f`和内存不足的问题,这可能涉及HAL中I2C相关的函数,比如I2C的初始化和传输函数。例如,HAL_I2C_Init, HAL_I2C_Master_Transmit等。需要记住这些可能的函数。 引用[3]展示了外部中断回调函数`HAL_GPIO_EXTI_Callback`,这说明HAL中中断处理的相关函数,特别是GPIO的外部中断配置函数,比如`HAL_GPIO_Init`配置中断,以及回调函数的使用方法。 引用[4]提到了HAL_ADC.h中的三种启动函数:`HAL_ADC_Start`, `HAL_ADC_Start_IT`, `HAL_ADC_Start_DMA`,以及对应的关闭函数。这些显然是HAL中ADC模块的重要函数,需要详细说明它们的用法和区别。 接下来,用户需要HAL常用函数的列表和用法。HAL覆盖了STM32的各种外设,比如GPIO、ADC、UART、I2C、SPI、定时器等。需要分模块整理常用函数,并结合用户提供的引用中的例子。 首先,系统初始化类函数。比如系统时钟配置`SystemClock_Config`,虽然这个通常是用户自己实现的,但可能涉及到HAL中的RCC函数。此外,外设的初始化函数如`HAL_GPIO_Init`, `HAL_ADC_Init`,这些函数通常需要传递结构体参数,比如GPIO的引脚、模式、上下拉等配置。 然后,外设控制函数。例如GPIO的读写:`HAL_GPIO_WritePin`, `HAL_GPIO_ReadPin`。ADC的启动和读取:如引用[4]中的三个启动函数,以及`HAL_ADC_GetValue`。中断相关函数,比如`HAL_GPIO_EXTI_Callback`,需要说明如何配置中断,比如使用`HAL_GPIO_Init`设置中断引脚,然后在回调函数中处理。 通信接口方面,比如I2C的`HAL_I2C_Master_Transmit`, `HAL_I2C_Master_Receive`,可能需要结合引用[2]中的OLED初始化例子,说明如何通过I2C发送数据。UART的函数如`HAL_UART_Transmit`, `HAL_UART_Receive`,以及中断和DMA版本。SPI的函数类似。 定时器相关的函数,比如PWM生成使用`HAL_TIM_PWM_Start`,定时器中断配置等。DMA函数如`HAL_DMA_Start`,但通常HAL提供更高级的函数,比如`HAL_UART_Transmit_DMA`,结合引用[4]中的DMA启动函数。 另外,需要提到回调函数机制,比如用户需要重写某些回调函数来处理中断事件,如`HAL_GPIO_EXTI_Callback`,如引用[3]所示。同时,DMA传输完成中断的回调函数,或者其他外设的中断处理函数。 现在要组织这些内容,按模块分类,每个模块下列出常用函数,参数说明和示例。比如: 1. 系统与时钟初始化 - `HAL_Init()`: 初始化HAL,必须首先调用。 - `SystemClock_Config()`: 用户实现的系统时钟配置,通常调用RCC相关函数。 2. GPIO - `HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init)`: 初始化GPIO引脚,配置模式、上下拉、速度等。 - `HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)`: 设置引脚高低电平。 - `HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)`: 读取引脚状态。 - `HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)`: 用户重写的中断回调函数,如引用[3]。 3. ADC - `HAL_ADC_Init(ADC_HandleTypeDef *hadc)`: 初始化ADC。 - `HAL_ADC_Start(ADC_HandleTypeDef *hadc)`: 启动ADC转换,轮询方式。 - `HAL_ADC_Start_IT(ADC_HandleTypeDef *hadc)`: 启动ADC转换,中断方式,转换完成后触发中断。 - `HAL_ADC_Start_DMA(ADC_HandleTypeDef *hadc, uint32_t *pData, uint32_t Length)`: 启动ADC转换并使用DMA传输数据到指定数组,如引用[4]。 - `HAL_ADC_GetValue(ADC_HandleTypeDef *hadc)`: 获取转换结果。 4. I2C - `HAL_I2C_Init(I2C_HandleTypeDef *hi2c)`: 初始化I2C外设。 - `HAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout)`: 主设备发送数据。 - `HAL_I2C_Master_Receive(...)`: 主设备接收数据。 - 可能结合引用[2]中的OLED初始化,说明如何调用I2C函数发送配置命令。 5. UART - `HAL_UART_Init(UART_HandleTypeDef *huart)`: 初始化UART。 - `HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)`: 阻塞式发送数据。 - `HAL_UART_Receive_IT(...)`: 中断接收。 - `HAL_UART_Transmit_DMA(...)`: DMA发送。 6. 定时器 - `HAL_TIM_Base_Init(TIM_HandleTypeDef *htim)`: 初始化定时器。 - `HAL_TIM_PWM_Start(TIM_HandleTypeDef *htim, uint32_t Channel)`: 启动PWM输出。 - `HAL_TIM_IC_Start_IT(...)`: 输入捕获中断启动。 7. DMA - `HAL_DMA_Start(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength)`: 启动DMA传输,但通常通过其他外设函数间接调用,如`HAL_ADC_Start_DMA`。 在每个函数后给出简单的用法示例,比如: 对于GPIO初始化: ```c GPIO_InitTypeDef GPIO_InitStruct = {0}; GPIO_InitStruct.Pin = GPIO_PIN_13; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); ``` 对于ADC使用DMA: ```c uint32_t adc_buffer[100]; HAL_ADC_Start_DMA(&hadc1, adc_buffer, 100); // 启动ADC并通过DMA传输到adc_buffer[^4] ``` 需要确保引用正确的引用来源,比如引用[4]关于ADC的DMA启动函数。 然后,生成相关问题,如用户提供的示例中的问题结构。可能的问题包括: 1. 如何在HAL中配置DMA传输? 2. HAL中的中断处理流程是怎样的? 3. 如何通过HAL的I2C函数驱动OLED显示屏? 4. 在ADC采样中,轮询模式、中断模式和DMA模式有何区别? 最后,要检查是否符合系统级指令,如行内公式是否正确使用$...$,是否有独立公式需要单独成段(可能这里较少,但如果有数学表达式需要注意),中文回答,引用标识是否正确添加。</think>### HAL常用函数列表及用法 HAL(Hardware Abstraction Layer)STM32微控制器提供了统一的外设操作接口。以下分类列出常用函数及用法示例: --- #### **1. 系统初始化与时钟配置** - **`HAL_Init()`** 初始化HAL,需在程序开始时调用[^1]。 ```c HAL_Init(); ``` - **`SystemClock_Config()`** 用户实现的系统时钟配置函数,通常调用RCC相关函数设置时钟源(如HSI、HSE)和分频系数。 ```c void SystemClock_Config(void) { RCC_OscInitTypeDef osc_init = {0}; osc_init.OscillatorType = RCC_OSCILLATORTYPE_HSE; osc_init.HSEState = RCC_HSE_ON; HAL_RCC_OscConfig(&osc_init); // ...其他配置 } ``` --- #### **2. GPIO操作** - **`HAL_GPIO_Init()`** 配置GPIO引脚模式(输入/输出/中断等)、上下拉电阻和速度。 ```c GPIO_InitTypeDef gpio_init = {0}; gpio_init.Pin = GPIO_PIN_13; gpio_init.Mode = GPIO_MODE_OUTPUT_PP; HAL_GPIO_Init(GPIOC, &gpio_init); ``` - **`HAL_GPIO_WritePin()`** 与 **`HAL_GPIO_ReadPin()`** 写入或读取GPIO引脚电平。 ```c HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET); GPIO_PinState state = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0); ``` - **`HAL_GPIO_EXTI_Callback()`** 外部中断回调函数,需用户重写以处理中断事件[^3]。 ```c void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { if (GPIO_Pin == GPIO_PIN_0) { // 处理按键中断 } } ``` --- #### **3. ADC采样** - **`HAL_ADC_Start()`** 启动ADC转换(轮询模式)。 ```c HAL_ADC_Start(&hadc1); while (!HAL_ADC_PollForConversion(&hadc1, 100)); // 等待转换完成 uint16_t adc_value = HAL_ADC_GetValue(&hadc1); ``` - **`HAL_ADC_Start_IT()`** 启动ADC转换(中断模式),转换完成后触发`HAL_ADC_ConvCpltCallback`回调。 ```c HAL_ADC_Start_IT(&hadc1); ``` - **`HAL_ADC_Start_DMA()`** 启动ADC并通过DMA传输数据到指定数组。 ```c uint32_t adc_buffer[100]; HAL_ADC_Start_DMA(&hadc1, adc_buffer, 100); // 结果自动存入adc_buffer ``` --- #### **4. I2C通信** - **`HAL_I2C_Master_Transmit()`** 主设备发送数据。 ```c uint8_t data[2] = {0x00, 0xFF}; HAL_I2C_Master_Transmit(&hi2c1, 0x3C << 1, data, 2, 100); // 驱动OLED屏幕[^2] ``` - **`HAL_I2C_Master_Receive()`** 主设备接收数据。 ```c uint8_t rx_data[4]; HAL_I2C_Master_Receive(&hi2c1, 0x50 << 1, rx_data, 4, 100); // 读取EEPROM ``` --- #### **5. 定时器与PWM** - **`HAL_TIM_PWM_Start()`** 启动定时器PWM输出。 ```c HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1); // 启动TIM2通道1的PWM __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, 50); // 设置占空比 ``` --- #### **6. DMA传输** - **`HAL_UART_Transmit_DMA()`** 通过DMA发送UART数据。 ```c uint8_t tx_data[] = "Hello"; HAL_UART_Transmit_DMA(&huart1, tx_data, sizeof(tx_data)); ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值