简介:STM32F103是一款广泛应用于嵌入式系统的微控制器。本项目实战将指导你利用STM32F103实现红外遥控功能,涉及硬件接口设计、软件编程和红外通信协议的理解。你将使用KEIL μVision开发环境和C语言,学习GPIO口配置、中断服务函数、定时器设置等底层硬件操作。项目源代码包含GPIO初始化、定时器配置、中断服务函数、发送函数和接收函数等关键部分,助你深入理解STM32的硬件资源利用和底层驱动程序编写。通过本项目,你将掌握红外遥控技术,提升STM32开发能力。
1. STM32F103微控制器简介
1.1 STM32F103系列微控制器的特点和应用
STM32F103系列微控制器是意法半导体公司推出的一款基于ARM Cortex-M3内核的32位微控制器。该系列微控制器具有以下特点:
- 高性能:采用ARM Cortex-M3内核,主频高达72MHz,提供强大的计算能力。
- 低功耗:支持多种低功耗模式,包括睡眠模式、停止模式和待机模式,可延长电池续航时间。
- 丰富的资源:提供丰富的片上外设资源,包括GPIO、定时器、ADC、DAC、I2C、SPI等,满足各种应用需求。
- 易于开发:支持多种开发环境,如KEIL μVision、IAR Embedded Workbench等,提供丰富的开发工具和技术支持。
STM32F103系列微控制器广泛应用于工业控制、物联网、医疗电子、消费电子等领域,如智能家居、可穿戴设备、医疗仪器等。
2. KEIL μVision开发环境使用
2.1 KEIL μVision开发环境的安装和配置
KEIL μVision是一款功能强大的集成开发环境(IDE),专为嵌入式系统开发而设计。它支持多种微控制器,包括STM32系列。要开始使用KEIL μVision,需要先安装和配置它。
安装KEIL μVision
- 从官方网站下载KEIL μVision安装程序。
- 运行安装程序并按照提示进行安装。
- 安装完成后,启动KEIL μVision。
配置KEIL μVision
- 配置编译器: 在菜单栏中选择“Options”->“Target”,在“Target”选项卡中,选择“STM32F103xx”作为目标设备。
- 配置调试器: 在菜单栏中选择“Options”->“Debugger”,在“Debugger”选项卡中,选择“ST-Link/V2”作为调试器。
- 配置仿真器: 在菜单栏中选择“Options”->“Simulator”,在“Simulator”选项卡中,选择“STM32F103xx”作为仿真器。
2.2 STM32工程的创建和管理
2.2.1 新建STM32工程
- 在菜单栏中选择“Project”->“New μVision Project”。
- 在“New Project”对话框中,输入项目名称和位置。
- 在“Device”选项卡中,选择“STM32F103xx”作为目标设备。
- 单击“OK”按钮创建新工程。
2.2.2 工程配置和编译选项设置
工程配置
- 在工程资源管理器中,右键单击项目名称,选择“Options for Target”。
- 在“Options for Target”对话框中,配置以下选项:
- C/C++: 设置编译器选项,例如优化级别和警告级别。
- Linker: 设置链接器选项,例如内存映射和堆大小。
- Debug: 设置调试器选项,例如调试模式和断点设置。
编译选项设置
- 在菜单栏中选择“Project”->“Options for Target”。
- 在“Options for Target”对话框中,选择“Output”选项卡。
- 设置以下编译选项:
- Optimization: 选择优化级别,例如“O2”或“O3”。
- Warning Level: 选择警告级别,例如“0”或“1”。
- List File: 启用列表文件生成,用于调试。
2.3 KEIL μVision调试工具的使用
2.3.1 调试模式和断点设置
调试模式
- 在菜单栏中选择“Debug”->“Start/Stop Debug Session”。
- 选择调试模式,例如“Debug”或“Release”。
断点设置
- 在编辑器中,将光标放置在要设置断点的代码行上。
- 右键单击并选择“Toggle Breakpoint”。
- 断点将出现在代码行旁边。
2.3.2 变量监视和寄存器查看
变量监视
- 在菜单栏中选择“View”->“Debug”->“Locals”。
- “Locals”窗口将显示当前函数中的局部变量。
寄存器查看
- 在菜单栏中选择“View”->“Debug”->“Registers”。
- “Registers”窗口将显示当前CPU寄存器的内容。
3. C语言在STM32开发中的应用
3.1 C语言在嵌入式系统中的特点和应用
C语言是一种广泛应用于嵌入式系统开发的高级编程语言,其在嵌入式系统中的应用主要有以下特点:
- 高效性: C语言编译后生成的目标代码体积小,运行效率高,适合资源受限的嵌入式系统。
- 可移植性: C语言具有较好的可移植性,可以在不同的嵌入式平台上使用,减少了代码移植的难度。
- 广泛的库支持: C语言有丰富的标准库和第三方库,提供了丰富的函数和数据结构,简化了嵌入式系统开发。
3.2 STM32开发中常用的C语言数据类型和结构
STM32开发中常用的C语言数据类型和结构包括:
3.2.1 整数类型和浮点类型
- 整数类型:
int
、short
、long
等,用于存储整数数据。 - 浮点类型:
float
、double
等,用于存储浮点数数据。
3.2.2 指针类型和数组类型
- 指针类型:
*
,用于存储变量的地址,可以实现变量间接访问。 - 数组类型:
[]
,用于存储相同类型数据的集合,可以通过下标访问数组元素。
3.3 STM32开发中常用的C语言函数和库
3.3.1 标准C库函数
标准C库函数是C语言中定义的一组基本函数,提供了常用的数据处理、字符串处理、数学运算等功能。
#include <stdio.h>
int main() {
int a = 10;
printf("a = %d\n", a); // 使用printf函数打印变量a
return 0;
}
3.3.2 STM32外设库函数
STM32外设库函数是STM32官方提供的函数库,提供了对STM32外设的访问和控制。
#include "stm32f103x6.h"
int main() {
// 初始化GPIO口
RCC->APB2ENR |= RCC_APB2ENR_IOPCEN;
GPIOC->CRH |= GPIO_CRH_MODE13_0 | GPIO_CRH_CNF13_0;
// 设置GPIO口为输出模式
GPIOC->ODR |= GPIO_ODR_ODR13;
while (1) {
// 延时1秒
for (int i = 0; i < 1000000; i++);
// 翻转GPIO口电平
GPIOC->ODR ^= GPIO_ODR_ODR13;
}
}
4. GPIO口配置与操作
4.1 GPIO口的概念和功能
GPIO(General Purpose Input/Output)通用输入输出口是微控制器中一种重要的外设,它允许微控制器与外部设备进行数据交互。GPIO口可以配置为输入或输出模式,并可以连接到各种外部设备,如按钮、开关、LED灯、传感器和执行器。
STM32F103微控制器具有丰富的GPIO资源,每个GPIO口都具有多种配置选项,可以满足不同的应用需求。
4.2 GPIO口的配置和初始化
4.2.1 GPIO模式和引脚配置
GPIO口的配置主要包括模式配置和引脚配置。模式配置决定了GPIO口的输入输出方向,引脚配置决定了GPIO口的电气特性和功能。
GPIO模式配置
STM32F103微控制器的GPIO口支持多种模式,包括:
- 输入模式(Input):GPIO口作为输入,接收外部信号。
- 输出模式(Output):GPIO口作为输出,驱动外部设备。
- 推挽输出模式(Push-Pull Output):GPIO口输出高电平时,内部上拉电阻将输出端拉高;输出低电平时,内部下拉电阻将输出端拉低。
- 开漏输出模式(Open-Drain Output):GPIO口输出低电平时,内部下拉电阻将输出端拉低;输出高电平时,输出端处于高阻态,由外部上拉电阻决定输出电平。
GPIO引脚配置
GPIO引脚配置主要包括:
- 上拉/下拉电阻配置:GPIO口可以配置内部上拉电阻或下拉电阻,以防止输入端悬浮。
- 输入输出速率配置:GPIO口可以配置输入输出速率,以控制信号的上升和下降时间。
- 复用功能配置:GPIO口可以复用为其他功能,如定时器、UART、SPI等。
4.2.2 GPIO中断配置
GPIO口可以配置中断功能,当GPIO口电平发生变化时,会触发中断。GPIO中断配置主要包括:
- 中断触发方式配置:GPIO口中断可以配置为上升沿触发、下降沿触发、电平变化触发或任何电平触发。
- 中断优先级配置:GPIO口中断可以配置不同的优先级,以决定中断响应的顺序。
4.3 GPIO口的输入输出操作
4.3.1 GPIO口输入模式下的操作
在输入模式下,GPIO口读取外部信号。读取GPIO口电平可以通过以下方式实现:
// 读取GPIO口电平
uint8_t gpio_read(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin) {
return (GPIOx->IDR & GPIO_Pin) != 0;
}
4.3.2 GPIO口输出模式下的操作
在输出模式下,GPIO口驱动外部设备。设置GPIO口电平可以通过以下方式实现:
// 设置GPIO口电平
void gpio_write(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, uint8_t state) {
if (state) {
GPIOx->BSRR = GPIO_Pin;
} else {
GPIOx->BRR = GPIO_Pin;
}
}
5. 定时器的配置与应用
5.1 定时器的概念和功能
定时器是一种外设,用于生成精确的时间间隔或脉冲。它广泛应用于嵌入式系统中,例如延时、产生PWM波形、测量时间等。
5.2 STM32F103微控制器上的定时器类型和特点
STM32F103微控制器上有两种类型的定时器:
5.2.1 通用定时器
通用定时器(TIM1、TIM2、TIM3、TIM4)具有丰富的功能,包括:
- 多种计数模式(向上计数、向下计数、中心对齐模式)
- 多种时钟源(内部时钟、外部时钟、触发输入)
- 可编程预分频器和自动重装载寄存器
- 多个捕获/比较通道
- DMA支持
5.2.2 基本定时器
基本定时器(TIM6、TIM7)功能较少,但具有低功耗和低成本的特点:
- 仅支持向上计数模式
- 固定时钟源(内部时钟)
- 无预分频器
- 无捕获/比较通道
- 无DMA支持
5.3 定时器的配置和初始化
5.3.1 定时器模式和时钟源配置
定时器的模式和时钟源配置通过TIMx_CR1寄存器进行:
// 设置定时器模式
TIMx_CR1 |= TIM_CR1_CMS_x; // 计数模式
TIMx_CR1 |= TIM_CR1_DIR_x; // 计数方向
// 设置时钟源
TIMx_CR1 |= TIM_CR1_CKD_x; // 时钟分频器
TIMx_CR1 |= TIM_CR1_PSC_x; // 预分频器
5.3.2 定时器中断配置
定时器的中断配置通过TIMx_DIER寄存器进行:
// 启用定时器中断
TIMx_DIER |= TIM_DIER_UIE; // 更新中断
TIMx_DIER |= TIM_DIER_CCxIE; // 捕获/比较中断
5.4 定时器的应用
5.4.1 定时器延时
使用定时器实现延时非常简单:
// 延时100ms
uint32_t delay_time = 100000; // 100ms
TIMx_CNT = 0;
while (TIMx_CNT < delay_time);
5.4.2 定时器产生PWM波形
使用定时器产生PWM波形需要配置定时器的输出比较模式:
// 设置定时器输出比较模式
TIMx_CCMRx |= TIM_CCMRx_OCM_x; // 输出比较模式
// 设置比较值
TIMx_CCRx = duty_cycle; // 占空比
简介:STM32F103是一款广泛应用于嵌入式系统的微控制器。本项目实战将指导你利用STM32F103实现红外遥控功能,涉及硬件接口设计、软件编程和红外通信协议的理解。你将使用KEIL μVision开发环境和C语言,学习GPIO口配置、中断服务函数、定时器设置等底层硬件操作。项目源代码包含GPIO初始化、定时器配置、中断服务函数、发送函数和接收函数等关键部分,助你深入理解STM32的硬件资源利用和底层驱动程序编写。通过本项目,你将掌握红外遥控技术,提升STM32开发能力。