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_GetITStatusTIM_GetFlagStatus

TIM_GetITStatusTIM_GetFlagStatus 是 STM32 标准外设库中用于检查定时器状态的两个不同函数,它们用于不同的目的:

TIM_GetITStatus

  • 用途:用于检查定时器中断状态.

  • 参数:定时器实例(如 TIM1);中断源(如 TIM_IT_Update),表示要检查的特定中断类型.

  • 返回值:返回一个状态值(SETRESET),表示指定的中断是否被触发.

  • 使用场景:当你需要检查定时器的某个中断是否已经被触发时使用,通常在中断服务程序(ISR)中使用,以确认是否应该处理该中断.

TIM_GetFlagStatus

  • 用途:用于检查定时器状态标志.

  • 参数:定时器实例(如 TIM1);状态标志(如 TIM_FLAG_Update),表示要检查的特定状态标志.

  • 返回值:返回一个状态值(SETRESET),表示指定的状态标志是否被设置.

  • 使用场景:当你需要检查定时器的某个状态标志是否被设置时使用,可以用于中断服务程序中,也可以用于其他地方检查定时器的状态,如定时器溢出、捕获等事件.

二者区别

  • 检查对象不同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_ReadOutputDataBitGPIO_ReadInputDataBit的区别在于它们读取的数据来源不同:

  • GPIO_ReadOutputDataBit:读取的是GPIO寄存器的输出数据位,即GPIO寄存器中存储的值。这个值代表了GPIO引脚的预期输出状态,由定时器或其他外设控制。

  • GPIO_ReadInputDataBit:读取的是GPIO引脚的实际电平状态,即引脚上实际检测到的电压电平。这个值可能受到外部电路的影响,例如,如果引脚连接了外部电路,可能会导致实际电平与预期输出状态不一致。

在大多数情况下,当您使用定时器生成PWM信号并通过GPIO引脚输出时,GPIO_ReadOutputDataBitGPIO_ReadInputDataBit读取到的值应该是相同的,因为GPIO引脚的输出状态是由定时器控制的。但是,如果您的系统中有复杂的外部电路或噪声干扰,可能会导致实际电平与预期输出状态不一致。

使用GPIO_ReadOutputDataBit的一些原因

  • 直接反映定时器控制的状态:使用GPIO_ReadOutputDataBit可以确保您读取到的是由定时器控制的PWM信号的预期状态,而不受外部电路或噪声干扰的影响。

  • 简化调试和验证:在调试和验证PWM信号生成逻辑时,使用GPIO_ReadOutputDataBit可以更直接地检查定时器和GPIO配置是否正确

最后这个问题还是没有彻底搞懂,但是好在问题解决了,回头再来想想这个奇怪的现象.......

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐