- 博客(15)
- 收藏
- 关注
原创 STM32CubeMX 定时器非对称PWM模式+中心对齐计数
在两个非对称PWM极性相同的情况下,CCR1和CCR3控制工作电平在向上计数时的起始点,CCR2和CCR4控制工作电平在向下计数时的结束点。而且当占空比超过一定值时,移相角度无法固定,所以如果同一个定时器想要输出固定移向角度的PWM,那么其移向角度/360° + 占空比需要小于等于100%。定时器PWM输出有一种非对称PWM模式的输出形式,搭配中心对称计数方式可实现单个定时器输出两路相位差180°的PWM,而如果与其他定时器的PWM搭配,则相对其他定时器的PWM可以做出单路PWM 0-180°移相。
2025-02-12 14:46:50
478
原创 STM32CubeMX 定时器抖动模式实现高分辨率PWM
关键参数为Dithering设置成Enable,Fractionnal_Period/16设置为15(注意Fractionnal_Period/16的设置范围为0-15)。1、抖动模式(Dithering)下,按照上述设置,其计数最大值为(840 * 16) - 1,而不是(840 - 1) * 16。2、CCR寄存器的赋值范围扩大到0 - (840 *16 -1),不再是原本的0 - (840 - 1)。如果未打开抖动模式(Dithering),普通情况下一个周期记840个数;即可生成50%的PWM。
2025-02-08 16:45:48
298
原创 QT获取完整dll依赖文件
但是在使用MSVC编译器之后,发现QT的一键生成工具不可靠,尤其是使用64位的情况,经常把32位的dll导入到64位中,进而导致无法打开exe。警告和错误,以及带黄色问号的dll都可以先不用管,我们先查看其他dll的依赖关系。depends.exe用来查询QT导出的dll版本是否正确,如果不正确就到QT的安装路径下的编译器文件复制相应的文件出来。这里就要注意CPU这栏,上图中的exe是64位的,所以dll需要x64,如果参杂了x86就需要进行替换。首先,使用QT提供dll一键生成的工具,导出关键dll。
2025-01-02 16:06:52
507
原创 QT BLE蓝牙上位机开发
/QMessageBox::information(this, tr("提示"), tr("服务建立失败"));//QMessageBox::information(this, tr("提示"), tr("服务建立成功"));//QMessageBox::information(this, tr("提示"), tr("创建蓝牙主机失败"));QMessageBox::information(this, tr("提示"), tr("扫描异常"));// 获取所有服务的特征值。......(位置1)
2025-01-02 15:34:54
1018
原创 雅特力AT32F415移植RT-Thread
3、与FreeRTOS不同的是,RT-Thread开启线程后,后面的代码还会执行(即while中的代码也会运行),因为其原理是将main也初始化成一个线程了,所以上面创建了2个线程,实际上却是有3个线程在交替运作。2、如果遇到总是进入HardFault_Handler的情况,可以在rt_hw_board_init()函数的开头位置将NVIC的优先级组修改为4级。安装完pack包之后,就可以在在keil的运行环境中添加RT-Thread,对kernel勾选后点击OK,即可在工程中自动添加上对应文件。
2024-12-23 14:11:10
462
原创 雅特力AT32F415移植官方FreeRTOS
⑧打开“at32f415_int.c”文件,注释掉SVC_Handler、PendSV_Handler、SysTick_Handler。③复制到AT32代码工程之后在进行一次裁剪,进入到“portable”文件中,只保留红框内的三个文件,其他全都删除。此处需要说明的是,AT32F415虽然是M4内核,但部分内核功能做了删减,所以只能使用M3的内核文件。2、需要将NVIC的优先级组修改为4级,避免RTOS的优先级出错,导致总是进入HardFault_Handler。⑨在main.c中添加测试线程。
2024-11-26 19:02:07
1121
3
原创 STM32 HAL库形式制作SPI Flash(W25Q16)的 Keil下载算法
此时需要自己从别的项目工程中拷贝一份system_stm32g0xx.c放到本工程中,同时在工程文件中添加,此时顺便将W25Qxx.c(FLASH驱动代码)和system_stm32g0xx.c一起添加进来,如下图。进入下载设置界面,添加我们的FLM算法,然后将RAM空间暂时改大,否则算法下不进去(算法是下载到MCU中运行的),如下图,配置完IO口和时钟频率之后(注意时钟频率会影响SPI的通讯速率),配置结束之后,点击项目设置,只需要设置如下选项即可,/* 校验成功 */
2023-06-21 15:50:52
2404
原创 QT检测当前连接的串口是否拔出
由于QT不同版本,其函数逻辑和编译方式不同,提供两种检测代码,根据QT是否能够编译通过选用。//配置串口错误槽(正连接的串口拔出会出现错误)//配置串口错误槽(正连接的串口拔出会出现错误)
2023-05-26 18:22:30
1256
1
原创 STM32 IAP固件升级跳转后卡死可能存在的原因
导致跳转到APP代码时运行到时钟配置就卡死,而时钟没配置成功就无法初始化IO口,也没法发出信号做出提示,看着像app区的代码不运行,但其实还是运行了的。分析:APP代码中需要清除bootload中外设的初始化,否则在APP中的初始化无法成功,而且STM32CubeMX生成的HAL,下层函数大部分都是while形式的,初始化不成功就会卡死,如果这个时候设置了看门狗,就会复位。使用IAP固件升级,本质上就是代码地址的跳转,从bootload代码跳转到APP代码。2、APP区重新清除设置并配置时钟参数。
2023-05-26 15:53:31
3178
5
原创 Keil设置单行字符提示
2、设置每行字符数阈值。一般设置为80即可(代码规范中一般都用每行最多80字符)。如红框里的线所示,超过条线的代码就是超出设定的字符数了。如红框所示,每行代码高亮部分就是超出 设定的字符数了。Coloured Background:高亮提示。Vertical Line:虚线提示。
2023-05-15 14:57:00
2199
1
原创 QT搭建Android编译环境及使用安卓虚拟机调试
但是经过实测,JAVA SE20用不了,编译的时候会提示错误,查了不少资料和其他人的经验分享,JAVA SE8 JDK是最正常的版本。JAVA SE8 JDK是JAVA环境的支持包,Android APP通常使用JAVA区编写,但是使用QT可以直接用C/C++,其实是QT将C/C++自动转换为了JAVA,最后用的也是JAVA,所以需要JAVA的编译环境。注意:NDK对QT版本是有要求的,我使用的QT是5.11版本,最后使用r12b的版本,如果是5.13的版本,可以使用r18b。
2023-05-06 18:35:49
4640
1
原创 单片机中断优先级及中断嵌套,以STC8G为例。
当定时器1中断到来,进入中断服务函数之后,串口1中断来了,则会从当前的中断服务函数跳转到串口1的中断服务函数中,只有当串口1的中断服务函数执行完成后,才会再次返回定时器1中断服务函数,定时器1中断服务函数执行完成后返回主循环。且低查询优先级的中断服务函数也不会被高查询优先级的中断服务函数打断,必须等低查询优先级的中断服务函数执行完成后才执行高查询优先级的中断服务函数。例如:设置外部中断0为优先级3,定时器0为优先级2,串口1为优先级1,定时器1为优先级0。中断号就对应着中断查询优先级。
2023-05-06 10:15:05
3042
3
原创 STM32 HAL库串口突然不再接收数据的异常情况
如果串口中断重新接收打开频繁且间隔短的话,有可能会出现BUSY标志位持续置高的情况,此时在重新打开中断接收前,需要先判断串口状态是否为HAL_BUSY,再判断是否能重新打开。阻塞式接收为定长字节字节数,阻塞式接收突然不再接收数据的异常情况,大多数都是因为实际接收的字节超过了设定接收的字节长度,此时会导致ORE错误,且ORE错误一旦出现,后续的串口数据就不会再写入到缓存中。函数没有清除ORE错误的功能,只要在调用这个函数前使用__HAL_UART_CLEAR_OREFLAG(huart);
2023-03-15 08:49:01
7719
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人