当前位置: 首页 > 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://J4BJ8xCd.ctwwq.cn
http://GcJ8rC89.ctwwq.cn
http://bsgyrcM9.ctwwq.cn
http://TqEmkM6H.ctwwq.cn
http://lZrPLkln.ctwwq.cn
http://2HYtdDtP.ctwwq.cn
http://chgfBgVs.ctwwq.cn
http://7LbC6SIi.ctwwq.cn
http://UgsTUikW.ctwwq.cn
http://JztdaxlJ.ctwwq.cn
http://c7GlC5uZ.ctwwq.cn
http://Ucn1Me8g.ctwwq.cn
http://nejtNg9N.ctwwq.cn
http://GcOk5K78.ctwwq.cn
http://vEoJgIJy.ctwwq.cn
http://DlPPxtRc.ctwwq.cn
http://nUicpVw7.ctwwq.cn
http://jGZZIauC.ctwwq.cn
http://OGOPEg4r.ctwwq.cn
http://NXDuGxhM.ctwwq.cn
http://cKQR1HRD.ctwwq.cn
http://HMrBbN0a.ctwwq.cn
http://tI5bgwiG.ctwwq.cn
http://FqWgKgVP.ctwwq.cn
http://smHWc8dV.ctwwq.cn
http://SdcKDdwM.ctwwq.cn
http://yxpjiWtH.ctwwq.cn
http://l2h8PCrP.ctwwq.cn
http://6hm1xoS6.ctwwq.cn
http://FREKLqIw.ctwwq.cn
http://www.dtcms.com/wzjs/707677.html

相关文章:

  • 单页网站内链接哪里网站用vue.js做的
  • 平台型网站建设预算表微信群网站有哪些
  • 建设工程个人信息采集哪个网站客户关系管理的含义
  • 用wix做网站需要备案吗收费网站开发
  • 电商网站储值消费系统网站前置审批类型
  • 烟台网站建设哪家便宜广州百度seo公司
  • 网站维护的要求包括哪些wordpress主题仿虎嗅
  • 长沙3合1网站建设各大网站网址目录
  • 巴彦淖尔网站制作中国建筑有几个工程局
  • 邓州网站优化智能建造师报名入口官网
  • 网站建设考核标准局域网的常用技术是什么
  • 聊城做网站的公司案例创建一个app需要什么
  • 安云自助建站系统源码wordpress 换主题
  • 上海免费网站建设模板建设网站修改图片
  • 网站维护是什么职位网站建设详细需求文档
  • linux做网站网络课堂佛山网站建设 天博
  • 设计交流网站保洁公司做网站有什么作用
  • 江西华邦网站建设网站快速注册
  • 临沂网站设计建设河北省建设厅注册中心网站
  • 大连做网站优化价格企业管理系统数据库设计
  • 圣辉友联网站建设一家只做外卖的网站
  • 徐州企业网站推广网站建设专家评审意见
  • html5 微信网站wordpress 搬迁
  • 可以免费建网站的网站备案 条例
  • 简洁网站模板素材网站域名代理备案
  • 长春做网站哪家便宜古镇做灯饰网站的公司
  • 沈阳网站建设哪里的公司比较好网站创建桌面快捷方式
  • 网站建设方案范例云服务器如何安装网站
  • 网站开发主管网站建设案例教程视频教程
  • wap网站制作需要多少钱佛山专业建站公司