2021-07-11-gdF103替换st103

2021-07-05~2021-07-09

  • 简述:GDf103vet6替换stf103vet6
  • 一、大致修改的部分
  • 相同点:两个芯片的外围引脚PIN TO PIN兼容,每个引脚上的复用功能也完全相同;
  • 不同点:使用st的库开发时,注意事项:
    1、修改外部晶振起振超时时间,不用外部晶振可跳过这步,原因:GD与ST的启动时间存在差异,为了让GD MCU更准确复位。
    修改:
  将宏定义:
#define HSE_STARTUP_TIMEOUT ((uint16_t)0x0500)
修改为:
#define HSE_STARTUP_TIMEOUT ((uint16_t)0xFFFF)

2、GD32F10X flash取值零等待,而ST需要2个等待周期,因此,一些精确延时或者模拟IIC或SPI的代码可能需要修改。
原因:GD32采用专利技术提高了相同工作频率下的代码执行速度。
修改:如果使用for或while循环做精确定时的,定时会由于代码执行速度加快而使循环的时间变短,因此需要仿真重新计算设计延时。使用Timer定时器无影响。

二、替换过程中遇见的问题:
1、adc1的dma模式,用了其中的通道11-PC1,10-PC0,0-PA1,1-PA0,2-PA2;系统时钟是72Mhz,采集数据正常;插枪的采集电路只有一路,当枪线不同的阻值时,会导致不同电流的判断会面临临界值跳变的现象,因此增加了一路通道采集;结果导致adc其他通道采集都不太准确;经过后期的调试跟踪,及咨询厂家后,得知adc的通道不能有负压或大于3.3V的电压,要不会导致数据出现异常,跟硬件人员沟通后,断开PC0路,用PC2路这路,结果模拟电压值没有问题,adc采集到的数据异常,各种调试后,还是没解决;断开PC2,用PC0,正常;原因已查明,是在配置串口5是用了共同的接口,接口中调用宏给引脚配置时,宏写错了;
代码如下:

int16_t 	AD_DATA[NUM_AD_CHANNEL];	//VIN1~VIN5	PT1000_AD,VPEN_AD,NTC_AD,CC_AD,CP_AD


//------软件定义-----------------------

/*===========================================================================*
 *	函数名称:void BSP_ADC_Init(void)
 *	功能描述:ADC模数转换配置函数
 *	用法说明:
 *	输入参数:
 *	输出参数:
 *	设计人员:
 *	创建日期:
 *==========================================================================*/
void BSP_ADC_Init(void)
{
	ADC_GPIO_Config();
	ADC_Config();
}

/*===========================================================================*
 *	函数名称:void ADC_GPIO_Config(void)
 *	功能描述:ADC模数转换配置函数
 *	用法说明:
 *	输入参数:
 *	输出参数:
 *	设计人员:
 *	创建日期:
 *==========================================================================*/
void ADC_GPIO_Config(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOA| RCC_APB2Periph_GPIOC, ENABLE);
	RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);

	//GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_2;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_0;
	
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
	GPIO_Init(GPIOC, &GPIO_InitStructure);

	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
	GPIO_Init(GPIOA, &GPIO_InitStructure);

}


/*===========================================================================*
 *	函数名称:void ADC_Config(void)
 *	功能描述:ADC模数转换配置函数
 *	用法说明:
 *	输入参数:
 *	输出参数:
 *	设计人员:
 *	创建日期:
 *==========================================================================*/
void ADC_Config(void)
{
	DMA1通道1;外设为ADC1;存储器为AD_DATA;通道数为N个.
	MYDMA_Config(DMA1_Channel1,(u32)&ADC1->DR,(u32)&AD_DATA,NUM_AD_CHANNEL);

	ADC_InitTypeDef ADC_InitStructure;

	//设置ADC分频因子6 72M/6=12M,ADC最大时间不能超过14M,也就是ADC的时钟频率为12MHz
	RCC_ADCCLKConfig(RCC_PCLK2_Div6);

	ADC_DeInit(ADC1);  												//复位ADC1,将外设 ADC1 的全部寄存器重设为缺省值

	ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;					//本次实验使用的是ADC1,并ADC1工作在独立模式ADC_CR1的位19:16,即这几位为0000
	ADC_InitStructure.ADC_ScanConvMode = ENABLE;						//ADC_ScanConvMode 用来设置是否开启扫描模式,本实验开启扫面模式.ADC_CR1的位8
	ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;					//ADC_ContinuousConvMode 用来设置是否开启连续转换模式 模数转换工作在连续转换模式,ADC_CR2的位1
	ADC_InitStructure.ADC_ExternalTrigConv =  ADC_ExternalTrigConv_T2_CC2;	//转换由软件而不是外部触发启动 ADC_CR2的位19:17
	ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;					//ADC数据右对齐ADC_CR2的位11
	ADC_InitStructure.ADC_NbrOfChannel = NUM_AD_CHANNEL;				//顺序进行规则转换的ADC通道的数目ADC_SQR1位23:20
	ADC_Init(ADC1, &ADC_InitStructure);									//根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器

	ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 1, ADC_SampleTime_71Cycles5 );		//CP
	ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 2, ADC_SampleTime_71Cycles5 );		//CP
	ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 3, ADC_SampleTime_71Cycles5 );		//CP
	ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 4, ADC_SampleTime_71Cycles5 );		//CP
	ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 5, ADC_SampleTime_71Cycles5 );		//CP
	ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 6, ADC_SampleTime_71Cycles5 );		//CP
	
	//ADC_RegularChannelConfig(ADC1, ADC_Channel_12, 7,ADC_SampleTime_239Cycles5 );	//CCADC_SampleTime_239Cycles5 
	ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 7,ADC_SampleTime_239Cycles5 );	//CCADC_SampleTime_239Cycles5 

	ADC_RegularChannelConfig(ADC1, ADC_Channel_1  , 8, ADC_SampleTime_239Cycles5 );		//NTC_2
	ADC_RegularChannelConfig(ADC1, ADC_Channel_0  , 9, ADC_SampleTime_239Cycles5 );		//NTC_1
	ADC_RegularChannelConfig(ADC1, ADC_Channel_2  , 10, ADC_SampleTime_239Cycles5 );	//NTC_3	

	//ADC_SoftwareStartConvCmd(ADC1, ENABLE);//软件启动AD转换
	ADC_DiscModeChannelCountConfig(ADC1, NUM_AD_CHANNEL);
	ADC_DiscModeCmd(ADC1, ENABLE);
	ADC_ExternalTrigConvCmd(ADC1, ENABLE);//使能ADC经外部触发启动转换功能

	//使能ADC1的DMA传输,ADC_CR2位8
	ADC_DMACmd(ADC1, ENABLE);

	//使能的ADC1,ADC_CR2位0
	ADC_Cmd(ADC1, ENABLE);

	ADC_ResetCalibration(ADC1); //使能复位校准,ADC_CR2位3
	delay_ms(10);
	while(ADC_GetResetCalibrationStatus(ADC1)); //等待复位校准结束

	ADC_StartCalibration(ADC1);  //开启AD校准,ADC_CR2位2
	while(ADC_GetCalibrationStatus(ADC1));   //等待校准结束

}



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
gdf103复位电路是一种电路设备,用于将电子设备或系统恢复到初始状态,以确保正常运行。复位是指将设备所有的电子元件重新设置为其默认或初始状态。gdf103复位电路通常由复位电源、触发器、电平转换器和保持器等组成。 复位电源是gdf103复位电路的核心部分,它提供供电并控制复位信号的产生和传输。复位电源一般包括稳压器、电容器和电阻等元件,用于提供稳定的电源电压。当外部触发信号到达时,复位电源将产生一个复位信号,并通过连接线路将信号传输到需要复位的电子设备上。 触发器是gdf103复位电路中的另一个重要部分。它用于接收外部触发信号,并将其转换为特定的电平信号。触发器的作用是在接收到触发信号后,产生一个特定时间长度的高电平信号,然后在一定时间后自动恢复为低电平信号。这个时间长度可以通过调整电阻和电容等元件来实现。 电平转换器是用于将触发器输出的电平信号转换为能够驱动需要复位的电子设备的电平信号。它通常通过电平转换器来实现信号的适配和升低压。电平转换器的输出电平要符合被复位设备的工作电压要求。 保持器是gdf103复位电路中的一个重要组成部分。它主要用于延长复位信号的时间长度,以保证被复位设备能够充分恢复到初始状态。保持器通常通过电容器和电阻组成,通过调整电容器和电阻的数值来实现所需的保持时间长度。 综上所述,gdf103复位电路通过复位电源、触发器、电平转换器和保持器等组件的协同工作,实现电子设备的复位功能。它在电子设备运行不正常或需要重新启动时,提供一种有效的手段来确保设备能够正常运行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值