揭秘STM32F103C8T6引脚功能:深入剖析10大引脚配置秘诀
发布时间: 2024-07-20 07:29:43 阅读量: 221 订阅数: 58
![揭秘STM32F103C8T6引脚功能:深入剖析10大引脚配置秘诀](https://img-blog.csdnimg.cn/img_convert/89a50950c16733999e4c55ae6e5f358b.png)
# 1. STM32F103C8T6引脚概述
STM32F103C8T6是一款功能强大的微控制器,拥有丰富的引脚资源。这些引脚可以配置为各种功能,包括通用输入/输出(GPIO)、复用功能(如串口、I2C、SPI等)和模拟输入/输出。
本章将概述STM32F103C8T6的引脚,包括引脚编号、功能和电气特性。了解这些引脚对于充分利用微控制器的功能至关重要。
# 2. STM32F103C8T6引脚功能配置
### 2.1 GPIO引脚配置
#### 2.1.1 GPIO模式配置
STM32F103C8T6的GPIO引脚支持多种模式配置,包括输入模式、输出模式、推挽输出模式、开漏输出模式和模拟输入模式。
| 模式 | 描述 |
|---|---|
| 输入模式 | 引脚配置为输入,可以接收外部信号 |
| 输出模式 | 引脚配置为输出,可以驱动外部设备 |
| 推挽输出模式 | 引脚配置为推挽输出,可以驱动外部设备,输出高低电平 |
| 开漏输出模式 | 引脚配置为开漏输出,需要外接上拉电阻才能驱动外部设备 |
| 模拟输入模式 | 引脚配置为模拟输入,可以连接模拟信号源 |
GPIO引脚模式配置通过寄存器`GPIOx_MODER`进行设置,其中`x`表示端口号(A、B、C、D、E)。
```c
// 设置GPIOA的第5个引脚为输出模式
GPIOA->MODER &= ~(3 << (5 * 2));
GPIOA->MODER |= (1 << (5 * 2));
```
#### 2.1.2 GPIO速率配置
STM32F103C8T6的GPIO引脚还支持多种速率配置,包括低速、中速、高速和极高速。
| 速率 | 描述 |
|---|---|
| 低速 | 输出速率最高为2MHz |
| 中速 | 输出速率最高为10MHz |
| 高速 | 输出速率最高为50MHz |
| 极高速 | 输出速率最高为100MHz |
GPIO引脚速率配置通过寄存器`GPIOx_OSPEEDR`进行设置,其中`x`表示端口号(A、B、C、D、E)。
```c
// 设置GPIOA的第5个引脚为高速
GPIOA->OSPEEDR &= ~(3 << (5 * 2));
GPIOA->OSPEEDR |= (1 << (5 * 2));
```
### 2.2 复用功能引脚配置
#### 2.2.1 复用功能选择
STM32F103C8T6的许多引脚都支持复用功能,可以连接到不同的外设,如串口、I2C、SPI等。
复用功能选择通过寄存器`GPIOx_AFRL`和`GPIOx_AFRH`进行设置,其中`x`表示端口号(A、B、C、D、E)。
```c
// 设置GPIOA的第9个引脚为串口1的TX引脚
GPIOA->AFR[1] &= ~(0xF << ((9 - 8) * 4));
GPIOA->AFR[1] |= (1 << ((9 - 8) * 4));
```
#### 2.2.2 复用功能参数配置
不同的复用功能可能需要不同的参数配置,如波特率、数据位宽等。
复用功能参数配置通过外设寄存器进行设置,具体配置方式因外设而异。
```c
// 设置串口1的波特率为115200bps
USART1->BRR = (SystemCoreClock / 115200);
```
# 3. STM32F103C8T6引脚实战应用
### 3.1 GPIO引脚控制LED
#### 3.1.1 GPIO引脚初始化
GPIO引脚控制LED需要对GPIO引脚进行初始化,配置其模式和速率。
```c
// GPIO引脚初始化
void GPIO_Init(void)
{
// 使能GPIOC时钟
RCC->APB2ENR |= RCC_APB2ENR_IOPCEN;
// 设置PC13引脚为输出模式
GPIOC->CRH &= ~GPIO_CRH_MODE13;
GPIOC->CRH |= GPIO_CRH_MODE13_0;
// 设置PC13引脚输出速率为2MHz
GPIOC->CRH &= ~GPIO_CRH_CNF13;
GPIOC->CRH |= GPIO_CRH_CNF13_0;
}
```
**代码逻辑分析:**
* `RCC->APB2ENR |= RCC_APB2ENR_IOPCEN;`:使能GPIOC时钟,确保GPIOC模块可以正常工作。
* `GPIOC->CRH &= ~GPIO_CRH_MODE13;`:清除PC13引脚的模式配置位。
* `GPIOC->CRH |= GPIO_CRH_MODE13_0;`:将PC13引脚配置为输出模式。
* `GPIOC->CRH &= ~GPIO_CRH_CNF13;`:清除PC13引脚的输出速率配置位。
* `GPIOC->CRH |= GPIO_CRH_CNF13_0;`:将PC13引脚的输出速率配置为2MHz。
#### 3.1.2 LED控制程序
初始化GPIO引脚后,就可以编写LED控制程序,通过设置GPIO引脚电平来控制LED的亮灭。
```c
// LED控制程序
void LED_Control(void)
{
// 点亮LED
GPIOC->BSRR = GPIO_BSRR_BS13;
// 延时1s
HAL_Delay(1000);
// 熄灭LED
GPIOC->BSRR = GPIO_BSRR_BR13;
// 延时1s
HAL_Delay(1000);
}
```
**代码逻辑分析:**
* `GPIOC->BSRR = GPIO_BSRR_BS13;`:将PC13引脚电平设置为高电平,点亮LED。
* `HAL_Delay(1000);`:延时1s,保持LED点亮状态。
* `GPIOC->BSRR = GPIO_BSRR_BR13;`:将PC13引脚电平设置为低电平,熄灭LED。
* `HAL_Delay(1000);`:延时1s,保持LED熄灭状态。
### 3.2 复用功能引脚控制串口
#### 3.2.1 串口引脚初始化
复用功能引脚控制串口需要对串口引脚进行初始化,配置其复用功能和参数。
```c
// 串口引脚初始化
void USART_Init(void)
{
// 使能USART1时钟
RCC->APB2ENR |= RCC_APB2ENR_USART1EN;
// 设置PA9引脚为复用功能,选择USART1 TX
GPIOA->CRH &= ~GPIO_CRH_MODE9;
GPIOA->CRH |= GPIO_CRH_MODE9_1;
// 设置PA10引脚为复用功能,选择USART1 RX
GPIOA->CRH &= ~GPIO_CRH_MODE10;
GPIOA->CRH |= GPIO_CRH_MODE10_1;
// 初始化USART1
USART1->BRR = 0x341; // 波特率为9600bps
USART1->CR1 |= USART_CR1_UE; // 使能USART1
}
```
**代码逻辑分析:**
* `RCC->APB2ENR |= RCC_APB2ENR_USART1EN;`:使能USART1时钟,确保USART1模块可以正常工作。
* `GPIOA->CRH &= ~GPIO_CRH_MODE9;`:清除PA9引脚的模式配置位。
* `GPIOA->CRH |= GPIO_CRH_MODE9_1;`:将PA9引脚配置为复用功能,选择USART1 TX。
* `GPIOA->CRH &= ~GPIO_CRH_MODE10;`:清除PA10引脚的模式配置位。
* `GPIOA->CRH |= GPIO_CRH_MODE10_1;`:将PA10引脚配置为复用功能,选择USART1 RX。
* `USART1->BRR = 0x341;`:设置USART1波特率为9600bps。
* `USART1->CR1 |= USART_CR1_UE;`:使能USART1。
#### 3.2.2 串口通信程序
初始化串口引脚后,就可以编写串口通信程序,通过串口发送和接收数据。
```c
// 串口通信程序
void USART_Communication(void)
{
// 发送数据
USART1->DR = 'A';
// 等待发送完成
while (!(USART1->SR & USART_SR_TXE));
// 接收数据
while (!(USART1->SR & USART_SR_RXNE));
uint8_t data = USART1->DR;
}
```
**代码逻辑分析:**
* `USART1->DR = 'A';`:将字符'A'写入USART1数据寄存器,发送数据。
* `while (!(USART1->SR & USART_SR_TXE));`:等待发送完成,直到发送完成标志位(TXE)被置位。
* `while (!(USART1->SR & USART_SR_RXNE));`:等待接收完成,直到接收完成标志位(RXNE)被置位。
* `uint8_t data = USART1->DR;`:读取USART1数据寄存器,获取接收到的数据。
# 4. STM32F103C8T6引脚高级配置
### 4.1 中断引脚配置
中断引脚配置用于配置引脚的中断功能,当引脚检测到特定事件时触发中断。
#### 4.1.1 中断类型配置
中断类型配置用于指定引脚的中断类型,STM32F103C8T6支持以下中断类型:
| 中断类型 | 描述 |
|---|---|
| EXTI0 | 外部中断线0 |
| EXTI1 | 外部中断线1 |
| EXTI2 | 外部中断线2 |
| EXTI3 | 外部中断线3 |
| EXTI4 | 外部中断线4 |
| EXTI9_5 | 外部中断线5到9 |
| EXTI15_10 | 外部中断线10到15 |
中断类型配置通过寄存器`EXTI->IMR`和`EXTI->EMR`进行,设置相应位即可使能或禁止中断。
#### 4.1.2 中断优先级配置
中断优先级配置用于指定中断的优先级,优先级高的中断会优先响应。STM32F103C8T6支持4级中断优先级:
| 优先级 | 描述 |
|---|---|
| 0 | 最低优先级 |
| 1 | 中等优先级 |
| 2 | 高优先级 |
| 3 | 最高优先级 |
中断优先级配置通过寄存器`NVIC->IPRx`进行,其中`x`为中断号。
### 4.2 模拟引脚配置
模拟引脚配置用于配置引脚的模拟功能,使引脚可以连接到模拟外设,如ADC和DAC。
#### 4.2.1 模拟引脚模式配置
模拟引脚模式配置用于指定引脚的模拟模式,STM32F103C8T6支持以下模拟模式:
| 模拟模式 | 描述 |
|---|---|
| 输入模式 | 引脚作为模拟输入 |
| 输出模式 | 引脚作为模拟输出 |
| 双向模式 | 引脚既可以作为模拟输入,也可以作为模拟输出 |
模拟引脚模式配置通过寄存器`GPIOx->MODER`进行,设置相应位即可配置模拟模式。
#### 4.2.2 模拟引脚采样率配置
模拟引脚采样率配置用于指定模拟引脚的采样率,采样率越高,转换精度越高,但功耗也越大。STM32F103C8T6支持以下采样率:
| 采样率 | 描述 |
|---|---|
| 12.5 MSPS | 每秒1250万次采样 |
| 6.25 MSPS | 每秒625万次采样 |
| 3.125 MSPS | 每秒312.5万次采样 |
| 1.5625 MSPS | 每秒156.25万次采样 |
模拟引脚采样率配置通过寄存器`ADC1->SMPRx`进行,其中`x`为通道号。
# 5. STM32F103C8T6引脚故障排除
本章节将重点介绍STM32F103C8T6引脚在实际应用中可能遇到的故障,并提供相应的分析和解决方法。
### 5.1 GPIO引脚故障分析
#### 5.1.1 GPIO引脚未响应
**故障现象:**
* GPIO引脚输出电平无效,无法控制外围设备。
* GPIO引脚输入电平无法读取,导致程序无法获取外部信号。
**可能原因:**
* GPIO引脚未正确配置,导致引脚处于高阻态或复用功能状态。
* GPIO引脚连接错误,导致引脚与外围设备未正确连接。
* GPIO引脚损坏,导致引脚无法正常工作。
**解决方法:**
* 检查GPIO引脚的配置,确保引脚已配置为输出或输入模式。
* 检查GPIO引脚的连接,确保引脚与外围设备正确连接。
* 如果以上方法无法解决问题,则需要更换GPIO引脚。
#### 5.1.2 GPIO引脚电平异常
**故障现象:**
* GPIO引脚输出电平不稳定,导致外围设备工作异常。
* GPIO引脚输入电平不准确,导致程序无法正确获取外部信号。
**可能原因:**
* GPIO引脚受到电磁干扰,导致引脚电平不稳定。
* GPIO引脚与外围设备连接不良,导致引脚电平异常。
* GPIO引脚损坏,导致引脚无法正常工作。
**解决方法:**
* 检查GPIO引脚周围是否有电磁干扰源,并采取措施消除干扰。
* 检查GPIO引脚与外围设备的连接,确保连接牢固。
* 如果以上方法无法解决问题,则需要更换GPIO引脚。
### 5.2 复用功能引脚故障分析
#### 5.2.1 复用功能引脚未工作
**故障现象:**
* 复用功能引脚无法正常工作,导致外围设备无法正常通信。
**可能原因:**
* 复用功能引脚未正确配置,导致引脚未启用复用功能。
* 复用功能引脚连接错误,导致引脚与外围设备未正确连接。
* 复用功能引脚损坏,导致引脚无法正常工作。
**解决方法:**
* 检查复用功能引脚的配置,确保引脚已启用复用功能。
* 检查复用功能引脚的连接,确保引脚与外围设备正确连接。
* 如果以上方法无法解决问题,则需要更换复用功能引脚。
#### 5.2.2 复用功能引脚通信异常
**故障现象:**
* 复用功能引脚通信异常,导致外围设备无法正常通信。
**可能原因:**
* 复用功能引脚的参数配置错误,导致通信时序或数据格式不正确。
* 复用功能引脚与外围设备连接不良,导致通信信号不稳定。
* 复用功能引脚损坏,导致引脚无法正常工作。
**解决方法:**
* 检查复用功能引脚的参数配置,确保参数配置正确。
* 检查复用功能引脚与外围设备的连接,确保连接牢固。
* 如果以上方法无法解决问题,则需要更换复用功能引脚。
# 6. STM32F103C8T6引脚资源优化
### 6.1 GPIO引脚资源优化
#### 6.1.1 GPIO引脚复用
GPIO引脚复用是指将一个GPIO引脚同时用于多个功能。例如,一个GPIO引脚可以既作为输入引脚,又作为输出引脚。这样可以节省引脚资源,提高代码的可读性和可维护性。
**代码示例:**
```c
// 初始化GPIO引脚为输入输出复用模式
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.Pin = GPIO_PIN_13;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT_OUTPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
// 设置引脚为输入模式
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET);
// 设置引脚为输出模式
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);
```
#### 6.1.2 GPIO引脚多路复用
GPIO引脚多路复用是指将一个GPIO引脚同时连接到多个外设。例如,一个GPIO引脚可以同时连接到UART和SPI外设。这样可以节省引脚资源,提高系统集成度。
**代码示例:**
```c
// 初始化GPIO引脚为多路复用模式
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.Pin = GPIO_PIN_13;
GPIO_InitStruct.Mode = GPIO_MODE_AF;
GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
// 初始化UART外设
UART_HandleTypeDef UART_Handle;
UART_Handle.Instance = USART1;
UART_Handle.Init.BaudRate = 115200;
UART_Handle.Init.WordLength = UART_WORDLENGTH_8B;
UART_Handle.Init.StopBits = UART_STOPBITS_1;
UART_Handle.Init.Parity = UART_PARITY_NONE;
HAL_UART_Init(&UART_Handle);
// 初始化SPI外设
SPI_HandleTypeDef SPI_Handle;
SPI_Handle.Instance = SPI1;
SPI_Handle.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2;
SPI_Handle.Init.Direction = SPI_DIRECTION_2LINES;
SPI_Handle.Init.DataSize = SPI_DATASIZE_8BIT;
SPI_Handle.Init.CLKPolarity = SPI_POLARITY_LOW;
SPI_Handle.Init.CLKPhase = SPI_PHASE_1EDGE;
SPI_Handle.Init.NSS = SPI_NSS_SOFT;
HAL_SPI_Init(&SPI_Handle);
```
### 6.2 复用功能引脚资源优化
#### 6.2.1 复用功能引脚共享
复用功能引脚共享是指将多个外设共享同一个复用功能引脚。例如,多个UART外设可以共享同一个TX引脚。这样可以节省引脚资源,提高系统集成度。
**代码示例:**
```c
// 初始化GPIO引脚为复用功能共享模式
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.Pin = GPIO_PIN_13;
GPIO_InitStruct.Mode = GPIO_MODE_AF;
GPIO_InitStruct.Alternate = GPIO_AF7_USART1 | GPIO_AF8_USART2;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
// 初始化UART1外设
UART_HandleTypeDef UART1_Handle;
UART1_Handle.Instance = USART1;
UART1_Handle.Init.BaudRate = 115200;
UART1_Handle.Init.WordLength = UART_WORDLENGTH_8B;
UART1_Handle.Init.StopBits = UART_STOPBITS_1;
UART1_Handle.Init.Parity = UART_PARITY_NONE;
HAL_UART_Init(&UART1_Handle);
// 初始化UART2外设
UART_HandleTypeDef UART2_Handle;
UART2_Handle.Instance = USART2;
UART2_Handle.Init.BaudRate = 115200;
UART2_Handle.Init.WordLength = UART_WORDLENGTH_8B;
UART2_Handle.Init.StopBits = UART_STOPBITS_1;
UART2_Handle.Init.Parity = UART_PARITY_NONE;
HAL_UART_Init(&UART2_Handle);
```
#### 6.2.2 复用功能引脚时分复用
复用功能引脚时分复用是指将多个外设时分复用同一个复用功能引脚。例如,一个复用功能引脚可以在一段时间内用于UART通信,在另一段时间内用于SPI通信。这样可以节省引脚资源,提高系统集成度。
**代码示例:**
```c
// 初始化GPIO引脚为复用功能时分复用模式
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.Pin = GPIO_PIN_13;
GPIO_InitStruct.Mode = GPIO_MODE_AF;
GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
// 初始化UART外设
UART_HandleTypeDef UART_Handle;
UART_Handle.Instance = USART1;
UART_Handle.Init.BaudRate = 115200;
UART_Handle.Init.WordLength = UART_WORDLENGTH_8B;
UART_Handle.Init.StopBits = UART_STOPBITS_1;
UART_Handle.Init.Parity = UART_PARITY_NONE;
HAL_UART_Init(&UART_Handle);
// 初始化SPI外设
SPI_HandleTypeDef SPI_Handle;
SPI_Handle.Instance = SPI1;
SPI_Handle.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2;
SPI_Handle.Init.Direction = SPI_DIRECTION_2LINES;
SPI_Handle.Init.DataSize = SPI_DATASIZE_8BIT;
SPI_Handle.Init.CLKPolarity = SPI_POLARITY_LOW;
SPI_Handle.Init.CLKPhase = SPI_PHASE_1EDGE;
SPI_Handle.Init.NSS = SPI_NSS_SOFT;
HAL_SPI_Init(&SPI_Handle);
// 时分复用UART和SPI外设
while (1) {
// 使用UART外设
HAL_UART_Transmit(&UART_Handle, data, sizeof(data), 1000);
// 使用SPI外设
HAL_SPI_Transmit(&SPI_Handle, data, sizeof(data), 1000);
}
```
0
0