探索STM32F103C8T6的外设:GPIO、ADC与定时器

探索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视而不见

代码获取、问题探讨及文章转载可私信。

☁ 愿你的生命中有够多的云翳,来造就一个美丽的黄昏。

🍎获取更多嵌入式资料可点击链接进群领取,谢谢支持!👇

点击领取更多详细资料

  • 8
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式杂谈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值