江协STM32笔记(一)

这边建议看我这篇笔记的话不如去看江协的课程:

简介

  • STM32是ST公司基于ARM Cortex-M内核开发的32位微控制器,用处有很多不细讲。
  • ARM既指ARM公司,也指ARM处理器内核
  • ARM公司设计ARM内核,半导体厂商完善内核周边电路并生产芯片

本篇写的都是跟江协讲的对应,用的是STM32F103C8T6

05ba1409-18a2-4715-ab13-edd1496230a3.png image.png

  • 内核:ARM Cortex-M3
  • 主频:72MHz
  • RAM(Random Access Memory):20K(SRAM)
  • ROM(Read-Only Memory):64K(Flash)
  • 供电:2.0~3.6V(标准3.3V)
  • 封装:LQFP48

片上资源

image.png

引脚定义

image.png

系统结构

image.png

启动配置

image.png

最小系统电路

image.png

C语言补充

数据类型

在这里面的数据类型就变成这个样子了,仔细看看就好

image.png

宏定义

这个就是用 #define ABC 123 来为数字进行可读性的解释。

想法比较类似的还有 typedef unsigned char uint8_t ,给比较长的变量类型名换个名字便于使用。

枚举

  • 关键字:enum

  • 用途:定义一个取值受限制的整型变量,用于限制变量取值范围;宏定义的集合

  • 定义枚举变量:

    enum{FALSE = 0, TRUE = 1} EnumName;

    因为枚举变量类型较长,所以通常用typedef更改变量类型名

  • 引用枚举成员:

    EnumName = FALSE;

    EnumName = TRUE;

新建工程步骤

image.png

工程架构

image.png

GPIO部分

基础知识

可根据需求配置为8种输入输出模式:

image.png

详情见参考手册第110页

引脚电平:0V~3.3V,部分引脚可容忍5V

输出模式下可控制端口输出高低电平,用以驱动LED、控制蜂鸣器、模拟通信协议输出时序等

输入模式下可读取端口的高低电平或电压,用于读取按键输入、外接模块电平信号输入、ADC电压采集、模拟通信协议接收数据等

stm32片上资源如下:

image.png

库函数讲解

‘ 具体的话去翻参考文档里面的pdf文件以及原始库文件的注释

说实在的听江协的课实际上学的是他写这种工程文件的一种思维,了解我应该从什么入手,如何抽丝剥茧一般了解这些东西,完整的经历这样一个项目的周期。

所以这里只讲明所用到的库里面的各个函数是干什么的,不讲解如何去用,这个是开发的时候都事情。

stm32f10x_gpio.h:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
void GPIO_DeInit(GPIO_TypeDef* GPIOx); 
//重置GPIO为缺省值

void GPIO_AFIODeInit(void);
//将复用的GPIO重置为缺省值

void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
//初始化函数,其中这个GPIO_InitTypeDef是需要配置的GPIO的具体参数,这个具体看注释

void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct);
//将参数按照缺省值填入结构体

uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
//读取指定端口管脚的输入

uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);
//带bit的就是微操,然后这个不带bit的就是直接批量读取,读回来一个包括有全部端口信息的十六位无符号整数,然后我可以对其进行位操作

uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);
//这俩拿来看输出了啥东西的

void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
//设定指定输出位

void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
//给输出清除为默认值

void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);
//给某管脚的输出设定为什么

void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);
//将寄存器设定为什么

void GPIO_PinLockConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
//锁定管脚设置的寄存器 锁定后需复位MCU才能解除锁定

void GPIO_EventOutputConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);
//将其用作为事件输出,这个没怎么用明白

void GPIO_EventOutputCmd(FunctionalState NewState);
//使能或者失能事件输出

void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState);
//引脚重映射用这个

void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);
//连接GPIO引脚到外部中断线,实际上就是在配置AFIO

void GPIO_ETH_MediaInterfaceConfig(uint32_t GPIO_ETH_MediaInterface);
//这个是拿来配置以太网物理层接口类型的,拿来选MII或者RMII以太网接口,但是这个普通的支持吗?不是很清楚

stm32f10x_rcc.:

这个文件是复位与时钟控制,用到了下面一句这个,他这个库里面基本上都是这个套路,RCC开头然后参数基本上就这,就是拿来配置时钟的,啥时候用啥时候翻。高级用法暂时不用。

1
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

实验部分

元器件

  • 有源蜂鸣器:内部自带振荡源,将正负极接上直流电压即可持续发声,频率固定
  • 无源蜂鸣器:内部不带振荡源,需要控制器提供振荡脉冲才可发声,调整提供振荡脉冲的频率,可发出不同频率的声音
  • LED灯:略
  • 按键:这个按键内部 用的是机械式弹簧片进行通断,会有抖动,要做个削震。
  • 传感器模块:传感器元件(光敏电阻/热敏电阻/红外接收管等)的电阻会随外界模拟量的变化而变化,通过与定值电阻分压即可得到模拟电压输出,再通过电压比较器进行二值化即可得到数字电压输出

编码流程

  • 用RCC配置时钟
  • GPIO初始化
  • 主循环实现代码逻辑

江协STM32笔记(一)
http://example.com/2025/08/11/嵌入式/江协STM32入门/江协STM32笔记(一)/
作者
ZHW
发布于
2025年8月11日
许可协议