STM32单片机开发方式
OverView:MCU 微控制单元(Microcontroller Unit;MCU)
STM32:
STM32F407ZET6
意法半导体(ST)基于ARM的cortex-M内核开发的32位单片机
STM32相比AVR 51单片机优点:性价比高,性能强大(主流主频:72MHZ 168MHZ 192MHZ...)
Keil基础操作
安装对应型号的Pack包:
直接双击打开
Keil选择头文件:
使用带有的库
Cortex 各系列:
Cortex-A、Cortex-R、Cortex-M 是 ARM 公司推出的三大处理器系列
Cortex-A 系列(应用处理器)
特点:
高性能,丰富指令集,专为复杂操作系统设计
应用领域:
智能手机 / 平板,汽车信息娱乐系统,企业级服务器(ARM 架构服务器)
Cortex-R 系列(实时处理器)
特点:
高可靠性,高性能与实时性平衡,低延迟
应用领域:
汽车电子,工业自动化,医疗设备,通信设备
Cortex-M 系列(微控制器)
特点:
超低功耗,低成本,易用性
应用领域:
物联网设备,消费电子,工业传感器,小型家电
例如我现在使用的是STM32F407ZET6,配合的IDE:keil v5
STM32F407ZET6共有A B C D E F G H共八组端口,每组16个引脚(除H组外)
GPIO(General-purpose input/output),通用型输入输出
引脚功能和寄存器
引脚一般都具有多种功能(复用)PA2/U2_TX/TIM2_CH3/TIM5_CH3/TIM9_CH1/ETH_MDIO/ADC123_IN2
PA2:通用功能(输入或者输出)
U2_TX/TIM2_CH3/TIM5_CH3/TIM9_CH1/ETH_MDIO:第二功能 复用功能
ADC123_IN2:模拟功能
但同一时间只能使用引脚其中一种功能
每组通用 I/O 端口包括的寄存器有:
4 个 32 位配置寄存器
GPIOx_MODER (端口模式寄存器)
GPIOx_OTYPER (端口输出类型寄存器)
GPIOx_OSPEEDR (端口输出速度寄存器 )
GPIOx_PUPDR (端口上拉/下拉寄存器)
2 个 32 位数据寄存器
GPIOx_IDR (端口输入数据寄存器)
GPIOx_ODR (端口输出数据寄存器)
1 个 32 位置位/复位寄存器
GPIOx_BSRR (端口置位/复位寄存器 )
1 个 32 位锁定寄存器
GPIOx_LCKR (端口配置锁定寄存器)
2 个 32 位复用功能选择寄存器
GPIOx_AFRH (复用功能高位寄存器)
GPIOx_AFRL (复用功能低位寄存器)
配置GPIO的过程就是往这些寄存器里面写值
以一个操作LED灯为例子:
在 STM32上操作 GPIO 点亮 LED,一般要按下面的步骤进行:
0. 首先理解原理图
知道控制LED灯的是哪个GPIO引脚,输出高和低电平时是对于亮还是灭
LED0连接在【PF9】引脚
当PF9输出低电平GND(0) LED0【灯亮】
当PF9输出高电平VCC(1) LED0【灯灭】
1. 使能 GPIO 外设时钟
STM32 的 GPIO 端口挂载在 AHB1 总线上,要想使用某个 GPIO 端口,得先开启对应的时钟。比如,若 LED 连接在 PF9 引脚,那就需要使能 GPIOF 的时钟。RCC_AHB1ENR
(因为需要降低功耗,避免资源冲突和保护外设安全,时钟默认是关闭的,在使用时手动打开)
2. 配置 GPIO 引脚模式
要把连接 LED 的 GPIO 引脚配置成输出模式。可以通过 GPIOx_MODER 寄存器来设置引脚模式,将其设为通用输出模式。
3. 配置 GPIO 输出类型、速度和上拉 / 下拉
输出类型:借助 GPIOx_OTYPER 寄存器来配置是推挽输出还是开漏输出。通常情况下,点亮 LED 会选用推挽输出。
输出速度:利用 GPIOx_OSPEEDR 寄存器设置 GPIO 的输出速度,一般设为中速或者低速就行。
上拉 / 下拉:通过 GPIOx_PUPDR 寄存器设置是否使用上拉或下拉电阻,这取决于 LED 的电路连接方式。
4. 控制 GPIO 引脚输出电平
通过操作 GPIOx_ODR 寄存器或者 BSRR 寄存器来控制引脚的输出电平。若要点亮 LED,就把对应的引脚设置为高电平或者低电平,具体取决于 LED 的连接方式(共阳或共阴)。
配置GPIO为输入模式
如果需要读取外界输入,
例如检测按键是否按下
void BEEP_Init(void)
{
GPIO_InitTypeDefGPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能GPIOB端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //BEEP-->PB.8 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速度为50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_ResetBits(GPIOB,GPIO_Pin_8);//输出0,关闭蜂鸣器输出
}
寄存器开发模式
直接操作(写/读)寄存器对应的地址(实际寄存器物理地址 = 寄存组基地址 + 偏移地址)
头文件中,用宏来对应每个寄存器的地址
//设置寄存器的地址
#define RCC_AHB1ENR *((volatile unsigned int *)(0x40023800 + 0x30)) //地址解引用 操作地址空间
#define GPIOF_MODER *((volatile unsigned int *)(0x40021400 + 0x00)) //地址解引用 操作地址空间
#define GPIOF_OTYPER *((volatile unsigned int *)(0x40021400 + 0x04)) //地址解引用 操作地址空间
#define GPIOF_OSPEEDR *((volatile unsigned int *)(0x40021400 + 0x08)) //地址解引用 操作地址空间
#define GPIOF_PUPDR *((volatile unsigned int *)(0x40021400 + 0x0C)) //地址解引用 操作地址空间
#define GPIOF_BSRR *((volatile unsigned int *)(0x40021400 + 0x18)) //地址解引用 操作地址空间
// 简单延时函数(非精确延时)
void delay_ms(uint32_t ms) {
for (uint32_t i = 0; i < ms * 4000; i++);// 调整系数以匹配实际时钟频率
}
int main(void)
{
// 1. 使能GPIOF时钟
RCC_AHB1ENR |= (1 << 5);// 第5位对应GPIOF
// 2. 配置PF9为输出模式 (MODER9 = 01)
GPIOF_MODER &= ~(3 << (9 * 2));// 清除原配置
GPIOF_MODER |=(1 << (9 * 2));// 设置为输出模式
// 3. 配置PF9为推挽输出 (OTYPER9 = 0)
GPIOF_OTYPER &= ~(1 << 9);
// 配置PF9为中速模式 (OSPEEDR9 = 01)
GPIOF_OSPEEDR &= ~(3 << (9 * 2));
GPIOF_OSPEEDR |=(1 << (9 * 2));
// 配置PF9为上拉 (PUPDR9 = 01)
GPIOF_PUPDR &= ~(3 << (9 * 2));
GPIOF_PUPDR |=(1 << (9 * 2));
while (1)
{
// 点亮LED(低电平)
GPIOF_BSRR = (1 << 25);// BR9位 (第25位) 置1以清除PF9
delay_ms(500);// 亮500ms
// 熄灭LED(高电平)
GPIOF_BSRR = (1 << 9); // BS9位 (第9位) 置1以设置PF9
delay_ms(500);// 灭500ms
}
}
库函数开发模式
STM32 的标准外设库(Standard Peripherals Library)是意法半导体(ST)早期为简化 STM32 微控制器开发而推出的一套 API,介于直接寄存器操作和 HAL 库之间。它具有以下显著优点:
抽象底层寄存器,降低开发难度
代码可读性和可维护性显著提升
易于学习和理解底层原理
接近硬件实现:比 HAL 库更贴近寄存器操作,适合学习微控制器的底层工作原理。
#include "stm32f4xx.h"
// 简单延时函数(非精确延时)
void delay_ms(uint32_t ms) {
for (uint32_t i = 0; i < ms * 4000; i++);// 调整系数以匹配实际时钟频率
}
int main(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
// 1. 使能GPIOF时钟
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);
// 2. 配置PF9
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; // 仅配置PF9
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; // 输出模式
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; // 推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 50MHz速度(根据实际需求调整)
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; // 上拉
GPIO_Init(GPIOF, &GPIO_InitStructure); // 应用配置
while (1)
{
// 点亮LED(低电平)
GPIO_ResetBits(GPIOF, GPIO_Pin_9);
delay_ms(500);// 亮500ms
// 熄灭LED(高电平)
GPIO_SetBits(GPIOF, GPIO_Pin_9);
delay_ms(500);// 灭500ms
}
}
————————————————
版权声明:本文为CSDN博主「扣篮发型不乱」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/KawhiLeo/article/details/148180934
页:
[1]