16:(标准库)ADC三:使用外部触发启动ADC/模拟看门狗
使用外部触发启动ADC
- 1、外部中断线EXTI11触发ADC
- 2、外部定时器TIM2_CH2触发ADC
- 3、ADC中模拟看门狗的使用
1、外部中断线EXTI11触发ADC
ADC的触发方式有很多,一般情况都是使用软件触发反式启动ADC转换。除了软件触发方式还能使用外部事件触发启动ADC转换。如下图所示:
①EXTI.c文件的代码如下:
#include "EXTI.h"/*** 初始化外部中断线EXTI11,将配置为上升沿触发事件模式*/
void EXTI11_Init(void)
{/* 1、使能GPIOA时钟,AFIO时钟 */RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);/* 2、配置PA11为下拉输入 */GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;GPIO_Init(GPIOA, &GPIO_InitStructure);/* 3、配置EXTI11为上升沿触发事件 */GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource11); //选择PA11通道进行外部中断EXTI_InitTypeDef EXTI_InitStructure;EXTI_InitStructure.EXTI_Line = EXTI_Line11; //选择EXTI11EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Event; //触发事件模式EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; //上升沿触发EXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_InitStructure);/* 4、配置NVIC *///事件无需配置NVIC
// NVIC_InitTypeDef NVIC_InitStructure;
// NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;
// NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
// NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
// NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
// NVIC_Init(&NVIC_InitStructure);
}
②ADC.c文件的代码如下:
#include "ADC.h"
#include "UART.h"/*** ADC1初始化函数*/
void ADC1_Init(void)
{/* 1、使能GPIOA和ADC时钟 */RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能GPIOA时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); //使能ADC1时钟RCC_ADCCLKConfig(RCC_PCLK2_Div6); //对ADC时钟源分频/* 2、对PA0(ADC1的通道0引脚)进行引脚配置 */GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //PA0 作为模拟通道输入引脚GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模拟输入引脚GPIO_Init(GPIOA, &GPIO_InitStructure);/* 3、配置ADC1工作模式 */ADC_InitTypeDef ADC_InitStructure;ADC_DeInit(ADC1); //将外设ADC1的全部寄存器重设为缺省值ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //ADC1和ADC2工作在独立模式ADC_InitStructure.ADC_ScanConvMode = DISABLE; //非扫描(单通道)模式ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; //非连续模式
// ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //使用软件触发ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_Ext_IT11_TIM8_TRGO; //使用外部中断线EXTI11触发ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //ADC1数据右对齐ADC_InitStructure.ADC_NbrOfChannel = 1; //转换的ADC通道的数目,只有PA0ADC_Init(ADC1, &ADC_InitStructure); //根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器/* 4、配置规则组*/ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5); //ADC1,ADC通道,盒子序列1,采样时间为55.5周期/* 5、使能EOC中断,NVIC的配置 */ADC_ITConfig(ADC1, ADC_IT_EOC, ENABLE);NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);NVIC_InitTypeDef NVIC_InitStruct;NVIC_InitStruct.NVIC_IRQChannel = ADC1_2_IRQn;NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStruct);/* 使能ADC的外部触发转换 */ADC_ExternalTrigConvCmd(ADC1,ENABLE); //这一步很重要,不要忘记ADC_Cmd(ADC1, ENABLE); //使能ADC1/* 5、ADC校准 */ADC_ResetCalibration(ADC1); //使能复位校准while (ADC_GetResetCalibrationStatus(ADC1)); //等待复位校准结束ADC_StartCalibration(ADC1); //开启AD校准while (ADC_GetCalibrationStatus(ADC1)); //等待校准结束// /* 6、软件触发 */
// ADC_SoftwareStartConvCmd(ADC1, ENABLE); //启动ADC转换
}/*** ADC单通道转换完成的中断服务函数*/
uint16_t Data = 0;
uint8_t Satatus_Flag = 0;
void ADC1_2_IRQHandler (void)
{if(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == SET)//转换完成标志位EOC置1{ADC_ClearFlag(ADC1, ADC_FLAG_EOC); //清除标志位EOCData = ADC_GetConversionValue(ADC1); //获取结果寄存器中的数据Satatus_Flag = 1; //转换完成标志位}
}
③ADC.h文件的代码如下:
#ifndef __ADC_H
#define __ADC_H
#include "stm32f10x.h" extern uint16_t Data;
extern uint8_t Satatus_Flag;
void ADC1_Init(void);#endif
④主函数main.c文件的代码如下:
#include "stm32f10x.h"
#include "UART.h"
#include "ADC.h"
#include "EXTI.h"int main(void)
{float ADC_Value = 0;UART1_Init();ADC1_Init();EXTI11_Init();printf("ADC电压测量\r\n");while(1){if(Satatus_Flag){Satatus_Flag = 0;printf("结果寄存器数值为:%d\r\n",Data);ADC_Value = Data * 3.3 / 4095; //将二进制计数为电压电压值printf("测量到的电压为:%0.2f\r\n",ADC_Value); }}
}
2、外部定时器TIM2_CH2触发ADC
①TIM.c文件的代码如下:
#include "TIM.h"/*** 定时器TIM2的初始化:使用PWM模式1产生上升沿触发ADC*/
void TIM2_Init(void)
{/* 1、使能TIM2的时钟 */RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);/* 2,对时基单元的初始化 */TIM_InternalClockConfig(TIM2); //选择内部时钟源TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1; //时钟源分频,则为72MHzTIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up; //向上计数TIM_TimeBaseInitStruct.TIM_Prescaler = 7200 - 1; //预分频器,计数分辨率为0.1msTIM_TimeBaseInitStruct.TIM_Period = 10000 - 1; //重装载值为10000,则计数周期为1sTIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0; //重复计数器(高级定时器才配置)TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStruct); /* 3、对TIM2的输出比较单元CH2进行配置 */TIM_OCInitTypeDef TIM_OCInitStruct;TIM_OCStructInit(&TIM_OCInitStruct); //给结构体默认初始值TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1; //选择PWM1模式TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High; //有效值配置极性为低电平TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable; //通道使能TIM_OCInitStruct.TIM_Pulse = 5000; //CCR的初始值TIM_OC2Init(TIM2, &TIM_OCInitStruct); //配置CH2TIM_Cmd(TIM2,ENABLE); //使能定时器}
②ADC.c文件的代码如下:
#include "ADC.h"/*** ADC1初始化函数*/
void ADC1_Init(void)
{/* 1、使能GPIOA和ADC时钟 */RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能GPIOA时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); //使能ADC1时钟RCC_ADCCLKConfig(RCC_PCLK2_Div6); //对ADC时钟源分频/* 2、对PA0(ADC1的通道0引脚)进行引脚配置 */GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //PA0 作为模拟通道输入引脚GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模拟输入引脚GPIO_Init(GPIOA, &GPIO_InitStructure);/* 3、配置ADC1工作模式 */ADC_InitTypeDef ADC_InitStructure;ADC_DeInit(ADC1); //将外设ADC1的全部寄存器重设为缺省值ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //ADC1和ADC2工作在独立模式ADC_InitStructure.ADC_ScanConvMode = DISABLE; //非扫描(单通道)模式ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; //非连续模式
// ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //使用软件触发ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T2_CC2; //使用TIM2_CH2触发ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //ADC1数据右对齐ADC_InitStructure.ADC_NbrOfChannel = 1; //转换的ADC通道的数目,只有PA0ADC_Init(ADC1, &ADC_InitStructure); //根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器/* 4、配置规则组*/ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5); //ADC1,ADC通道,盒子序列1,采样时间为55.5周期/* 5、使能EOC中断,NVIC的配置 */ADC_ITConfig(ADC1, ADC_IT_EOC, ENABLE);NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);NVIC_InitTypeDef NVIC_InitStruct;NVIC_InitStruct.NVIC_IRQChannel = ADC1_2_IRQn;NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStruct);/* 使能ADC的外部触发转换 */ADC_ExternalTrigConvCmd(ADC1,ENABLE);//这一步很重要,不要忘记ADC_Cmd(ADC1, ENABLE); //使能ADC1/* 5、ADC校准 */ADC_ResetCalibration(ADC1); //使能复位校准while (ADC_GetResetCalibrationStatus(ADC1)); //等待复位校准结束ADC_StartCalibration(ADC1); //开启AD校准while (ADC_GetCalibrationStatus(ADC1)); //等待校准结束// /* 6、软件触发 */
// ADC_SoftwareStartConvCmd(ADC1, ENABLE); //启动ADC转换
}/*** ADC单通道转换完成的中断服务函数*/
uint16_t Data = 0;
uint8_t Satatus_Flag = 0;
void ADC1_2_IRQHandler (void)
{if(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == SET)//转换完成标志位EOC置1{ADC_ClearFlag(ADC1, ADC_FLAG_EOC); //清除标志位EOCData = ADC_GetConversionValue(ADC1);//获取结果寄存器中的数据Satatus_Flag = 1; //转换完成标志位}
}
③主函数main.c文件的代码如下:
#include "stm32f10x.h"
#include "UART.h"
#include "ADC.h"
#include "TIM.h"int main(void)
{float ADC_Value = 0;UART1_Init();ADC1_Init();TIM2_Init();printf("ADC电压测量\r\n");while(1){if(Satatus_Flag){Satatus_Flag = 0;printf("结果寄存器数值为:%d\r\n",Data);ADC_Value = Data * 3.3 / 4095; //将二进制计数为电压电压值printf("测量到的电压为:%0.2f\r\n",ADC_Value); }}
}
使用定时器的PWM模式触发,每隔1s触发一次,因为定时器的定时器周期配置的为1s。
3、ADC中模拟看门狗的使用
如图:在ADC中有一个模拟看门狗,用于监测着结果寄存器的数值。用户可以设定一个寄存器的上限值和下限值,当寄存器的值大于上限值/小于下限值时,看门狗就会将标志位AWD置1,若开启了模拟看门狗中断,则会进入ADC中断。
①ADC.c文件的代码如下:
#include "ADC.h"
#include "UART.h"/*** ADC1初始化函数*/
void ADC1_Init(void)
{/* 1、使能GPIO和ADC时钟 */RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能GPIOA时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); //使能ADC1时钟RCC_ADCCLKConfig(RCC_PCLK2_Div6);//对ADC时钟源分频/* 2、对PA0(ADC1的通道0引脚)进行引脚配置 */GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //PA0 作为模拟通道输入引脚GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模拟输入引脚GPIO_Init(GPIOA, &GPIO_InitStructure);/* 3、配置ADC1工作模式 */ADC_InitTypeDef ADC_InitStructure;ADC_DeInit(ADC1); //将外设ADC1的全部寄存器重设为缺省值ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //ADC1和ADC2工作在独立模式ADC_InitStructure.ADC_ScanConvMode = DISABLE; //非扫描(单通道)模式ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; //连续模式ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //转换由软件而不是外部触发启动ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //ADC1数据右对齐ADC_InitStructure.ADC_NbrOfChannel = 1; //转换的ADC通道的数目,只有PA0ADC_Init(ADC1, &ADC_InitStructure); //根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器/* 4、配置规则组*/ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5); //ADC1,ADC通道,盒子序列1,采样时间为55.5周期/* 5、配置模拟看门狗:上限为3.0v,下限为2.0v */ADC_AnalogWatchdogThresholdsConfig(ADC1,0x09B1,0x0EBA); //配置监测的上下限,注意:监测的是结果寄存器的值ADC_AnalogWatchdogSingleChannelConfig(ADC1,ADC_Channel_0); //监测通道0ADC_AnalogWatchdogCmd(ADC1,ADC_AnalogWatchdog_SingleRegEnable); //使能单个规则组模拟看门狗/* 6、使能EOC和AWD中断,NVIC的配置 */ADC_ITConfig(ADC1, ADC_IT_AWD, ENABLE); //使能看门狗中断ADC_ITConfig(ADC1, ADC_IT_EOC, ENABLE); //使能ADC转换完成中断NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);NVIC_InitTypeDef NVIC_InitStruct;NVIC_InitStruct.NVIC_IRQChannel = ADC1_2_IRQn;NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStruct);ADC_Cmd(ADC1, ENABLE); //使能ADC1/* 7、ADC校准 */ADC_ResetCalibration(ADC1); //使能复位校准while (ADC_GetResetCalibrationStatus(ADC1)); //等待复位校准结束ADC_StartCalibration(ADC1); //开启AD校准while (ADC_GetCalibrationStatus(ADC1)); //等待校准结束/* 8、软件触发 */ADC_SoftwareStartConvCmd(ADC1, ENABLE); //启动ADC转换
}/*** ADC单通道转换完成和模拟看门狗的中断范围函数*/
void ADC1_2_IRQHandler (void)
{/* 转换完成 */if(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)) //转换完成标志位EOC置1{ADC_ClearFlag(ADC1, ADC_FLAG_EOC); //清除标志位EOCprintf("结果寄存器数值为:%d\r\n",ADC_GetConversionValue(ADC1)); //打印结果寄存器的值printf("测量到的电压为:%0.2f\r\n",ADC_GetConversionValue(ADC1) * 3.3 / 4095); //打印电压值}/* 模拟看门狗监测到超过阈值 */if(ADC_GetFlagStatus(ADC1, ADC_FLAG_AWD)){ADC_ClearFlag(ADC1, ADC_FLAG_AWD); //清除标志位AWD//LED翻转 }
}
②主函数main.c文件的代码如下:
#include "stm32f10x.h"
#include "ADC.h"int main(void)
{ADC1_Init();printf("ADC电压监测\r\n");while(1){}
}
相关文章:
16:(标准库)ADC三:使用外部触发启动ADC/模拟看门狗
使用外部触发启动ADC 1、外部中断线EXTI11触发ADC2、外部定时器TIM2_CH2触发ADC3、ADC中模拟看门狗的使用 1、外部中断线EXTI11触发ADC ADC的触发方式有很多,一般情况都是使用软件触发反式启动ADC转换。除了软件触发方式还能使用外部事件触发启动ADC转换。如下图所…...
前端框架 react 性能优化
目录 一、不使用任何性能优化API进行优化 二、通过性能优化API优化 1、React.memo 2、useCallback 3、useMemo 4、PureComponent 三、总结 总览:react的优化核心思想就是让react跳过重新渲染那个些没有改变的Component,而只重新渲染发生变化的C…...
一加ACE 3 Pro手机无法连接电脑传输文件问题
先说结论:OnePlus手机无法连接电脑传输数据的原因,大概率是一加数据线的问题。尝试其他手机品牌的数据线(比如华为),再次尝试。 连接电脑方法: 1 打开开发者模式(非必要操作) 进入…...
✅ Qt流式布局
Qt流式布局 前段时间,曾经对某个软件的一个“流式布局”有点感兴趣,什么叫“流式布局”呢?请看下图: 简而言之,流式布局就是布局应能够根据界面尺寸的变化自动调整其内部控件的位置。然而,Qt 提供的标准布局ÿ…...
【微服务】RabbitMQ与SpringAMQP消息队列
一、初识MQ 1. 同步通讯 同步通讯就好比双方打电话,可以实时响应,但只能一对一,只能同时和一个人聊天。 异步通讯就好比两个人发信息,你发信息给对方,对方不一定给你回复,但是可以一对多,可…...
C++设计模式-中介者模式
动机(Motivation) 多个对象相互关联的情况,对象之间常常会维持一种复杂的引用关系,如果遇到一些需求的更改,这种直接的引用关系将面临不断的变化。在这种情况下,可以使用一种”中介对象“来管理对象间的关联关系,避免…...
js实现分页效果
分页总结: 先写好html格式和css样式 再写js时先将他们都获取过来,设置一个k为页数的下标,num为每页的数据数量,pages为页数,并且获取json数据,再将data获取到全局 写for循环,设置一个变量为i…...
【WRF-Urban】多层建筑能源参数化模型概述:原理
【WRF-Urban】多层建筑能源参数化模型概述:原理 1 概述1.1 原理1.2 使用步骤 2参考 多层建筑能源参数化(Multi-layer Building Energy Parameterization, BEP)模型是一种用于模拟城市环境中多层建筑群的能量交换和微气候影响的参数化模型。该…...
ShuffleNet V2:高效卷积神经网络架构设计的实用指南
摘要 https://arxiv.org/pdf/1807.11164 当前,神经网络架构设计大多以计算复杂度的间接指标,即浮点运算数(FLOPs)为指导。然而,直接指标(例如速度)还取决于其他因素,如内存访问成本…...
1123--collection接口,list接口,set接口
目录 一 java 1. 集合 2. 集合框架图--remember 3. collection接口 3.1 collection接口的常用方法 3.1.1 add() 3.1.2 remove()-返回删除后的对象 3.1.3 contains()--返回布尔值 3.1.4 size&…...
基于BindingList的WinForm数据绑定机制与DataGridView动态刷新技术
前言: 本文以连接SQLite为例进行代码演示 一、首先建立里一个模型类 public class MyData{public int id { get; set; }public string name { get; set; }public int age { get; set; }public string sex { get; set; }public string address { get; set; }} 二、…...
大数据新视界 -- Hive 数据分区:精细化管理的艺术与实践(上)(7/ 30)
💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…...
对于相对速度的重新理解 - 插一句
因为发了太多的公式,系统提示插入图片太频繁,下一个部分稍后再写。 这里要强调一下: 狭义相对论的平方和形式,其实就是因为分不清虚数单位的大小才写成这个样子。或者用物理语言来说,就是认为所有惯性系的“光速”都…...
css基础(27)_行内、行内块元素之间的空白问题
行内、行内块元素之间的空白问题 产生的原因:行内元素、行内块元素,彼此之间的换行会被浏览器解析为一个空白字符。 案例一: <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8">&…...
如果接口返回值图片有很长一串码,需要添加前缀
需要在前面添加前缀:data:image/jpeg;base64,然后将值赋值给<img :src"originalImage" /> this.tableLists.map((item)>{item.originalImage "data:image/jpeg;base64,"item.originalImage})以上方法会导致出现一个小bug,…...
《AI大模型开发笔记》——ollama应用全面解析
入门篇 1 ollama是什么? Ollama 是一个支持在本地运行大语言模型的工具,兼容 Windows、Linux 和 MacOS 操作系统。使用 Ollama,您仅需一行命令即可启动模型。 2 如何安装? Windows和MacOS用户,从下面链接下载安装即可: 下载地址:https://ollama.com/download Linux系…...
Paddle Inference部署推理(三)
三:Paddle Inference推理 导出模型 Paddle Inference支持使用飞桨静态图模型进行推理,您可以通过以下两种方式获取静态图模型: (1)飞桨框架导出推理模型 飞桨框架在训练模型过程中,会在本地存储最终训练…...
CSP/信奥赛C++语法基础刷题训练(23):洛谷P1217:[USACO1.5] 回文质数 Prime Palindromes
CSP/信奥赛C语法基础刷题训练(23):洛谷P1217:[USACO1.5] 回文质数 Prime Palindromes 题目描述 因为 151 151 151 既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 151 …...
《跨越语言壁垒:Python 人工智能原型到 C++可执行程序的转型之路》
在人工智能的广阔天地里,Python 以其简洁易用和丰富的库资源成为众多开发者快速搭建人工智能原型的首选语言。然而,在一些对性能和资源控制要求极高的场景下,C则展现出无可比拟的优势。那么,如何将 Python 中开发的人工智能原型代…...
flowable流程图详细绘制教程
文章目录 前言一、flowable是什么?回答下之前的问题 二、flowable-modeler使用1. 使用步骤2.开始绘制弄一个请假的流程 三 加载该流程总结 前言 flowable有些晦涩难懂的东西: 我最开始接触的时候,还是用的activity,当时觉得好复杂,那么这次经过我自己在…...
Figma入门-基本操作制作登录页
Figma入门-基本操作制作登录页 前言 在之前的工作中,大家的原型图都是使用 Axure 制作的,印象中 Figma 一直是个专业设计软件。 最近,很多产品朋友告诉我,很多原型图都开始用Figma制作了,并且很多组件都是内置的&am…...
在windows操作系统上,用git与github账户连接
一、环境准备 1.1 git软件 1.2 github账号 1.3 创建一个项目目录,比如 D:\project\gitproject 二、开始操作 1. 进入项目目录下,右键,如图,打开git bash命令行 2. 在命令行输入以下三个命令 $ git config --global user.name &quo…...
springboot系列--拦截器执行原理
一、拦截器核心概念 一、定义 拦截器(Interceptor)是框架级别的组件,用于在请求的不同阶段(如到达控制器之前(也就是接口)、处理完成之后)动态地拦截和处理 HTTP 请求。 二、使用场景 一、用户…...
数据可视化复习2-绘制折线图+条形图(叠加条形图,并列条形图,水平条形图)+ 饼状图 + 直方图
目录 目录 一、绘制折线图 1.使用pyplot 2.使用numpy 编辑 3.使用DataFrame 编辑 二、绘制条形图(柱状图) 1.简单条形图 2.绘制叠加条形图 3.绘制并列条形图 4.水平条形图 编辑 三、绘制饼状图 四、绘制散点图和直方图 1.散点图 2…...
STM32F10x 定时器
使用定时器实现:B5 E5的开关 添加相关的.h路径文件 添加相关的.c配置文件 led.h文件 用于声明LED函数 #ifndef __LED_H //没有定义__LED_H #define __LED_H //就定义__LED_H #define LED1_ON GPIO_ResetBits(GPIOB,GPIO_Pin_5) #defi…...
VBA技术资料MF230:展开所有折叠视图并恢复
我给VBA的定义:VBA是个人小型自动化处理的有效工具。利用好了,可以大大提高自己的工作效率,而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套,分为初级、中级、高级三大部分,教程是对VBA的系统讲解&#…...
【数据结构OJ】【图论】图综合练习--拓扑排序
题目描述 已知有向图,顶点从0开始编号,求它的求拓扑有序序列。 拓扑排序算法:给出有向图邻接矩阵 1.逐列扫描矩阵,找出入度为0且编号最小的顶点v 2.输出v,并标识v已访问 3.把矩阵第v行全清0 重复上述步骤࿰…...
网络安全防范
网络安全防范技术 所属课程网络攻防实践作业要求第六次作业 实践内容 学习总结 PDR,$$P^2$$DR安全模型。 防火墙(Firewall): 网络访问控制机制,布置在网际间通信的唯一通道上。 不足:无法防护内部威胁&…...
Linux nc 命令详解
简介 nc 全称 netcat,是一个在 Linux 中多功能的网络工具,通常用于通过 TCP 或 UDP 读取和写入网络连接,也能作为客户端或服务端用来 debug,测试,网络问题分析。 常用示例 检查端口是否是打开的 nc -zv <hostna…...
解决 Gradle 报错:`Plugin with id ‘maven‘ not found` 在 SDK 开发中的问题
在 SDK 开发过程中,使用 Gradle 构建和发布 SDK 是常见的任务。在将 SDK 发布为 AAR 或 JAR 包时,你可能会使用 apply plugin: maven 来发布到本地或远程的 Maven 仓库。但是,随着 Gradle 版本的更新,特别是从 Gradle 7 版本开始&…...
stm32cubemx+VSCODE+GCC+makefile 开发环境搭建
title: stm32cubemxVSCODEGCCmakefile 开发环境搭建 tags: FreertosHalstm32cubeMx 文章目录 内容往期内容导航第一步准备环境vscode 插件插件配置点灯 内容 往期内容导航 第一步准备环境 STM32CubeMXVSCODEMinGWOpenOcdarm-none-eabi-gcc 然后把上面下载的软件 3 4 5 bin 文…...
postgresql|数据库开发|python的psycopg2库按指定顺序批量执行SQL文件(可离线化部署)
一、 psycopg2简介 psycopg2库是python的一个可直接操作postgresql数据库的类库,是一个用于Python编程语言的PostgreSQL数据库适配器。它允许开发人员使用Python语言与PostgreSQL数据库进行交互和操作,不同于java,需要专用的一个驱动&#…...
学习ASP.NET Core的身份认证(基于Cookie的身份认证3)
用户通过验证后调用HttpContext.SignInAsync函数将用户的身份信息保存在认证Cookie中,以便后续的请求可以验证用户的身份,该函数原型如下所示,其中properties参数的主要属性已在前篇文章中学习,本文学习scheme和principal的意义及用法。 public static …...
Java 中的 HashMap 原理详解:底层结构与实现机制
HashMap 是 Java 中最常用的数据结构之一,它以其高效的存取速度在众多应用场景中被广泛使用。理解 HashMap 的底层实现原理,对提升开发效率、优化性能以及编写高效的代码都至关重要。本文将深入探讨 HashMap 的数据结构、存储机制、解决冲突的策略、扩容…...
数据库MYSQL——表的设计
文章目录 前言三大范式:几种实体间的关系:一对一关系:一对多关系:多对多关系: 前言 之前的博客中我们讲解的是关于数据库的增删改查与约束的基本操作, 是在已经创建数据库,表之上的操作。 在实…...
CUDA补充笔记
文章目录 一、不同核函数前缀二、指定kernel要执行的线程数量三、线程需要两个内置坐标变量来唯一标识线程四、不是blocksize越大越好,上限一般是1024个blocksize 一、不同核函数前缀 二、指定kernel要执行的线程数量 总共需要线程数是: 1 * N N个线程…...
OSI七层模型和TCP/IP五层模型详细介绍
这里写目录标题 一.OSI含义二.OSI七层模型1.应用层2.表示层3.会话层4.传输层5.网络层6.数据链路层7.物理层 TCP/IP五层协议1.应用层2.运输层运行在TCP上的协议运行在UDP上的协议 3.网络层IP协议配套使用的协议 4.数据链路层 四.网络协议分层的好处 一.OSI含义 OSI即是开放式通…...
mac安装Pytest、Allure、brew
安装环境 安装pytest 命令 pip3 install pytest 安装allure 命令:brew install allure 好吧 那我们在安装allure之前 我们先安装brew 安装brew 去了官网复制了命令 还是无法下载 如果你们也和我一样可以用这个方法哦 使用国内的代码仓库来执行brew的安装脚本…...
Linux/Windows/OSX 上面应用程序重新启动运行。
1、Linux/OSX 上面重新运行程序,直接使用 execvp 函数就可以了,把main 函数传递来的 argv 二维数组(命令行参数)传进去就可以,注意不要在 fork 出来的子进程搞。 2、Windows 平台可以通过 CreateProcess 函数来创建新的…...
自定义 Kafka 脚本 kf-use.sh 的解析与功能与应用示例
Kafka:分布式消息系统的核心原理与安装部署-CSDN博客 自定义 Kafka 脚本 kf-use.sh 的解析与功能与应用示例-CSDN博客 Kafka 生产者全面解析:从基础原理到高级实践-CSDN博客 Kafka 生产者优化与数据处理经验-CSDN博客 Kafka 工作流程解析:…...
Odoo :免费且开源的农牧行业ERP管理系统
文 / 开源智造Odoo亚太金牌服务 引言 提供农牧企业数字化、智能化、无人化产品服务及全产业链高度协同的一体化解决方案,提升企业智慧种养、成本领先、产业互联的核心竞争力。 行业典型痛点 一、成本管理粗放,效率低、管控弱 产品研发过程缺少体系化…...
AI的自我陷阱:大型神经网络训练中的模型崩溃现象
10月7日,发布在arxiv上的一篇名为Strong Model Collapse的论文,由Meta 、纽约大学和加州大学洛杉矶分校的研究人员共同发表的研究表明在训练大型神经网络(如 ChatGPT 和 Llama)时,由于训练语料库中包含合成数据而导致的…...
Python(下载安装)
简介 开发工具:pycharm, VS Code 1. 下载(解释器程序) Download Python | Python.org 2. 安装(解释器程序) 双击下载后的exe文件 查看版本:python(并可以执行python代码) 3. 下载…...
记录一种在内核空间向用户空间通知中断的方法
记录一种在内核空间向用户空间通知中断的方法 0.前言1.代码实现1)内核设备驱动实现2)消息通知实现3)测试程序 2.解析 参考文章:Linux驱动实践:中断处理函数如何【发送信号】给应用层? 0.前言 最近在项目中遇到一个需求,需要将一个…...
Apache Maven 标准文件目录布局
Apache Maven 采用了一套标准的目录布局来组织项目文件。这种布局提供了一种结构化和一致的方式来管理项目资源,使得开发者更容易导航和维护项目。理解和使用标准目录布局对于有效的Maven项目管理至关重要。本文将探讨Maven标准目录布局的关键组成部分,并…...
【vim】使用 gn 组合命令实现搜索选中功能
gn是Vim 7.4新增的一个操作(motion),作用是跳到并选中下一个搜索匹配项。 具体说,Vim里执行搜索后,执行n操作只会跳转到下一个匹配项,而不选中它。但是我们往往需要对匹配项执行一些修改操作,例…...
解决登录Google账号遇到手机上Google账号无法验证的问题
文章目录 场景小插曲解决方案总结 场景 Google账号在新的设备上登录的时候,会要求在手机的Google上进行确认验证,而如果没有安装Google play就可能出现像我一样没有任何弹框,无法实现验证 小插曲 去年,我在笔记本上登录了Googl…...
基于YOLOv10深度学习的公共安全持刀行为检测系统研究与实现(PyQt5界面+数据集+训练代码)
随着社会的不断进步和城市化进程的加快,人口密度的增加和社会结构的复杂化使得公共安全问题日益凸显。近年来,各类公共安全事件频发,其中持刀行为作为一种典型的暴力行为,已成为威胁公共安全的严重因素之一。这种行为在公共场所发…...
HP6心率血压传感器
目录 一、介绍 1、工作原理概述 2、具体实现步骤 二、HP6的通信及配置 1、通信接口 2、器件地址/命令 3、校验 三、程序设计 ①IIC通信相关基础函数 ②HP6相关基础函数 一、介绍 HP6心率血压传感器的原理主要基于光电容积脉搏波描记法(PPG)&…...
深入理解 JVM 中的 G1 垃圾收集器原理、算法、过程和参数配置
引言 Java 虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称 GC)是自动内存管理的核心部分。G1(Garbage-First)垃圾收集器是 Oracle 在 JDK 7u4 版本中引入的一种新型垃圾收集器,…...