当前位置: 首页 > news >正文

stm32的三种开发方式

以下是针对STM32F103RC实现LED闪烁(PC13引脚)的三种开发方式示例代码,每种方式均保持相同的核心逻辑:

1. 寄存器开发方式(直接操作寄存器)

#include "stm32f10x.h"int main(void) {// 1. 开启GPIOC时钟 (APB2总线)RCC->APB2ENR |= RCC_APB2ENR_IOPCEN;// 2. 配置PC13为推挽输出模式 (50MHz)GPIOC->CRH &= ~(GPIO_CRH_MODE13 | GPIO_CRH_CNF13);  // 清除旧配置GPIOC->CRH |= GPIO_CRH_MODE13_0;  // 输出模式, 50MHzwhile(1) {// 3. 点亮LED (PC13置低电平)GPIOC->BSRR = GPIO_BSRR_BR13;// 4. 简单延时for(volatile uint32_t i = 0; i < 500000; i++);// 5. 熄灭LED (PC13置高电平)GPIOC->BSRR = GPIO_BSRR_BS13;// 6. 延时for(volatile uint32_t i = 0; i < 500000; i++);}
}

2. 标准库开发方式(使用STM32F10x Standard Peripheral Library)

#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"int main(void) {// 1. 初始化结构体GPIO_InitTypeDef GPIO_InitStruct;// 2. 开启GPIOC时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);// 3. 配置PC13参数GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;  // 推挽输出GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; // 速度50MHzGPIO_Init(GPIOC, &GPIO_InitStruct);while(1) {// 4. 点亮LEDGPIO_ResetBits(GPIOC, GPIO_Pin_13);// 5. 延时for(volatile uint32_t i = 0; i < 500000; i++);// 6. 熄灭LEDGPIO_SetBits(GPIOC, GPIO_Pin_13);// 7. 延时for(volatile uint32_t i = 0; i < 500000; i++);}
}

3. HAL库开发方式(使用STM32Cube HAL库)

#include "stm32f1xx_hal.h"void SystemClock_Config(void);  // 时钟配置声明 (通常由CubeMX生成)int main(void) {HAL_Init();                 // 初始化HAL库SystemClock_Config();       // 配置系统时钟// 1. 初始化GPIOC__HAL_RCC_GPIOC_CLK_ENABLE();  // 使能GPIOC时钟GPIO_InitTypeDef GPIO_InitStruct = {.Pin = GPIO_PIN_13,.Mode = GPIO_MODE_OUTPUT_PP,  // 推挽输出.Pull = GPIO_NOPULL,.Speed = GPIO_SPEED_FREQ_HIGH // 高速模式};HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);while(1) {// 2. 翻转LED状态 (HAL自带延时)HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);HAL_Delay(500);  // 使用HAL延时500ms}
}// 简化的时钟配置 (实际需根据板晶振修改)
void SystemClock_Config(void) {RCC_OscInitTypeDef osc = {0};RCC_ClkInitTypeDef clk = {0};osc.OscillatorType = RCC_OSCILLATORTYPE_HSE;osc.HSEState = RCC_HSE_ON;osc.PLL.PLLState = RCC_PLL_ON;osc.PLL.PLLSource = RCC_PLLSOURCE_HSE;osc.PLL.PLLMUL = RCC_PLL_MUL9;HAL_RCC_OscConfig(&osc);clk.ClockType = RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK| RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;clk.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;clk.AHBCLKDivider = RCC_SYSCLK_DIV1;clk.APB1CLKDivider = RCC_HCLK_DIV2;clk.APB2CLKDivider = RCC_HCLK_DIV1;HAL_RCC_ClockConfig(&clk, FLASH_LATENCY_2);
}

关键差异总结:

特性寄存器开发标准库开发HAL库开发
代码复杂度高(需直接操作寄存器)中(封装硬件操作)低(高度抽象)
可移植性低(芯片依赖性强)中(同系列芯片可移植)高(跨系列兼容)
开发效率低(需查阅手册)中(接口直观)高(集成工具链支持)
资源占用极小(无库开销)中等(需链接库文件)较大(库文件体积大)
适用场景极致优化/资源受限项目传统项目维护快速原型开发/复杂外设操作
http://www.lryc.cn/news/581366.html

相关文章:

  • 【论文解读】Referring Camouflaged Object Detection
  • Web3 Study Log 003
  • 《深度剖析:5G网络切片如何精准保障不同业务QoS需求》
  • 基于Java+SpringBoot的三国之家网站
  • ServiceNow CAD项目实战详细解析
  • 【算法刷题记录(简单题)002】字符串字符匹配(java代码实现)
  • Java 与 Vue 全栈开发:“一课一得“ 学习笔记系统实战
  • React Hooks全面解析:从基础到高级的实用指南
  • 【动态规划】笔记—完全背包问题
  • Spring中DelayQueue深度解析:从原理到实战(附结构图解析)
  • python实现简单的地图绘制与标记20250705
  • QT6 源(154)模型视图架构里的列表视图 QListView:先学习属性部分,
  • HTML网页应用打包Android App 完整实践指南
  • C#每日学习日记
  • NumPy-核心函数np.matmul()深入解析
  • Windows内存泄漏自动化
  • 大数据学习2:HIve
  • 关于 JNI 函数逆向(从 Java 到 native)
  • WebAssembly国际化多语种支持
  • .NET9 实现斐波那契数列(FibonacciSequence)性能测试
  • 闲庭信步使用SV搭建图像测试平台:第三十二课——系列结篇语
  • 力扣 hot100 Day35
  • 详解存储单位、内存寻址及数据存储方式
  • stm32达到什么程度叫精通?
  • jxWebUI--前端联动计算
  • Linux内核深度解析:IPv4策略路由的核心实现与fib_rules.c源码剖析
  • Spring boot之身份验证和访问控制
  • Day52 神经网络调参指南
  • Policy Gradient【强化学习的数学原理】
  • elementui表格增加搜索功能