智能家居

MCU:stm32f103c8t6

项目在keil上进行移植创建开发

项目包含对下位机MCU对外设数据读取与控制)和上位机包含服务平台和APP端)的设计。下位机选取STM32作为MCU,外设有LED灯温度传感器,OLED屏。上位机则选用中国移动旗下的OneNet平台作为服务器,考虑到未来物联网的开发大多数是基于手机APP的。使用QT利用socket套接字绑定云平台IP和端口号制作。

下位机外设驱动

ESP8266模块可以通过AT指令控制开发,总体开发速度快,难度较低

OLED模块使用IIC协议驱动显示

温度传感器采集温度信息

云平台使用

选择多协议接入使用MQTT,既可以上传数据也可以下发数据控制

创建的产品

注意设备ID,鉴权信息以及接入方式这3个属性

问题:

esp8266连接热点时存在问题

image-20240828151237216

外设:0.96寸OLED,ESP8266,LED,温度传感器

ESP8266部分的代码主要是借助串口通讯AT指令ESP8266模块刷入AT固件的)与OneNet平台进行信息交互(包含ESP8266初始化、数据发送,指令发送和数据缓存清除等)将模块配置为仅作为客户端模式,即Station模式‌

1初始化DS18B20

2对DS18B20读数据

3对DS18B20写数据

image-20240822141451779

MQTT

Message Queuing Telemetry Transport消息队列遥测传输协议),是一种基于发布/订阅publish/subscribe)模式的“轻量级”通讯协议(因此MQTT常用于物联网开发中的低功耗长期在线通讯),该协议构建于TCP/IP协议上。

实现MQTT协议需要客户端和服务器端通讯完成,在通讯过程中,MQTT协议中有三种身份:发布者(Publish)、代理(Broker)(服务器)、订阅者(Subscribe)。其中,消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者。

MQTT传输的消息分为:主题(Topic)和负载(payload)两部分:

(1)Topic,可以理解为消息的类型,订阅者订阅(Subscribe)后,就会收到该主题的消息内容(payload);
(2)payload,可以理解为消息的内容,是指订阅者具体要使用的内容。

在MQTT协议中,一个MQTT数据包由:固定头(Fixed header)、可变头(Variable header)、消息体(payload)三部分构成。MQTT数据包结构如下:

  • (1)固定头(Fixed header)。存在于所有MQTT数据包中,表示数据包类型及数据包的分组类标识。
  • (2)可变头(Variable header)。存在于部分MQTT数据包中,数据包类型决定了可变头是否存在及其具体内容。
  • (3)消息体(Payload)。存在于部分MQTT数据包中,表示客户端收到的具体内容。

PC性能监测

vscode开发

启动文件和链接脚本

makefile

难点,问题:

接收上位机数据:ringbuffer

解包:码头,功能码,数据位,数据,效验码,码尾;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
int main(void)
{
eeprom_init();//flash初始化

oled_init();
DMA1_channel7_Init();//DMA配置初始化
MX_GPIO_Init();
rt_thread_mdelay(500);
MX_USB_DEVICE_Init();//ringbuffer

led_init();

data_decode_init();//循环接收数据帧

oled_show_init();//logo显示,选择模式进行相应显示

return 0;
}
//格式化屏幕,划分logo
extern struct rt_mutex mutex_oled_lock;
rt_thread_init(&gui_thread, //gui线程初始化
"gui",
gui_entry,
RT_NULL,
&gui_thread_stack[0],
sizeof(gui_thread_stack),
1,
20);
rt_thread_startup(&gui_thread);
}
//oled数据显示
struct rt_semaphore sem_oled_dma_TxCplt;
struct rt_mutex mutex_oled_lock;
rt_thread_init(&oled_send_thread, //OLED线程初始化
"oled_spi",
oled_send_entry,
RT_NULL,
&oled_send_thread_stack[0],
sizeof(oled_send_thread_stack),
2,
20);
//解包
struct rt_semaphore sem_usb_rx;
rt_thread_init(&data_decode_thread,
"decode",
data_decode_entry,
RT_NULL,
&data_decode_thread_stack[0],
sizeof(data_decode_thread_stack),
3,
20);
//切换模式
rt_thread_init(&oled_draw_thread,
"oled_draw",
oled_draw_entry,
RT_NULL,
&oled_draw_thread_stack[0],
sizeof(oled_draw_thread_stack),
4,
20);
rt_thread_init(&led_breath_thread,
"led",
led_breath_entry,
RT_NULL,
&led_breath_thread_stack[0],
sizeof(led_breath_thread_stack),
5,
20);

操作系统(RTOS)

进程线程:通信

信号量,互斥锁

LINUX卡片电脑

遇到问题:编译驱动(.ko)时,在开发板上运行时报错 无法创建IIC设备

解决:Linux版本不对。 查看启动内核打印信息,看到在解析子节点时没成功,缺少时钟频率;

平台-设备-驱动总线模式

IIC驱动OLED

:i2c_transfer函数里的主体是什么?回答的是msg,其实应该是adapter和msg;

img

移植系统:uboot,kernel,rootfs

image-20240823161757060

bootargs 是启动参数(Boot Arguments)的缩写,用于在 Linux 系统启动时向内核传递一系列的配置选项

1
console=ttyS0,115200n8 root=/dev/mmcblk0p2 rw rootfstype=ext4 rootwait

bootcmd是U-Boot(一个开源的引导加载程序,广泛用于嵌入式系统的启动)中的一个环境变量,它定义了系统启动时自动执行的命令。

1
setenv bootcmd 'mmc dev 1; fatload mmc 1:1 80800000 zImage; fatload mmc 1:1 83000000 imx6ull-alientek-emmc.dtb; bootz 80800000 - 83000000;'

Framebuffer

Frame 是帧的意思,buffer 是缓冲的意思,这意味着Framebuffer 就是一块内存,里面保存着一帧图像。Framebuffer 中保存着一帧图像的每一个像素颜色值

fb 是一种机制,将系统中所有跟显示有关的硬件以及软件集合起来,虚拟出一个 fb 设备,当我们编写好 LCD 驱动以后会生成一个名为/dev/fbX(X=0~n)的设备,应用程序通过访问/dev/fbX 这个设备就可以访问 LCD

实习

TBOX

DV - Design Verification 设计验证

DUT - Device Under Testing 被测单元

负载 - TODO

上位机软件 - TODO

OPENCPU 一般为 modem 集成模组,主要负责运营商相关业务,GPS 定位,以太网,WiFi模组控制等功能。

具体检测内容由具体项目硬件方案确定

上位机通信测试时,上位机通过 CAN 设备连接 DUT 的 CAN 接口,CAN 接口分为数据 CAN接口和通信 CAN 接口,其中:

⚫ 数据 CAN 以 100ms 周期向上位机上报 TBox 的相关信息,内容为各测试项的检测状态或检测结果。

⚫ 通信 CAN 以 100ms 周期向上位机上报固定报文,具体报文参照通信协议。

WIFI功能

检测 WiFi 模块是否工作正常。

DUT 的 WiFi 工作在 STA 模式下,主动连接负载的热点,并进行数据通信,若能成功通信则认为 WiFi 模块功能正常,将结果按照协议上报。

试验时要求 AP 的 IP 地址为 192.168.10.100,连接热点的 SSID 由 DUT 的配置文件指定,PWD固定为 64840808,DUT 连接 wifi 热点成功后,通过 ping 命令进行通信检测网络通路。

连接不上 wifi、获取不到 IP 超过 5 次或 ping 失败 30 次认为失败,重启 WiFi 模块重新检测。检测失败时,RSSI 也上报错误,不再保持之前的值。

GPS功能

DUT 定时检测 GPS 模块回传数据。正常工作时,GPS 模块初始化后每秒回传一次模块数据,若超过 5 秒未收到模块数据,则认为模块通信异常

USB功能

DUT 作为从机,负载作为主机,DUT 主动 ping 通负载验证能否正常通信。ping 通即认为通路正常,连续 5 次 ping 通失败则认为通路异常,将检测结果按照通信协议上报。其中 DUT的 IP 地址固定为 2.2.2.2,负载的 IP 地址固定为 2.2.2.3。

CAN

数据帧:大多数情况下使用的报文结构
从标识符长度上,又可以把数据帧分为标准帧 (11 位标识符 ) 和扩展帧 (29 位标识符 ) 。
数据帧由 7 个不同的位场组成:帧起始、仲裁场、控制场、数据场、 CRC 场、应答场、帧结束。

远程帧:用来向某一个节点请求数据

错误帧:任何单元,一旦检测到总线错误就发出错误帧

过载帧:用于先行和后续的数据帧或者远程帧之间提供附加延时,保证接收端能够来得及处理前面收到的数据,包括过载标志和过载界定符.

问题:

内存泄漏:

ringbuffer写入比读出快

器件功耗,精度问题

项目难点,解决

连接热点问题,项目开始选型阶段驱动模块太多(温度,湿度,光传感器,红外,压力,声音,摄像头),芯片资源不够,项目完成后对整个系统的优化,选用更高精度的器件,在设计电路板的时候加入抗干扰元器件,在软件设计方面少用延时函数,全局变量,考虑一些功耗问题。是否使用操作系统

介绍

汽车电子产品事业部,车载T-BOX,即远程信息处理控制单元,主要包括MCU,OPENCPU,AP

项目包含对下位机(MCU对外设数据读取与控制,连接云平台),上位机(手机APP)QT简易制作,云端(云服务平台接收下位机数据并下发命令)的设计。主要实现下位机,上位机,云的一个互通。

下位机选取STM32作为MCU,外设有LED灯温度传感器,OLED屏。云平台则选用中国移动旗下的OneNet平台作为服务器,考虑到手机APP的更方便直接操作。使用QT利用socket套接字绑定云平台IP和端口号制作。

下位机外设驱动,ESP8266模块可以通过AT指令控制开发,总体开发速度快,难度较低,OLED模块使用IIC协议驱动显示,温度传感器采集温度信息

云平台使用选择多协议接入使用MQTT,既可以上传数据也可以下发数据控制创建的产品,注意设备ID,鉴权信息以及接入方式这3个属性

整个项目在keil上进行移植开发,主要学习一些简单的外设驱动,和了解一些通信协议,掌握嵌入式开发的基本知识

一个显示 PC 运行状态监测的站台,通过上位机将 PC 端的 CPU 温度、CPU 占用率、内存占用率、GPU 温度和实时网速等信息采集后下发到模块,模块通过 OLED 将其显示出来。

上位机是一个带有串口收发功能的开源上位机(hardware monitor),下位机即开发板,自己设计打板(c8t6,OLED(spi),LED,USB,引出下载调试引脚)

整个项目在vscode上进行开发,运行rt-thread操作系统,

主要学习了解一些实时操作系统的相关知识,包括进程线程,系统调度,程序运行的一个流程。包括启动文件,链接脚本,makefile,ringbuffer接收数据,数据包解包,码头,功能码,数据长度,数据,效验码,码尾,多少个线程,线程优先级,信号量,互斥锁