STM32F103C8T6 是 ST 公司推出的一款基于 Cortex-M3 内核的微控制器,具有高性能、低功耗和丰富的外设资源。凭借其多种外设接口和较强的处理能力,它在工业控制、智能家居、物联网等领域有广泛的应用。本篇文章将通过具体代码演示如何在 STM32F103C8T6 上实现简单的 GPIO 控制和串口通信。
STM32F103C8T6的主要特性:- 32位ARM Cortex-M3内核,主频72MHz
- 64KB Flash,20KB SRAM
- 丰富的外设资源:GPIO、UART、SPI、I2C等
- 低功耗特性
本帖将展示基于STM32F103C8T6实现以下功能:
- GPIO输出控制LED
- 按键控制LED状态
- UART串口通信实现简单的数据传输
1. 硬件环境- STM32F103C8T6开发板
- 一个LED
- 一个按键
- 串口调试工具
2. 软件开发环境- Keil MDK (ARM)
- STM32CubeMX(外设配置)
3. 项目代码实现下面的代码将展示如何配置STM32F103C8T6的GPIO引脚,用来控制LED点亮熄灭,同时使用UART实现串口通信,将数据通过串口发送至PC端。
#include "stm32f10x.h" // 包含STM32F103C8T6的外设库
// 系统时钟初始化函数
void SystemClock_Config(void) {
RCC_DeInit();
RCC_HSEConfig(RCC_HSE_ON); // 启用外部高速时钟
while (!RCC_WaitForHSEStartUp()); // 等待时钟稳定
FLASH_SetLatency(FLASH_Latency_2); // 设置闪存访问等待周期
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); // 配置PLL倍频
RCC_PLLCmd(ENABLE); // 使能PLL
while (!RCC_GetFlagStatus(RCC_FLAG_PLLRDY)); // 等待PLL稳定
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); // 选择PLL作为系统时钟
while (RCC_GetSYSCLKSource() != 0x08); // 确认PLL作为系统时钟
}
// GPIO初始化函数
void GPIO_Init(void) {
GPIO_InitTypeDef GPIO_InitStructure;
// 使能GPIOC时钟,配置PC13引脚为LED输出
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
// 使能GPIOA时钟,配置PA0为按键输入
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
// 串口初始化函数
void UART_Init(void) {
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
// 使能USART1和GPIOA时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);
// 配置PA9为USART1_TX,PA10为USART1_RX
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// 配置USART1
USART_InitStructure.USART_BaudRate = 9600;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART1, &USART_InitStructure);
// 使能USART1
USART_Cmd(USART1, ENABLE);
}
// 按键控制LED状态
void ControlLED(void) {
if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == 0) { // 按键按下
GPIO_ResetBits(GPIOC, GPIO_Pin_13); // 点亮LED
} else {
GPIO_SetBits(GPIOC, GPIO_Pin_13); // 熄灭LED
}
}
// 串口发送字符串函数
void UART_SendString(char* str) {
while (*str) {
USART_SendData(USART1, *str++);
while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
}
}
// 主函数
int main(void) {
SystemClock_Config(); // 系统时钟初始化
GPIO_Init(); // GPIO初始化
UART_Init(); // 串口初始化
while (1) {
ControlLED(); // 按键控制LED
UART_SendString("Hello, STM32!"); // 通过串口发送字符串
}
}
代码解析- 系统时钟配置:系统时钟选择外部高速时钟(HSE)作为时钟源,并通过PLL倍频设置主频为72MHz。
- GPIO初始化:配置PC13为推挽输出模式用于LED控制,PA0为上拉输入模式用于按键读取。
- 串口初始化:USART1配置波特率为9600,8位数据,1位停止位,无校验,串口用来与PC进行数据通信。
- 按键控制LED:通过读取PA0的电平状态来控制PC13上LED的点亮与熄灭。
- 串口发送数据:每次循环发送"Hello, STM32!"字符串到PC终端。
项目总结通过本项目,开发者可以快速上手STM32F103C8T6的GPIO和UART外设配置。GPIO控制和串口通信是嵌入式开发中最常用的功能,掌握这些基本操作为后续的更复杂开发奠定了基础。STM32系列凭借其丰富的外设资源和强大的处理能力,能够满足多种嵌入式项目的需求。
|