初识STM32单片机
迪丽瓦拉
2024-05-28 19:22:15
0

目录

初识STM32单片机

什么是单片机?

STM系列单片机命名规则

STM32F103C8T6单片机简介

标准库与HAL库区别 

通用输入输出端口GPIO

什么是GPIO?

定义

命名规则

内部框架图

推挽输出与开漏输出

如何点亮一颗LED灯

编程实现点灯 

按键点亮LED灯(轮询法) 


初识STM32单片机

什么是单片机?

单片机(Single-Chip Microcomputer)是一种集成电路芯片,把具有数据处理能力的中央处 理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计数器等功 能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成 到一块硅片上构成的一个小而完善的微型计算机系统,在工业控制领域广泛应用。

STM系列单片机命名规则

ST -- 意法半导体 M -- Microelectronics 微电子 32 -- 总线宽度

STM32F103C8T6单片机简介

标准库与HAL库区别 

1. 寄存器
  • 寄存器众多,需要经常翻阅芯片手册,费时费力;
  • 更大灵活性,可以随心所欲达到自己的目的;
  • 深入理解单片机的运行原理,知其然更知其所以然。
2. 标准库
  • 将寄存器底层操作都封装起来,提供一整套接口(API)供开发者调用
  • 每款芯片都编写了一份库文件,也就是工程文件里stm32F1xx…之类的;
  • 配置结构体变量成员就可以修改外设的配置寄存器,从而选择不同的功能;
  • 大大降低单片机开发难度,但是在不同芯片间不方便移植。
3. HAL库
  • ST公司目前主力推的开发方式,新的芯片已经不再提供标准库;
  • 为了实现在不同芯片之间移植代码;
  • 为了兼容所有芯片,导致代码量庞大,执行效率低下。

通用输入输出端口GPIO

什么是GPIO

定义

GPIO是通用输入输出端口的简称,简单来说就是STM32可控制的引脚STM32芯片的GPIO引脚与 外部设备连接起来,从而实现与外部通讯、控制以及数据采集的功能。 简单来说我们可以控制GPIO引脚的电平变化,达到我们的各种目的。

命名规则

组编号+引脚编号 组编号:GPIOA, GPIOB, GPIOC, GPIOD .. GPIOG 引脚编号:0,1,2,3,4...15 组合起来: PA0, PA1, PA2 .. PA15 PB0, PB1, PB2 .. PB15 PC0, PC1, PC2 .. PC15 ... 有一些特殊功能的引脚是不能用作IO的。

内部框架图

下图来源于官方参考手册,了解即可。

推挽输出与开漏输出

内部结构图

 

 

推挽输出: 可以真正能真正的输出高电平和低电平 开漏输出: 开漏输出无法真正输出高电平,即高电平时没有驱动能力,需要借助外部上拉电阻完 成对外驱动

如何点亮一颗LED

标号一样的导线在物理上是连接在一起的。

 

将PB8或PB9拉低,就可以实现将对应的LED灯点亮。

编程实现点灯 

常用的GPIO HAL库函数:
void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init); void HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState); void HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);

结构体 GPIO_InitTypeDef 定义:

typedef struct { uint32_t Pin; uint32_t Mode; uint32_t Pull; uint32_t Speed; } GPIO_InitTypeDef;

按键点亮LED灯(轮询法) 

输入(按键):
  • KEY1:PA0
  • KEY2:PA1
输出(LED灯):
  • LED1:PB8
  • LED2:PB9
#define KEY_ON 0
#define KEY_OFF 1
uint8_t Key_Scan(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin)
{if( HAL_GPIO_ReadPin(GPIOx,GPIO_Pin) == GPIO_PIN_RESET)
{
/* 按键按下 */return KEY_ON;
}
else
{
/* 按键松开 */while(HAL_GPIO_ReadPin(GPIOx, GPIO_Pin) == GPIO_PIN_RESET);return KEY_OFF;
}
}
while (1)
{/* USER CODE END WHILE */if(Key_Scan(GPIOA,GPIO_PIN_0) == KEY_ON)HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_8);if(Key_Scan(GPIOA,GPIO_PIN_1) == KEY_ON)HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_9);/* USER CODE BEGIN 3 */
}

相关内容