
STM32
文章平均质量分 60
ltqshs
高速硬件设计、软件开发一体
展开
-
STM32标准库和HAL库SPI发送数据的区别-即SPI_I2S_SendData()和HAL_SPI_Transmit()互换
可以通过检测SPI_SR中的RXNE位,当数据寄存器里有数据时,RXNE位是0,当数据全部从数据寄存器的接收缓冲区传输到移位寄存器时RXNE位被置1,这时候可以从数据寄存器里读出数据。,可以通过检测SPI_SR中的TXE位,当数据寄存器里有数据时,TXE位是0,当数据全部从数据寄存器的发送缓冲区传输到移位寄存器时TXE位被置1,这时候可以再往数据寄存器里写入数据。可以看出,基本一直,除了 基本的io口配置区别,其他主要的读写函数不用动的。这是HAL库函数的SPI初始化配置。这是标准库的SPI初始化配置。原创 2025-04-27 11:07:39 · 510 阅读 · 0 评论 -
Freertos学习第一篇-总体概述
FreeRTOS的核心是任务调度与资源管理,通过队列、信号量等组件实现多任务协作。先分模块验证功能,再逐步组合成完整系统。原创 2025-02-20 16:58:33 · 1059 阅读 · 0 评论 -
VSCode+EIDE开发STM32
2、VSCode+Embedded IDE+Cortex Debug,可以编译+下载+仿真。1、VSCode+keil Assistant,可以编译+下载,不能仿真。配合VSCode插件Fitten Code使用更加666.原创 2024-10-25 17:52:52 · 180 阅读 · 0 评论 -
STM32F103和STM32F030的SPI不同之处
再用兆易GD32F103替代STM32F103时,发现GD的定义与STM相同,但是MISO必须改为GPIO_MODE_AF_PP才能正常接收,否则 SPI 可以发送,接收错误。这里表示是 GD 的缺陷,待确认。其中区别在于, F103的MISO要配置成输入(GPIO_MODE_INPUT), 而F030的要配置成复用(GPIO_MODE_AF_PP),的确非常奇怪。可以查看,两个片子的识别定义不同所以,配置当然也不同了。再查询手册的UART RX定义,也有同样的不同。发现原来的MISO配置不同。原创 2024-10-25 15:22:37 · 967 阅读 · 0 评论 -
STM32逆变器方案
紧急逆变器具备输入防反接、输入高低压保护、输出过流、输出缺相、输出短路、高温等保护。电压:200V±5%(200VAC~240VAC 可调)频率: 42Hz±0.5Hz(35-50 可调)预充电、驱动、电流采样、温度采样、逆变辅助电源。额定输出容量:1.3kW/1.55kVA。输入电压范围:DC77-137.5V。额定输入电压:DC110V。原创 2023-12-26 23:24:02 · 1610 阅读 · 1 评论 -
STM32Fxx HAL库开发UART中断回调函数理解-中断回调函数流程-自己理解的
具体是在void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)函数写要执行的任务。具体是在void USART1_IRQHandler(void)函数写要执行的任务。正点原子是重新宏定义函数名,写法如下。还可以参考网友分享的。原创 2023-12-20 14:33:15 · 3518 阅读 · 0 评论 -
STM32 HAL库代码编程风格--STM32外设结构体代码风格
以上就是HAl开发的关键,出来I/0外,无论用哪种外设(如:uart),只需要相应的定义句柄结构体(UART_HandleTypeDef husartx;)即可。原创 2023-12-08 15:30:26 · 1035 阅读 · 0 评论 -
keil编译-报错:CARM - Output Name not specified, please check ‘Options for Target - Utilit-STM32
并未按照keil5中如图所示功能进行操作,编译后出现FCARM - Output Name not specified, please check 'Options for Target - Utilit问题。按照书上说明按步操作,但是书上是按照keil4写的,与keil5有比较大区别。按照书上说明,建立了对应的文件夹,并将对应文件复制到了对应文件夹,查阅网上的说明,发现需要在如上图所示部分进行添加,于是操作,但添加文件过程中,有两个*.*,务必。重新操作后,编译成功。原创 2023-11-24 13:16:48 · 1609 阅读 · 0 评论 -
STM32-SPI协议详解及CubeMX+HAL函数配置分析
1 SPI协议SPI(Serial Peripheral interface)串行外围设备接口是同步全双工的通信总线,在芯片的管脚上只占用四根线。1.1 物理层SS/NSS/CS:从设备选择信号线(片选信号线)。由主设备控制,选择指定的从设备。当主机要选择从设备时,把该从设备的SS信号线设置为低电平,该从设备即被选中,即片选有效,接着主机开始与被选中的从设备进行SPI通讯。所以SPI通讯以SS线置低电平为开始信号,以SS线被拉高作为结束信号。SCK (Serial Clock):时钟信号线。原创 2023-11-23 16:06:03 · 1481 阅读 · 0 评论 -
STM32 APP跳转到Bootloader
stm32 app跳转到bootloade【STM32】串口IAP功能的实现,BootLoader与App相互跳转STM32 从APP跳入BootLoader问题原创 2023-10-27 13:54:46 · 3355 阅读 · 0 评论 -
STM32 CubeMX配置USB HID功能,及安装路径
STM32CubeMX学习笔记(46)——USB接口使用(HID自定义设备)STM32CubeMX实现STM32 USBHID双向64字节通信(下位机部分)STM32 USB HID设置(STM32CubeMX)关于keil 5安装出现Fail to set path to Software Packs.问题解决方法原创 2023-10-27 13:50:55 · 2218 阅读 · 0 评论 -
STM32 Cube配置RS485 Modbus
STM32CUBUMX配置RS485 modbus STM32(从机)亲测可用STM32开发(六)STM32F103 通信 —— RS485 Modbus通信编程详解原创 2023-10-27 13:43:18 · 2562 阅读 · 0 评论 -
STM32的BOOT1和BOOT0查找及配置-都有BOOT1引脚的
假如我只修改了代码中一个小小的 地方,然后就需要重新擦除整个Flash,比较的费时,可以考虑从这个模式启动代码(也就是STM32的内存中),用于快速的程序调试,等程序调试完成后,在将程序下载到SRAM中。系统存储器起始地址为0x1FFF0000,这种模式启动的程序功能是由芯片厂家设置的,STM32在出厂时会这个区域内置一段BootLoader, 也就是我们常说的ISP程序, 这是一块ROM,出厂后无法修改。我们要使用的DFU就是放在这里。常用的烧录Slink就是这种。原创 2023-10-26 16:35:48 · 10237 阅读 · 5 评论 -
STM32-程序占用内存大小计算
可以计算出占用的FLASH = 34456+456+172=34.26kB,占用的RAM=172+18908=18.63kB。那么堆栈是如何分配的呢,堆栈的内存占用就是在上面RAM分配给RW-data+ZI-data之后的地址开始分配。占用的Flash=Code + RO Data + RW Data;ZI-data存储未初始化的全局变量或初始化值为0的全局变量。运行消耗的最大RAM= RW-data+ZI-data;RW-data存储初始化值不为0的全局变量。RO-data存储const常量和指令。原创 2023-10-24 09:15:45 · 2900 阅读 · 0 评论 -
STM32之Bootloader、USB、IAP/DFU下载
代码下载。原创 2023-10-23 09:17:44 · 3756 阅读 · 0 评论 -
STM32-C语言结构体地址
是unsigned long类型的变量,在windows的64位机器中占4个字节,所以person->age的地址 = 4 + person->member_num的地址 = 0x1f1434。是unsigned short类型的变量,可以等同于short占用的字节,都是2,所以person->addr的地址 = 2 + person->age的地址 = 0x1f1436。的地址,与它指向的结构体的第一个成员(person->pprenode)地址是一样的,都是0x1f1420。原创 2023-10-13 10:45:13 · 1905 阅读 · 0 评论 -
STM32的HAL库SPI操作(master 模式)-根据时序图配置SPI
SPI基本概念请自行百度,参考:百度百科SPI简介.我们讲重点和要注意的地方。原创 2023-09-18 13:10:11 · 2589 阅读 · 0 评论 -
STM32编程Printf函数语法
附加参数 – 根据不同的 format 字符串,函数可能需要一系列的附加参数,每个参数包含了一个要被插入的值,替换了 format 参数中指定的每个 % 标签。参数的个数应与 % 标签的个数相同。%[flags][width][.precision][length]specifier,即:%[标志][最小宽度][.精度][类型长度]说明符。printf 函数的返回值为其输出字符串常量的字符数(注意字符数与字数的区别),注意计数针对所有的打印字符,包括空格和不可见的换行字符(不包括字符串的空字符)。原创 2023-08-21 09:08:06 · 2666 阅读 · 0 评论 -
Keil5.38配置-启动文件
Keil配置。原创 2023-08-07 17:33:21 · 1959 阅读 · 0 评论 -
STM32使用HAL库中外设初始化MSP回调机制及中断回调机制详解
在STM32的HAL库使用中,会发现库函数大都被设计成了一对:而且HAL_PPP/PPPP_MspInit函数的defination前面还会有__weak关键字上面的PPP/PPPP代表常见外设的名称为3个字符或者4个字符怎么理解这个设计呢?原创 2023-07-31 18:00:00 · 4636 阅读 · 0 评论 -
STM32之-#define EEPROM_INFO(fmt,arg...) printf(“<<-EEPROM-INFO->> “fmt“\n“,##arg)解释
在使用可变参数时,需要先定义一个va_list类型的变量,然后使用va_start宏定义来初始化这个变量,再使用va_arg宏定义来依次获取可变参数的值,最后使用va_end宏定义来清理可变参数的内存。)或者arg来表示可变参数。va_arg是一个宏定义,用于获取可变参数的值。它的第一个参数是一个va_list类型的变量,表示可变参数列表,第二个参数是一个类型名,表示要获取的参数的类型。在使用va_arg之前,需要先使用va_start宏定义来初始化va_list类型的变量,表示可变参数列表的起始位置。原创 2023-07-12 16:52:15 · 2435 阅读 · 0 评论 -
STM32编程-指针和数组
/由于a变量名就是这个字符串的地址,所以不需要加上”&“。str[2]可以表达为:*(str+2)。数组名就是数组的首地址,地址。原创 2023-07-12 14:13:08 · 2228 阅读 · 0 评论 -
STM32编程中的volatile,const意义
两者都可以用来定义常量,但是const定义时,定义了常量的类型,所以更精确一些(其实const定义的是只读变量,而不是常量)。也就是说,在这个函数内部是没有权限去修改这个变量的,但是在程序的其他位置可以去修改它,而导致函数内的某种响应。//p3不可变,*p3也不可变 前一个const 修饰的是 *p3,后一个const 修饰的是p3,两者都不可变。经常写大工程时,都会发现老是命名冲突,要不是全局变量冲突,要不就是宏定义冲突,所以我们要尽量避免这些问题,不然出问题了都不知道问题在哪里。原创 2023-07-11 09:10:46 · 2955 阅读 · 0 评论 -
STM32中static和extern的用法
在函数的返回类型前加上static关键字,函数即被定义为静态函数。它与全程变量的区别是: 全程变量可以再说明为外部变量(extern), 被其它源文件使。静态全程变量就是指只在定义它的源文件中可见而在其它源文件中不可见的变量。用, 而静态全程变量却不能再被说明为外部的, 即只能被所在的源文件使用。根据变量的类型可以分为静态局部变量和静态全程变量。第一次调用a()后,i的值为1,第二次调用a()后,i的值为2。不同,它只能在声明它的文件当中可见,不能被其它文件使用。A. static变量。原创 2023-07-04 17:01:42 · 2937 阅读 · 0 评论 -
STM32中断设置以及中断优先级设置-不含代码例程
其次,我们了解一下中断优先级,中断优先级寄存器NVIC_IPRx,本寄存器宽度为8位,原则上每个外部中断可配置的优先级为0~255,实际上精简了,只用到了它的高4位。(例如:两个中断同时响应,这里就会先执行响应优先级高的那个中断)(注意:优先级数字越小,优先级越高)ISER用于使能中断,ICER用来清除中断,IP用来设置中断优先级。1、抢占优先级不同,会涉及到中断嵌套,抢占优先级高的会优先抢占优先级低的,优先得到执行。3、抢占优先级和响应优先级都相同,则比较它们的硬件中断编号,中断编号越小,优先级越高。原创 2023-06-15 16:19:05 · 2603 阅读 · 0 评论 -
Keil-MDK 中使用 printf() 打印输出中文时-waining:illegal character encoding in string literal
出现警告:warning: illegal character encoding in string literal [-Winvalid-source-encoding]。如果项目中有使用 printf() 函数打印输出包含中文字符串,则 AC6 编译过程会弹出警告信息,虽然不影响使用,但是十分烦人。项目文件目录一定不要有中文路径,否则不能使用 “Go To Definition” 跳转功能。最近使用 Keil-MDK 中的 ARM Compiler 6(简称AC6)编译工程时,原创 2023-06-15 01:34:12 · 4343 阅读 · 1 评论 -
手把手教你写单片机的结构体
也可以定义多个发现了没,每个结构体变量都是单独拥有结构体里面的全部成员变量。就像是最开始说的,如果再增加一套传感器:温湿度、光照强度、烟雾浓度、酒精浓度。使用结构体的话只需要再定义一个结构体变量即可。但是很多时候我们在单片机中见到的结构体并不是上面那样定义的,而是在前面加了一个typedef 关键字。这样的例子在库函数的头文件中我们经常会看到如下结构体。转载 2023-05-23 08:00:00 · 1790 阅读 · 0 评论 -
函数指针 + 函数指针数组 + 回调函数
【指针内功修炼】函数指针 + 函数指针数组 + 回调函数。转载 2023-05-22 07:30:00 · 2150 阅读 · 0 评论 -
C51基础之单片机编程中通用指针和定向指针
使用不同类型的指针,在处理相同的代码时,在代码大小、占用内存大小和执行时间上存在明显的差异。因为内存类型在编译时确定的,所以定向指针占用的空间大小也是确定的,与8051的地址总线宽度一致。Cx51编译器转换通用指针和定向指针时,可以使用()强制类型转换,也可以由编译器隐式转换。0xFF00强制转换为xdata指针,取出指针空间内的数据,对c变量进行累加。0xF0强制转换为idata指针,取出指针空间内的数据,对c变量进行累加。0xE8强制转换为pdata指针,取出指针空间内的数据,对c变量进行累加。原创 2023-05-15 00:37:30 · 4817 阅读 · 0 评论 -
STM32F1小系统调试案例——串口采用HAL库中断方式接收,只能收到第一批数据
我的愚见,接收一个数据,系统会进入中断函数USARTx_IRQHandler(),运行一次函数UART_Receive_IT(),但是接收完RXRXBUFFERSIZE数据,才会运行一次HAL_UART_RxCpltCallback();显然,在Main()中每次调用HAL_UART_Receive_IT()后,都能收到一批数据,那么采用循环的方式也可以持续接收到串口数据。接着,HAL_UART_IRQHandler()对一系列的异常场景进行处理后,再调用UART_Receive_IT();原创 2023-03-13 01:43:36 · 2532 阅读 · 0 评论 -
STM32 Keil5报错-Target uses ARM-Compiler ‘Default Compiler Version 5‘ which is not available-安装编译器解决
既然我们是缺少5版本的编译器,我们就要去官网下载安装包,安装到我们的Keil MDK-Arm软件上。小立通过资料的查询和官网上下载的说明,最终发现在keil官网下载最新的Keil Uversion5时,由于keil官网采用最新的编译器v6,导致keil5缺少旧编译器v5。根据上述发现,我发现了问题关键在《Arm compiler version 5》身上,找不到版本5的编译器,6版本的编译器也会出现更多的报错。有意外的话,,,,,,你肯定有问题!'选项为目标-目标’选择一个ARM编译器版本的目标。原创 2023-03-06 10:21:54 · 36273 阅读 · 6 评论 -
STM32的HAL库分析及使用
通常新手在入门STM32的时候,首先都要先选择一种要用的开发方式,不同的开发方式会导致你编程的架构是完全不一样的。一般大多数都会选用标准库和HAL库,而极少部分人会通过直接配置寄存器进行开发。网上关于标准库、HAL库的描述相信是数不胜数。可是一个对于很多刚入门的朋友还是没法很直观的去真正了解这些不同开发发方式彼此之间的区别,所以笔者想以一种非常直白的方式,用自己的理解去将这些东西表述出来,如果有描述的不对的地方或者是不同意见的也可以大家提出。原创 2023-02-08 08:00:00 · 2180 阅读 · 0 评论 -
STM32-库函数学习之-指针函数和函数指针的区别
版权声明:本文为优快云博主「SUN1_SHINE2」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。ptr这时就是 fun1( )这个函数的入口地址了;2、函数指针:是指向函数的指针变量,其本质是一个指针变量。首先你要从心里承认这是一个函数,只是返回的是个地址值。例如 :void (*ptr)();结构为 :类型说明符 (*指针变量) (参数)例如: int *f(x,y);1、指针函数:带指针的函数,其本质是一个函数,函数返回是某一类型的指针。转载 2022-11-17 15:23:20 · 675 阅读 · 0 评论 -
STM32CubeMX-Hal库移植程序-官网下载
2.搜索“stm32cubef1”,即可搜索到STM32F1的移植程序。原创 2022-11-14 21:21:52 · 1880 阅读 · 0 评论 -
STM32的ADC用法-CubeMX
AD采样在电路中是一种比较常见的功能,可以用于电池电压检测、传感器值读取、信号采集等。STM32的ADC,由于引入了DMA,以及多种触发源,功能自然强大,用法也多种多样。今天,我们简单说说在单通道情况下,AD采样的几种用法。原创 2022-11-10 13:49:09 · 1615 阅读 · 0 评论 -
STM32 CubeMx配置DMA-HAL库
什么是DMA (DMA的基本定义)DMA,全称Direct Memory Access,即直接存储器访问。DMA传输将数据从一个地址空间复制到另一个地址空间,提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。我们知道CPU有转移数据、计算、控制程序转移等很多功能,系统运作的核心就是CPU,CPU无时不刻的在处理着大量的事务,但有些事情却没有那么重要,比方说数据的复制和存储数据,如果我们把这部分的CPU资源拿出来,让CPU去处理其他的复杂计算事务,是不是能够更好的利用CPU的资源呢?转载 2022-10-26 09:25:41 · 2078 阅读 · 0 评论 -
STM32 keil如何下载STM32芯片F1/F4固件库 .pack文件
4.双击下面的图标,即.pack可以直接点击安装,并且目录直接默认是keil安装的目录。1.用keil打开STM32F407的程序,结果提示下面的问题,就是没有安装固件库。3.然后选中对应的芯片类型,譬如我这个就是STM32F407IGTx。5.安装之后再次打开keil就不会报错了,可以看到已经安装的固件库。原创 2022-10-21 08:51:28 · 9798 阅读 · 1 评论 -
STM32如何配置HAL库
并且HAL库也很好的解决了程序移植的问题,不同型号的stm32芯片它的标准库是不一样的,例如在F4上开发的程序移植到F3上是不能通用的,而使用HAL库,只要使用的是相通的外设,程序基本可以完全复制粘贴,注意是相通外设,意思也就是不能无中生有,例如F7比F3要多几个定时器,不能明明没有这个定时器却非要配置,但其实这种情况不多,绝大多数都可以直接复制粘贴。如果句柄不在I/O文件中,它是毫无用处的。通常新手在入门STM32的时候,首先都要先选择一种要用的开发方式,不同的开发方式会导致你编程的架构是完全不一样的。原创 2022-10-11 08:55:53 · 2732 阅读 · 0 评论