当前位置: 首页 > news >正文

STM32F072 CAN and USB

1 通用描述
1.1 STM8
MOSTek 6502 -> ST7 -> STM8
STM8型号单片机分为STM8A、STM8L、STM8S三个系列。
STM8A:汽车级应用
STM8L:超低功耗MCU
STM8S:标准系列

1.2 STM32
- F1系列用的最多,最大工作频率72MHz
- STM32固件库(函数)使用手册
STM32F107:2010,DWC2 FS OTG
STM32MP157C-DK2:MPU
STM32U5:U means ULP

1.3 ST开发板种类
ST官方出的有NUCLEO板、Discovery板以及评估板,配置从低到高,价格也是从低到高。
NUCLEO:一般只将MCU引脚引出,还有一个串口(通过STLINK USB虚拟),价格也就几十到100RMB左右。
Discovery板:一般比NUCLEO板多USB(MCU带USB),音频解码,耳机插孔。价格也就100多点。
评估板:功能是最全的,一般外设都有引出,功能最全,价格最高,几百到1000+RMB。

1.4 STM32 GPIO Alternate function mapping
GPIO复用功能要查找的是datasheet。TRM中是详细的寄存器描述,但不包括GPIO复用功能的描述。

2 开发环境搭建
2.1 STM32CubeMX_V4.27.0
www.st.com/stm32cubemx

STM32CubeMX可以生成Atollic公司的TrueSTUDIO项目文件。

2.2 IAR8.30.1
IAR embedded Workbench 8.30
https://m.baidu.com/ala/c/m.3322.cc/mip/40168.html

3 CAN
3.1 CAN分类
PT CAN:PowerTrain CAN,动力总成
CH CAN:Chassis CAN,底盘控制CAN总线
Body CAN:车身控制总线,BMW Body Domain Controller or Basis Central Platform
Info CAN:娱乐系统总线
Diag CAN:诊断控制总线

3.2 CAN速率
同时支持速率500 Kbps和2 Mbps;BMS充电器CAN默认通信传输速率为250 kbit/s。
CAN:payload的长度是固定的8个字节
CAN FD:payload的长度不是8个字节的都是FD;CAN FD包头和payload用不同的速度传输,速率切换从BRS位(bit rate switching)开始一直到CRC(包括CRC)结束

3.3 STM32F072
3.3.1 bxCAN pinout
PB8: CAN Rx
PB9: CAN Tx
STM32F072 Discovery board, without CAN Transceiver MCP2551.

3.3.2 bxCAN Rx filter
bxCAN: Basic Extended CAN
3个发送邮箱,每个发送邮箱包括4个寄存器:
CAN_TIxR[31:21]存放11bits ID
CAN_TDTxR[3:0]存放数据长度DLC
CAN_TDLxR和CAN_TDHxR存放8个字节的payload
2个接收邮箱,每个接收邮箱包括4个寄存器:
CAN_RIxR[31:21]存放11bits ID
CAN_RDTxR[3:0]存放数据长度DLC
CAN_RDLxR和CAN_RDHxR存放8个字节的payload

ID寄存器32bit CAN_FxR1,Mask寄存器32bit CAN_FxR2。CAN接收过滤类似于Marvell 88Q5050交换机的ACL过滤机制,包含数据寄存器,和对应的mask寄存器。mask寄存器某位为1表示接收到的CAN ID对应的位必须与数据寄存器对应的位相同,mask寄存器某位为0表示不关心接收到的CAN ID对应的位,这种内存的类型称为TCAM。
Mask Data Meaning
0        x        Don't care. The data bit can be a one or a zero.
1        0        Hit on 0.
1        1        Hit on 1.

3.4 STM32F072 CANable
3.4.1 PCAN USB
深圳嘉立创打样
STM32F042/072, SRAM 1024 bytes, last 256 bytes are exclusively shared with CAN peripheral.
STM32F405/407 for PCAN USB Pro.

STM32F072
PA8: OTG_FS_SOF, Synopsys DWC OTG
PA11: USB FS DM
PA12: USB FS DP
PA13: SWDIO
PA14: SWCLK
PB8: CAN0_Rx
PB9: CAN0_Tx
PB14: USB HS DM. Waveshare USB3300 PHY Module from TB.
PB15: USB HS DP. Waveshare USB3300 PHY Module from TB.
BOOT0-PF11
一旦开启了USB电源,即USB_CNTR.PDWN位清零,PA11和PA12将不再作为其它功能使用,仅供USB使用,自动作为DM和DP,不需要手工配置IO MUX。

3.4.2 CANable
CANable is based on STM32Cube.
下载ARM官方的arm-none-eabi-gcc编译器。
GNU Arm Embedded Toolchain
gcc-arm-none-eabi-10.3-2021.10-x86_64-linux.tar.bz2 

github上搜索CANable。
https://github.com/moonglow/pcan_cantact
make canable
find -name *.bin

3.4.3 Standard PCAN
The STM32F072 has up to 16 mono-directional or 8 bidirectional endpoints.
USB SRAM(0x4000_6000)偏移地址0到ENDP0_RXADDR之间的buffer用来存储端点的参数,每个端点参数有4个寄存器,每个寄存器占用2个字节,分别表示双向EP的接收packet和发送packet的位置和大小。Refer to Src/usbd_conf.c USBD_LL_Init().
Both USB and bxCAN do not support DMA.
Linux: drivers/net/can/usb/peak_usb/pcan_usb.c
CANable: Src/pcan_usb.c
4 endpoints: two for command IN/OUT, another two for message IN/OUT.
CMDOUT / MSGOUT: device_data_out()
CMDIN: pcan_usb_send_command_buffer()
MSGIN: pcan_flush_data()
CMDIN / CMDOUT: 1-byte func +
    1-byte number (GET or SET) +
    14-byte param
MSGOUT: 1-byte prefix +
    1-byte rec_count +
    1-byte status +
    4 or 2-byte ID +
    (DLC = status & 0xf)-byte data + 
    extra_byte (if SRR = 1)

每一个Full-speed USB_EP_MSGIN MPS(Max Packet Size)可以包含多个PCAN消息(Aggregation mode),并且第一个PCAN消息的时间戳是2个字节,从第二个开始的PCAN消息时间戳都是1个字节。下一个Full-speed MPS报文重复该模式。
MSGIN: 1-byte prefix +
    1-byte rec_count +
    1-byte status +
    4 or 2-byte ID +
    2 or 1-byte timestamp +
    (DLC = status & 0xf)-byte data +
    extra_byte (if SRR = 1)
status: bit7 = timestamp, bit6 = internal, bit5 = ext_ID, bit4 = RTR (Remote Transmission Request)
29-bit ID = 4-byte ID >>= 3
11-bit ID = 2-byte ID >>= 5
SRR = ID.bit0, Substitute Remote Request

3.4.4 Debug
1) Windows PCAN-View
When PCAN-View starts, it will send the below five commands.
05: PCAN_USB_CMD_CFG
01: PCAN_USB_CMD_BITRATE
03: PCAN_USB_SET_SILENT_MODE
0b: PCAN_USB_CMD_LED
03: PCAN_USB_CMD_BUS

2)status packet
03 02 01, CAN bus active, then call pcan_timesync_event() sends the timestamp frame 02 02 42 04 01 b1 28 40 01 00 to PC periodically for about 1 second.
2-byte header: 02 02
1-byte status: 42
1-byte function: 04, PCAN_USB_REC_TS
1-byte number: 01
2-byte timestamp: b1 28
1-byte status: 40
1-byte function: 01, PCAN_USB_REC_ERROR
1-byte number: 00

3) CANable patch
MSGIN: 14 x Max_Packet_Size = 14 x 64-byte, the first PCAN packet in each 64-byte has two bytes timestamp.
Add a variable msg_count to pcan_rx_can_frame(), append the 4-byte to status packet.
The first 5-byte of status packet: 02 02 42 04  01
The third 3-byte of PCAN packet: 02 01 08

Change CANable VID from 0x0483 (STMicroelectronics) to 0x0C72, otherwise Windows PCAN_USB.inf cannot recognize CANable because of driver signature issue.
Windows PCAN-View sends PCAN_USB_CMD_BITRATE to CANable twice, the second command will cause STM32F072 bxCAN does not work, after apply the below patch, the issue will be gone.
case PCAN_USB_CMD_BITRATE:
  if (pcan_device.bus_active)
    pcan_can_set_bus_active(0);
  pcan_device.can.btr0 = cmd->param[1];
  pcan_device.can.btr1 = cmd->param[0];
  pcan_set_bitrate( cmd->param );
  if (pcan_device.bus_active)
    pcan_can_set_bus_active(
      pcan_device.bus_active);

4) Bit timing
STM32F072 CANbps = APB1_clock / BRP / (tseg1 + tseg2 + 1)
PCAN-View发送给CANable下位机的有关时序的4个参数中sjw、tseg1和tseg2是三个数组的索引,索引到三个值后分别减去1,再写入CAN_BTR寄存器,而brp的数值做特殊处理后,再减去1写入CAN_BTR寄存器。
从函数SystemClock_Config中找出APB1 bxCAN的时钟信息,APB1的时钟是48 MHz。

500 kBit/s
APB1: 48 MHz
tseg1 = c -> CAN_BS1_13TQ -> 13
tseg2 = 1 -> CAN_BS2_2TQ -> 2
brp = 0 -> 1 x 6 -> 6
sjw = 0 -> CAN_SJW_1TQ -> 1

4 USB
4.1 USB SRAM
USB SRAM base: 0x4000_6000
STM32F072/042是2014年发布的产品。STM32F072/042上对STM32F103的USBD做了改进,0x400空间里面塞下了1024B的SRAM,而且最后面的256B可以分给CAN专用,前面768B给USBD,完美解决了STM32F103的USBD和CAN不能同时使用的问题。除此之外,STM32F072/042还增加了LPM、DP上拉电阻;尤其是DP上拉电阻,节省一个电阻和一个IO,是非常好的改进。

4.2 Flash and SRAM Base Address
STM32F042/072 bootROM supports USB DFU. The built-in USB IP is legacy, not DWC.
On-chip Flash base address: 0x0800_0000, 1 Kbyte page
On-chip RAM base address: 0x2000_0000, SRAM data bus is 36 bits because 4 bits are available for parity check (1 bit per byte) in order to increase memory robustness.

4.3 DFU Tool
Refer to AN2606 to get what STM32 devices support DFU bootloader.
Use Zadig to replace DFU driver with WinUSB.
https://zadig.akeo.ie/
https://dfu-util.sourceforge.net/
dfu-util -d 0483:df11 -a 0 -s 0x08000000 -D xx.bin

There is a web to implement USB DFU based on the draft WebUSB specification (based on WinUSB, Javascript API, Chrome 61, in 2018).

4.4 VCP
STM32F0x2xx USB FS device library: UM1717
1)添加CDC ACM的3个端点时,顺序排在PCAN的4个端点之后,中间不能有端点不用,否则Windows 10 CDC ACM不工作。
2)CAN_MSGIN和VCP_DATIN双方会互抢带宽,所以VCP发送到PC的日志要尽可能少。
3)VCP的setup bRequest只要实现0x20(SET)和0x21(GET)。

typedef struct usb_interface_assoc_descriptor {
  uint8_t bLength;
  uint8_t bDescriptorType;
  uint8_t bFirstInterface;
  uint8_t bInterfaceCount;
  uint8_t bFunctionClass;
  uint8_t bFunctionSubClass;
  uint8_t bFunctionProtocol;
  uint8_t iFunction;
} USB_INTERFACE_ASSOC_DESCRIPTOR;

typedef struct usb_cdc_header_desc {
  uint8_t bLength;
  uint8_t bDescriptorType;
  uint8_t bDescriptorSubType;
  uint16_t bcdCDC;
} USB_CDC_HEADER_DESC;
typedef struct usb_cdc_call_mgmt_descriptor {
  uint8_t bLength;
  uint8_t bDescriptorType;
  uint8_t bDescriptorSubType;
  uint8_t bmCapabilities;
  uint8_t bDataInterface;
} USB_CDC_CALL_MGMT_DESCRIPTOR;
typedef struct usb_cdc_acm_descriptor {
  uint8_t bLength;
  uint8_t bDescriptorType;
  uint8_t bDescriptorSubType;
  uint8_t bmCapabilities;
} USB_CDC_ACM_DESCRIPTOR;
typedef struct usb_cdc_union_desc {
  uint8_t bLength;
  uint8_t bDescriptorType;
  uint8_t bDescriptorSubType;
  uint8_t bMasterInterface0;
  uint8_t bSlaveInterface0;
} USB_CDC_UNION_DESC;

static struct usb_cdc_line_coding line_code = {
  .dwDTERate = 9600,
  .bCharFormat = 0, /* stop bits-1 */
  .bParityType = 0, /* none */
  .bDataBits = 8, /* nb. of bits 8 */
};

include <stdarg.h>
void usb_printf(const char *fmt, ...)
{
  USBD_HandleTypeDef *pdev = &hUsbDeviceFS;
  va_list args;
  uint32_t len;
  char buf[APP_TX_DATA_SIZE];

  if (pdev->dev_state !=
      USBD_STATE_CONFIGURED)
    return;


  va_start(args, fmt);
  len = vsnprintf(buf,
        (APP_TX_DATA_SIZE - 1),
        fmt, args);
  va_end(args);
  buf[len] = '\0';

  if (pdev->ep_in[VCP_USB_EP_DATIN & 0xFU].total_length)
    return;
  pdev->ep_in[VCP_USB_EP_DATIN & 0xFU].total_length =
    (len + 1);
  USBD_LL_Transmit(pdev,
    VCP_USB_EP_DATIN,
    (uint8_t *)buf,
    (len + 1));
}
Download Davidozzoo / STM32-USB-VCP from github.

4.5 socketCAN
sudo ip link set can0 type can bitrate 500000 restart-ms 100
sudo ip link set up can0
sudo apt install can-utils
candump can0
CAN identifier: 456h
CAN data: 00h FFh AAh 55h 01h 02h 03h 04h (8 bytes)
cansend can0 456#00FFAA5501020304

5 STM32软件实施USB PD协议
USB PD通讯使用的是双相标记码(Bi-phase Mark Code,BMC,300KHz,bit rate 600kbps),此码是一种单线通信编码,数据1的传输需要有一次高/低电平之间的切换过程,数据0的传输则是固定的高电平或低电平。

TX:SPI1从模式MISO当作TX,SPI1 CLK通过配置TIM14产生,工作在600KHz(对应BMC 600kbps),ARR = 72Mhz / 600kbps,PSC = 0,72MHz频率输入,每计数12个(= 72MHz / 600kbps)触发产生一个SPI1从clk时钟。
SPI传输数据过程中总是先发送或接收高字节数据,每个时钟周期接收器或发送器左移一位数据。对于小于16位的数据,在发送前必须左对齐,如果接收的数据小于16位,则采用软件将无效的数据位屏蔽。

RX:TIM1 CH1输入捕获模式并用DMA接收数据。
输入捕获模式下:当捕获单元捕获到外来有效信号边沿事件(通过TIM1 CH1 Capture Compare Enable Register = 0xB设置上升沿和下降沿捕获,STM32库使用宏TIM_ICPolarity_BothEdge = 0x000A配置双边沿触发捕获),将此刻计数器的值锁存到CCR(Capture Compare Register,16bit)影子寄存器并自动将CCR影子寄存器的值拷贝进CCR预装寄存器,以供用户读取。DMA传输方式就是将CCR预装寄存器中的计数值传输到内存中。CCR寄存器中的计数值与上一次的计数值相减 x 计数频率的倒数 = 高电平或者低电平信号宽度。
输入捕获采样的频率就是定时器经过预分配器(PSC)之后的频率,譬如STM32F1 TIM1 CH1的计数器频率等于2.4MHz = 72MHz/(Prescaler + 1),那么计数器计数每增加4个就表示BMC(bit rate 600kbps)的一个bit。解码时,如果连续2次计数间隔之差都小于6,那么这2次计数间隔对应的4b5b bit是1,如果1次计数间隔之差大于6,说明这次4b5b bit是0。

https://github.com/alterapraxisptyltd/chromium-ec/blob/master/chip/stm32

MISO (DAT0): mi s əu
MOSI (CMD): m əu si

6 General Abbreviations
AIRC:Application Interrupt and Reset Register
ARR: Automatic Reload Register
BKP: BackUp
BSP:Board Support Package
CCER: Capture/Compare Enable Register,用来判断当前是下降沿捕获中断还是上升沿捕获中断,同时也能随时改变上升沿捕获还是下降沿捕获
CCR: Capture/Compare Register,表示当前中断发生时的CNT寄存器的值,也就是用来判断时间的;PWM输出时作为占空比寄存器,函数是TIM_SetCompare1(...)
CNT: Counter Register,用来计数的,每个定时器时钟周期自动+1,在需要的时间将其清零,便于计时
CmBacktrace:Cortex Microcontroller Backtrace,是一款针对ARM Cortex-M系列MCU的错误代码自动追踪、定位、错误原因自动分析的开源库
CubeMX:Microcontroller GUI
eCC-USB:eCos Centric USB
GHS:Green Hills Software,提供GHS hypervisor(类似于QNX hypervisor)、仪表专用RTOS、MCU开发IDE
IAR:后两个字母取之于创始人名字Anders Rundgren的首字母,瑞典语Ingenjörsfirman Anders Rundgren,意为Anders Rundgren工程公司
IAR icf:ILINK Configuration File
MDATA:More DATA,USB ep双缓冲(ep_kind配置使能)切换机制对应到DATA0和DATA1
MSP:MCU Specific Package
NVIC:Nested Vectors Interrupts Controller
NVIC IPR:Interrupt Priority Registers
OC:Output Compare(输出比较),用于输出PWM信号;寄存器CNT与CCR比较,大于输出1,小于输出0
PMA:Packet Buffer Memory Area
PSC:PreSCaler register,预分频寄存器
RCC:Reset and Clock Control
RCR:Repetition Counter Register,重复次数寄存器
SHPRx:System Handler Priority Registers
SR: Status Register,用来判断是不是输入捕获中断
ST AMG:Analog and MEMS Group,模拟和MEMS部门(现在改成了Analog, MEMS and Sensors Group)
STM32H7:High-perf Cortex-M7
STM32WB:WB表示集成了Wireless Bluetooth模块
STM32WL:WL表示集成了Wireless LoRa模块
PendSV:Pendable 服务是一个中断请求,如果没有其他中断需要响应时,系统将强制执行上下文切换
SVCall:SuperVisor Call由SVC指令触发,FreeRTOS用它来启动任务调度
USB BH reset:Bigger Hammer or Brad Hosler,表示warm reset;you may be confused why the USB 3.0 spec calls the same type of reset "warm reset" in some places and "BH reset" in other places. "BH" reset is supposed to stand for "Big Hammer" reset, but it also stands for "Brad Hosler". Brad died shortly after the USB 3.0 bus specification was started, and they decided to name the reset after him. The suggestion was made shortly before the spec was finalized, so the wording is a bit inconsistent.

相关文章:

STM32F072 CAN and USB

1 通用描述 1.1 STM8 MOSTek 6502 -> ST7 -> STM8 STM8型号单片机分为STM8A、STM8L、STM8S三个系列。 STM8A&#xff1a;汽车级应用 STM8L&#xff1a;超低功耗MCU STM8S&#xff1a;标准系列 1.2 STM32 - F1系列用的最多&#xff0c;最大工作频率72MHz - STM32固件库&am…...

卷积神经网络基础与补充

参考自 up主的b站链接&#xff1a;霹雳吧啦Wz的个人空间-霹雳吧啦Wz个人主页-哔哩哔哩视频这位大佬的博客 https://blog.csdn.net/m0_37867091?typeblog CNN的历史发展&#xff1a; 这一点老师上课的时候也有讲到&#xff0c;BP的出现对CNN的发展至关重要 卷积的特性&#x…...

File Inclusion(Pikachu)

File Inclusion(local) 这里随便点击一个提交 观察url&#xff0c;显示是一个文件file1.php 可以直接通过url修改这个文件 找到自己的文件&#xff08;本地文件&#xff09;shell.php的路径写上去 就可以看到 File Inclusion&#xff08;remote&#xff09; 提交的是一个目标…...

【Redis刨析】知识图谱的构建与实现

前言 「作者主页」&#xff1a;雪碧有白泡泡 「个人网站」&#xff1a;雪碧的个人网站 ChatGPT体验地址 文章目录 前言引用构建过程Redis的知识图谱构建过程Redis介绍快的原因持久化 引用 对于编程的学习&#xff0c;过了初级阶段&#xff0c;我认为应该减少对视频的依赖&am…...

html学习笔记 标题、段落、换行、列表、超链接、图片、表格

<h1></h1> <p></p> <br>换行&#xff0c;不带线 <hr>换行&#xff0c;带线列表 类似↓ 2 1 无序列表 <ul><li></li><li></li><li></li> </ul>有序列表 <oi><li></l…...

汽车项目管理

项目节点&#xff1a; MR (Management Review)——管理层评审 KO (Kick Off)——项目正式启动 SI (Strategy Intent)——战略意图 SC (Strategy Confirmation)——战略确认 PA (Program Approval)——项目批准 PR (Product Readiness)——产品就绪 VP (Verification Prototype)…...

Tg-5511cb: tcxo高稳定性+105℃高温

爱普生推的一款TG-5511CB是一种高稳定的TCXO温补晶体振荡器&#xff0c;频率范围十分广泛从 10mhz ~ 54mhz&#xff0c;它的电源电压只需要3.3V&#xff0c;无论是手机还是其他电子设备&#xff0c;都能轻松提供稳定的电力支持。频率/温度特性表现出色&#xff0c;0.28 10^6Ma…...

Linux 命令 ifconfig 全面解析!

ifconfig 是 network interfaces configuring 的缩写。 在 Linux 操作系统中&#xff0c;ifconfig 用于显示或配置网络设备的参数信息。 查看网卡信息 $ ifconfig # 显示激活状态&#xff08;up 状态&#xff09;的网卡信息 eth0 Link encap:Ethernet HWaddr 00:0c:29:75:8…...

00-Git 应用

Git 应用 一、Git概述 1.1 什么是Git git 是一个代码协同管理工具&#xff0c;也称之为代码版本控制工具&#xff0c;代码版本控制或管理的工具用的最多的&#xff1a; svn、 git。 SVN 是采用的 同步机制&#xff0c;即本地的代码版本和服务器的版本保持一致&#xff08;提…...

安全运维是做什么的,主要工作内容是什么

安全运维&#xff0c;简称SecOps&#xff0c;是一种集成安全措施和流程到信息技术运维的实践。它的目的是确保在日常运维活动中&#xff0c;如网络管理、系统维护、软件更新等&#xff0c;均考虑并融入安全策略。安全运维的核心是实现安全和运维团队的密切协作&#xff0c;以快…...

nodejs+vue+ElementUi大学新生入学系统的设计与实现1hme0

采用B/S模式架构系统&#xff0c;开发简单&#xff0c;只需要连接网络即可登录本系统&#xff0c;不需要安装任何客户端。开发工具采用VSCode&#xff0c;前端采用VueElementUI&#xff0c;后端采用Node.js&#xff0c;数据库采用MySQL。 涉及的技术栈 1&#xff09; 前台页面…...

Unity-序列化和反序列化

序列化是指把对象转换为字节序列的过程,而反序列化是指把字节序列恢复为对象的过程。序列化最主要的用途就是传递对象和保存对象。 在Unity中保存和加载、prefab、scene、Inspector窗口、实例化预制体等都使用了序列化与反序列化。 1 可序列化类型 1> 自定义的具有Serial…...

如何将语音版大模型AI接入自己的项目里(语音ChatGPT)

如何将语音版大模型AI接入自己的项目里语音ChatGPT 一、语音版大模型AI二、使用步骤1、接口2、请求参数3、请求参数示例4、接口 返回示例5、智能生成API代码 三、 如何获取appKey和uid1、申请appKey:2、获取appKey和uid 四、重要说明 一、语音版大模型AI 基于阿里通义千问、百…...

鸿蒙列表,item组件封装传参问题?@ObjectLink 和@Observerd

鸿蒙列表渲染&#xff0c;封装内容组件&#xff0c;进行item传参会报错&#xff1f; class FoodClass {order_id: number 0food_name: string ""food_price: number 0food_count: number 0 }Entry Component struct Demo07 {State message: string Hello World…...

信号与线性系统翻转课堂笔记12——时域取样定理

信号与线性系统翻转课堂笔记12 The Flipped Classroom12 of Signals and Linear Systems 对应教材&#xff1a;《信号与线性系统分析&#xff08;第五版&#xff09;》高等教育出版社&#xff0c;吴大正著 一、要点 &#xff08;1&#xff09;了解信号取样的概念&#xff1…...

爬虫工作量由小到大的思维转变---<Scrapy异常的存放小探讨>

前言: 异常很正常,调试异常/日志异常/错误异常~ 但在爬虫的时候,写完代码--->运行后根本挡不住一些运行异常;于是,把异常写到了中间件~ 当然,这也没有错; 不过,其实可以直接这么设计一下... 正文: 参照一下中间件处理的异常 def process_exception(self, request, exc…...

7.串口通信uart编写思路及自定义协议

前言&#xff1a; 串口是很重要的&#xff0c;有许多模块通信接口就是串口&#xff0c;例如gps模块&#xff0c;蓝牙模块&#xff0c;wifi模块还有一些精度比较高的陀螺仪模块等等&#xff0c;所以学会了串口之后&#xff0c;这些听起来很牛批的模块都能够用起来了。此外&#…...

【物联网】光影之谜:RGB-LED传感器引领科技变革之路

​​&#x1f308;个人主页&#xff1a;Sarapines Programmer&#x1f525; 系列专栏&#xff1a;《物联网实战 | 数字奇迹记》⏰翰墨致赠&#xff1a;狂风挟雷霆舞苍穹&#xff0c;剑气横扫万里空。英雄豪情铸不朽&#xff0c;激荡壮志燃热风。 ​ 目录 ⛳️1. 初识物联网 ⛳…...

promise的使用和实例方法

前言 异步,是任何编程都无法回避的话题。在promise出现之前,js中也有处理异步的方案,不过还没有专门的api能去处理链式的异步操作。所以,当大量的异步任务逐个执行,就变成了传说中的回调地狱。 function asyncFn(fn1, fn2, fn3) {setTimeout(() > {//处理第一个异步任务fn1…...

Visual Studio2022配置ReSharper C++ 常用设置

如需安装免费的可以在下面留言&#xff0c;看到即回复 文章目录 Visual Studio2022配置ReSharper C 常用设置配置Visual Studio2022&#xff0c;使其能够按回车进行补全配置ReSharper C 设置自动弹出配置ReSharper C 的快捷键ReSharper C 去掉注释拼写使用中文注释 如何关闭新版…...

椭圆曲线密码学(ECC)

一、ECC算法概述 椭圆曲线密码学&#xff08;Elliptic Curve Cryptography&#xff09;是基于椭圆曲线数学理论的公钥密码系统&#xff0c;由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA&#xff0c;ECC在相同安全强度下密钥更短&#xff08;256位ECC ≈ 3072位RSA…...

【力扣数据库知识手册笔记】索引

索引 索引的优缺点 优点1. 通过创建唯一性索引&#xff0c;可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度&#xff08;创建索引的主要原因&#xff09;。3. 可以加速表和表之间的连接&#xff0c;实现数据的参考完整性。4. 可以在查询过程中&#xff0c;…...

五年级数学知识边界总结思考-下册

目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解&#xff1a;由来、作用与意义**一、知识点核心内容****二、知识点的由来&#xff1a;从生活实践到数学抽象****三、知识的作用&#xff1a;解决实际问题的工具****四、学习的意义&#xff1a;培养核心素养…...

OkHttp 中实现断点续传 demo

在 OkHttp 中实现断点续传主要通过以下步骤完成&#xff0c;核心是利用 HTTP 协议的 Range 请求头指定下载范围&#xff1a; 实现原理 Range 请求头&#xff1a;向服务器请求文件的特定字节范围&#xff08;如 Range: bytes1024-&#xff09; 本地文件记录&#xff1a;保存已…...

Linux-07 ubuntu 的 chrome 启动不了

文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了&#xff0c;报错如下四、启动不了&#xff0c;解决如下 总结 问题原因 在应用中可以看到chrome&#xff0c;但是打不开(说明&#xff1a;原来的ubuntu系统出问题了&#xff0c;这个是备用的硬盘&a…...

C# SqlSugar:依赖注入与仓储模式实践

C# SqlSugar&#xff1a;依赖注入与仓储模式实践 在 C# 的应用开发中&#xff0c;数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护&#xff0c;许多开发者会选择成熟的 ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;SqlSugar 就是其中备受…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心

当仓库学会“思考”&#xff0c;物流的终极形态正在诞生 想象这样的场景&#xff1a; 凌晨3点&#xff0c;某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径&#xff1b;AI视觉系统在0.1秒内扫描包裹信息&#xff1b;数字孪生平台正模拟次日峰值流量压力…...

vue3+vite项目中使用.env文件环境变量方法

vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量&#xff0c;这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)

参考官方文档&#xff1a;https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java&#xff08;供 Kotlin 使用&#xff09; 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)

目录 一、&#x1f44b;&#x1f3fb;前言 二、&#x1f608;sinx波动的基本原理 三、&#x1f608;波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、&#x1f30a;波动优化…...