自建服务这回事

服务运行在服务器上,我有服务器,又有写代码的能力,那么我可以自建服务。

比如邮箱服务、OAuth2认证服务、DNS解析服务、对象存储服务、视频流服务、代码托管平台等等。

这是一个“自力更生、自给自足”的思路。

# 代码概述 您在主函数中看到 `Delay_ms(50);` 但编译时报错 **“fatal error: 'Delay.h' file not found”**,说明工程中缺少延时函数的定义文件。这是初学者常见的配置问题。 --- # 详解 ## ❓ 问题本质:**您调用了 `Delay_ms()` 函数,但没有提供其实现** 从您提供的代码片段可以看出: ```c #include "Delay.h" // ... Delay_ms(50); ``` 但是编译器提示: ``` fatalerror:'Delay.h'file not found ``` 这意味着: - 您的项目里 **没有名为 `Delay.h` 的头文件** - 或者有文件但 **路径不对,找不到** - 或者 **拼写错误**(如大小写、空格) --- ## ✅ 解决方案:自己编写一个简单的 delay 函数 作为新手,您可以**不依赖外部 Delay.h**,而是直接使用 **内建的 `void Delay_ms(uint32_t ms)` 函数**,通过 SysTick 定时器实现精确毫秒延时。 下面教您一步一步添加这个功能。 --- ### ✅ 方法一:手动实现 Delay_ms(推荐给新人) #### 第一步:在 `main.c` 中添加全局变量和中断服务函数 ```c static __IO uint32_t TimingDelay; // SysTick 中断服务函数(固定名称) void SysTick_Handler(void) { if (TimingDelay != 0x00) { TimingDelay--; } } ``` #### 第二步:编写 Delay_ms 函数 ```c void Delay_ms(uint32_t nTime) { TimingDelay = nTime; while(TimingDelay != 0); } ``` #### 第三步:在 main 函数开头初始化 SysTick ```c int main(void) { // 启动系统时钟(必须先调用) SystemInit(); // 配置 SysTick 定时器,每 1ms 中断一次 if (SysTick_Config(SystemCoreClock / 1000)) { while (1); // 如果初始化失败,卡在这里 } // 其他初始化... PWM_Init(); // 主循环 while(1) { PWM_SetCompare2(3600); PWM_SetCompare4(3600); Delay_ms(500); // 延时500ms } } ``` ✅ 至此,无需任何 `.h` 文件,`Delay_ms()` 就可以正常使用了! --- ### ✅ 方法二:创建自己的 `Delay.h` 和 `Delay.c`(模块化写法) 如果您想保持原结构(使用头文件),可以自己创建这两个文件。 #### ➤ 创建 `Delay.h` ```c #ifndef __DELAY_H #define __DELAY_H #include "stm32f10x.h" void Delay_ms(uint32_t ms); #endif ``` #### ➤ 创建 `Delay.c` ```c #include "Delay.h" static __IO uint32_t TimingDelay; void SysTick_Handler(void) { if (TimingDelay != 0x00) { TimingDelay--; } } void Delay_ms(uint32_t ms) { TimingDelay = ms; while(TimingDelay != 0); } ``` #### ➤ 在 main.c 中包含头文件 ```c #include "Delay.h" ``` 📌 并将 `Delay.c` 添加到您的工程中(Keil/IAR/STM32CubeIDE),否则链接失败。 --- ## ⚠️ 常见错误排查 | 错误现象 | 原因 | 解决办法 | |--------|------|---------| | `'Delay.h' not found` | 文件不存在或路径不对 | 改成内联实现或新建文件 | | 程序卡死在 Delay_ms | SysTick 未初始化 | 必须调用 `SysTick_Config()` | | 延时不准确 | 系统时钟未正确设置 | 确保 `SystemInit()` 已调用 | --- ## 💡 小贴士:SystemCoreClock 是多少? 对于 STM32F103,默认是 **72,000,000 Hz**(72MHz) 所以: ```c SysTick_Config(SystemCoreClock / 1000) ``` 等于: $$ \frac{72,000,000}{1000} = 72,000 $$ 👉 即每 1ms 触发一次中断,完美支持 `Delay_ms(1)` 这样的调用。 --- # 知识点 - **SysTick定时器作用**:内核自带的倒计时定时器,适合实现毫秒级延时。 - **中断服务函数命名规则**:SysTick_Handler为固定名称,不可更改。 - **TimingDelay变量声明**:用__IO修饰确保编译器不优化掉被中断修改的变量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值