文章目录
一、实验原理
1.认识Stm32F103C8T6
STM32是ST公司基于ARM Cortex-M内核开发的32位微控制器。
- 系列: 主流系列STM32F1
- 内核: ARM Cortex-M3
- 主频: 72MHz
- RAM: 20K(SRAM)
- ROM: 64K(Flash)
- 供电: 2.0-3.6V
- 封装: LQFP48
1.1 命名规则
F表示的是基础型,103表示Stm32基础型。C指引脚数为48引脚,8表示闪存容量为64kB,T是采用QFP封装技术。
1.2 引脚解读
1.3 GPIO介绍
GPIO是通用输入输出口,有8种输入输出模式:
模式名称 | 性质 | 特征 |
---|---|---|
浮空输入 | 数字输入 | 可读取引脚电平,若引脚悬空,则电平不确定 |
上拉输入 | 数字输入 | 可读取引脚电平,内部链接上拉电阻,悬空时默认高电平 |
下拉输入 | 数字输入 | 可读取引脚电平,内部链接下拉电阻,悬空时默认低电平 |
模拟输入 | 模拟输入 | GPIO无效,引脚直接接入内部ADC |
开漏输出 | 数字输出 | 可输出引脚电平,高电平为高阻态,低电平接VSS |
推挽输出 | 数字输出 | 可输出引脚电平,高电平接VDD,低电平接VSS |
复用开漏输出 | 数字输出 | 由片上外设控制,高电平为高阻态,低电平接VSS |
复用推挽输出 | 数字输出 | 由片上外设控制,高电平接VDD,低电平接VSS |
从上图中,可以看出stm32的所有GPIO外设都连接在APB2外设总线上。
二、点亮LED
2.1 创建工程
选择stm32F103c8设备
勾选CMSIS(CMSIS是Cortex Microcontroller Software Interface Standard的缩写,中文为Cortex系列微控制器软件接口标准。)中的CORE,Device中的Startup
完成后点击ok,添加启动文件。右键Source Group 1,添加
2.2 配置引脚
首先选择一个GPIO引脚作为输出引脚来连接LED。在STM32F103中,有很多GPIO端口可以选择,本次实验选择GPIOA的引脚0作为输出引脚。
2.3 GPIO端口初始化
GPIO的每个寄存器在使用前都需要进行时钟使能,这样比起全部开启减少了功率消耗。所以第一步需要先将需要用到的寄存器进行使能。查阅数据手册
使能对应端口时钟
#define RCC_APB2ENR *((unsigned volatile int*)0x40021018)
RCC_APB2ENR!=1<<2;//将GPIOA使能
2.4 初始化引脚
GPIO寄存器包括有端口配置低寄存器和端口配置高寄存器。A0属于端口配置低寄存器偏移地址为0x00。查表得到GPIOA的基地址为0x40010800
首先需要先设置GPIOA引脚0的输出模式以及速度,将其设置为推挽输出(为什么要设置为推挽输出呢)
//GPIOA配置寄存器
#define GPIOA_CRL *((unsigned volatile int*)0x40010800)
//GPIOA输出数据寄存器
#define GPIOA_ODR *((unsigned volatile int*)0x4001080c)
//GPIOA设置为推挽输出
GPIOA_CRL&=0xFFFFFFF0 //设置位 清零
GPIOA_CRL|=0x00000003 //PA0推挽最快速输出
2.5 编写完整C程序并点灯
2.5.1 硬件配置
- usb转ttl和stm32的连接
连接如下:
紫色线(GND对应stm32上的GND)
黑色线(3v3对应stm32上的3v3)
灰色线(TXD对应stm32上的引脚A10)
白色线(RXD对应stm32上的引脚A9) - 发光二极管连接
本实验采用的是A0引脚,故将二极管的长脚连接A0,短脚接地。
2.5.2 完整程序
//定义每个寄存器
//CPIOA的外设时钟使能寄存器
#define RCC_APB2ENR *((unsigned volatile int*)0x40021018)
//选择CPIOA0作为点灯输出引脚
#define GPIOA_CRL *((unsigned volatile int*)0x40010800) //GPIOA配置寄存器
#define GPIOA_ODR *((unsigned volatile int*)0x4001080c) //GPIOA输出数据寄存器
//延时函数
void Delay_ms( volatile unsigned int t){
unsigned int i,j;
for(j = 0; j < t; j++){
for(i = 0; i < 1000 ; i++);
}
}
int main() {
RCC_APB2ENR|=1<<2;
//GPIOA设置为推挽输出
GPIOA_CRL&=0xFFFFFFF0; //设置位 清零
GPIOA_CRL|=0x00000003; //PA0推挽最快速输出
while(1){
GPIOA_ODR=0x1;
Delay_ms(5000);
GPIOA_ODR=0x0;
Delay_ms(5000);
}
}
2.5.3 编译烧录
点击keil中的build进行编译,需要在魔法棒中配置debug里生成hex文件,使用mcuisp烧录软件进行烧录。
2.5.4 最后效果
总结:经过本次实验,初步认识了stm32,也更清楚了如何阅读数据手册,并在查阅资料的过程中,扩展了新知识。
参考资料:
https://blog.csdn.net/apple_52030329/article/details/127232915?spm=1001.2014.3001.5502