日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

STM32F05x移植GD32F1x0注意事项

發布時間:2023/12/8 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 STM32F05x移植GD32F1x0注意事项 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

提要:costdown

? ? ? ? 前言:本以為能很順利的移植,結果130這顆芯片雖然是M3的core,實際上外部PIN與GPIO等寄存器結構與M0一致,NVIC部分又與M3一致,簡言之,130即有M3的“基因”,也有M0的“基因”,主要這顆芯片是為了與ST的M0芯片搶市場。由于剛上市,所以Library從ST M0的Library基礎稍作修改。寄存器名稱雖然不一樣,但是實際地址與功能是完全一樣。下面重點列出在移植過程中,我遇到的問題:

A0:在Keil中,Device選型:

A0:GD32f130c6應當選擇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上也是一樣的,但是我在移植過程中,忽略了這點。

導致花了一些時間才找到這個問題。找類似這種bug,兩方面著手,一用硬件仿真,看外設寄存器是否與預設一直;二設置完后直接串口打印出來。


Q2、NVIC配置部分需要增加下面兩句,M0無此配置,M3則有。

A2:

/* NVIC configuration for priority grouping */ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); /*定位中斷向量表*/ NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0);

另外中斷優先級配置因為有組的概念,所以也有所不同,如;

STM32F051:

<span style="font-family: Arial, Helvetica, sans-serif;">NVIC_InitStructure.NVIC_IRQChannelPriority = 0x03; //0x03,與IRRec保持一致</span>

GD130:

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;

Q3、EXTI在handler mode進入stop mode后不能喚醒,在thread mode中進入可以喚醒?

A3:

如果在Handler mode進入STOP mode,需要喚醒,則喚醒源的中斷優先級必須必進入stop mode的handler 優先級更高。否則同級或更低級的中斷無法喚醒,除非退出中斷。這也是在thread mode進入可以被喚醒的原因。如在timer2中進入stopmode,在exti按鍵喚醒。demo:

static void PWR_NVIC_Configuration(void) {NVIC_InitTypeDef NVIC_InitStructure;/* Enable the EXTIx global Interrupt */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); }static void TIM2_NVIC_Configuration(void) { NVIC_InitTypeDef NVIC_InitStructure;/* Enable the TIM global Interrupt */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寄存器區別:

A4:SPIx_CR1 Bit11,051中該bit(CRCL)是CRC length,130是FF16(FF16)是data frame formate;

? ? ? ? ?SPIx_CR2 bit15-bit8,130中高8位為保留字節,051則有其他定義,如fifo觸發值與data size。因此130中沒有該庫函數: ? ? ??

SPI_RxFIFOThresholdConfig(LT8900SPI, SPI_RxFIFOThreshold_QF); //8bitsize->QF,16bit->HF 通訊庫函數區別:

M0:

/* Send byte through the SPI1 peripheral */ SPI_SendData8(LT8900SPI, *pu32Data); /* Wait to receive a byte */ while (SPI_I2S_GetFlagStatus(LT8900SPI, SPI_I2S_FLAG_RXNE) == RESET); /* Return the byte read from the SPI bus */ return SPI_ReceiveData8(LT8900SPI);GD130:

/* Send byte through the SPI1 peripheral */ SPI_I2S_SendData(LT8900SPI, *pu32Data); /* Wait to receive a byte */ while (SPI_I2S_GetFlagStatus(LT8900SPI, SPI_I2S_FLAG_RXNE) == RESET); /* Return the byte read from the SPI bus */ return SPI_I2S_ReceiveData(LT8900SPI);
Q5:使用HSE時,有效采樣數的區別:

A5:

ST #define HSE_STARTUP_TIMEOUT ((uint16_t)0x0500) /*!< Time out for HSE start up */ GD130: #define HSE_STARTUP_TIMEOUT ((uint16_t)0x5000) /*!< Time out for HSE start up */
Q6:中斷向量表區別,GD兼容051,但又涵蓋M3的中斷入口。另外051不支持自定義中斷入口偏移地址。

A6:

/* 自動重定位中斷向量表 */ // NVIC_SetVectorTable(NVIC_VectTab_FLASH, (BaseOfROM - NVIC_VectTab_FLASH)); //CM0不支持該功能 Q7:GPIO區別:

A7:雖然130為M3,但是GPIO部分與M0的寄存器結構完全一致。

Q8:Flash區別:

A8:雖然130為M3,但是Flash部分與M0結構大概相同,包含對OB區域的讀寫與讀保護等級,多了一個燒斷功能,此時不能還原為保護或無保護狀態。

? ? ? ? 加讀保護功能與M0一致,在使用JLink Flash中使用去除讀保護是,device必須選擇STM32F101系列,否則去除保護功能無效。

? ? ? ? 但有部分寄存器位有所不同,如:

FLASH->ACR = FLASH_ACR_PRFTBE | FLASH_ACR_LATENCY; //M3不支持該設置


Q9:RCC區別:

A9:M0中只有APB總線給外設提供CLK,但是M3中分了兩組不同的CLK對應不同的外設,分別為APB1,APB2。如下:

M0:

? uint32_t SYSCLK_Frequency;uint32_t HCLK_Frequency;uint32_t PCLK_Frequency;uint32_t ADCCLK_Frequency;/* PCLK = HCLK */ RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE_DIV1;
GD130:

?uint32_t SYSCLK_Frequency; ?/*!< returns SYSCLK clock frequency expressed in Hz */uint32_t HCLK_Frequency; ? ?/*!< returns HCLK clock frequency expressed in Hz */uint32_t PCLK1_Frequency; ? /*!< returns PCLK1 clock frequency expressed in Hz */uint32_t PCLK2_Frequency; ? /*!< returns PCLK2 clock frequency expressed in Hz */uint32_t ADCCLK_Frequency; ?/*!< returns ADCCLK clock frequency expressed in Hz?<span style="font-family: Arial, Helvetica, sans-serif;"> ?</span> <span style="font-family: Arial, Helvetica, sans-serif;"> </span> /* PCLK2 = HCLK */RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1; /* PCLK1 = HCLK */RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV1;
Q10:ID讀取位置:

Flashsize位置不同,130與M3一致,但UID卻與M0一致。如:

M0:

#define rFlashSizeReg (*((uint16_t *)(0x1ffff7cc))) #define Stm32_UIDBase (uint8_t *)(0x1ffff7ac)GD130:

#define rFlashSizeReg (*((uint16_t *)(0x1ffff7e0))) #define Stm32_UIDBase (uint8_t *)(0x1ffff7ac)

Q11:電源特性區別:

A11:


(1)工作電壓2.6-3.6V,待機時電流為250uA;;
(2)由于mcu啟動功耗大于st,因此mcu穩壓電容驗證將1uF改為47uF,解決上電瞬間電流過大,電源特性不穩定,電壓輸出被拉低至2V被強制關機問題;

如下圖:

(1)進入stopmode休眠后,sensorpwr關閉,中斷喚醒后啟動,下圖為電源端與sensorpwr端電壓圖形。GD32端穩壓電容為1uF。

? ? ? ? ? ?同樣由于上電瞬間電壓不穩導致無法啟動芯片,區別圖(3)。



(2)進入stopmode休眠后,sensorpwr關閉,中斷喚醒后啟動,下圖為電源端與sensorpwr端電壓圖形。STM32端穩壓電容為1uF。



3、GD130睡眠后被外部中斷喚醒的SensorPwr,SensorPwr端加47uF穩壓電容,可以正常啟動,但是睡眠后喚醒會出現電壓過低關機的現象。



(4)進入stopmode休眠后,sensorpwr關閉,中斷喚醒后啟動,下圖為電源端與sensorpwr端電壓圖形。GD32端穩壓電容為47uF,Sensor端為1uF電容。



綜上,由于GD32啟動電壓較ST高0.6V,導致開機或休眠被喚醒瞬間電壓不穩導致關機,圖中多次啟動是因為按鍵開關抖動導致多次觸發。

(5)待機功耗,如圖:


總結

以上是生活随笔為你收集整理的STM32F05x移植GD32F1x0注意事项的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。