宏定义
#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;} elsereturn 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 */