【STM32】江科大STM32笔记汇总(已完结)
目录
引言
在嵌入式系统中,STM32系列微控制器因其高性能、低功耗以及丰富的外设接口而广泛应用。本文将汇总关于STM32的学习笔记,包括硬件基础、常用外设及实际案例,帮助初学者快速上手。
STM32简介
STM32是一系列基于ARM Cortex-M内核的微控制器,由意法半导体(STMicroelectronics)公司生产。STM32系列分为多个型号,其中包括:
- STM32F0系列:入门级低功耗微控制器
- STM32F1系列:通用型微控制器,功能强大
- STM32F4系列:高性能微控制器,适合复杂应用
- STM32L系列:超低功耗微控制器,适合长电池续航的应用
开发环境搭建
安装Keil
- 下载并安装Keil MDK。
- 配置工具链,确保选择正确的STM32系列型号。
- 创建新项目,并设置目标设备。
安装STM32CubeMX
- 从ST官方网站下载STM32CubeMX。
- 启动软件,选择目标STM32微控制器。
- 配置外设和引脚设置,生成代码。
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 Codevoid 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 Codevoid 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 Codevoid 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 Codevoid 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读取温度传感器的数据并通过串口发送到计算机。
实现步骤
- 配置ADC读取温度传感器的模拟输出。
- 使用UART接口发送数据到PC。
cCopy Codevoid 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的开关状态。
实现步骤
- 配置GPIO作为输入(按键)和输出(LED)。
- 在主循环中检测按键状态并切换LED状态。
cCopy Codevoid main(void) {
SystemInit();
GPIO_Config();
while(1) {
if(GPIOA->IDR & (1 << 0)) { // 检测PA0引脚
LED_Blink();
HAL_Delay(500); // 延时
}
}
}
简单的步进电机控制
场景描述
使用PWM信号控制步进电机的旋转。
实现步骤
- 配置PWM输出。
- 通过调整PWM占空比控制电机转速。
cCopy Codevoid main(void) {
SystemInit();
PWM_Config();
while(1) {
for(int i = 0; i < 1000; i++) {
TIM2->CCR1 = i; // 调整占空比
HAL_Delay(10);
}
}
}
性能优化建议
- 合理使用中断:避免轮询,提高CPU利用率。
- 优化代码结构:减少冗余代码,提高代码复用性。
- 使用DMA:对于大数据量传输,可使用DMA提高效率。
常见问题及解决方案
问题1:无法编译通过
解决方案:检查是否选择了正确的目标设备和库文件。
问题2:串口无法通信
解决方案:确认波特率设置一致,检查连接线是否良好。
问题3:ADC读取值不正确
解决方案:检查输入信号范围,确保ADC配置正确。
总结
STM32微控制器因其强大的性能和丰富的外设接口,适合多种应用。本篇文章总结了STM32的基础知识及实际案例,希望对学习STM32有所帮助。通过不断实践和探索,相信大家能够掌握STM32的开发技巧,为实际项目的实施打下坚实的基础。
本站地址: https://www.ffyonline.com/pageSingle/articleOneWeb/106593