登录/注册

STM32程序 讲解

更多

STM32程序开发讲解(基于HAL库)

核心开发流程

  1. 硬件初始化(时钟、外设)
  2. 外设配置(GPIO、UART、ADC等)
  3. 中断处理(优先级设置、回调函数)
  4. 主循环逻辑
  5. 外设驱动实现

基础示例:LED闪烁(GPIO控制)

#include "stm32f4xx_hal.h"

// LED引脚定义(以STM32F407 Discovery为例)
#define LED_PIN    GPIO_PIN_12
#define LED_PORT   GPIOD

int main(void) {
    // 1. HAL库初始化
    HAL_Init();

    // 2. 系统时钟配置(通常由CubeMX生成)
    SystemClock_Config();

    // 3. GPIO初始化
    GPIO_InitTypeDef GPIO_InitStruct = {0};
    __HAL_RCC_GPIOD_CLK_ENABLE();  // 使能GPIOD时钟

    GPIO_InitStruct.Pin = LED_PIN;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;  // 推挽输出
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    HAL_GPIO_Init(LED_PORT, &GPIO_InitStruct);

    while (1) {
        // 4. LED闪烁逻辑
        HAL_GPIO_TogglePin(LED_PORT, LED_PIN);  // 电平翻转
        HAL_Delay(500);  // 延时500ms
    }
}

关键概念解析

1. 时钟系统(RCC)

// 使能外设时钟(以GPIOA为例)
__HAL_RCC_GPIOA_CLK_ENABLE();

// 系统时钟配置模板(由CubeMX自动生成)
void SystemClock_Config(void) {
    RCC_OscInitTypeDef osc = {0};
    RCC_ClkInitTypeDef clk = {0};

    // 配置HSE(外部高速时钟)
    osc.OscillatorType = RCC_OSCILLATORTYPE_HSE;
    osc.HSEState = RCC_HSE_ON;

    // PLL配置(倍频到168MHz)
    osc.PLL.PLLState = RCC_PLL_ON;
    osc.PLL.PLLSource = RCC_PLLSOURCE_HSE;
    osc.PLL.PLLM = 8;
    osc.PLL.PLLN = 336;
    osc.PLL.PLLP = RCC_PLLP_DIV2;

    HAL_RCC_OscConfig(&osc);

    // 系统时钟树配置
    clk.ClockType = RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK;
    clk.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
    clk.AHBCLKDivider = RCC_SYSCLK_DIV1;
    HAL_RCC_ClockConfig(&clk, FLASH_LATENCY_5);
}

2. 中断处理

// 外部中断配置(按键为例)
void EXTI0_IRQHandler(void) {
    HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);  // 处理中断标志
}

// 中断回调函数
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {
    if(GPIO_Pin == GPIO_PIN_0) {
        HAL_GPIO_TogglePin(LED_PORT, LED_PIN);  // 按键翻转LED
    }
}

3. UART通信示例

UART_HandleTypeDef huart2;

void MX_USART2_UART_Init(void) {
    huart2.Instance = USART2;
    huart2.Init.BaudRate = 115200;
    huart2.Init.WordLength = UART_WORDLENGTH_8B;
    huart2.Init.StopBits = UART_STOPBITS_1;
    huart2.Init.Parity = UART_PARITY_NONE;
    HAL_UART_Init(&huart2);
}

// 发送数据
char msg[] = "Hello STM32!\r\n";
HAL_UART_Transmit(&huart2, (uint8_t*)msg, strlen(msg), HAL_MAX_DELAY);

// 接收中断
HAL_UART_Receive_IT(&huart2, &rx_data, 1);
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
    // 收到数据后的处理
}

4. ADC采样

ADC_HandleTypeDef hadc1;

void MX_ADC1_Init(void) {
    hadc1.Instance = ADC1;
    hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;
    hadc1.Init.Resolution = ADC_RESOLUTION_12B;
    HAL_ADC_Init(&hadc1);
}

// 获取ADC值
uint32_t read_adc(void) {
    ADC_ChannelConfTypeDef sConfig = {0};
    sConfig.Channel = ADC_CHANNEL_0;       // 通道0
    sConfig.Rank = 1;
    HAL_ADC_ConfigChannel(&hadc1, &sConfig);

    HAL_ADC_Start(&hadc1);                 // 启动转换
    HAL_ADC_PollForConversion(&hadc1, 10); // 等待转换完成
    return HAL_ADC_GetValue(&hadc1);       // 读取结果
}

开发工具链

  1. IDE选项

    • STM32CubeIDE(免费官方工具)
    • Keil MDK(商业版)
    • IAR Embedded Workbench(商业版)
  2. 核心开发组件

    • STM32CubeMX:图形化配置工具(生成初始化代码)
    • HAL库:硬件抽象层(跨系列兼容)
    • CMSIS:内核相关标准接口
  3. 调试工具

    • ST-Link调试器
    • J-Link
    • 串口调试助手

最佳实践建议

  1. 使用CubeMX初始化:自动生成时钟/引脚配置

  2. 模块化编程

    // my_gpio.c
    void LED_Init(void) { /* GPIO配置 */ }
    void LED_Toggle(void) { /* 翻转逻辑 */ }
  3. 功耗管理:空闲时进入低功耗模式

    while(1) {
       __WFI();  // 等待中断(睡眠模式)
    }
  4. 使用DMA传输:减轻CPU负担(适用于UART/ADC等大数据量场景)

  5. 错误处理

    HAL_StatusTypeDef status = HAL_UART_Transmit(...);
    if(status != HAL_OK) {
       // 错误处理
    }

调试技巧:利用STM32的ITM机制实现printf重定向:

#include <stdio.h>
int __io_putchar(int ch) {
    ITM_SendChar(ch);
    return ch;
}

通过以上基础框架和示例,可快速构建STM32应用程序。实际开发中建议结合具体芯片手册(Reference Manual)和HAL库文档进行深入开发。

第12章-ADC采集电压和显示 基于STM32的ADC—电压采集(详细讲解+HAL库)

第12章-ADC采集电压和显示 基于STM32的ADC—电压采集(详细讲解+HAL库)

2024-08-21 16:31:34

STM32F103 GPIO内部电路图讲解

STM32F103 GPIO内部电路图讲解

2023-02-01 16:32:14

STM32CUBEIDE步骤讲解

>>UM1718STM32CUBEMX官方中文用户手册>>STM32CUBEIDE步骤结果截图与步骤讲解1:创建工程2:

2022-03-02 06:32:30

通过串口烧写STM32程序的教程方法

如何通过串口烧写STM32程序的教程方法! 用交叉串口线连接开发板和电脑, BOOT0 选择为 1,BOOT1 选择为 0,接上开发板电源,SW1 切换到 ON 打开电源开关。 从开始

资料下载 ah此生不换 2022-03-22 15:39:36

STM32 外部中断实验参考程序

STM32 外部中断实验程序,供STM32初学者参考。

资料下载 郑兵 2021-12-30 10:46:50

基于STM32f103的FFT频率测试程序下载

基于STM32f103的FFT频率测试程序下载

资料下载 shyshyshy 2021-08-02 10:07:20

XML HttpRequest的详细程序讲解

本文档的主要内容详细介绍的是XML HttpRequest的详细程序讲解

资料下载 佚名 2019-10-31 15:09:29

使用51单片机进行智能家居的设计项目讲解程序免费下载

本文档的主要内容详细介绍的是使用51单片机进行智能家居的设计项目讲解和程序免费下载。

资料下载 名士流 2019-08-08 17:33:00

主要讲解STM32的外部中断以及使用STM32CubeMX编写中断程序

STM32CubeMX教程(二)2021.10.27简介本次主要讲解STM32的外部中断以及使用

2022-01-13 08:21:16

stm32用什么软件写程序

stm32用什么软件写程序?STM32单片机在编程时可以使用库函数和使用配置寄存器的方式来进行

2021-09-21 16:00:00

STM32Cube用法以及自动生成的代码讲解

文章目录前言操作步骤打开软件新建工程配置时钟配置GPIO生成源代码编写代码实验验证源码讲解delay相关while循环自动生成前言本文主要介绍STM32Cube用法以及自动生成的代码

2021-08-10 06:21:28

STM32_ USART输入输出的讲解

STM32_USART输入输出的讲解

2020-04-08 10:46:26

浅谈STM32控制IO基本配置的讲解

STM32控制IO基本配置的讲解

2020-04-08 09:24:23

STM32工作的自举程序 你了解多少?

STM32自举程序,你了解多少?

2020-03-03 11:07:34

关于STM32开发工具之STM Studio调试和诊断工具讲解

STM32开发工具之STM Studio调试和诊断工具讲解

2020-03-01 11:56:41

7天热门专题 换一换
相关标签