Erickson_qq_
这个作者很懒,什么都没留下…
展开
-
STM32。系统计时、延时功能,是怎么实现的?
免责声明:本文内容仅代表作者个人观点和知识水平,不构成任何推荐或建议。因参考本文而造成任何直接或间接损失后果的,作者不承担任何责任。本文中的信息仅为作者个人学习研究成果的分享,不作为专业意见或建议。文章中如有错误,请斧正。因应用本文内容导致的风险或损失,作者不承担任何法律责任。以下是正文内容。原创 2024-04-06 21:26:03 · 47 阅读 · 0 评论 -
STM32。如何降低功耗?
通过减缓GPIO口的切换速度,可以有效减少不必要的能量消耗。在不使用诸如UART、PWM、ADC等外设时,及时关闭其相关时钟,待需要时再重新开启,以减少这些外围设备在空闲状态下对电源的消耗。:对于长期不用的GPIO组,通过API如LL_IOP_GRP1_DisableClock()禁用其时钟,避免无谓的电源浪费。:在满足性能需求的前提下,根据任务负载动态调整处理器的时钟频率和工作电压,实现功耗与性能的平衡。:未使用的GPIO引脚设置为模拟输入模式,可以减少不必要的电流消耗。这样就降低了时钟频率。原创 2024-04-06 18:57:03 · 104 阅读 · 0 评论 -
如果某个模块或者芯片无法使用,要检查什么?
其次,对于含有晶振或者时钟信号输入的芯片,验证其时钟源是否正确且稳定运行至关重要。在一些复杂系统中,还需关注时钟同步机制是否有效执行,以避免因时钟信号异常导致的芯片无法初始化或工作异常。确认芯片的供电线路是否畅通无阻,电压值是否符合芯片数据手册中规定的范围,以及是否存在瞬态尖峰、噪声干扰等异常现象。同时,观察电源稳压器的工作状态,看是否有过热、输出不稳等可能导致电源失效的问题。例如,对于外设接口芯片,要确认相关寄存器配置是否合理,I/O引脚设置是否适配当前电路环境,以及总线通信协议参数是否准确无误。原创 2024-01-01 17:56:17 · 454 阅读 · 0 评论 -
条件编译#ifdef和#if defined使用哪个比较好。
if defined避免了#ifdef可能产生的错误警告。一些编译器在#ifdef检查一个未定义的宏时会报警,而#if defined不会。#if defined可以检查一个宏是否被定义为任意值,而#ifdef要求宏必须定义为1。#if defined更符合语义,明确指出这是一个已定义的宏。#ifdef更常用于检查是否有定义某个变量,不太适合用于宏的检查。使用#ifdef时需要确保宏只被定义一次,否则可能导致意外结果。#if defined表达更明确,对其他开发者更友好。对于条件编译,建议使用。原创 2023-11-02 20:57:54 · 81 阅读 · 0 评论 -
PCM和PDM的区别。
举例:若音频信号在一个采样周期内的强度值是50%,则PDM编码可能是:010001111010110100其中0和1的数量比例接近50%,表示50%的强度。将每次采样的模拟分量幅度表示为N位的数字分量(N = 量化深度)(例如8bit PCM一共可以表示256个量化等级,范围是0到255。PDM编码后的信号不能直接表示音频,需要通过低通滤波器等对比例进行解码,恢复音频信号。4.信号强度由0和1的比例表示在一个采样周期内,0和1的数量比例表示信号的强度,比例越高表示强度越大。PCM音质更好,PDM成本更低。原创 2023-11-02 20:19:55 · 1009 阅读 · 0 评论 -
threadX的USBX的初始化和解初始化的分析。
tx_application_define的最后会使用tx_byte_pool_create创建usb线程的内存空间“ux_device_app_byte_pool”,再创建usb线程,也就是执行。主要就是创建了线程,也就是第3个参数app_ux_device_thread_entry,这个参数内是MX_USB_Device_Init,也就是USB底层初始化。进来的参数只有1个,是memory_ptr,这个就是创建的usb线程空间“ux_device_app_byte_pool”原创 2023-10-28 21:57:52 · 181 阅读 · 0 评论 -
USB从机如何检测usb拔出。
STM32当发生suspend事件时,会有一个中断OTG_FS_IRQHandler,然后执行一个处理函数HAL_PCD_IRQHandler处理函数里面读取寄存器判断是否发生了suspend事件,如果发生,那么执行一个回调。当主机进入休眠时,USB总线会进入Suspend状态,这时STM32将产生Suspend中断;而且当电脑开机运行BIOS时,会认为usb插上,然后退出BIOS会进入suspend,然后才启动Windows系统,“退出BIOS会进入suspend”可能会误判为usb拔出。原创 2023-10-28 21:39:10 · 231 阅读 · 0 评论 -
USB。标准请求的索引是什么意思?有什么用?
设置描述符请求SET_DESCRIPTOR,他的索引可以是0,如果是设置字符串描述符,那么索引代表的是语言ID。是可选的,可以更详细地描述信息,如果信息已经被很好的描述了,那么就不需要索引,索引填0。不是所有的标准请求都需要索引,如果请求本身已经完整地描述了信息,那么索引可以为0,也就是不需要。设置接口请求SET_INTERFACE,他的索引代表的是接口号。设置地址请求SET_ADDRESS,他的索引是0。其中的索引,不同的请求,索引代表的意思是不同的。Q:标准请求中的索引是什么意思?原创 2023-10-28 21:35:14 · 46 阅读 · 0 评论 -
增加了一个任务,所有任务就都无法运行了,为什么。
因为芯片的ram大小不够。例如,假设你使用的是STM32G0系列芯片,ram只有8K,其他任务占用太多的ram,而增加了一个任务之后,就溢出了,导致ram不够大,所以导致所有任务都无法运行。原创 2023-10-28 21:32:28 · 26 阅读 · 0 评论 -
USB。端点0是默认的控制端点。端点1可以用作控制端点吗?
不可以,在USB系统中,只有端点0可以用作控制端点,端点1不能用作控制端点。端点1-15都只能数据传输,比如批量传输、中断传输和等时传输。原创 2023-10-28 21:25:44 · 108 阅读 · 0 评论 -
NMI中断是什么?
普通的中断可以通过设置中断屏蔽位来阻塞,但NMI中断不可以被屏蔽,它具有最高的优先级。一旦NMI被触发,CPU会停止其他所有的中断和任务,转而仅响应NMI中断,执行相应的中断服务程序。NMI中断是一种硬件级的紧急中断机制,用于处理严重的系统异常与故障情况。NMI中断是一种专门用于处理系统致命错误的高优先级紧急中断机制,它能够快速响应系统异常,采取应急措施,保证系统的稳定和安全运行。NMI中断是一种不可屏蔽的紧急中断,当它被触发时,CPU会立即响应,暂停当前所有的中断或任务,转而执行NMI中断服务程序。原创 2023-05-21 19:29:03 · 3657 阅读 · 0 评论 -
STM32。硬件CRC的使用。
STM32的CRC模块通过硬件自动进行CRC计算,大大提高了CRC的计算速度,非常适合需要频繁计算CRC的场景,如通信协议等。使用STM32 CRC模块,我们只需要提供要计算的数据,库函数会自动完成CRC计算,并返回CRC结果。CRC(循环冗余校验)是一种错误检测码,能够检测数据在传输或存储过程中是否出现了错误。STM32的CRC模块提供硬件计算CRC的功能,可以大大提高CRC计算的效率。HAL_CRC_Accumulate函数是累积计算CRC,它会把上次计算的CRC值作为初始值继续计算。原创 2023-05-21 19:09:52 · 1256 阅读 · 0 评论 -
freeRTOS。任务通知。又称之为“邮箱”。
FreeRTOS中的任务通知机制允许一个任务通知其他任务某个事件的发生,被通知的任务可以选择是否挂起等待事件的到来。这个机制通过xTaskNotify()函数实现发送通知,xTaskNotifyWait()函数实现接收通知。xTaskNotifyWait()函数允许一个任务等待来自一个或多个任务的通知。任务通知机制提供了一种轻量级的任务间通信方式,通过设置通知值和选项来实现对事件的多路分发和同步。xTaskNotify()函数用于从一个任务向另一个任务发送通知。原创 2023-05-21 18:07:56 · 435 阅读 · 0 评论 -
STM32。使用usb升级固件。
3.选择USB设备:在STM32CubeProgrammer软件中,选择“USB”选项,如果没有port号,点击“刷新”,会识别出连接的USB设备,然后点击连接,如下图所示,Port栏的USB1就是我们连接的usb。5.复位芯片:固件下载完成后,我们需要重新复位STM32芯片,也可以断电直接重启机器,这会让芯片离开bootloader代码,开始执行新下载的固件程序,这样即可使用新的固件。1.连接USB线:使用usb线连接MCU芯片的usb接口,连接到电脑上。使用usb升级固件。原创 2023-05-21 17:56:26 · 1592 阅读 · 0 评论 -
STM32U5系列芯片,不支持ST-LINK Debugger怎么办?
这是因为keil的新版本支持,旧版本不支持。正常是可以选择ST-LINK Debugger,然后使用ST-LINK V2下载器来下载。STM32U5系列芯片,不支持ST-LINK Debugger怎么办?注意要安装J-Link 的驱动。这样的方式就是J-Link 的SWD来下载。其实右边除了第一个,其他都是地,如下图。原创 2023-05-21 17:44:03 · 409 阅读 · 0 评论 -
keil进入单步调试时,R0\R1\R2这种是什么意思?
ARM处理器有16个通用寄存器,用于存储数据和地址,标号为R0-R15。这16个寄存器可以根据需要灵活使用,没有严格的用途限定。在Keil中进行单步调试时,会遇到R0、R1、R2等表示法,这些是ARM架构中对通用寄存器的命名约定。除此之外,ARM还有其他专用寄存器,如状态寄存器CPSR/SPSR、控制寄存器等。keil进入单步调试时,R0\R1\R2这种是什么意思?原创 2023-05-21 17:36:47 · 1260 阅读 · 0 评论 -
STM32。因为没有安装对应软件包,keil提示“Error:Device not found”怎么办。
找到ST公司,然后找到对应的单片机型号,点击左边的那个蓝色字的连接,可以直接取官网下载,或者点击右边的Install安装。网络有点不稳定,有时候很慢,如果慢的话,再多重新下载几次,直到网速快再下载即可。然后一打开,就提示你没有对应软件包,跳出一个界面让你下载,如果你不管然后关掉,一路点击ok下去,他会警告错误。下载完毕之后,直接点击运行,一路next就可以安装完成。使用STM32CUBEMX生成一个没做过的芯片,然后打开对应的keil工程,比如叫做XXX.uvprojx。原创 2023-05-21 17:24:10 · 4539 阅读 · 0 评论 -
为什么写flash时,要先擦除。
总结:Flash需要先擦除后才能写入新的数据,这是由Flash存储单元的物理结构和写入机制决定的。Flash的每一个存储单元只能由1变0,无法由0变1。所以,需要先将目标存储段全部设为1(擦除),然后选择性地由1变0(写入),才能实现数据的修改或更新。那么之后,无论写入什么数据,都能由1变0,实现数据的写入。如果不先擦除,当需要由0变1的 bit 出现时,就无法完成写入操作,从而导致写入失败。这是因为,Flash存储器的存储单元是浮动栅极晶体管,每一个存储单元只能由1变0,无法由0变1。原创 2023-05-21 17:18:20 · 3816 阅读 · 0 评论 -
SAI是什么?
SAI是一种更新的用于数字音频传输的接口协议,相比I2S,SAI在通道数、数据位宽、采样率、工作模式以及时钟配置等方面都更加灵活和强大,这也使得SAI现在应用更加广泛。但是SAI比I2S功能更强大,配置更加灵活。I2S:(Inter—IC Sound)总线, 又称集成电路内置音频总线,是飞利浦公司为数字音频设备之间的音频数据传输而制定的一种总线标准,该总线专责于音频设备之间的数据传输,广泛应用于各种多媒体系统。1.支持更多的数据通道,SAI支持16/32个通道,I2S仅支持2个通道。原创 2023-05-21 17:14:33 · 2220 阅读 · 0 评论 -
使用HAL库进行uart中断接收
当你在windows使用uart发送软件,发送uart数据给STM32的uart时,STM32就会发生uart中断,运行到HAL_UART_RxCpltCallback,然后打印接收到的数据。然后在最开始,要先执行一次。定义接收1个字节的变量。外部引用uart3句柄。原创 2023-05-21 15:59:30 · 173 阅读 · 0 评论 -
STM32。如何修改usb一次收发字节数?
如果同时有收发端点,那么报告描述符中的收发端点的Report Size和Report Count,都需要设置为我们需要的字节数0x0D。比如第1个字节是包头,中间字节是数据,最后一个字节是校验和,然后这些加起来一共多少个字节,这就是usb一次收发的字节数。USB协议规定,每次通信需要指定收发的数据量,也就是一次传输的字节数。STM32作为USB设备,我们需要根据具体的应用设置正确的收发字节数,否则USB通信会出现错误。设置了端点描述符和报告描述符后,每次USB收发的时候,都会按照设置的13字节来传输数据。原创 2023-05-21 15:53:57 · 496 阅读 · 0 评论 -
编译过程中的“未定义错误”问题
因为B.h文件在包含A.h文件之前就使用了S,所以在B.h里面,S这个类型还没定义就使用了,因此编译器认为S未定义,所以报错。要解决这个问题,只需要更改A.h和B.h两个文件的包含顺序:在A.h文件中,先定义结构体S,再包含B.h文件。这样,在B.h文件使用S类型时,S已经被定义了,就不会再报未定义的错误。但是当编译B.h文件时,却报错说S未定义。这是因为A.h和B.h两个头文件互相包含了,且包含的顺序不正确。具体来说:A.h文件先包含了B.h文件,所以B.h文件需要包含定义了S的头文件A.h。原创 2023-05-21 15:40:42 · 589 阅读 · 0 评论 -
STM32。查询复位原因。
查询STM32的复位原因,我们可以直接读取RCC控制寄存器里面的复位标志位。各个标志位表示不同的复位原因,我们一个一个检查就行。检查完一个标志位要记得清除它,否则下次开机还会认为是那个原因复位的。STM32单片机上电后,我们经常需要查询它此前是通过什么原因复位的。只有清楚复位原因,我们才能针对性地排除故障和处理问题。原创 2023-05-21 15:19:36 · 755 阅读 · 0 评论 -
如何使用串口来给STM32下载程序
4.在Download to file这个框,选择固件,也就是keil编译出的.bin文件或者.hex文件(都一样,直接选就行,他会自动识别),在Download to file这个框下面,可以选择擦除部分还是擦除全片。总结:使用usb转uart模块,插上windows电脑,连接到MCU的uart1之后,选择keil编译出的.bin文件或者.hex文件都行,一键下载。5.下载完成后,如果点击Back返回,是不能进行第二次程序下载的,必须重新打开,连接,才能下载。1.安装软件,可以自定义安装的目录。原创 2023-05-21 15:10:53 · 2560 阅读 · 0 评论 -
STM32。USB HID,如何发送标准键盘的按键报告?
CmdOutBuf[2]这个位置就是储存键值的位置,0x09代表的是键盘上F这个键,0x06代表的是键盘上C这个键,具体的按键对应什么键值需要去查。然后注意,HID_MOUSE_REPORT_DESC_SIZE这个宏定义也要修改,因为鼠标是74个字节的数组,而标准键盘是63的字节的数组,那么就需要修改usbd_hid.c里的HID_MOUSE_ReportDesc这部分的数据,他默认是鼠标的,我们给他修改成键盘的。这些是他们规定好的一些数据,我们选择标准键盘的数据(不要选鼠标的),keybrd.hid。原创 2022-10-02 19:59:56 · 2186 阅读 · 0 评论 -
STM32CubeMX生成的C代码,其编码格式不是UTF-8,导致中文乱码怎么办?
然后重启STM32CubeMX,再生成代码,就是UTF-8类型的了。注意,如果原本源代码里的中文已经出现乱码,再生成的话,还是乱码,所以要从没乱码的源代码版本,开始生成。1、打开电脑之后,鼠标右键点击桌面上的“此电脑”图标,然后点击属性。2、在打开的“系统“页面中点击页面左侧的“高级系统设置”,打开系统属性窗口。STM32CubeMX生成的C代码,其编码格式不是UTF-8,导致中文乱码。3.在系统属性窗口的“高级”选项卡,点击环境变量,新建环境变量。变量名称:JAVA_TOOL_OPTIONS。原创 2022-10-02 19:46:06 · 2661 阅读 · 4 评论 -
freeRTOS。osThreadNew和LOS_TaskCreate的区别。
osThreadNew()是cmsis标准的接口,类似于posix标准的pthread_create(),它们是对具体内核的xOS_TaskCreate()接口的更上一层的封装,可以让上层应用(即osThreadNew()的调用者)与具体的内核解耦,有助于应用的一次开发,多端部署。LOS_TaskCreate()是LiteOS_A和LiteOS_M内核提供的创建线程的接口,LiteOS_A和LiteOS_M内核对它的实现是不同的,也就是说LOS_TaskCreate()跟具体的内核相关。原创 2022-10-02 19:34:03 · 973 阅读 · 0 评论 -
freeRTOS。taskENTER_CRITICAL()是什么意思?
临界段代码也叫做临界区,是指那些必须完整运行,不能被打断的代码段,比如有的外设的初始化需要严格的时序,初始化过程中不能被打断。FreeRTOS在进入临界段代码的时候需要关闭中断,当处理完临界段代码以后再打开中断。用于在任务中,进入临界区。用于在任务中,退出临界区。原创 2022-10-02 19:32:19 · 2538 阅读 · 0 评论 -
keil烧写失败,提示:Flash Timeout. Reset the Target and try it again.
你使用另一个芯片的程序烧到这个芯片上去了。要选择正确的芯片程序。原创 2022-10-02 19:29:43 · 2911 阅读 · 0 评论 -
STM32。未使用的引脚应该怎么处理?
如果是为了抗静电干扰,那么设置为输出下拉,外部悬空,抗干扰最强的话,那么还要使得该引脚外部接地。设置为下拉并不会降低功耗,即使是开漏输出的功耗都比下拉的功耗要低。一般不作任何处理,使用默认的浮空输入即可,不会发生误判等问题。外部硬件没有上下拉的情况下,引脚悬空NC的情况下。如果是为了降低功耗,那么设置为模拟输入,外部悬空。未使用的引脚,芯片内部默认设置为浮空输入模式。原创 2022-10-02 19:28:18 · 3496 阅读 · 0 评论 -
keil烧写失败,提示 Could not stop Cortex-M device!
后来发现是因为外部电路导致MCU的复位脚NRST为低,修改外部电路,将NRST设置为高就行了。NRST引脚在单片机开机过程中必须全程为高电平,否则就会复位。也会出现上面的无法烧写进入程序的问题。keil烧写失败,提示 Could not stop Cortex-M device!SW烧写线也是检测到的。原创 2022-10-02 19:26:53 · 3367 阅读 · 0 评论 -
keil修改文件路径。
如果在你填写的路径下找不到该文件,那么点击ok是无法成功配置的,会警告找不到文件,必须检测到你填写的路径下的确有该文件,点击ok才能成功配置。比如移植代码时,会出现找不到文件的问题,这是因为路径不对。按照下面方法修改文件路径,右键点击文件,选择Options,然后会弹出一个窗口,在窗口的Path处填写正确的路径,点击ok即可,配置好之后文件的感叹号就会消失。所有有感叹号的文件的路径,都要一个个的手动改。原创 2022-10-02 19:24:47 · 8018 阅读 · 2 评论 -
STM32。如何配置外部中断,按键中断?做到按下按键产生外部中断的效果。
然后将以上代码编译烧写,当按下按键,高电平变为低电平时,发生下降沿触发,gpio产生中断,就会执行HAL_GPIO_EXTI_Falling_Callback()函数,执行里面的打印函数。注意,因为所有gpio下降沿中断发生时,都会跑到这个函数,所以要使用if(GPIO_Pin==SW_BUTTON_Pin)来区分是哪个引脚产生的中断,然后我这里在里面增加一个打印。这2个函数是可以重定义的。额外:该gpio配置为外部中断时,依然可以直接使用gpio读函数 来读取gpio的电平值,不会有任何影响。原创 2022-10-02 19:21:57 · 2353 阅读 · 0 评论 -
STM32。如何进入低功耗模式?
参考:https://bruceou.blog.csdn.net/article/details/113955898 《嵌入式-STM32开发指南》第二部分 基础篇 - 第10章 低功耗(HAL库)参考:https://zhuanlan.zhihu.com/p/143352204 stm32几种低功耗模式的实现和差别。从表中可以看到,这三种低功耗模式层层递进,运行的时钟或芯片功能越来越少,因而功耗越来越低。停止模式只能通过外部中断唤醒,滴答定时器产生的是内部中断,因此不需要挂起滴答定时器。原创 2022-10-02 19:15:34 · 786 阅读 · 0 评论 -
设置keil软件编译时,编译出.mot文件和.bin文件。
第一个是编译出.mot文件,第二个是编译出.bin文件。原创 2022-10-02 19:07:52 · 645 阅读 · 0 评论 -
STM32的HAL库是什么?
并且HAL库也很好的解决了程序移植的问题,不同型号的stm32芯片它的标准库是不一样的,例如在F4上开发的程序移植到F3上是不能通用的,而使用HAL库,只要使用的是相通的外设,程序基本可以完全复制粘贴,注意是相通外设,意思也就是不能无中生有,例如F7比F3要多几个定时器,不能明明没有这个定时器却非要配置,但其实这种情况不多,绝大多数都可以直接复制粘贴。通常新手在入门STM32的时候,首先都要先选择一种要用的开发方式,不同的开发方式会导致你编程的架构是完全不一样的。TM32的三种开发方式。原创 2022-10-02 19:03:34 · 206 阅读 · 0 评论 -
iic的SDA引脚偶尔有毛刺(尖峰)是怎么回事。
在master向slave传输8bit数据之后,sda控制权由master交由slave,此时slave控制sda发送一个ack反馈信号,sda为低电平信号,在经过sclk为高时接收到sda的低电平信号,在sclk变为低电平时,sda控制权由slave交回到master,在交回过程中有一小段时间sda处于既不由master又不为slave控制的空闲阶段,在空闲阶段sda默认为高电位(因为有上拉电阻),如果master要马上传输低电平,sda将由高电平转为低电平,会存在一个小的毛刺。原创 2022-10-02 19:01:50 · 2033 阅读 · 0 评论 -
STM32。timer定时器配置为PWM。
额外:初始化PWM时,sConfigOC.Pulse这个参数,设置的是初始化时的PWM占空比,如果填0那么初始化完成后就是0,如果填和htim1.Init.Period相等的值,那么就是占空比100%。修改PWM占空比,需要改变 CCRx 的值,可以使用__HAL_TIM_SET_COMPARE函数,或直接修改寄存器TIMx->CCRx = value 来实现;改变 CCRx 的值,就可以改变 PWM 输出的占空比,改变 ARR 的值,就可以改变 PWM 输出的频率。STM32寄存器有CCR和ARR,原创 2022-10-02 18:56:55 · 1716 阅读 · 1 评论 -
STM32。ADC配置。
代码里进行对应通道的的配置,void MX_ADC1_Init(void)里的。看表可以知道,里面的PA0\PA1\PA6都可以用作ADC。芯片手册【stm32g0b0ke.pdf】里的。所以我们使用这3个口作为adc口,来检测电压。这个表描述了所有引脚的功能。就是对这3个adc进行配置。原创 2022-10-02 18:54:18 · 784 阅读 · 0 评论 -
STM32。怎么增加独立看门狗?
使用STM32CubeMX勾选看门狗功能,即可增加,在STM32CubeMX中还可配置看门狗复位时间,其他的就不需要配置了。原创 2022-08-08 17:03:22 · 419 阅读 · 0 评论