STM32F103系列是STMicroelectronics公司推出的一款基于ARM Cortex-M3内核的微控制器。它具有高性能、低功耗和丰富的外设接口,广泛应用于工业控制、消费电子、医疗设备等领域。下面我们将详细介绍STM32F103系列的主要特性、引脚功能和应用实例。
主要特性
- 内核:ARM Cortex-M3 32位RISC处理器,主频高达72MHz。
- 存储器:高达128KB的Flash存储器和20KB的SRAM。
- 电源电压:2.0V至3.6V,具有低功耗模式。
- 外设接口:
- 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输出。
引脚功能表
引脚 | 功能 | 描述 |
---|---|---|
PA0 | GPIO/ADC/EXTI | 通用输入/输出、模拟信号转换、外部中断 |
PA1 | GPIO/ADC/USART2_RTS | 通用输入/输出、模拟信号转换、串口RTS信号 |
PA2 | GPIO/ADC/USART2_TX | 通用输入/输出、模拟信号转换、串口发送信号 |
PA3 | GPIO/ADC/USART2_RX | 通用输入/输出、模拟信号转换、串口接收信号 |
PA4 | GPIO/SPI1_NSS/USART2_CK | 通用输入/输出、SPI片选信号、串口时钟信号 |
PA5 | GPIO/SPI1_SCK | 通用输入/输出、SPI时钟信号 |
PA6 | GPIO/SPI1_MISO | 通用输入/输出、SPI主设备数据输入 |
PA7 | GPIO/SPI1_MOSI | 通用输入/输出、SPI主设备数据输出 |
PB0 | GPIO/ADC | 通用输入/输出、模拟信号转换 |
PB1 | GPIO/ADC | 通用输入/输出、模拟信号转换 |
PB6 | GPIO/I2C1_SCL | 通用输入/输出、I2C时钟线 |
PB7 | GPIO/I2C1_SDA | 通用输入/输出、I2C数据线 |
PB10 | GPIO/USART3_TX/I2C2_SCL | 通用输入/输出、串口发送信号、I2C时钟线 |
PB11 | GPIO/USART3_RX/I2C2_SDA | 通用输入/输出、串口接收信号、I2C数据线 |
PC13 | GPIO/EXTI | 通用输入/输出、外部中断 |
PC14 | GPIO | 通用输入/输出 |
PC15 | GPIO | 通用输入/输出 |
PD2 | GPIO/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接口来实现传感器数据读取和通信功能。