当前位置: 首页 > wzjs >正文

商业网站的基本构成百度快照比网站上线时间早

商业网站的基本构成,百度快照比网站上线时间早,需要做网站的公司在哪些,网页被禁用了怎么解除目录 前言 技术实现 原理图 连线图 代码实现 内容要点 PWM基本结构 开启外设时钟 配置GPIO端口 配置时基单元 初始化输出比较单元 输出比较通道重映射 输入捕获功能初始化 计算捕获PWM的频率 实验结果 问题记录 前言 IC(Input Capture)输…

目录

前言

技术实现 

原理图

连线图

代码实现 

内容要点

PWM基本结构

开启外设时钟

配置GPIO端口

配置时基单元

 初始化输出比较单元

输出比较通道重映射 

输入捕获功能初始化

 计算捕获PWM的频率

实验结果

问题记录


前言

 IC(Input Capture)输入捕获, 输入捕获模式下,当通道输入引脚出现指定电平跳变时,当前CNT的值将被锁存到CCR中,可用于测量PWM波形的频率、占空比、脉冲间隔、电平持续时间等参数,每个高级定时器和通用定时器都拥有4个输入捕获通道,可配置为PWMI模式,同时测量频率和占空比,可配合主从触发模式,实现硬件全自动测量。

技术实现 

原理图

连线图

代码实现 

main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"						//延时函数
#include "OLED.h"
#include "PWM.h"
#include "IC.h"int main(void)
{OLED_Init();PWM_Init();IC_Init();/**@note也可以在PWM_Init中将结构体TIM_OCInitStruct成员TIM_Prescaler设置为720-1,**		将成员TIM_Pulse的值设置为50代替此处两个函数调用**/PWM_SetCompler(720-1);				//Freq = 72MHz / (PSC + 1) / 100PWM_SetComparel(50);				//Duty = CCR / 100OLED_ShowString(1,1,"Freq:00000Hz");while(1){OLED_ShowNum(1,6,IC_GetFreq(),5);}
}

PWM.h 

#ifndef __PWM_H__
#define __PWM_H__#include "stm32f10x.h"                  // Device headervoid PWM_Init(void);
void PWM_SetComparel(uint16_t Compare);
void PWM_SetCompler(uint16_t Prescaler);#endif

PWM.c

#include "PWM.h"/*** @brief	PWM初始化函数* @param  None* @retval None* @note   输出频率为1kHz,占空比为50%,分辨率为1%的PWM波形
**/
void PWM_Init(void)
{/*开启时钟*/RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);						//开启TIM2时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);					//开启GPIOA时钟
//	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);						//开启AFIO时钟
//	
//	/*
//		引脚重映射
//	*/
//	GPIO_PinRemapConfig(GPIO_PartialRemap1_TIM2,ENABLE);					//将TIM2的CH1从PA0重映射到PA15
//	/*
//		解除引脚复用
//	*/
//	GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);					//PA15引脚默认作为JTD1功能使用,此处解除AFIO的JTAG复用/*配置端口*/GPIO_InitTypeDef GPIO_InitStruct;								 		//定义结构体GPIO_InitStruct.GPIO_Pin 	= GPIO_Pin_0;				 				//选择PA0    //重映射到GPIO_Pin_15GPIO_InitStruct.GPIO_Mode 	= GPIO_Mode_AF_PP;							//复用推挽输出,将引脚的控制权交给片上外设GPIO_InitStruct.GPIO_Speed 	= GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStruct);/*选择TIM时钟*/TIM_InternalClockConfig(TIM2);/*配置时基单元*/TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;							//定义一个TIM_TimeBaseInitTypeDef类型的结构体用于初始化时基单元TIM_TimeBaseInitStruct.TIM_ClockDivision     = TIM_CKD_DIV1;			//设置时钟分频模式为不分TIM_TimeBaseInitStruct.TIM_CounterMode       = TIM_CounterMode_Up;		//计数方式设置为向上计数模式/*输出的PWM波形的频率为1kHz,分辨率为1%PWM频率:	Freq = CK_PSC / (PSC + 1) / (ARR + 1)PWM占空比:	Duty = CCR / (ARR + 1)PWM分辨率:	Reso = 1 / (ARR + 1)*/TIM_TimeBaseInitStruct.TIM_Period            = 100-1;					//ARR,自动加载重装寄存器,要写入自动重装值TIM_TimeBaseInitStruct.TIM_Prescaler         = 720-1;					//PSC,预分频器的分频值TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0;						//重复计数,只有高级定时器才会使用,通用定时器用不到TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStruct);							//初始化时基单元/*初始化输出比较单元*/TIM_OCInitTypeDef TIM_OCInitStruct;										//定义一个TIM_OCInitTypeDef类型的结构体用以输出比较单元初始化TIM_OCStructInit(&TIM_OCInitStruct);									//给每个结构体成员赋初始值,防止因未使用到的结构体成员未初始化而导致程序出现错误TIM_OCInitStruct.TIM_OCMode 		= TIM_OCMode_PWM1;					//选择PWM模式1TIM_OCInitStruct.TIM_OCPolarity 	= TIM_OCPolarity_High;				//OC1有效电平为高电平TIM_OCInitStruct.TIM_OutputState 	= TIM_OutputState_Enable;			//输出比较使能/*输出PWM的波形占空比PWM占空比:	Duty = CCR / (ARR + 1)*/TIM_OCInitStruct.TIM_Pulse 			= 0;								//CCR,捕获/比较器,本工程中有封装的函数用于改变占空比,此处先设置为0TIM_OC1Init(TIM2,&TIM_OCInitStruct);TIM_Cmd(TIM2,ENABLE);													//启动TIM2
}/*** @brief	指定CCR寄存器的值改变PWM Duty* @param  None* @retval None* @note   None
**/
void PWM_SetComparel(uint16_t Compare)
{TIM_SetCompare1(TIM2,Compare);
}/*** @brief	修改PSC寄存器的值* @param  None* @retval None* @note   None
**/
void PWM_SetCompler(uint16_t Prescaler)
{TIM_PrescalerConfig(TIM2,Prescaler,TIM_PSCReloadMode_Immediate);								//配置预分频器的值
}

 IC.h

#ifndef __IC_H__
#define __IC_H__#include "stm32f10x.h"                  // Device headervoid IC_Init(void);
uint32_t IC_GetFreq(void);#endif

IC.c 

#include "IC.h"/*** @brief	IC初始化* @param  None* @retval None* @note   使用TIM3进行输入捕获
**/
void IC_Init(void)
{/*开启时钟*/RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);						//开启TIM2时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);					//开启GPIOA时钟GPIO_InitTypeDef GPIO_InitStruct;								 		//定义结构体GPIO_InitStruct.GPIO_Pin 	= GPIO_Pin_6;				 				//选择PA0    GPIO_InitStruct.GPIO_Mode 	= GPIO_Mode_IPU;							//选择上拉输入模式GPIO_InitStruct.GPIO_Speed 	= GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStruct);/*选择TIM时钟*/TIM_InternalClockConfig(TIM3);/*配置时基单元*/TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;							//定义一个TIM_TimeBaseInitTypeDef类型的结构体用于初始化时基单元TIM_TimeBaseInitStruct.TIM_ClockDivision     = TIM_CKD_DIV1;			//设置时钟分频模式为不分TIM_TimeBaseInitStruct.TIM_CounterMode       = TIM_CounterMode_Up;		//计数方式设置为向上计数模式/*输出的PWM波形的频率为1kHz,分辨率为1%PWM频率:	Freq = CK_PSC / (PSC + 1) / (ARR + 1)PWM占空比:	Duty = CCR / (ARR + 1)PWM分辨率:	Reso = 1 / (ARR + 1)*/TIM_TimeBaseInitStruct.TIM_Period            = 65536-1;					//ARR,自动加载重装寄存器,要写入自动重装值,将ARR的值设为最大值,防止溢出TIM_TimeBaseInitStruct.TIM_Prescaler         = 72-1;					//PSC,预分频器的分频值TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0;						//重复计数,只有高级定时器才会使用,通用定时器用不到TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStruct);							//初始化时基单元/*初始化输入捕获单元*/TIM_ICInitTypeDef TIM_ICInitStruct;										//定义结构体用于初始化输入捕获单元TIM_ICInitStruct.TIM_Channel     = TIM_Channel_1;						//选择TIM3输入捕获通道1TIM_ICInitStruct.TIM_ICFilter    = 0xF;									//输入滤波,滤除噪音,使信号更平滑,并不会改变输入信号的频率TIM_ICInitStruct.TIM_ICPolarity  = TIM_ICPolarity_Rising;				//选择上升沿触发			TIM_ICInitStruct.TIM_ICPrescaler = TIM_ICPSC_DIV1;						//不分频TIM_ICInitStruct.TIM_ICSelection = TIM_ICSelection_DirectTI;TIM_ICInit(TIM3,&TIM_ICInitStruct);/*触发源选择*/TIM_SelectInputTrigger(TIM3,TIM_TS_TI1FP1);								//触发源选择滤波定时器输入1/*选择从模式*/TIM_SelectSlaveMode(TIM3,TIM_SlaveMode_Reset);							//上升沿初始化计数器并触发寄存器更新/*启动定时器*/TIM_Cmd(TIM3,ENABLE);
}/*** @brief	计算频率值* @param  None* @retval 输出PWM的频率* @note   读取CCR的值计算频率值
**/
uint32_t IC_GetFreq(void)
{return 1000000/(TIM_GetCapture1(TIM3)+1);								//加1使为了消除测量的误差,使输出的频率值恰好为1000Hz
}

 OLED.h

#ifndef __OLED_H
#define __OLED_Hvoid OLED_Init(void);
void OLED_Clear(void);
void OLED_ShowChar(uint8_t Line, uint8_t Column, char Char);
void OLED_ShowString(uint8_t Line, uint8_t Column, char *String);
void OLED_ShowNum(uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length);
void OLED_ShowSignedNum(uint8_t Line, uint8_t Column, int32_t Number, uint8_t Length);
void OLED_ShowHexNum(uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length);
void OLED_ShowBinNum(uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length);#endif

 OLED.c

#include "stm32f10x.h"
#include "OLED_Font.h"/*引脚配置*/
#define OLED_W_SCL(x)		GPIO_WriteBit(GPIOB, GPIO_Pin_8, (BitAction)(x))		//可更改引脚配置
#define OLED_W_SDA(x)		GPIO_WriteBit(GPIOB, GPIO_Pin_9, (BitAction)(x))		//更改引脚时,改变参数GPIOx,GPIO_Pin_x/*引脚初始化*/
void OLED_I2C_Init(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;								//将引脚的输出模式设置为开漏输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//更改引脚时,改变参数GPIOx,GPIO_Pin_xGPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;GPIO_Init(GPIOB, &GPIO_InitStructure);//更改引脚时,改变参数GPIOx,GPIO_Pin_xGPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;GPIO_Init(GPIOB, &GPIO_InitStructure);OLED_W_SCL(1);OLED_W_SDA(1);
}/*** @brief  I2C开始* @param  无* @retval 无*/
void OLED_I2C_Start(void)
{OLED_W_SDA(1);OLED_W_SCL(1);OLED_W_SDA(0);OLED_W_SCL(0);
}/*** @brief  I2C停止* @param  无* @retval 无*/
void OLED_I2C_Stop(void)
{OLED_W_SDA(0);OLED_W_SCL(1);OLED_W_SDA(1);
}/*** @brief  I2C发送一个字节* @param  Byte 要发送的一个字节* @retval 无*/
void OLED_I2C_SendByte(uint8_t Byte)
{uint8_t i;for (i = 0; i < 8; i++){OLED_W_SDA(!!(Byte & (0x80 >> i)));OLED_W_SCL(1);OLED_W_SCL(0);}OLED_W_SCL(1);	//额外的一个时钟,不处理应答信号OLED_W_SCL(0);
}/*** @brief  OLED写命令* @param  Command 要写入的命令* @retval 无*/
void OLED_WriteCommand(uint8_t Command)
{OLED_I2C_Start();OLED_I2C_SendByte(0x78);		//从机地址OLED_I2C_SendByte(0x00);		//写命令OLED_I2C_SendByte(Command); OLED_I2C_Stop();
}/*** @brief  OLED写数据* @param  Data 要写入的数据* @retval 无*/
void OLED_WriteData(uint8_t Data)
{OLED_I2C_Start();OLED_I2C_SendByte(0x78);		//从机地址OLED_I2C_SendByte(0x40);		//写数据OLED_I2C_SendByte(Data);OLED_I2C_Stop();
}/*** @brief  OLED设置光标位置* @param  Y 以左上角为原点,向下方向的坐标,范围:0~7* @param  X 以左上角为原点,向右方向的坐标,范围:0~127* @retval 无*/
void OLED_SetCursor(uint8_t Y, uint8_t X)
{OLED_WriteCommand(0xB0 | Y);					//设置Y位置OLED_WriteCommand(0x10 | ((X & 0xF0) >> 4));	//设置X位置高4位OLED_WriteCommand(0x00 | (X & 0x0F));			//设置X位置低4位
}/*** @brief  OLED清屏* @param  无* @retval 无*/
void OLED_Clear(void)
{  uint8_t i, j;for (j = 0; j < 8; j++){OLED_SetCursor(j, 0);for(i = 0; i < 128; i++){OLED_WriteData(0x00);}}
}/*** @brief  OLED显示一个字符* @param  Line 行位置,范围:1~4* @param  Column 列位置,范围:1~16* @param  Char 要显示的一个字符,范围:ASCII可见字符* @retval 无*/
void OLED_ShowChar(uint8_t Line, uint8_t Column, char Char)
{      	uint8_t i;OLED_SetCursor((Line - 1) * 2, (Column - 1) * 8);		//设置光标位置在上半部分for (i = 0; i < 8; i++){OLED_WriteData(OLED_F8x16[Char - ' '][i]);			//显示上半部分内容}OLED_SetCursor((Line - 1) * 2 + 1, (Column - 1) * 8);	//设置光标位置在下半部分for (i = 0; i < 8; i++){OLED_WriteData(OLED_F8x16[Char - ' '][i + 8]);		//显示下半部分内容}
}/*** @brief  OLED显示字符串* @param  Line 起始行位置,范围:1~4* @param  Column 起始列位置,范围:1~16* @param  String 要显示的字符串,范围:ASCII可见字符* @retval 无*/
void OLED_ShowString(uint8_t Line, uint8_t Column, char *String)
{uint8_t i;for (i = 0; String[i] != '\0'; i++){OLED_ShowChar(Line, Column + i, String[i]);}
}/*** @brief  OLED次方函数* @retval 返回值等于X的Y次方*/
uint32_t OLED_Pow(uint32_t X, uint32_t Y)
{uint32_t Result = 1;while (Y--){Result *= X;}return Result;
}/*** @brief  OLED显示数字(十进制,正数)* @param  Line 起始行位置,范围:1~4* @param  Column 起始列位置,范围:1~16* @param  Number 要显示的数字,范围:0~4294967295* @param  Length 要显示数字的长度,范围:1~10* @retval 无*/
void OLED_ShowNum(uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length)
{uint8_t i;for (i = 0; i < Length; i++)							{OLED_ShowChar(Line, Column + i, Number / OLED_Pow(10, Length - i - 1) % 10 + '0');}
}/*** @brief  OLED显示数字(十进制,带符号数)* @param  Line 起始行位置,范围:1~4* @param  Column 起始列位置,范围:1~16* @param  Number 要显示的数字,范围:-2147483648~2147483647* @param  Length 要显示数字的长度,范围:1~10* @retval 无*/
void OLED_ShowSignedNum(uint8_t Line, uint8_t Column, int32_t Number, uint8_t Length)
{uint8_t i;uint32_t Number1;if (Number >= 0){OLED_ShowChar(Line, Column, '+');Number1 = Number;}else{OLED_ShowChar(Line, Column, '-');Number1 = -Number;}for (i = 0; i < Length; i++)							{OLED_ShowChar(Line, Column + i + 1, Number1 / OLED_Pow(10, Length - i - 1) % 10 + '0');}
}/*** @brief  OLED显示数字(十六进制,正数)* @param  Line 起始行位置,范围:1~4* @param  Column 起始列位置,范围:1~16* @param  Number 要显示的数字,范围:0~0xFFFFFFFF* @param  Length 要显示数字的长度,范围:1~8* @retval 无*/
void OLED_ShowHexNum(uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length)
{uint8_t i, SingleNumber;for (i = 0; i < Length; i++)							{SingleNumber = Number / OLED_Pow(16, Length - i - 1) % 16;if (SingleNumber < 10){OLED_ShowChar(Line, Column + i, SingleNumber + '0');}else{OLED_ShowChar(Line, Column + i, SingleNumber - 10 + 'A');}}
}/*** @brief  OLED显示数字(二进制,正数)* @param  Line 起始行位置,范围:1~4* @param  Column 起始列位置,范围:1~16* @param  Number 要显示的数字,范围:0~1111 1111 1111 1111* @param  Length 要显示数字的长度,范围:1~16* @retval 无*/
void OLED_ShowBinNum(uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length)
{uint8_t i;for (i = 0; i < Length; i++)							{OLED_ShowChar(Line, Column + i, Number / OLED_Pow(2, Length - i - 1) % 2 + '0');}
}/*** @brief  OLED初始化* @param  无* @retval 无*/
void OLED_Init(void)
{uint32_t i, j;for (i = 0; i < 1000; i++)			//上电延时{for (j = 0; j < 1000; j++);}OLED_I2C_Init();			//端口初始化OLED_WriteCommand(0xAE);	//关闭显示OLED_WriteCommand(0xD5);	//设置显示时钟分频比/振荡器频率OLED_WriteCommand(0x80);OLED_WriteCommand(0xA8);	//设置多路复用率OLED_WriteCommand(0x3F);OLED_WriteCommand(0xD3);	//设置显示偏移OLED_WriteCommand(0x00);OLED_WriteCommand(0x40);	//设置显示开始行OLED_WriteCommand(0xA1);	//设置左右方向,0xA1正常 0xA0左右反置OLED_WriteCommand(0xC8);	//设置上下方向,0xC8正常 0xC0上下反置OLED_WriteCommand(0xDA);	//设置COM引脚硬件配置OLED_WriteCommand(0x12);OLED_WriteCommand(0x81);	//设置对比度控制OLED_WriteCommand(0xCF);OLED_WriteCommand(0xD9);	//设置预充电周期OLED_WriteCommand(0xF1);OLED_WriteCommand(0xDB);	//设置VCOMH取消选择级别OLED_WriteCommand(0x30);OLED_WriteCommand(0xA4);	//设置整个显示打开/关闭OLED_WriteCommand(0xA6);	//设置正常/倒转显示OLED_WriteCommand(0x8D);	//设置充电泵OLED_WriteCommand(0x14);OLED_WriteCommand(0xAF);	//开启显示OLED_Clear();				//OLED清屏
}

 OLED_Font.h

#ifndef __OLED_FONT_H
#define __OLED_FONT_H/*OLED字模库,宽8像素,高16像素*/
const uint8_t OLED_F8x16[][16]=
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//  00x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x30,0x00,0x00,0x00,//! 10x00,0x10,0x0C,0x06,0x10,0x0C,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//" 20x40,0xC0,0x78,0x40,0xC0,0x78,0x40,0x00,0x04,0x3F,0x04,0x04,0x3F,0x04,0x04,0x00,//# 30x00,0x70,0x88,0xFC,0x08,0x30,0x00,0x00,0x00,0x18,0x20,0xFF,0x21,0x1E,0x00,0x00,//$ 40xF0,0x08,0xF0,0x00,0xE0,0x18,0x00,0x00,0x00,0x21,0x1C,0x03,0x1E,0x21,0x1E,0x00,//% 50x00,0xF0,0x08,0x88,0x70,0x00,0x00,0x00,0x1E,0x21,0x23,0x24,0x19,0x27,0x21,0x10,//& 60x10,0x16,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//' 70x00,0x00,0x00,0xE0,0x18,0x04,0x02,0x00,0x00,0x00,0x00,0x07,0x18,0x20,0x40,0x00,//( 80x00,0x02,0x04,0x18,0xE0,0x00,0x00,0x00,0x00,0x40,0x20,0x18,0x07,0x00,0x00,0x00,//) 90x40,0x40,0x80,0xF0,0x80,0x40,0x40,0x00,0x02,0x02,0x01,0x0F,0x01,0x02,0x02,0x00,//* 100x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x1F,0x01,0x01,0x01,0x00,//+ 110x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xB0,0x70,0x00,0x00,0x00,0x00,0x00,//, 120x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01,//- 130x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00,//. 140x00,0x00,0x00,0x00,0x80,0x60,0x18,0x04,0x00,0x60,0x18,0x06,0x01,0x00,0x00,0x00,/// 150x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,//0 160x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//1 170x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,//2 180x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,//3 190x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,//4 200x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,//5 210x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,//6 220x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,//7 230x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,//8 240x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00,//9 250x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,//: 260x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x60,0x00,0x00,0x00,0x00,//; 270x00,0x00,0x80,0x40,0x20,0x10,0x08,0x00,0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x00,//< 280x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x00,//= 290x00,0x08,0x10,0x20,0x40,0x80,0x00,0x00,0x00,0x20,0x10,0x08,0x04,0x02,0x01,0x00,//> 300x00,0x70,0x48,0x08,0x08,0x08,0xF0,0x00,0x00,0x00,0x00,0x30,0x36,0x01,0x00,0x00,//? 310xC0,0x30,0xC8,0x28,0xE8,0x10,0xE0,0x00,0x07,0x18,0x27,0x24,0x23,0x14,0x0B,0x00,//@ 320x00,0x00,0xC0,0x38,0xE0,0x00,0x00,0x00,0x20,0x3C,0x23,0x02,0x02,0x27,0x38,0x20,//A 330x08,0xF8,0x88,0x88,0x88,0x70,0x00,0x00,0x20,0x3F,0x20,0x20,0x20,0x11,0x0E,0x00,//B 340xC0,0x30,0x08,0x08,0x08,0x08,0x38,0x00,0x07,0x18,0x20,0x20,0x20,0x10,0x08,0x00,//C 350x08,0xF8,0x08,0x08,0x08,0x10,0xE0,0x00,0x20,0x3F,0x20,0x20,0x20,0x10,0x0F,0x00,//D 360x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,0x20,0x3F,0x20,0x20,0x23,0x20,0x18,0x00,//E 370x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,0x20,0x3F,0x20,0x00,0x03,0x00,0x00,0x00,//F 380xC0,0x30,0x08,0x08,0x08,0x38,0x00,0x00,0x07,0x18,0x20,0x20,0x22,0x1E,0x02,0x00,//G 390x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08,0x20,0x3F,0x21,0x01,0x01,0x21,0x3F,0x20,//H 400x00,0x08,0x08,0xF8,0x08,0x08,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//I 410x00,0x00,0x08,0x08,0xF8,0x08,0x08,0x00,0xC0,0x80,0x80,0x80,0x7F,0x00,0x00,0x00,//J 420x08,0xF8,0x88,0xC0,0x28,0x18,0x08,0x00,0x20,0x3F,0x20,0x01,0x26,0x38,0x20,0x00,//K 430x08,0xF8,0x08,0x00,0x00,0x00,0x00,0x00,0x20,0x3F,0x20,0x20,0x20,0x20,0x30,0x00,//L 440x08,0xF8,0xF8,0x00,0xF8,0xF8,0x08,0x00,0x20,0x3F,0x00,0x3F,0x00,0x3F,0x20,0x00,//M 450x08,0xF8,0x30,0xC0,0x00,0x08,0xF8,0x08,0x20,0x3F,0x20,0x00,0x07,0x18,0x3F,0x00,//N 460xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,0x0F,0x10,0x20,0x20,0x20,0x10,0x0F,0x00,//O 470x08,0xF8,0x08,0x08,0x08,0x08,0xF0,0x00,0x20,0x3F,0x21,0x01,0x01,0x01,0x00,0x00,//P 480xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,0x0F,0x18,0x24,0x24,0x38,0x50,0x4F,0x00,//Q 490x08,0xF8,0x88,0x88,0x88,0x88,0x70,0x00,0x20,0x3F,0x20,0x00,0x03,0x0C,0x30,0x20,//R 500x00,0x70,0x88,0x08,0x08,0x08,0x38,0x00,0x00,0x38,0x20,0x21,0x21,0x22,0x1C,0x00,//S 510x18,0x08,0x08,0xF8,0x08,0x08,0x18,0x00,0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x00,//T 520x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08,0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x00,//U 530x08,0x78,0x88,0x00,0x00,0xC8,0x38,0x08,0x00,0x00,0x07,0x38,0x0E,0x01,0x00,0x00,//V 540xF8,0x08,0x00,0xF8,0x00,0x08,0xF8,0x00,0x03,0x3C,0x07,0x00,0x07,0x3C,0x03,0x00,//W 550x08,0x18,0x68,0x80,0x80,0x68,0x18,0x08,0x20,0x30,0x2C,0x03,0x03,0x2C,0x30,0x20,//X 560x08,0x38,0xC8,0x00,0xC8,0x38,0x08,0x00,0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x00,//Y 570x10,0x08,0x08,0x08,0xC8,0x38,0x08,0x00,0x20,0x38,0x26,0x21,0x20,0x20,0x18,0x00,//Z 580x00,0x00,0x00,0xFE,0x02,0x02,0x02,0x00,0x00,0x00,0x00,0x7F,0x40,0x40,0x40,0x00,//[ 590x00,0x0C,0x30,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x06,0x38,0xC0,0x00,//\ 600x00,0x02,0x02,0x02,0xFE,0x00,0x00,0x00,0x00,0x40,0x40,0x40,0x7F,0x00,0x00,0x00,//] 610x00,0x00,0x04,0x02,0x02,0x02,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//^ 620x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,//_ 630x00,0x02,0x02,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//` 640x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x19,0x24,0x22,0x22,0x22,0x3F,0x20,//a 650x08,0xF8,0x00,0x80,0x80,0x00,0x00,0x00,0x00,0x3F,0x11,0x20,0x20,0x11,0x0E,0x00,//b 660x00,0x00,0x00,0x80,0x80,0x80,0x00,0x00,0x00,0x0E,0x11,0x20,0x20,0x20,0x11,0x00,//c 670x00,0x00,0x00,0x80,0x80,0x88,0xF8,0x00,0x00,0x0E,0x11,0x20,0x20,0x10,0x3F,0x20,//d 680x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x1F,0x22,0x22,0x22,0x22,0x13,0x00,//e 690x00,0x80,0x80,0xF0,0x88,0x88,0x88,0x18,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//f 700x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x6B,0x94,0x94,0x94,0x93,0x60,0x00,//g 710x08,0xF8,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x3F,0x21,0x00,0x00,0x20,0x3F,0x20,//h 720x00,0x80,0x98,0x98,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//i 730x00,0x00,0x00,0x80,0x98,0x98,0x00,0x00,0x00,0xC0,0x80,0x80,0x80,0x7F,0x00,0x00,//j 740x08,0xF8,0x00,0x00,0x80,0x80,0x80,0x00,0x20,0x3F,0x24,0x02,0x2D,0x30,0x20,0x00,//k 750x00,0x08,0x08,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//l 760x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x20,0x3F,0x20,0x00,0x3F,0x20,0x00,0x3F,//m 770x80,0x80,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x3F,0x21,0x00,0x00,0x20,0x3F,0x20,//n 780x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x00,//o 790x80,0x80,0x00,0x80,0x80,0x00,0x00,0x00,0x80,0xFF,0xA1,0x20,0x20,0x11,0x0E,0x00,//p 800x00,0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x0E,0x11,0x20,0x20,0xA0,0xFF,0x80,//q 810x80,0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x20,0x20,0x3F,0x21,0x20,0x00,0x01,0x00,//r 820x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x33,0x24,0x24,0x24,0x24,0x19,0x00,//s 830x00,0x80,0x80,0xE0,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x1F,0x20,0x20,0x00,0x00,//t 840x80,0x80,0x00,0x00,0x00,0x80,0x80,0x00,0x00,0x1F,0x20,0x20,0x20,0x10,0x3F,0x20,//u 850x80,0x80,0x80,0x00,0x00,0x80,0x80,0x80,0x00,0x01,0x0E,0x30,0x08,0x06,0x01,0x00,//v 860x80,0x80,0x00,0x80,0x00,0x80,0x80,0x80,0x0F,0x30,0x0C,0x03,0x0C,0x30,0x0F,0x00,//w 870x00,0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x31,0x2E,0x0E,0x31,0x20,0x00,//x 880x80,0x80,0x80,0x00,0x00,0x80,0x80,0x80,0x80,0x81,0x8E,0x70,0x18,0x06,0x01,0x00,//y 890x00,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x21,0x30,0x2C,0x22,0x21,0x30,0x00,//z 900x00,0x00,0x00,0x00,0x80,0x7C,0x02,0x02,0x00,0x00,0x00,0x00,0x00,0x3F,0x40,0x40,//{ 910x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,//| 920x00,0x02,0x02,0x7C,0x80,0x00,0x00,0x00,0x00,0x40,0x40,0x3F,0x00,0x00,0x00,0x00,//} 930x00,0x06,0x01,0x01,0x02,0x02,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//~ 94
};#endif

内容要点

PWM基本结构

开启外设时钟

/*开启时钟*/RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);						//开启TIM2时钟

本实验使用TIM2输出调制PWM波来驱动LED呼吸灯,TIM2属于APB1外设,调用RCC_APB1PeriphClockCmd()函数来开启APB1外设时钟。

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);					//开启GPIOA时钟

根据STM32引脚的定义,PA0的默认复用功能为TIM2的输出比较通道之一TIM2_CH1,GPIOA隶属于APB2外设,调用RCC_APB2PeriphClockCmd()函数开启APB2外设时钟。

配置GPIO端口

/*配置端口*/GPIO_InitTypeDef GPIO_InitStruct;								 		//定义结构体GPIO_InitStruct.GPIO_Pin 	= GPIO_Pin_0;				 				//选择PA0    //重映射到GPIO_Pin_15GPIO_InitStruct.GPIO_Mode 	= GPIO_Mode_AF_PP;							//复用推挽输出,将引脚的控制权交给片上外设GPIO_InitStruct.GPIO_Speed 	= GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStruct);

GPIO初始化中,初始化结构体GPIO_InitStruct结构体成员,将GPIO引脚设置为PA0 Pin,将GPIO模式设置为复用推挽输出,因为GPIO的主功能为PA0 IO口,这里使用其默认复用功能,故应将GPIO模式设置为复用推挽,使用普通的推挽输出无法输出PWM波形。

配置时基单元

/*选择TIM时钟*/TIM_InternalClockConfig(TIM2);

选择TIM时钟为内部时钟

/*配置时基单元*/TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;							//定义一个TIM_TimeBaseInitTypeDef类型的结构体用于初始化时基单元TIM_TimeBaseInitStruct.TIM_ClockDivision     = TIM_CKD_DIV1;			//设置时钟分频模式为不分TIM_TimeBaseInitStruct.TIM_CounterMode       = TIM_CounterMode_Up;		//计数方式设置为向上计数模式/*输出的PWM波形的频率为1kHz,分辨率为1%PWM频率:	Freq = CK_PSC / (PSC + 1) / (ARR + 1)PWM占空比:	Duty = CCR / (ARR + 1)PWM分辨率:	Reso = 1 / (ARR + 1)*/TIM_TimeBaseInitStruct.TIM_Period            = 100-1;					//ARR,自动加载重装寄存器,要写入自动重装值TIM_TimeBaseInitStruct.TIM_Prescaler         = 720-1;					//PSC,预分频器的分频值TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0;						//重复计数,只有高级定时器才会使用,通用定时器用不到TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStruct);							//初始化时基单元

按照输出PWM频率为1kHz,分辨率为1%计算出ARR(自动重装寄存器)和PSC(预分频器)的值。

PWM频率:        Freq = CK_PSC / (PSC + 1) / (ARR + 1)
PWM占空比:    Duty = CCR / (ARR + 1)
PWM分辨率:    Reso = 1 / (ARR + 1) 

 初始化输出比较单元

/*初始化输出比较单元*/TIM_OCInitTypeDef TIM_OCInitStruct;										//定义一个TIM_OCInitTypeDef类型的结构体用以输出比较单元初始化TIM_OCStructInit(&TIM_OCInitStruct);									//给每个结构体成员赋初始值,防止因未使用到的结构体成员未初始化而导致程序出现错误TIM_OCInitStruct.TIM_OCMode 		= TIM_OCMode_PWM1;					//选择PWM模式1TIM_OCInitStruct.TIM_OCPolarity 	= TIM_OCPolarity_High;				//OC1有效电平为高电平TIM_OCInitStruct.TIM_OutputState 	= TIM_OutputState_Enable;			//输出比较使能/*输出PWM的波形占空比PWM占空比:	Duty = CCR / (ARR + 1)*/TIM_OCInitStruct.TIM_Pulse 			= 0;								//CCR,捕获/比较器,本工程中有封装的函数用于改变占空比,此处先设置为0TIM_OC1Init(TIM2,&TIM_OCInitStruct);

初始化输出比较单元时,在初始化TIM输出比较结构体之前调用TIM_OCStructInit()函数给结构体的每个成员初始化赋默认值,防止在实验中未使用到输出比较单元中的某些功能且未初始化这些功能对应的结构体成员时,发生意外错误。

将输出比较单元的输出模式设置为PWM模式1。

设置输出极性为高电平有效,即PWM模式1下计数器的值小于CCR时为高电平,反之为低电平。

此处是通过设置捕获比较使能寄存器TIMx_CCER位1CC1P设置输入/捕获1输出极性

此处将CCR寄存器的值设置为0,实验中使用封装的函数 void PWM_SetComparel(uint16_t Compare)来调用TIM_SetCompare1()函数来改变CCR寄存器的值实现占空比的改变。

/*** @brief	指定CCR寄存器的值改变PWM Duty* @param  None* @retval None* @note   None
**/
void PWM_SetComparel(uint16_t Compare)
{TIM_SetCompare1(TIM2,Compare);
}

输出比较通道重映射 

//	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);						//开启AFIO时钟
//	
//	/*
//		引脚重映射
//	*/
//	GPIO_PinRemapConfig(GPIO_PartialRemap1_TIM2,ENABLE);					//将TIM2的CH1从PA0重映射到PA15
//	/*
//		解除引脚复用
//	*/
//	GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);					//PA15引脚作为JTD1功能使用,此处解除AFIO的JTAG复用

在开启TIM2和GPIOA时钟后,开启AFIO时钟,调用GPIO_PinRemapConfig()将TIM2_CH1从PA0引脚重映射到PA15引脚。由于PA15默认为JTAG调试功能,调用GPIO_PinRemapConfig()函数解除引脚复用,PA15引脚作为JTD1功能使用,解除AFIO的JTAG复用。(如果不使用重映射功能,则忽略这部分)

输入捕获功能初始化

/*** @brief	IC初始化* @param  None* @retval None* @note   使用TIM3进行输入捕获
**/
void IC_Init(void)
{/*开启时钟*/RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);						//开启TIM2时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);					//开启GPIOA时钟GPIO_InitTypeDef GPIO_InitStruct;								 		//定义结构体GPIO_InitStruct.GPIO_Pin 	= GPIO_Pin_6;				 				//选择PA6    GPIO_InitStruct.GPIO_Mode 	= GPIO_Mode_IPU;							//选择上拉输入模式GPIO_InitStruct.GPIO_Speed 	= GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStruct);/*选择TIM时钟*/TIM_InternalClockConfig(TIM3);/*配置时基单元*/TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;							//定义一个TIM_TimeBaseInitTypeDef类型的结构体用于初始化时基单元TIM_TimeBaseInitStruct.TIM_ClockDivision     = TIM_CKD_DIV1;			//设置时钟分频模式为不分TIM_TimeBaseInitStruct.TIM_CounterMode       = TIM_CounterMode_Up;		//计数方式设置为向上计数模式/*输出的PWM波形的频率为1kHz,分辨率为1%PWM频率:	Freq = CK_PSC / (PSC + 1) / (ARR + 1)PWM占空比:	Duty = CCR / (ARR + 1)PWM分辨率:	Reso = 1 / (ARR + 1)*/TIM_TimeBaseInitStruct.TIM_Period            = 65536-1;					//ARR,自动加载重装寄存器,要写入自动重装值,将ARR的值设为最大值,防止溢出TIM_TimeBaseInitStruct.TIM_Prescaler         = 72-1;					//PSC,预分频器的分频值TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0;						//重复计数,只有高级定时器才会使用,通用定时器用不到TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStruct);							//初始化时基单元/*初始化输入捕获单元*/TIM_ICInitTypeDef TIM_ICInitStruct;										//定义结构体用于初始化输入捕获单元TIM_ICInitStruct.TIM_Channel     = TIM_Channel_1;						//选择TIM3输入捕获通道1TIM_ICInitStruct.TIM_ICFilter    = 0xF;									//输入滤波,滤除噪音,使信号更平滑,并不会改变输入信号的频率TIM_ICInitStruct.TIM_ICPolarity  = TIM_ICPolarity_Rising;				//选择上升沿触发			TIM_ICInitStruct.TIM_ICPrescaler = TIM_ICPSC_DIV1;						//不分频TIM_ICInitStruct.TIM_ICSelection = TIM_ICSelection_DirectTI;TIM_ICInit(TIM3,&TIM_ICInitStruct);/*触发源选择*/TIM_SelectInputTrigger(TIM3,TIM_TS_TI1FP1);								//触发源选择滤波定时器输入1/*选择从模式*/TIM_SelectSlaveMode(TIM3,TIM_SlaveMode_Reset);							//上升沿初始化计数器并触发寄存器更新/*启动定时器*/TIM_Cmd(TIM3,ENABLE);
}

 实验中要实现输入捕获功能,需要用到两个定时器,TIM2的CH1通道实现输出比较功能,通过PA0引脚输出PWM信号。通过PA6引脚输入PWM信号,即TIM3的CH1通道实现输入捕获功能。

  1. 配置GPIO,选择PA6引脚为上拉输入模式
  2. 配置时基单元,将ARR的值设置为最大值65536, 防止溢出。
  3. 配置输入捕获单元,选择TIM3输入捕获通道1,初始化输入捕获单元的TIM_ICInitTypeDef类型TIM_ICInitStruct结构体的成员TIM_ICFilter指定一个数值实现输入滤波,滤除噪音,使信号更平滑(并不会改变输入信号的频率),边沿检测选择上升沿触发,分频器配置为不分频模式。
  4. 触发源选择,选择滤波定时器输入1
  5. 主模式已选择为OC1(TIM2通道1的输出比较功能)
  6. 从模式选择为Reset模式,上升沿初始化计数器并触发寄存器更新
  7. 启动定时器

 计算捕获PWM的频率

/*** @brief	计算频率值* @param  None* @retval 输出PWM的频率* @note   读取CCR的值计算频率值
**/
uint32_t IC_GetFreq(void)
{return 1000000/(TIM_GetCapture1(TIM3)+1);								//加1使为了消除测量的误差,使输出的频率值恰好为1000Hz
}

 将该功能封装,在函数中调用TIM_GetCapture1()函数读取输入捕获通道1的值,使用测周法(𝑓𝑥=𝑓𝑐 / 𝑁),基准频率为1kHz, N为捕获通道1的值,将计算所得的频率返回。

实验结果

OLED显示PWM的频率

问题记录

暂无

http://www.dtcms.com/wzjs/539005.html

相关文章:

  • 好大夫在线个人网站王建设富阳网站公司
  • 网站的管理跟新维护有哪些免费生成网站软件下载
  • 建设报名系统网站淘宝有WordPress网站搭建吗
  • wordpress单页网站在本页跳转什么网站可以接单做设计
  • 勾线外包网站公司网站开发费账务处理
  • 网站开发百度百科主页不是wordpress
  • 城乡建设部网站安全员证书查询软件开发者怎么赚钱
  • 高端全屋定制十大名牌排行榜seo人员工作内容
  • 网上商城网站开发需求说明书网站空间哪家做的好
  • 网站建设哪个平台好网页制作与设计实训
  • ppt免费模板大全网站wordpress edd 卡密
  • 汽车维修保养网站模板衡阳网站排名优化公司
  • 网站安全防护方案教做甜点的网站
  • 哪个网站做设计兼职不用压金甘肃省城乡建设局网站首页
  • 哈尔滨工程项目建设网广告优化师的工作内容
  • 网站seo系统网站地图做法做
  • 网站活泼电子商务网站数据库怎么做
  • 哪个网站的课件做的好网站右边悬浮代码
  • 网站建设培训 上海可以投放广告的网站
  • 淘客网站做的好的本溪市住房和城乡建设局网站
  • 建网站选哪个wordpress 3.8.3 下载
  • 苏州知名网站建设设计公司排名wordpress弹幕播放
  • 百度云域名怎么做网站上海专业网站建设费
  • 国外视觉设计门户网站一级a做爰片在线看免播放器网站
  • 网站 侧边栏图片素材网站排行榜
  • 网站做系统叫什么软件有哪些岳阳网站搭建
  • 宜昌网站制作个人网站号备案吗
  • 高端型网站制作旅游网站建设经济评价
  • 好口碑自适应网站建设小白源码网
  • 椒江住房和城乡建设规划局网站做喷绘可以在那个网站找