STM32F05x移植GD32F1x0注意事項
提要:costdown
前言:本以為能很順利的移植,結(jié)果130這顆芯片雖然是M3的core,實際上外部PIN與GPIO等寄存器結(jié)構(gòu)與M0一致,NVIC部分又與M3一致,簡言之,130即有M3的“基因”,也有M0的“基因”,主要這顆芯片是為了與ST的M0芯片搶市場。由于剛上市,所以Library從ST M0的Library基礎(chǔ)稍作修改。寄存器名稱雖然不一樣,但是實際地址與功能是完全一樣。下面重點列出在移植過程中,我遇到的問題:
A0:在Keil中,Device選型:
A0:GD32f130c6應(yīng)當(dāng)選擇STM32F101C6/8,因為該系列寄存器與GD130最接近。左圖為100,右圖為101,實際130的SPI包含I2SCFGR與I2SPR寄存器。
另外使用STLINK讀取的Device,如圖:
Q1、EXTI中斷無效?
A1:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,ENABLE);
SYSCFG_EXTILineConfig(PWR_EXTI_PORT_SOURCE,PWR_EXTI_PIN_SOURCE);
其中在操作SYSCFG寄存器時,必須先使能SYSCFG的CLK,這個問題在M0上也是一樣的,但是我在移植過程中,忽略了這點。
導(dǎo)致花了一些時間才找到這個問題。找類似這種bug,兩方面著手,一用硬件仿真,看外設(shè)寄存器是否與預(yù)設(shè)一直;二設(shè)置完后直接串口打印出來。
Q2、NVIC配置部分需要增加下面兩句,M0無此配置,M3則有。
A2:
/*NVICconfigurationforprioritygrouping*/
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
/*定位中斷向量表*/
NVIC_SetVectorTable(NVIC_VectTab_FLASH,0);
另外中斷優(yōu)先級配置因為有組的概念,所以也有所不同,如;
STM32F051:
NVIC_InitStructure.NVIC_IRQChannelPriority=0x03;//0x03,與IRRec保持一致
GD130:
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=3;
Q3、EXTI在handler mode進入stop mode后不能喚醒,在thread mode中進入可以喚醒?
A3:
如果在Handler mode進入STOP mode,需要喚醒,則喚醒源的中斷優(yōu)先級必須必進入stop mode的handler 優(yōu)先級更高。否則同級或更低級的中斷無法喚醒,除非退出中斷。這也是在thread mode進入可以被喚醒的原因。如在timer2中進入stopmode,在exti按鍵喚醒。demo:
staticvoidPWR_NVIC_Configuration(void)
{
NVIC_InitTypeDefNVIC_InitStructure;
/*EnabletheEXTIxglobalInterrupt*/
NVIC_InitStructure.NVIC_IRQChannel=PWR_EXTI_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=3;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
staticvoidTIM2_NVIC_Configuration(void)
{
NVIC_InitTypeDefNVIC_InitStructure;
/*EnabletheTIMglobalInterrupt*/
NVIC_InitStructure.NVIC_IRQChannel=KEY_TIM_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=3;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
Q4:SPI寄存器區(qū)別:
A4:SPIx_CR1 Bit11,051中該bit(CRCL)是CRC length,130是FF16(FF16)是data frame formate;
SPIx_CR2 bit15-bit8,130中高8位為保留字節(jié),051則有其他定義,如fifo觸發(fā)值與data size。因此130中沒有該庫函數(shù):
SPI_RxFIFOThresholdConfig(LT8900SPI,SPI_RxFIFOThreshold_QF);//8bitsize->QF,16bit->HF
通訊庫函數(shù)區(qū)別:
M0:
/*SendbytethroughtheSPI1peripheral*/
SPI_SendData8(LT8900SPI,*pu32Data);
/*Waittoreceiveabyte*/
while(SPI_I2S_GetFlagStatus(LT8900SPI,SPI_I2S_FLAG_RXNE)==RESET);
/*ReturnthebytereadfromtheSPIbus*/
returnSPI_ReceiveData8(LT8900SPI);
GD130:
/*SendbytethroughtheSPI1peripheral*/
SPI_I2S_SendData(LT8900SPI,*pu32Data);
/*Waittoreceiveabyte*/
while(SPI_I2S_GetFlagStatus(LT8900SPI,SPI_I2S_FLAG_RXNE)==RESET);
/*ReturnthebytereadfromtheSPIbus*/
returnSPI_I2S_ReceiveData(LT8900SPI);
Q5:使用HSE時,有效采樣數(shù)的區(qū)別:
A5:
ST
#defineHSE_STARTUP_TIMEOUT((uint16_t)0x0500)/*! GD130: #defineHSE_STARTUP_TIMEOUT((uint16_t)0x5000)/*! A6: /*自動重定位中斷向量表*/ /NVIC_SetVectorTable(NVIC_VectTab_FLASH,(BaseOfROM-NVIC_VectTab_FLASH));//CM0不支持該功能 Q7:GPIO區(qū)別: A7:雖然130為M3,但是GPIO部分與M0的寄存器結(jié)構(gòu)完全一致。 Q8:Flash區(qū)別: A8:雖然130為M3,但是Flash部分與M0結(jié)構(gòu)大概相同,包含對OB區(qū)域的讀寫與讀保護等級,多了一個燒斷功能,此時不能還原為保護或無保護狀態(tài)。 加讀保護功能與M0一致,在使用JLink Flash中使用去除讀保護是,device必須選擇STM32F101系列,否則去除保護功能無效。 但有部分寄存器位有所不同,如: FLASH->ACR=FLASH_ACR_PRFTBE|FLASH_ACR_LATENCY;//M3不支持該設(shè)置 Q9:RCC區(qū)別: A9:M0中只有APB總線給外設(shè)提供CLK,但是M3中分了兩組不同的CLK對應(yīng)不同的外設(shè),分別為APB1,APB2。如下: M0: uint32_tSYSCLK_Frequency; uint32_tHCLK_Frequency; uint32_tPCLK_Frequency; uint32_tADCCLK_Frequency;/*PCLK=HCLK*/ RCC->CFGR|=(uint32_t)RCC_CFGR_PPRE_DIV1; uint32_tSYSCLK_Frequency;/*! uint32_tHCLK_Frequency;/*! uint32_tPCLK1_Frequency;/*! uint32_tPCLK2_Frequency;/*! uint32_tADCCLK_Frequency;/*! /*PCLK2=HCLK*/ RCC->CFGR|=(uint32_t)RCC_CFGR_PPRE2_DIV1; /*PCLK1=HCLK*/ RCC->CFGR|=(uint32_t)RCC_CFGR_PPRE1_DIV1; Flashsize位置不同,130與M3一致,但UID卻與M0一致。如: M0: #definerFlashSizeReg(*((uint16_t*)(0x1ffff7cc))) #defineStm32_UIDBase(uint8_t*)(0x1ffff7ac) GD130: #definerFlashSizeReg(*((uint16_t*)(0x1ffff7e0))) #defineStm32_UIDBase(uint8_t*)(0x1ffff7ac) A11: (1)工作電壓2.6-3.6V,待機時電流為250uA;; 如下圖: (1)進入stopmode休眠后,sensorpwr關(guān)閉,中斷喚醒后啟動,下圖為電源端與sensorpwr端電壓圖形。GD32端穩(wěn)壓電容為1uF。 同樣由于上電瞬間電壓不穩(wěn)導(dǎo)致無法啟動芯片,區(qū)別圖(3)。 (2)進入stopmode休眠后,sensorpwr關(guān)閉,中斷喚醒后啟動,下
Q6:中斷向量表區(qū)別,GD兼容051,但又涵蓋M3的中斷入口。另外051不支持自定義中斷入口偏移地址。
GD130:
Q10:ID讀取位置:
Q11:電源特性區(qū)別:
(2)由于mcu啟動功耗大于st,因此mcu穩(wěn)壓電容驗證將1uF改為47uF,解決上電瞬間電流過大,電源特性不穩(wěn)定,電壓輸出被拉低至2V被強制關(guān)機問題;