基本功能完成

This commit is contained in:
RB 2025-04-12 21:32:00 +08:00
parent 093acec059
commit 16cebb3314
23 changed files with 8224 additions and 8199 deletions

BIN
.DS_Store vendored Normal file

Binary file not shown.

View File

@ -6,6 +6,7 @@
"lv_port_disp.h": "c",
"lvgl.h": "c",
"gpio.h": "c",
"lcd_font.h": "c"
"lcd_font.h": "c",
"can.h": "c"
}
}

View File

@ -3283,7 +3283,7 @@
<Group>
<GroupName>User/device</GroupName>
<tvExp>0</tvExp>
<tvExp>1</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<cbSel>0</cbSel>
<RteFlg>0</RteFlg>
@ -3358,18 +3358,6 @@
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\User\task\adc.c</PathWithFileName>
<FilenameWithoutPath>adc.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>11</GroupNumber>
<FileNumber>253</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\User\task\can.c</PathWithFileName>
<FilenameWithoutPath>can.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
@ -3377,7 +3365,7 @@
</File>
<File>
<GroupNumber>11</GroupNumber>
<FileNumber>254</FileNumber>
<FileNumber>253</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -3389,7 +3377,7 @@
</File>
<File>
<GroupNumber>11</GroupNumber>
<FileNumber>255</FileNumber>
<FileNumber>254</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -3401,7 +3389,7 @@
</File>
<File>
<GroupNumber>11</GroupNumber>
<FileNumber>256</FileNumber>
<FileNumber>255</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -3413,7 +3401,7 @@
</File>
<File>
<GroupNumber>11</GroupNumber>
<FileNumber>257</FileNumber>
<FileNumber>256</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -3425,7 +3413,7 @@
</File>
<File>
<GroupNumber>11</GroupNumber>
<FileNumber>258</FileNumber>
<FileNumber>257</FileNumber>
<FileType>5</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -3435,6 +3423,18 @@
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>11</GroupNumber>
<FileNumber>258</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\User\task\disp.c</PathWithFileName>
<FilenameWithoutPath>disp.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
</Group>
<Group>

View File

@ -2571,11 +2571,6 @@
<Group>
<GroupName>User/task</GroupName>
<Files>
<File>
<FileName>adc.c</FileName>
<FileType>1</FileType>
<FilePath>..\User\task\adc.c</FilePath>
</File>
<File>
<FileName>can.c</FileName>
<FileType>1</FileType>
@ -2606,6 +2601,11 @@
<FileType>5</FileType>
<FilePath>..\User\task\user_task.h</FilePath>
</File>
<File>
<FileName>disp.c</FileName>
<FileType>1</FileType>
<FilePath>..\User\task\disp.c</FilePath>
</File>
</Files>
</Group>
<Group>

Binary file not shown.

File diff suppressed because it is too large Load Diff

135
README.md
View File

@ -1,22 +1,119 @@
# Sick(DT35)电科--4-20mA_Acquisition_System
## can
- id 0x001;在User\task\can.c中修改结构体默认值
- 数据帧
- 标准帧
- DLC 8位
数据为12位拼一个uint16。发送的是原始数据
频率100hz
## uart
# Micro_usb :100hz float型计算后的毫米数据
需要修改User\component\user_math.c中的标定函数。
# Mini_Core 核心板 STM32F105RBT6
## Led
LED1 闪烁表示线程正常
LED2 闪烁表示can发送中
适配扩展版 -- Sick 中心板
## TODO
自动化标定
---
![图片](img/IMG_9086.JPG)
## 硬件说明
### 核心板
- **型号**: STM32F105RBT6
- **扩展功能**: Sick 数据处理中心板。
![核心板图片](img/IMG_9083.JPG)
### 扩展版
- **CAN1**: 接收 Sick 数据。
- **CAN2**: 发送 Sick 数据。
- **USART3**: PC通信。
- **USART2**: 串口通信。
![核心板图片](img/IMG_9084.JPG)
## 功能概述
### CAN 通信
- **CAN1**: 接收 4 个 Sick 数据帧ID: `0x101`, `0x102`, `0x103`, `0x104`)。
- **CAN2**: 发送格式为 `Sick1 Sick2 Sick3 Sick4` 的数据帧。
- **ID**: `0x110`
- **帧类型**: 标准帧
- **数据长度**: DLC 8 位
- **频率**: 100Hz
### UART 通信
- **Micro USB**: 数据发送频率为 100Hz。
### LED 指示
- 绿色 LED 闪烁,指示系统运行状态。
---
## 当前进展
### 已实现
- CAN1 接收 Sick 数据。
- CAN2 发送 Sick 数据。
- 串口通信功能正常运行。
### 待完成
1. **屏幕适配**:
- 当前屏幕尺寸为 1.14 英寸,需适配至 0.96 英寸。
2. **按键功能**:
- 按键功能尚未实现。
3. **LVGL 绘制优化**:
- LVGL 的绘制功能未使用 DMA。
4. **串口 DMA**:
- USART3 的 DMA 功能未启用(启用后系统异常,需要进一步调试)。
---
## 系统架构
### 数据流
1. **CAN1 接收**:
- 接收 Sick 数据帧并存储到消息队列。
2. **CAN2 发送**:
- 从消息队列读取 Sick 数据并发送。
3. **UART 发送**:
- 通过 USART3 以 100Hz 频率发送 Sick 数据。
### 任务分配
- **Task_Can**:
- 初始化 CAN。
- 接收 CAN 数据并存储到消息队列。
- 定时发送 Sick 数据。
- **Task_PC**:
- 从消息队列读取 Sick 数据。
- 通过 USART3 发送数据。
- **Task_Disp**:
- 初始化屏幕和 LVGL。
- 显示 Sick 数据。
---
## 硬件说明
### 核心板
- **型号**: STM32F105RBT6
- **扩展功能**: Sick 数据处理中心板。
### 通信接口
- **CAN1**: 接收 Sick 数据。
- **CAN2**: 发送 Sick 数据。
- **USART3**: 串口通信。
---
## 使用说明
1. **编译与烧录**:
- 使用 Keil 或 STM32CubeIDE 编译项目。
- 通过 ST-Link 烧录固件到核心板。
2. **运行环境**:
- 供电方式: Micro USB 或外部电源。
- 数据通信: 通过 CAN 和 UART 接口。
3. **调试**:
- 使用串口调试工具查看 Sick 数据发送情况。
- 使用 CAN 分析仪监控 CAN 数据帧。
---
## 贡献者
- **作者**: Robofish
- **项目名称**: Mini_Core
- **版本**: v1.0

View File

@ -14,7 +14,7 @@
#include "component\user_math.h"
/* Private define ----------------------------------------------------------- */
#define CAN_Mini_Croe (0x002)
#define CAN_Mini_Croe (0x110)
/* Private macro ------------------------------------------------------------ */
/* Private typedef ---------------------------------------------------------- */
/* Private variables -------------------------------------------------------- */

View File

@ -20,13 +20,6 @@ static void LCD_WriteData(uint8_t data) {
LCD_CS_HIGH();
}
// // 写多个数据到LCD
// static void LCD_WriteDataBuffer(uint8_t *data, uint16_t size) {
// LCD_DC_HIGH();
// LCD_CS_LOW();
// HAL_SPI_Transmit(&hspi1, data, size, HAL_MAX_DELAY);
// LCD_CS_HIGH();
// }
// 使用 DMA 写多个数据到 LCD
static void LCD_WriteDataBuffer_DMA(uint8_t *data, uint16_t size) {
@ -174,40 +167,40 @@ void LCD_DrawPixel(uint16_t x, uint16_t y, uint16_t color) {
LCD_WriteDataBuffer(color_data, 2);
}
void LCD_DrawChar(uint16_t x, uint16_t y, char ch, uint16_t color, uint16_t bgColor) {
const unsigned char *font = ascii_1206[ch - ' '];
uint8_t char_buffer[FONT_WIDTH * FONT_HEIGHT * 2]; // 每个像素 2 字节
uint32_t index = 0;
// void LCD_DrawChar(uint16_t x, uint16_t y, char ch, uint16_t color, uint16_t bgColor) {
// const unsigned char *font = ascii_1206[ch - ' '];
// uint8_t char_buffer[FONT_WIDTH * FONT_HEIGHT * 2]; // 每个像素 2 字节
// uint32_t index = 0;
// 将字符数据按列存储到缓冲区(逆时针旋转 90 度 + 左右镜像)
for (uint8_t i = 0; i < FONT_WIDTH; i++) { // 遍历字体宽度(列)
for (uint8_t j = 0; j < FONT_HEIGHT; j++) { // 遍历字体高度(行)
// 左右镜像:将列索引从 FONT_WIDTH - 1 - i 开始
if (font[j] & (1 << (FONT_WIDTH - 1 - i))) { // 判断像素是否为前景色
char_buffer[index++] = color >> 8;
char_buffer[index++] = color & 0xFF;
} else { // 背景色
char_buffer[index++] = bgColor >> 8;
char_buffer[index++] = bgColor & 0xFF;
}
}
}
// // 将字符数据按列存储到缓冲区(逆时针旋转 90 度 + 左右镜像)
// for (uint8_t i = 0; i < FONT_WIDTH; i++) { // 遍历字体宽度(列)
// for (uint8_t j = 0; j < FONT_HEIGHT; j++) { // 遍历字体高度(行)
// // 左右镜像:将列索引从 FONT_WIDTH - 1 - i 开始
// if (font[j] & (1 << (FONT_WIDTH - 1 - i))) { // 判断像素是否为前景色
// char_buffer[index++] = color >> 8;
// char_buffer[index++] = color & 0xFF;
// } else { // 背景色
// char_buffer[index++] = bgColor >> 8;
// char_buffer[index++] = bgColor & 0xFF;
// }
// }
// }
// 设置显示窗口(注意旋转后宽高互换)
LCD_SetAddressWindow(x, y, FONT_HEIGHT, FONT_WIDTH);
// // 设置显示窗口(注意旋转后宽高互换)
// LCD_SetAddressWindow(x, y, FONT_HEIGHT, FONT_WIDTH);
// 使用 DMA 传输字符像素数据
LCD_WriteDataBuffer_DMA(char_buffer, sizeof(char_buffer));
}
// // 使用 DMA 传输字符像素数据
// LCD_WriteDataBuffer_DMA(char_buffer, sizeof(char_buffer));
// }
// 绘制字符串沿y轴绘制
void LCD_DrawString(uint16_t x, uint16_t y, const char *str, uint16_t color, uint16_t bgColor) {
y = LCD_HEIGHT-7 -y;
while (*str) {
LCD_DrawChar(x, y, *str, color, bgColor);
y -= FONT_WIDTH; // 每个字符向下移动一个字符宽度
str++;
}
}
// void LCD_DrawString(uint16_t x, uint16_t y, const char *str, uint16_t color, uint16_t bgColor) {
// y = LCD_HEIGHT-7 -y;
// while (*str) {
// LCD_DrawChar(x, y, *str, color, bgColor);
// y -= FONT_WIDTH; // 每个字符向下移动一个字符宽度
// str++;
// }
// }

View File

@ -31,6 +31,6 @@
void LCD_Init(void);
void LCD_Clear(uint16_t color);
void LCD_DrawPixel(uint16_t x, uint16_t y, uint16_t color);
void LCD_DrawChar(uint16_t x, uint16_t y, char ch, uint16_t color, uint16_t bgColor);
void LCD_DrawString(uint16_t x, uint16_t y, const char *str, uint16_t color, uint16_t bgColor);
// void LCD_DrawChar(uint16_t x, uint16_t y, char ch, uint16_t color, uint16_t bgColor);
// void LCD_DrawString(uint16_t x, uint16_t y, const char *str, uint16_t color, uint16_t bgColor);
#endif // __LCD_H

View File

@ -1,104 +1,104 @@
#pragma once
// #pragma once
#include <stdint.h>
// #include <stdint.h>
#define FONT_WIDTH 6
#define FONT_HEIGHT 12
// #define FONT_WIDTH 6
// #define FONT_HEIGHT 12
const unsigned char ascii_1206[][12]={
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*" ",0*/
{0x00,0x00,0x04,0x04,0x04,0x04,0x04,0x00,0x00,0x04,0x00,0x00},/*"!",1*/
{0x14,0x14,0x0A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*""",2*/
{0x00,0x00,0x0A,0x0A,0x1F,0x0A,0x0A,0x1F,0x0A,0x0A,0x00,0x00},/*"#",3*/
{0x00,0x04,0x0E,0x15,0x05,0x06,0x0C,0x14,0x15,0x0E,0x04,0x00},/*"$",4*/
{0x00,0x00,0x12,0x15,0x0D,0x15,0x2E,0x2C,0x2A,0x12,0x00,0x00},/*"%",5*/
{0x00,0x00,0x04,0x0A,0x0A,0x36,0x15,0x15,0x29,0x16,0x00,0x00},/*"&",6*/
{0x02,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"'",7*/
{0x10,0x08,0x08,0x04,0x04,0x04,0x04,0x04,0x08,0x08,0x10,0x00},/*"(",8*/
{0x02,0x04,0x04,0x08,0x08,0x08,0x08,0x08,0x04,0x04,0x02,0x00},/*")",9*/
{0x00,0x00,0x00,0x04,0x15,0x0E,0x0E,0x15,0x04,0x00,0x00,0x00},/*"*",10*/
{0x00,0x00,0x00,0x08,0x08,0x3E,0x08,0x08,0x00,0x00,0x00,0x00},/*"+",11*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x01,0x00},/*",",12*/
{0x00,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,0x00,0x00},/*"-",13*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00},/*".",14*/
{0x00,0x20,0x10,0x10,0x08,0x08,0x04,0x04,0x02,0x02,0x01,0x00},/*"/",15*/
{0x00,0x00,0x0E,0x11,0x11,0x11,0x11,0x11,0x11,0x0E,0x00,0x00},/*"0",16*/
{0x00,0x00,0x04,0x06,0x04,0x04,0x04,0x04,0x04,0x0E,0x00,0x00},/*"1",17*/
{0x00,0x00,0x0E,0x11,0x11,0x08,0x04,0x02,0x01,0x1F,0x00,0x00},/*"2",18*/
{0x00,0x00,0x0E,0x11,0x10,0x0C,0x10,0x10,0x11,0x0E,0x00,0x00},/*"3",19*/
{0x00,0x00,0x08,0x0C,0x0C,0x0A,0x09,0x1F,0x08,0x1C,0x00,0x00},/*"4",20*/
{0x00,0x00,0x1F,0x01,0x01,0x0F,0x11,0x10,0x11,0x0E,0x00,0x00},/*"5",21*/
{0x00,0x00,0x0C,0x12,0x01,0x0D,0x13,0x11,0x11,0x0E,0x00,0x00},/*"6",22*/
{0x00,0x00,0x1E,0x10,0x08,0x08,0x04,0x04,0x04,0x04,0x00,0x00},/*"7",23*/
{0x00,0x00,0x0E,0x11,0x11,0x0E,0x11,0x11,0x11,0x0E,0x00,0x00},/*"8",24*/
{0x00,0x00,0x0E,0x11,0x11,0x19,0x16,0x10,0x09,0x06,0x00,0x00},/*"9",25*/
{0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x04,0x00,0x00},/*":",26*/
{0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x04,0x00},/*";",27*/
{0x00,0x00,0x10,0x08,0x04,0x02,0x02,0x04,0x08,0x10,0x00,0x00},/*"<",28*/
{0x00,0x00,0x00,0x00,0x3F,0x00,0x3F,0x00,0x00,0x00,0x00,0x00},/*"=",29*/
{0x00,0x00,0x02,0x04,0x08,0x10,0x10,0x08,0x04,0x02,0x00,0x00},/*">",30*/
{0x00,0x00,0x0E,0x11,0x11,0x08,0x04,0x04,0x00,0x04,0x00,0x00},/*"?",31*/
{0x00,0x00,0x1C,0x22,0x29,0x2D,0x2D,0x1D,0x22,0x1C,0x00,0x00},/*"@",32*/
{0x00,0x00,0x04,0x04,0x0C,0x0A,0x0A,0x1E,0x12,0x33,0x00,0x00},/*"A",33*/
{0x00,0x00,0x0F,0x12,0x12,0x0E,0x12,0x12,0x12,0x0F,0x00,0x00},/*"B",34*/
{0x00,0x00,0x1E,0x11,0x01,0x01,0x01,0x01,0x11,0x0E,0x00,0x00},/*"C",35*/
{0x00,0x00,0x0F,0x12,0x12,0x12,0x12,0x12,0x12,0x0F,0x00,0x00},/*"D",36*/
{0x00,0x00,0x1F,0x12,0x0A,0x0E,0x0A,0x02,0x12,0x1F,0x00,0x00},/*"E",37*/
{0x00,0x00,0x1F,0x12,0x0A,0x0E,0x0A,0x02,0x02,0x07,0x00,0x00},/*"F",38*/
{0x00,0x00,0x1C,0x12,0x01,0x01,0x39,0x11,0x12,0x0C,0x00,0x00},/*"G",39*/
{0x00,0x00,0x33,0x12,0x12,0x1E,0x12,0x12,0x12,0x33,0x00,0x00},/*"H",40*/
{0x00,0x00,0x1F,0x04,0x04,0x04,0x04,0x04,0x04,0x1F,0x00,0x00},/*"I",41*/
{0x00,0x00,0x3E,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x09,0x07},/*"J",42*/
{0x00,0x00,0x37,0x12,0x0A,0x06,0x0A,0x12,0x12,0x37,0x00,0x00},/*"K",43*/
{0x00,0x00,0x07,0x02,0x02,0x02,0x02,0x02,0x22,0x3F,0x00,0x00},/*"L",44*/
{0x00,0x00,0x3B,0x1B,0x1B,0x1B,0x15,0x15,0x15,0x35,0x00,0x00},/*"M",45*/
{0x00,0x00,0x3B,0x12,0x16,0x16,0x1A,0x1A,0x12,0x17,0x00,0x00},/*"N",46*/
{0x00,0x00,0x0E,0x11,0x11,0x11,0x11,0x11,0x11,0x0E,0x00,0x00},/*"O",47*/
{0x00,0x00,0x0F,0x12,0x12,0x0E,0x02,0x02,0x02,0x07,0x00,0x00},/*"P",48*/
{0x00,0x00,0x0E,0x11,0x11,0x11,0x11,0x17,0x19,0x0E,0x18,0x00},/*"Q",49*/
{0x00,0x00,0x0F,0x12,0x12,0x0E,0x0A,0x12,0x12,0x37,0x00,0x00},/*"R",50*/
{0x00,0x00,0x1E,0x11,0x01,0x06,0x08,0x10,0x11,0x0F,0x00,0x00},/*"S",51*/
{0x00,0x00,0x1F,0x15,0x04,0x04,0x04,0x04,0x04,0x0E,0x00,0x00},/*"T",52*/
{0x00,0x00,0x33,0x12,0x12,0x12,0x12,0x12,0x12,0x0C,0x00,0x00},/*"U",53*/
{0x00,0x00,0x33,0x12,0x12,0x0A,0x0A,0x0C,0x04,0x04,0x00,0x00},/*"V",54*/
{0x00,0x00,0x15,0x15,0x15,0x15,0x0E,0x0A,0x0A,0x0A,0x00,0x00},/*"W",55*/
{0x00,0x00,0x1B,0x0A,0x0A,0x04,0x04,0x0A,0x0A,0x1B,0x00,0x00},/*"X",56*/
{0x00,0x00,0x1B,0x0A,0x0A,0x0A,0x04,0x04,0x04,0x0E,0x00,0x00},/*"Y",57*/
{0x00,0x00,0x1F,0x09,0x08,0x04,0x04,0x02,0x12,0x1F,0x00,0x00},/*"Z",58*/
{0x1C,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x1C,0x00},/*"[",59*/
{0x00,0x02,0x02,0x04,0x04,0x04,0x08,0x08,0x08,0x10,0x10,0x00},/*"\",60*/
{0x0E,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x0E,0x00},/*"]",61*/
{0x04,0x0A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"^",62*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F},/*"_",63*/
{0x02,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"`",64*/
{0x00,0x00,0x00,0x00,0x00,0x0C,0x12,0x1C,0x12,0x3C,0x00,0x00},/*"a",65*/
{0x00,0x03,0x02,0x02,0x02,0x0E,0x12,0x12,0x12,0x0E,0x00,0x00},/*"b",66*/
{0x00,0x00,0x00,0x00,0x00,0x1C,0x12,0x02,0x12,0x0C,0x00,0x00},/*"c",67*/
{0x00,0x18,0x10,0x10,0x10,0x1C,0x12,0x12,0x12,0x3C,0x00,0x00},/*"d",68*/
{0x00,0x00,0x00,0x00,0x00,0x0C,0x12,0x1E,0x02,0x1C,0x00,0x00},/*"e",69*/
{0x00,0x18,0x24,0x04,0x04,0x1E,0x04,0x04,0x04,0x1E,0x00,0x00},/*"f",70*/
{0x00,0x00,0x00,0x00,0x00,0x3C,0x12,0x0C,0x02,0x1C,0x22,0x1C},/*"g",71*/
{0x00,0x03,0x02,0x02,0x02,0x0E,0x12,0x12,0x12,0x37,0x00,0x00},/*"h",72*/
{0x00,0x04,0x04,0x00,0x00,0x06,0x04,0x04,0x04,0x0E,0x00,0x00},/*"i",73*/
{0x00,0x08,0x08,0x00,0x00,0x0C,0x08,0x08,0x08,0x08,0x08,0x07},/*"j",74*/
{0x00,0x03,0x02,0x02,0x02,0x1A,0x0A,0x06,0x0A,0x13,0x00,0x00},/*"k",75*/
{0x00,0x07,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x1F,0x00,0x00},/*"l",76*/
{0x00,0x00,0x00,0x00,0x00,0x0F,0x15,0x15,0x15,0x15,0x00,0x00},/*"m",77*/
{0x00,0x00,0x00,0x00,0x00,0x0F,0x12,0x12,0x12,0x37,0x00,0x00},/*"n",78*/
{0x00,0x00,0x00,0x00,0x00,0x0C,0x12,0x12,0x12,0x0C,0x00,0x00},/*"o",79*/
{0x00,0x00,0x00,0x00,0x00,0x0F,0x12,0x12,0x12,0x0E,0x02,0x07},/*"p",80*/
{0x00,0x00,0x00,0x00,0x00,0x1C,0x12,0x12,0x12,0x1C,0x10,0x38},/*"q",81*/
{0x00,0x00,0x00,0x00,0x00,0x1B,0x06,0x02,0x02,0x07,0x00,0x00},/*"r",82*/
{0x00,0x00,0x00,0x00,0x00,0x1E,0x02,0x0C,0x10,0x1E,0x00,0x00},/*"s",83*/
{0x00,0x00,0x00,0x04,0x04,0x1E,0x04,0x04,0x04,0x1C,0x00,0x00},/*"t",84*/
{0x00,0x00,0x00,0x00,0x00,0x1B,0x12,0x12,0x12,0x3C,0x00,0x00},/*"u",85*/
{0x00,0x00,0x00,0x00,0x00,0x1B,0x0A,0x0A,0x04,0x04,0x00,0x00},/*"v",86*/
{0x00,0x00,0x00,0x00,0x00,0x15,0x15,0x0E,0x0A,0x0A,0x00,0x00},/*"w",87*/
{0x00,0x00,0x00,0x00,0x00,0x1B,0x0A,0x04,0x0A,0x1B,0x00,0x00},/*"x",88*/
{0x00,0x00,0x00,0x00,0x00,0x33,0x12,0x12,0x0C,0x08,0x04,0x03},/*"y",89*/
{0x00,0x00,0x00,0x00,0x00,0x1E,0x08,0x04,0x04,0x1E,0x00,0x00},/*"z",90*/
{0x18,0x08,0x08,0x08,0x08,0x0C,0x08,0x08,0x08,0x08,0x18,0x00},/*"{",91*/
{0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08},/*"|",92*/
{0x06,0x04,0x04,0x04,0x04,0x08,0x04,0x04,0x04,0x04,0x06,0x00},/*"}",93*/
{0x16,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"~",94*/
};
// const unsigned char ascii_1206[][12]={
// {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*" ",0*/
// {0x00,0x00,0x04,0x04,0x04,0x04,0x04,0x00,0x00,0x04,0x00,0x00},/*"!",1*/
// {0x14,0x14,0x0A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*""",2*/
// {0x00,0x00,0x0A,0x0A,0x1F,0x0A,0x0A,0x1F,0x0A,0x0A,0x00,0x00},/*"#",3*/
// {0x00,0x04,0x0E,0x15,0x05,0x06,0x0C,0x14,0x15,0x0E,0x04,0x00},/*"$",4*/
// {0x00,0x00,0x12,0x15,0x0D,0x15,0x2E,0x2C,0x2A,0x12,0x00,0x00},/*"%",5*/
// {0x00,0x00,0x04,0x0A,0x0A,0x36,0x15,0x15,0x29,0x16,0x00,0x00},/*"&",6*/
// {0x02,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"'",7*/
// {0x10,0x08,0x08,0x04,0x04,0x04,0x04,0x04,0x08,0x08,0x10,0x00},/*"(",8*/
// {0x02,0x04,0x04,0x08,0x08,0x08,0x08,0x08,0x04,0x04,0x02,0x00},/*")",9*/
// {0x00,0x00,0x00,0x04,0x15,0x0E,0x0E,0x15,0x04,0x00,0x00,0x00},/*"*",10*/
// {0x00,0x00,0x00,0x08,0x08,0x3E,0x08,0x08,0x00,0x00,0x00,0x00},/*"+",11*/
// {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x01,0x00},/*",",12*/
// {0x00,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,0x00,0x00},/*"-",13*/
// {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00},/*".",14*/
// {0x00,0x20,0x10,0x10,0x08,0x08,0x04,0x04,0x02,0x02,0x01,0x00},/*"/",15*/
// {0x00,0x00,0x0E,0x11,0x11,0x11,0x11,0x11,0x11,0x0E,0x00,0x00},/*"0",16*/
// {0x00,0x00,0x04,0x06,0x04,0x04,0x04,0x04,0x04,0x0E,0x00,0x00},/*"1",17*/
// {0x00,0x00,0x0E,0x11,0x11,0x08,0x04,0x02,0x01,0x1F,0x00,0x00},/*"2",18*/
// {0x00,0x00,0x0E,0x11,0x10,0x0C,0x10,0x10,0x11,0x0E,0x00,0x00},/*"3",19*/
// {0x00,0x00,0x08,0x0C,0x0C,0x0A,0x09,0x1F,0x08,0x1C,0x00,0x00},/*"4",20*/
// {0x00,0x00,0x1F,0x01,0x01,0x0F,0x11,0x10,0x11,0x0E,0x00,0x00},/*"5",21*/
// {0x00,0x00,0x0C,0x12,0x01,0x0D,0x13,0x11,0x11,0x0E,0x00,0x00},/*"6",22*/
// {0x00,0x00,0x1E,0x10,0x08,0x08,0x04,0x04,0x04,0x04,0x00,0x00},/*"7",23*/
// {0x00,0x00,0x0E,0x11,0x11,0x0E,0x11,0x11,0x11,0x0E,0x00,0x00},/*"8",24*/
// {0x00,0x00,0x0E,0x11,0x11,0x19,0x16,0x10,0x09,0x06,0x00,0x00},/*"9",25*/
// {0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x04,0x00,0x00},/*":",26*/
// {0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x04,0x00},/*";",27*/
// {0x00,0x00,0x10,0x08,0x04,0x02,0x02,0x04,0x08,0x10,0x00,0x00},/*"<",28*/
// {0x00,0x00,0x00,0x00,0x3F,0x00,0x3F,0x00,0x00,0x00,0x00,0x00},/*"=",29*/
// {0x00,0x00,0x02,0x04,0x08,0x10,0x10,0x08,0x04,0x02,0x00,0x00},/*">",30*/
// {0x00,0x00,0x0E,0x11,0x11,0x08,0x04,0x04,0x00,0x04,0x00,0x00},/*"?",31*/
// {0x00,0x00,0x1C,0x22,0x29,0x2D,0x2D,0x1D,0x22,0x1C,0x00,0x00},/*"@",32*/
// {0x00,0x00,0x04,0x04,0x0C,0x0A,0x0A,0x1E,0x12,0x33,0x00,0x00},/*"A",33*/
// {0x00,0x00,0x0F,0x12,0x12,0x0E,0x12,0x12,0x12,0x0F,0x00,0x00},/*"B",34*/
// {0x00,0x00,0x1E,0x11,0x01,0x01,0x01,0x01,0x11,0x0E,0x00,0x00},/*"C",35*/
// {0x00,0x00,0x0F,0x12,0x12,0x12,0x12,0x12,0x12,0x0F,0x00,0x00},/*"D",36*/
// {0x00,0x00,0x1F,0x12,0x0A,0x0E,0x0A,0x02,0x12,0x1F,0x00,0x00},/*"E",37*/
// {0x00,0x00,0x1F,0x12,0x0A,0x0E,0x0A,0x02,0x02,0x07,0x00,0x00},/*"F",38*/
// {0x00,0x00,0x1C,0x12,0x01,0x01,0x39,0x11,0x12,0x0C,0x00,0x00},/*"G",39*/
// {0x00,0x00,0x33,0x12,0x12,0x1E,0x12,0x12,0x12,0x33,0x00,0x00},/*"H",40*/
// {0x00,0x00,0x1F,0x04,0x04,0x04,0x04,0x04,0x04,0x1F,0x00,0x00},/*"I",41*/
// {0x00,0x00,0x3E,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x09,0x07},/*"J",42*/
// {0x00,0x00,0x37,0x12,0x0A,0x06,0x0A,0x12,0x12,0x37,0x00,0x00},/*"K",43*/
// {0x00,0x00,0x07,0x02,0x02,0x02,0x02,0x02,0x22,0x3F,0x00,0x00},/*"L",44*/
// {0x00,0x00,0x3B,0x1B,0x1B,0x1B,0x15,0x15,0x15,0x35,0x00,0x00},/*"M",45*/
// {0x00,0x00,0x3B,0x12,0x16,0x16,0x1A,0x1A,0x12,0x17,0x00,0x00},/*"N",46*/
// {0x00,0x00,0x0E,0x11,0x11,0x11,0x11,0x11,0x11,0x0E,0x00,0x00},/*"O",47*/
// {0x00,0x00,0x0F,0x12,0x12,0x0E,0x02,0x02,0x02,0x07,0x00,0x00},/*"P",48*/
// {0x00,0x00,0x0E,0x11,0x11,0x11,0x11,0x17,0x19,0x0E,0x18,0x00},/*"Q",49*/
// {0x00,0x00,0x0F,0x12,0x12,0x0E,0x0A,0x12,0x12,0x37,0x00,0x00},/*"R",50*/
// {0x00,0x00,0x1E,0x11,0x01,0x06,0x08,0x10,0x11,0x0F,0x00,0x00},/*"S",51*/
// {0x00,0x00,0x1F,0x15,0x04,0x04,0x04,0x04,0x04,0x0E,0x00,0x00},/*"T",52*/
// {0x00,0x00,0x33,0x12,0x12,0x12,0x12,0x12,0x12,0x0C,0x00,0x00},/*"U",53*/
// {0x00,0x00,0x33,0x12,0x12,0x0A,0x0A,0x0C,0x04,0x04,0x00,0x00},/*"V",54*/
// {0x00,0x00,0x15,0x15,0x15,0x15,0x0E,0x0A,0x0A,0x0A,0x00,0x00},/*"W",55*/
// {0x00,0x00,0x1B,0x0A,0x0A,0x04,0x04,0x0A,0x0A,0x1B,0x00,0x00},/*"X",56*/
// {0x00,0x00,0x1B,0x0A,0x0A,0x0A,0x04,0x04,0x04,0x0E,0x00,0x00},/*"Y",57*/
// {0x00,0x00,0x1F,0x09,0x08,0x04,0x04,0x02,0x12,0x1F,0x00,0x00},/*"Z",58*/
// {0x1C,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x1C,0x00},/*"[",59*/
// {0x00,0x02,0x02,0x04,0x04,0x04,0x08,0x08,0x08,0x10,0x10,0x00},/*"\",60*/
// {0x0E,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x0E,0x00},/*"]",61*/
// {0x04,0x0A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"^",62*/
// {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F},/*"_",63*/
// {0x02,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"`",64*/
// {0x00,0x00,0x00,0x00,0x00,0x0C,0x12,0x1C,0x12,0x3C,0x00,0x00},/*"a",65*/
// {0x00,0x03,0x02,0x02,0x02,0x0E,0x12,0x12,0x12,0x0E,0x00,0x00},/*"b",66*/
// {0x00,0x00,0x00,0x00,0x00,0x1C,0x12,0x02,0x12,0x0C,0x00,0x00},/*"c",67*/
// {0x00,0x18,0x10,0x10,0x10,0x1C,0x12,0x12,0x12,0x3C,0x00,0x00},/*"d",68*/
// {0x00,0x00,0x00,0x00,0x00,0x0C,0x12,0x1E,0x02,0x1C,0x00,0x00},/*"e",69*/
// {0x00,0x18,0x24,0x04,0x04,0x1E,0x04,0x04,0x04,0x1E,0x00,0x00},/*"f",70*/
// {0x00,0x00,0x00,0x00,0x00,0x3C,0x12,0x0C,0x02,0x1C,0x22,0x1C},/*"g",71*/
// {0x00,0x03,0x02,0x02,0x02,0x0E,0x12,0x12,0x12,0x37,0x00,0x00},/*"h",72*/
// {0x00,0x04,0x04,0x00,0x00,0x06,0x04,0x04,0x04,0x0E,0x00,0x00},/*"i",73*/
// {0x00,0x08,0x08,0x00,0x00,0x0C,0x08,0x08,0x08,0x08,0x08,0x07},/*"j",74*/
// {0x00,0x03,0x02,0x02,0x02,0x1A,0x0A,0x06,0x0A,0x13,0x00,0x00},/*"k",75*/
// {0x00,0x07,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x1F,0x00,0x00},/*"l",76*/
// {0x00,0x00,0x00,0x00,0x00,0x0F,0x15,0x15,0x15,0x15,0x00,0x00},/*"m",77*/
// {0x00,0x00,0x00,0x00,0x00,0x0F,0x12,0x12,0x12,0x37,0x00,0x00},/*"n",78*/
// {0x00,0x00,0x00,0x00,0x00,0x0C,0x12,0x12,0x12,0x0C,0x00,0x00},/*"o",79*/
// {0x00,0x00,0x00,0x00,0x00,0x0F,0x12,0x12,0x12,0x0E,0x02,0x07},/*"p",80*/
// {0x00,0x00,0x00,0x00,0x00,0x1C,0x12,0x12,0x12,0x1C,0x10,0x38},/*"q",81*/
// {0x00,0x00,0x00,0x00,0x00,0x1B,0x06,0x02,0x02,0x07,0x00,0x00},/*"r",82*/
// {0x00,0x00,0x00,0x00,0x00,0x1E,0x02,0x0C,0x10,0x1E,0x00,0x00},/*"s",83*/
// {0x00,0x00,0x00,0x04,0x04,0x1E,0x04,0x04,0x04,0x1C,0x00,0x00},/*"t",84*/
// {0x00,0x00,0x00,0x00,0x00,0x1B,0x12,0x12,0x12,0x3C,0x00,0x00},/*"u",85*/
// {0x00,0x00,0x00,0x00,0x00,0x1B,0x0A,0x0A,0x04,0x04,0x00,0x00},/*"v",86*/
// {0x00,0x00,0x00,0x00,0x00,0x15,0x15,0x0E,0x0A,0x0A,0x00,0x00},/*"w",87*/
// {0x00,0x00,0x00,0x00,0x00,0x1B,0x0A,0x04,0x0A,0x1B,0x00,0x00},/*"x",88*/
// {0x00,0x00,0x00,0x00,0x00,0x33,0x12,0x12,0x0C,0x08,0x04,0x03},/*"y",89*/
// {0x00,0x00,0x00,0x00,0x00,0x1E,0x08,0x04,0x04,0x1E,0x00,0x00},/*"z",90*/
// {0x18,0x08,0x08,0x08,0x08,0x0C,0x08,0x08,0x08,0x08,0x18,0x00},/*"{",91*/
// {0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08},/*"|",92*/
// {0x06,0x04,0x04,0x04,0x04,0x08,0x04,0x04,0x04,0x04,0x06,0x00},/*"}",93*/
// {0x16,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"~",94*/
// };

View File

@ -1,29 +0,0 @@
// /* Includes ----------------------------------------------------------------- */
// #include "task/user_task.h"
// #include "device/ads8864.h"
// /* Private typedef ---------------------------------------------------------- */
// /* Private define ----------------------------------------------------------- */
// /* Private macro ------------------------------------------------------------ */
// /* Private variables --------------------------------------------------------- */
// Ads8864_t ads8864;
// /* Private function --------------------------------------------------------- */
// /* Exported functions ------------------------------------------------------- */
// void Task_Adc(void *argument) {
// (void)argument; // 消除未使用参数的警告
// /* 计算任务运行到指定频率需要等待的tick数 */
// const uint32_t delay_tick = osKernelGetTickFreq() / TASK_FREQ_ADC; // 200Hz
// uint32_t tick = osKernelGetTickCount(); /* 控制任务运行频率的计时 */
// ads8864_Init(&ads8864); // 初始化 ADC
// while (1) {
// tick += delay_tick; /* 计算下一个唤醒时刻 */
// Ads8864_Read(&ads8864);
// osMessageQueueReset(task_runtime.msgq.adc); // 重置消息队列
// osMessageQueuePut(task_runtime.msgq.adc, &ads8864.filtered, 0, 0); // 将数据放入消息队列
// osMessageQueueReset(task_runtime.msgq.pc); // 重置消息队列
// osMessageQueuePut(task_runtime.msgq.pc, &ads8864.filtered.distance,0, 0); // 将数据放入消息队列
// osDelayUntil(tick); /* 运行结束,等待下一次唤醒 */
// }
// }

View File

@ -31,6 +31,9 @@ void Task_Can(void *argument) {
osMessageQueueReset(task_runtime.msgq.can.feedback.sick);
osMessageQueuePut(task_runtime.msgq.can.feedback.sick, &can, 0, 0);
osMessageQueueReset(task_runtime.msgq.pc);
osMessageQueuePut(task_runtime.msgq.pc, &can, 0, 0);
CAN_Sick_Send(&can);
osDelayUntil(tick); /* 运行结束,等待下一次唤醒 */

122
User/task/disp.c Normal file
View File

@ -0,0 +1,122 @@
/*
*/
/* Includes ----------------------------------------------------------------- */
#include "task\user_task.h"
#include "device\can.h"
#include "task\user_task.h"
#include "bsp\led.h"
#include "bsp\buzzer.h"
#include "device\lcd.h"
#include "bsp\gpio.h"
#include "lvgl.h" // 它为整个LVGL提供了更完整的头文件引用
#include "lv_port_disp.h" // LVGL的显示支持
#include "lv_port_indev.h" // LVGL的触屏支持
#include "tim.h"
/* Private typedef ---------------------------------------------------------- */
/* Private define ----------------------------------------------------------- */
/* Private macro ------------------------------------------------------------ */
/* Private variables -------------------------------------------------------- */
static CAN_t can;
CAN_Sick_t sick;
/* Private function --------------------------------------------------------- */
/* Exported functions ------------------------------------------------------- */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if (htim->Instance == TIM6)
{
lv_tick_inc(1); // LVGL的tick计数器
}
}
void Task_Disp(void *argument)
{
(void)argument; // 消除未使用参数的警告
const uint32_t delay_tick = osKernelGetTickFreq() / TASK_FREQ_DISP; // 50Hz
uint32_t tick = osKernelGetTickCount(); /* 控制任务运行频率的计时 */
LCD_Init();
lv_init(); // LVGL 初始化
lv_port_disp_init(); // 注册LVGL的显示任务
lv_port_indev_init(); // 注册LVGL的触屏检测任务
LCD_Clear(WHITE);
HAL_TIM_Base_Start_IT(&htim6); // 启动定时器中断
// 按钮 1
lv_obj_t *myBtn1 = lv_btn_create(lv_scr_act()); // 创建按钮; 父对象:当前活动屏幕
lv_obj_set_pos(myBtn1, 170, 80); // 设置坐标
lv_obj_set_size(myBtn1, 60, 20); // 设置大小
// 按钮 1 的文本
lv_obj_t *label_btn1 = lv_label_create(myBtn1); // 创建文本标签父对象上面的btn按钮
lv_obj_align(label_btn1, LV_ALIGN_CENTER, 0, 0); // 对齐于:父对象
lv_label_set_text(label_btn1, "NEXT"); // 设置标签的文本
// 按钮 2
lv_obj_t *myBtn2 = lv_btn_create(lv_scr_act()); // 创建按钮; 父对象:当前活动屏幕
lv_obj_set_pos(myBtn2, 170, 110); // 设置坐标
lv_obj_set_size(myBtn2, 60, 20); // 设置大小
// 按钮 2 的文本
lv_obj_t *label_btn2 = lv_label_create(myBtn2); // 创建文本标签父对象上面的btn按钮
lv_obj_align(label_btn2, LV_ALIGN_CENTER, 0, 0); // 对齐于:父对象
lv_label_set_text(label_btn2, "OK");
lv_obj_t *label_sick1 = lv_label_create(lv_scr_act()); // 父对象:当前活动屏幕
lv_obj_set_pos(label_sick1, 10, 10); // 设置坐标
lv_label_set_text(label_sick1, "Sick1: 0"); // 设置初始文本
// 创建 Sick2 标签
lv_obj_t *label_sick2 = lv_label_create(lv_scr_act()); // 父对象:当前活动屏幕
lv_obj_set_pos(label_sick2, 120, 10); // 设置坐标
lv_label_set_text(label_sick2, "Sick2: 0"); // 设置初始文本
// 创建 Sick3 标签
lv_obj_t *label_sick3 = lv_label_create(lv_scr_act()); // 父对象:当前活动屏幕
lv_obj_set_pos(label_sick3, 10, 40); // 设置坐标
lv_label_set_text(label_sick3, "Sick3: 0"); // 设置初始文本
// 创建 Sick4 标签
lv_obj_t *label_sick4 = lv_label_create(lv_scr_act()); // 父对象:当前活动屏幕
lv_obj_set_pos(label_sick4, 120, 40); // 设置坐标
lv_label_set_text(label_sick4, "Sick4: 0"); // 设置初始文本
// 创建 作者 标签
lv_obj_t *label_board = lv_label_create(lv_scr_act()); // 父对象:当前活动屏幕
lv_obj_set_pos(label_board, 10, 95); // 设置坐标
lv_label_set_text(label_board, "Mini_croe"); // 设置初始文本
lv_obj_t *label_name = lv_label_create(lv_scr_act()); // 父对象:当前活动屏幕
lv_obj_set_pos(label_name, 10, 114); // 设置坐标
lv_label_set_text(label_name, "By Robofish"); // 设置初始文本
while (1)
{
tick += delay_tick; /* 计算下一个唤醒时刻 */
// 读取数据
lv_timer_handler(); // LVGL的定时器处理函数
if (osMessageQueueGet(task_runtime.msgq.can.feedback.sick, &can, NULL, 0) == osOK)
{
// 更新显示内容
char buffer[16];
snprintf(buffer, sizeof(buffer), "Sick1: %d", can.sick.named.sick[0]); // 假设 sick.value1 是 Sick1 的值
lv_label_set_text(label_sick1, buffer);
snprintf(buffer, sizeof(buffer), "Sick2: %d", can.sick.named.sick[1]); // 假设 sick.value2 是 Sick2 的值
lv_label_set_text(label_sick2, buffer);
snprintf(buffer, sizeof(buffer), "Sick3: %d", can.sick.named.sick[2]); // 假设 sick.value3 是 Sick3 的值
lv_label_set_text(label_sick3, buffer);
snprintf(buffer, sizeof(buffer), "Sick4: %d", can.sick.named.sick[3]); // 假设 sick.value4 是 Sick4 的值
lv_label_set_text(label_sick4, buffer);
}
osDelayUntil(tick); /* 运行结束,等待下一次唤醒 */
}
}

View File

@ -1,7 +1,5 @@
/*
FLASH配置
*/
/* Includes ----------------------------------------------------------------- */
@ -26,16 +24,14 @@ void Task_Init(void *argument) {
osKernelLock(); // 锁定内核,防止任务切换
// 创建任务,确保任务创建成功
// task_runtime.thread.adc = osThreadNew(Task_Adc, NULL, &attr_adc);
task_runtime.thread.disp = osThreadNew(Task_Disp, NULL, &attr_disp);
task_runtime.thread.can = osThreadNew(Task_Can, NULL, &attr_can);
task_runtime.thread.monitor = osThreadNew(Task_Monitor, NULL, &attr_monitor);
task_runtime.thread.pc = osThreadNew(Task_PC, NULL, &attr_pc);
//创建消息队列
// task_runtime.msgq.adc =osMessageQueueNew(2u, sizeof(Ads8864_Filtered_t), NULL);
// task_runtime.msgq.can = osMessageQueueNew(2u, sizeof(Ads8864_Filtered_t), NULL);
// task_runtime.msgq.pc = osMessageQueueNew(2u, sizeof(float), NULL);
task_runtime.msgq.can.feedback.sick = osMessageQueueNew(2u, sizeof(CAN_t), NULL);
task_runtime.msgq.pc = osMessageQueueNew(2u, sizeof(CAN_t), NULL);
osKernelUnlock(); // 解锁内核
osThreadTerminate(osThreadGetId()); // 任务完成后结束自身

View File

@ -2,12 +2,6 @@
#include "task\user_task.h"
#include "bsp\led.h"
#include "bsp\buzzer.h"
#include "device\lcd.h"
#include "bsp\gpio.h"
#include "lvgl.h" // 它为整个LVGL提供了更完整的头文件引用
#include "lv_port_disp.h" // LVGL的显示支持
#include "lv_port_indev.h" // LVGL的触屏支持
#include "tim.h"
/* Private typedef ---------------------------------------------------------- */
/* Private define ----------------------------------------------------------- */
@ -15,98 +9,26 @@
/* Private variables -------------------------------------------------------- */
/* Private function --------------------------------------------------------- */
/* Exported functions ------------------------------------------------------- */
void Key1_Callback(void);
void Key2_Callback(void);
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {
if (htim->Instance == TIM6) {
lv_tick_inc(1); // LVGL的tick计数器
}
}
void Task_Monitor(void *argument) {
(void)argument; // 消除未使用参数的警告
const uint32_t delay_tick = osKernelGetTickFreq() / TASK_FREQ_MONITOR; // 1000Hz
uint32_t tick = osKernelGetTickCount(); /* 控制任务运行频率的计时 */
char tick_str[16];
LCD_Init();
lv_init(); // LVGL 初始化
lv_port_disp_init(); // 注册LVGL的显示任务
lv_port_indev_init(); // 注册LVGL的触屏检测任务
LCD_Clear(BLACK);
// HAL_Delay(5000); // 延时 1 秒
LCD_Clear(RED);
LCD_DrawChar(0, 0, '0', WHITE, BLACK); // 在屏幕上显示字符
LCD_DrawString(0, 0, "Hello", WHITE, BLACK); // 在屏幕上显示字符串
LCD_DrawString(20, 0,"this is sick (DT35-driver)",BLACK,WHITE);
LCD_DrawString(120, 120,"Design by Robofish",BLACK,WHITE);
BSP_LED_Set(BSP_LED_RED, BSP_LED_ON, 0);
BSP_LED_Set(BSP_LED_BLUE, BSP_LED_ON, 0);
BSP_Buzzer_Set(0.1, 0.3); // 设置蜂鸣器频率和占空比
BSP_Buzzer_Start(); // 启动蜂鸣器
HAL_Delay(200); // 延时 1 秒
BSP_Buzzer_Set(0.5, 0.5); // 设置蜂鸣器频率和占空比
// LCD_DrawArea(0, 0, 100, 100, GREEN); // 清屏
HAL_Delay(200); // 延时 1 秒
BSP_Buzzer_Set(0.9, 0.8); // 设置蜂鸣器频率和占空比
HAL_Delay(200);
BSP_Buzzer_Stop(); // 停止蜂鸣器
HAL_TIM_Base_Start_IT(&htim6); // 启动定时器中断
// 按钮 1
lv_obj_t *myBtn1 = lv_btn_create(lv_scr_act()); // 创建按钮; 父对象:当前活动屏幕
lv_obj_set_pos(myBtn1, 180, 60); // 设置坐标
lv_obj_set_size(myBtn1, 60, 20); // 设置大小
// 按钮 1 的文本
lv_obj_t *label_btn1 = lv_label_create(myBtn1); // 创建文本标签父对象上面的btn按钮
lv_obj_align(label_btn1, LV_ALIGN_CENTER, 0, 0); // 对齐于:父对象
lv_label_set_text(label_btn1, "Yes"); // 设置标签的文本
// 按钮 2
lv_obj_t *myBtn2 = lv_btn_create(lv_scr_act()); // 创建按钮; 父对象:当前活动屏幕
lv_obj_set_pos(myBtn2, 180, 100); // 设置坐标
lv_obj_set_size(myBtn2, 60, 20); // 设置大小
// 按钮 2 的文本
lv_obj_t *label_btn2 = lv_label_create(myBtn2); // 创建文本标签父对象上面的btn按钮
lv_obj_align(label_btn2, LV_ALIGN_CENTER, 0, 0); // 对齐于:父对象
lv_label_set_text(label_btn2, "Return");
// // 独立的标签
// lv_obj_t *myLabel = lv_label_create(lv_scr_act()); // 创建文本标签; 父对象:当前活动屏幕
// lv_label_set_text(myLabel, "Hello world!"); // 设置标签的文本
// lv_obj_align(myLabel, LV_ALIGN_CENTER, 0, 0); // 对齐于:父对象
// lv_obj_align_to(myBtn, myLabel, LV_ALIGN_OUT_TOP_MID, 0, -20); // 对齐于:某对象
BSP_GPIO_RegisterCallback(key1_Pin, Key1_Callback);
BSP_GPIO_RegisterCallback(key2_Pin, Key2_Callback);
BSP_GPIO_EnableIRQ(key1_Pin);
BSP_GPIO_EnableIRQ(key2_Pin);
BSP_LED_Set(BSP_LED_RED, BSP_LED_ON, 0);
BSP_LED_Set(BSP_LED_BLUE, BSP_LED_ON, 0);
BSP_Buzzer_Set(0.1, 0.3f);
BSP_Buzzer_Start();
HAL_Delay(300);
BSP_Buzzer_Set(0.5, 0.5f);
HAL_Delay(300);
BSP_Buzzer_Set(0.9, 0.7f);
HAL_Delay(300);
BSP_Buzzer_Stop();
while (1) {
tick += delay_tick; /* 计算下一个唤醒时刻 */
lv_timer_handler(); // LVGL的定时器处理函数
sprintf(tick_str, "Tick: %lu", tick);
//展示tick
LCD_DrawString(0, 0, tick_str, WHITE, BLACK); // 在屏幕上显示 tick 值
// 切换 LED 状态
BSP_LED_Set(BSP_LED_GREEN, BSP_LED_TAGGLE, 0); // 50% 占空比
//TODO: 监控任务的具体实现
BSP_LED_Set(BSP_LED_GREEN, BSP_LED_TAGGLE, 0);
osDelayUntil(tick); /* 运行结束,等待下一次唤醒 */
}
}
void Key1_Callback(void) {
// 处理 key1 的中断逻辑
BSP_LED_Set(BSP_LED_RED, BSP_LED_TAGGLE, 0);
}
void Key2_Callback(void) {
// 处理 key2 的中断逻辑
BSP_LED_Set(BSP_LED_RED, BSP_LED_TAGGLE, 0);
}

View File

@ -1,31 +1,27 @@
/* Includes ----------------------------------------------------------------- */
#include "task\user_task.h"
#include "usart.h"
#include "bsp\led.h"
#include <string.h> // 用于 sprintf 函数
#include "usart.h"
#include "device\can.h" // 引入 CAN 数据结构头文件
/* Private variables -------------------------------------------------------- */
float distance = 14.0f; // 用于存储距离数据单位为米
// char distance_str[32]; // 用于存储格式化后的字符串
static CAN_t can; // 用于存储从消息队列获取的 CAN 数据
/* Exported functions ------------------------------------------------------- */
void Task_PC(void *argument) {
(void)argument; // 消除未使用参数的警告
const uint32_t delay_tick = osKernelGetTickFreq() / 100; // 50Hz
const uint32_t delay_tick = osKernelGetTickFreq() / TASK_FREQ_PC; // 50Hz
uint32_t tick = osKernelGetTickCount(); /* 控制任务运行频率的计时 */
while (1) {
tick += delay_tick; /* 计算下一个唤醒时刻 */
BSP_LED_Set(BSP_LED_BLUE, BSP_LED_TAGGLE, 0); // 50% 占空比
// 将 distance 格式化为字符串
// sprintf(distance_str, "Distance: %.2f m\r\n", distance);
// 从消息队列获取 CAN 数据
if (osMessageQueueGet(task_runtime.msgq.can.feedback.sick, &can, NULL, 0) == osOK) {
// 通过 USART3 发送 sick 数据数组
HAL_UART_Transmit(&huart3, (uint8_t *)can.sick.named.sick, sizeof(can.sick.named.sick), HAL_MAX_DELAY);
HAL_UART_Transmit(&huart2, (uint8_t *)can.sick.named.sick, sizeof(can.sick.named.sick), HAL_MAX_DELAY);
}
//使用串口发送"123"
// HAL_UART_Transmit(&huart2, (uint8_t *)distance_str, strlen(distance_str), 1000); // 发送数据
// HAL_UART_Transmit(&huart3, (uint8_t *)distance_str, strlen(distance_str), 1000); // 发送数据
HAL_UART_Transmit_DMA(&huart2, (uint8_t *)"123", 3); // 发送数据
HAL_UART_Transmit_DMA(&huart3, (uint8_t *)"123", 3); // 发送数据
osDelayUntil(tick); /* 运行结束,等待下一次唤醒 */
}
}

View File

@ -15,16 +15,16 @@ const osThreadAttr_t attr_can = {
.stack_size = 128 * 4,
};
// const osThreadAttr_t attr_adc = {
// .name = "Task_Adc",
// .priority = osPriorityRealtime,
// .stack_size = 128 * 4,
// };
const osThreadAttr_t attr_disp = {
.name = "Task_Disp",
.priority = osPriorityRealtime,
.stack_size = 512 * 4,
};
const osThreadAttr_t attr_monitor = {
.name = "Task_Monitor",
.priority = osPriorityRealtime,
.stack_size = 512 * 4,
.stack_size = 128 * 4,
};
const osThreadAttr_t attr_pc = {

View File

@ -13,7 +13,7 @@ typedef struct {
/* 各任务,也可以叫做线程 */
struct {
osThreadId_t can; /* CAN任务 */
// osThreadId_t adc; /* ADC任务 */
osThreadId_t disp; /* ADC任务 */
osThreadId_t pc; /* PC任务 */
osThreadId_t monitor; /* 监控任务 */
} thread;
@ -34,21 +34,21 @@ typedef struct {
struct {
uint32_t can; /* CAN使用 */
// uint32_t adc; /* ADC使用 */
uint32_t disp; /* ADC使用 */
uint32_t pc; /* PC使用 */
uint32_t monitor; /* 监控使用 */
} heap_water_mark; /* heap使用 */
struct {
float can; /* CAN任务运行频率 */
// float adc; /* ADC任务运行频率 */
float disp; /* ADC任务运行频率 */
float pc; /* PC任务运行频率 */
float monitor; /* 监控任务运行频率 */
} freq; /* 任务运行频率 */
struct {
uint32_t can; /* CAN任务运行时间 */
// uint32_t adc; /* ADC任务运行时间 */
uint32_t disp; /* ADC任务运行时间 */
uint32_t pc; /* PC任务运行时间 */
uint32_t monitor; /* 监控任务运行时间 */
} last_up_time; /* 任务最近运行时间 */
@ -57,9 +57,9 @@ typedef struct {
// 任务频率和初始化延时
#define TASK_FREQ_CAN (500u)
#define TASK_FREQ_ADC (200u)
#define TASK_FREQ_MONITOR (100u)
#define TASK_FREQ_CAN (100u)
#define TASK_FREQ_DISP (200u)
#define TASK_FREQ_MONITOR (1u)
#define TASK_FREQ_PC (100u)
@ -68,7 +68,7 @@ typedef struct {
// 任务句柄
typedef struct {
osThreadId_t can;
// osThreadId_t adc;
osThreadId_t disp;
osThreadId_t monitor;
osThreadId_t pc;
} Task_Handles_t;
@ -79,16 +79,13 @@ extern Task_Runtime_t task_runtime;
extern const osThreadAttr_t attr_init;
extern const osThreadAttr_t attr_can;
// extern const osThreadAttr_t attr_adc;
extern const osThreadAttr_t attr_disp;
extern const osThreadAttr_t attr_monitor;
extern const osThreadAttr_t attr_pc;
// extern osMessageQueueId_t adcQueueHandle;
// extern osMessageQueueId_t pcQueueHandle;
void Task_Init(void *argument);
void Task_Can(void *argument);
// void Task_Adc(void *argument);
void Task_Disp(void *argument);
void Task_Monitor(void *argument);
void Task_PC(void *argument);

BIN
img/.DS_Store vendored Normal file

Binary file not shown.

BIN
img/IMG_9083.JPG Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 MiB

BIN
img/IMG_9084.JPG Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 MiB

BIN
img/IMG_9086.JPG Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 MiB