STM32F7xx —— CAN通信

 

                              STM32F7xx —— CAN通信

 

目录

STM32F7xx —— CAN通信

一、CAN基础

二、几个重要的CAN函数

三、几个重要的结构

四、接口设计


 

 

一、CAN基础

差分信号:显性电平对应逻辑0,CAN_H和CAN_L差为2.5V;隐形电平对应逻辑1,CAN_H和CAN_L差为0V。

CAN总线的开始和结束都有一个120Ω的终端电阻。

数据帧:标准帧11位,  扩展帧29位。

其他的一些理论知识就不再赘述了,可以参考维基百科对于CAN的描述。

STM32F7xx的bxCAN主要特点:支持CAN2.0A和CAN2.0B,波特率高达1Mbps,支持时间触发,具有3个发送邮箱,2个接收邮箱,可变的过滤器组等。

 

二、几个重要的CAN函数

HAL_StatusTypeDef HAL_CAN_Init(CAN_HandleTypeDef* hcan); // CAN初始化HAL_StatusTypeDef HAL_CAN_Transmit(CAN_HandleTypeDef *hcan, uint32_t Timeout); // CAN发送HAL_StatusTypeDef HAL_CAN_Receive(CAN_HandleTypeDef *hcan, uint8_t FIFONumber, uint32_t Timeout); // CAN接收

三、几个重要的结构

// CAN操作句柄 包含CAN基地址(CAN1/CAN2/CAN3) 初始化结构 发送接收结构体 其余三个是过程变量
typedef struct
{CAN_TypeDef                 *Instance;  /*!< Register base address          */CAN_InitTypeDef             Init;       /*!< CAN required parameters        */CanTxMsgTypeDef*            pTxMsg;     /*!< Pointer to transmit structure  */CanRxMsgTypeDef*            pRxMsg;     /*!< Pointer to reception structure */__IO HAL_CAN_StateTypeDef   State;      /*!< CAN communication state        */HAL_LockTypeDef             Lock;       /*!< CAN locking object             */__IO uint32_t               ErrorCode;  /*!< CAN Error code                 */}CAN_HandleTypeDef;
// CAN配置结构体 
// 前5个参数来设置 CAN_BTR —— 波特率
// 后6个参数用来设置 CAN_MCR —— 通信相关的控制位
typedef struct
{uint32_t Prescaler;  /*!< Specifies the length of a time quantum.This parameter must be a number between Min_Data = 1 and Max_Data = 1024 */uint32_t Mode;       /*!< Specifies the CAN operating mode.This parameter can be a value of @ref CAN_operating_mode */uint32_t SJW;        /*!< Specifies the maximum number of time quantathe CAN hardware is allowed to lengthen orshorten a bit to perform resynchronization.This parameter can be a value of @ref CAN_synchronisation_jump_width */uint32_t BS1;        /*!< Specifies the number of time quanta in Bit Segment 1.This parameter can be a value of @ref CAN_time_quantum_in_bit_segment_1 */uint32_t BS2;        /*!< Specifies the number of time quanta in Bit Segment 2.This parameter can be a value of @ref CAN_time_quantum_in_bit_segment_2 */uint32_t TTCM;       /*!< Enable or disable the time triggered communication mode.This parameter can be set to ENABLE or DISABLE. */uint32_t ABOM;       /*!< Enable or disable the automatic bus-off management.This parameter can be set to ENABLE or DISABLE */uint32_t AWUM;       /*!< Enable or disable the automatic wake-up mode.This parameter can be set to ENABLE or DISABLE */uint32_t NART;       /*!< Enable or disable the non-automatic retransmission mode.This parameter can be set to ENABLE or DISABLE */uint32_t RFLM;       /*!< Enable or disable the receive FIFO Locked mode.This parameter can be set to ENABLE or DISABLE */uint32_t TXFP;       /*!< Enable or disable the transmit FIFO priority.This parameter can be set to ENABLE or DISABLE */
}CAN_InitTypeDef;
// 过滤器设置
typedef struct
{uint32_t FilterIdHigh;          /*!< Specifies the filter identification number (MSBs for a 32-bitconfiguration, first one for a 16-bit configuration).This parameter must be a number between Min_Data = 0x0000 and Max_Data = 0xFFFF */uint32_t FilterIdLow;           /*!< Specifies the filter identification number (LSBs for a 32-bitconfiguration, second one for a 16-bit configuration).This parameter must be a number between Min_Data = 0x0000 and Max_Data = 0xFFFF */uint32_t FilterMaskIdHigh;      /*!< Specifies the filter mask number or identification number,according to the mode (MSBs for a 32-bit configuration,first one for a 16-bit configuration).This parameter must be a number between Min_Data = 0x0000 and Max_Data = 0xFFFF */uint32_t FilterMaskIdLow;       /*!< Specifies the filter mask number or identification number,according to the mode (LSBs for a 32-bit configuration,second one for a 16-bit configuration).This parameter must be a number between Min_Data = 0x0000 and Max_Data = 0xFFFF */uint32_t FilterFIFOAssignment;  /*!< Specifies the FIFO (0 or 1) which will be assigned to the filter.This parameter can be a value of @ref CAN_filter_FIFO */uint32_t FilterNumber;          /*!< Specifies the filter which will be initialized.This parameter must be a number between Min_Data = 0 and Max_Data = 27 */uint32_t FilterMode;            /*!< Specifies the filter mode to be initialized.This parameter can be a value of @ref CAN_filter_mode */uint32_t FilterScale;           /*!< Specifies the filter scale.This parameter can be a value of @ref CAN_filter_scale */uint32_t FilterActivation;      /*!< Enable or disable the filter.This parameter can be set to ENABLE or DISABLE. */uint32_t BankNumber;            /*!< Select the start slave bank filter.This parameter must be a number between Min_Data = 0 and Max_Data = 28 */}CAN_FilterConfTypeDef;
// 模式  我们使用普通模式
#define CAN_MODE_NORMAL             ((uint32_t)0x00000000U)                     /*!< Normal mode   */
#define CAN_MODE_LOOPBACK           ((uint32_t)CAN_BTR_LBKM)                   /*!< Loopback mode */
#define CAN_MODE_SILENT             ((uint32_t)CAN_BTR_SILM)                   /*!< Silent mode   */
#define CAN_MODE_SILENT_LOOPBACK    ((uint32_t)(CAN_BTR_LBKM | CAN_BTR_SILM))  /*!< Loopback combined with silent mode */
// 标准帧 扩展帧
#define CAN_ID_STD             ((uint32_t)0x00000000U)  /*!< Standard Id */
#define CAN_ID_EXT             ((uint32_t)0x00000004U)  /*!< Extended Id */
// 数据帧 远程帧
#define CAN_RTR_DATA                ((uint32_t)0x00000000U)  /*!< Data frame */
#define CAN_RTR_REMOTE              ((uint32_t)0x00000002U)  /*!< Remote frame */
// CAN中断使能
__HAL_CAN_ENABLE_IT(__HANDLE__, __INTERRUPT__) 
// 接收中断
#define CAN_IT_FMP0                 ((uint32_t)CAN_IER_FMPIE0)  /*!< FIFO 0 message pending interrupt */
#define CAN_IT_FF0                  ((uint32_t)CAN_IER_FFIE0)   /*!< FIFO 0 full interrupt            */
#define CAN_IT_FOV0                 ((uint32_t)CAN_IER_FOVIE0)  /*!< FIFO 0 overrun interrupt         */
#define CAN_IT_FMP1                 ((uint32_t)CAN_IER_FMPIE1)  /*!< FIFO 1 message pending interrupt */
#define CAN_IT_FF1                  ((uint32_t)CAN_IER_FFIE1)   /*!< FIFO 1 full interrupt            */
#define CAN_IT_FOV1                 ((uint32_t)CAN_IER_FOVIE1)  /*!< FIFO 1 overrun interrupt         */

四、接口设计

与串口类似,使用中断接收。先封装单路CAN需要的几个小接口,再顶一个列表,最后使用统一的接口扫描这个列表。

typedef enum
{CAN_CHANNEL_NONE,CAN_CHANNEL_1,CAN_CHANNEL_2,CAN_CHANNEL_NUM
} can_channel_t;#define CAN1_CHANNEL              CAN1
#define CAN1_PREEMPT_PRIO         CAN1_RX_PRIORITY
#define CAN1_RX_IRQ               CAN1_RX0_IRQn
#define CAN1_RX_IRQ_FUNC          CAN1_RX0_IRQHandler
#define CAN1_CLK_ENABLE()         __HAL_RCC_CAN1_CLK_ENABLE()
#define CAN1_TX_PORT              GPIOA
#define CAN1_TX_PIN               GPIO_PIN_12
#define CAN1_TX_AF                GPIO_AF9_CAN1
#define CAN1_TX_CONFIG()          GPIOConfigExt(CAN1_TX_PORT, CAN1_TX_PIN, GPIO_MODE_AF_PP, GPIO_PULLUP, CAN1_TX_AF)
#define CAN1_RX_PORT              GPIOA
#define CAN1_RX_PIN               GPIO_PIN_11
#define CAN1_RX_AF                GPIO_AF9_CAN1
#define CAN1_RX_CONFIG()          GPIOConfigExt(CAN1_RX_PORT, CAN1_RX_PIN, GPIO_MODE_AF_PP, GPIO_PULLUP, CAN1_RX_AF)#define CAN2_CHANNEL              CAN2
#define CAN2_PREEMPT_PRIO         CAN2_RX_PRIORITY
#define CAN2_RX_IRQ               CAN2_RX0_IRQn
#define CAN2_RX_IRQ_FUNC          CAN2_RX0_IRQHandler
#define CAN2_CLK_ENABLE()         __HAL_RCC_CAN2_CLK_ENABLE()
#define CAN2_TX_PORT              GPIOB
#define CAN2_TX_PIN               GPIO_PIN_6
#define CAN2_TX_AF                GPIO_AF9_CAN2
#define CAN2_TX_CONFIG()          GPIOConfigExt(CAN2_TX_PORT, CAN2_TX_PIN, GPIO_MODE_AF_PP, GPIO_PULLUP, CAN2_TX_AF)
#define CAN2_RX_PORT              GPIOB
#define CAN2_RX_PIN               GPIO_PIN_5
#define CAN2_RX_AF                GPIO_AF9_CAN2
#define CAN2_RX_CONFIG()          GPIOConfigExt(CAN2_RX_PORT, CAN2_RX_PIN, GPIO_MODE_AF_PP, GPIO_PULLUP, CAN2_RX_AF)
// 抽象出一个CAN设备结构体
typedef struct
{CAN_HandleTypeDef handle; // CAN操作句柄CanTxMsgTypeDef tx;       // CAN发送CanRxMsgTypeDef rx;       // CAN接收can_queue_t recv;         // 接收队列} can_dev_t;
// 将每路CAN封装成几个小函数
static can_dev_t can1_dev, can2_dev;static void can1_var_init(void)
{can1_dev.recv = can1_queue_recv;CanQueueInit(&can1_dev.recv);
}static void can1_gpio_init(void)
{CAN1_TX_CONFIG();CAN1_RX_CONFIG();
}// 波特率 = Fpclk1 / ((ts1+ts2+3) * brp)  Fpclk1 = 54M
static void can1_mode_init(void)
{CAN1_CLK_ENABLE();can1_dev.handle.Instance = CAN1_CHANNEL;can1_dev.handle.pTxMsg = &can1_dev.tx;can1_dev.handle.pRxMsg = &can1_dev.rx;can1_dev.handle.Init.Prescaler = 6;can1_dev.handle.Init.Mode = CAN_MODE_NORMAL;can1_dev.handle.Init.SJW = CAN_SJW_1TQ; // 重新同步跳跃宽度(Tsjw)为tsjw+1个时间单位 CAN_SJW_1TQ~CAN_SJW_4TQcan1_dev.handle.Init.BS1 = CAN_BS1_11TQ;// tbs1范围CAN_BS1_1TQ~CAN_BS1_16TQcan1_dev.handle.Init.BS2 = CAN_BS2_6TQ; // tbs2范围CAN_BS2_1TQ~CAN_BS2_8TQcan1_dev.handle.Init.TTCM = DISABLE;    // 非时间触发通信模式can1_dev.handle.Init.ABOM = ENABLE;     // 软件自动离线管理can1_dev.handle.Init.AWUM = DISABLE;    // 睡眠模式通过软件唤醒(清除CAN->MCR的SLEEP位)can1_dev.handle.Init.NART = ENABLE;     // 禁止报文自动传送can1_dev.handle.Init.RFLM = DISABLE;    // 报文不锁定,新的覆盖旧的can1_dev.handle.Init.TXFP = DISABLE;    // 优先级由报文标识符决定HAL_CAN_Init(&can1_dev.handle);
}static void can1_filter_init(void)
{CAN_FilterConfTypeDef  filter;filter.FilterNumber     = 0; // 过滤器0filter.FilterMode       = CAN_FILTERMODE_IDMASK;filter.FilterScale      = CAN_FILTERSCALE_32BIT;filter.FilterIdHigh     = 0;filter.FilterIdLow      = 0;filter.FilterMaskIdHigh = 0;filter.FilterMaskIdLow  = 0;filter.FilterFIFOAssignment = CAN_FILTER_FIFO0; // 过滤器0关联到FIFO0filter.FilterActivation = ENABLE; //激活滤波器0//filter.BankNumber=14;HAL_CAN_ConfigFilter(&can1_dev.handle, &filter);
}static void can1_nvic_init(void)
{__HAL_CAN_ENABLE_IT(&can1_dev.handle, CAN_IT_FMP0); //FIFO0消息挂号中断允许.HAL_NVIC_SetPriority(CAN1_RX_IRQ, CAN1_RX_PRIORITY, 0);HAL_NVIC_EnableIRQ(CAN1_RX_IRQ);
}static void can2_var_init(void)
{can2_dev.recv = can2_queue_recv;CanQueueInit(&can2_dev.recv);
}static void can2_gpio_init(void)
{CAN2_TX_CONFIG();CAN2_RX_CONFIG();
}// 波特率 = Fpclk1 / ((ts1+ts2+3) * brp)  Fpclk1 = 54M
static void can2_mode_init(void)
{CAN2_CLK_ENABLE();can2_dev.handle.Instance = CAN2_CHANNEL;can2_dev.handle.Init.Prescaler = 6;can2_dev.handle.Init.Mode = CAN_MODE_LOOPBACK;can2_dev.handle.Init.SJW = CAN_SJW_1TQ; // 重新同步跳跃宽度(Tsjw)为tsjw+1个时间单位 CAN_SJW_1TQ~CAN_SJW_4TQcan2_dev.handle.Init.BS1 = CAN_BS1_11TQ;// tbs1范围CAN_BS1_1TQ~CAN_BS1_16TQcan2_dev.handle.Init.BS2 = CAN_BS2_6TQ; // tbs2范围CAN_BS2_1TQ~CAN_BS2_8TQcan2_dev.handle.Init.TTCM = DISABLE;    // 非时间触发通信模式can2_dev.handle.Init.ABOM = ENABLE;     // 软件自动离线管理can2_dev.handle.Init.AWUM = DISABLE;    // 睡眠模式通过软件唤醒(清除CAN->MCR的SLEEP位)can2_dev.handle.Init.NART = ENABLE;     // 禁止报文自动传送can2_dev.handle.Init.RFLM = DISABLE;    // 报文不锁定,新的覆盖旧的can2_dev.handle.Init.TXFP = DISABLE;    // 优先级由报文标识符决定HAL_CAN_Init(&can2_dev.handle);
}static void can2_filter_init(void)
{CAN_FilterConfTypeDef  CAN_FilterInitStructure;CAN_FilterInitStructure.FilterNumber     = 14;CAN_FilterInitStructure.FilterMode       = CAN_FILTERMODE_IDMASK;CAN_FilterInitStructure.FilterScale      = CAN_FILTERSCALE_32BIT;CAN_FilterInitStructure.FilterIdHigh     = 0;CAN_FilterInitStructure.FilterIdLow      = 0;CAN_FilterInitStructure.FilterMaskIdHigh = 0;CAN_FilterInitStructure.FilterMaskIdLow  = 0;CAN_FilterInitStructure.FilterFIFOAssignment = CAN_FILTER_FIFO0; // 过滤器0关联到FIFO0CAN_FilterInitStructure.FilterActivation = ENABLE; //激活滤波器0//CAN_FilterInitStructure.BankNumber=14;HAL_CAN_ConfigFilter(&can2_dev.handle, &CAN_FilterInitStructure);
}static void can2_nvic_init(void)
{__HAL_CAN_ENABLE_IT(&can2_dev.handle, CAN_IT_FMP0); //FIFO0消息挂号中断允许1HAL_NVIC_SetPriority(CAN2_RX_IRQ, CAN2_RX_PRIORITY, 0);HAL_NVIC_EnableIRQ(CAN2_RX_IRQ);
}
// 每路CAN都有的几个操作,使用列表包含,然后统一扫描处理
typedef struct
{uint8_t channel;can_dev_t *dev;void (* var_init_cb)(void);void (* gpio_init_cb)(void);void (* mode_init_cb)(void);void (* filter_init_cb)(void);void (* nvic_init_cb)(void);
} can_config_t;static const can_config_t can_configs[] =
{{CAN_CHANNEL_1, &can1_dev, can1_var_init, can1_gpio_init, can1_mode_init, can1_filter_init, can1_nvic_init},{CAN_CHANNEL_2, &can2_dev, can2_var_init, can2_gpio_init, can2_mode_init, can2_filter_init, can2_nvic_init},
};static can_dev_t *can_dev_get(uint8_t channel)
{uint8_t i;for(i = 0; i < ARRAY_SIZE(can_configs); ++i){if(channel == can_configs[i].channel){return can_configs[i].dev;}}return 0;
}static void can_var_init(uint8_t channel)
{uint8_t i;for(i = 0; i < ARRAY_SIZE(can_configs); ++i){if(channel == can_configs[i].channel){can_configs[i].var_init_cb();return;}}
}static void can_gpio_init(uint8_t channel)
{uint8_t i;for(i = 0; i < ARRAY_SIZE(can_configs); ++i){if(channel == can_configs[i].channel){can_configs[i].gpio_init_cb();return;}}
}static void can_mode_init(uint8_t channel)
{uint8_t i;for(i = 0; i < ARRAY_SIZE(can_configs); ++i){if(channel == can_configs[i].channel){can_configs[i].mode_init_cb();return;}}
}static void can_filter_init(uint8_t channel)
{uint8_t i;for(i = 0; i < ARRAY_SIZE(can_configs); ++i){if(channel == can_configs[i].channel){can_configs[i].filter_init_cb();return;}}
}static void can_nvic_init(uint8_t channel)
{uint8_t i;for(i = 0; i < ARRAY_SIZE(can_configs); ++i){if(channel == can_configs[i].channel){can_configs[i].nvic_init_cb();return;}}
}
// 对外的接口 初始化 发送和接收
void CanInit(uint8_t channel)
{can_var_init(channel);can_gpio_init(channel);can_mode_init(channel);can_filter_init(channel);can_nvic_init(channel);
}void CanSend(uint8_t channel, can_frame_t *frame)
{can_dev_t *dev = can_dev_get(channel);if(dev == 0){return;}dev->handle.pTxMsg->StdId = frame->StdId;dev->handle.pTxMsg->IDE   = frame->IDE;dev->handle.pTxMsg->RTR   = frame->RTR;dev->handle.pTxMsg->DLC   = frame->DLC;memcpy(dev->handle.pTxMsg->Data, frame->Data, frame->DLC);HAL_CAN_Transmit(&dev->handle, 10);
}uint8_t CanRecv(uint8_t channel, can_frame_t *frame)
{can_dev_t *dev = can_dev_get(channel);if(dev == 0){return 0;}return CanQueueRead(&can1_dev.recv, frame);
}
// CAN中断
void CAN1_RX_IRQ_FUNC(void)
{HAL_CAN_IRQHandler(&can1_dev.handle);
}void CAN2_RX_IRQ_FUNC(void)
{HAL_CAN_IRQHandler(&can2_dev.handle);
}void HAL_CAN_RxCpltCallback(CAN_HandleTypeDef *hcan)
{if(hcan == (&can1_dev.handle)){//CAN_Receive_IT()函数会关闭FIFO0消息挂号中断,因此我们需要重新打开__HAL_CAN_ENABLE_IT(&can1_dev.handle, CAN_IT_FMP0);//重新开启FIF00消息挂号中断CanQueueWrite(&can1_dev.recv, can1_dev.handle.pRxMsg);}else if(hcan == (&can2_dev.handle)){//CAN_Receive_IT()函数会关闭FIFO0消息挂号中断,因此我们需要重新打开__HAL_CAN_ENABLE_IT(&can2_dev.handle, CAN_IT_FMP0);//重新开启FIF00消息挂号中断CanQueueWrite(&can2_dev.recv, can2_dev.handle.pRxMsg);}
}

        之所以使用列表的形式,是为了方便增加和删除CAN通道和使对外的接口更统一,不会出现CAN1Init() CAN2Init(),个人习惯问题。

CAN队列可参考:CAN队列

 

 

 

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

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

相关文章

[leetcode] 14. 最长公共前缀

14. 最长公共前缀 超级简单。。。 class Solution { public:string longestCommonPrefix(vector<string> &strs) {if (strs.size() 0) {return "";}string common strs[0];for (int i 1; i < strs.size(); i) {common findCommon(strs[i], common);…

Cmake确实应该用到的时候再学

最近在做项目用到Cmake相关的知识&#xff0c;之前做的是BSP驱动开发&#xff0c;基本用不到Cmake&#xff0c;唯一和Cmake有交集的应该是我们移植网关项目&#xff0c;不过也只是修修改改&#xff0c;直到最近用到Cmake开发项目&#xff0c;才真正是接触了这个东西。前天加载一…

手机吞吃蛇游戏的设计与开发

为什么80%的码农都做不了架构师&#xff1f;>>> J2ME(Java 2 Micro Edition) 是近年来随着各种不同设备&#xff0c;尤其是移动通信设备的飞速发展而诞生的一项新的开发技术。它定位在消费性电子产品的应用上&#xff0c;对设备的智能化、www.21cnlunwen.com Write…

STM32F7xx —— 内部flash

STM32F7xx —— 内部flash 这个就没什么好说的了&#xff0c;直接上代码了&#xff0c;主要封装了三个函数&#xff0c;擦除&#xff0c;写flash&#xff0c;读flash。 // STM32F767IGT6: 1M flash // STM32F767ZIT6: 2M flash #define ADDR_FLASH_SECTOR_0 ((uint32_t)0x…

深入理解 Vue Computed 计算属性

Computed 计算属性是 Vue 中常用的一个功能&#xff0c;我们今天来说一下他的执行过长 拿官网简单的例子来看一下&#xff1a; <div id"example"><p>Original message: "{{ message }}"</p><p>Computed reversed message: "{…

vscode 使用 ssh 登录

// 执行 // 使用你自己的服务器IP与登录账户 export USER_AT_HOST"服务器账户名服务器IP" // PUBKEYPATH是你公钥的路径 export PUBKEYPATH"$HOME/.ssh/id_rsa.pub"ssh-copy-id -i "$PUBKEYPATH" "$USER_AT_HOST"

SNMP4J的一点缺陷

最近在使用SNMP4J的过程中发现一个缺陷&#xff0c;不知道应不应该算是个bug&#xff0c;但我想终究算是一个不完善的地方。 问题描述如下&#xff1a; 在通过SNMP4J去获取某些交换机上的MAC地址转发表(dot1dTpFdbTable, OID为1.3.6.1.2.1.17.4.3&#xff09;时&#xff0c;发现…

3-3 数数字

算法入门经典 P57 把前n&#xff08;n<100000&#xff09;个整数顺序写在一起&#xff0c;123456789...数一数0-9各出现多少次。 #include<stdio.h>#include<string.h>#include "stdafx.h"#include "iostream" #include <string&…

如何用示波器测量串口波特率

这是前段时间遇到的问题&#xff0c;刚好这里找到了答案&#xff0c;记录下分享给大家。如何确定时基假如要测量的波特率为9600, 则每一比特位的时间为&#xff1a;1/9600 ≈ 104 μs&#xff0c;一般示波器横向上每个大格子里5个小格子&#xff0c;要想看清一比特位一般需要一…

STM32F7xx —— ADC

STM32F7xx —— ADC 基础知识参考&#xff1a;ADC /***************************************************************************** * ADC1 ADC2 ADC3 * 通道0 PA0 PA0 PA0 * 通道1 PA1 PA1 PA1 * 通道2 PA2 PA2 …

一键了结CUP100%问题

1、dllhost进程造成CPU使用率占用100%<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />服务器正常CPU消耗应该在75%以下&#xff0c;而且CPU消耗应该是上下起伏的&#xff0c;出现这种问题的服务器&#xff0c;CPU会突然一直处10…

Linux内核工程师是怎么步入内核殿堂的?

上图是公众号冠名参加的篮球赛对我来说&#xff0c;要搞好Linux内核&#xff0c;首先要做的就是买一块Linux开发板&#xff0c;然后就使劲捣鼓。下面是一位大神对于入门Linux内核的看法。以下的「我」不是公众号作者作者&#xff1a;Coly Lihttps://www.zhihu.com/question/304…

Newtonsoft.Json 获取匿名类数据

很简单。 1 using System;2 using System.Collections.Generic;3 4 namespace Test5 {6 class Program7 {8 9 static string Message "{\"Result\":0,\"ErrMsg\":\"执行失败。索引超出范围。必须为非负值并小于集合大小。\r\n参…

STM32F7xx —— Timer

STM32F7xx —— Timer 目录 STM32F7xx —— Timer 一、基础定时器配置 二、带回调定时器 作用&#xff1a;输出PWM&#xff0c;测量脉冲长度&#xff0c;定时等。 一、基础定时器配置 // 基本定时器 #define TIMER_CHANNEL TIM3 #define TIMER_PREEMPT_PRIO…

jquery-autocomplete学习(转)

jquery-autocomplete学习 一、用前必备官方网站&#xff1a;http://bassistance.de/jquery-plugins/jquery-plugin-autocomplete/当前版本&#xff1a;1.0.2需要JQuery版本&#xff1a;1.2.6 二、使用<script src"./jquery-1.3.2.js" type"text/javascript&q…

时间同步绝对是一个大问题

上图是加班看到的夜景假设A电脑时间和B电脑时间不同&#xff0c;当他们两个电脑的用户在使用电脑的时候就会存在问题&#xff0c;比如A电脑的用户说&#xff0c;我们下午5&#xff1a;00 去打球&#xff0c;然后A电脑到了5&#xff1a;00就去打球了&#xff0c;但是可能这个时候…

Window10彻底卸载应用商店

Window10如何彻底卸载应用商店&#xff1f;Window10应用商店就是一个应用下载平台&#xff0c;我们可以在应用商店中下载各种应用&#xff0c;但是很多用户并不喜欢在Window10应用商店中下载应用&#xff0c;觉得应用商店浪费内存&#xff0c;因此想将应用商店卸载掉&#xff0…

STM32F7xx —— QSPI

STM32F7xx —— QSPI 目录 STM32F7xx —— QSPI 一、QSPI 二、几个重要的函数 三、几个重要的结构 四、QSPI接口设计&#xff08;仅供参考&#xff09; 五、QSPI驱动W25Q256 一、QSPI SPI 是 Queued SPI 的简写&#xff0c;是 Motorola公司推出的 SPI 接口的扩展&#xf…

嵌入式、物联网常见通信协议

本文介绍一些常见的嵌入式、物联网通信协议&#xff0c;它们具有不同的性能、通信速率、覆盖范围、功率和内存&#xff0c;而且每一种协议都有各自的优点和或多或少的缺点。其中一些通信协议只适合小型家用电器&#xff0c;而其他一些通信协议则可以用于大型智慧城市项目。物联…

解决T400死机的问题!

终于解决这几天突然出现的t400 vista假死问题! 原来罪魁祸首是 ThinkPad -- Intel Matrix Storage Manager驱动程序(Windows XP/vista 32bit) 此更新在su自动更新里也有 千万别更新 如果不小心更新并出现偶尔假死(现象&#xff1a;鼠标能动&#xff0c;但是不能打开程序所有应用…