零死角玩转stm32初级篇6-中断

news2024/9/23 21:29:04

本篇博文目录:

      • 一.中断相关概念知识
        • 1.STM32 的中断和异常
        • 2.NVIC 中断控制器
        • 3.NVIC 结构体成员
        • 4.抢占优先级和响应优先级
        • 5.NVIC 的优先级组
        • 6.EXTI 外部中断
        • 7.中断服务函数
      • 二.按键点灯的二种实现方式
        • 1.按键和LED的原理图以及各种输入模式(浮空输入,上拉输入,下拉输入和模拟输入)
        • 2.软件轮询方式
        • 3.中断方式
      • 三.源码下载

一.中断相关概念知识

1.STM32 的中断和异常

Cortex 内核具有强大的异常响应系统,它把能够打断当前代码执行流程的事件分为异常(exception) 和 中断(interrupt) ,并把它们用一个表管理起来,编号为 0~15 的称为 内核异常 ,而 16 以上的则称为 外部中断(这里的外,相对内核而言) ,这个表就称为 中断向量表 。而 STM32 对这个表重新进行了编排,把编号从-3 至 6 的中断向量定义为系统异常, 编号为负 的内核异常不能被设置优先级,如复位(Reset)、不可屏蔽中断 (NMI)、硬错误(Hardfault)。从编号 7 开始的为外部中断,这些中断的优先级都是可以自行设置的。根据编程手册STM32F10xxx产品(小容量、中容量和大容量)的向量表如下图所示。( 中断:暂停当前任务转而去执行中断任务,当中断任务执行完后再来处理暂停任务;中断触发后,CPU就会停下来去执行中断任务,所以中断任务的处理时间一般非常快,对于一些耗时任务不要交给中断进行处理,中断任务中也尽量不要使用延时函数 )

在这里插入图片描述

在这里插入图片描述

2.NVIC 中断控制器

STM32 的中断如此之多,配置起来并不容易,因此,我们需要一个强大而方便的中断控制器 NVIC (Nested Vectored Interrupt Controller)。NVIC 是属于Cortex 内核的器件,不可屏蔽中断 (NMI)和外部中断都由它来处理,而SYSTICK 不是由 NVIC 来控制的。

在这里插入图片描述

3.NVIC 结构体成员

当我们要使用 NVIC 来配置中断时,自然想到 ST 库肯定也已经把它封装成库函数了。查找库帮助文档,发现在 Modules->STM32F10x_StdPeriph_Driver->misc 查找到一个 NVIC_Init() 函数,对 NVIC 进行初始化,首先要定义并填充一个NVIC_InitTypeDef 类型的结构体。

在这里插入图片描述
在这里插入图片描述

这个结构体的成员参数的描述如下表,成员参数的第一个参数为选择指定的中断向量,第二个参数为中断使能,这里的使能指的是总开关使能,只要当总开关使能,中断才有效;第三个参数和第四个参数都是中断的优先级,中断可能出现嵌套的情况如果二个中断同时响应,那应该执行哪一个呢?这个时候就由优先级来决定。

成员参数描述
NVIC_IRQChannel需要配置的中断向量
NVIC_IRQChannelCmd使能或关闭相应中断向量的中断响应
NVIC_IRQChannelPreemptionPriority配置相应中断向量抢占优先级
NVIC_IRQChannelSubPriority配置相应中断向量的响应优先级

4.抢占优先级和响应优先级

STM32 的中断向量具有两个属性,一个为抢占属性 ,另一个为响应属性 ,其属性编号越小 ,表明它的优先级别越高 ( 编号越小优先级越高 )。

  • 抢占优先级
    抢占,是指打断其它中断的属性,即因为具有这个属性,会出现嵌套中断(在执行中断服务函数 A 的过程中被中断 B 打断,执行完中断服务函数 B 再继续执行中断服务函数 A),抢占属性由 NVIC_IRQChannelPreemptionPriority 的参数配置。

  • 响应优先级
    响应属性则应用在抢占属性相同的情况下,当两个中断向量的抢占优先级相同时,如果两个中断同时到达,则先处理响应优先级高的中断,响应属性由 NVIC_IRQChannelSubPriority 的参数配置。

例如,如下图所示,有三个中断向量:若内核正在执行 C 的中断服务函数,则它能被抢占优先级更高的中断A打断,由于B和C的抢占优先级相同,所以 C 不能被 B 打断。但如果 B 和C中断是同时到达的,内核就会首先响应响应优先级别更高的B中断。

中断向量抢占优先级响应优先级
A00
B10
C11

5.NVIC 的优先级组

在配置优先级的时候,还要注意一个很重要的问题,中断种类的数量。NVIC只可以配置16 种中断向量的优先级,也就是说,抢占优先级和响应优先级的数量由一个4位的数字来决定,把这个 4 位数字的位数分配成抢占优先级部分和响应优先级部分。有 5 组分配方式 ( 优先级的顺序是抢占优先级(主)>响应优先级(子)>硬件中断编号,当有一个相同时,依次比较下一个 ):

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

6.EXTI 外部中断

STM32 的所有 GPIO 都引入到 EXTI 外部中断线上,使得所有的 GPIO 都能作为外部中断的输入源。

在这里插入图片描述

观察上图可知, PA0~PG0 连接到 EXTI0 、 PA1~ PG1 连接到EXTI1 、 ……、 PA15~PG15 连接到 EXTI15 ( 通过这种方式就可以实现16种中断优先级控制所有GPIO引脚 )。这样的话 PAx~PGx端口的中断事件都连接到了 EXTIx ,即同一时刻 EXTx 只能响应一个端口的事件触发,不能够同一时间响应所有 GPIO 端口的事件,但可以分时复用。它可以配置为上升沿触发,下降沿触发或双边沿触发。EXTI 最普通的应用就是接上一个按键,设置为下降沿触发,用中断来检测按键。

7.中断服务函数

中断服务函数就是当中断触发后执行任务的函数;在stm32f10x_it.c 文件是专门用来存放中断服务函数的。文件中默认只有几个关于系统异常的中断服务函数,而且都是空函数,在需要的时候自已进行编写。那么中断服务函数名是不是可以自己定义呢?不可以。中断服务函数的名字必须要跟启动文件 startup_stm32f10x_md.s 中的中断向量表定义一致。如下图所示。

在这里插入图片描述

对于多个中断共用一个函数,怎么知道是哪一个引起的呢,可以通过调用库函数 EXTI_GetITStatus() 来重新检查是否产生了 EXTI_Line 中断,比如EXTI_GetITStatus(EXTI_Line9)!=RESET 然后通过GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_9)来读取引脚的电平情况,为低电平时说明是EXTI_Line9引起的中断。

在这里插入图片描述

中断任务执行完毕后需要将中断标志清除后再退出中断服务函数,可以使用EXTI_ClearITPendingBit() 清除中断标置位。比如 EXTI_ClearITPendingBit(EXTI_Line9); 清除EXTI_Line8的中断标志。

在这里插入图片描述

二.按键点灯的二种实现方式

1.按键和LED的原理图以及各种输入模式(浮空输入,上拉输入,下拉输入和模拟输入)

  • 按键原理图(这里选择sw1按钮)

在这里插入图片描述
在这里插入图片描述

  • led灯原理图

在这里插入图片描述

  • 浮空输入,上拉输入,下拉输入和模拟输入

在STM32中,模拟输入指的是模拟到数字转换器(ADC)的输入。这些输入通常来自于外部传感器、电位器等模拟信号源,并且需要将它们转换为数字信号以便于微控制器进行处理。(图片来源于:https://blog.csdn.net/scarecrow_sun/article/details/120287852)

在这里插入图片描述

上拉,GPIO的输入线(IN)通过一个上拉电阻连接到VCC(上拉电阻开关闭合,下拉电阻开关断开),当没有外部信号连接时,输入线会被拉高到高电平(VCC)状态,当引脚输入高电平时,读取到的也是高电平(但是无法区分是上拉电阻连接的VCC还是引脚的高电平 ),当引脚输入低电平时,读取到的是低电平,此时就能够明确知道是输入的低电平。

在这里插入图片描述

同样,下拉输入使用的电路也是类似的(上拉电阻开关断开,下拉电阻开关闭合),只不过电阻连接到地(GND),当IO口不输入时,读取到的就是低电平,当引脚输入低电平时,读取到的也是低电平,但是此时是无法知道是下拉电阻GND的低电平还是引脚输入的低电平;但是当输入的是高电平时,就能够明显读取到高电平,说明引脚输入了高电平。

在这里插入图片描述

浮空输入,和上面二种不同的是上拉电阻开关和下拉电阻开关都断开,此时读取的引脚电平漂浮不定,电平会处于一个跳变的状态,一会高,一会低。只有输入了一个高/低电平才会确定下来( 采用浮空输入表名输出情况有外部来决定 )。

在这里插入图片描述

在STM32中,可以通过使用内部上拉/下拉电阻或外部上拉/下拉电阻来实现上拉/下拉输入,由于我的原理图设计并没有设计外部的上拉和下拉,所以这里需要采用内部上拉,因为如果采用内部下拉的话,低电平是无法识别的,所以应该采用内部的上拉电阻(内部的上拉都是弱上拉,不是很稳定,所以在设计的时候尽量采用外部的上拉或下拉,并且可以在按键上并联一个电容,这样可以实现消抖的作用)。如果采用外部上拉的话在外部接一个上拉电阻即可,如下图所示。

在这里插入图片描述

2.软件轮询方式

软件方式就是通过获取用户按键的电平信息,来判断用户是否按下,由于按钮采用上拉方式,当按键没有按下时是输入的是高电平,当按下时,输入的是低电平;通过这种方式就可以获取用户按键的开和关;需要注意的是当按键按下时会有10ms的跳变电平,所以需要进行消抖处理,消抖处理有二种方式,硬件方式和软件方式;软件方式就是通过软件代码实现10ms的休眠;。

在这里插入图片描述

  • key.h
#ifndef __key_h
#define __key_h
#include "stm32f10x.h"


#define KEY_G_GPIO_PIN    GPIO_Pin_9
#define KEY_G_GPIO_PORT	 GPIOB
#define KEY_G_GPIO_CLK  RCC_APB2Periph_GPIOB
#define KEY_ON   1
#define KEY_OFF 0

void keyInit(void);
uint8_t keyScan(GPIO_TypeDef *,uint16_t);
#endif /* __key_h */
  • key.c
#include "key.h"
#include "stm32f10x.h"



// 初始化按钮
void keyInit(void){
	// PB上的时钟使能
	RCC_APB2PeriphClockCmd(KEY_G_GPIO_CLK,ENABLE);
	// 初始化GPIO
	GPIO_InitTypeDef  GPIO_InitStruct;
	GPIO_InitStruct.GPIO_Pin = KEY_G_GPIO_PIN; 
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;// 上拉输入
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_10MHz;
	GPIO_Init(KEY_G_GPIO_PORT,&GPIO_InitStruct);// 初始化GPIO
}


// 按键扫描
uint8_t keyScan(GPIO_TypeDef *  GPIOx,uint16_t  GPIO_Pin){
		// 如果没有并联电容的话,可以考虑进行消抖,消抖时长10ms
		// 获取引脚的值
	  if(GPIO_ReadInputDataBit( GPIOx,GPIO_Pin)  == KEY_ON){
			// 松手检测
			while(GPIO_ReadInputDataBit( GPIOx,GPIO_Pin)== KEY_ON);
			return KEY_ON;
		}else{
			return KEY_OFF;
		}
}


// 配置中断优先级
static void EXTI_NVIC_Config(){
	NVIC_InitTypeDef   NVIC_InitStruct;
	NVIC_InitStruct.NVIC_IRQChannel =EXTI15_10_IRQn;// IRQn通道使能,在stm32f10x.h中可以查找到
	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority =1;// 设置抢占优先级
	NVIC_InitStruct.NVIC_IRQChannelSubPriority= 1;// 设置响应优先级
	NVIC_InitStruct.NVIC_IRQChannelCmd= ENABLE;// 使能
	
	// 设置优先级的分组
	NVIC_PriorityGroupConfig(3);//3位抢占优先级,1位响应优先级
	NVIC_Init(&NVIC_InitStruct);// 初始化NVIC
}
  • led.h
#ifndef __led_h
#define __led_h
#define LED_G_GPIO_PIN    GPIO_Pin_10
#define LED_G_GPIO_PORT	 GPIOB
#define LED_G_GPIO_CLK  RCC_APB2Periph_GPIOB
#define LED_ON 1
#define LED_OFF 0
#define LED_G(state) if(state) GPIO_ResetBits(LED_G_GPIO_PORT,LED_G_GPIO_PIN); else GPIO_SetBits(LED_G_GPIO_PORT,LED_G_GPIO_PIN);

void ledInit(void);
void ledOnOrOff(int state);
void ledToggle(void);
#endif /* __led_h */
  • led.c
#include "led.h"
#include "stm32f10x.h"


// 初始化LED
void ledInit(){
	// PB上的时钟使能
	RCC_APB2PeriphClockCmd(LED_G_GPIO_CLK,ENABLE);
	// 初始化GPIO
	GPIO_InitTypeDef  GPIO_InitStruct;
	GPIO_InitStruct.GPIO_Pin = LED_G_GPIO_PIN;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_10MHz;
	GPIO_Init(LED_G_GPIO_PORT,&GPIO_InitStruct);// 初始化GPIO
}

// 控制LED的开关
void ledOnOrOff(int state){
	// 打开LED
	if(state == LED_ON){
		// 置低电平
		GPIO_ResetBits(LED_G_GPIO_PORT,LED_G_GPIO_PIN);
	}else if(state == LED_OFF){
		// 置高电平
		GPIO_SetBits(LED_G_GPIO_PORT,LED_G_GPIO_PIN);
	}
}

// 状态反转
void ledToggle(){
	// 通过odr寄存器
	LED_G_GPIO_PORT->ODR ^=LED_G_GPIO_PIN;//  ODR:0000 LED_G_GPIO_PIN:0x0400   (主要看第二位)进行异或后:0000与0100异或结果为0100;ODR=0100 再次与LED_G_GPIO_PIN(0100)异或,异或后0000;依次循环实现状态反转
}
  • main.c
#include "stm32f10x.h"
#include "key.h"
#include "led.h"



int main(void){
	// 【1】通过按键轮询的方式点亮LED
	// 初始化Led和key
	keyInit();
	ledInit();
	while(1){
		if(keyScan(KEY_G_GPIO_PORT,KEY_G_GPIO_PIN) == KEY_ON){//判断用户是否按下
			// led的状态反转
			ledToggle();
		}
	}
}

3.中断方式

采用中断方式需要采用如下几步:

在这里插入图片描述

中断的初始化需要先初始化中断输入线,然后初始化NVIC中断控制器

在这里插入图片描述

使用中断也需要开启中断的时钟,时钟必须采用AFIO 。AFIO (alternate-function I/O)指 GPIO 端口的复用功能,GPIO 除了用作普通的输入输出( 主功能 ),还可以作为片上外设的复用输入输出,如串口,ADC,这些就是复用功能。大多数 GPIO 都有一个 默认复用功能 ,有的 GPIO 还有 重映射功能 , 重映射功能是指把原来属于 A 引脚的默认复用功能,转移到了B 引脚进行使用,前提是 B 引脚具有这个重映射功能当把 GPIO 用作 EXTI 外部中断 或使用 重映射功能 的时候,必须开启 AFIO时钟,而在使用 默认复用功能 的时候,就不必开启 AFIO 时钟了。

在这里插入图片描述

  • key.c
// 配置中断优先级
static void EXTI_NVIC_Config(){
	NVIC_InitTypeDef   NVIC_InitStruct;
	NVIC_InitStruct.NVIC_IRQChannel =EXTI9_5_IRQn;// IRQn通道使能,在stm32f10x.h中可以查找到
	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority =1;// 设置抢占优先级
	NVIC_InitStruct.NVIC_IRQChannelSubPriority= 1;// 设置响应优先级
	NVIC_InitStruct.NVIC_IRQChannelCmd= ENABLE;// 使能
	
	// 设置优先级的分组
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3);//3位抢占优先级,1位响应优先级
	NVIC_Init(&NVIC_InitStruct);// 初始化NVIC
}



// 中断方式初始化KEY
void keyByExti(){

// 临时变量	
	GPIO_InitTypeDef  GPIO_InitStruct;
	EXTI_InitTypeDef   EXTI_InitStruct;
	// 配置中断优先级
	EXTI_NVIC_Config();
	
	// 初始化GPIO
	RCC_APB2PeriphClockCmd(KEY_G_GPIO_CLK,ENABLE);// 开启时钟
	GPIO_InitStruct.GPIO_Pin = KEY_G_GPIO_PIN; 
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;// 上拉输入
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_10MHz;
	GPIO_Init(KEY_G_GPIO_PORT,&GPIO_InitStruct);// 初始化GPIO
	
	
	// 初始化EXTI
	//开启时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);// EXTI在APB2上,开启的是AFIO时钟
	GPIO_EXTILineConfig( GPIO_PortSourceGPIOB,  GPIO_PinSource9); // 开启PB9的时钟线
	
	// 中断初始化
	EXTI_InitStruct.EXTI_Line = EXTI_Line9;// 中断线
	EXTI_InitStruct.EXTI_Mode =EXTI_Mode_Interrupt;// 中断模式
	EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Falling;// 触发方式:下降沿(高->低)
	EXTI_InitStruct.EXTI_LineCmd = ENABLE;// 打开中断开关
	EXTI_Init(&EXTI_InitStruct);
}
  • key.h

在这里插入图片描述

  • mian.c

在这里插入图片描述

  • stm32f10x_it.c

在这里插入图片描述

三.源码下载

微信公众号,回复 中断源码 既可以获取本篇博文的源代码,如果有什么问题,后台留言我看见会第一时间回复你的喔。

在这里插入图片描述

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

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

相关文章

到墨西哥的液体货物国际快递怎么邮寄

到墨西哥的液体货物国际快递怎么邮寄?有些时候邮递到墨西哥的物品,采用国际快递是一种很好的国际货物运输方式,但如果货品是液体的话,相对而言便会复杂一些。以下是方联货运物流分享的一些对于如何邮递液体货物国际快递的意见及注意事项&…

认识进程 -了解进程调度

前言 本篇通过介绍操作系统OS的重要功能,了解并发并行, 了解操作系统的一项重要功能 “进程管理” , 通过了解进程管理认识进程是操作系统资源分配的基本单位 ,如有错误,请在评论区指正,让我们一起交流,共同进步! 文章…

< Linux > 多线程(线程概念 + 线程控制)

目录 1、Linux线程概念 什么是线程 简单使用线程 二级页表 线程的优点 线程的缺点 线程异常 线程用途 2、Linux进程 VS 线程 进程和线程 进程的多个线程共享 进程和线程的关系 3、Linux线程控制 POSIX线程库 线程创建pthread_create 获取线程ID pthread_self 线程等待pthrea…

31-java对象内存图

java对象内存图1.java内存分配介绍2.一个对象的内存图3.两个对象的内存图4. 两个引用指向同一个对象5. 基本数据类型和引用数据类型6. this关键字内存图6.1 就近原则的本质6.2 set/get赋值的本质6.3 小结1.java内存分配介绍 2.一个对象的内存图 3.两个对象的内存图 再创建第二个…

hive中时间函数 YYYY和yyyy,MM和mm,HH和hh 区别

yyyy-MM-dd HH:mm:ss 年-月-日 时:分:秒 YYYY 和 yyyy 区别 y/YMeaning解释yyear-of-era元年,我们平时理解的年;20221231认为是2022年Yweek-based-year基于周的年,只要日期那周跨年,都算下一年;2020-12-27周日&#x…

Canvas

canvas介绍 什么是 Canvas?Canvas 是为了解决 Web 页面中只能显示静态图片这个问题而提出的,一个可以使用 JavaScript 等脚本语言向其中绘制图像的 HTML 标签。 Canvas 解决了什么问题 我在 MSDN(《Microsoft Developer Network》是微软一…

金三银四面试热潮将至,靠这一份软件测试面经,offer拿到手软

不知不觉又到了新一年的金三银四, 去年的疫情紧张,造成的一系列影响我相信大家都还历历在目,尤其是工作这块更是如此,找工作的紧迫度,导致很大部分人群在工作发展可能并没有想象中的那样迅速。 作为一名在职的测试人员…

BI数据可视化分析|套用方案,第一时间摸清家底

奥威BI软件的通用标准方案是一套从17年经验中针对性整理而来的一套标准化的数据分析解决方案,无缝对接金蝶、用友全版本ERP,覆盖财务、库存、采购、销售多个主题,提供多个实用型数据分析模型和BI数据可视化报表,套用即生效&#x…

如何解决执行webgoat-2023.4遇到的错误java.lang.UnsupportedClassVersionError

问题执行java -jar webgoat-2023.4.jar报如下错误,Exception in thread “main“ java.lang.UnsupportedClassVersionError,报错截图:2. 原因jvm(java命令)和jdk(javac命令)版本不一致。如果是w…

前沿气候预测方法(精选)

气候预测方法ClimaxGraphcastCLCRNEarthformerPangu另一些值得关注的方法物理约束相关模型模式误差订正模型时空预测模型其他总结Climax 基于vit的backbone 不同尺度的lead time 输入的每个时间片都像往常一样经过变量标记化、变量聚合和注意层,输出形状为T ℎ …

CAN总线协议

阅读指引:术语过多,故各术语在第一次出现时解释,跳读时遇到不明的词可向上搜索看看;信息量过大,很多细节没有展开,正文只写多数人可以了解的基础知识,请按需点击文中链接阅读更多详情。1 综述CA…

9 自编码器(Auto encoder)及python实现

1 数据集介绍 1.1 Mnist 手写数字数据库 (LeCun 在1998年创造) (1)手写数字 0-9共10类 (2)训练样本60000个,测试样本10000个。 (3)图像大小 28*28 二值图像。 &#xf…

[深入理解SSD系列 闪存实战2.1.5] NAND FLASH基本读操作及原理_NAND FLASH Read Operation源码实现

前言 上面是我使用的NAND FLASH的硬件原理图,面对这些引脚,很难明白他们是什么含义, 下面先来个热身: 问1. 原理图上NAND FLASH只有数据线,怎么传输地址? 答1.在DATA0~DATA7上既传输数据,又传输地址 当ALE为高电平时传输的是地址, 问2. 从NAND FLASH芯片手册可知,要…

TryHackMe-Lockdown(boot2root)

Lockdown 停留在 127.0.0.1。穿255.255.255.0。 端口扫描 循例 nmap Web枚举 进入80 发现跳转到了contacttracer.thm,将其添加进/etc/hosts 这里试了一下注入 结果这就进去了 在后台逛了一圈,最后还是把目光放在了图片上传点 试了一会,貌似…

SVN 版本控制软件

SVN 版本控制软件 属于C/S结构软件(客户端与服务端) 服务端软件:VisualSVN 网址:Downloads | VisualSVN 下载好:VisualSVN-Server-5.1.3-x64.msi 客户端软件:TortoiseSVN 网址:http://tor…

AI技术的应用场景和要注意的问题

AI技术可以应用到许多不同的业务场景中,以下这些仅仅是AI技术的一些应用场景,实际上,AI技术可以应用于任何需要处理大量数据、自动化决策和复杂问题的领域。今天和大家分享一下AI技术的应用场景和要注意的问题,希望对大家有所帮助…

借助采购管理数字化解决方案 帮助企业解决传统采购痛点

当今各行业热烈竞争中,企业最终服务交付的效率和质量是这个时代最重要的要素。传统的采购流程工作涉及大量的文书工作,且耗时长,往往容易出现操作出错,造成企业在成本上的大量损失。 作为管理者,企业采购决定你的业务…

2018年MathorCup数学建模B题品牌手机目标用户的精准营销解题全过程文档及程序

2018年第八届MathorCup高校数学建模挑战赛 A题 品牌手机目标用户的精准营销 原题再现: 随着我国电子商务和移动支付的快速发展,手机已经成为人们必不可少的工具。除了常规的通讯功能外, 手机还可以进行购物、支付、娱乐、学习和交流等。因此, 选择一个什么样的手机…

比特币仍使投资者悲观!数字美元可能会使加密货币清零?

当谈到比特币时,投资者仍然感到悲观。政府严厉的监管打击,美联储加息提速以及FTX的牺牲品——Silvergate的倒闭等因素,都在催促投资者要么卖出,要么坐以待毙。 FTX崩塌后,余波未了。在这几个月里,监管机构纷…

易优cms SQL获取数据库内容的标签

SQL获取数据库内容的标签 【基础用法】 标签:sql 描述:用于获取MySQL数据库内容的标签。 用法: {eyou:sql sql cachetime3600 empty没有数据} {$field.数据表相应的字段名称} {/eyou:sql} 属性: sql 需要查询的SQL语句 …