嵌入式开发之STM32学习笔记day06

news2025/3/18 23:47:01

基于STM32F103C8T6的开发实践——从入门到精通01

1. 引言

        STM32系列微控制器是STMicroelectronics推出的一款高性能、低功耗的32位微控制器,广泛应用于嵌入式系统中。STM32F103C8T6是其中非常受欢迎的一款,凭借其强大的性能、丰富的外设接口和低廉的价格,成为了开发者的首选之一。本文将通过实例,详细介绍如何基于STM32F103C8T6进行开发,并带领读者完成从简单的点亮LED到复杂外设控制的过程。

2. STM32F103C8T6概述

        STM32F103C8T6属于STM32F1系列,核心采用ARM Cortex-M3架构,工作频率最高可达72MHz,具有64KB的Flash存储器和20KB的RAM,支持丰富的外设接口,如USART、SPI、I2C、PWM、ADC等。其广泛应用于传感器数据采集、通信模块、工业控制等领域。

2.1 STM32F103C8T6的主要特点
  • 32位ARM Cortex-M3内核
  • 最高主频72MHz
  • 64KB Flash和20KB SRAM
  • 丰富的外设接口:USART、I2C、SPI、CAN、PWM、ADC等
  • 内置8通道12位分辨率的ADC
  • 低功耗设计,支持多种休眠模式
2.2 常见应用场景
  • 工业控制
  • 无线通信
  • 智能家居
  • 机器人控制
  • 数据采集与处理

3. 开发环境搭建

        为了开始STM32F103C8T6的开发,我们需要配置开发环境。这里推荐使用Keil uVision 5和STM32CubeMX这两个工具。Keil uVision 5是一款功能强大的嵌入式开发集成环境,而STM32CubeMX则可以帮助我们简化STM32的初始化代码配置。

3.1 安装Keil uVision 5

  1. 从Keil官网(https://www.keil.com)下载并安装Keil uVision 5。
  2. 配置好项目的目标微控制器为STM32F103C8T6。
  3. 安装相应的编译工具链和调试工具。
3.2 安装STM32CubeMX
  1. 从ST官方(https://www.st.com)下载并安装STM32CubeMX。
  2. 打开STM32CubeMX,选择目标芯片STM32F103C8T6,配置所需的外设。
  3. 生成初始化代码,导入到Keil中进行开发。
3.3 配置调试工具
  1. 使用ST-Link v2调试器进行程序下载和调试。
  2. 连接ST-Link调试器到STM32F103C8T6的SWD接口。

4. STM32F103C8T6开发实践

4.1 点亮LED:基础GPIO操作

        GPIO(General Purpose Input/Output)是STM32F103C8T6中最常见的外设之一。我们可以通过配置GPIO来控制LED灯的点亮与熄灭。

4.1.1 硬件连接
  1. 将一个LED与适当的电阻串联,连接到STM32的PA5引脚。
  2. 将另一端接地。
4.1.2 软件代码

        通过STM32CubeMX生成初始化代码,配置PA5为输出模式,然后编写代码使LED闪烁。

#include "stm32f10x.h"

void GPIO_Configuration(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);  // 开启GPIOA的时钟
    
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;  // 配置PA5引脚
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  // 配置为推挽输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  // 配置为50MHz速度
    GPIO_Init(GPIOA, &GPIO_InitStructure);  // 初始化PA5
}

void delay(uint32_t count)
{
    while(count--);
}

int main(void)
{
    GPIO_Configuration();  // 配置GPIO
    
    while(1)
    {
        GPIO_SetBits(GPIOA, GPIO_Pin_5);  // 点亮LED
        delay(500000);  // 延时
        GPIO_ResetBits(GPIOA, GPIO_Pin_5);  // 熄灭LED
        delay(500000);  // 延时
    }
}
4.1.3 解释
  • 通过GPIO_Init函数配置PA5为推挽输出模式。
  • GPIO_SetBitsGPIO_ResetBits分别用于控制PA5输出高电平和低电平。
  • delay函数用来控制LED闪烁的频率。
4.2 外部中断:按键控制LED

        在嵌入式系统中,外部中断是非常常见的一种功能。通过外部中断,我们可以实现按键控制LED的功能。

4.2.1 硬件连接
  1. 按键与PA0引脚连接。
  2. LED与PA5引脚连接。
4.2.2 软件代码
#include "stm32f10x.h"

void GPIO_Configuration(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);  // 开启GPIOA时钟
    
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;  // 配置PA5为LED
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  // 配置为推挽输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;  // 配置PA0为按键输入
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;  // 上拉输入
    GPIO_Init(GPIOA, &GPIO_InitStructure);
}

void EXTI0_IRQHandler(void)
{
    if (EXTI_GetITStatus(EXTI_Line0) != RESET)  // 判断是否是PA0引脚的中断
    {
        GPIOA->ODR ^= GPIO_Pin_5;  // 切换LED状态
        EXTI_ClearITPendingBit(EXTI_Line0);  // 清除中断标志
    }
}

int main(void)
{
    GPIO_Configuration();
    
    // 配置外部中断
    EXTI_InitTypeDef EXTI_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;
    
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
    
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);
    
    EXTI_InitStructure.EXTI_Line = EXTI_Line0;
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    EXTI_Init(&EXTI_InitStructure);
    
    NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
    
    while(1);
}
4.2.3 解释
  • 使用PA0引脚作为按键输入,并配置为上拉模式。
  • 通过外部中断将PA0的状态变化(按下按键)作为触发条件,改变LED的状态。
  • EXTI_Init函数配置外部中断,EXTI0_IRQHandler函数处理按键中断。

5. 高级功能

5.1 UART通信:串口调试与数据传输

        STM32F103C8T6支持USART功能,通过串口可以与PC或其他设备进行通信。

5.2 ADC与传感器数据采集

        STM32内置12位的ADC,可用于采集模拟信号,比如温度传感器的数据。

6. 总结

        本文介绍了基于STM32F103C8T6的开发实践,从基础的GPIO操作到外部中断、串口通信等高级功能的实现。通过这些实例,开发者可以快速上手STM32,并应用于各种嵌入式项目中。STM32F103C8T6凭借其高性能、低功耗和丰富的外设,依然是开发者在嵌入式开发中的首选。

7. 预告

        大家好!我是小程同学>o<,下一节我将为大家详细介绍并解释GPIO(通用输入输出)在STM32中的应用。GPIO是嵌入式开发中的基础外设,但它却在实际项目中起着至关重要的作用。无论是控制LED的点亮、读取传感器的数据,还是与外部设备进行通信,GPIO都能帮助我们实现各种功能。敬请期待,我将带你一起深入了解GPIO的配置、操作技巧以及在开发中的最佳实践!下节见!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2317471.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AI驱动的视频字幕提取与翻译工具

青梧字幕是一款基于Whisper技术的AI字幕提取工具&#xff0c;专为视频制作者、翻译人员和自媒体创作者设计。它通过先进的语音识别算法&#xff0c;能够自动从视频文件中提取字幕内容&#xff0c;并支持多种语言和字幕格式&#xff0c;极大地简化了字幕制作流程。 目前暂支持 …

【MySQL】MySQL审计工具Audit Plugin安装使用

MySQL审计工具Audit Plugin安装使用 https://www.cnblogs.com/waynechou/p/mysql_audit.html MySQL 5.6 开启审计功能 https://blog.51cto.com/u_15127556/4344503 MySQL之添加日志审计功能 https://blog.csdn.net/weixin_43279032/article/details/105507170 MySQL开启日志记录…

游戏引擎学习第163天

我们可以在资源处理器中使用库 因为我们的资源处理器并不是游戏的一部分&#xff0c;所以它可以使用库。我说过我不介意让它使用库&#xff0c;而我提到这个的原因是&#xff0c;今天我们确实有一个选择——可以使用库。 生成字体位图的两种方式&#xff1a;求助于 Windows 或…

用python代码将excel中的数据批量写入Json中的某个字段,生成新的Json文件

需求 需求&#xff1a; 1.将execl文件中的A列赋值给json中的TrackId&#xff0c;B列赋值给json中的OId 要求 execl的每一行&#xff0c;对应json中的每一个OId json 如下&#xff1a; {"List": [{"BatchNumber": "181-{{var}}",// "Bat…

《我的Python觉醒之路》之转型Python(十五)——控制流

[今天是2025年3月17日&#xff0c;继续复习第一章节、第二章节的内容 ] 《我的Python觉醒之路》之转型Python&#xff08;十四&#xff09;——控制流

PosterRender 实现微信下程序 分享商品生成海报

PosterRender 是什么 PosterRender 是一种专注于生成高质量海报图像的技术或工具&#xff0c;常用于生成静态图片&#xff0c;特别是适合用于营销、宣传和展示的图形设计。它通常用于在服务端或客户端渲染复杂的图像&#xff0c;包括文字、图形、图标、背景等&#xff0c;生成…

如何利用 Zeabur 实现 OceanBase 的一键部署

引言 Zeabur 是一个功能强大且即开即用的自动化部署平台&#xff0c;它不仅能迅速部署多种应用&#xff0c;还支持一键安装 MySQL、PostgreSQL 等数据库服务。 Zeabur 拥有众多国内外用户&#xff0c;如 AFFiNE、Bytebase 等企业客户&#xff0c;以及大量全栈和独立开发者。将…

(hash表+vector 数位和相等数对的最大和)leetcode 2342

一定要断点调试看看数据对不对的上&#xff01;&#xff01;&#xff01;不然很容易弄不清楚值和下标 这个题意思是在nums中找出相同数位和的值 如 数位和为7 nums中符合要求的有 43&#xff0c;7 在这些数中选两个相加取最大值&#xff0c;再与其他数位和取得的相加最大值比…

kmp报错→Cannot find skiko-windows-x64.dll.sha256

1、前言 学习kmp&#xff08;Kotlin MultiPlatform简称&#xff09;过程中报了错误&#xff0c;这个报错在直接运行desktop的main方法才会出现&#xff0c;用gradle运行却不会报错&#xff0c;新建的kmp项目也不会出现&#xff0c;我学习的写了一些代码的项目才会出现。   运…

Cocos Creator Shader入门实战(四):预处理宏定义和Chunk

引擎&#xff1a; 3.8.5 您好&#xff0c;我是鹤九日&#xff01; 回顾 学习Shader&#xff0c;前期是让人烦躁无味的&#xff0c;后期可能就是各种的逻辑让人抓耳挠腮。 一成不变的内容&#xff1a;遵循引擎设定的规则&#xff0c;理解引擎要求的规范。 这里&#xff0c;简单…

K8S快速部署

前置虚拟机环境正式部署BUG解决 前置虚拟机环境 每个虚拟机配置一次就好 #关闭防火墙 systemctl stop firewalld systemctl disable firewalld #关闭 selinux sed -i s/enforcing/disabled/ /etc/selinux/config # 永久 setenforce 0 # 临时 #关闭 swap swapoff -a # 临时 vi…

汽车PKE无钥匙进入系统一键启动系统定义与原理

汽车智能钥匙&#xff08;PKE无钥匙进入系统&#xff09;一键启动介绍 系统定义与原理 汽车无钥匙进入系统&#xff0c;简称PKE&#xff08;Passive Keyless Entry&#xff09;&#xff0c;该系统采用了RFID无线射频技术和车辆身份编码识别系统&#xff0c;率先应用小型化、小…

WPF程序使用AutoUpdate实现自动更新

AutoUpdate.NET使用 一、AutoUpdater.NET 简介 AutoUpdater.NET 是一个开源库&#xff0c;支持从各种源&#xff08;如GitHub、FTP、HTTP服务器等&#xff09;下载并安装更新。它提供了灵活的配置选项&#xff0c;允许开发者根据需求定制更新检查逻辑和用户体验。 二、安装 …

每日Attention学习28——Strip Pooling

模块出处 [CVPR 20] [link] Strip Pooling: Rethinking Spatial Pooling for Scene Parsing 模块名称 Strip Pooling (SP) 模块结构 模块特点 本质是空间注意力的一种使用横/纵两个方向的条形池化获得一维方向上的重要程度&#xff0c;结合后便可以扩展至二维方向 模块代码 …

ollama docker设置模型常驻显存

参考&#xff1a; https://github.com/ollama/ollama/issues/5272 https://deepseek.csdn.net/67cfd7c93b685529b708fdee.html 通过-e传入环境变量&#xff0c;ollama运行&#xff1a; docker run -d --gpusall -e OLLAMA_KEEP_ALIVE-1 -v ollama:/root/.ollama -p 11434:114…

无再暴露源站!群联AI云防护IP隐匿方案+防绕过实战

一、IP隐藏的核心原理 群联AI云防护通过三层架构实现源站IP深度隐藏&#xff1a; 流量入口层&#xff1a;用户访问域名解析至高防CNAME节点&#xff08;如ai-protect.example.com&#xff09;智能调度层&#xff1a;基于AI模型动态分配清洗节点&#xff0c;实时更新节点IP池回…

【深度学习|目标检测】YOLO系列anchor-based原理详解

YOLO之anchor-based 一、关于anchors的设置二、网络如何利用anchor来训练关于register_buffer训练阶段的anchor使用推理阶段的anchor使用 三、训练时的正负样本匹配静态策略&#xff1a;跨分支采样跨anchor采样跨grid采样 动态策略 总结起来其实就是&#xff1a;基于anchor-bas…

Linux 入门:权限的认识和学习

目录 一.shell命令以及运行原理 二.Linux权限的概念 1.Linux下两种用户 cannot open directory .: Permission denied 问题 2.Linux权限管理 1).是什么 2).为什么&#xff08;权限角色目标权限属性&#xff09; 3).文件访问者的分类&#xff08;角色&#xff09; 4).文…

搭建opensbi+kernel+rootfs及基本设备驱动开发流程

目录 一.编译qemu 运行opensbikernelrootfs 1.编译qemu-9.1.1 2.安装riscv64编译器 3. 编译opensbi 4.编译kernel 5.编译rootfs 设备驱动开发流程 1.安装 RISC-V 交叉编译工具链 2.驱动开发准备 3.编写简易中断控制器驱动&#xff08;PLIC&#xff09;​ 4.配置内核…

QT非UI设计器生成界面的国际化

目的 UI设计器生成界面的国际化&#xff0c;比较容易实现些&#xff0c;因为有现成的函数可以调用&#xff0c;基本过程如下&#xff1a; void MainWindow::on_actLang_CN_triggered() {//中文界面qApp->removeTranslator(trans);delete trans;transnew QTranslator;trans…