【STC15库函数上手笔记】7、PCA与PWM

目录

  • 硬知识
    • 硬件知识
      • CCP/PWM/PCA模块的结构
    • 软件知识
      • PCA初始化函数
      • PWM更新占空比函数
  • 测试程序
    • PWM模式产生PWM信号
      • main.c
      • 实验现象
    • 16位软件定时器模式模式产生PWM信号
      • main.c
      • 实验现象
    • 捕获模式测量周期长度
      • main.c
      • 实验现象

STC实验箱4
IAP15W4K58S4
Keil uVision V5.29.0.0
PK51 Prof.Developers Kit Version:9.60.0.0


硬知识

硬件知识

       摘自《STC15系列单片机器件手册
       STC15系列部分单片机集成了3路可编程计数器阵列(CCP/PCA)模块(STC15W4K32S4系列单片机只有两路CCP/PCA),可用于软件定时器、外部脉冲的捕捉、高速脉冲输出以及脉宽调制(PWM)输出。
       下表总结了STC15系列单片机内部集成了CCP/PCA/PM功能的单片机型号:
在这里插入图片描述
       上表中√表示对应的系列有相应的功能。
在这里插入图片描述

CCP/PWM/PCA模块的结构

       STC15系列部分单片机有3路可编程计数器阵列CCP/PCA/PWM(通过AUXR1/P_SW1寄存器可以设置CCP/PCA/PWM从P1口切换到P2口切换到P3口)。
       PCA含有一个特殊的16位定时器,有3个16位的捕获/比较模块与之相连,如下图所示。
在这里插入图片描述
       每个模块可编程工作在4种模式下:上升/下降沿捕获、软件定时器、高速脉冲输出或可调制脉冲输出。
       16位PCA定时器/计数器是3个模块的公共时间基准,其结构如下图所示。
在这里插入图片描述

软件知识

       摘自《STC库函数使用参考

PCA初始化函数

PCA_Init
在这里插入图片描述
PCA_id:选择要初始化的PCA通道:在这里插入图片描述
PCA_InitTypeDef的定义见于文件"PCA.H".

typedef struct
{u8 PCA_IoUse;u8 PCA_Clock; u8 PCA_Mode; u8 PCA_PWM_Wide;u8 PCA_Interrupt_Mode; u8 PCA_Polity;u16 PCA_Value;
} PCA_InitTypeDef;

PCA_IoUse:选择PCA使用的IO:初始化PCA_Counter时的取值,初始化PCA0~PCA2时忽略
在这里插入图片描述
PCA_Clock:选择PCA使用的时钟:初始化PCA_Counter时的取值,初始化PCA0~PCA2时忽略在这里插入图片描述
PCA_Mode:设置PCA通道的工作模式:初始化PCA0~PCA2时的取值,初始化PCA_Counter时忽略
在这里插入图片描述
PCA_PWM_Wide:设置PCA通道工作于PWM模式时的PWM宽度:初始化PCA0~PCA2工作于PWM模式时的取值,初始化PCA_Counter时或PCA通道其它模式时忽略
在这里插入图片描述
PCA_Interrupt_Mode:中断允许或禁止:初始化PCA0~PCA2时的取值,初始化PCA_Counter时忽略在这里插入图片描述
注意:上面的参数可以做如下组合:

PCA_InitStructure.PCA_Interrupt_Mode = PCA_Fall_Active | ENABLE; //下降沿中断,允许中断。
PCA_InitStructure.PCA_Interrupt_Mode = PCA_Rise_Active | ENABLE; //上升沿中断,允许中断。
PCA_InitStructure.PCA_Interrupt_Mode = PCA_Rise_Active | PCA_Fall_Active | ENABLE; //上升沿、下降沿中断,允许中断。

如果后面使用了| DISABLE,则中断被禁止。

PCA_Polity:中断的优先级:初始化PCA_Counter时的取值,初始化PCA0~PCA2时忽略在这里插入图片描述
PCA_Value:设置PCA通道的初值。初始化PCA0~PCA2时的取值,初始化PCA_Counter时忽略

PWM更新占空比函数

UpdatePwm
在这里插入图片描述

测试程序

PWM模式产生PWM信号

PCA.c里的UpdatePwm函数默认是被注释掉的,需要解除注释:
在这里插入图片描述

main.c

#include "./Drivers/config.h"
#include "./Drivers/delay.h"#include "./Drivers/GPIO.h"
#include "./Drivers/PCA.h"void GPIO_config(void)
{GPIO_InitTypeDef GPIO_InitStructure;					//结构定义GPIO_InitStructure.Mode = GPIO_OUT_PP;					//指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PPGPIO_InitStructure.Pin  = GPIO_Pin_5 | GPIO_Pin_6;		//指定要初始化的IO, 或操作GPIO_Inilize(GPIO_P2, &GPIO_InitStructure);				//P2.5、P2.6初始化为推挽输出
}void PCA_config(void)
{PCA_InitTypeDef PCA_InitStructure;PCA_InitStructure.PCA_Mode     = PCA_Mode_PWM;		//PCA_Mode_PWM, PCA_Mode_Capture, PCA_Mode_SoftTimer, PCA_Mode_HighPulseOutputPCA_InitStructure.PCA_PWM_Wide = PCA_PWM_8bit;		//PCA_PWM_8bit, PCA_PWM_7bit, PCA_PWM_6bitPCA_InitStructure.PCA_Interrupt_Mode = DISABLE;		//PCA_Rise_Active, PCA_Fall_Active, ENABLE, DISABLEPCA_InitStructure.PCA_Value    = (u16)((1 << 8) * (1 - 0.5));//对于软件定时, 为匹配比较值PCA_Init(PCA0,&PCA_InitStructure);PCA_InitStructure.PCA_Mode     = PCA_Mode_PWM;		//PCA_Mode_PWM, PCA_Mode_Capture, PCA_Mode_SoftTimer, PCA_Mode_HighPulseOutputPCA_InitStructure.PCA_PWM_Wide = PCA_PWM_7bit;		//PCA_PWM_8bit, PCA_PWM_7bit, PCA_PWM_6bitPCA_InitStructure.PCA_Interrupt_Mode = DISABLE;		//PCA_Rise_Active, PCA_Fall_Active, ENABLE, DISABLEPCA_InitStructure.PCA_Value    = (u16)((1 << 7) * (1 - 0.5));//对于软件定时, 为匹配比较值PCA_Init(PCA1,&PCA_InitStructure);PCA_InitStructure.PCA_Clock    = PCA_Clock_1T;		//PCA_Clock_1T, PCA_Clock_2T, PCA_Clock_4T, PCA_Clock_6T, PCA_Clock_8T, PCA_Clock_12T, PCA_Clock_Timer0_OF, PCA_Clock_ECIPCA_InitStructure.PCA_IoUse    = PCA_P24_P25_P26_P27;//PCA_P12_P11_P10_P37, PCA_P34_P35_P36_P37, PCA_P24_P25_P26_P27PCA_InitStructure.PCA_Interrupt_Mode = DISABLE;		//ENABLE, DISABLEPCA_InitStructure.PCA_Polity   = PolityHigh;		//优先级设置	PolityHigh,PolityLowPCA_Init(PCA_Counter,&PCA_InitStructure);
}void main(void)
{GPIO_config();PCA_config();UpdatePwm(PCA0, (1 << 8) * (1 - 0.75));UpdatePwm(PCA1, (1 << 7) * (1 - 0.25));while(1){}
}

实验现象

PWM频率 = PCA时钟频率 / 2PWM位数2^{PWM位数}2PWM
在这里插入图片描述
30MHz/1/28=117187.5Hz30MHz / 1 / 2^8 = 117187.5 Hz30MHz/1/28=117187.5Hz
在这里插入图片描述
30MHz/1/27=234375Hz30MHz / 1 / 2^7 = 234375 Hz30MHz/1/27=234375Hz
在这里插入图片描述

16位软件定时器模式模式产生PWM信号

PWM频率 = PCA时钟频率 / PWMx_DUTY

修改PCA.h中的PWMx_DUTY
在这里插入图片描述
修改PCA_Handler内的对应引脚
在这里插入图片描述

//========================================================================
// 函数: void	PCA_Handler (void) interrupt PCA_VECTOR
// 描述: PCA中断处理程序.
// 参数: None
// 返回: none.
// 版本: V1.0, 2012-11-22
//========================================================================
void	PCA_Handler (void) interrupt PCA_VECTOR
{if(CCF0)		//PCA模块0中断{CCF0 = 0;		//清PCA模块0中断标志if(P25)	CCAP0_tmp += PCA_Timer0;	//输出为高电平,则给影射寄存器装载高电平时间长度else	CCAP0_tmp += PWM0_low;	//输出为低电平,则给影射寄存器装载低电平时间长度CCAP0L = (u8)CCAP0_tmp;			//将影射寄存器写入捕获寄存器,先写CCAP0LCCAP0H = (u8)(CCAP0_tmp >> 8);	//后写CCAP0H}if(CCF1)	//PCA模块1中断{CCF1 = 0;		//清PCA模块1中断标志if(P26)	CCAP1_tmp += PCA_Timer1;	//输出为高电平,则给影射寄存器装载高电平时间长度else	CCAP1_tmp += PWM1_low;	//输出为低电平,则给影射寄存器装载低电平时间长度CCAP1L = (u8)CCAP1_tmp;			//将影射寄存器写入捕获寄存器,先写CCAP0LCCAP1H = (u8)(CCAP1_tmp >> 8);	//后写CCAP0H}if(CCF2)	//PCA模块2中断{CCF2 = 0;		//清PCA模块1中断标志if(P27)	CCAP2_tmp += PCA_Timer2;	//输出为高电平,则给影射寄存器装载高电平时间长度else	CCAP2_tmp += PWM2_low;	//输出为低电平,则给影射寄存器装载低电平时间长度CCAP2L = (u8)CCAP2_tmp;			//将影射寄存器写入捕获寄存器,先写CCAP0LCCAP2H = (u8)(CCAP2_tmp >> 8);	//后写CCAP0H}if(CF)	//PCA溢出中断{CF = 0;			//清PCA溢出中断标志}}

main.c

#include "./Drivers/config.h"
#include "./Drivers/delay.h"#include "./Drivers/GPIO.h"
#include "./Drivers/PCA.h"void GPIO_config(void)
{GPIO_InitTypeDef GPIO_InitStructure;					//结构定义GPIO_InitStructure.Mode = GPIO_OUT_PP;					//指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PPGPIO_InitStructure.Pin  = GPIO_Pin_5 | GPIO_Pin_6;		//指定要初始化的IO, 或操作GPIO_Inilize(GPIO_P2, &GPIO_InitStructure);				//P2.5、P2.6初始化为推挽输出
}void PCA_config(void)
{PCA_InitTypeDef PCA_InitStructure;PCA_InitStructure.PCA_Mode     = PCA_Mode_HighPulseOutput;	//PCA_Mode_PWM, PCA_Mode_Capture, PCA_Mode_SoftTimer, PCA_Mode_HighPulseOutputPCA_InitStructure.PCA_PWM_Wide = 0;							//PCA_PWM_8bit, PCA_PWM_7bit, PCA_PWM_6bitPCA_InitStructure.PCA_Interrupt_Mode = ENABLE;				//PCA_Rise_Active, PCA_Fall_Active, ENABLE, DISABLEPCA_InitStructure.PCA_Value    = 65535;						//对于软件定时, 为匹配比较值PCA_Init(PCA0,&PCA_InitStructure);PCA_InitStructure.PCA_Mode     = PCA_Mode_HighPulseOutput;	//PCA_Mode_PWM, PCA_Mode_Capture, PCA_Mode_SoftTimer, PCA_Mode_HighPulseOutputPCA_InitStructure.PCA_PWM_Wide = 0;							//PCA_PWM_8bit, PCA_PWM_7bit, PCA_PWM_6bitPCA_InitStructure.PCA_Interrupt_Mode = ENABLE;				//PCA_Rise_Active, PCA_Fall_Active, ENABLE, DISABLEPCA_InitStructure.PCA_Value    = 65535;						//对于软件定时, 为匹配比较值PCA_Init(PCA1,&PCA_InitStructure);PCA_InitStructure.PCA_Clock    = PCA_Clock_12T;				//PCA_Clock_1T, PCA_Clock_2T, PCA_Clock_4T, PCA_Clock_6T, PCA_Clock_8T, PCA_Clock_12T, PCA_Clock_Timer0_OF, PCA_Clock_ECIPCA_InitStructure.PCA_IoUse    = PCA_P24_P25_P26_P27;		//PCA_P12_P11_P10_P37, PCA_P34_P35_P36_P37, PCA_P24_P25_P26_P27PCA_InitStructure.PCA_Interrupt_Mode = DISABLE;				//ENABLE, DISABLEPCA_InitStructure.PCA_Polity   = PolityHigh;				//优先级设置	PolityHigh,PolityLowPCA_Init(PCA_Counter, &PCA_InitStructure);
}void main(void)
{GPIO_config();PCA_config();PWMn_Update(PCA0, (u16)(PWM0_DUTY * 0.75));PWMn_Update(PCA1, (u16)(PWM1_DUTY * 0.25));EA = 1;while(1){}
}

实验现象

30MHz/12/50000=50Hz30MHz / 12 / 50000 = 50 Hz30MHz/12/50000=50Hz
在这里插入图片描述
在这里插入图片描述

捕获模式测量周期长度

修改PCA.c内的PCA_Handler
在这里插入图片描述

//========================================================================
// 函数: void	PCA_Handler (void) interrupt PCA_VECTOR
// 描述: PCA中断处理程序.
// 参数: None
// 返回: none.
// 版本: V1.0, 2012-11-22
//========================================================================
void	PCA_Handler (void) interrupt PCA_VECTOR
{if(CCF0)		//PCA模块0中断{CCF0 = 0;		//清PCA模块0中断标志if(P25)	CCAP0_tmp += PCA_Timer0;	//输出为高电平,则给影射寄存器装载高电平时间长度else	CCAP0_tmp += PWM0_low;	//输出为低电平,则给影射寄存器装载低电平时间长度CCAP0L = (u8)CCAP0_tmp;			//将影射寄存器写入捕获寄存器,先写CCAP0LCCAP0H = (u8)(CCAP0_tmp >> 8);	//后写CCAP0H}if(CCF1)	//PCA模块1中断{CCF1 = 0;		//清PCA模块1中断标志if(PCA1_mode >= PCA_Mode_SoftTimer)		//PCA_Mode_SoftTimer and PCA_Mode_HighPulseOutput{CCAP1_tmp += PCA_Timer1;CCAP1L = (u8)CCAP1_tmp;			//将影射寄存器写入捕获寄存器,先写CCAP0LCCAP1H = (u8)(CCAP1_tmp >> 8);	//后写CCAP0H}else if(PCA1_mode == PCA_Mode_Capture){CCAP1_tmp = CCAP1H;	//读CCAP1HCCAP1_tmp = (CCAP1_tmp << 8) + CCAP1L;B_Capture1 = 1;}}if(CCF2)	//PCA模块2中断{CCF2 = 0;		//清PCA模块1中断标志if(P27)	CCAP2_tmp += PCA_Timer2;	//输出为高电平,则给影射寄存器装载高电平时间长度else	CCAP2_tmp += PWM2_low;	//输出为低电平,则给影射寄存器装载低电平时间长度CCAP2L = (u8)CCAP2_tmp;			//将影射寄存器写入捕获寄存器,先写CCAP0LCCAP2H = (u8)(CCAP2_tmp >> 8);	//后写CCAP0H}if(CF)	//PCA溢出中断{CF = 0;			//清PCA溢出中断标志}}

main.c

#include "./Drivers/config.h"
#include "./Drivers/delay.h"#include "./Drivers/GPIO.h"
#include "./Drivers/PCA.h"#include "./Drivers/soft_UART.h"
#include <stdio.h>char putchar(char Char)
{TxSend(Char);return Char;
}void GPIO_config(void)
{GPIO_InitTypeDef GPIO_InitStructure;					//结构定义GPIO_InitStructure.Mode = GPIO_OUT_PP;					//指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PPGPIO_InitStructure.Pin  = GPIO_Pin_5;					//指定要初始化的IO, 或操作GPIO_Inilize(GPIO_P2, &GPIO_InitStructure);				//P2.5初始化为推挽输出
}void PCA_config(void)
{PCA_InitTypeDef PCA_InitStructure;PCA_InitStructure.PCA_Mode     = PCA_Mode_HighPulseOutput;	//PCA_Mode_PWM, PCA_Mode_Capture, PCA_Mode_SoftTimer, PCA_Mode_HighPulseOutputPCA_InitStructure.PCA_PWM_Wide = 0;							//PCA_PWM_8bit, PCA_PWM_7bit, PCA_PWM_6bitPCA_InitStructure.PCA_Interrupt_Mode = ENABLE;				//PCA_Rise_Active, PCA_Fall_Active, ENABLE, DISABLEPCA_InitStructure.PCA_Value    = 65535;						//对于软件定时, 为匹配比较值PCA_Init(PCA0,&PCA_InitStructure);PCA_InitStructure.PCA_Mode     = PCA_Mode_Capture;	//PCA_Mode_PWM, PCA_Mode_Capture, PCA_Mode_SoftTimer, PCA_Mode_HighPulseOutputPCA_InitStructure.PCA_PWM_Wide = 0;					//PCA_PWM_8bit, PCA_PWM_7bit, PCA_PWM_6bitPCA_InitStructure.PCA_Interrupt_Mode = PCA_Fall_Active | ENABLE;	//(PCA_Rise_Active, PCA_Fall_Active) or (ENABLE, DISABLE)PCA_InitStructure.PCA_Value    = 0;					//对于捕捉, 这个值没意义PCA_Init(PCA1,&PCA_InitStructure);PCA_InitStructure.PCA_Clock    = PCA_Clock_12T;				//PCA_Clock_1T, PCA_Clock_2T, PCA_Clock_4T, PCA_Clock_6T, PCA_Clock_8T, PCA_Clock_12T, PCA_Clock_Timer0_OF, PCA_Clock_ECIPCA_InitStructure.PCA_IoUse    = PCA_P24_P25_P26_P27;		//PCA_P12_P11_P10_P37, PCA_P34_P35_P36_P37, PCA_P24_P25_P26_P27PCA_InitStructure.PCA_Interrupt_Mode = DISABLE;				//ENABLE, DISABLEPCA_InitStructure.PCA_Polity   = PolityHigh;				//优先级设置	PolityHigh,PolityLowPCA_Init(PCA_Counter, &PCA_InitStructure);
}u16	Cap_time;	//上一次捕捉时间void main(void)
{u16 j;Cap_time = 0;GPIO_config();PCA_config();PWMn_Update(PCA0, (u16)(PWM0_DUTY * 0.75));EA = 1;while(1){if(B_Capture1){B_Capture1 = 0;j = CCAP1_tmp - Cap_time;	//计算时间差Cap_time = CCAP1_tmp;printf("%d us\r\n", (int)(j * 12. / 30));}delay_ms(1);}
}

实验现象

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

单元测试概述

盖种测试 1.语句覆盖&#xff1a;语句覆盖是几个测试用例的设计&#xff0c;通过测试程序运行。使每一个可以运行的语句至少运行一次。 2.判定覆盖&#xff08;也叫分支覆盖&#xff09;&#xff1a;设计若干个測试用例。运行所測程序&#xff0c;使程序中每一个…

JQuery官方学习资料(译):遍历JQuery对象和非JQuery对象

JQuery提供了一个对象遍历的Utility方法$.each()和一个JQuery集合遍历方法.each()。$.each()$.each()是一个通用的方法用来遍历对象和数组&#xff0c;Plain对象是通过其命名属性进行遍历的。$.each()可以用来替换传统的for和for-in循环。var sum 0;var arr [ 1, 2, 3, 4, 5 …

【STC15库函数上手笔记】8、比较器

目录库函数compare.ccompare.hSTC15Fxxxx.H测试程序main.cSTC实验箱4 IAP15W4K58S4 Keil uVision V5.29.0.0 PK51 Prof.Developers Kit Version:9.60.0.0 库函数 比较器的库函数仅在官方例程中发现&#xff0c;未与其他库函数放在一起&#xff0c;笔者也未对其进行测试&…

WIN10 下 PHP7 中文乱码的解决办法

在数据提交前&#xff0c;插入语句 mysqli_set_charset($conn,utf8);

不会几个框架,都不好意思说搞过前端: Vue.js - 60分钟快速入门

Vue.js——60分钟快速入门 Vue.js是当下很火的一个JavaScript MVVM库&#xff0c;它是以数据驱动和组件化的思想构建的。相比于Angular.js&#xff0c;Vue.js提供了更加简洁、更易于理解的API&#xff0c;使得我们能够快速地上手并使用Vue.js。 本文摘自&#xff1a;http://www…

指针以及内存分配

原文&#xff1a;http://blog.csdn.net/bizhu12/article/details/6532235 1. 指针很灵活,这使得指针很难管理,在定义指针时,将在栈中开辟一块内存存放指针的地址(栈内的内存由系统分配和释放),指针的地址内存只是存放指针的地址,不存放指针指向的数据,值得注意的是,定义指针时指…

建议11: 区别对待==和Equals

建议11&#xff1a; 区别对待和Equals在开始本建议之前&#xff0c;首先要明确概念“相等性”。CLR中将“相等性”分为两类&#xff1a;“值相等性”和“引用相等性”。如果用来比较的两个变量所包含的数值相等&#xff0c;那么将其定义为“值相等性”&#xff1b;如果比较的两…

mysql如何修改开启允许远程连接

关于mysql远程连接的问题&#xff0c;大家在公司工作中&#xff0c;经常会遇到mysql数据库存储于某个人的电脑上&#xff0c;大家要想连接mysql服务&#xff0c;装有mysql服务的电脑就必须开启远程连接 第一步&#xff0c;用dos连接上你的数据库&#xff0c;&#xff08;我这里…

Objective-C马路成魔【14-关键C语言功能】

郝萌主倾心贡献&#xff0c;尊重作者的劳动成果&#xff0c;请勿转载。 假设文章对您有所帮助&#xff0c;欢迎给作者捐赠&#xff0c;支持郝萌主。捐赠数额任意&#xff0c;重在心意^_^ 我要捐赠: 点击捐赠 Cocos2d-X源代码下载&#xff1a;点我传送 这里介绍一些特性&#x…

Solidworks如何自动打开和关闭特征识别FeatureWorks

如果直接对已有的零件识别特征&#xff0c;可能会报错 删除多余的特征&#xff0c;先只保留一个输入&#xff08;注意没有必要连草图也删掉&#xff0c;草图不会影响识别特征&#xff0c;你识别完了之后草图再接着该拉伸拉伸&#xff0c;该切除切除&#xff09;&#xff0c;然后…

SPI驱动0.96/1.3寸 OLED屏幕,易修改为DMA控制

目录OLED SPI 端口定义七针OLED引脚定义六针OLED引脚定义驱动程序oled.coled.holedfont.h使用main.c实验现象STC实验箱4 IAP15W4K58S4 Keil uVision V5.29.0.0 PK51 Prof.Developers Kit Version:9.60.0.0 DMA控制见【0.96寸 OLED屏实现1500Fps的帧率】STM32 软件、硬件SPI、…

分享网页到微信朋友圈的官方接口

看到 JiaThis 增加了微信分享的按钮&#xff0c;查看了下网络请求&#xff0c;是官方提供的接口&#xff0c;不过官方文档还没有这方面的信息。这个接口应该是合作测试中的&#xff0c;不排除以后会更改或者停用。 目前分享到微信朋友圈不同于通常的分享&#xff0c;需要先向微…

WordPress PHP Fatal Error “Maximum execution time of 30 seconds exceeded” 的解决办法

修改Wp-config.php 在wp-config.php中增加一行&#xff0c;注意在/* That’s all, stop editing! Happy blogging. */”这一行之前加入&#xff1a; set_time_limit(60); https://blog.csdn.net/cnpinpai/article/details/84575015

上传图片在页面上显示

看了别人写的 自己照着写了一下 <% page language"java" import"java.util.*" pageEncoding"UTF-8"%> <% String path request.getContextPath(); String basePath request.getScheme()"://"request.getServerName()"…

Codeforces Round #307 (Div. 2) A. GukiZ and Contest 水题

A. GukiZ and Contest Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/551/problem/A Description Professor GukiZ likes programming contests. He especially likes to rate his students on the contests he prepares. Now, he has deci…

提高你的Java代码质量吧:使用valueof前必须进行校验

一、分析 每个枚举都是java.lang.Enum的子类&#xff0c;都可以访问Enum类提供的方法&#xff0c;比如hashCode、name、valueOf等&#xff0c;其中valueOf方法会把一个String类型的名称转变成枚举项&#xff0c;也就是在枚举项中查找字面值和该参数相等的枚举项。 我们来深入…

【STC15库函数上手笔记】9、硬件SPI

目录硬件知识库函数spi.cspi.h测试main.c实验现象STC实验箱4 IAP15W4K58S4 Keil uVision V5.29.0.0 PK51 Prof.Developers Kit Version:9.60.0.0 硬件知识 摘自《STC15系列单片机器件手册》 STC15系列单片机还提供另一种高速串行通信接口——SPI接口。SPI是一种全双工…

中介者模式分析、结构图及基本代码

&#xfeff;&#xfeff;定义&#xff1a;用一个中介对象来封装一系列的对象交互。中介者使各对象不须要显式地相互引用。从而使其耦合松散&#xff0c;并且能够独立地改变它们之间的交互。适用地方&#xff1a;中介者模式一般应用于一组对象以定义良好可是复杂的方式进行通信…

WordPress 数据库结构及表字段作用解析

对于WordPress的开发可以说子凡已经是如痴如醉了&#xff0c;通过 WordPress 本身的开放性接口可以做到很多的事情&#xff0c;但是有些时候我们可能更喜欢直接查询数据库来实现某些 WordPress 没有提供的函数来实现目的&#xff0c;所以这时候我们就需要对WordPress 数据库的结…

硬件负载均衡设备介绍

最常用是F5 与citrix netscaler 负载均衡分全局负载均衡和本地负载均衡。 地负载均衡是指对本地的服务器群做负载均衡&#xff0c;全局负载均衡是指对分别放置在不同的地理位置、有不同网络结构的服务器群间作负载均衡。 循环DNS 就是每次解析域名时指向IP loop list 里的下一个…