STM32程序 讲解
更多
STM32程序开发讲解(基于HAL库)
核心开发流程
- 硬件初始化(时钟、外设)
- 外设配置(GPIO、UART、ADC等)
- 中断处理(优先级设置、回调函数)
- 主循环逻辑
- 外设驱动实现
基础示例:LED闪烁(GPIO控制)
#include "stm32f4xx_hal.h"
// LED引脚定义(以STM32F407 Discovery为例)
#define LED_PIN GPIO_PIN_12
#define LED_PORT GPIOD
int main(void) {
// 1. HAL库初始化
HAL_Init();
// 2. 系统时钟配置(通常由CubeMX生成)
SystemClock_Config();
// 3. GPIO初始化
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOD_CLK_ENABLE(); // 使能GPIOD时钟
GPIO_InitStruct.Pin = LED_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // 推挽输出
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(LED_PORT, &GPIO_InitStruct);
while (1) {
// 4. LED闪烁逻辑
HAL_GPIO_TogglePin(LED_PORT, LED_PIN); // 电平翻转
HAL_Delay(500); // 延时500ms
}
}
关键概念解析
1. 时钟系统(RCC)
// 使能外设时钟(以GPIOA为例)
__HAL_RCC_GPIOA_CLK_ENABLE();
// 系统时钟配置模板(由CubeMX自动生成)
void SystemClock_Config(void) {
RCC_OscInitTypeDef osc = {0};
RCC_ClkInitTypeDef clk = {0};
// 配置HSE(外部高速时钟)
osc.OscillatorType = RCC_OSCILLATORTYPE_HSE;
osc.HSEState = RCC_HSE_ON;
// PLL配置(倍频到168MHz)
osc.PLL.PLLState = RCC_PLL_ON;
osc.PLL.PLLSource = RCC_PLLSOURCE_HSE;
osc.PLL.PLLM = 8;
osc.PLL.PLLN = 336;
osc.PLL.PLLP = RCC_PLLP_DIV2;
HAL_RCC_OscConfig(&osc);
// 系统时钟树配置
clk.ClockType = RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK;
clk.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
clk.AHBCLKDivider = RCC_SYSCLK_DIV1;
HAL_RCC_ClockConfig(&clk, FLASH_LATENCY_5);
}
2. 中断处理
// 外部中断配置(按键为例)
void EXTI0_IRQHandler(void) {
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0); // 处理中断标志
}
// 中断回调函数
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {
if(GPIO_Pin == GPIO_PIN_0) {
HAL_GPIO_TogglePin(LED_PORT, LED_PIN); // 按键翻转LED
}
}
3. UART通信示例
UART_HandleTypeDef huart2;
void MX_USART2_UART_Init(void) {
huart2.Instance = USART2;
huart2.Init.BaudRate = 115200;
huart2.Init.WordLength = UART_WORDLENGTH_8B;
huart2.Init.StopBits = UART_STOPBITS_1;
huart2.Init.Parity = UART_PARITY_NONE;
HAL_UART_Init(&huart2);
}
// 发送数据
char msg[] = "Hello STM32!\r\n";
HAL_UART_Transmit(&huart2, (uint8_t*)msg, strlen(msg), HAL_MAX_DELAY);
// 接收中断
HAL_UART_Receive_IT(&huart2, &rx_data, 1);
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
// 收到数据后的处理
}
4. ADC采样
ADC_HandleTypeDef hadc1;
void MX_ADC1_Init(void) {
hadc1.Instance = ADC1;
hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;
hadc1.Init.Resolution = ADC_RESOLUTION_12B;
HAL_ADC_Init(&hadc1);
}
// 获取ADC值
uint32_t read_adc(void) {
ADC_ChannelConfTypeDef sConfig = {0};
sConfig.Channel = ADC_CHANNEL_0; // 通道0
sConfig.Rank = 1;
HAL_ADC_ConfigChannel(&hadc1, &sConfig);
HAL_ADC_Start(&hadc1); // 启动转换
HAL_ADC_PollForConversion(&hadc1, 10); // 等待转换完成
return HAL_ADC_GetValue(&hadc1); // 读取结果
}
开发工具链
-
IDE选项:
- STM32CubeIDE(免费官方工具)
- Keil MDK(商业版)
- IAR Embedded Workbench(商业版)
-
核心开发组件:
- STM32CubeMX:图形化配置工具(生成初始化代码)
- HAL库:硬件抽象层(跨系列兼容)
- CMSIS:内核相关标准接口
-
调试工具:
- ST-Link调试器
- J-Link
- 串口调试助手
最佳实践建议
-
使用CubeMX初始化:自动生成时钟/引脚配置
-
模块化编程:
// my_gpio.c void LED_Init(void) { /* GPIO配置 */ } void LED_Toggle(void) { /* 翻转逻辑 */ } -
功耗管理:空闲时进入低功耗模式
while(1) { __WFI(); // 等待中断(睡眠模式) } -
使用DMA传输:减轻CPU负担(适用于UART/ADC等大数据量场景)
-
错误处理:
HAL_StatusTypeDef status = HAL_UART_Transmit(...); if(status != HAL_OK) { // 错误处理 }
调试技巧:利用STM32的ITM机制实现printf重定向:
#include <stdio.h> int __io_putchar(int ch) { ITM_SendChar(ch); return ch; }
通过以上基础框架和示例,可快速构建STM32应用程序。实际开发中建议结合具体芯片手册(Reference Manual)和HAL库文档进行深入开发。
第12章-ADC采集电压和显示 基于STM32的ADC—电压采集(详细讲解+HAL库)
第12章-ADC采集电压和显示 基于STM32的ADC—电压采集(详细讲解+HAL库)
2024-08-21 16:31:34
通过串口烧写STM32程序的教程方法
如何通过串口烧写STM32程序的教程方法! 用交叉串口线连接开发板和电脑, BOOT0 选择为 1,BOOT1 选择为 0,接上开发板电源,SW1 切换到 ON 打开电源开关。 从开始
资料下载
ah此生不换
2022-03-22 15:39:36
主要讲解STM32的外部中断以及使用STM32CubeMX编写中断程序
STM32CubeMX教程(二)2021.10.27简介本次主要讲解STM32的外部中断以及使用
2022-01-13 08:21:16
STM32Cube用法以及自动生成的代码讲解
文章目录前言操作步骤打开软件新建工程配置时钟配置GPIO生成源代码编写代码实验验证源码讲解delay相关while循环自动生成前言本文主要介绍STM32Cube用法以及自动生成的代码
2021-08-10 06:21:28
7天热门专题
换一换
换一换
- 如何分清usb-c和type-c的区别
- 中国芯片现状怎样?芯片发展分析
- vga接口接线图及vga接口定义
- 芯片的工作原理是什么?
- 华为harmonyos是什么意思,看懂鸿蒙OS系统!
- 什么是蓝牙?它的主要作用是什么?
- ssd是什么意思
- 汽车电子包含哪些领域?
- TWS蓝牙耳机是什么意思?你真的了解吗
- 什么是单片机?有什么用?
- 升压电路图汇总解析
- plc的工作原理是什么?
- 再次免费公开一肖一吗
- 充电桩一般是如何收费的?有哪些收费标准?
- ADC是什么?高精度ADC是什么意思?
- EDA是什么?有什么作用?
- dtmb信号覆盖城市查询
- 苹果手机哪几个支持无线充电的?
- type-c四根线接法图解
- 华为芯片为什么受制于美国?
- 怎样挑选路由器?
- 元宇宙概念股龙头一览
- 锂电池和铅酸电池哪个好?
- 什么是场效应管?它的作用是什么?
- 如何进行编码器的正确接线?接线方法介绍
- 虚短与虚断的概念介绍及区别
- 晶振的作用是什么?
- 大疆无人机的价格贵吗?大约在什么价位?
- 苹果nfc功能怎么复制门禁卡
- 单片机和嵌入式的区别是什么
- amoled屏幕和oled区别
- 复位电路的原理及作用
- BLDC电机技术分析
- dsp是什么意思?有什么作用?
- 苹果无线充电器怎么使用?
- iphone13promax电池容量是多少毫安
- 芯片的组成材料有什么
- 特斯拉充电桩充电是如何收费的?收费标准是什么?
- 直流电机驱动电路及原理图
- 传感器常见类型有哪些?
- 自举电路图
- 通讯隔离作用
- 苹果笔记本macbookpro18款与19款区别
- 新斯的指纹芯片供哪些客户
- 伺服电机是如何进行工作的?它的原理是什么?
- 无人机价钱多少?为什么说无人机烧钱?
- 以太网VPN技术概述
- 手机nfc功能打开好还是关闭好
- 十大公认音质好的无线蓝牙耳机
- 元宇宙概念龙头股一览