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)); //等待校准结束
}