使能和配置之间的顺序关系
寄存器独立性
GPIO配置寄存器(CRL/CRH)和定时器寄存器(TIMx_ARR等)属于不同的硬件模块
二者初始化顺序不会直接影响对方寄存器的物理状态
GPIO复用功能映射 如果使用重映射功能(如GPIO_PinRemapConfig),必须先完成GPIO配置再初始化定时器:
一片伟大的净土
灵魂的归处,肉体的坟墓。寄存器独立性
GPIO配置寄存器(CRL/CRH)和定时器寄存器(TIMx_ARR等)属于不同的硬件模块
二者初始化顺序不会直接影响对方寄存器的物理状态
GPIO复用功能映射 如果使用重映射功能(如GPIO_PinRemapConfig),必须先完成GPIO配置再初始化定时器:
现有方案:使用PA6和PA7的上升沿外部中断(EXTI9_5_IRQn)检测编码器信号
主要问题:外部中断方式在高速旋转时会产生大量中断,占用CPU资源
定时器理论上可以达到晶振检测幅度(CPU占用0,硬件自动计数),外部中断有限
如果不能直接生成定时器捕获旋转编码器的代码(有误等等问题),可以先实现外部中断,让他改成定时器捕获
外部中断进出捕获数量会少于定时器捕获看代码里的Encoder_TIM_Init函数,TIM3被设置为编码器模式,使用两个通道(PA6和PA7)来捕获正交编码器的信号。定时器在这种模式下会自动处理脉冲的边沿,根据两个通道的相位差来计数,这种方式效率很高,不会丢失脉冲,因为硬件直接处理,无需软件中断。 而如果用户之前尝试过用外部中断(比如EXTI)来处理每个脉冲的上升沿或下降沿,那么在高速旋转时,中断响应时间可能成为瓶颈。比如,每次中断都需要进入中断服务例程,保存现场,处理计数,恢复现场,这些步骤需要一定的时间。如果编码器的脉冲频率超过了中断处理的速度,就会导致丢失部分脉冲,从而计数比定时器方式少。
qwq-plus运行的很快,明明给他了codebase,依旧会使用不属于头文件的函数来实现
而且实现还是错的,反复给他错误,他也不会修复
DeepSeekR1目前没毛病
keil5需要点击刷新一下,不然CLION的AI会识别到之前文件的内容
volatile 是C/C++中的关键字,用于告知编译器该变量的值可能在任何时刻被意外修改,要求编译器不要对此变量进行优化处理
在STM32开发中,正确使用volatile是确保硬件交互可靠性的关键,但也要避免滥用以免降低性能。通常建议:
所有被中断修改的全局变量必须加volatile
硬件寄存器指针必须加volatile
多线程共享变量根据具体情况决定