自学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-chars

2025.1.7 复用推挽输出和普通推挽输出
GPIO_Mode_AF_PP(复用推挽输出)
-
功能:用于将 GPIO 引脚配置为复用功能的推挽输出模式。这意味着该引脚可以被用作片内外设的特定功能,例如 UART 的 TX 线、SPI 的 SCK 线等。
-
应用场景:适用于需要将 GPIO 引脚用于特定外设功能的情况。
-
特点:具有较强的驱动能力,可以直接驱动负载。
GPIO_Mode_Out_PP(普通推挽输出)
-
功能:用于将 GPIO 引脚配置为普通的推挽输出模式。在这种模式下,GPIO 引脚可以输出高电平或低电平。
-
应用场景:适用于一般的数字信号输出,如控制 LED、继电器等。
-
特点:同样具有较强的驱动能力,适合驱动小型负载。
2025.1.9 TIM_GetITStatus 和 TIM_GetFlagStatus
TIM_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配置是否正确
最后这个问题还是没有彻底搞懂,但是好在问题解决了,回头再来想想这个奇怪的现象.......
更多推荐



所有评论(0)