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