【HAL库】STM32 HAL库学习笔记

1、系统时钟

一般用STM32CUBE生成,用户只需要会用STM32CUBE就行。

2、GPIO输出
void LED_GPIO_Config(void)
{
    GPIO_InitTypeDef  GPIO_InitStruct;
   	
    __HAL_RCC_GPIOF_CLK_ENABLE(); 							//打开GPIO时钟
    												   
    GPIO_InitStruct.Pin = GPIO_PIN_7;	
    GPIO_InitStruct.Mode  = GPIO_MODE_OUTPUT_PP;  			//输出模式
    GPIO_InitStruct.Pull  = GPIO_PULLUP;					
    GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
    
    HAL_GPIO_Init(GPIOF, &GPIO_InitStruct);					//初始化GPIO
    
  	HAL_GPIO_WritePin(GPIOF, GPIO_PIN_7, GPIO_PIN_SET);		//拉高GPIO
  	HAL_GPIO_WritePin(GPIOF, GPIO_PIN_7, GPIO_PIN_RESET);	//拉低GPIO
	HAL_GPIO_TogglePin(GPIOF, GPIO_PIN_7);					//翻转GPIO
}
3、GPIO输入
void Key_GPIO_Config(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    
    __HAL_RCC_GPIOA_CLK_ENABLE();							//打开GPIO时钟
    
    GPIO_InitStructure.Pin = GPIO_PIN_A; 					
    GPIO_InitStructure.Mode = GPIO_MODE_INPUT; 				//输入模式
    GPIO_InitStructure.Pull = GPIO_NOPULL;

    HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);				//初始化GPIO
	HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1);					//读取GPIO电平
}
4、外部中断
void EXTI_Key_Config(void)
{
    GPIO_InitTypeDef GPIO_InitStructure; 

    __HAL_RCC_GPIOA_CLK_ENABLE();							//打开GPIO时钟

    GPIO_InitStructure.Pin = GPIO_PIN_1;
    GPIO_InitStructure.Mode = GPIO_MODE_IT_RISING;	    	//中断、上升沿模式
    GPIO_InitStructure.Pull = GPIO_NOPULL;		
    
    HAL_GPIO_Init(GPIOA, &GPIO_InitStructure); 				//初始化GPIO
    
    HAL_NVIC_SetPriority(EXTI0_IRQn, 0, 0);					//配置EXTI0中断源 到PA0引脚、配置中断优先级
    HAL_NVIC_EnableIRQ(EXTI0_IRQn);							//使能中断
}

void EXTI0_IRQHandler(void)									//中断处理函数
{
	if(__HAL_GPIO_EXTI_GET_IT(GPIO_PIN_0) != RESET) 		//获取中断源
	{
		__HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_0);     			//清除中断源
	}  	
}
5、系统定时器SysTick
HAL_SYSTICK_Config(SystemCoreClock / 1000); 				//1ms中断一次
/* 该函数会自动帮我们打开系统嘀嗒中断,设置好中断优先级,并打开定时器 */
6、USART串口通信
void HAL_UART_MspInit(UART_HandleTypeDef *huart)
{  
	GPIO_InitTypeDef  GPIO_InitStruct;

	__HAL_RCC_GPIOA_CLK_ENABLE();							//打开GPIO时钟
	__HAL_RCC_USART1_CLK_ENABLE();							//打开串口外设时钟
	
	GPIO_InitStruct.Pin = GPIO_PIN_9;
	GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;					//配置Tx引脚为复用功能
	GPIO_InitStruct.Pull = GPIO_PULLUP;
	GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
	GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
	HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
	
	
	GPIO_InitStruct.Pin = GPIO_PIN_10;		
	GPIO_InitStruct.Alternate = GPIO_AF7_USART1;			//配置Rx引脚为复用功能
	HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); 
	
	HAL_NVIC_SetPriority(USART1_IRQn,0,1);					//抢占优先级0,子优先级1
	HAL_NVIC_EnableIRQ(USART1_IRQn);		    			//使能USART1中断通道  
}

UART_HandleTypeDef UartHandle;
void DEBUG_USART_Config(void)
{
	UartHandle.Instance          = USART1;			
	UartHandle.Init.BaudRate     = 115200;
	UartHandle.Init.WordLength   = UART_WORDLENGTH_8B;
	UartHandle.Init.StopBits     = UART_STOPBITS_1;
	UartHandle.Init.Parity       = UART_PARITY_NONE;
	UartHandle.Init.HwFlowCtl    = UART_HWCONTROL_NONE;
	UartHandle.Init.Mode         = UART_MODE_TX_RX;
	
	HAL_UART_Init(&UartHandle);								//初始化串口:该函数会回调HAL_UART_MspInit
	
	__HAL_UART_ENABLE_IT(&UartHandle,UART_IT_RXNE);  		//使能串口接收断
}

void USART1_Send_Data(uint8_t *buffer, uint16_t len)		//发送数据
{
	HAL_UART_Transmit(&UartHandle,(uint8_t *)(buffer), len, 1000);
}

void USART1_IRQHandler(void)								//中断接收数据
{
	uint8_t ch; 
	
	if(__HAL_UART_GET_FLAG( &UartHandle, UART_FLAG_RXNE ) != RESET)
	{		
		ch = (uint16_t)READ_REG(UartHandle.Instance->DR);
	}
}
6、基本定时器
TIM_HandleTypeDef htim6;
uint32_t delay_ms_timer; 

void HAL_TIM6_Init(void)
{
	__HAL_RCC_TIM6_CLK_ENABLE();			//定时器时钟使能

	htim6.Instance = TIM6;
	htim6.Init.Prescaler = 71;				//72分频:定时器计数时钟为1MHz,也就是1us
	htim6.Init.Period = 1000;				//1000*1us,定时时间为1ms
	HAL_TIM_Base_Init(&htim6);				//初始化定时器

    HAL_NVIC_SetPriority(TIM6_IRQn, 1, 0);	//设置定时器中断优先级
    HAL_NVIC_EnableIRQ(TIM6_IRQn);			//使能定时器中断

	HAL_TIM_Base_Start_IT(&htimx);			//打开定时器
}

void delay_ms(uint32_t ms)
{
	delay_ms_timer = ms;
	while(delay_ms_timer > 0);
}

void TIM6_IRQHandler(void)
{
  if (__HAL_TIM_GET_FLAG(htim6, TIM_FLAG_UPDATE) != RESET)		//如果是更新中断
  {
    if (__HAL_TIM_GET_IT_SOURCE(htim6, TIM_IT_UPDATE) != RESET) //如果更新中断被打开
    {
      __HAL_TIM_CLEAR_IT(htim6, TIM_IT_UPDATE);					//清除更新中断
      if( delay_ms_timer > 0 )
		delay_ms_timer--;
    }
  }
}

你可能感兴趣的:(STM32)