【STM32】STM32外设应用

目录

一、GPIO(通用输入输出)

二、USART(通用同步异步收发传输器)

三、ADC(模拟 - 数字转换器)

四、TIM(定时器)


        STM32 是意法半导体推出的一系列 32 位微控制器,具有丰富的外设资源。以下为你详细介绍几种常见 STM32 外设的应用:

一、GPIO(通用输入输出)

  • 原理:GPIO 是最基本的外设,可配置为输入或输出模式。当配置为输入模式时,可读取外部信号;配置为输出模式时,能向外部输出高或低电平。

  • 应用场景:控制 LED 灯亮灭、读取按键状态等。

  • 代码示例(以 STM32Cube HAL 库为例)

    #include "main.h"
    #include "stm32f4xx_hal.h"
    
    void SystemClock_Config(void);
    static void MX_GPIO_Init(void);
    
    int main(void)
    {
      HAL_Init();
      SystemClock_Config();
      MX_GPIO_Init();
    
      while (1)
      {
        // 点亮 LED
        HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);
        HAL_Delay(1000);
        // 熄灭 LED
        HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);
        HAL_Delay(1000);
      }
    }
    
    void SystemClock_Config(void)
    {
      // 系统时钟配置代码
    }
    
    static void MX_GPIO_Init(void)
    {
      GPIO_InitTypeDef GPIO_InitStruct = {0};
    
      __HAL_RCC_GPIOA_CLK_ENABLE();
    
      GPIO_InitStruct.Pin = GPIO_PIN_5;
      GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
      GPIO_InitStruct.Pull = GPIO_NOPULL;
      GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
      HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    }

    二、USART(通用同步异步收发传输器)

  • 原理:USART 是一种常用的串行通信接口,支持同步和异步通信方式,可实现与其他设备的数据交换。

  • 应用场景:与 PC 机进行串口通信、与其他微控制器进行数据传输等。

  • 代码示例(以 STM32Cube HAL 库为例)

    #include "main.h"
    #include "stm32f4xx_hal.h"
    #include "stdio.h"
    
    UART_HandleTypeDef huart1;
    
    void SystemClock_Config(void);
    static void MX_GPIO_Init(void);
    static void MX_USART1_UART_Init(void);
    
    int main(void)
    {
      HAL_Init();
      SystemClock_Config();
      MX_GPIO_Init();
      MX_USART1_UART_Init();
    
      char message[] = "Hello, STM32!\r\n";
      while (1)
      {
        HAL_UART_Transmit(&huart1, (uint8_t *)message, sizeof(message) - 1, HAL_MAX_DELAY);
        HAL_Delay(1000);
      }
    }
    
    void SystemClock_Config(void)
    {
      // 系统时钟配置代码
    }
    
    static void MX_USART1_UART_Init(void)
    {
      huart1.Instance = USART1;
      huart1.Init.BaudRate = 115200;
      huart1.Init.WordLength = UART_WORDLENGTH_8B;
      huart1.Init.StopBits = UART_STOPBITS_1;
      huart1.Init.Parity = UART_PARITY_NONE;
      huart1.Init.Mode = UART_MODE_TX_RX;
      huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
      huart1.Init.OverSampling = UART_OVERSAMPLING_16;
      if (HAL_UART_Init(&huart1) != HAL_OK)
      {
        Error_Handler();
      }
    }
    
    static void MX_GPIO_Init(void)
    {
      // GPIO 初始化代码
    }

    三、ADC(模拟 - 数字转换器)

  • 原理:ADC 可将模拟信号转换为数字信号,STM32 的 ADC 通常具有多个通道,可同时对多个模拟信号进行采样。

  • 应用场景:测量温度、电压、光照强度等模拟量。

  • 代码示例(以 STM32Cube HAL 库为例)

    #include "main.h"
    #include "stm32f4xx_hal.h"
    
    ADC_HandleTypeDef hadc1;
    
    void SystemClock_Config(void);
    static void MX_GPIO_Init(void);
    static void MX_ADC1_Init(void);
    
    int main(void)
    {
      HAL_Init();
      SystemClock_Config();
      MX_GPIO_Init();
      MX_ADC1_Init();
    
      uint32_t adc_value;
      while (1)
      {
        HAL_ADC_Start(&hadc1);
        if (HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY) == HAL_OK)
        {
          adc_value = HAL_ADC_GetValue(&hadc1);
          // 处理 ADC 值
        }
        HAL_Delay(100);
      }
    }
    
    void SystemClock_Config(void)
    {
      // 系统时钟配置代码
    }
    
    static void MX_ADC1_Init(void)
    {
      ADC_ChannelConfTypeDef sConfig = {0};
    
      hadc1.Instance = ADC1;
      hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV2;
      hadc1.Init.Resolution = ADC_RESOLUTION_12B;
      hadc1.Init.ScanConvMode = DISABLE;
      hadc1.Init.ContinuousConvMode = DISABLE;
      hadc1.Init.DiscontinuousConvMode = DISABLE;
      hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
      hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
      hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
      hadc1.Init.NbrOfConversion = 1;
      hadc1.Init.DMAContinuousRequests = DISABLE;
      hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
      if (HAL_ADC_Init(&hadc1) != HAL_OK)
      {
        Error_Handler();
      }
    
      sConfig.Channel = ADC_CHANNEL_0;
      sConfig.Rank = 1;
      sConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES;
      if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
      {
        Error_Handler();
      }
    }
    
    static void MX_GPIO_Init(void)
    {
      // GPIO 初始化代码
    }

    四、TIM(定时器)

  • 原理:定时器可用于产生精确的时间延迟、测量时间间隔、生成 PWM 信号等。STM32 具有多种类型的定时器,如基本定时器、通用定时器和高级定时器。

  • 应用场景:控制电机转速、产生定时中断等。

  • 代码示例(以 STM32Cube HAL 库为例,使用定时器产生 PWM 信号)

    #include "main.h"
    #include "stm32f4xx_hal.h"
    
    TIM_HandleTypeDef htim3;
    
    void SystemClock_Config(void);
    static void MX_GPIO_Init(void);
    static void MX_TIM3_Init(void);
    
    int main(void)
    {
      HAL_Init();
      SystemClock_Config();
      MX_GPIO_Init();
      MX_TIM3_Init();
    
      HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1);
      __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 500);
    
      while (1)
      {
        // 主循环代码
      }
    }
    
    void SystemClock_Config(void)
    {
      // 系统时钟配置代码
    }
    
    static void MX_TIM3_Init(void)
    {
      TIM_MasterConfigTypeDef sMasterConfig = {0};
      TIM_OC_InitTypeDef sConfigOC = {0};
    
      htim3.Instance = TIM3;
      htim3.Init.Prescaler = 83;
      htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
      htim3.Init.Period = 999;
      htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
      htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
      if (HAL_TIM_PWM_Init(&htim3) != HAL_OK)
      {
        Error_Handler();
      }
    
      sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
      sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
      if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK)
      {
        Error_Handler();
      }
    
      sConfigOC.OCMode = TIM_OCMODE_PWM1;
      sConfigOC.Pulse = 0;
      sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
      sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
      if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
      {
        Error_Handler();
      }
    }
    
    static void MX_GPIO_Init(void)
    {
      // GPIO 初始化代码
    }

你可能感兴趣的:(嵌入式开发,stm32)