【STM32HAL库】常用功能备忘

目录

GPIO

定时器

开启定时器

关闭定时器

设置计数值

读取计数值

开启定时器中断

关闭定时器中断

定时器中断回调函数

定时器PWM输出模式

单路输出

开启PWM输出通道 

设置比较值(设置占空比)

互补输出

开启PWM 

设置比较值(设置占空比)

DMA模式

HAL设置 

​编辑 开启PWM(DMA)

 关闭PWM(DMA)

PWM+DMA中断回调函数

定时器编码器模式

双相计数

HAL设置

 开启编码器模式

外部中断

外部中断回调函数

低功耗停止模式(STOP)

开启FPU和DSP库使用

串口

阻塞模式

发送

接收 

中断模式

接收

空闲中断(不定长数据接收)

DMA模式

发送

DMA空闲接收

SPI

阻塞发送接收

I2C

主机模式阻塞读数据

主机模式阻塞写数据

主机模式阻塞读寄存器

主机模式阻塞写寄存器

ADC

阻塞查询

初始化

 程序

DMA模式

HAL设置 

程序设置

软件复位


GPIO

void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
输入输出
名称描述功能
输入1

GPIO_TypeDef* GPIOx

GPIO组
输入2uint16_t GPIO_PinGPIO管脚
输入3

GPIO_PinState PinState

置位或复位
输出
GPIO_PinState
名称功能

GPIO_PIN_RESET

低电平(0)

GPIO_PIN_SET

高电平(1)

GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
输入输出
名称描述功能
输入1

GPIO_TypeDef* GPIOx

GPIO组
输入2uint16_t GPIO_PinGPIO管脚
输出

GPIO_PinState

高或低
GPIO_PinState
名称功能

GPIO_PIN_RESET

低电平(0)

GPIO_PIN_SET

高电平(1)

定时器

开启定时器

HAL_StatusTypeDef HAL_TIM_Base_Start(TIM_HandleTypeDef *htim)
输入输出
名称描述功能
输入1

TIM_HandleTypeDef *htim

定时器句柄地址
输出

HAL_StatusTypeDef

状态

如果打开成功输出为HAL_OK(0)

关闭定时器

HAL_StatusTypeDef HAL_TIM_Base_Stop(TIM_HandleTypeDef *htim)
输入输出
名称描述功能
输入1

TIM_HandleTypeDef *htim

定时器句柄地址
输出

HAL_StatusTypeDef

状态

如果关闭成功输出为HAL_OK(0)

设置计数值

__HAL_TIM_SetCounter(__HANDLE__, __COUNTER__)

这个是宏定义的函数,直接操作寄存器

输入输出
名称描述功能
输入1__HANDLE__定时器句柄地址
输入2__COUNTER__计数值
输出

读取计数值

__HAL_TIM_GetCounter(__HANDLE__) 

 这个是宏定义的函数,直接操作寄存器

输入输出
名称描述功能
输入1__HANDLE__定时器句柄地址
输出

开启定时器中断

HAL_StatusTypeDef HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim)
输入输出
名称描述功能
输入1

TIM_HandleTypeDef *htim

定时器句柄地址
输出

HAL_StatusTypeDef

状态

如果打开成功输出为HAL_OK(0)

如果使用定时器中断需要在定时器初始化函数中打开中断 

关闭定时器中断

HAL_StatusTypeDef HAL_TIM_Base_Stop_IT(TIM_HandleTypeDef *htim)
输入输出
名称描述功能
输入1

TIM_HandleTypeDef *htim

定时器句柄地址
输出

HAL_StatusTypeDef

状态

如果关闭成功输出为HAL_OK(0)

定时器中断回调函数

这个函数是每一个定时器中断发生时调用,需要在里面区分定时器

需要自己写,名字不能错误

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    if (htim == &htimx)
    {
    }
}

htimx是定时器句柄

注意:

一定要先开定时器中断,再开定时器

一定要先开定时器中断,再开定时器

一定要先开定时器中断,再开定时器 

定时器PWM输出模式

单路输出

高级和通用定时器都有此功能

选择如图模式即可

预分频和计数值所确定的时间为PWM的周期

计数值则是PWM的分辨率,从0-计数值+1(分别线性对应占空比0-100)

模式:

mode1是向上计数时 当前值<比较值时输出有效电平

向下计数时 当前值>比较值时输出有效电平 

mode2是向上计数时 当前值>比较值时输出有效电平

向下计数时 当前值<比较值时输出有效电平 

 脉冲比较值(pulse)

一般不管,软件设置

CH Polanrity 通道极性 :有效电平

 CH Idle Staty 空闲时状态(不知道为啥我设置这个无效)

开启PWM输出通道 

HAL_StatusTypeDef HAL_TIM_PWM_Start(TIM_HandleTypeDef *htim, uint32_t Channel)
输入输出
名称描述功能
输入1

TIM_HandleTypeDef *htim

定时器句柄地址
输入2uint32_t Channel输出通道
输出

HAL_StatusTypeDef

状态

输出通道根据HAL库中的选择而定,可以是

TIM_CHANNEL_1

TIM_CHANNEL_2

TIM_CHANNEL_3

TIM_CHANNEL_4

设置比较值(设置占空比)

__HAL_TIM_SET_COMPARE(__HANDLE__, __CHANNEL__, __COMPARE__) 
输入输出
名称描述功能
输入1__HANDLE__定时器句柄地址
输入2__CHANNEL__通道
输入2__COMPARE__数值
输出

宏定义函数(通道和上文的通道取值相同)

htim1.Instance->CCR1=;
htim1.Instance->CCR2=;
htim1.Instance->CCR3=;
htim1.Instance->CCR4=;

也可以直接这样设置 (完全等价)

设置重载值(间接设置频率)

__HAL_TIM_SET_AUTORELOAD(__HANDLE__, __AUTORELOAD__)
输入输出
名称描述功能
输入1__HANDLE__定时器句柄地址
输入2__AUTORELOAD__重载值
输出

宏定义函数

设置分频系数(间接设置频率)

__HAL_TIM_SET_PRESCALER(__HANDLE__, __PRESC__)
输入输出
名称描述功能
输入1__HANDLE__定时器句柄地址
输入2__PRESC__分频系数
输出

宏定义函数

 

互补输出

 高级定时器特有,电机控制常用

分频和单路相同

设置死区时间,其他和单路相同 

开启PWM 

HAL_StatusTypeDef HAL_TIM_PWM_Start(TIM_HandleTypeDef *htim, uint32_t Channel)

HAL_StatusTypeDef HAL_TIMEx_PWMN_Start(TIM_HandleTypeDef *htim, uint32_t Channel)
输入输出
名称描述功能
输入1

TIM_HandleTypeDef *htim

定时器句柄地址
输入2uint32_t Channel输出通道
输出

HAL_StatusTypeDef

状态

分别打开PWM和其互补输出,和单路输出相同

设置比较值(设置占空比)

和单路输出完全相同

设置重载值(间接设置频率)

和单路输出完全相同

设置分频系数(间接设置频率)

和单路输出完全相同

 

DMA模式

PWM+DMA模式下,每次脉冲发送完成后会触发一次DMA中断

也就是每通过DMA发送一次数据给定时器时

定时器的PWM输出会在(每个数据)发送完一次脉冲后给产生中断

(但是注意,如果不关闭PWM输出,则会一直输出最后一个脉冲,也就是直接改变了比较值)

DMA只是一个搬运工

本质上就是将内存的数据,搬运到硬件定时器PWM输出的比较值

HAL设置 

开启PWM输出,并设置好分频和计数值 

 开启DMA,

设置当前通道的DMA

从内存到外设

普通模式

建议设置为字(word)模式

 开启DMA中断(默认就是开启的)

 开启PWM(DMA)

HAL_StatusTypeDef HAL_TIM_PWM_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData, uint16_t Length)

输入输出
名称描述功能
输入1

TIM_HandleTypeDef *htim

定时器句柄地址
输入2uint32_t Channel输出通道
输入3

uint32_t *pData

数据指针
输入4

uint16_t Length

数据长度
输出

HAL_StatusTypeDef

状态

将数据按顺序发给PWM的比较值

每个数据发送一次脉冲后,数据指针自动加,之后再发送下一个脉冲

直到结束,触发DMA中断

 关闭PWM(DMA)

HAL_StatusTypeDef HAL_TIM_PWM_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel)
输入输出
名称描述功能
输入1

TIM_HandleTypeDef *htim

定时器句柄地址
输入2uint32_t Channel输出通道
输出

HAL_StatusTypeDef

状态

调用后会关闭DMA

建议再DMA中断里调用

不然可能出现少了脉冲

PWM+DMA中断回调函数

void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim)
{
    if (htim == &htimx)
    {
    }
}

 每次发送数据结束(所有数据)会触发一次DMA中断

定时器编码器模式

双相计数

HAL设置

 开启编码器模式

HAL_StatusTypeDef HAL_TIM_Encoder_Start(TIM_HandleTypeDef *htim, uint32_t Channel)
输入输出
名称描述功能
输入1

TIM_HandleTypeDef *htim

定时器句柄地址
输入2

Channel

通道
输出

HAL_StatusTypeDef 

状态

通道取值可以是:

TIM_CHANNEL_1

TIM_CHANNEL_2

TIM_CHANNEL_ALL

功能:设置编码器模式通道

之后需要开启定时器中断

 设置计数值

__HAL_TIM_SET_COUNTER(__HANDLE__, __COUNTER__)
输入输出
名称描述功能
输入1__HANDLE__定时器句柄地址
输入2__COUNTER__计数值
输出

void

  获取计数值

__HAL_TIM_GET_COUNTER(__HANDLE__)
输入输出
名称描述功能
输入1__HANDLE__定时器句柄地址
输出

uint32

计数值

外部中断

外部中断回调函数

这个函数是每一个外部中断发生时调用,需要在里面区分中断

需要自己写,名字不能错误

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
    if (GPIO_Pin == GPIO_PIN_x)
    {
        
    }
}

GPIO_PIN_x是外部中断管脚

低功耗停止模式(STOP)

这个是最常用的低功耗模式

由外部中断唤醒

void stop_mode(void)
{
    __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);//清除标志
    HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);//进入停止模式

    //这里放HAL生成的那些初始化函数
}

退出停止模式后默认使用的是内部RC震荡,系统频率可能会改变

懒人方法就是将HAL库在main前面的初始化函数放到这个停止模式的后面即可

退出停止模式后会回到这个地方继续执行

开启FPU和DSP库使用

 cubeMX选择复制所有库 

 导入这个lib文件,位置是在工程的根目录的这里

 

keil的魔术棒界面,这两个改成这个 

同样是keil的魔术棒 

 

 上面这个红框里需要输入下面这个,这是全局宏定义

,__CC_ARM,__TARGET_FPU_VFP,ARM_MATH_CM4

进入箭头所指页面,将这个文件包含进头文件

 

 进入这个文件中

 我们需要将这两个均设为1,跳转到定义更改数值即可

__FPU_PRESENT,__FPU_USED

串口

阻塞模式

发送

HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size, uint32_t Timeout);
输入输出
名称描述功能
输入1

UART_HandleTypeDef *huart

串口句柄地址
输入2

const uint8_t *pData

数据起始的指针
输入3

uint16_t Size

数据长度
输入4

uint32_t Timeout

超时时间
输出

HAL_StatusTypeDef

状态

 选定的串口,从指定的数据位置开始发送指定长度的数据,在超时时间内发送完成则返回成功标志

示例调用

HAL_UART_Transmit(&Print_UART, (uint8_t *)&ch, 1, 0xFFff);

接收 

HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)

输入输出
名称描述功能
输入1

UART_HandleTypeDef *huart

串口句柄地址
输入2

uint8_t *pData

数据起始的指针
输入3

uint16_t Size

数据长度
输入4

uint32_t Timeout

超时时间
输出

HAL_StatusTypeDef

状态

从指定的串口接收指定长度的数据,按照顺序放到指定的位置,如果在超时内接收完成,则返回成功标志

示例调用

HAL_UART_Receive(&Print_UART, &ch, 1, 0xffff);

中断模式

接收

开启中断

HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
输入输出
名称描述功能
输入1

UART_HandleTypeDef *huart

串口句柄地址
输入2

uint8_t *pData

数据起始的指针
输入3

uint16_t Size

数据长度
输出

HAL_StatusTypeDef

状态

从指定串口接收数据,放到指定位置,当接收到指定长度的数据时触发中断

中断回调函数

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	if (huart == &huart1)
	{
		HAL_UART_Receive_IT(&huart1, &Uart_BUF, 1);
	}
}

注意:每次触发中断都需要重新调用HAL_UART_Receive_IT 设置中断

开始时可以在任意位置设置中断

空闲中断(不定长数据接收)

用于接收不定长度的串口数据

当总线没有数据一段时间后,认为总线空闲,触发空闲中断

1.HAL设置 

设置串口,并开启中断

 

2.开启空闲中断接收

如果总线空闲或者长度大于设置时触发中断

HAL_StatusTypeDef HAL_UARTEx_ReceiveToIdle_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
输入输出
名称描述功能
输入1

UART_HandleTypeDef *huart

串口句柄地址
输入2

uint8_t *pData

数据起始的指针
输入3

uint16_t Size

数据长度
输出

HAL_StatusTypeDef

状态

3.空闲中断回调函数

注意,如果要持续接收需要在中断回调函数中再次开启中断接收

uint8_t BUF[100] = {0};
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{
	if (huart == &huart2)
    {
		HAL_UARTEx_ReceiveToIdle_IT(&huart1,BUF,100);
	}
}

 建议使用空闲中断时,使用DMA模式发送数据

DMA模式

发送

发送

HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size)

输入输出
名称描述功能
输入1

UART_HandleTypeDef *huart

串口句柄地址
输入2

uint8_t *pData

数据起始的指针
输入3

uint16_t Size

数据长度
输出

HAL_StatusTypeDef

状态

向串口通过DMA模式发送数据

地址自增和循环模式在软件中设置

 注意:

1.DMA的初始化需要在UART之前(代码)

2.普通模式想要重复发送,需要打开UART中断

 停止DMA发送

HAL_StatusTypeDef HAL_UART_DMAStop(UART_HandleTypeDef *huart)
输入输出
名称描述功能
输入1

UART_HandleTypeDef *huart

串口句柄地址
输出

HAL_StatusTypeDef

状态

 停止DMA发送(循环发送常用)

DMA空闲接收

实现的功能是

使用DMA接收数据,接收到超过指定数量时,或者数据接收完成(触发空闲状态)

触发中断

1.HAL设置 

打开串口接收的DMA,如图设置 

 开启中断

 串口的基础设置

2.程序更改

进入 stm32f1xx_it.c 文件

找到 void USART2_IRQHandler(void) 函数,在其中加入代码

注意将其中的串口设为自己使用的串口

  if (__HAL_UART_GET_FLAG(&huart2, UART_FLAG_IDLE) == SET)//获取空闲中断
  {
    HAL_UART_IRQHandler(&huart2);
  }
  HAL_UART_RxCpltCallback(&huart2);

 3 中断服务函数编写

 使用的中断服务函数是

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)

在内部加入

#define MAX_LEN 10
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
  uint16_t Size = 0;
  uint8_t zj = 0x03;
  if (huart == &huart2)
  {
    HAL_UART_AbortReceive(&huart2);
    if (__HAL_UART_GET_FLAG(&huart2, UART_FLAG_IDLE) == SET) // 空闲中断
    {
      __HAL_UART_CLEAR_IDLEFLAG(&huart2);
      Size = MAX_LEN - __HAL_DMA_GET_COUNTER((&huart2)->hdmarx);
    }
    else
      Size = MAX_LEN;
    //用户代码
    HAL_UART_Receive_DMA(&huart2, UART_Buf, MAX_LEN);
  }
}

 需要事先指定DMA最大接收的数据数量MAX_LEN

接收到的数据量就是Size

如果触发了空闲中断,Size就是计算出来的(最大数据量-剩余空间数量)

4 一开始使用时需要开启空闲中断

  __HAL_UART_ENABLE_IT(&huart2, UART_IT_IDLE);
  HAL_UART_Receive_DMA(&huart2, UART_Buf, MAX_LEN);

注意:初始化中关于DMA的部分要放在USART初始化之前

SPI

阻塞发送接收

HAL_StatusTypeDef HAL_SPI_TransmitReceive(SPI_HandleTypeDef *hspi, uint8_t *pTxData, uint8_t *pRxData, uint16_t Size,uint32_t Timeout);
输入输出
名称描述功能
输入1

SPI_HandleTypeDef *hspi

SPI句柄地址
输入2

uint8_t *pTxData

发送数据起始的指针
输入3

uint8_t *pRxData

接收数据起始的指针
输入4

uint16_t Size

数据长度
输入5

uint32_t Timeout

超时时间
输出

HAL_StatusTypeDef

状态

向指定SPI发送并接受指定长度的数据(SPI是移位的,发送必须接受)

I2C

主机模式阻塞读数据

HAL_StatusTypeDef HAL_I2C_Master_Receive(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout)
输入输出
名称描述功能
输入1

I2C_HandleTypeDef *hi2c

I2C句柄地址
输入2

uint16_t DevAddress

从器件地址
输入3

uint8_t *pData

数据起始的指针
输入4

uint16_t Size

数据长度
输入5

uint32_t Timeout

超时时间
输出

HAL_StatusTypeDef

状态

通过指定的硬件I2C从指定从器件读取数据

主机模式阻塞写数据

HAL_StatusTypeDef HAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout)
输入输出
名称描述功能
输入1

I2C_HandleTypeDef *hi2c

I2C句柄地址
输入2

uint16_t DevAddress

从器件地址
输入3

uint8_t *pData

数据起始的指针
输入4

uint16_t Size

数据长度
输入5

uint32_t Timeout

超时时间
输出

HAL_StatusTypeDef

状态

通过指定的硬件I2C向指定从器件写入数据

主机模式阻塞读寄存器

HAL_StatusTypeDef HAL_I2C_Mem_Read(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout)
输入输出
名称描述功能
输入1

I2C_HandleTypeDef *hi2c

I2C句柄地址
输入2

uint16_t DevAddress

从器件地址
输入3

 uint16_t MemAddress

寄存器地址
输入4

uint16_t MemAddSize

寄存器地址长度
输入5

uint8_t *pData

数据起始的指针
输入6

uint16_t Size

数据长度
输入7

uint32_t Timeout

超时时间
输出

HAL_StatusTypeDef

状态

寄存器地址长度(输入4)可以是以下两个之一

#define I2C_MEMADD_SIZE_8BIT            0x00000001U
#define I2C_MEMADD_SIZE_16BIT           0x00000010U

 通过指定的硬件I2C从指定从器件读取指定寄存器

主机模式阻塞写寄存器

HAL_StatusTypeDef HAL_I2C_Mem_Write(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout)
输入输出
名称描述功能
输入1

I2C_HandleTypeDef *hi2c

I2C句柄地址
输入2

uint16_t DevAddress

从器件地址
输入3

 uint16_t MemAddress

寄存器地址
输入4

uint16_t MemAddSize

寄存器地址长度
输入5

uint8_t *pData

数据起始的指针
输入6

uint16_t Size

数据长度
输入7

uint32_t Timeout

超时时间
输出

HAL_StatusTypeDef

状态

寄存器地址长度(输入4)可以是以下两个之一

#define I2C_MEMADD_SIZE_8BIT            0x00000001U
#define I2C_MEMADD_SIZE_16BIT           0x00000010U

通过指定的硬件I2C向指定从器件写入指定寄存器

ADC

阻塞查询

初始化

1.ADC设置里选择通道

 

 2.图形化界面里添加GPIO模拟

 

 

 3.打开扫描模式和不连续采集

 注意:F4系列要打开这两个

 4.ADC数量设置为需要的数量

5.更改每个通道的设置 

注意:Sampling Time是采集时间,越大误差越低,需要的时间也就越长 

 程序

1.打开ADC

HAL_StatusTypeDef HAL_ADC_Start(ADC_HandleTypeDef* hadc)
输入输出
名称描述功能
输入ADC_HandleTypeDef* hadcADC句柄地址
输出

HAL_StatusTypeDef

状态

2.等待ADC转化完成

HAL_StatusTypeDef HAL_ADC_PollForConversion(ADC_HandleTypeDef* hadc, uint32_t Timeout)
输入输出
名称描述功能
输入ADC_HandleTypeDef* hadcADC句柄地址
输入uint32_t Timeout超时时间
输出

HAL_StatusTypeDef

状态

3.读取值

uint32_t HAL_ADC_GetValue(ADC_HandleTypeDef* hadc)
输入输出
名称描述功能
输入ADC_HandleTypeDef* hadcADC句柄地址
输出uint32_t获取到的值

4.(可选)关闭ADC

HAL_StatusTypeDef HAL_ADC_Stop(ADC_HandleTypeDef* hadc)
输入输出
名称描述功能
输入ADC_HandleTypeDef* hadcADC句柄地址
输出

HAL_StatusTypeDef

状态

注意:
多通道时需要等待所以通道都读取完毕后才能关闭ADC

重新打开时会默认从第一个通道开始转化

注意:

多通道的阻塞转化分次进行

每调用一次之前步骤,都会自动向下移动一位进行转化

如开启了0,1,2三个通道

则第一次获取的是通道0,第二次获取的通道1

DMA模式

HAL设置 

打开ADC通道(根据需要选择单个或多个)

ADC设置

扫描模式开启(多通道)

设置通道数量

设置通道和采样周期

 

 

DMA设置

ADC到内存(默认设置)

模式选择正常模式

内存地址自增,半字节

 中断设置

开启ADC中断(DMA中断默认开)

程序设置

 1.ADC校准(在初始化函数之后,DMA调用之前)

HAL_StatusTypeDef HAL_ADCEx_Calibration_Start(ADC_HandleTypeDef* hadc)
输入输出
名称描述功能
输入ADC_HandleTypeDef* hadcADC句柄地址
输出

HAL_StatusTypeDef

状态

 2.延迟(建议10ms以上)

3.开启DMA模式的ADC转换 

(有几个ADC通道需要这么大的数组,将这个长度输入)

HAL_StatusTypeDef HAL_ADC_Start_DMA(ADC_HandleTypeDef* hadc, uint32_t* pData, uint32_t Length)
输入输出
名称描述功能
输入1ADC_HandleTypeDef* hadcADC句柄地址
输入2

uint32_t* pData

指针(数组地址)
输入3

uint32_t Length

数据长度
输出

HAL_StatusTypeDef

状态

示例调用

uint16_t Buf[4] = {0};
HAL_ADC_Start_DMA(&hadc1, (uint32_t *)&Buf, 4);

 4.ADC转换完成中断设置

(一般是做数据处理或标志位)

(如需要重复采样,则在中断中执行第三步)

中断回调函数 

void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc)
{
  if (hadc == &hadcx)
  {
    HAL_ADC_Start_DMA(&hadc1, (uint32_t *)&Buf, 4);//如需多次采集则使用这句
  }
}

软件复位

__set_FAULTMASK(1);//关中断 
NVIC_SystemReset();//复位

  • 22
    点赞
  • 193
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值