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

目录

  1. 引言
  2. STM32简介
  3. 开发环境搭建
  4. STM32硬件基础
  5. 常用外设
  6. 案例分析
  7. 性能优化建议
  8. 常见问题及解决方案
  9. 总结

引言

在嵌入式系统中,STM32系列微控制器因其高性能、低功耗以及丰富的外设接口而广泛应用。本文将汇总关于STM32的学习笔记,包括硬件基础、常用外设及实际案例,帮助初学者快速上手。

STM32简介

STM32是一系列基于ARM Cortex-M内核的微控制器,由意法半导体(STMicroelectronics)公司生产。STM32系列分为多个型号,其中包括:

  • STM32F0系列:入门级低功耗微控制器
  • STM32F1系列:通用型微控制器,功能强大
  • STM32F4系列:高性能微控制器,适合复杂应用
  • STM32L系列:超低功耗微控制器,适合长电池续航的应用

开发环境搭建

安装Keil

  1. 下载并安装Keil MDK。
  2. 配置工具链,确保选择正确的STM32系列型号。
  3. 创建新项目,并设置目标设备。

安装STM32CubeMX

  1. 从ST官方网站下载STM32CubeMX。
  2. 启动软件,选择目标STM32微控制器。
  3. 配置外设和引脚设置,生成代码。

STM32硬件基础

STM32架构

STM32微控制器基于ARM Cortex-M内核,具有以下特点:

  • 32位处理器:支持更高的数据处理能力。
  • 丰富的外设接口:如UART、SPI、I2C、ADC等。
  • 多种功耗模式:适应不同的应用需求。

GPIO配置

GPIO(通用输入输出)是STM32的重要接口之一,可以用于控制LED、按钮等外设。

cCopy Code
#include "stm32f4xx.h" void GPIO_Config(void) { // 使能GPIO时钟 RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN; // 设置PA5为推挽输出 GPIOA->MODER |= (1 << (5 * 2)); // MODER5 = 01 } void LED_Blink(void) { GPIOA->ODR ^= (1 << 5); // 切换PA5状态 }

常用外设

UART串口通信

UART(通用异步收发传输)是STM32中最基本的通信接口之一。

cCopy Code
void UART_Config(void) { // 使能USART时钟 RCC->APB1ENR |= RCC_APB1ENR_USART2EN; // 配置波特率、数据位、停止位等 USART2->BRR = 16000000 / 115200; // 波特率设置 USART2->CR1 |= USART_CR1_TE | USART_CR1_RE | USART_CR1_UE; // 使能发送和接收 } void UART_Send(char *data) { while(*data) { while(!(USART2->SR & USART_SR_TXE)); // 等待TXE标志 USART2->DR = *data++; // 发送数据 } }

ADC模拟信号采集

ADC(模数转换器)用于将模拟信号转换为数字信号,适用于温度传感器等应用。

cCopy Code
void ADC_Config(void) { // 使能ADC时钟 RCC->APB2ENR |= RCC_APB2ENR_ADC1EN; // 配置ADC参数 ADC1->CR1 |= ADC_CR1_RES_0; // 12位分辨率 ADC1->SQR3 = 0; // 选择通道0 ADC1->CR2 |= ADC_CR2_ADON; // 使能ADC } uint16_t ADC_Read(void) { ADC1->CR2 |= ADC_CR2_SWSTART; // 开始转换 while(!(ADC1->SR & ADC_SR_EOC)); // 等待转换结束 return ADC1->DR; // 读取结果 }

PWM输出与电机控制

PWM(脉宽调制)可以用于控制电机速度等。

cCopy Code
void PWM_Config(void) { // 使能TIM时钟 RCC->APB1ENR |= RCC_APB1ENR_TIM2EN; // 设置计数器 TIM2->PSC = 16000 - 1; // 预分频 TIM2->ARR = 1000 - 1; // 自动重装载值 TIM2->CCR1 = 500; // 占空比50% // 配置PWM模式 TIM2->CCMR1 |= TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_2; TIM2->CCMR1 |= TIM_CCMR1_OC1PE; // 使能预装载 TIM2->CR1 |= TIM_CR1_CEN; // 启动定时器 }

I2C与传感器交互

I2C(Inter-Integrated Circuit)是常见的串行通信协议,用于与传感器等外设进行通信。

cCopy Code
void I2C_Config(void) { // 使能I2C时钟 RCC->APB1ENR |= RCC_APB1ENR_I2C1EN; // 设置I2C参数 I2C1->CR2 = 16; // 16个时钟周期 I2C1->CCR = 80; // 设置时钟频率 I2C1->TRISE = 17; // 设置上升时间 I2C1->CR1 |= I2C_CR1_PE; // 使能I2C } uint8_t I2C_Read(uint8_t device_addr, uint8_t reg_addr) { // 发起I2C通信,读取数据 // 实现代码略 return data; }

案例分析

温度传感器数据采集

场景描述

利用STM32读取温度传感器的数据并通过串口发送到计算机。

实现步骤

  1. 配置ADC读取温度传感器的模拟输出。
  2. 使用UART接口发送数据到PC。
cCopy Code
void main(void) { SystemInit(); GPIO_Config(); UART_Config(); ADC_Config(); while(1) { uint16_t temp_value = ADC_Read(); char buffer[20]; sprintf(buffer, "Temperature: %d\n", temp_value); UART_Send(buffer); HAL_Delay(1000); // 延时1秒 } }

LED灯控制

场景描述

通过按键控制LED的开关状态。

实现步骤

  1. 配置GPIO作为输入(按键)和输出(LED)。
  2. 在主循环中检测按键状态并切换LED状态。
cCopy Code
void main(void) { SystemInit(); GPIO_Config(); while(1) { if(GPIOA->IDR & (1 << 0)) { // 检测PA0引脚 LED_Blink(); HAL_Delay(500); // 延时 } } }

简单的步进电机控制

场景描述

使用PWM信号控制步进电机的旋转。

实现步骤

  1. 配置PWM输出。
  2. 通过调整PWM占空比控制电机转速。
cCopy Code
void main(void) { SystemInit(); PWM_Config(); while(1) { for(int i = 0; i < 1000; i++) { TIM2->CCR1 = i; // 调整占空比 HAL_Delay(10); } } }

性能优化建议

  1. 合理使用中断:避免轮询,提高CPU利用率。
  2. 优化代码结构:减少冗余代码,提高代码复用性。
  3. 使用DMA:对于大数据量传输,可使用DMA提高效率。

常见问题及解决方案

问题1:无法编译通过

解决方案:检查是否选择了正确的目标设备和库文件。

问题2:串口无法通信

解决方案:确认波特率设置一致,检查连接线是否良好。

问题3:ADC读取值不正确

解决方案:检查输入信号范围,确保ADC配置正确。

总结

STM32微控制器因其强大的性能和丰富的外设接口,适合多种应用。本篇文章总结了STM32的基础知识及实际案例,希望对学习STM32有所帮助。通过不断实践和探索,相信大家能够掌握STM32的开发技巧,为实际项目的实施打下坚实的基础。