探索STM32F103C8T6的外设:GPIO、ADC与定时器
引言
STM32F103C8T6微控制器拥有丰富的外设接口,包括通用输入/输出(GPIO)、模拟/数字转换器(ADC)和定时器(Timer)。这些外设为嵌入式系统的设计提供了极大的灵活性。本文将介绍STM32F103C8T6的这些核心外设,并提供一些基础的代码示例。
GPIO
通用输入/输出(GPIO)是微控制器中最基本的外设之一,用于与外部设备进行交互。STM32F103C8T6提供了多个GPIO引脚,每个引脚都可以通过软件配置为不同的功能,如输入、输出、上拉/下拉、模拟输入等。
GPIO基础
- GPIO模式: 包括输入、输出、复用功能、模拟输入等。
- 输出类型: 推挽输出或开漏输出。
- 速度: 从2MHz到50MHz不等。
- 上拉/下拉: 内部上拉或下拉电阻。
GPIO配置代码示例
#include "stm32f10x.h"
// 使能GPIOA的时钟
void GPIOA_Clock_Enable(void) {
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
}
// 配置GPIOA的一个引脚为推挽输出
void GPIOA_Pin_Config(void) {
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; // 选择PA10
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
int main(void) {
SystemInit(); // 系统初始化
GPIOA_Clock_Enable(); // 使能GPIOA时钟
GPIOA_Pin_Config(); // 配置GPIOA的Pin10
while (1) {
GPIO_SetBits(GPIOA, GPIO_Pin_10); // 设置PA10为高电平
// 延时一段时间
GPIO_ResetBits(GPIOA, GPIO_Pin_10); // 设置PA10为低电平
// 延时一段时间
}
}
ADC
模拟/数字转换器(ADC)允许微控制器读取模拟信号并将其转换为数字值。STM32F103C8T6拥有多达3个ADC单元,每个单元有多个通道。
ADC基础
- 分辨率: 12位。
- 采样速率: 取决于时钟频率和采样时间。
- 通道: 支持单通道或多通道采样。
ADC配置代码示例
void ADC_Config(void) {
ADC_InitTypeDef ADC_InitStructure;
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; // 独立模式
ADC_InitStructure.ADC_ScanConvMode = DISABLE; // 非扫描模式
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; // 连续转换模式
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; // 无外部触发
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; // 右对齐
ADC_InitStructure.ADC_NbrOfChannel = 1; // 一个通道
ADC_Init(ADC1, &ADC_InitStructure); // 初始化ADC1
// 配置ADC通道
ADC_ChannelConfig(ADC1, ADC_Channel_0, ADC_SampleTime_55Cycles5);
}
int main(void) {
// ...省略其他初始化代码...
ADC_Config(); // 配置ADC
// 开启ADC1,准备进行转换
ADC_Cmd(ADC1, ENABLE);
while (1) {
if (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == SET) { // 转换结束
uint16_t adcValue = ADC_GetConversionValue(ADC1); // 读取转换结果
// 处理adcValue...
ADC_ClearFlag(ADC1, ADC_FLAG_EOC); // 清除转换结束标志
}
}
}
定时器
定时器是微控制器中用于生成精确时间延迟或波形的外设。STM32F103C8T6提供了多个定时器,每个定时器都有不同的特性,如PWM输出、输入捕获、输出比较等。
定时器基础
- 计数器模式: 上升计数、下降计数或上升下降计数。
- 时钟源: 来自内部或外部的时钟源。
- 中断: 可以配置定时器在特定事件上产生中断。
定时器配置代码示例
void TIM2_Config(void) {
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_Cmd(TIM2, DISABLE); // 先关闭定时器
// 定时器基本配置
TIM_TimeBaseStructure.TIM_Period = 1000 - 1; // 定时周期
TIM_TimeBaseStructure.TIM_Prescaler = 72 - 1; // 预分频
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
// 启动定时器
TIM_Cmd(TIM2, ENABLE);
}
int main(void) {
// ...省略其他初始化代码...
TIM2_Config(); // 配置定时器2
while (1) {
// 定时器TIM2每1ms产生一次中断
// 这里应编写中断服务例程
}
}
结论
STM32F103C8T6的GPIO、ADC和定时器是实现各种嵌入式应用功能的基础。通过合理配置这些外设,可以实现从简单的LED闪烁到复杂的信号采样和时间控制任务。理解这些外设的工作原理和配置方法是设计高效嵌入式系统的关键。
注意事项
- 在配置GPIO时,确保正确选择引脚模式和速度,以满足应用需求。
- 使用ADC时,要注意采样时间和分辨率的平衡,以及可能的模拟输入电压范围。
- 定时器配置时,要特别注意时钟源和分频值的设置,以确保定时精度。
通过本文,您应该对STM32F103C8T6的GPIO、ADC和定时器有了更深入的了解。随着对这些外设更深入的学习和实践,您将能够开发出更加复杂和功能丰富的嵌入式系统。
✅作者简介:热爱科研的嵌入式开发者,修心和技术同步精进
❤欢迎关注我的知乎:对error视而不见
代码获取、问题探讨及文章转载可私信。
☁ 愿你的生命中有够多的云翳,来造就一个美丽的黄昏。
🍎获取更多嵌入式资料可点击链接进群领取,谢谢支持!👇