自学STM32的一些问题记录

张开发
2026/4/22 17:29:04 15 分钟阅读
自学STM32的一些问题记录
2025.1.6移植别人的中文库显示OLED时出现大量错误例如Hardware\OLED_Data.c(379): error: #253: expected a ,Hardware\OLED_Data.c(381): error: #8: missing closing quote解决方法添加控制参数--no-multibyte-chars表面原因直接将UTF-8格式的汉字写在程序中软件默认不支持。解决方法工程选项--C/C--Misc Controls写入以下控制参数--no-multibyte-chars2025.1.7 复用推挽输出和普通推挽输出GPIO_Mode_AF_PP复用推挽输出功能用于将 GPIO 引脚配置为复用功能的推挽输出模式。这意味着该引脚可以被用作片内外设的特定功能例如 UART 的 TX 线、SPI 的 SCK 线等。应用场景适用于需要将 GPIO 引脚用于特定外设功能的情况。特点具有较强的驱动能力可以直接驱动负载。GPIO_Mode_Out_PP普通推挽输出功能用于将 GPIO 引脚配置为普通的推挽输出模式。在这种模式下GPIO 引脚可以输出高电平或低电平。应用场景适用于一般的数字信号输出如控制 LED、继电器等。特点同样具有较强的驱动能力适合驱动小型负载。2025.1.9TIM_GetITStatus和TIM_GetFlagStatusTIM_GetITStatus和TIM_GetFlagStatus是 STM32 标准外设库中用于检查定时器状态的两个不同函数它们用于不同的目的TIM_GetITStatus用途用于检查定时器中断状态.参数定时器实例如TIM1中断源如TIM_IT_Update表示要检查的特定中断类型.返回值返回一个状态值SET或RESET表示指定的中断是否被触发.使用场景当你需要检查定时器的某个中断是否已经被触发时使用通常在中断服务程序ISR中使用以确认是否应该处理该中断.TIM_GetFlagStatus用途用于检查定时器状态标志.参数定时器实例如TIM1状态标志如TIM_FLAG_Update表示要检查的特定状态标志.返回值返回一个状态值SET或RESET表示指定的状态标志是否被设置.使用场景当你需要检查定时器的某个状态标志是否被设置时使用可以用于中断服务程序中也可以用于其他地方检查定时器的状态如定时器溢出、捕获等事件.二者区别检查对象不同TIM_GetITStatus检查的是中断状态而TIM_GetFlagStatus检查的是状态标志.使用目的不同TIM_GetITStatus通常用于中断服务程序中以确认是否应该处理某个中断TIM_GetFlagStatus可以用于更广泛的状态检查包括但不限于中断.应用场景不同TIM_GetITStatus更专注于中断处理逻辑而TIM_GetFlagStatus可以用于更广泛的状态监测和控制逻辑综上如果需要处理中断事件通常使用TIM_GetITStatus如果需要检查定时器的某个状态可以使用TIM_GetFlagStatus今天初始化“Timer_Init()”函数的时候发现程序会卡住分析之后发现是因为“Timer.c”文件是包括了中断的标志位更新中断但是进入中断函数后没有将中断位手动置零导致程序卡死再次复习一下指针的基础知识2025.1.14 PWM。。。。。今天遇到一个问题需要调用一个定时器中断去读取定时器输出的PWM信号信息但是读取的信号一直是“0”尽管我把占空比设置为100%捣鼓了很久发现了一个很基础的问题PWM是利用TIM2生成的但同时我的定时器中断读取函数也是用的TIM2所以造成了冲突。最后的PWM定时器设置会把中断定时器设置覆盖所以我把定时器中断的定时器改为了TIM3对应的复用GPIO口和定时器设置也要改可以看到TIM3的通道一在PA6第二个问题设置好了中断定时器、PWM输出但是串口助手收到的数据全是0。改了半天没想到问题出在电平读取函数uint8_t pwmStatus GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_2);PA2输出PWM按理来说没有问题只需要再将pwmStatus串口发送即可但是数据就是全是0.最后使用GPIO_ReadInputDataBit来读取GPIOA的PIN2的实际引脚电平反而成功了查了一些资料GPIO_ReadOutputDataBit来读取GPIO寄存器的输出数据位这将反映定时器控制的PWM信号状态。然而GPIO_ReadOutputDataBit和GPIO_ReadInputDataBit的区别在于它们读取的数据来源不同GPIO_ReadOutputDataBit读取的是GPIO寄存器的输出数据位即GPIO寄存器中存储的值。这个值代表了GPIO引脚的预期输出状态由定时器或其他外设控制。GPIO_ReadInputDataBit读取的是GPIO引脚的实际电平状态即引脚上实际检测到的电压电平。这个值可能受到外部电路的影响例如如果引脚连接了外部电路可能会导致实际电平与预期输出状态不一致。在大多数情况下当您使用定时器生成PWM信号并通过GPIO引脚输出时GPIO_ReadOutputDataBit和GPIO_ReadInputDataBit读取到的值应该是相同的因为GPIO引脚的输出状态是由定时器控制的。但是如果您的系统中有复杂的外部电路或噪声干扰可能会导致实际电平与预期输出状态不一致。使用GPIO_ReadOutputDataBit的一些原因直接反映定时器控制的状态使用GPIO_ReadOutputDataBit可以确保您读取到的是由定时器控制的PWM信号的预期状态而不受外部电路或噪声干扰的影响。简化调试和验证在调试和验证PWM信号生成逻辑时使用GPIO_ReadOutputDataBit可以更直接地检查定时器和GPIO配置是否正确最后这个问题还是没有彻底搞懂但是好在问题解决了回头再来想想这个奇怪的现象.......

更多文章