STM32-笔记20-测量按键按下时间

1、按键按下的时间-思路

        我们先检测下降沿信号,检测到以后,在回调函数里切换成检测上升沿信号,当两个信号都检测到的时候,这段时间就是按键按下的时间,如图所示:=>N*(ARR+1)+CCRx的值

N是在这段时间内,可能会发生的N次溢出。CCRx是寄存器中的计数,ARR打满65536-1

N个重装载值+CCRx的值

 2、实验目的

  • 使 用 定 时 器 2 通 道 2 来 捕 获 按 键 2 按 下 时 间 , 并 通 过 串 口 打 印 。
  • 计 一 个 数 的 时 间:1 u s , P S C = 7 1 , A R R = 6 5 5 3 5
  • 下 降 沿 捕 获 、 输 入 通 道 2 映 射 在 TI2 上 、 不 分 频 、 不 滤 波

为什么要使用定时器2通道2来捕获按键2?

这个板子只有两个按键。一个是key1,一个是key2,分别对应A0和A1引脚

原理图

产品手册(17页)

在这里可以看到,KEY1是接的定时器2通道1的ETR引脚,通过下图我们可以看出来,ETR引脚是作为一个输入源的,而我们这里是想要一个通道,所以这里使用KEY2

中文参考手册(254页)

1s = 1000 000us

P S C = 7 1 

PSC+1=72

72/72MHZ

1个时间周期 = 1/1000 000 = 1us

这里使用1us来表示记一个数的时,也可以更小,A R R = 6 5 5 3 5,直接把ARR拉满

上面是对时基单元配置

下面是对通道的配置

下 降 沿 捕 获 、 输 入 通 道 2 映 射 在 TI2 上 、 不 分 频 、 不 滤 波

滤波器先不要,对边沿检测时,先对下降沿检测,然后迅速在回调函数中对上升沿进行检测。

分频器不分频

3、实现输入捕获功能

复制项目文件19,重命名为20-实现捕获功能

打开项目文件

创建文件夹ic

加载文件

编译

编译

编译

代码如下:

main.c

#include "sys.h"
#include "delay.h"
#include "led.h"
#include "uart1.h"
#include "ic.h"

int main(void)
{
    HAL_Init();                         /* 初始化HAL库 */
    stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */
    led_init();//初始化led灯
    uart1_init(115200);
    //printf("hello word!\r\n");
    ic_init(72-1,65536-1);

    while(1)
    { 

    }
}

ic.c

#include "ic.h"
#include "stdio.h"

TIM_HandleTypeDef ic_handle = {0};

//初始化输入捕获函数
void ic_init(uint16_t psc,uint16_t arr)
{
    TIM_IC_InitTypeDef ic_config = {0};
    ic_handle.Instance = TIM2;//定时器2
    ic_handle.Init.Prescaler = psc;
    ic_handle.Init.Period = arr;
    ic_handle.Init.CounterMode = TIM_COUNTERMODE_UP;//向上计数模式
    HAL_TIM_IC_Init(&ic_handle);
    
    ic_config.ICFilter = 0;//过滤器0,也就是不要过滤器
    ic_config.ICPolarity = TIM_ICPOLARITY_FALLING;//下降沿捕获
    ic_config.ICPrescaler = TIM_ICPSC_DIV1;//每次在捕获输入上检测到边缘时执行捕获
    ic_config.ICSelection = TIM_ICSELECTION_DIRECTTI;//输入捕获触发信号源直接连接到对应通道的输入捕获引脚,这意味着输入捕获触发信号直接作用于定时器的输入捕获电路,不需要通过其他中间寄存器或外部电
    HAL_TIM_IC_ConfigChannel(&ic_handle,&ic_config,TIM_CHANNEL_2);
    
    __HAL_TIM_ENABLE_IT(&ic_handle,TIM_IT_UPDATE);//更新中断
    HAL_TIM_IC_Start_IT(&ic_handle,TIM_CHANNEL_2);
    
}

//初始化MSP函数
void HAL_TIM_IC_MspInit(TIM_HandleTypeDef *htim)
{
    if(htim->Instance == TIM2)
    {
        GPIO_InitTypeDef gpio_initstruct;
        
        __HAL_RCC_TIM2_CLK_ENABLE();
        __HAL_RCC_GPIOA_CLK_ENABLE();
        
        gpio_initstruct.Mode = GPIO_MODE_INPUT;//复式推挽输出
        gpio_initstruct.Pin = GPIO_PIN_1;//引脚1
        gpio_initstruct.Pull = GPIO_PULLUP;//上拉输出
        gpio_initstruct.Speed = GPIO_SPEED_FREQ_HIGH;//高速
        
        HAL_GPIO_Init(GPIOA,&gpio_initstruct);
        
        HAL_NVIC_SetPriority(TIM2_IRQn,2,2);//外部中断号,抢占优先级/响应优先级
        HAL_NVIC_EnableIRQ(TIM2_IRQn);
    }
    
}

//中断服务函数
void TIM2_IRQHandler(void)
{
    HAL_TIM_IRQHandler(&ic_handle);
}

//回调函数
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
    printf("捕获一个下降沿\r\n");
}

ic.h

#ifndef __IC_H__
#define __IC_H__
#include "sys.h"

void ic_init(uint16_t psc,uint16_t arr);

#endif

 在ic.c函数中

ic_config.ICSelection = TIM_ICSELECTION_DIRECTTI;//输入捕获触发信号源直接连接到对应通道的输入捕获引脚,这意味着输入捕获触发信号直接作用于定时器的输入捕获电路,不需要通过其他中间寄存器或外部电

如果

ic_config.ICSelection =TIM_ICSELECTION_INDIRECTTI;//配置输入捕获通道的输入信号选择为间接定时器输入模式。

TIM Input 1 被选择连接到 IC2。

TIM Input 2 被选择连接到 IC1。

TIM Input 3 被选择连接到 IC4。

TIM Input 4 被选择连接到 IC3。

如果这里的ic_config.ICSelection设置成下面这个参数

ic_config.ICSelection =TIM_ICSELECTION_INDIRECTTI;

则摁KEY1才会响应按键

这是因为定时器2则连接到通道1中

在串口助手中摁KEY2会显示

4、实现一次完整的按键动作

复制项目文件20-实现捕获功能,重命名21-捕获一次完整的按键动作

在上面实现了捕获下降沿,在这里将会实现捕获上升沿,整合就会实现一次完整的按键动作。

具体流程如下:

succeed_flag:是否发生了一次完整的按键动作标志位

falling_flag:下降沿标志,当falling_flag = 0时(默认情况下),代表下降沿捕获成功;

当falling_flag = 1时(默认情况下),代表上升沿捕获成功;

这里用到两个函数

TIM_RESET_CAPTUREPOLARITY(&ic_handle, TIM_CHANNEL_2);//这行代码的作用是重置定时器捕获通道2的触发极性。
TIM_SET_CAPTUREPOLARITY(&ic_handle, TIM_CHANNEL_2, TIM_ICPOLARITY_RISING);//这行代码的意思是:为ic_handle所指向的定时器的第二个通道配置输入捕获极性为上升沿(即输入信号从低电平变为高电平时)。

在STM32的HAL库中,TIM_RESET_CAPTUREPOLARITY函数用于重置定时器的捕获通道的触发极性。具体来说,这个函数会将指定通道的触发极性设置为默认值,通常是上升沿或下降沿。

IM_SET_CAPTUREPOLARITY(&ic_handle, TIM_CHANNEL_2, TIM_ICPOLARITY_RISING); 这行代码是在使用STM32 HAL库(硬件抽象层库)进行定时器(TIM)的输入捕获配置时使用的。

代码流程:定义一个结构体,用于存放标志位和统计时间,在回调函数中,当用户按下按键,最初赋值是下降沿检测,检测到下降沿触发中断,响应回调函数,在回调函数中,初始的相应完整按键的标志位为0,执行if,初始响应上升沿标志位为0,执行else,在else中,将响应上升沿标志位 置1,并且将检测下降沿重置为检测上升沿,则在下次进入回调函数时,由于检测完整按键的标志位依旧为0,进入if,检测上升沿标志位为1,进入if,执行上升沿函数代码段。

代码如下:

ic.c

#include "ic.h"
#include "stdio.h"
#include "string.h"

struct
{
    uint8_t succeed_flag;//完整的按键动作标志位
    uint8_t rising_flag;//上升标志位
    uint8_t falling_flag;//下降标志位
    uint16_t timeout_cnt;//时间统计
    
}capture_status={0};//全部初始化为0

TIM_HandleTypeDef ic_handle = {0};

//初始化输入捕获函数
void ic_init(uint16_t psc,uint16_t arr)
{
    TIM_IC_InitTypeDef ic_config = {0};
    ic_handle.Instance = TIM2;//定时器2
    ic_handle.Init.Prescaler = psc;
    ic_handle.Init.Period = arr;
    ic_handle.Init.CounterMode = TIM_COUNTERMODE_UP;//向上计数模式
    HAL_TIM_IC_Init(&ic_handle);
    
    ic_config.ICFilter = 0;//过滤器0,也就是不要过滤器
    ic_config.ICPolarity = TIM_ICPOLARITY_FALLING;//下降沿捕获
    ic_config.ICPrescaler = TIM_ICPSC_DIV1;//每次在捕获输入上检测到边缘时执行捕获
    ic_config.ICSelection = TIM_ICSELECTION_DIRECTTI;//输入捕获触发信号源直接连接到对应通道的输入捕获引脚,这意味着输入捕获触发信号直接作用于定时器的输入捕获电路,不需要通过其他中间寄存器或外部电
    HAL_TIM_IC_ConfigChannel(&ic_handle,&ic_config,TIM_CHANNEL_2);
    
    __HAL_TIM_ENABLE_IT(&ic_handle,TIM_IT_UPDATE);//更新中断
    HAL_TIM_IC_Start_IT(&ic_handle,TIM_CHANNEL_2);
    
}

//初始化MSP函数
void HAL_TIM_IC_MspInit(TIM_HandleTypeDef *htim)
{
    if(htim->Instance == TIM2)
    {
        GPIO_InitTypeDef gpio_initstruct;
        
        __HAL_RCC_TIM2_CLK_ENABLE();
        __HAL_RCC_GPIOA_CLK_ENABLE();
        
        gpio_initstruct.Mode = GPIO_MODE_INPUT;//复式推挽输出
        gpio_initstruct.Pin = GPIO_PIN_1;//引脚1
        gpio_initstruct.Pull = GPIO_PULLUP;//上拉输出
        gpio_initstruct.Speed = GPIO_SPEED_FREQ_HIGH;//高速
        
        HAL_GPIO_Init(GPIOA,&gpio_initstruct);
        
        HAL_NVIC_SetPriority(TIM2_IRQn,2,2);//外部中断号,抢占优先级/响应优先级
        HAL_NVIC_EnableIRQ(TIM2_IRQn);
    }
    
}

//中断服务函数
void TIM2_IRQHandler(void)
{
    HAL_TIM_IRQHandler(&ic_handle);
}

//回调函数
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
    if(htim->Instance == TIM2)
    {
        if(capture_status.succeed_flag == 0)//完整按键捕获标志位,等于0代表不完整
        {
            if(capture_status.rising_flag == 1)//上升沿按键捕获标志,等于1代表捕获到上升沿
            {
                printf("捕获一个上升沿\r\n");
                memset(&capture_status,0,sizeof(capture_status));//对一整个结构体的清零
                TIM_RESET_CAPTUREPOLARITY(&ic_handle,TIM_CHANNEL_2);//重置捕获通道2
                TIM_SET_CAPTUREPOLARITY(&ic_handle,TIM_CHANNEL_2,TIM_INPUTCHANNELPOLARITY_FALLING);//配置捕获为下升沿
            
            }
            else
            {
                //未捕获到上升沿,现在是下降沿
                printf("捕获一个下降沿\r\n");
                memset(&capture_status,0,sizeof(capture_status));//对一整个结构体的清零
                capture_status.rising_flag = 1;//置位1,表示接下来的边沿检测是上升沿的
                TIM_RESET_CAPTUREPOLARITY(&ic_handle,TIM_CHANNEL_2);//重置捕获通道2
                TIM_SET_CAPTUREPOLARITY(&ic_handle,TIM_CHANNEL_2,TIM_INPUTCHANNELPOLARITY_RISING);//配置捕获为上升沿
            }
        }
    }
}

打开串口助手

按下按键2,串口显示

5、测量按键按下时间

回顾:如何测量按键按下的时间计算?

在按键按下的瞬间,检测到下降沿时,立刻把计时器关闭,将计数器置0,再打开(重启一下),使其从头开始计数,在未检测到上升沿之前,计数器中间可能会发生几次溢出,当检测到上升沿时,关闭计数器,查询当前计数器寄存器中的值。

复制项目文件21-捕获一次完整的按键动作,重命名为22-测量按键按下时间

__HAL_TIM_DISABLE(&ic_handle); 这行代码是在使用STM32 HAL库时,用于禁用(或停止)一个定时器的功能

__HAL_TIM_SET_COUNTER(&ic_handle, 0); 这行代码在使用STM32 HAL库时,用于设置定时器的计数器值。

__HAL_TIM_ENABLE(&ic_handle);//用于打开计数器

HAL_TIM_ReadCapturedValue(&ic_handle, TIM_CHANNEL_2); 这行代码在使用STM32 HAL库时,用于读取定时器指定通道的捕获值。

代码如下:

main.c

#include "sys.h"
#include "delay.h"
#include "led.h"
#include "uart1.h"
#include "ic.h"

int main(void)
{
    HAL_Init();                         /* 初始化HAL库 */
    stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */
    led_init();//初始化led灯
    uart1_init(115200);
    //printf("hello word!\r\n");
    ic_init(72-1,65536-1);

    while(1)
    { 
        pressed_time_get();
        delay_ms(500);
    }
}

ic.c

#include "ic.h"
#include "stdio.h"
#include "string.h"

struct
{
    uint8_t succeed_flag;//完整的按键动作标志位
    uint8_t rising_flag;//上升标志位
    uint8_t falling_flag;//下降标志位
    uint16_t timeout_cnt;//时间统计
    
}capture_status={0};//全部初始化为0
uint16_t last_cnt = 0;

TIM_HandleTypeDef ic_handle = {0};

//初始化输入捕获函数
void ic_init(uint16_t psc,uint16_t arr)
{
    TIM_IC_InitTypeDef ic_config = {0};
    ic_handle.Instance = TIM2;//定时器2
    ic_handle.Init.Prescaler = psc;
    ic_handle.Init.Period = arr;
    ic_handle.Init.CounterMode = TIM_COUNTERMODE_UP;//向上计数模式
    HAL_TIM_IC_Init(&ic_handle);
    
    ic_config.ICFilter = 0;//过滤器0,也就是不要过滤器
    ic_config.ICPolarity = TIM_ICPOLARITY_FALLING;//下降沿捕获
    ic_config.ICPrescaler = TIM_ICPSC_DIV1;//每次在捕获输入上检测到边缘时执行捕获
    ic_config.ICSelection = TIM_ICSELECTION_DIRECTTI;//输入捕获触发信号源直接连接到对应通道的输入捕获引脚,这意味着输入捕获触发信号直接作用于定时器的输入捕获电路,不需要通过其他中间寄存器或外部电
    HAL_TIM_IC_ConfigChannel(&ic_handle,&ic_config,TIM_CHANNEL_2);
    
    __HAL_TIM_ENABLE_IT(&ic_handle,TIM_IT_UPDATE);//更新中断
    HAL_TIM_IC_Start_IT(&ic_handle,TIM_CHANNEL_2);
    
}

//初始化MSP函数
void HAL_TIM_IC_MspInit(TIM_HandleTypeDef *htim)
{
    if(htim->Instance == TIM2)
    {
        GPIO_InitTypeDef gpio_initstruct;
        
        __HAL_RCC_TIM2_CLK_ENABLE();
        __HAL_RCC_GPIOA_CLK_ENABLE();
        
        gpio_initstruct.Mode = GPIO_MODE_INPUT;//复式推挽输出
        gpio_initstruct.Pin = GPIO_PIN_1;//引脚1
        gpio_initstruct.Pull = GPIO_PULLUP;//上拉输出
        gpio_initstruct.Speed = GPIO_SPEED_FREQ_HIGH;//高速
        
        HAL_GPIO_Init(GPIOA,&gpio_initstruct);
        
        HAL_NVIC_SetPriority(TIM2_IRQn,2,2);//外部中断号,抢占优先级/响应优先级
        HAL_NVIC_EnableIRQ(TIM2_IRQn);
    }
    
}

//中断服务函数
void TIM2_IRQHandler(void)
{
    HAL_TIM_IRQHandler(&ic_handle);
}

//回调函数
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
    if(htim->Instance == TIM2)
    {
        if(capture_status.succeed_flag == 0)//完整按键捕获标志位,等于0代表不完整
        {
            if(capture_status.rising_flag == 1)//上升沿按键捕获标志,等于1代表捕获到上升沿
            {
                printf("捕获一个上升沿\r\n");
                capture_status.succeed_flag = 1;//检测到一个完整的按键动作
                
                TIM_RESET_CAPTUREPOLARITY(&ic_handle,TIM_CHANNEL_2);//重置捕获通道2
                TIM_SET_CAPTUREPOLARITY(&ic_handle,TIM_CHANNEL_2,TIM_INPUTCHANNELPOLARITY_FALLING);//配置捕获为下升沿
                last_cnt = HAL_TIM_ReadCapturedValue(&ic_handle, TIM_CHANNEL_2);//用于读取定时器指定通道的捕获值。
            }
            else
            {
                //未捕获到上升沿,现在是下降沿
                printf("捕获一个下降沿\r\n");
                memset(&capture_status,0,sizeof(capture_status));//对一整个结构体的清零
                capture_status.rising_flag = 1;//置位1,表示接下来的边沿检测是上升沿的
                __HAL_TIM_DISABLE(&ic_handle); //用于禁用(或停止)一个定时器的功能
                __HAL_TIM_SET_COUNTER(&ic_handle, 0);//用于设置定时器的计数器值。
                TIM_RESET_CAPTUREPOLARITY(&ic_handle,TIM_CHANNEL_2);//重置捕获通道2
                TIM_SET_CAPTUREPOLARITY(&ic_handle,TIM_CHANNEL_2,TIM_INPUTCHANNELPOLARITY_RISING);//配置捕获为上升沿
                __HAL_TIM_ENABLE(&ic_handle);//用于打开计数器
            }
        }
    }
}
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)//溢出中断回调函数
{
    if(htim->Instance == TIM2)
    {
       if(capture_status.succeed_flag == 0)//在没有产生完整按键时
       {
           if(capture_status.rising_flag == 1)//边沿检测标志位等于1,代表在产生下降沿之后,上升沿之前这段时间,产生的溢出进行计数
           {
               capture_status.timeout_cnt++;
           }
       }
    }
}
void pressed_time_get(void)
{
    if(capture_status.succeed_flag == 1)//产生完整按键之后,执行下面代码,未产生完整按键,不执行下面代码
    {
        printf("按下时间为:%d \r\n",capture_status.timeout_cnt * 65536 + last_cnt);
        memset(&capture_status,0,sizeof(capture_status));//对一整个结构体的清零
    }
}


ic.h

#ifndef __IC_H__
#define __IC_H__
#include "sys.h"

void ic_init(uint16_t psc,uint16_t arr);
void pressed_time_get(void);

#endif

打开串口助手

按下KEY2

可计算按键按下的时间

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【网络协议】路由信息协议 (RIP)

未经许可,不得转载。 路由信息协议(Routing Information Protocol,简称 RIP)是一种使用跳数(hop count)作为路由度量标准的路由协议,用于确定源网络和目标网络之间的最佳路径。 文章目录 什么是…

PHP后执行php.exe -v命令报错并给出解决方案

文章目录 一、执行php.exe -v命令报错解决方案 一、执行php.exe -v命令报错 -PHP Warning: ‘C:\windows\SYSTEM32\VCRUNTIME140.dll’ 14.38 is not compatible with this PHP build linked with 14.41 in Unknown on line 0 解决方案 当使用PHP8.4.1时遇到VCRUNTIME140.dll…

blender中合并的模型,在threejs中显示多个mesh;blender多材质烘培成一个材质

描述:在blender中合并的模型导出为glb,在threejs中导入仍显示多个mesh,并不是统一的整体,导致需要整体高亮或者使用DragControls等不能统一控制。 原因:模型有多个材质,在blender中合并的时候,…

0xc0000020错误代码怎么处理,Windows11、10坏图像错误0xc0000020的修复办法

“0xc0000020”是一种 Windows 应用程序错误代码,通常表明某些文件缺失或损坏。这可能是由于系统文件损坏、应用程序安装或卸载问题、恶意软件感染、有问题的 Windows 更新等原因导致的。 比如,当运行软件时,可能会出现类似“C:\xx\xxx.dll …

wangEditor富文本插件在vue项目中使用和媒体上传的实现

wangEditor是前端一个比较流行的简洁易用,功能强大的前端富文本编辑器,支持 JS Vue React,提供了很多丰富的功能,下面手把手教你实现wangWditor富文本插件在vue项目中配置,保存、图片上传等功能。无脑ctrlc即可 基本功…

MySQL root用户密码忘记怎么办(Reset root account password)

在使用MySQL数据库的的过程中,不可避免的会出现忘记密码的现象。普通用户的密码如果忘记,可以用更高权限的用户(例如root)进行重置。但是如果root用户的密码忘记了,由于root用户本身就是最高权限,那这个方法…

C语言学习笔记(1)

在学习前,需要有一定的C语言基础。不必很深入,只需要知道函数,头文件,指针,数组等的概念就可以,但并非0基础笔记。 由于写到后面,不好编辑了,决定分成多篇写,请按编号学…

使用uWSGI将Flask应用部署到生产环境

使用uWSGI将Flask应用部署到生产环境: 1、安装uWSGI conda install -c conda-forge uwsgi(pip install uwsgi会报错) 2、配置uWSGI 在python程序的同一文件夹下创建 uwsgi.ini文件,文件内容如下表。 需要按照实际情况修改文件名称…

集成方案 | Docusign + 蓝凌 EKP,打造一站式合同管理平台,实现无缝协作!

本文将详细介绍 Docusign 与蓝凌 EKP 的集成步骤及其效果,并通过实际应用场景来展示 Docusign 的强大集成能力,以证明 Docusign 集成功能的高效性和实用性。 在当今数字化办公环境中,企业对于提高工作效率和提升用户体验的需求日益迫切。蓝凌…

CMS漏洞靶场攻略

DeDeCMS 环境搭建 傻瓜式安装 漏洞一:通过文件管理器上传WebShel 步骤⼀:访问目标靶场其思路为 dedecms 后台可以直接上传任意文件,可以通过⽂件管理器上传php文件获取webshell 登陆网站后台 步骤二:登陆到后台点击 【核心】 --》 【文件式…

1、Jmeter、jdk下载与安装

1、访问官网,点击下载Jmeter http://jmeter.apache.org/ 2、在等待期间,下载对应的Java https://www.oracle.com/cn/java/technologies/downloads/#jdk23-windows 3、全部下载好,先安装JDK ![在这里插入图片描述](https://i-blog.csdnimg…

【文献精读笔记】Explainability for Large Language Models: A Survey (大语言模型的可解释性综述)(二)

****非斜体正文为原文献内容(也包含笔者的补充),灰色块中是对文章细节的进一步详细解释! 3.1.2 基于注意力的解释(Attention-Based Explanation) 注意力机制可以揭示输入数据中各个部分之间的关系&#…

【大模型实战篇】Mac本地部署RAGFlow的踩坑史

1. 题外话 最近一篇文章还是在11月30日写的,好长时间没有打卡了。最近工作上的事情特别多,主要聚焦在大模型的预训练、微调和RAG两个方面。主要用到的框架是Megatron-DeepSpeed,后续会带来一些分享。今天的文章主要聚焦在RAG。 近期调研了一系…

使用rknn进行yoloV8部署(C++)

文章目录 RKNN导出ONNX导出RKNNC++部署环境配置参考RKNN RKNN(Rockchip Neural Network)是由 Rockchip(瑞芯微电子)公司开发的深度学习框架,旨在提供高效、优化的神经网络推理(inference)能力,支持各种类型的神经网络模型的加速运行,特别是针对 Rockchip 的 ARM 处理…

linux安装nginxs报错:openssl not found

系统: linux 版本:centOS7 nginx版本:nginx-1.20.2 linux安装nginx时 执行下面命令时报错: ./configure --with-http_stub_status_module --with-http_ssl_module --prefix/usr/local/nginxchecking for OpenSSL library ... not …

AI安全的挑战:如何让人工智能变得更加可信

引言 随着人工智能(AI)技术在各个领域的广泛应用,尤其是在医疗、金融、自动驾驶和智能制造等行业,AI正在重塑我们的工作和生活方式。从提高生产效率到实现个性化服务,AI带来了前所未有的便利。然而,在享受这…

项目开发实践——基于SpringBoot+Vue3实现的在线考试系统(四)

文章目录 一、管理员角色功能实现1、添加教师功能实现1.1 页面设计1.2 前端功能实现1.3 后端功能实现1.4 效果展示2、教师管理功能实现2.1 页面设计2.2 前端功能实现2.3 后端功能实现2.3.1 后端查询接口实现2.3.2 后端编辑接口实现2.3.3 后端删除接口实现2.4 效果展示二、代码下…

医疗设备专网防火墙逻辑编程:构建医疗网络安全防线

一、引言 1.1 医疗设备网络化背景 随着信息技术的飞速发展,医疗设备的智能化与网络化已成为不可阻挡的趋势。从医院内部的信息管理系统(HIS)、影像归档和通信系统(PACS),到临床检验系统(LIS&…

金蝶V10中间件的使用

目录 环境准备搭建过程配置修改应用部署 环境准备 Linux内核服务器JDK1.8安装包:AAS-V10.zip程序包:***.war 搭建过程 将安装包上传至服务器opt目录下,官方给定的默认服务主目录为“/opt/AAS-V10/ApusicAS/aas/”;解压安装包(解…

AutoDL服务器深度学习使用过程

前期准备 Xshell,Xftp,Pycharm专业版 step 1:实例开机(无卡or有卡),Xshell连接 新建xshell会话: 登录指令格式为: ssh -p 38076 rootregion-1.autodl.com 在ssh -p 38076 rootregion-1.autodl.com命令中&#xff0…