惭愧, eclipse 之 build path

本文记录了解决一个老旧项目在MyEclipse中无法正确导入和编译的问题过程。项目使用Struts1.x、Hibernate3.x和Spring2.x等技术栈。通过检查并修复.svn中.project文件的内容,成功解决了项目导入和编译的问题。

      算下来大学到现在已近用了很久的 eclipse 了, 包括 myeclipse, 但是今天碰到的问题让我很惭愧, 一个老项目的编译都搞了好久.

环境:

Myeclipse 6.X
Struts 1.X
Hibernate 3.X
Spring 2.X

一看这环境, 就知道项目很老了, 但是今天碰到的跟这项目的老不老没关系.

       因为急需编译后的代码, 项目是从 svn 上 check 下来的, 网络也不太好, 加上 jar 包, 三百多兆, 几次的断掉, 最后好不容易 down 下来了, 结果在 myeclipse 中没有显示各种依赖, 然后就是很正常的右击 buil path 嘛, 右击项目, 发现 build path 没有子选项, 这怎么搞, 第一次碰到这样的情况, 然后就是删除项目, 重新从工作空间导入到 myeclipse 中, 结果是一直刷新, 刷呀刷, 刷到我没脾气, 最后重启 myeclipse , 结果还是那个吊样, 以为是 check 下来的项目不完整, 就删除了本地的项目 , 重新从 svn checkOut 下来, check 完后结果还是这个吊样, 心累了, 因为导入到 myeclipse中, myeclipse没有认定其是一个javaWeb项目 , 图标都和其他的项目不同, 哪里谈编译 , 后来百度了下, 说是.project文件的问题, 进文件一看, .project里面没几行代码, 然后就进svn 看下线上的.project文件. 这才找到原因, 把svn上.project文件中的代码拷贝到本地, 然后再次本地导入项目, 就可以编译了.

转载于:https://www.cnblogs.com/daimajun/p/7422523.html

<think>好的,用户现在想了解如何使用STM32标准库实现二进制分时调制,并且需要示例代码或具体实现方法。我需要结合之前的对话和用户提供的引用资料来回答这个问题。 首先,回顾之前的回答,我详细比较了二进制权重调制和线性PWM的区别,包括原理、STM32实现、性能对比等。用户现在需要具体的实现方法,所以应该从配置定时器、状态机设计、代码示例等方面展开。 用户提到了使用STM32标准库,所以需要确保代码符合标准库的语法。之前的引用中提到了定时器编程、ADC协同、DMA优化等,可能需要引用相关的知识点。例如,引用[1]中的定时器寄存器开发和引用[3]中的输出使能函数可能相关。 接下来,用户可能需要分步骤的指导,包括硬件配置、状态机设计、中断处理、示例代码和注意事项。需要确保代码示例正确,并且使用标准库的函数,比如TIM_TimeBaseInit、TIM_OCInit、TIM_Cmd等。 同时,用户可能需要了解如何分时切换不同的权重位,使用状态机来管理当前位,并在定时器中断中更新CCR值。需要参考引用[3]中的函数,如TIM_CCxCmd来启用或禁用通道。 另外,需要考虑如何计算每个权重位的时间片,比如根据基本时间单位t_base和位权重来设置不同的占空比。可能需要使用DMA来优化性能,如引用[2]中提到的DMA与ADC协同工作,但这里可能更关注定时器中断和状态机。 还需要注意用户提到的二进制分时调制的优缺点,比如刷新率的问题,以及如何通过增加位数来提高分辨率。在代码示例中,可能需要展示如何通过调整BIT_COUNT来扩展分辨率。 最后,确保回答结构清晰,分步骤说明,并提供完整的代码示例,同时引用相关的参考资料。例如,在中断服务函数中使用TIM_GetITStatus和TIM_ClearITPendingBit来处理更新事件,引用[1]中的定时器配置方法。 检查是否有遗漏的细节,比如是否需要启用定时器中断,NVIC配置是否正确,以及如何设置ARR和PSC的值来获得合适的时间基准。同时,混合方案的优化可能需要结合线性PWM和二进制调制,但用户当前的问题可能更关注基础实现。 总结:需要提供基于标准库的定时器配置、状态机管理、中断处理和示例代码,引用相关文献,并解释每个步骤的作用,确保用户能够理解并实现二进制分时调制。</think>--- ### 基于STM32标准库的二进制分时调制实现方法(含代码示例) --- #### 一、硬件配置基础 1. **定时器选择** - 选择通用定时器(如TIM2-TIM5) - 配置为PWM模式1,向上计数模式 ```c TIM_TimeBaseInitTypeDef TIM_TimeBaseStruct; TIM_OCInitTypeDef TIM_OCInitStruct; // 定时器基础配置(1kHz基准频率,72MHz系统时钟) TIM_TimeBaseStruct.TIM_Prescaler = 72 - 1; // 1MHz时钟 TIM_TimeBaseStruct.TIM_Period = 1000 - 1; // 1ms周期 TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStruct); // PWM通道配置(以通道1为例) TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStruct.TIM_Pulse = 0; // 初始占空比为0 TIM_OC1Init(TIM2, &TIM_OCInitStruct); TIM_Cmd(TIM2, ENABLE); // 启动定时器[^1] ``` --- #### 二、分时调制核心设计 ##### 1. **状态机定义** ```c #define BIT_COUNT 4 // 4位分辨率(16级灰度) typedef struct { uint8_t current_bit; // 当前输出位(0~BIT_COUNT-1) uint16_t bit_time[BIT_COUNT]; // 各权重位时间片(单位:定时器周期) uint16_t bit_value[BIT_COUNT]; // 各权重位目标占空比 } BinaryPWM_Handler; BinaryPWM_Handler hbpm; ``` ##### 2. **权重时间计算** ```c // 假设总周期为T,各权重位时间片为:T/(2^BIT_COUNT), 2*T/(2^BIT_COUNT), ..., (2^(BIT_COUNT-1))*T/(2^BIT_COUNT) void BinaryPWM_Init(BinaryPWM_Handler *h, uint16_t total_period) { for(uint8_t i=0; i<BIT_COUNT; i++) { h->bit_time[i] = total_period * (1 << i) / (1 << BIT_COUNT); h->bit_value[i] = (h->bit_time[i] * 100) / total_period; // 转换为百分比占空比 } h->current_bit = 0; } ``` --- #### 三、中断驱动实现 ##### 1. **定时器中断配置** ```c // 启用定时器更新中断 TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); // NVIC配置 NVIC_InitTypeDef NVIC_InitStruct; NVIC_InitStruct.NVIC_IRQChannel = TIM2_IRQn; NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1; NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStruct); ``` ##### 2. **中断服务函数** ```c void TIM2_IRQHandler(void) { if(TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) { // 更新占空比 TIM_SetCompare1(TIM2, hbpm.bit_value[hbpm.current_bit]); // 调整定时器周期为当前位的时间片 TIM_SetAutoreload(TIM2, hbpm.bit_time[hbpm.current_bit]); // 切换至下一状态位 hbpm.current_bit = (hbpm.current_bit + 1) % BIT_COUNT; TIM_ClearITPendingBit(TIM2, TIM_IT_Update); } } ``` --- #### 四、使用示例 ```c int main(void) { // 初始化系统时钟和GPIO(略) BinaryPWM_Init(&hbpm, 1000); // 总周期1000个定时器计数单位 // 设置目标灰度值(例如10/16级) uint8_t target_gray = 10; for(uint8_t i=0; i<BIT_COUNT; i++) { hbpm.bit_value[i] = (target_gray & (1 << i)) ? 100 : 0; // 按位设置占空比 } while(1) { // 主循环可动态修改目标灰度值 // 例如通过ADC读取电位器值(参考引用[2]的ADC协同方法) } } ``` --- #### 五、关键优化技巧 1. **DMA加速(参考引用[2])** - 将`bit_value`数组通过DMA自动传输到TIMx_CCR1寄存器 ```c DMA_InitTypeDef DMA_InitStruct; DMA_InitStruct.DMA_PeripheralBaseAddr = (uint32_t)&TIM2->CCR1; DMA_InitStruct.DMA_MemoryBaseAddr = (uint32_t)hbpm.bit_value; DMA_InitStruct.DMA_DIR = DMA_DIR_PeripheralDST; DMA_InitStruct.DMA_BufferSize = BIT_COUNT; DMA_Init(DMA1_Channel5, &DMA_InitStruct); // 假设使用DMA1通道5 DMA_Cmd(DMA1_Channel5, ENABLE); ``` 2. **动态分辨率切换** ```c void Set_BitDepth(uint8_t new_depth) { BIT_COUNT = new_depth; TIM_SetAutoreload(TIM2, 1000 / (1 << new_depth)); // 调整基准周期 } ``` --- #### 六、注意事项 1. **时序对齐** - 必须保证中断响应时间 < 最短时间片(如4位调制时最小时间片为总周期/16) - 若使用72MHz主频,建议时间片长度 ≥ 10μs(对应72个时钟周期) 2. **输出通道配置(参考引用[3])** - 互补输出需调用`TIM_CCxNCmd()` ```c TIM_CCxCmd(TIM2, TIM_Channel_1, TIM_CCx_Enable); // 主通道 TIM_CCxNCmd(TIM2, TIM_Channel_1, TIM_CCxN_Enable); // 互补通道 ``` --- ### 相关问题 1. 如何验证二进制分时调制的实际输出波形是否符合预期? 2. 在多通道PWM场景下,如何同步多个定时器的分时调制? 3. 二进制调制与硬件PWM混合使用时需要注意哪些时序冲突? [^1]: 定时器基础配置需根据实际时钟树参数调整预分频值和重载值 [^2]: DMA传输需确保内存与寄存器地址对齐,避免数据溢出 [^3]: 互补输出配置需结合制动和死区时间设置,防止功率器件直通
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值