STM32的HAL编码流程总结(上部)

目录

一、GPIO

1.选择调试类型

在SYS中Debug选择Serial Wire模式

2.选择时钟源

在RCC中将HSE和LSH都选择为内部晶振

3.时钟树配置

4.GPIO配置

在芯片图上选择开启的引脚和其功能

配置引脚的各自属性

5.工程文件配置

配置工程文件的名字,位置等

Toolchain/IDE:选择用于调试的工具,生成对应的文件

选择"仅添加重要库"和"生成对应.c/.h文件",最后点击GENERATE CODE生成文件

二、中断系统

1.选择调试类型

在SYS中Debug选择Serial Wire模式

2.选择时钟源

在RCC中将HSE和LSH都选择为内部晶振

3.时钟树配置

4.GPIO配置

引脚的复用选择

引脚属性的配置

5.NVIC的配置

引脚开启NVIC

配置中断的优先级

6.工程文件配置

配置工程文件的名字,位置等

选择"仅添加重要库"和"生成对应.c/.h文件",最后点击GENERATE CODE生成文件

7.重写回调函数

重写中断服务函数中调用的回调函数

cpp 复制代码
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
    if (GPIO_Pin == GPIO_PIN_10)
    {
        HAL_Delay(15);
        // 防抖: 延迟15ms之后再次检测是否仍然是高电平,
        if (HAL_GPIO_ReadPin(GPIOF, GPIO_Pin) == GPIO_PIN_SET)
        {
            HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_0);
        }
    }
}

三、USART串口通信

1.选择调试类型

在SYS中Debug选择Serial Wire模式

2.选择时钟源

在RCC中将HSE和LSH都选择为内部晶振

3.时钟树配置

4.USART配置

通过开启USART功能,HAL库能自动配置相应的GPIO

属性配置

开启中断

5.工程文件配置

配置工程文件的名字,位置等

选择"仅添加重要库"和"生成对应.c/.h文件",最后点击GENERATE CODE生成文件

6.重写回调函数

cpp 复制代码
uint8_t rxBuff[1000]; // 接收缓冲区
// Size 是实际接收的数据的长度
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size) 
{
    if (huart1.Instance == USART1)
    {
        HAL_UART_Transmit(&huart1, rxBuff, Size, HAL_MAX_DELAY);
        HAL_UARTEx_ReceiveToIdle_IT(&huart1, rxBuff, 1000);
    }
}

四、I2C通信

1.选择调试类型

在SYS中Debug选择Serial Wire模式

2.选择时钟源

在RCC中将HSE和LSH都选择为内部晶振

3.时钟树配置

4.I2C配置

I2C选择为I2C

5.I2C发送和读取

cpp 复制代码
//ADDR为该外设模块的读取指令地址
#define ADDR 0xA0
uint8_t innerAddr = 0x00;
//I2C初始配置
MX_I2C2_Init();
//向0x00地址中写入
HAL_I2C_Mem_Write(&hi2c2,ADDR,innerAddr,I2C_MEMADD_SIZE_8BIT, &byte, 1, 2000);
//读取0x00地址中
HAL_I2C_Mem_Read(&hi2c2, ADDR + 1, innerAddr, I2C_MEMADD_SIZE_8BIT, &byte, 1, 2000);

五、定时器

1.选择调试类型

在SYS中Debug选择Serial Wire模式

2.选择时钟源

在RCC中将HSE和LSH都选择为内部晶振

3.时钟树配置

4.通用定时器配置


5.工程文件配置

配置工程文件的名字,位置等

选择"仅添加重要库"和"生成对应.c/.h文件",最后点击GENERATE CODE生成文件

6.定时器运用

使用通用定时器不断改变PWM的占空比,可以实现呼吸灯等效果

cpp 复制代码
//添加修改占空比的函数
void setDutyCycle(uint16_t dutyCycle)
{
    // 设置捕获比较寄存器的值
    __HAL_TIM_SetCompare(&htim5, TIM_CHANNEL_2, dutyCycle);
}

void main(){
	MX_TIM5_Init();
    HAL_TIM_PWM_Start(&htim5, TIM_CHANNEL_2);

    uint8_t dutyCycle = 1;
    int8_t step = 1;
    while (1)
    {
        if (dutyCycle <= 0 || dutyCycle >= 99)
        {
            step = -step;
        }
        dutyCycle += step;
        setDutyCycle(dutyCycle);
        HAL_Delay(10);
    }
}
相关推荐
hsjiasb3 小时前
FreeRTOS学习(二十六)——动态内存管理heap_1到heap_5
stm32·单片机·学习·学习笔记·freertos
LCG元4 小时前
STM32+ESP8266+MQTT 物联网气象站:从零搭建温湿度远程监测系统(附完整源码)
stm32·物联网·struts
FakeOccupational6 小时前
【电路笔记 STM32】Cortex-M7 内核上的数据缓存(D-Cache)结构+MPU+DMA&Cache+STM32CubeMX配置
笔记·stm32·缓存
殷忆枫6 小时前
基于K210与STM32的智能垃圾分类与物联网监管系统
stm32·物联网·分类
周洲08307 小时前
STM32 GPIO 外部中断深度解析:边沿触发 / 电平触发、NVIC 优先级配置、中断嵌套实战
stm32·单片机·嵌入式硬件
LCG元7 小时前
STM32F103 CAN 总线通信实战:标准库双机通信与过滤器配置精讲
stm32·单片机·嵌入式硬件
zlinear数据采集卡8 小时前
D223的PWM电机控制:6路独立脉冲+加减速算法深度解析
arm开发·stm32·嵌入式硬件·算法·fpga开发·架构
Kuakewei8889 小时前
平芯微42V热拔插OVP过压保护芯片:PW1600
嵌入式硬件
ACP广源盛139246256739 小时前
WAIC2026 国产超节点算力浪潮下@ACP#IX9104 在算力矩阵中的定位与落地场景
大数据·数据库·人工智能·嵌入式硬件·线性代数·矩阵
z20348315209 小时前
STM32单片机控制无源蜂鸣器播放《晴天》
stm32·单片机·嵌入式硬件