当前位置: 首页 > article >正文

常用HAL库

宏定义

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

http://www.kler.cn/a/543546.html

相关文章:

  • C语言:目标文件和可执行文件里面都有什么?
  • 如何保证缓存和数据库一致性
  • 基于MATLAB的沥青试样孔隙率自动分析——原理详解与代码实现
  • 【Python】集合
  • 云原生时代的后端开发:架构、工具与最佳实践
  • DeepSeek帮助做【真】软件需求-而不是批量刷废话
  • 【05】RUST常用的集合函数宏类型
  • 通过openresty和lua实现随机壁纸
  • 人工智能代理(AI Agent)的演进与未来:技术突破、应用场景与挑战
  • HbuilderX中如何配置npm和node路径
  • 大数据Orc文件生成与读取
  • 3D模型可视化引擎HOOPS Visualize在桌面端的支持有哪些特点?
  • C 语言 static 变量和函数
  • MyBatis Plus与JSON字段查询:动态构建JSON条件
  • 细究 ES6 中多种遍历对象键名方式的区别
  • 基于Spring Boot和MyBatis的后端主键分页查询接口示例
  • DeepSeek-R1-技术文档
  • 基于 MATLAB 的粒子滤波算法实现示例,用于处理手机传感器数据并估计电梯运行参数。
  • github - 使用
  • Android和DLT日志系统
  • 云原生时代的开发利器
  • Spring Boot过滤器链:从入门到精通
  • AWTK fscript 中的 TCP/UDP 客户端扩展函数
  • 使用Python爬虫获取淘宝item_search_tmall API接口数据
  • 压缩stl文件大小
  • Go语言开发桌面应用基础框架(wails v3)-开箱即用框架