[STM32F1] 探索STM32F103C8T6:STM32单片机基础应用实例

[复制链接]
5256|12
 楼主| Uriah 发表于 2025-1-18 07:23 | 显示全部楼层 |阅读模式
STM32系列单片机由意法半导体(STMicroelectronics)生产,凭借其高性能、低功耗和丰富的外设配置,广泛应用于嵌入式系统开发中。STM32F103C8T6作为STM32F1系列中的一款经典型号,以其性价比高、功能强大,深受开发者青睐。本文将带大家深入探索STM32F103C8T6的基本特性,并通过一个简单的应用实例帮助大家理解如何开始使用该型号单片机。
STM32F103C8T6概述STM32F103C8T6是基于ARM Cortex-M3内核的32位微控制器,具有较高的处理能力和丰富的外设接口。其主要特点包括:
  • 内核:Cortex-M3,最高主频72MHz
  • 内存:64KB Flash,20KB SRAM
  • 外设:多个定时器、USART、I2C、SPI、ADC等
  • 输入输出:37个GPIO引脚,支持多种功能
  • 工作电压:2.0V到3.6V
  • 工作温度:-40℃到+85℃
STM32F103C8T6的性能和资源足以支持各种中小型嵌入式项目,无论是工业控制、物联网设备、传感器采集还是通信协议的实现,都能游刃有余。
开发环境配置开发STM32F103C8T6通常需要以下工具:
  • 开发板:常见的开发板如STM32F103C8T6最常见的开发板为Blue Pill。
  • 编程器:ST-LINK/V2或J-Link可以用来进行编程和调试。
  • 开发环境:Keil uVision或STM32CubeIDE。
在这里,我们将使用STM32CubeIDE来进行开发,因为它集成了代码编写、调试和生成配置的工具,适合新手入门。
基本的LED闪烁程序我们来编写一个简单的LED闪烁程序,利用STM32F103C8T6的一个GPIO引脚控制LED灯闪烁,演示如何使用该单片机进行基本的GPIO操作。
配置步骤
  • 启动STM32CubeIDE,创建一个新的STM32项目,选择型号为STM32F103C8T6。
  • 在Pinout & Configuration界面中,选择一个GPIO引脚(如PC13)作为输出引脚。
  • 配置时钟系统,默认设置即可。
  • 生成代码并打开项目。
编写代码接下来,我们编写一个简单的程序,通过控制GPIO引脚的电平来实现LED的闪烁。
  1. #include "main.h"

  2. int main(void)
  3. {
  4.     // 初始化HAL库
  5.     HAL_Init();
  6.    
  7.     // 配置系统时钟
  8.     SystemClock_Config();
  9.    
  10.     // 启动GPIOC时钟
  11.     __HAL_RCC_GPIOC_CLK_ENABLE();
  12.    
  13.     // 配置PC13为输出模式
  14.     GPIO_InitTypeDef GPIO_InitStruct = {0};
  15.     GPIO_InitStruct.Pin = GPIO_PIN_13;
  16.     GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  17.     GPIO_InitStruct.Pull = GPIO_NOPULL;
  18.     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  19.     HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
  20.    
  21.     // 主循环
  22.     while (1)
  23.     {
  24.         // 设置PC13为高电平,点亮LED
  25.         HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET);
  26.         HAL_Delay(500);  // 延时500毫秒
  27.         
  28.         // 设置PC13为低电平,熄灭LED
  29.         HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);
  30.         HAL_Delay(500);  // 延时500毫秒
  31.     }
  32. }

  33. // 系统时钟配置函数
  34. void SystemClock_Config(void)
  35. {
  36.     RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  37.     RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
  38.    
  39.     // 配置HSE晶振和PLL
  40.     RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  41.     RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  42.     RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  43.     RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  44.     RCC_OscInitStruct.PLL.PLLMUL = RCC_PLLMUL9;  // 设置PLL倍频
  45.     if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  46.     {
  47.         // 初始化失败,进入死循环
  48.         while (1);
  49.     }
  50.    
  51.     // 配置系统时钟
  52.     RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
  53.     RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  54.     RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  55.     RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
  56.     RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
  57.    
  58.     if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
  59.     {
  60.         // 配置失败,进入死循环
  61.         while (1);
  62.     }
  63. }
代码解析
  • HAL库初始化:首先调用HAL_Init()初始化HAL库,这是STM32编程的标准步骤。
  • GPIO配置:通过HAL_GPIO_Init()配置PC13为输出推挽模式,用于驱动外接的LED。
  • 延时控制:通过HAL_Delay()函数设置每次点亮或熄灭LED的时间间隔,500毫秒一次。
  • 系统时钟配置:通过SystemClock_Config()函数配置系统时钟,使用HSE晶振和PLL倍频,确保系统时钟稳定运行。
编译与烧录编写完代码后,可以通过STM32CubeIDE进行编译,并使用ST-LINK/V2调试器将程序烧录到STM32F103C8T6开发板上。完成烧录后,开发板上的LED灯应该每500毫秒闪烁一次。
总结STM32F103C8T6是一款功能强大的微控制器,适合用来做各种中小型嵌入式项目。通过本文的LED闪烁示例,我们展示了如何配置GPIO、进行延时操作以及使用系统时钟。在此基础上,开发者可以进一步探索STM32的各种外设和功能,为自己的项目提供更多的可能性。

公羊子丹 发表于 2025-1-18 07:23 | 显示全部楼层
这个代码例子挺简单易懂的,我用这款开发板做了个小项目,真的很方便!
周半梅 发表于 2025-1-18 07:24 | 显示全部楼层
STM32的学习曲线是不是很陡?我一直在用Arduino,觉得STM32有点复杂。
帛灿灿 发表于 2025-1-18 07:24 | 显示全部楼层
大佬,你这篇文章讲得不错,我正准备做一个CAN通信的项目,能不能分享一下这方面的代码?
童雨竹 发表于 2025-1-18 07:24 | 显示全部楼层
LED闪烁的程序可以拿来做一些其他控制,比如继电器驱动吗?
万图 发表于 2025-1-18 07:24 | 显示全部楼层
用这个MCU能跑得动一些实时操作系统吗?比如FreeRTOS之类的。
Wordsworth 发表于 2025-1-18 07:25 | 显示全部楼层
我发现你们都用STM32,难道不觉得它的配置有点麻烦吗?有没有其他更简单的方案?
Bblythe 发表于 2025-1-18 07:25 | 显示全部楼层
这款MCU真的很不错,关键是价格便宜,功能还很全,我准备做一个简单的传感器数据采集系统。
Pulitzer 发表于 2025-1-18 07:25 | 显示全部楼层
想问下,程序里用到的HAL库能不能在其他的STM32型号上用?
Clyde011 发表于 2025-1-18 07:25 | 显示全部楼层
大神们,能分享一下这款MCU的调试技巧吗?我刚开始学习这款芯片,调试上总是卡壳。
Amazingxixixi 发表于 2025-1-21 17:13 | 显示全部楼层
学习一下啊,还有好多需要学习的。
SophiaOP 发表于 2025-1-22 22:06 来自手机 | 显示全部楼层
103用的还是多啊
SophiaOP 发表于 2025-1-22 22:06 来自手机 | 显示全部楼层
不知道什么时候停产
您需要登录后才可以回帖 登录 | 注册

本版积分规则

155

主题

6185

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部