
MCU
文章平均质量分 91
昵称p
重生之我是嵌入式软件工程师
展开
-
平台设备总线和lvgl
- 平台设备总线:最早来源就是早期的设备树另一种体现方式平台设备总线也是跟设备树的思想一样,他想把驱动分为:设备层:只负责提供设备信息驱动层:通用的驱动早期的时候,这个时候是没有设备树的设备树是 3.x 的内核才引入,刚引入的时候,还不适应市场!早期虽然有 设备信息和驱动的分层思想,没有设备树的支持,有了平台设备总线这个平台设备总线的 设备层->不是设备树而是一个代码来做设备信息的传递设备层还有函数:platform_device_register();原创 2024-12-02 10:16:50 · 920 阅读 · 0 评论 -
MCU面试题
如何在 FreeRTOS 中使用钩子函数 在 FreeRTOS 中使用钩子函数,原创 2024-11-10 17:20:46 · 1478 阅读 · 0 评论 -
IAP升级
通过这一步设置,我们就可以在 MDK 编译成功之后,调用 fromelf.exe(注意,我的 MDK 是安装在 D盘文件夹下,如果你是安装在其他目录,请根据你自己的目录修改fromelf.exe 的路径),根据当前工程的 weather.axf(如果是其他的名字,请记住修改,这个文件存放在 Objects 目录下面,格式为 xxx.axf),生成一个 RTC.bin 的文件。如果想清楚的看到程序运行的结果,可以实现程序接收到bin文件后就立马复位,所以要在程序更新的后面写一个软件复位的代码。原创 2024-11-10 10:18:02 · 1192 阅读 · 0 评论 -
更改lvgl图片的分辨率(减少像素)达到减小内存占用的目的
- 这里主要是降低它的像素,之前是16位的,现在更改为4位的,(其实就是色彩的精确度降低了一些,本来是浅蓝***型号,更改过后可能没有这个型号,只有大概偏向这个型号的颜色。:这里要更改分辨率的图片必须是已经修改好大小的图片,这个转换器不会自动更改图片的大小,所以需要提前修改好图片的大小(要占用屏幕的大小)。--注意,如果界面对像素的要求很高,或者降低分辨率后对界面显示出来的效果差距过大,不建议更改,可以采用其他方法。-- 由于lvgl中图片占的内存过大,所以需要更改图片的分辨率(降低像素的方式)原创 2024-11-06 17:51:39 · 682 阅读 · 0 评论 -
lvgl白屏问题(LCD长时间白屏)和优化lvgl
总结下来,其实就几点:1、失能lvgl不必要的部件;2、尽可能使用绘制来代替图片;3、实在没法绘制的小图标就直接使用图片;另外,还可以直接弄一个写flash工程,将不经常刷新的图片素材写到外部flash中,为什么要单独弄一个呢?因为直接在工程里写flash,容易导致每次烧录程序都要写一遍。其实还有个方式,那就是开启keil的优化等级,只不过这种情况下需要注意一些变量的volatile处理,而且优化也并不明显,能大概下降个二三十k吧。原创 2024-11-06 10:16:08 · 1447 阅读 · 0 评论 -
RT-Thread操作系统(2)
- 通过设备句柄,应用程序可以打开和关闭设备,打开设备时,会检测设备是否已经初始化,没有初始化则会默认调用初始化接口初始化设备。-- 在main函数下面写一个函数,将上面我们写过的线程创建和启动写在这个函数中,然后宏定义声明,这样就算我们不在main中调用,我们也可以执行。设备驱动框架层是对同类硬件设备驱动的抽象,将不同厂家的同类硬件设备驱动中相同的部分抽取出来,将不同部分留出接口,由驱动程序实现。-- 配置过后,保存,配置串口3的宏定义和在main.c中写调用代码,编译,就会连接上阿里云。原创 2024-11-05 19:31:05 · 735 阅读 · 0 评论 -
RT-Thread操作系统(1)
RT-Thread,全称是 Real Time-Thread,顾名思义,它是一个嵌入式实时多线程操作系统,基本属性之一是支持多任务,允许多个任务同时运行并不意味着处理器在同一时刻真地执行了多个任务。事实上,一个处理器核心在某一时刻只能运行一个任务,由于每次对一个任务的执行时间很短、任务与任务之间通过任务调度器进行非常快速地切换(调度器根据优先级决定此刻该执行的任务),给人造成多个任务在一个时刻同时运行的错觉。原创 2024-11-05 16:37:39 · 996 阅读 · 0 评论 -
IIC
硬件 I2C:是指直接利用 STM32 芯片中的硬件 I2C 外设,该硬件 I2C 外设跟 USART串口外设类似,只要配置好对应的寄存器,外设就会产生标准串口协议的时序。5、应答信号: 发送数据的设备:发送完8bit一个字节的数据之后,会等待一定的时间,等接接收方的应答信号(SDA在接收前,拉高释放SDA ),接收端通过拉低SDA数据线,给发送端发送一个应答信号,以提醒发送端我这边已经接受完成,数据可以继续传输,接下来,发送端就可以继续发送数据了。在iic通信中,每发送一个字节,从机都会发送一个应答。原创 2024-11-02 19:29:11 · 884 阅读 · 0 评论 -
cubemx(hal库开发)
并且从16年开始,ST公司就逐渐停止了对标准固件库的更新,转而倾向于HAL固件库和 Low-layer底层库的更新,停止标准库更新,也就表示了以后使用STM32CubeMX配置HAL/LL库是主流配置环境;和标准库对比起来,STM32的HAL库更加的抽象,ST最终的目的是要实现在STM32系列MCU之间无缝移植,甚至在其他MCU也能实现快速移植。-- 5、配置完后会发现时钟有个错误,因为之前配置时钟的时候没有考虑到ADC的时钟,因为adc时钟不能超过14HZ,所以这里需要重新配置时钟。原创 2024-10-31 10:51:18 · 5065 阅读 · 0 评论 -
# lvgl补充
- 9、擦除之后将擦除这个函数注释掉,将其他的任务打开,然后重新编译下载程序。-- 6、在main函数中调用擦除函数,将其他任务都注释掉,只执行这个擦除的函数,然后下载进工程中,会看到串口助手显示擦除成功。-- 因为我们的天气模块要显示的字体格式可能会由很多,如果都用lvgl生成字模会占用比较大的空间,所以这里我们采用其他方式。-- 10、之后将刚刚生成的.c文件添加到工程中(lvgl/app),将40多行左右的注释打开。-- 2、从电脑自带的字体中找到一个字体,将这个字体复制到桌面,注意不要剪切。原创 2024-10-31 10:46:12 · 803 阅读 · 0 评论 -
lvgl
- 1、进行界面设计,注意先考虑好布局(做几个界面,每个界面显示什么内容,如何规划)-- 2、保证每个界面在屏幕上都能显示出来-- 3、保证界面相互切换不会卡死-- 4、界面刷新。原创 2024-10-25 16:25:51 · 1474 阅读 · 0 评论 -
任务间通信(2)
- 今天我们要讲的事件也是任务间通信的一种方式,它的核心用途也是任务间同步,与信号量不同的是事件可以实现多任务间的同步-- 事件也叫事件组-- 我们还是先看官方文档-- 文档中说该宏定义的取值规定着最多可用于几个任务同步-- 当前我们用的操作系统的版本是10.2.1,下面是该操作系统官方代码中宏定义的赋值。(注意:不同版本的操作系统使用上会有差异)-- 事件组应用的核心就是“逻辑与”和“逻辑或”原创 2024-10-25 16:19:34 · 920 阅读 · 0 评论 -
任务间通信(1)
- 二值信号量在任务与中断同步的应用场景:我们在串口接收中,我们不知道啥 时候有数据发送过来,有一个任务是做接收这些数据处理,总不能在任务中每时每刻都在任务查询有没有数据到来,那样会浪费 CPU 资源,所以在这种情况下使用二值信号量是很好的办法,当没有数据到来的时候,任务就进入阻塞态,不参与任务的调度,等到数据到来了,释放一个二值信号量,任务就立即从阻塞态中解除,进入就绪态,然后运行的时候处理数据,这样子系统的资源就会很好的被利用起来。抽象的来讲,信号量是一个。采取到时间后,再去显示LCD上。原创 2024-10-25 16:15:12 · 677 阅读 · 0 评论 -
操作系统任务操作
函数名称不固定,参数格式是固定的(任务一定是一个while循环,每个任务一定要有自己的任务周期)//设置任务周期的目的就是可以让任务可以主动释放cpu(指的是任务能够自动释放cpu)-- 咱们这个项目最重要的就是?上面写的程序的运行顺序: -- 先执行灯,在任务周期时执行按键的主体函数 -- 当按键的任务周期到时,灯的任务周期还没完成。-- 在任务周期时,本质是任务延时(在任务延时时间内,任务会释放cpu,cpu会执行其他任务)-- 当任务创建完毕之后,所有的任务,都是就绪态,此时所有的任务在一个叫做。原创 2024-10-18 16:15:14 · 933 阅读 · 0 评论 -
Free RTOS实时操作系统
FreeRTOS 包含 Demo 例程和内核源码(比较重要,我们就需要提取该目录下的大部 分文件)。FreeRTOS 文件夹下的 Source 文件夹里面包含的是 FreeRTOS 内核的源代码, 我们移植 FreeRTOS 的时候就需要这部分源代码;原创 2024-10-17 16:57:13 · 1172 阅读 · 0 评论 -
mqtt与云服务器
- 找到mqtt的连接参数,点击查看(注意:这些参数是会改变的,随着时间有变化,但是只要连接上一次,以后这些参数就不用再改了)-- 这里出现的问题就是buff的错误,buff的大小不够大,导致接收不到数据,所以将buff的大小改大,就可以正常接收数据了。-- 昨天我们写的AT指令是直接写在main中,在while循环的外面,没有很好的封装,所以今天我们写一个函数来封装AT指令。-- 保存好的APP可以在手机上预览,点击右上角的预览,就会生成二维码,用手机上的云智能软件扫描二维码就可以看到APP。原创 2024-10-17 10:12:16 · 1396 阅读 · 0 评论 -
WIFI (2)
- 因为wifi连接指令,wifi回复ok的时间很长,足以触发空闲中断,还有指令写错的情况,所以要写一个超时时间,超时时间就是指令能够运行的最大时间。-- +IPD:它通常表示数据传输的开始,后面跟着数据的长度和内容。-- 4:当前是哪个编号(谁)传输的信息 -- 79:数据的长度。-- 找IPD,如果是多人传输的话,就是靠编号来判断,每一个客户端都有自己的编号。-- AP模式:如何等最后的数据过来,或者说接受的数据是不是他。-- wifi实现各种功能的流程 -- 》时间如何获取?原创 2024-10-15 15:44:56 · 519 阅读 · 0 评论 -
WIFI(1)
- 发送成功过后, 串口上将会显示出连接自己的方法,将得到的数据解析出来,存在flash里,解析数据,得到名称密码,保存到FLASH里面,后续要连接WiFi的时候,就可以直接从flash里读了。4."AT+CWSAP="ESP8266","1234567890",5,3\r\n" //设置模块的热点名称和密码(但是这个wifi不能联网)注意:密码是8位及以上,根据指令集文档可以看出。发送获取suning服务器的指令,"AT+CIPSTART="TCP","suning.com",80\r\n"原创 2024-10-14 20:17:08 · 1132 阅读 · 0 评论 -
SPI
- USART,SPI,IIC三大串行通信方式-- SPI:是通信总线-- 什么叫总线类型的通信?(SPI和IIC都叫做总线通信)多设备通信,一对多,多对一(也支持一对一) (多个设备可以挂载到总线上,通过总线进行通信)-- 如何判断设备是否支持串口通信?有RX和TX-- 如何判断设备是否支持SPI通信?有以下四根线SCK:同步时钟CS:片选线(类似于通信上的使能)MISO:主机输入,从机输出MOSI:主机输出,从机输如-- 串口是异步通信,SPI是同步通信(有时钟线)原创 2024-10-14 20:13:14 · 1199 阅读 · 0 评论 -
低功耗
在停止模式中,进一步关闭了其它所有的时钟,于是所有的外设都停止了工作,但由于其 1.8V 区域的部分 电源没有关闭,还保留了内核的寄存器、内存的信息,所以从停止模式唤醒,并重新开启时钟后,还可以从上次 停止处继续执行代码。要注意的是进入停止模式后, STM32 的所有 I/O 都保持在停止前的状态,而当它被唤醒时, STM32 使用 HSI 作为系统时钟(8MHz)运行,由于系统时钟会影响很多外设的工作状态,所以一般我们在唤醒后会重新开启 HSE,把系统时钟设置回原来的状态。-- 对于设备,功耗怎么降低?原创 2024-10-11 17:34:55 · 1174 阅读 · 0 评论 -
LCD补充
先在网站上搜一个想要的动图,然后把他拖入动图拆分软件,然后保存,就可以得到一张一张的图片,然后把这些图片另存为jpg格式,然后用图片取模软件,生成.h文件。-- 在lcd屏幕上显示动图,温度,湿度,时间的代码。-- 可以上网搜动图,网上搜的图片改属性,点另存为就可以更改了,也可以截图改图片的属性,随后使用图片取模软件更改大小。最重要的就是界面的设计(有专门的UI设计师) 对于产品,一个好看的外壳,一个好看的界面,这些都是很重要的。-- 之后再将改过的函数放进显示字符串的函数中,同样加上显示颜色的变量。原创 2024-10-11 17:33:23 · 1358 阅读 · 0 评论 -
LCD -
- 对于 ILI9341 这个液晶驱动芯片,单片机对于他的驱动,针对显示而言。0x2A(设置列地址:宽度)0x2B(设置页地址:高度)0x2C(写数据:像素点颜色)-- 通过 8080 写时序,完成这三个指令的发送,用这三个指令就能实现屏幕的显示操作现在他通信的话就需要一个8080的接口,但是该单片机上没有8080,下面讲fsmc模拟800时序。原创 2024-10-10 19:44:58 · 1350 阅读 · 0 评论 -
RTC -
、原创 2024-10-09 16:48:23 · 1524 阅读 · 0 评论 -
DMA-ADC
ADC转换多通出现问题的核心原因时ADC转换数据太快,EOC的值是在所有通道转换完成后才会产生,也就是说转换的数据来不及拿出来,就被覆盖掉了。-- DMA也不是都可以用的,只有产生DMA请求的才可以使用DMA通道。-- 周期:简单的说,一个高电平和一个低电平持续的时间。-- 下面进入项目开发阶段,要记得不同类设备的代码编写。-- 频率:1/周期 1S 内有多少个这样的周期。-- 占空比:在一个周期内,高电平占据的时间。-- 项目的名字:空气质量检测仪。-- ADC类设备:核心是。-- IO类设备:核心是。原创 2024-10-09 09:10:57 · 500 阅读 · 0 评论 -
ADC -模数转换
STM32主要是数字电路,数字电路只有高低电平,没有几V电压的概念,所以如果想读取电压值,就需要借助ADC模数转换器来实现,ADC读取引脚上的模拟电压,转换为一个数据,存在寄存器里,再把这个数据读取到变量中,就可以进行显示、判断、记录等等操作.-- 规则通道最多可转换16组数据,因为有16个通道,那么转换的顺序是什么呢,其实是我们可以控制的,将他写成序号1,那他就是第一个转换,写成序号2,就是第二个转换的。-- ADC只是一个转换器,那么转换的数据从哪来呢,是从数据通道(输入通道)来的。原创 2024-10-08 17:47:18 · 1346 阅读 · 0 评论 -
PWM--
- 这里为什么不用tim8,用tim3的原因是,tim8是高级定时器,需要用到高级定时器时钟,而tim3是通用定时器,需要用到通用定时器时钟,通用定时器时钟是APB1,所以这里我们用tim3。例如,如果PWM信号的占空比为50%,即高电平时间等于总周期的一半,那么输出信号的平均电压或功率也将为输入电压或功率的一半。计算时钟周期的公式是:T=1/时钟频率,在这个例子中,T=1/10000=0.0001 秒,即每个时钟周期是0.1ms。PWM 波:具有一定频率,其(占空比)高电平可以调节的波。原创 2024-09-29 15:56:20 · 1177 阅读 · 0 评论 -
DHT11
目录DHT11查资料文档的梳理代码编写初始化(时钟、IO、其他)单总线的读取流程1、主机发送复位信号2、DHT11响应信号3、数据传输4、校验数据5、数据获取main.c补充: stlink有个调试的功能- tip:可以适当的总结keil的错误,因为在keil出现的错误来来回回就只有几种错误,总结好,以后遇到错误,就可以更快的解决。-- 测量的范围 -- DHT11硬件层 -- DHT11 协议层-- 通讯时序: -- 重点(代码就是根据时序图来编写的)-- 这里采用宏定义的方式将电平拉高拉低,使代码更加简原创 2024-09-29 13:43:52 · 1341 阅读 · 1 评论 -
SU03T(语音识别播报模块)
当触发方式选择的是命令词时配置控制点击添加控制选择端口输出(这里选择端口输出的意思是,该语音模块听到命令词时,该模块会向单片机发送数据)配置参数参数应写成相应的协议格式,已知协议包括帧头,消息,帧尾三部分,其中帧头和帧尾是固定的,消息是可变的,这里我们只发送一个数据,所以消息部分就写一个数据即可。而帧头和帧尾可以自己定义关灯跟开灯的配置一样下面配置播报co2溶度,因为播报co2溶度不仅要发给单片机让单片机将数据传给语音模块,还要让语音模块播报数据,所以这里需要配置两个控制。原创 2024-09-26 18:35:09 · 2409 阅读 · 0 评论 -
KQM6600空气质量传感器
- 注意看数据手册,该外设在那条线上,这里明显是在APB1线上,所以用RCC_APB1PeriphClockCmd,至于为什么用串口4,是因为在这个单片机上其他的串口被别的外设使用了,所以只能用串口4,-- 已知数据1是voc,数据2是pcho(甲醛),数据3是co2,都是16进制数的形式,所以需要转换成10进制数,并且单位都不同,还要进行换算。-- PC10是TX,PC11是RX,所以配置PC10为复用推挽输出,PC11为浮空输入。-- 这里注意串口4的名字有点特殊,是UART4,没有S。原创 2024-09-25 19:37:32 · 970 阅读 · 0 评论 -
- 串口通信
- 如果只写发送数据的语句,那么怎么知道上次的数据是否已经发送完了,如果上次的数据没有发送完的情况下,再次发送数据的话,就会覆盖上次的数据,所以需要判断上次的数据是否发送完成。-- 发送数据空标志位为1,表示数据发送完成,反之标志位为0,上一次的数据还没有发送完成,所以需要等待,直到标志位为1,表示数据发送完成,再发送数据。通信方式(其实就是接口是一致的,学习单片机其实就是学习它的各种接口),如IO,TIM,USART,I2C,SPI,ADC,DAC,PWM等。- 两个设备要工作的相同的频率下。原创 2024-09-25 17:02:08 · 1553 阅读 · 0 评论 -
系统滴答定时器
时钟频率为1MHz/s = 1M/s (1s计数1M,100ms计数100000)(计一次数1/1Ms) 那么要100ms,要计数多少次?流程:中断源发送中断请求,cpu 收到请求后,暂停当前的主流程、进行压栈,去执行中断,执行完毕之后回到刚才的位置、进行出栈,继续执行。内核手册 150 页,计数器的计数范围:2 的 24 次方,最大值:2 的 24 次方减 1。中断:知道中断的概念、中断的运行流程、中断的优先级、中断在内核和 mcu 如何管理。响应:抢占一致,并且同时发生,谁的响应高,谁就先执行。原创 2024-09-24 16:57:41 · 917 阅读 · 0 评论 -
中断-MCU
硬件优先级随着中断号的增加而降低。NVIC(嵌套向量中断控制器),支持256个中断(240(内核之外(内核之外就是单片机)的中断)+16(异常:内核自身的中断)),对应的中断通道256个, 对应的中断优先级256个(优先级指的是中断通道的优先级),数字越小,优先级越高,8位数。单片机的优先级分组是在内核分组的基础上开始分组的,因为单片机优先级的位数是内核优先级位数的高4位,也就是4~7,所以单片机优先级分组从第三组开始,3~7(一共5组),如第三个分组,在单片机上给抢占的是4位,响应的是0位。原创 2024-09-22 10:59:14 · 1925 阅读 · 0 评论 -
按键与库函数
浮空输入:空闲状态下,不具备高低电平驱动能力,直接输入的电压进行转换;-- 知道是输入,并且选择哪种输入模式都是一样的。上拉输入:空闲状态下(没有信号输入),增加高电平的驱动能力;可以参考官方示例程序,里面有很多例子,可以参考。下拉输入:空闲状态下,增加低电平的驱动能力;然后判断宏定义的值,即可判断按键是否按下。同样的,再去找配置GPIO的函数。-- 看原理图得知控制按键的引脚。-- 初始化函数,时钟和配置模式。-- inc --存放.h文件。-- src --存放.c文件。-- 应用函数,读取按键状态。原创 2024-09-23 09:43:42 · 1065 阅读 · 0 评论 -
LED灯、蜂鸣器、继电器的控制
STM32时钟系统主要的目的就是给相对独立的外设模块提供时钟,主要也是为了降低整个芯片的功耗,所有外设时钟默认都是关闭状态当我们使用某个外设就要开启这个外设的时钟,不同外设需要的时钟频率不同,没必要所有外设都用高速时钟造成浪费,而且有些外设也接受不了这么高的频率,这也是为什么STM32有四个时钟源的原因,就是兼容不同速度的外设,//先将端口配置低寄存器8,9,10,11位清0(P113)//将端口配置低寄存器8,9,10,11位配置为输出,推挽输出。其中HSE时钟,即高速的外部时钟。原创 2024-09-18 19:07:08 · 1654 阅读 · 0 评论 -
配置环境-keil
- STM32是意法半导体(意大利)采用ARM公司设计的内核,设计一系列32位单片机芯片。-- stm32f10x_conf.h -- 不需要复制(后续库函数版本使用)-- stm32f10x.h -- STM32底层所有的寄存器结构体、宏定义。-- 中断相关代码:stm32f10x_it.c/.h。双击打开Keil软件:找到Project下的新建工程。-- 添加其他文件,.h不用添加,编译后自动包含。-- 先将keil安装配置好,包括库。-- 包含头文件的路径。编译,没有错误,说明成功。原创 2024-09-18 19:03:42 · 808 阅读 · 0 评论 -
系统编程-初识MCU
微控制单元(MCU),又称单片微型计算机或者单片机,是把中央处理器(CPU)的频率与规格做适当缩减,并将内存、计数器、USB、A/D 转换、UART、PLC、DMA 等周边接口,甚至 LCD 驱动电路都整合在单一芯片上,形成芯片级的计算机,为不同的应用场合做不同组合控制。诸如手机、PC 外围、遥控器,至汽车电子、工业上的步进马达、机器手臂的控制等,都可见到 MCU 的身影。-- 例如:-- MCU 主要做数据采集、数据小量的处理以及控制。与底层传感器、电机等等设备接触。原创 2024-09-11 19:56:56 · 3278 阅读 · 0 评论