1.使用锂电池+升降压模块供电时,一旦锂电池电压下降0.5v,电机可能无法驱动
因为电机驱动时产生很大电流,此时电源内部电阻分走大量的电压,输出电压无法供给电机驱动
2.按钮消抖处理
由于金属片会在按下瞬间和松开瞬间产生抖动,所以需要在检测到0的时候先延迟再检测再延迟
此处p15是IPU模式
uint8_t Key_GetNum(void)
{
uint8_t KeyNum = 0;
if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_15) == 0)
{
Delay_ms(20);
while (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_15) == 0);
Delay_ms(20);
KeyNum = 1;
}
return KeyNum;
}
3.pwm输出是由单片机上的定时器输出而不是io控制寄存器,所以io接口此时必须使用复用输出推挽模式
4.在 STM32 定时器中,预装载寄存器(Preload Register)的核心作用是控制比较值(TIM_Pulse)的更新时机.
5.对于定时器多通道功能的总结
1. 输出比较(Output Compare, OC):生成信号
- PWM 输出:每个通道可独立输出一路 PWM 波,且占空比、频率可单独调节。例:小车的左右轮电机分别由定时器的通道 1 和通道 2 控制,通过独立调节两路 PWM 的占空比,实现左右轮转速差异化(转弯功能)。
- 定时翻转 / 触发:通道可配置为 “计数值达到比较值时翻转电平”,生成固定频率的方波,或触发外部设备(如 ADC 采样、DAC 输出)。例:通道 3 每 10ms 翻转一次电平,用于触发传感器采集数据;通道 4 每 1s 输出一个脉冲,用于控制 LED 闪烁频率。
2. 输入捕获(Input Capture, IC):检测外部信号
- 测量频率 / 周期:通道可捕获外部脉冲信号(如编码器、超声波模块的回波),通过记录脉冲的时间间隔计算频率或周期。例:用通道 1 捕获电机编码器的脉冲,计算电机转速;用通道 2 捕获超声波的回波信号,计算距离。
- 测量脉冲宽度:捕获外部信号的高电平 / 低电平持续时间,用于识别按键长按 / 短按、红外遥控编码等。
6.uint8_t 和 char 的存储长度相同(都是 1 字节) ,且在很多场景下可以 “等价使用”
rx_buffer 定义为 uint8_t rx_buffer[RX_BUFFER_SIZE](字节数组),而 C 语言中字符串的本质就是 “以空字符 \0 结尾的字节数组” 。
在字符串处理场景中,我们关心的是字节的二进制值(每个字符对应一个 ASCII 码,本质是 0~127 的数值),而不是它的 “符号解读”。例如,字符 '0' 的 ASCII 码是 48,无论是 uint8_t 还是 char,存储的二进制都是 00110000。因此:
uint8_t数组存储 ASCII 码时,和char数组在二进制层面完全一致;- 通过
(char*)转换后,字符串函数(如strcmp)只会按字节值判断字符,忽略符号性差异,因此能正常工作。
uint8_t rx_buffer[10];
strcmp((char*)rx_buffer,"0001")
//比较rx_buffer和字符串0001
7.三目运算符
HAL_GPIO_WritePin(LED_GPIO_Port, RED_LED_Pin, red ? GPIO_PIN_SET : GPIO_PIN_RESET);
//等价于
if (red != 0) // 若red为非0(真)
{
PinState = GPIO_PIN_SET; // 输出高电平
}
else // 若red为0(假)
{
PinState = GPIO_PIN_RESET; // 输出低电平
}