问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

STM32单片机入门指南:从基础概念到编程实战

创作时间:
作者:
@小白创作中心

STM32单片机入门指南:从基础概念到编程实战

引用
CSDN
1.
https://blog.csdn.net/RL2698853114/article/details/144943471

STM32单片机是基于ARM Cortex-M系列处理器的一类微控制器,广泛应用于各种嵌入式系统中。对于新手小白来说,学习STM32单片机不仅可以帮助你掌握微控制器的基本原理和应用,还能为你日后从事嵌入式系统开发打下坚实的基础。本文将从基础概念、开发环境搭建、编程入门到常见问题解决等方面,为你提供一个系统的学习指南。

一、基础概念

1.1 STM32单片机简介

STM32单片机是由STMicroelectronics(意法半导体)公司推出的一系列32位微控制器。它们基于ARM Cortex-M系列处理器架构,具有高性能、低功耗、丰富的外设接口等特点。STM32系列单片机按照性能和功能的不同,分为多个系列,如F系列、L系列、G系列等,每个系列又包含多个型号,以满足不同应用场景的需求。

1.2 ARM Cortex-M系列处理器

ARM Cortex-M系列处理器是专为嵌入式市场设计的处理器架构,具有以下特点:

  • 低功耗:采用低功耗设计,适合电池供电的便携式设备。
  • 高性能:提供高性能的处理能力,满足复杂应用的需求。
  • 实时性:具有快速中断响应能力,适合实时控制系统。
  • 易于开发:提供丰富的开发工具和软件库,简化开发过程。

1.3 微控制器的基本组成

微控制器(MCU)是一种集成了处理器、存储器、输入/输出接口等组件的集成电路芯片。STM32单片机的基本组成包括:

  • 处理器:负责执行程序指令,如ARM Cortex-M系列处理器。
  • 存储器:包括只读存储器(ROM)、随机存取存储器(RAM)等,用于存储程序代码和数据。
  • 输入/输出接口:如通用输入/输出(GPIO)、串口通信(UART)、模数转换(ADC)等,用于与外部设备进行数据交换。
  • 其他外设:如定时器、看门狗、电源管理等,提供辅助功能。

二、开发环境搭建

2.1 选择开发板

对于新手小白来说,选择一款适合学习的STM32开发板非常重要。以下是一些建议:

  • 官方开发板:如ST官方推出的STM32F103C8T6等,具有良好的兼容性和官方技术支持。
  • 第三方开发板:市面上有许多第三方厂商生产的STM32开发板,如正点原子、野火等,它们通常具有丰富的外设接口和良好的学习资料支持。

2.2 安装开发软件

开发STM32单片机需要使用专门的集成开发环境(IDE)。以下是一些常用的开发软件:

  • Keil uVision:Keil uVision是一款功能强大的集成开发环境,支持多种ARM Cortex-M系列处理器。它提供了代码编辑、编译、调试等功能,并且拥有丰富的软件库和示例代码。
  • STM32CubeIDE:STM32CubeIDE是ST官方推出的集成开发环境,专为STM32系列单片机设计。它集成了代码生成器、编译器、调试器等工具,并且提供了丰富的外设配置向导和软件库,非常适合初学者使用。

2.3 配置开发环境

在安装好开发软件后,需要进行相应的配置,以确保能够顺利地进行STM32单片机的开发。以下是一些基本的配置步骤:

  • 设置项目:在开发软件中创建一个新的项目,并选择相应的STM32型号和开发板。
  • 配置外设:根据项目需求,使用外设配置向导或手动编写代码来配置STM32单片机的外设,如GPIO、UART等。
  • 下载驱动:如果使用的是第三方开发板,可能需要下载相应的驱动程序,以便开发软件能够识别和连接开发板。

三、编程入门

3.1 GPIO编程

通用输入/输出(GPIO)是STM32单片机的基本外设之一,用于实现数字信号的输入和输出。以下是一个简单的GPIO编程示例,实现LED灯的闪烁功能:

#include "stm32f1xx_hal.h"

// 初始化GPIO
void GPIO_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStruct = {0};
    // 启用GPIO时钟
    __HAL_RCC_GPIOC_CLK_ENABLE();
    // 配置GPIO模式和输出类型
    GPIO_InitStruct.Pin = GPIO_PIN_13;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
}

int main(void)
{
    // 初始化HAL库
    HAL_Init();
    // 系统时钟初始化
    SystemClock_Config();
    // 初始化GPIO
    GPIO_Init();
    while (1)
    {
        // 点亮LED灯
        HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET);
        // 延时
        HAL_Delay(500);
        // 熄灭LED灯
        HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);
        // 延时
        HAL_Delay(500);
    }
}

3.2 UART编程

串口通信(UART)是STM32单片机常用的通信方式之一,用于实现与计算机或其他设备的数据交换。以下是一个简单的UART编程示例,实现STM32单片机与计算机的串口通信:

#include "stm32f1xx_hal.h"

// 初始化UART
void UART_Init(void)
{
    UART_HandleTypeDef huart2;
    GPIO_InitTypeDef GPIO_InitStruct = {0};
    // 启用UART时钟和GPIO时钟
    __HAL_RCC_USART2_CLK_ENABLE();
    __HAL_RCC_GPIOA_CLK_ENABLE();
    // 配置UART GPIO
    GPIO_InitStruct.Pin = GPIO_PIN_2;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    // 配置UART参数
    huart2.Instance = USART2;
    huart2.Init.BaudRate = 9600;
    huart2.Init.WordLength = UART_WORDLENGTH_8B;
    huart2.Init.StopBits = UART_STOPBITS_1;
    huart2.Init.Parity = UART_PARITY_NONE;
    huart2.Init.Mode = UART_MODE_TX_RX;
    huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
    huart2.Init.OverSampling = UART_OVERSAMPLING_16;
    HAL_UART_Init(&huart2);
}

int main(void)
{
    // 初始化HAL库
    HAL_Init();
    // 系统时钟初始化
    SystemClock_Config();
    // 初始化UART
    UART_Init();
    while (1)
    {
        // 发送数据
        char data = 'A';
        HAL_UART_Transmit(&huart2, (uint8_t *)&data, 1, HAL_MAX_DELAY);
        // 延时
        HAL_Delay(1000);
    }
}

3.3 ADC编程

模数转换(ADC)是STM32单片机的重要功能之一,用于将模拟信号转换为数字信号。以下是一个简单的ADC编程示例,实现对模拟信号的采样和读取:

#include "stm32f1xx_hal.h"

// 初始化ADC
void ADC_Init(void)
{
    ADC_HandleTypeDef hadc1;
    GPIO_InitTypeDef GPIO_InitStruct = {0};
    // 启用ADC时钟和GPIO时钟
    __HAL_RCC_ADC1_CLK_ENABLE();
    __HAL_RCC_GPIOA_CLK_ENABLE();
    // 配置ADC GPIO
    GPIO_InitStruct.Pin = GPIO_PIN_0;
    GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    // 配置ADC参数
    hadc1.Instance = ADC1;
    hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
    hadc1.Init.ContinuousConvMode = DISABLE;
    hadc1.Init.DiscontinuousConvMode = DISABLE;
    hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
    hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
    hadc1.Init.NbrOfConversion = 1;
    HAL_ADC_Init(&hadc1);
    // 配置ADC通道
    ADC_ChannelConfTypeDef sConfig = {0};
    sConfig.Channel = ADC_CHANNEL_0;
    sConfig.Rank = 1;
    sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;
    HAL_ADC_ConfigChannel(&hadc1, &sConfig);
}

int main(void)
{
    // 初始化HAL库
    HAL_Init();
    // 系统时钟初始化
    SystemClock_Config();
    // 初始化ADC
    ADC_Init();
    while (1)
    {
        // 启动ADC转换
        HAL_ADC_Start(&hadc1);
        // 等待转换完成
        HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY);
        // 读取转换结果
        uint16_t adcValue = HAL_ADC_GetValue(&hadc1);
        // 处理ADC值
        // ...
    }
}
© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号