第七章 当哥们儿有一天当上了警察,原来的哥们儿就不再好作哥们儿了

本文通过牛马逃亡记和等到这么一天的故事,探讨了在不同的立场和利益冲突下,人际关系的变化及其背后的深层原因。强调在评价他人行为时应当考虑其立场的影响,并提醒人们在职场变动时需谨慎评估形势。

第七章 当哥们儿有一天当上了警察,原来的哥们儿就不再好作哥们儿了
1.牛马逃亡记
一个人似乎没了良知,也似乎不看不听,很可能不是他的原因,而是因为他处的位置。
这个世界上很难说有永久的朋友和永久的敌人。当原来的互利变成互害,在利益上有了冲突,则原来的敌人可以变成朋友。
了解这一点,你在批评任何人之前,都应该想想,是他这个人与你对立,还是因为他今天的立场,使他不得不与你对立。
这就是所谓的对事不对人。要知道,每个人都有良知,每个人也都有眼睛会看,有耳朵会听。一个人似乎没了良知,也似乎不看不听,很可能不是他的原因,而是因为他所处的位置。
正因此,战争结束,我们惩罚的是后面的领导者,而不是在前面杀人的士兵。
所以一个成熟的人一定要知道,在看别人立场的时候,不可忽略那个人,绝对不要用立场否定别人,或否定人性。
因为有一天,你也可能换成对方的立场。
如同前面故事中的小牛和小崔,你原来的朋友,一下子成了敌人,你原来的敌人,又一下子成为了朋友。
2.等到这么一天
不论跳槽或自立门户,都得好好策划,而不能因为自己的狐假虎威地得到些掌声,而错估真正的形势。否则你会败得很惨,甚至惨到在原来的圈子呆不下去
想一想:陈总经理为什么会对朱小姐说那么好听的话?那是因为他总要透过朱小姐找尹部长,拍着朱小姐,办事会方便很多。
陈总经理能不能聘朱小姐?当然不能,因为跟尹部长闹翻的人,如果陈总经理聘了,岂不是会惹尹部长不高兴,怀疑陈总经理挖了他的人?
尹部长如果与陈总经理有业务关系,容不容许陈总经理聘朱小姐?当然不愿意。
这个故事虽然普通,却说出了一个大家不能忽略的事实。你不要以为站在今天的职位上,所获得的推崇,当你换了职位,依然能够保有。
不论跳槽或自立门户,都得好好策划,而不能因为自己狐假虎威地得到些掌声,而错估了形势,否则你会败得很惨,甚至惨到在原来的圈子的不下去。话说回来,如果当初朱小姐能够高高兴兴找个借口辞职,为老板做足面子,然后或者出国进修,或者先进入一个不相关的行业工作。呆上两年后再转入陈总经理的公司,则大有可能。
转进比撤退好听,杯酒释兵权比平定三藩来得省力。

<think>嗯,用户之前问的是关于STM32的TIM9配置编码器中断的问题,而我给出的回答是基于STM32F1系列的标准库配置。现在用户回复说:“哥们儿,你认真的吗,f1有tim9吗,肯定是f4配置啊”,显然用户发现了错误,指出STM32F1可能没有TIM9,应该用F4系列来配置。我需要仔细检查这个问题。 首先,我要确认STM32F1系列是否真的没有TIM9。查阅STM32F1的参考手册,发现确实,STM32F1的定时器资源通常包括TIM1到TIM4,而TIM9可能属于高级型号或不存在于F1系列中。用户提到的TIM9可能存在于STM32F4系列中,因此之前的回答混淆了F1和F4的配置。 接下来,用户希望得到正确的F4配置,所以需要调整之前的配置步骤,使用STM32F4的标准库(HAL库或标准外设库)。需要确认F4系列中TIM9的可用性,以及对应的GPIO引脚。例如,在F4中,TIM9的通道1和通道2可能对应不同的引脚,比如PE5和PE6或者其它引脚,具体需参考数据手册。 然后,配置步骤需要调整时钟使能部分,因为F4的时钟树与F1不同,APB1和APB2的总线分配可能不同。例如,TIM9在F4中通常挂在APB2总线上,所以需要使能对应的时钟。GPIO配置部分,F4的GPIO模式可能与F1不同,可能需要使用不同的模式,比如复用功能模式,并设置正确的复用功能编号。 编码器接口配置函数在标准库中可能名称不同,或者参数有所调整,需要查阅F4的标准库文档。中断配置部分,NVIC的中断通道名称也可能不同,例如TIM9的中断在F4中可能与其他定时器共享,需要正确设置中断服务函数的名字。 另外,用户提到使用标准库,所以需要确保所有使用的函数和结构体都是F4标准库中的,而不是HAL库的。例如,TIM_TimeBaseInitTypeDef在F4标准库中的参数可能与F1不同,比如是否有自动重载预装载使能等。 在编写中断服务函数时,需要确认F4中TIM9的中断向量名称是否正确,例如是否是TIM1_BRK_TIM9_IRQHandler还是其他名称。同时,清除中断标志的方式也可能不同,需要确保正确清除对应的标志位,避免中断重复进入。 最后,测试代码部分需要确保主函数中正确初始化,并能够读取编码器的值。可能还需要处理计数器溢出的情况,特别是当编码器高速旋转时,如何正确累积计数值,避免溢出导致的错误。 总结来说,我需要纠正之前的错误,重新提供一个适用于STM32F4系列的标准库配置TIM9为编码器接口的代码,并确保所有步骤正确无误,包括时钟配置、GPIO设置、定时器模式、中断配置以及中断服务函数的实现。同时,需要检查是否存在其他潜在问题,比如引脚复用功能是否正确,中断优先级设置是否合理,以及代码的兼容性和可移植性。</think>您说的对!STM32F1系列**没有TIM9**,这个定时器是STM32F4/F7系列才有的外设。这是我的疏忽,感谢指正。以下是基于**STM32F4标准库**的正确配置方案: ---------- ### 修正版配置步骤(STM32F4标准库) ```c #include "stm32f4xx.h" volatile int32_t Encoder_Count = 0; // 全局编码器累计值 void TIM9_Encoder_Init(void) { GPIO_InitTypeDef GPIO_InitStruct; TIM_TimeBaseInitTypeDef TIM_TimeBaseStruct; TIM_ICInitTypeDef TIM_ICInitStruct; NVIC_InitTypeDef NVIC_InitStruct; // 1. 使能时钟(F4的TIM9挂载在APB2) RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM9, ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE); // 假设用PE5/PE6 // 2. 配置GPIO(F4必须设置复用功能) GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF; // 复用模式 GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP; // 上拉 GPIO_Init(GPIOE, &GPIO_InitStruct); // 设置引脚复用功能(TIM9_CH1=PE5, TIM9_CH2=PE6) GPIO_PinAFConfig(GPIOE, GPIO_PinSource5, GPIO_AF_TIM9); GPIO_PinAFConfig(GPIOE, GPIO_PinSource6, GPIO_AF_TIM9); // 3. 定时器基础配置 TIM_TimeBaseStruct.TIM_Prescaler = 0; TIM_TimeBaseStruct.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseStruct.TIM_Period = 0xFFFF; // 16位最大值 TIM_TimeBaseStruct.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseInit(TIM9, &TIM_TimeBaseStruct); // 4. 编码器接口配置(F4使用TIM_EncoderInterfaceConfig) TIM_EncoderInterfaceConfig(TIM9, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising); // 5. 输入捕获参数(F4需要单独配置两个通道) TIM_ICInitStruct.TIM_ICFilter = 0x0; // 无滤波 TIM_ICInitStruct.TIM_ICPrescaler = TIM_ICPSC_DIV1; TIM_ICInitStruct.TIM_ICPolarity = TIM_ICPolarity_Rising; TIM_ICInitStruct.TIM_ICSelection = TIM_ICSelection_DirectTI; // 通道1配置 TIM_ICInitStruct.TIM_Channel = TIM_Channel_1; TIM_ICInit(TIM9, &TIM_ICInitStruct); // 通道2配置 TIM_ICInitStruct.TIM_Channel = TIM_Channel_2; TIM_ICInit(TIM9, &TIM_ICInitStruct); // 6. 使能更新中断(处理计数器溢出) TIM_ITConfig(TIM9, TIM_IT_Update, ENABLE); // 7. 配置NVIC(F4的TIM9中断单独存在) NVIC_InitStruct.NVIC_IRQChannel = TIM1_BRK_TIM9_IRQn; NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0; NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStruct); // 8. 启动定时器 TIM_Cmd(TIM9, ENABLE); } ``` ---------- ### 中断服务函数(F4专用) ```c void TIM1_BRK_TIM9_IRQHandler(void) { if (TIM_GetITStatus(TIM9, TIM_IT_Update) == SET) { // 判断计数方向(F4使用TIM_GetDirection()) if (TIM_GetDirection(TIM9) == TIM_CounterDirection_Up) Encoder_Count += 0x10000; // 65536 else Encoder_Count -= 0x10000; TIM_ClearITPendingBit(TIM9, TIM_IT_Update); } } // 读取完整编码器值 int32_t Get_Encoder_Value(void) { int32_t temp; temp = Encoder_Count + (int16_t)TIM_GetCounter(TIM9); // 注意强制类型转 return temp; } ``` ---------- ### 关键差异说明(F1 vs F4) 1. **时钟系统不同**: - F4的TIM9挂载在APB2总线,GPIO在AHB1 - F4需要明确配置GPIO复用功能(`GPIO_PinAFConfig`) 2. **中断名称**: - F4中TIM9与TIM1_BRK共享中断通道 - 中断服务函数名必须严格匹配:`TIM1_BRK_TIM9_IRQHandler` 3. **库函数兼容性**: - F4标准库函数参数与F1略有不同(如`GPIO_PuPd`替代了上拉/下拉配置方式) - TIM_GetDirection() 在F4中返回值为`uint8_t`(实际等同于F1的行为) ---------- ### 验证建议 1. **硬件连接检查**: ```c PE5 -- 编码器A相 PE6 -- 编码器B相 GND -- 共地 ``` 2. **调试技巧**: ```c // 在main循环中打印数值 printf("Encoder: %ld\n", Get_Encoder_Value()); // 或用LED指示方向 if(Get_Encoder_Value() > last_val) LED_ON(); else LED_OFF(); ``` 3. **性能注意**: - 编码器最高转速受限于TIM9的计数频率(若时钟为84MHz,16位计数器最大支持1280转/秒) - 中断响应时间需小于两次计数溢出的间隔 如果遇到具体问题(如计数不准确、中断不触发),可以提供更多硬件细节,我会进一步协助分析。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

进击的横打

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值