Ai-M61-32SU+字库+LCD

Ai-M61-32SU 有4M flash,可以下载一个200多K的GB2312_80字库

ed4dcecb0aa44b2c8458e59f63585e7e.png3713c084b9db4fb7b4a5e4c4e1433655.jpg

一、将gb2312_80.bin(字库文件)烧录到Ai-M61-32SU中

1、将gb2312_80.bin放到工程的根目录

1440c9d39f3c4da782a21929773cc8f0.png

2、修改flash_prog_cfg.ini文件,增加了partition和media部分

[cfg]
# 0: no erase, 1:programmed section erase, 2: chip erase
erase = 1
# skip mode set first para is skip addr, second para is skip len, multi-segment region with ; separated
skip_mode = 0x0, 0x0
# 0: not use isp mode, #1: isp mode
boot2_isp_mode = 0[FW]
filedir = ./build/build_out/gpio*_$(CHIPNAME).bin
address = 0x000000[partition]
filedir = ./build/build_out/partition.bin
address = 0xE000[media]
filedir = ./gb2312_80.bin
address = @partition

 gb2312_80.bin的起始地址由partition.bin决定。

partition.bin的参数由aithinker_Ai-M6X_SDK\bsp\board\bl616dk\config\partition_cfg_4M.toml决定。partition_cfg_4M.toml有如下内容:

[[pt_entry]]
type = 2
name = "media"
device = 0
address0 = 0x378000
size0 = 0x71000
address1 = 0
size1 = 0

所以meida 分区起始地址为0x378000,空间为0X71000,大概500k。

3、烧录

make flash COMX=COM10

这样就可以把gb2312_80.bin烧录到0x378000c40f1e10661c4d5f93c36f8882c837e3.png

二、 用于LCD显示及字库读取的程序

main.c

#include "bflb_gpio.h"
#include "bflb_uart.h"#include "board.h"#include "lcd.h"
#include "hzk.h"//#define FLASH_RW_START_ADDR  0x378000
struct bflb_device_s *uartx;
struct bflb_device_s *gpio;
//static uint8_t read_buf[32];//extern void GUI_Write16CnCharMatrix(unsigned char x, unsigned char y, uint8_t *cn, unsigned short wordColor, unsigned short backColor);void uart_isr(int irq, void *arg)
{uint32_t intstatus = bflb_uart_get_intstatus(uartx);if (intstatus & UART_INTSTS_RX_FIFO) {printf("rx fifo\r\n");while (bflb_uart_rxavailable(uartx)) {printf("0x%02x\r\n", bflb_uart_getchar(uartx));}bflb_uart_feature_control(uartx, UART_CMD_SET_RTS_VALUE, 1);}if (intstatus & UART_INTSTS_RTO) {printf("rto\r\n");while (bflb_uart_rxavailable(uartx)) {printf("0x%02x\r\n", bflb_uart_getchar(uartx));}bflb_uart_int_clear(uartx, UART_INTCLR_RTO);}
}void uart_init(void)
{uartx = bflb_device_get_by_name(DEFAULT_TEST_UART);struct bflb_uart_config_s cfg;cfg.baudrate = 115200;cfg.data_bits = UART_DATA_BITS_8;cfg.stop_bits = UART_STOP_BITS_1;cfg.parity = UART_PARITY_NONE;cfg.flow_ctrl = 0;cfg.tx_fifo_threshold = 7;cfg.rx_fifo_threshold = 7;bflb_uart_init(uartx, &cfg);bflb_uart_rxint_mask(uartx, false);bflb_irq_attach(uartx->irq_num, uart_isr, NULL);bflb_irq_enable(uartx->irq_num);bflb_uart_feature_control(uartx, UART_CMD_SET_SW_RTS_CONTROL, true);bflb_uart_feature_control(uartx, UART_CMD_SET_RTS_VALUE, 0);
}int main(void)
{// uint32_t i,j;// uint32_t flash_addr;board_init();board_uartx_gpio_init();uart_init();lcd_init();lcd_clear(LCD_COLOR_RGB565(255,0,0));//lcd_draw_str_ascii16(10,10,LCD_COLOR_RGB565(255,255,255),LCD_COLOR_RGB565(255,0,0),(uint8_t*)"hello world!",12);gpio = bflb_device_get_by_name("gpio");printf("gpio output\r\n");bflb_gpio_init(gpio, GPIO_PIN_17, GPIO_OUTPUT | GPIO_PULLUP | GPIO_SMT_EN | GPIO_DRV_0);bflb_gpio_set(gpio, GPIO_PIN_17);// for (uint32_t offset = 0; offset < 10*sizeof(read_buf); offset+=sizeof(read_buf)){//     flash_addr=FLASH_RW_START_ADDR+offset;//     memset(read_buf, 0, sizeof(read_buf));//     /* read flash data *///     bflb_flash_read(flash_addr, read_buf, sizeof(read_buf));//     for (j = 0; j < sizeof(read_buf); j++) {//         printf("0x%02X,",read_buf[j]);//      }//       printf("\r\n");// }GUI_Write16CnCharMatrix(0,32,(uint8_t*)"蒹葭苍苍白露为霜",LCD_COLOR_RGB565(255,255,255),LCD_COLOR_RGB565(255,0,0));GUI_Write16CnCharMatrix(0,52,(uint8_t*)"所谓伊人在水一方",LCD_COLOR_RGB565(255,255,255),LCD_COLOR_RGB565(255,0,0));GUI_Write16CnCharMatrix(0,72,(uint8_t*)"溯洄从之道阻且长",LCD_COLOR_RGB565(255,255,255),LCD_COLOR_RGB565(255,0,0));GUI_Write16CnCharMatrix(0,92,(uint8_t*)"溯游从之宛在水中央",LCD_COLOR_RGB565(255,255,255),LCD_COLOR_RGB565(255,0,0));while (1) {}
}

hzk.h

#ifndef ___HZK_H___
#define ___HZK_H___void GUI_Write16CnCharMatrix(unsigned char x, unsigned char y, uint8_t *cn, unsigned short wordColor, unsigned short backColor);#endif

hzk.c

#include "bflb_flash.h"
#include "lcd.h"
#include "hzk.h"uint32_t FLASH_ADDR_BASE=0x378000;
uint8_t MatrixBuff[32];void getMatrix(const unsigned short nmCode)
{uint8_t i;uint32_t offset;unsigned char GBH,GBL;unsigned short nm=nmCode;GBH=nm>>8;GBL=nm;if(GBH>=0xb0){offset=((GBH-0xa7)*94+GBL-0xa1)*32;}else{offset=((GBH-0xa1)*94+GBL-0xa1)*32;}bflb_flash_read(FLASH_ADDR_BASE+offset+i, MatrixBuff, sizeof(MatrixBuff));}void GUI_Write16CnCharMatrix(unsigned char x, unsigned char y, uint8_t *cn, unsigned short wordColor, unsigned short backColor)
{uint8_t i, j, wordNum;uint16_t zm;uint16_t color;while (*cn != '\0'){//setXY(x, y, x+15, y+15);zm=*cn;zm<<=8;zm|=*(cn+1);getMatrix(zm);for(i=0; i<32; i++){   //MSK的位数color=MatrixBuff[i];for(j=0;j<8;j++){if((color&0x80)==0x80){//lcd_write_data_word(wordColor);if(i%2==0) lcd_draw_point(x+j,y+i/2,wordColor);else lcd_draw_point(x+j+8,y+i/2,wordColor);}else{//lcd_write_data_word(backColor);if(i%2==0) lcd_draw_point(x+j,y+i/2,backColor);else lcd_draw_point(x+j+8,y+i/2,backColor);}color<<=1;}//for(j=0;j<8;j++)结束}cn += 2;x += 16;}
}

 为了支持LCD显示,在aithinker_Ai-M6X_SDK\bsp\common\lcd\spi中添加了2个文件:st7735s_spi.h

/*** @file st7735s.h* @brief** Copyright (c) 2021 Bouffalolab team** Licensed to the Apache Software Foundation (ASF) under one or more* contributor license agreements.  See the NOTICE file distributed with* this work for additional information regarding copyright ownership.  The* ASF licenses this file to you under the Apache License, Version 2.0 (the* "License"); you may not use this file except in compliance with the* License.  You may obtain a copy of the License at**   http://www.apache.org/licenses/LICENSE-2.0** Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the* License for the specific language governing permissions and limitations* under the License.**/#ifndef _ST7735S_SPI_H_
#define _ST7735S_SPI_H_#include "../lcd_conf.h"#if defined LCD_SPI_ST7735S/* Do not modify the following */#define ST7735S_SPI_COLOR_DEPTH 16typedef struct {uint8_t cmd; /* 0xFF : delay(databytes)ms */const char *data;uint8_t databytes; /* Num of data in data; or delay time */
} st7735s_spi_init_cmd_t;typedef uint16_t st7735s_spi_color_t;int st7735s_spi_init();
void st7735s_spi_async_callback_enable(bool enable);
void st7735s_spi_async_callback_register(void (*callback)(void));
int st7735s_spi_set_dir(uint8_t dir, uint8_t mir_flag);
void st7735s_spi_set_draw_window(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2);
void st7735s_spi_draw_point(uint16_t x, uint16_t y, st7735s_spi_color_t color);
void st7735s_spi_draw_area(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, st7735s_spi_color_t color);
void st7735s_spi_draw_picture_nonblocking(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, st7735s_spi_color_t *picture);
void st7735s_spi_draw_picture_blocking(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, st7735s_spi_color_t *picture);
int st7735s_spi_draw_is_busy(void);#endif
#endif

st7735s_spi.c

/*** @file st7735s_spi.c* @brief** Copyright (c) 2021 Bouffalolab team** Licensed to the Apache Software Foundation (ASF) under one or more* contributor license agreements.  See the NOTICE file distributed with* this work for additional information regarding copyright ownership.  The* ASF licenses this file to you under the Apache License, Version 2.0 (the* "License"); you may not use this file except in compliance with the* License.  You may obtain a copy of the License at**   http://www.apache.org/licenses/LICENSE-2.0** Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the* License for the specific language governing permissions and limitations* under the License.**/#include "../lcd.h"#if defined(LCD_SPI_ST7735S)#if (LCD_SPI_INTERFACE_TYPE == 1)
#include "bl_spi_hard_4.h"#define lcd_spi_init                          lcd_spi_hard_4_init
#define lcd_spi_isbusy                        lcd_spi_hard_4_is_busy#define lcd_spi_transmit_cmd_para             lcd_spi_hard_4_transmit_cmd_para
#define lcd_spi_transmit_cmd_pixel_sync       lcd_spi_hard_4_transmit_cmd_pixel_sync
#define lcd_spi_transmit_cmd_pixel_fill_sync  lcd_spi_hard_4_transmit_cmd_pixel_fill_sync#define lcd_spi_sync_callback_enable          lcd_spi_hard_4_async_callback_enable
#define lcd_spi_async_callback_register       lcd_spi_hard_4_async_callback_register
#define lcd_spi_transmit_cmd_pixel_async      lcd_spi_hard_4_transmit_cmd_pixel_async
#define lcd_spi_transmit_cmd_pixel_fill_async lcd_spi_hard_4_transmit_cmd_pixel_fill_asyncstatic lcd_spi_hard_4_init_t spi_para = {.clock_freq = 40 * 1000 * 1000,
#if (ST7735S_SPI_PIXEL_FORMAT == 1).pixel_format = LCD_SPI_LCD_PIXEL_FORMAT_RGB565,
#elif (ST7735S_SPI_PIXEL_FORMAT == 2).pixel_format = LCD_SPI_LCD_PIXEL_FORMAT_NRGB8888,
#endif
};#else#error "Configuration error"#endif
const st7735s_spi_init_cmd_t st7735s_spi_init_cmds[] = {{ 0x11, NULL, 0},{ 0xFF, NULL, 120 },{ 0xB1, "\x02\x35\x36", 3 }, //Frame rate 80Hz{ 0xB2, "\x02\x35\x36", 3 }, //Frame rate 80Hz{ 0xB3, "\x02\x35\x36\x02\x35\x36", 6 },{ 0xB4, "\x03", 1 },{ 0xC0, "\xA2\x02\x84", 3 },{ 0xC1, "\xC5", 1 },{ 0xC2, "\x0D\x00", 2},{ 0xC3, "\x8D\x2A", 2},{ 0xC4, "\x8D\xEE", 2},{ 0xC5, "\x0A", 1},{ 0x36, "\xC8", 1},{ 0xE0, "\x12\x1C\x10\x18\x33\x2C\x25\x28\x28\x27\x2F\x3c\x00\x03\x03\x10", 16},{ 0xE1, "\x12\x1C\x10\x18\x2D\x28\x23\x28\x28\x26\x2F\x3B\x00\x03\x03\x10", 16},{ 0x3A, "\x05", 1},  //65k mode{ 0x29, NULL, 0 },  //Display on
};/*** @brief st7735s_spi_async_callback_enable** @return*/
void st7735s_spi_async_callback_enable(bool enable)
{lcd_spi_sync_callback_enable(enable);
}/*** @brief st7735s_spi_async_callback_register** @return*/
void st7735s_spi_async_callback_register(void (*callback)(void))
{lcd_spi_async_callback_register(callback);
}/*** @brief st7735s_spi_draw_is_busy, After the call st7735s_spi_draw_picture_dma must check this,*         if st7735s_spi_draw_is_busy() == 1, Don't allow other draw !!*         can run in the DMA interrupt callback function.** @return int 0:draw end; 1:Being draw*/
int st7735s_spi_draw_is_busy(void)
{return lcd_spi_isbusy();
}/*** @brief st7735s_spi_init** @return int*/
int st7735s_spi_init()
{lcd_spi_init(&spi_para);for (uint16_t i = 0; i < (sizeof(st7735s_spi_init_cmds) / sizeof(st7735s_spi_init_cmds[0])); i++) {if (st7735s_spi_init_cmds[i].cmd == 0xFF && st7735s_spi_init_cmds[i].data == NULL && st7735s_spi_init_cmds[i].databytes) {bflb_mtimer_delay_ms(st7735s_spi_init_cmds[i].databytes);} else {lcd_spi_transmit_cmd_para(st7735s_spi_init_cmds[i].cmd, (void *)(st7735s_spi_init_cmds[i].data), st7735s_spi_init_cmds[i].databytes);}}return 0;
}/*** @brief** @param dir* @param mir_flag*/
int st7735s_spi_set_dir(uint8_t dir, uint8_t mir_flag)
{uint8_t param;switch (dir) {case 0:if (!mir_flag)param = 0x00;elseparam = 0x40;break;case 1:if (!mir_flag)param = 0x20;elseparam = 0xA0;break;case 2:if (!mir_flag)param = 0x80;elseparam = 0xC0;break;case 3:if (!mir_flag)param = 0xE0;elseparam = 0x60;break;default:return -1;break;}lcd_spi_transmit_cmd_para(0x36, (void *)&param, 1);return dir;
}/*** @brief st7735s_spi_set_draw_window** @param x1* @param y1* @param x2* @param y2*/
void st7735s_spi_set_draw_window(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2)
{
#if ST7735S_SPI_OFFSET_Xx1 += ST7735S_SPI_OFFSET_X;x2 += ST7735S_SPI_OFFSET_X;
#endif
#if ST7735S_SPI_OFFSET_Yy1 += ST7735S_SPI_OFFSET_Y;y2 += ST7735S_SPI_OFFSET_Y;
#endifint8_t param[4];param[0] = (x1 >> 8) & 0xFF;param[1] = x1 & 0xFF;param[2] = (x2 >> 8) & 0xFF;param[3] = x2 & 0xFF;lcd_spi_transmit_cmd_para(0x2A, (void *)param, 4);param[0] = (y1 >> 8) & 0xFF;param[1] = y1 & 0xFF;param[2] = (y2 >> 8) & 0xFF;param[3] = y2 & 0xFF;lcd_spi_transmit_cmd_para(0x2B, (void *)param, 4);
}/*** @brief st7735s_spi_draw_point** @param x* @param y* @param color*/
void st7735s_spi_draw_point(uint16_t x, uint16_t y, st7735s_spi_color_t color)
{/* set window */st7735s_spi_set_draw_window(x, y, x, y);lcd_spi_transmit_cmd_pixel_sync(0x2C, (void *)&color, 1);
}/*** @brief st7735s_draw_area** @param x1* @param y1* @param x2* @param y2* @param color*/
void st7735s_spi_draw_area(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, st7735s_spi_color_t color)
{uint32_t pixel_cnt = (x2 - x1 + 1) * (y2 - y1 + 1);/* set window */st7735s_spi_set_draw_window(x1, y1, x2, y2);lcd_spi_transmit_cmd_pixel_fill_sync(0x2C, (uint32_t)color, pixel_cnt);
}/*** @brief st7735s_draw_picture_dma, Non-blocking! Using DMA acceleration, Not waiting for the draw end*  After the call, No other operations are allowed until (st7735s_draw_is_busy()==0)** @param x1* @param y1* @param x2* @param y2* @param picture*/
void st7735s_spi_draw_picture_nonblocking(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, st7735s_spi_color_t *picture)
{size_t pixel_cnt = (x2 - x1 + 1) * (y2 - y1 + 1);/* set window */st7735s_spi_set_draw_window(x1, y1, x2, y2);lcd_spi_transmit_cmd_pixel_async(0x2C, (void *)picture, pixel_cnt);
}/*** @brief st7735s_draw_picture,Blocking,Using DMA acceleration,Waiting for the draw end** @param x1* @param y1* @param x2* @param y2* @param picture*/
void st7735s_spi_draw_picture_blocking(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, st7735s_spi_color_t *picture)
{size_t pixel_cnt = (x2 - x1 + 1) * (y2 - y1 + 1);/* set window */st7735s_spi_set_draw_window(x1, y1, x2, y2);lcd_spi_transmit_cmd_pixel_sync(0x2C, (void *)picture, pixel_cnt);
}#endif

lcd.h中指定位置增加:

#elif defined LCD_SPI_ST7735S#include "spi/st7735s_spi.h"
#define LCD_INTERFACE_TYPE           LCD_INTERFACE_SPI
#define LCD_W                        ST7735S_SPI_W
#define LCD_H                        ST7735S_SPI_H
#define LCD_COLOR_DEPTH              ST7735S_SPI_COLOR_DEPTH
#define _LCD_FUNC_DEFINE(_func, ...) st7735s_spi_##_func(__VA_ARGS__)

在lcd_conf.h指定位置增加:

/* spi st7735s config */
#elif defined LCD_SPI_ST7735S/* Selecting interface type, more configuration of peripherals comes later1: SPI peripheral, supported functions: spi-4wire,*/
#define LCD_SPI_INTERFACE_TYPE 1/* Selecting pixel format1: rgb565*/
#define ST7735S_SPI_PIXEL_FORMAT 1/* enable the lcd reset function0: Does not care about lcd hard reset1: use gpio to reset the lcd*/
#define LCD_RESET_EN 1/* LCD width and height */
#define ST7735S_SPI_W 132
#define ST7735S_SPI_H 132/* The offset of the area can be displayed */
#define ST7735S_SPI_OFFSET_X 0
#define ST7735S_SPI_OFFSET_Y 0

 lcd_conf.h中有LCD SPI定义:

#define LCD_SPI_HARD_4_PIN_CLK   GPIO_PIN_13
#define LCD_SPI_HARD_4_PIN_DAT   GPIO_PIN_15
/* cs/dc pin, software controlled */
#define LCD_SPI_HARD_4_PIN_CS   GPIO_PIN_14
#define LCD_SPI_HARD_4_PIN_DC   GPIO_PIN_16
#define LCD_RESET_PIN GPIO_PIN_12

三、总结

1、proj.conf需做如下修改,启用SDK中的LCD模块

set(CONFIG_COMPONENT1 1)

set(CONFIG_BSP_LCD 1)

2、CMakeLists.txt,要加入

sdk_add_include_directories(.)

target_sources(app PRIVATE hzk.c)

编译时可以包含当前目录的.h,编译项目根目录的hzk.c

cmake_minimum_required(VERSION 3.15)

include(proj.conf)

find_package(bouffalo_sdk REQUIRED HINTS $ENV{BL_SDK_BASE})

sdk_add_include_directories(.)

target_sources(app PRIVATE hzk.c)

sdk_set_main_file(main.c)

project(gpio_input_output)

3、main.c 文件需要用记事本保存为ASCII编码文件,或VScode中报文为GB2312编码的文件。否则汉字部分无法正确显示。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/741293.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

js视频上传的方法

一、视频上传于图片上传类似他们的上传方法一样。路径不同标签不同&#xff1b; 二、直接上效果 三、直接上代码 // // 上传图片 let urls "https://wwz.jingyi.icu/"; let a $("form img") // console.log(a);function fl() {let read document.getE…

探索制氮机在农产品保鲜中的应用方式

在现代生活中&#xff0c;农产品保鲜成为老生常谈的话题&#xff0c;水果数次厂商总是在为如何使水果蔬菜能够保存时间长一点而发愁&#xff0c;而制氮机的出现则解决了这一难题&#xff0c;为农产品保鲜技术带来了革命性的变革。本期恒业通小编和您一起了解制氮机在水果,蔬菜保…

Pytorch基础(21)-- torch.repeat_interleave()方法

分享一下自己目前在维护的Github项目&#xff0c;由于本人博士阶段接触了一个全新的研究方向-----使用机器学习、强化学习、深度学习等方法解决组合优化问题&#xff0c;维护这个项目的目的&#xff1a; &#xff08;1&#xff09;记录自己阅读过的paper&#xff0c;同时分享一…

【数学建模】熵权法 Python代码

熵权法是一种客观的赋权方法&#xff0c;它可以靠数据本身得出权重。 依据的原理&#xff1a;指标的变异程度越小&#xff0c;所反映的信息量也越少&#xff0c;其对应的权值也应该越低。 import numpy as np#自定义对数函数mylog&#xff0c;用于处理输入数组中的0元素 def m…

ROS机器人操作系统底层原理及代码剖析

本文介绍ROS机器人操作系统&#xff08;Robot Operating System&#xff09;的实现原理&#xff0c;从最底层分析ROS代码是如何实现的。 1、序列化 把通信的内容&#xff08;也就是消息message&#xff09;序列化是通信的基础&#xff0c;所以我们先研究序列化。 尽管笔者从事…

jenkins部署go应用 基于docker

丢弃旧的的构建 github 拉取代码 拉取代码排除指定配置文件 报错 环境变量失效 服务器版本为1.21.6 但是一直没有生效

字符串|替换数字

卡码网题目链接 #include<iostream> using namespace std; int main() {string s;while (cin >> s) {int count 0; // 统计数字的个数int sOldSize s.size();for (int i 0; i < s.size(); i) {if (s[i] > 0 && s[i] < 9) {count;}}// 扩充字符…

6.同步异步、正则表达式

JS执行机制 js的特点&#xff1a;单线程&#xff0c;同一时间只能做一件事 可以通过多核CPU解决这个问题&#xff0c;允许js脚本创建多个线程&#xff0c;于是js出现了同步和异步 同步 程序执行的时候按照顺序依次执行 异步 程序执行的时候&#xff0c;会跳过某个步骤继续…

基于Springboot的驾校预约学习系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的驾校预约学习系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构…

fate隐私求交案例

intersect组件是解决纵向联邦学习中的隐私求交问题 fate隐私求交的方式有三种&#xff1a;raw,rsa,dh。raw方式不安全&#xff0c;rsa和dh方式是安全的&#xff0c;dh是基于对称加密的安全交集 rsa是基于RSA(非对称加密)的安全交集&#xff0c;&#xff0c;dh方法也用于安全的…

供应链金融新篇章:2001-2022年上市公司金融水平测算概览

数据说明&#xff1a;参考周兰和吴慧君&#xff08;2022&#xff09;的方法测算出2001-2022年上市公司供应链金融水平&#xff0c;供大家研究使用。数据来源&#xff1a;企业年报等。时间跨度&#xff1a;2001-2022年 数据范围&#xff1a;A股上市公司 数据指标&#xff1a;…

实现swiper 3d 轮播效果

先上个效果图&#xff0c;代码可以直接拿~ 安装swiper和vue-awesome-swiper 因为项目用的是nuxt2&#xff0c;所以考虑到swiper的兼容问题&#xff0c;选择的是"swiper": “^5.2.0” 首先是安装swiper和vue-awesome-swiper&#xff0c;并指定版本 npm install s…

基于Unity3D的AVG卡牌游戏设计与实现

目 录 摘 要 I Abstract II 引 言 1 1 相关技术 3 1.1 C# 3 1.2 Unity3D 3 1.3 UGUI 3 1.4 XML 4 1.5 原型设计模式 4 1.6 本章小结 4 2 系统分析 5 2.1 用户需求 5 2.2 功能需求 5 2.3 非功能需求 6 2.4 本章小结 6 3 系统设计 7 3.1 系统该要设计 7 3.2 系统详细设计 7 3.2.…

数组和指针笔试题目解析---掌握他们拿下指针魔鬼

目录 一、前言二、一维数组2.1代码2.2分析2.3验证运行结果 三、字符数组3.1代码13.1.1分析3.1.2验证运行结果 3.2代码23.2.1分析3.2.2验证运行结果 3.3代码33.3.1分析3.3.2验证运行结果 3.4代码43.4.1分析3.4.2验证运行结果 3.5代码53.5.1分析3.5.2验证运行结果 3.6代码63.6.1分…

基于SpringBoot和VUE技术的智慧生活商城系统设计与实现

** &#x1f345;点赞收藏关注 → 私信领取本源代码、数据库&#x1f345; 本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目&#xff0c;希望你能有所收获&#xff0c;少走一些弯路。&#x1f345;关注我不迷路&#x1f345;** 一、研究背景…

Net Core 使用Mongodb操作文件(上传,下载)

Net Core 使用Mongodb操作文件&#xff08;上传&#xff0c;下载&#xff09; 1.Mongodb GridFS 文件操作帮助类。 GridFS 介绍 https://baike.baidu.com/item/GridFS/6342715?fraladdin DLL源码&#xff1a;https://gitee.com/chenjianhua1985/mongodb-client-encapsulati…

STM32点亮LED灯与蜂鸣器发声

STM32之GPIO GPIO在输出模式时可以控制端口输出高低电平&#xff0c;用以驱动Led蜂鸣器等外设&#xff0c;以及模拟通信协议输出时序等。 输入模式时可以读取端口的高低电平或电压&#xff0c;用于读取按键输入&#xff0c;外接模块电平信号输入&#xff0c;ADC电压采集灯 GP…

论坛管理系统|基于Spring Boot+ Mysql+Java+B/S架构的论坛管理系统设计与实现(可运行源码+数据库+设计文档+部署说明+视频演示)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 目录 目录 前台功能效果图 管理员功能登录前台功能效果图 用户功能模块 系统功能设计 数据库E-R图设计 l…

OxyPlot图表曲线图学习笔记(winform)

一、学习OxyPlot 开源地址&#xff1a;https://github.com/oxyplot/oxyplot 最新版&#xff1a;v2.1.2 新建winform&#xff0c;nuget中添加依赖包 二、写代码 2.1 BarSeries 2.2 ScatterSeries 2.3 LineSeries (带指向箭头&#xff09; int pointCount 50; double[] xs …

Xilinx 7系列FPGA的配置流程

目录 1.4配置流程 1.4.1 设备上电 ​编辑1.4.2 清除配置寄存器 1.4.3 采样模式引脚 1.4.4 同步 ​编辑1.4.5 检测设备ID ​编辑1.4.6 加载配置数据 1.4.7 CRC校验 1.4.8 启动序列 1.4配置流程 对于所有配置模式&#xff0c;7系列的基本配置流程都是相同的&…