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));   //等待校準結束

}