【STM32HAL库】常用功能备忘
自用HAL库常用功能备忘,不定时更新(用到哪写哪)
目录
GPIO
写
void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
名称 | 描述 | 功能 |
输入1 | GPIO_TypeDef* GPIOx | GPIO组 |
输入2 | uint16_t GPIO_Pin | GPIO管脚 |
输入3 | GPIO_PinState 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组 |
输入2 | uint16_t GPIO_Pin | GPIO管脚 |
输出 | 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 | 定时器句柄地址 |
输入2 | uint32_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 | 定时器句柄地址 |
输入2 | uint32_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 | 定时器句柄地址 |
输入2 | uint32_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 | 定时器句柄地址 |
输入2 | uint32_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* hadc | ADC句柄地址 |
输出 | HAL_StatusTypeDef | 状态 |
2.等待ADC转化完成
HAL_StatusTypeDef HAL_ADC_PollForConversion(ADC_HandleTypeDef* hadc, uint32_t Timeout)
名称 | 描述 | 功能 |
输入 | ADC_HandleTypeDef* hadc | ADC句柄地址 |
输入 | uint32_t Timeout | 超时时间 |
输出 | HAL_StatusTypeDef | 状态 |
3.读取值
uint32_t HAL_ADC_GetValue(ADC_HandleTypeDef* hadc)
名称 | 描述 | 功能 |
输入 | ADC_HandleTypeDef* hadc | ADC句柄地址 |
输出 | uint32_t | 获取到的值 |
4.(可选)关闭ADC
HAL_StatusTypeDef HAL_ADC_Stop(ADC_HandleTypeDef* hadc)
名称 | 描述 | 功能 |
输入 | ADC_HandleTypeDef* hadc | ADC句柄地址 |
输出 | 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* hadc | ADC句柄地址 |
输出 | HAL_StatusTypeDef | 状态 |
2.延迟(建议10ms以上)
3.开启DMA模式的ADC转换
(有几个ADC通道需要这么大的数组,将这个长度输入)
HAL_StatusTypeDef HAL_ADC_Start_DMA(ADC_HandleTypeDef* hadc, uint32_t* pData, uint32_t Length)
名称 | 描述 | 功能 |
输入1 | ADC_HandleTypeDef* hadc | ADC句柄地址 |
输入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();//复位
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)