STM32 江科大STM32笔记汇总 (已完结)

目录

1. 引言

在现代嵌入式系统中,STM32系列微控制器以其强大的性能和广泛的应用被广泛使用。本文将系统性地总结江科大在STM32方面的学习笔记,涵盖了从基础知识到复杂项目的实现,适合初学者和有一定基础的开发者参考。

2. STM32概述

2.1 STM32系列介绍

STM32是意法半导体(STMicroelectronics)推出的一系列基于ARM Cortex-M内核的32位微控制器。STM32系列根据不同的性能、功耗需求和外设支持分为多个子系列,如STM32F0、STM32F1、STM32F4等。

2.2 STM32的应用领域

STM32微控制器因其高性价比和丰富的外设接口,广泛应用于以下领域:

  • 家电控制
  • 工业自动化
  • 物联网
  • 医疗设备
  • 汽车电子

3. 开发环境搭建

3.1 硬件准备

  • 开发板:STM32F4 Discovery或Nucleo开发板
  • 编程器:ST-LINK V2
  • 传感器模块:DHT11温湿度传感器、HC-SR04超声波传感器等
  • 其他外设:LED灯、蜂鸣器等

3.2 软件工具链安装

  1. 安装Keil MDK或STM32CubeIDE:这是官方推荐的开发环境。
  2. 安装STM32CubeMX:用于生成初始化代码和配置外设。
  3. 安装驱动程序:确保ST-LINK驱动安装成功,以便对开发板进行烧录。

4. STM32基本功能

4.1 GPIO操作

GPIO(通用输入输出)是STM32最基本的外设之一,用于控制LED、按钮等设备。以下是GPIO的基本操作:

cCopy Code
#include "stm32f4xx.h" void GPIO_Config(void) { RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN; // 使能GPIOA时钟 GPIOA->MODER |= (1 << 10); // 设置PA5为输出模式 } void LED_Blink(void) { while (1) { GPIOA->ODR ^= (1 << 5); // 切换PA5状态 for (volatile int i = 0; i < 100000; i++); // 延时 } }

4.2 定时器使用

定时器可用于生成延时、PWM信号等功能。STM32的定时器配置相对简单,以下是一个基本的定时器示例:

cCopy Code
void Timer_Config(void) { RCC->APB1ENR |= RCC_APB1ENR_TIM2EN; // 使能TIM2时钟 TIM2->PSC = 16000 - 1; // 设置预分频器 TIM2->ARR = 1000 - 1; // 设置自动重装载寄存器 TIM2->CR1 |= TIM_CR1_CEN; // 启动定时器 }

4.3 ADC与DAC

ADC(模数转换器)用于读取模拟信号,例如温度传感器的输出。DAC(数模转换器)则用于输出模拟信号。以下是ADC的简单使用示例:

cCopy Code
void ADC_Config(void) { RCC->APB2ENR |= RCC_APB2ENR_ADC1EN; // 使能ADC1时钟 ADC1->CR1 = 0; // 配置ADC ADC1->CR2 |= ADC_CR2_ADON; // 使能ADC } uint16_t Read_ADC(void) { ADC1->SQR3 = 0; // 选择通道0 ADC1->CR2 |= ADC_CR2_SWSTART; // 启动转换 while (!(ADC1->SR & ADC_SR_EOC)); // 等待转换完成 return ADC1->DR; // 获取转换结果 }

4.4 UART通信

UART(通用异步收发传输)用于串口通信,可以连接其他设备如GPS模块、蓝牙模块等。以下是UART的基本配置:

cCopy Code
void UART_Config(void) { RCC->APB1ENR |= RCC_APB1ENR_USART2EN; // 使能USART2时钟 USART2->BRR = 0x683; // 设置波特率 USART2->CR1 |= USART_CR1_TE | USART_CR1_RE; // 使能发送和接收 } void UART_Send(char c) { while (!(USART2->SR & USART_SR_TXE)); // 等待发送缓冲区空 USART2->DR = c; // 发送字符 }

5. 实例项目

5.1 LED闪烁

项目描述

实现一个简单的LED闪烁效果,通过定时器控制LED的闪烁频率。

硬件连接

  • 将LED连接到PA5引脚。

完整代码

cCopy Code
#include "stm32f4xx.h" void GPIO_Config(void); void Timer_Config(void); void LED_Blink(void); int main(void) { GPIO_Config(); Timer_Config(); LED_Blink(); } void GPIO_Config(void) { RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN; // 使能GPIOA时钟 GPIOA->MODER |= (1 << 10); // 设置PA5为输出模式 } void Timer_Config(void) { RCC->APB1ENR |= RCC_APB1ENR_TIM2EN; // 使能TIM2时钟 TIM2->PSC = 16000 - 1; // 设置预分频器 TIM2->ARR = 1000 - 1; // 设置自动重装载寄存器 TIM2->CR1 |= TIM_CR1_CEN; // 启动定时器 } void LED_Blink(void) { while (1) { if (TIM2->SR & TIM_SR_UIF) { // 判断更新标志位 GPIOA->ODR ^= (1 << 5); // 切换PA5状态 TIM2->SR &= ~TIM_SR_UIF; // 清除更新标志位 } } }

5.2 温湿度监测系统

项目描述

使用DHT11温湿度传感器采集环境温度和湿度,并通过UART发送数据。

硬件连接

  • DHT11传感器连接至PA0引脚。
  • 将UART连接至PC端进行数据接收。

完整代码

cCopy Code
#include "stm32f4xx.h" void UART_Config(void); void DHT11_Init(void); void Read_DHT11(uint8_t *temperature, uint8_t *humidity); int main(void) { UART_Config(); DHT11_Init(); uint8_t temperature, humidity; while (1) { Read_DHT11(&temperature, &humidity); UART_Send(temperature); UART_Send(humidity); HAL_Delay(2000); // 每2秒读取一次 } } // UART配置省略... void DHT11_Init(void) { // 初始化DHT11传感器 } void Read_DHT11(uint8_t *temperature, uint8_t *humidity) { // 读取温湿度数据 }

5.3 超声波测距仪

项目描述

通过HC-SR04超声波传感器测量距离,并通过LED灯显示不同距离范围。

硬件连接

  • 超声波模块的Trig和Echo接到PA1和PA2引脚。

完整代码

cCopy Code
#include "stm32f4xx.h" void GPIO_Config(void); void Ultrasonic_Init(void); float Measure_Distance(void); int main(void) { GPIO_Config(); Ultrasonic_Init(); while (1) { float distance = Measure_Distance(); // 根据距离控制LED状态 } } // GPIO配置省略... void Ultrasonic_Init(void) { // 初始化超声波传感器 } float Measure_Distance(void) { // 测量距离 return distance; }

5.4 运动控制系统

项目描述

基于STM32实现简易的电机运动控制系统,能够控制电机的转速和方向。

硬件连接

  • 电机驱动模块连接至PB0和PB1引脚。

完整代码

cCopy Code
#include "stm32f4xx.h" void Motor_Init(void); void Set_Motor_Speed(uint8_t speed); void Set_Motor_Direction(uint8_t direction); int main(void) { Motor_Init(); while (1) { Set_Motor_Speed(128); // 设置转速 Set_Motor_Direction(1); // 设置方向 } } // Motor配置省略... void Set_Motor_Speed(uint8_t speed) { // 设置电机转速 } void Set_Motor_Direction(uint8_t direction) { // 设置电机方向 }

6. 总结与展望

通过以上的总结和项目实例,我们对STM32的基本操作有了全面的了解。这些知识为后续更复杂的项目打下了基础。随着技术的发展,STM32的应用领域也会不断扩展,未来可以结合更多新技术,如物联网、人工智能等,实现更加智能化的系统。

希望本笔记能对学习STM32的同学们有所帮助,也期待大家在实际项目中不断探索与创新!