为什么STM32F103系列芯片是嵌入式开发者的首选?

STM32F103系列是STMicroelectronics公司推出的一款基于ARM Cortex-M3内核的微控制器。它具有高性能、低功耗和丰富的外设接口,广泛应用于工业控制、消费电子、医疗设备等领域。下面我们将详细介绍STM32F103系列的主要特性、引脚功能和应用实例。

主要特性

  1. 内核:ARM Cortex-M3 32位RISC处理器,主频高达72MHz。
  2. 存储器:高达128KB的Flash存储器和20KB的SRAM。
  3. 电源电压:2.0V至3.6V,具有低功耗模式。
  4. 外设接口
    • GPIO:多达80个通用输入/输出引脚。
    • ADC:12位ADC,具有多达16个通道。
    • DAC:12位DAC,具有2个通道。
    • UART:多达5个USART接口。
    • SPI:多达2个SPI接口。
    • I2C:多达2个I2C接口。
    • CAN:1个CAN接口。
    • USB:全速USB 2.0接口。
    • PWM:多达4个定时器,支持PWM输出。
引脚功能表
引脚功能描述
PA0GPIO/ADC/EXTI通用输入/输出、模拟信号转换、外部中断
PA1GPIO/ADC/USART2_RTS通用输入/输出、模拟信号转换、串口RTS信号
PA2GPIO/ADC/USART2_TX通用输入/输出、模拟信号转换、串口发送信号
PA3GPIO/ADC/USART2_RX通用输入/输出、模拟信号转换、串口接收信号
PA4GPIO/SPI1_NSS/USART2_CK通用输入/输出、SPI片选信号、串口时钟信号
PA5GPIO/SPI1_SCK通用输入/输出、SPI时钟信号
PA6GPIO/SPI1_MISO通用输入/输出、SPI主设备数据输入
PA7GPIO/SPI1_MOSI通用输入/输出、SPI主设备数据输出
PB0GPIO/ADC通用输入/输出、模拟信号转换
PB1GPIO/ADC通用输入/输出、模拟信号转换
PB6GPIO/I2C1_SCL通用输入/输出、I2C时钟线
PB7GPIO/I2C1_SDA通用输入/输出、I2C数据线
PB10GPIO/USART3_TX/I2C2_SCL通用输入/输出、串口发送信号、I2C时钟线
PB11GPIO/USART3_RX/I2C2_SDA通用输入/输出、串口接收信号、I2C数据线
PC13GPIO/EXTI通用输入/输出、外部中断
PC14GPIO通用输入/输出
PC15GPIO通用输入/输出
PD2GPIO/USART3_CTS通用输入/输出、串口CTS信号
GND地线连接
VDD电源输入3.3V电源输入

实例项目:温度数据记录器

硬件接线图

#include "stm32f1xx_hal.h"
#include "i2c.h"
#include "usart.h"
#include "adc.h"

#define TEMP_SENSOR_PIN GPIO_PIN_0
#define TEMP_SENSOR_PORT GPIOA

void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_ADC1_Init(void);
static void MX_USART2_UART_Init(void);
static void MX_I2C1_Init(void);

ADC_HandleTypeDef hadc1;
UART_HandleTypeDef huart2;
I2C_HandleTypeDef hi2c1;

int main(void) {
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_ADC1_Init();
  MX_USART2_UART_Init();
  MX_I2C1_Init();

  while (1) {
    HAL_ADC_Start(&hadc1);
    HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY);
    uint32_t adcValue = HAL_ADC_GetValue(&hadc1);
    float temperature = ((adcValue / 4096.0) * 3.3 - 0.5) * 100;

    char buffer[50];
    sprintf(buffer, "Temperature: %.2f C\n", temperature);
    HAL_UART_Transmit(&huart2, (uint8_t*)buffer, strlen(buffer), HAL_MAX_DELAY);

    HAL_Delay(1000);
  }
}

void SystemClock_Config(void) {
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) {
    Error_Handler();
  }

  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) {
    Error_Handler();
  }
}

static void MX_GPIO_Init(void) {
  __HAL_RCC_GPIOA_CLK_ENABLE();
  GPIO_InitTypeDef GPIO_InitStruct = {0};
  GPIO_InitStruct.Pin = TEMP_SENSOR_PIN;
  GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
  HAL_GPIO_Init(TEMP_SENSOR_PORT, &GPIO_InitStruct);
}

static void MX_ADC1_Init(void) {
  __HAL_RCC_ADC1_CLK_ENABLE();
  ADC_ChannelConfTypeDef sConfig = {0};
  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;
  if (HAL_ADC_Init(&hadc1) != HAL_OK) {
    Error_Handler();
  }
  sConfig.Channel = ADC_CHANNEL_0;
  sConfig.Rank = ADC_REGULAR_RANK_1;
  sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;
  if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) {
    Error_Handler();
  }
}

static void MX_USART2_UART_Init(void) {
  __HAL_RCC_USART2_CLK_ENABLE();
  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;
  huart2.Init.Mode = UART_MODE_TX_RX;
  huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart2.Init.OverSampling = UART_OVERSAMPLING_16;
  if (HAL_UART_Init(&huart2) != HAL_OK) {
    Error_Handler();
  }
}

static void MX_I2C1_Init(void) {
  __HAL_RCC_I2C1_CLK_ENABLE();
  hi2c1.Instance = I2C1;
  hi2c1.Init.ClockSpeed = 100000;
  hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;
  hi2c1.Init.OwnAddress1 = 0;
  hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
  hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
  hi2c1.Init.OwnAddress2 = 0;
  hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
  hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
  if (HAL_I2C_Init(&hi2c1) != HAL_OK) {
    Error_Handler();
  }
}

void Error_Handler(void) {
  while (1) {
    // Stay here when error occurs
  }
}

详细介绍总结

STM32F103系列微控制器具有高性能、低功耗和丰富的外设接口,适用于各种嵌入式应用。通过这个温度数据记录器实例项目,我们可以了解到如何使用STM32F103系列的ADC、UART和I2C接口来实现传感器数据读取和通信功能。

  • 22
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

极客小张

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值