找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4575|回复: 3
收起左侧

STM32F103-hal库函数

[复制链接]
ID:423265 发表于 2019-6-14 08:41 | 显示全部楼层 |阅读模式
1.      HAL_GPIO_Init:初始化我们需要用到的引脚的工作模式,包括具体引脚的工作速度、是否复用模式、上下拉等等参数。
void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef*GPIO_Init)

2.      HAL_GPIO_DeInit:将初始化之后的引脚恢复成默认的状态--各个寄存器复位时的值
       void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx,uint32_t GPIO_Pin)
例:HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9|GPIO_PIN_10);
3.     HAL_GPIO_ReadPin:读取我们想要知道的引脚的电平状态、函数返回值为0或1。
GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef*GPIOx, uint16_t GPIO_Pin)
例:GPIO_PinState pinState;
pin_State = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_9);

4.     HAL_GPIO_WritePin:给某个引脚写0或1,但是不要理解成,写1就是使能之类的意思,有些寄存器写1是擦除的意思
voidHAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinStatePinState)
例:#define  LED_G(x)     HAL_GPIO_WritePin(GPIOC, GPIO_PIN_15,
(x) ? GPIO_PIN_SET :GPIO_PIN_RESET)  //配置引脚的初始化电平

5.     HAL_GPIO_TogglePin:翻转某个引脚的电平状态
voidHAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
例:HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_9);

6.     HAL_GPIO_LockPin:如果一个管脚的当前状态是1,读管脚值使用锁定,当这个管脚电平变化时保持锁定时的值,直到重置才改变
HAL_StatusTypeDefHAL_GPIO_LockPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
例:HAL_StatusTypeDef  hal_State;
       hal_State = HAL_GPIO_LockPin(GPIOC, GPIO_PIN_9);

7.     HAL_GPIO_EXTI_IRQHandler:这个函数是外部中断服务函数,用来响应外部中断的触发,函数实体里面有两个功能,1是清除中断标记位,2是调用下面要介绍的回调函数。实际调用的是下边的中断回调函数
voidHAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)
例:HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_3);

8.     HAL_GPIO_EXTI_Callback:中断回调函数,可以理解为中断函数具体要响应的动作。
voidHAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
例:HAL_GPIO_EXTI_Callback(GPIO_Pin);
9.     使能时钟
/*
       使能时钟A、B、C、D
       这里使能时钟的方法与标准库不一样,HAL库其实是宏定义,标准库则是函数。
*/
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
__HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_GPIOD_CLK_ENABLE();

10.  HAL_GetTick:获取系统当前运行时间,返回uint32_t类型,时间为毫秒ms。
__weak uint32_t HAL_GetTick(void)
__weak修饰符:“弱函数”
加上了__weak 修饰符的函数,用户可以在用户文件中重新定义一个同名函数,最终编译器编译的时候,会选择用户定义的函数,如果用户没有重新定义这个函数,那么编译器就会执行__weak 声明的函数,并且编译器不会报错。
__weak 在回调函数的时候经常用到。这样的好处是,系统默认定义了一个空的回调函数,保证编译器不会报错。同时,如果用户自己要定义用户回调函数,那么只需要重新定义即可,不需要考虑函数重复定义的问题,使用非常方便,在 HAL 库中__weak关键字被广泛使用。

11.  HAL_Delay:Delay延时,单位毫秒ms。
__weak void HAL_Delay(__IO uint32_t Delay)
例:HAL_Delay(500); //延时500ms

12.  HAL_UART_Transmit:串口发送数据
HAL_StatusTypeDefHAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size,uint32_t Timeout)
例:HAL_UART_Transmit(&huart1, MyRxData, 15,100); //发送串口1数据
参数:串口,数据,大小,超时时间

13.  HAL_UART_Receive:串口接收数据
HAL_StatusTypeDefHAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size,uint32_t Timeout)
例:HAL_UART_Receive(&huart1, MyRxData1, 15,100)//接收串口1数据
参数:串口,数据,大小,超时时间

14.  HAL_ADC_Start:开启ADC转换
HAL_StatusTypeDefHAL_ADC_Start(ADC_HandleTypeDef* hadc)
例:HAL_ADC_Start(&hadc1);  //hadc1ADC_HandleTypeDef变量


15.  HAL_ADC_PollForConversion:等待ADC转换完成
HAL_StatusTypeDefHAL_ADC_PollForConversion(ADC_HandleTypeDef* hadc, uint32_t Timeout)
例:if (HAL_ADC_PollForConversion(&hadc1, 100)== HAL_OK)   //第二个参数表示超时时间,单位ms

16.  HAL_ADC_GetValue:获取ADC转换数据
uint32_t HAL_ADC_GetValue(ADC_HandleTypeDef*hadc)
例:KeyADCVal =(WORD)HAL_ADC_GetValue(&hadc1);

17.  HAL_ADC_Stop:停止ADC转换
HAL_StatusTypeDefHAL_ADC_Stop(ADC_HandleTypeDef* hadc)
例:HAL_ADC_Stop(&hadc1);

18.  HAL_SPI_Transmit:SPI发送
HAL_StatusTypeDefHAL_SPI_Transmit(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size,uint32_t Timeout)
例:HAL_SPI_Transmit(&hspi1, data, 2, 100);//SPI发送data2个字节,100ms超时
19.  HAL_SPI_Receive:SPI接收
HAL_StatusTypeDefHAL_SPI_Receive(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size,uint32_t Timeout)
例:while(HAL_SPI_Receive(&hspi1,data, 1, 100) != HAL_OK)//接收1个字节,100ms超时

20.  HAL_SPI_TransmitReceive:SPI发送和接收
HAL_StatusTypeDef HAL_SPI_TransmitReceive(SPI_HandleTypeDef*hspi, uint8_t *pTxData, uint8_t *pRxData, uint16_t Size, uint32_t Timeout)
例://SPI发送/接收数据,tx_data:发送数据;rx_data:接收数据,100ms超时
HAL_SPI_TransmitReceive(&hspi1, tx_data,rx_data, 2, 100);

21.  HAL_I2C_Master_Transmit:I2C主机发送数据
HAL_StatusTypeDefHAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t*pData, uint16_t Size, uint32_t Timeout)
例:IIC根据地质发送数据到不同的设备
HAL_I2C_Master_Transmit(&hi2c1, 0x78,data0, 1, 100); //主机发送数据

22.  HAL_I2C_Master_Receive:I2C主机接收数据
HAL_StatusTypeDefHAL_I2C_Master_Receive(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t*pData, uint16_t Size, uint32_t Timeout)
例:HAL_I2C_Master_Receive(&hi2c1, 0x78,data1, 1, 100); //主机接收数据

23.  HAL_I2C_Slave_Transmit:I2C从机发送数据
HAL_StatusTypeDef HAL_I2C_Slave_Transmit(I2C_HandleTypeDef*hi2c, uint8_t *pData, uint16_t Size, uint32_t Timeout)
例:HAL_I2C_Slave_Transmit(&hi2c1, data0, 1,100); //发送数据data0

24.  HAL_I2C_Slave_Receive:I2C从机接收数据
HAL_StatusTypeDefHAL_I2C_Slave_Receive(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size,uint32_t Timeout)
例:if(HAL_I2C_Slave_Receive(&hi2c1,data1, 1, 100) == HAL_OK) //判断是否接收到数据

25.  HAL_I2C_Mem_Write:I2C设备寄存器写数据
HAL_StatusTypeDefHAL_I2C_Mem_Write(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_tMemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_tTimeout)
例://*hi2c: I2C设备号指针,这里用的是I2C1: &hi2c1
//DevAddress: 设备地址;MemAddress: 寄存器地址;MemAddSize: 寄存器长度;
//*pData: 数据指针;Size: 数据长度;Timeout: 超时时间
HAL_I2C_Mem_Write(&hi2c1, 0x78, 0X00, 1,data0, 1, 100); //写数据

26.  HAL_I2C_Mem_Read:I2C设备寄存器读数据
HAL_StatusTypeDefHAL_I2C_Mem_Read(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_tMemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_tTimeout)
例://*hi2c: I2C设备号指针,这里用的是I2C1: &hi2c1
//DevAddress: 设备地址;MemAddress: 寄存器地址;MemAddSize: 寄存器长度;
//*pData: 数据指针;Size: 数据长度;Timeout: 超时时间
HAL_I2C_Mem_Read(&hi2c1, 0x78, 0X00, 1,data1, 1, 100); //读数据
27.  HAL_IWDG_Refresh:独立看门狗数据重装函数
独立看门狗使用,独立看门狗时钟采用与RTC公用的40KHz的时钟,与系统时钟分开,即使系统时钟挂了,看门狗还是可以工作
例:HAL_IWDG_Refresh(&hiwdg); //重装看门狗数据为4095.

28.  三种编程方式
  HAL库对所有的函数模型也进行了统一。在HAL库中,支持三种编程模式:轮询模式、中断模式、DMA模式(如果外设支持)。其分别对应如下三种类型的函数(以ADC为例):
HAL_StatusTypeDefHAL_ADC_Start(ADC_HandleTypeDef* hadc);
HAL_StatusTypeDefHAL_ADC_Stop(ADC_HandleTypeDef* hadc);

HAL_StatusTypeDef HAL_ADC_Start_IT(ADC_HandleTypeDef*hadc);
HAL_StatusTypeDefHAL_ADC_Stop_IT(ADC_HandleTypeDef* hadc);

HAL_StatusTypeDefHAL_ADC_Start_DMA(ADC_HandleTypeDef* hadc, uint32_t* pData, uint32_t Length);
HAL_StatusTypeDef  HAL_ADC_Stop_DMA(ADC_HandleTypeDef* hadc);
  其中,带_IT的表示工作在中断模式下;带_DMA的工作在DMA模式下(注意:DMA模式下也是开中断的);什么都没带的就是轮询模式(没有开启中断的)。

29.  HAL_RCC_OscConfig:根据RCC_OscInitTypeDef结构体中指定的参数初始化RCC振荡器
HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef  *RCC_OscInitStruct)
例:ret=HAL_RCC_OscConfig(&RCC_OscInitStructure);//初始化,RCC_OscInitTypeDef指针
RCC_OscInitTypeDef结构体:
typedef struct
{
  uint32_t OscillatorType; //①选定将被配置的振荡器        
  uint32_t HSEState;    //②HSE状态              
  uint32_t LSEState;    //③LSE状态            
  uint32_t HSIState;    //④HSI状态            
  uint32_t HSICalibrationValue;  //⑤HSI校准调整值  
  uint32_t LSIState;       //⑥LSI状态         

#if defined(RCC_HSI48_SUPPORT)
  uint32_t HSI48State; //⑦HSI状态,#if defined(RCC_HSI48_SUPPORT)            
#endif

  uint32_t MSIState;      //⑧,MSI状态              
  uint32_t MSICalibrationValue; //⑨,MSI校准调整值  
  uint32_t MSIClockRange;   //⑩,MSI频率范围      
  RCC_PLLInitTypeDef PLL;   //⑾,PLL结构体参数         
} RCC_OscInitTypeDef;

30.  HAL_RCC_ClockConfig:根据RCC_ClkInitTypeDef结构体中指定的参数初始化CPU、AHB(系统总线)和APB(外围总线)总线时钟
HAL_StatusTypeDefHAL_RCC_ClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, uint32_t FLatency)
例:ret=HAL_RCC_ClockConfig(&RCC_ClkInitStructure,FLASH_LATENCY_2);  //同时设置FLASH延时周期为2WS,也就是3个CPU周期。
RCC_ClkInitTypeDef结构体:
typedefstruct
{
  uint32_tClockType;       //①,选定将被配置的时钟            
  uint32_tSYSCLKSource;     //②,用作系统时钟的时钟源选择         
  uint32_tAHBCLKDivider;    //③,AHB时钟(HCLK)分频器,该时钟由SYSCLK而来      
  uint32_tAPB1CLKDivider;    //④,APB1时钟(PCLK1)分频器,该时钟由HCLK而来      
  uint32_tAPB2CLKDivider;    //⑤,APB2时钟(PCLK2)分频器,该时钟由HCLK而来      
}RCC_ClkInitTypeDef;
回复

使用道具 举报

ID:525821 发表于 2019-6-15 05:59 | 显示全部楼层
用着方便,谢谢。
回复

使用道具 举报

ID:595380 发表于 2019-8-7 10:20 | 显示全部楼层
thanks
回复

使用道具 举报

ID:584195 发表于 2021-8-11 07:20 | 显示全部楼层
期待楼主多出教程,学习了,谢谢!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表