常用HAL库

发布于:2025-02-16 ⋅ 阅读:(40) ⋅ 点赞:(0)

宏定义

#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 */