一片伟大的净土

灵魂的归处,肉体的坟墓。

zzczzczzc's home

使能和配置之间的顺序关系

2025/3/20

寄存器独立性
GPIO配置寄存器(CRL/CRH)和定时器寄存器(TIMx_ARR等)属于不同的硬件模块
二者初始化顺序不会直接影响对方寄存器的物理状态

GPIO复用功能映射 如果使用重映射功能(如GPIO_PinRemapConfig),必须先完成GPIO配置再初始化定时器:

阅读全文

外部中断和定时器捕获旋转编码器

教程 2025/3/20

现有方案:使用PA6和PA7的上升沿外部中断(EXTI9_5_IRQn)检测编码器信号
主要问题:外部中断方式在高速旋转时会产生大量中断,占用CPU资源

定时器理论上可以达到晶振检测幅度(CPU占用0,硬件自动计数),外部中断有限

如果不能直接生成定时器捕获旋转编码器的代码(有误等等问题),可以先实现外部中断,让他改成定时器捕获

外部中断进出捕获数量会少于定时器捕获看代码里的Encoder_TIM_Init函数,TIM3被设置为编码器模式,使用两个通道(PA6和PA7)来捕获正交编码器的信号。定时器在这种模式下会自动处理脉冲的边沿,根据两个通道的相位差来计数,这种方式效率很高,不会丢失脉冲,因为硬件直接处理,无需软件中断。 而如果用户之前尝试过用外部中断(比如EXTI)来处理每个脉冲的上升沿或下降沿,那么在高速旋转时,中断响应时间可能成为瓶颈。比如,每次中断都需要进入中断服务例程,保存现场,处理计数,恢复现场,这些步骤需要一定的时间。如果编码器的脉冲频率超过了中断处理的速度,就会导致丢失部分脉冲,从而计数比定时器方式少。

阅读全文

阿里云的qwq-plus感觉不如DeepSeekR1模型

教程 2025/3/20

qwq-plus运行的很快,明明给他了codebase,依旧会使用不属于头文件的函数来实现
而且实现还是错的,反复给他错误,他也不会修复
DeepSeekR1目前没毛病

keil5需要点击刷新一下,不然CLION的AI会识别到之前文件的内容

阅读全文

volatile变量

教程 2025/3/20

volatile 是C/C++中的关键字,用于告知编译器该变量的值可能在任何时刻被意外修改,要求编译器不要对此变量进行优化处理
在STM32开发中,正确使用volatile是确保硬件交互可靠性的关键,但也要避免滥用以免降低性能。通常建议:
所有被中断修改的全局变量必须加volatile
硬件寄存器指针必须加volatile
多线程共享变量根据具体情况决定

阅读全文

关于嵌入式编程

教程 2025/3/19

只需要记住流程,因为每个芯片的库函数和操作都不一样,但是核心是通的。
比如GPIO配置,PWM波输出是定时器复用GPIO输出信号(此时GPIO只做输出出口)
比如,定时器TIM,IRQn中断编号,IRQHandler中断处理,NVIC嵌套向量控制(MCU的信号保镖)等
AFIO复用集群,EXTI外部中断等等,NVIC控制EXTI和TIM信号是否可以到达MCU

阅读全文
1 2 3 4 5 ... 33