AD中画原理图封装,常常要用到上下划线来表示低电平触发,今天画库时遇到一个问题。
如下:
看图可知加上划线只需在每个字母后面加上一个"\";
即可实现字母加上划线的功能;
那么加下划线需点击自定义字体,如下图:
两个都勾选上;点击TIME NEW ROMAN
点进去后可看到这个界面:
把下划线勾上,现在就可以看到字母有下划线了;
题目:https://upfile.live/zh-cn/files/a106b700
例程:https://upfile.live/zh-cn/files/3d0f9fbf
模板:https://upfile.live/zh-cn/files/8b1000ae
模板
#include "stdarg.h"
#include <string.h>
#include "usart.h"
#include "stdio.h"
typedef enum {FALSE = 0,TRUE = 1} bool;//布尔类型定义
/*
map函数
val 输入值
in_min 输入最小值
in_max 输入最大值
out_min 输出最小值
out_max 输出最大值
返回值 映射后的值
*/
int Map(int val,int in_min,int in_max,int out_min,int out_max)
{
return (int)(val-in_min)*(out_max-out_min)/(in_max-in_min)+out_min;
}
/*
任何GPIO初始化为输出
*/
void any_gpio_init(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin_X)
{
GPIO_InitTypeDef GPIO_InitStructure;
if(GPIOx==GPIOA){RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);}
if(GPIOx==GPIOB){RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);}
if(GPIOx==GPIOC){RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC,ENABLE);}
if(GPIOx==GPIOD){RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD,ENABLE);}
if(GPIOx==GPIOE){RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE,ENABLE);}
if(GPIOx==GPIOF){RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE);}
if(GPIOx==GPIOG){RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG,ENABLE);}
if(GPIOx==GPIOH){RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOH,ENABLE);}
if(GPIOx==GPIOI){RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOI,ENABLE);}
if(GPIOx==GPIOJ){RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOJ,ENABLE);}
if(GPIOx==GPIOK){RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOK,ENABLE);}
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_X;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOx,&GPIO_InitStructure);
GPIO_ResetBits(GPIOx,GPIO_Pin_X);
}
/*
直流电机函数
mode 0停止 1正传 2反转
speed 速度
*/
void dc_motor_run(int mode,int speed)
{
switch(mode)
{
case 0:PBout(9)=0;PBout(15)=0;
break;
case 1:PBout(9)=1;PBout(15)=0;
break;
case 2:PBout(9)=0;PBout(15)=1;
break;
}
TIM_SetCompare1(TIM12,speed);
}
/*
单个数码管和一排数码管初始化
*/
void smg_init()
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOE,&GPIO_InitStructure);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOG,&GPIO_InitStructure);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOG,&GPIO_InitStructure);
}
/*
单个数码管显示数字
num 输入数字(0-F)
*/
void show_smg(int num)//使用PE的后8位来初始化引脚(共阳极)
{ //显示0-F
uint16_t maduan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
GPIO_Write(GPIOE,maduan[num]<<8);
}
/*
显示一排数码管的单个码段
x 第几个(0-3)
num 数字(0-F)
*/
void show_few_smg(int x,int num)
{
uint16_t maduan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
switch(x)
{
case 0:PGout(8)=1;PGout(9)=0;PGout(10)=0;PGout(11)=0;
break;
case 1:PGout(8)=0;PGout(9)=1;PGout(10)=0;PGout(11)=0;
break;
case 2:PGout(8)=0;PGout(9)=0;PGout(10)=1;PGout(11)=0;
break;
case 3:PGout(8)=0;PGout(9)=0;PGout(10)=0;PGout(11)=1;
break;
}
GPIO_Write(GPIOF,maduan[num]<<8);
delay_ms(5);
GPIO_Write(GPIOF,0xff00);
}
/*
显示一排数的所有数
在这里显示你想要显示的数
默认显示111键值
*/
void show_all_num()
{
show_few_smg(0,1);
show_few_smg(1,1);
show_few_smg(2,1);
show_few_smg(3,1);
}
/*
矩阵按键扫描
返回值键值1-16
返回0表示没有按键触发
*/
uint16_t key_scanf()
{
uint16_t rec=0,i;
for(i=0;i<4;i++)
{
if(PGin(i)&&PGin(4)){while(PGin(i)&&PGin(4)){}rec=1+(i*4);}
if(PGin(i)&&PGin(5)){while(PGin(i)&&PGin(5)){}rec=2+(i*4);}
if(PGin(i)&&PGin(6)){while(PGin(i)&&PGin(6)){}rec=3+(i*4);}
if(PGin(i)&&PGin(7)){while(PGin(i)&&PGin(7)){}rec=4+(i*4);}
}
return rec;
}
/*
adc初始化
初始化了4路adc
pa0-pa3
*/
void init_adc1(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
ADC_CommonInitTypeDef ADC_CommonInitStructure;
ADC_InitTypeDef ADC_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);//使能GPIOA时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);// 使能ADC1时钟
//初始化ADC1通道0-3 IO口
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AN; //模式为模拟输入
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL; //不带上下拉
GPIO_Init(GPIOA,&GPIO_InitStructure);
RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,ENABLE); //ADC1复位
RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,DISABLE); //复位结束
//初始化CCR通用控制寄存器配置
ADC_CommonInitStructure.ADC_DMAAccessMode=ADC_DMAAccessMode_Disabled; //DMA失能
ADC_CommonInitStructure.ADC_Mode=ADC_Mode_Independent; //独立模式
ADC_CommonInitStructure.ADC_Prescaler=ADC_Prescaler_Div4; //预分频值设置
ADC_CommonInitStructure.ADC_TwoSamplingDelay=ADC_TwoSamplingDelay_5Cycles;//两个采样阶段之间延迟5个时钟
ADC_CommonInit(&ADC_CommonInitStructure);
//初始化ADC1相关参数
ADC_InitStructure.ADC_ContinuousConvMode=DISABLE; //关闭连续转换
ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right; //右对齐
ADC_InitStructure.ADC_ExternalTrigConvEdge=ADC_ExternalTrigConvEdge_None; //禁止触发检测,使用软件触发
ADC_InitStructure.ADC_NbrOfConversion=1; //1个转换在规则序列中
ADC_InitStructure.ADC_Resolution=ADC_Resolution_12b; //12位模式
ADC_InitStructure.ADC_ScanConvMode=DISABLE; //非扫描模式
ADC_Init(ADC1,&ADC_InitStructure); //ADC初始化
ADC_Cmd(ADC1,ENABLE); //开启AD转换器
}
/*
获取ADC值
ch:通道值 0~16
返回值:转换结果(0-4096)对应电压0v-3.3v
*/
u16 Get_Adc(u8 ch)
{
ADC_RegularChannelConfig(ADC1,ch,1,ADC_SampleTime_480Cycles);//设置ADC规则组通道,一个序列,采样时间480
ADC_SoftwareStartConv(ADC1);//使能指定的ADC1的软件转换启动功能
while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC));//读取状态寄存器的状态位EOC,等待转换结束
return ADC_GetConversionValue(ADC1);//返回最近一次的ADC1规则组的转换结果
}
/*
获取通道ch的转换值,取times次,然后平均
ch:通道编号 times:获取次数
返回值:通道ch的times次转换结果平均值
*/
u16 Get_Adc_Average(u8 ch,u8 times)
{
u32 temp_val=0;
u8 t;
for(t=0;t<times;t++)
{
temp_val+=+Get_Adc(ch); //取times次通道值进行求和
delay_ms(5);
}
return temp_val/times; //返回平均值
}
/*
获取stm32内部温度
*/
uint16_t adc_get_intemp()
{
double real_temp,value,temp_av;
value=Get_Adc_Average(16,10);//采集16通道,采集10次取平均值
temp_av=value*(3.3/4096);//换算成电压
real_temp=(temp_av-0.76)/0.0025+25;//固定温度换算公式
real_temp*=100;
return (uint16_t)real_temp;
}
/*
dac输出模拟电压初始化
stm32f4就两个dac输出口
一个PA4一个PA5
*/
void dac_init()
{
GPIO_InitTypeDef GPIO_InitStructure;
DAC_InitTypeDef DAC_InitStructure;
//使能端口和DAC时钟
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);
//初始化端口
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AN; //模拟输入模式
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4|GPIO_Pin_5;//管脚设置
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;//浮空
GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化端口结构体
//初始化DAC,设置DAC工作模式
DAC_InitStructure.DAC_Trigger = DAC_Trigger_None ; //不使用触发功能
DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None; // 不使用波形发生器
DAC_InitStructure.DAC_LFSRUnmask_TriangleAmplitude = DAC_LFSRUnmask_Bit0; //不使用波形发生器所以可以随意设置
DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Disable; //不使用输出缓存
DAC_Init(DAC_Channel_1,&DAC_InitStructure); //通道一初始化DAC
DAC_Init(DAC_Channel_2,&DAC_InitStructure); //通道一初始化DAC
DAC_SetChannel1Data(DAC_Align_12b_R, 0); //12位右对齐数据格式设置DAC值
DAC_SetChannel2Data(DAC_Align_12b_R, 0); //12位右对齐数据格式设置DAC值
DAC_Cmd(DAC_Channel_1, ENABLE); //使能DAC通道1
DAC_Cmd(DAC_Channel_2, ENABLE); //使能DAC通道1
}
void seg_set_init()
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE); //使能PORTF时钟
GPIO_PinAFConfig(GPIOD,GPIO_PinSource12,GPIO_AF_TIM4);
GPIO_PinAFConfig(GPIOD,GPIO_PinSource13,GPIO_AF_TIM4);
GPIO_PinAFConfig(GPIOD,GPIO_PinSource14,GPIO_AF_TIM4);
GPIO_PinAFConfig(GPIOD,GPIO_PinSource15,GPIO_AF_TIM4);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //复用功能
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //速度100MHz
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
GPIO_Init(GPIOD,&GPIO_InitStructure); //初始化PF9
TIM_TimeBaseStructure.TIM_Prescaler=8399; //定时器分频
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式
TIM_TimeBaseStructure.TIM_Period=199; //自动重装载值
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseInit(TIM4,&TIM_TimeBaseStructure);//初始化定时器4
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式1
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
TIM_OC1Init(TIM4, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM1 4OC1
TIM_OC2Init(TIM4, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM1 4OC2
TIM_OC3Init(TIM4, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM1 4OC3
TIM_OC4Init(TIM4, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM1 4OC4
TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable);
TIM_OC2PreloadConfig(TIM4, TIM_OCPreload_Enable);
TIM_OC3PreloadConfig(TIM4, TIM_OCPreload_Enable);
TIM_OC4PreloadConfig(TIM4, TIM_OCPreload_Enable);
TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable);
TIM_OC2PreloadConfig(TIM4, TIM_OCPreload_Enable);
TIM_OC3PreloadConfig(TIM4, TIM_OCPreload_Enable);
TIM_OC4PreloadConfig(TIM4, TIM_OCPreload_Enable);
TIM_ARRPreloadConfig(TIM4,ENABLE);//ARPE使能
TIM_Cmd(TIM4, ENABLE); //使能TIM14
}
void seg_set(uint16_t avge1,uint16_t avge2,uint16_t avge3,uint16_t avge4)
{
uint16_t a1_out,a2_out,a3_out,a4_out;
a1_out=Map(avge1,0,180,5,25);
a2_out=Map(avge2,0,180,5,25);
a3_out=Map(avge3,0,180,5,25);
a4_out=Map(avge4,0,180,5,25);
TIM_SetCompare1(TIM4,a1_out);
TIM_SetCompare2(TIM4,a2_out);
TIM_SetCompare3(TIM4,a3_out);
TIM_SetCompare4(TIM4,a4_out);
}
/*
串口正点原子的usart.c里面都写好了
直接printf就可以串口打印任意字符了
*/
/*
整形转字符串
*/
void int_to_str(int num,uint8_t *str)
{
sprintf(str, "%d", num); // 使用sprintf函数将整数格式化为字符串
}
/*
y:行
str:字符串
如果有占位符就需要像printf那样在后面添加变量参数
例如:
lcd1602_print(0 , "hel %d world", 56);
lcd1602_print(1,"good %d xxx",78);
*/
void lcd1602_print(u8 y, u8 *str,...)
{
u8 cc = 0;
u8 *p = str;
u8 temp[] = "";
va_list args;
va_start(args, str);
LCD1602_Set_Cursor(0, y);
while (*p)
{
if (*p == '%' && *(p + 1) == 'd')
{
int i = va_arg(args, int);
sprintf((char*)temp,"%d",i);
cc =0;
while(temp[cc] != '\0')
{
LCD1602_Write_Dat(temp[cc]);
cc++;
}
p++;
}
else
{
LCD1602_Write_Dat(*p);
}
p++;
}
va_end(args);
}
void SysTick_Init(void)
{
// SystemCoreClock 是系统时钟频率,假设为 168 MHz
if (SysTick_Config(SystemCoreClock / 1000))
{
// 捕获错误
while (1);
}
}
void init_all_device()
{
//初始化GPIO
//any_gpio_init(GPIOA,GPIO_Pin_0);
//初始化延时函数
delay_init(168);
//初始化步进电机/直流电机
Moto_Init(); //pb2-pb5
DCmotor_Init(); //pb15,pb9/pwm1 pb14 pwm2 pb15
//TFT初始化/lcd1602初始化
//TFT_Init(); //pe4-pe5//pg11//pf0-pf15
LCD1602_Init(); //pd3//pc7//pc0//pe0-7
//声音模块
Audio_Init(); //pc0//pd3-pd4
//按键模块初始化
KEY_Init(); //pa6-pa11 *********************单按键扫描和串口一冲突
//KeyArray_Init();//pg0-pg7
//点阵屏初始化
DotMatrix8_Init();//pe0-pe7//pf0-pf7
//单位数码管初始化
smg_init();//pe8-pe15//pf8-pf15//pg8-pg11
//adc初始化
init_adc1();//pa0-pa3
//dac初始化
dac_init(); //pa4-pa5
//串口1初始化//pa9-pa10
uart_init(115200);//初始化波特率为115200
//PWM初始化
TIM4_PWM_Init(100-1,840-1);//1ms周期1khz
//舵机初始化//PD12-PD15
seg_set_init();
//蜂鸣器初始化
buzzer_Init();//pb0
//led初始化
LED_Init();//pb1-4;
//系统滴答定时器初始化1ms进一次中断
SysTick_Init();
}
/*
所有函数使用从此复制
//步进电机函数
void Motorcw(int speed); //步进正转
void Motorccw(int speed); //步进反转
void Motorcw_angle(int angle,int speed);//步进正转转动角度
void Motorccw_angle(int angle,int speed); //步进电机反转角度
void MotorStop(void); //步进电机停止函数
//直流电机驱动
void dc_motor_run(int mode,int speed)//0电机停止 1电机正转 2电机反转 speed 速度
//lcd1602模块
void LCD1602_Show_Str(u8 x, u8 y, char *str);//设置x和y轴 str设置值
void LCD1602_ClearScreen(void); //清屏
//TFT
void TFT320_Clear(uint16_t color);//清屏
void TFT_DisplayChars(uint16_t x, uint16_t y, uint8_t Font, char* p);//设置x轴和y轴颜色和字符
//声音模块
void Audio_Start(const char *str);
//矩阵按键
uint16_t key_scanf();//扫描矩阵按键
//舵机控制 1-4个舵机的角度范围0-180
void seg_set(uint16_t avge1,uint16_t avge2,uint16_t avge3,uint16_t avge4)
//adc采集
u16 Get_Adc(u8 ch);//采集adc1通道值
u16 Get_Adc_Average(u8 ch,u8 times);//采集通道值多次取平均值
//dac输出
DAC_SetChannel1Data(DAC_Align_12b_R,4096);//通道一和通道二
DAC_SetChannel2Data(DAC_Align_12b_R,2048);
//数码管相关函数
void show_smg(int num); //单个数码管显示数字
void show_few_smg(int x,int num);//一组数码管显示值
void show_all_num();//一组数码管刷新函数
//系统滴答定时器中断回调函数,要在main使用需将it里面的注释掉
void SysTick_Handler(void)
{
}
//主函数中放这个刷新函数,代码中只对1602的缓存区进行处理
LCD1602_Show_Str(0,0,lcd1602_buf1);
LCD1602_Show_Str(0,1,lcd1602_buf2);
//1602刷新函数,直接写刷新字符串,例如:lcd1602_flash(0,0,"input passworld");
void lcd1602_flash(uint16_t x,uint16_t y,uint8_t *dat)
{
if(y){memcpy(lcd1602_buf2,dat+x,strlen(dat));}
else{memcpy(lcd1602_buf1,dat+x,strlen(dat));}
}
//y:行
//str:字符串
//如果有占位符就需要像printf那样在后面添加变量参数
//例如:
//lcd1602_print(0 , "hel %d world", 56);
//lcd1602_print(1,"good %d xxx",78);
void lcd1602_print(u8 y, u8 *str,...)
//串口接收
USART_RX_BUF[] //接收数组
/\
/ \
||
||
||
串口接收数组
如果是做接收判断需要修改usart.h文件中USART_REC_LEN的宏定义
用多少个改多少个不然接收的数据会往后推
实例:
if(USART_RX_BUF[0]==0xCC&&USART_RX_BUF[2]==0xEE)//这里宏定义改成了3,只判断帧头和帧尾正确了进入下面
{
if(USART_RX_BUF[1]==0x01){PBout(1)=1;}//中间数据帧为01点亮led
else{PBout(1)=0;} //不为0x01熄灭led
}
//布尔类型的使用
要么直接使用ture或者false
用0和1的话的类型转换如下
bool motor_flat=(bool)0;
//取消警告显示
打开魔术棒
选择c/c++选项
在靠中右的地方有一个warnings
选择 no warnings 就会屏蔽所有警告
*/