GD32 使用stm32 固件庫

1、 系統

????1) 晶振起振區別

????描述:啟動時間,GD32 與STM32 啟動時間都是2ms,實際上GD 的執行效率快,所以ST 的HSE_STARTUP_TIMEOUT ((uint16_t)0x0500)是2ms,但是這個宏定義值在GD 上時間就更加短了,所以要加大這個值的設置。

????解決方法:將宏定義:

#define HSE_STARTUP_TIMEOUT ((uint16_t)0x0500)

修改為:

#define HSE_STARTUP_TIMEOUT ((uint16_t)0xFFFF)

備注:啟動時間宏定義所在位置:

????1、在V3.X 的庫,其啟動時間宏定義在stm32f10x.h 頭文件中(路徑:\..\Libraries\CMSIS\CM3)。(庫版本的不同,所在目錄也有所不同)

????2、在V3.0 以前的庫,其啟動時間宏定義在stm32f10x_rcc.c 源文件中(HSEStartUp_TimeOut)(路徑:\..\Libraries\STM32F10x_StdPeriph_Driver\src)。

????2) 部分客戶使用有源晶振出現問題,在GD32F103 小容量產品,發現會在MCU 的復位管腳一直把電平拉到0.89V,電平不能保持在高電平。

????描述:是由于部分有源晶振起振時間太快,復位信號還沒有完成導致的

????解決方法:就是在有源晶振的輸入端與地之前并上一個30pf電容。

????3) GD32 MCU 主頻支持108MHz 高性能,在代碼移植方面需要注意事項

????描述:GD32 通過芯片內部加大緩存,提高了相同工作頻率下的代碼執行速度,帶來了高性能的使用體驗。

????解決方法:因此如果代碼有用到for 循環或while 循環語句做精確定時的,定時時間會由于代碼執行速度加快而使循環的時間變短。使用Timer 定時器則沒有影響。

????4) GD32F105/107 系列MCU 配置為108MHz 有何不同

????描述:通過Clock configuration register (RCC_CFGR) 中, 第21 : 18 位為PLLMUL[3:0],再結合第29 位PLLMUL[4]組成5 位的位域來確定PLL 倍頻系數,即通過軟件配置來定義PLL 的倍頻系數,且PLL 輸出頻率絕對不得超過最高主頻(108MHz)。

2. 內部Flash

????1) 芯片設置讀保護用法

????描述:由于GD 的Flash 是自己的專利技術,STM 的Flash 是第三方提供的,所以GD 的Flash 和STM 的Flash 有些許差異。GD 的擦除時間會長一點.

????解決方法:在寫完KEY 序列以后,需要讀該位,確認key 已生效。 所以,這里應該插入

While( ! (FLASH->CR & 0x200 ) ); // Wait OPTWRE 或可簡單插入兩個NOP。

__NOP();

__NOP();

在ST 庫中,只有

FLASH_Status FLASH_EraseOptionBytes(void)

FLASH_Status FLASH_ProgramOptionByteData(uint32_t Address, uint8_t Data)

FLASH_Status FLASH_EnableWriteProtection(uint32_t FLASH_Pages)

FLASH_Status FLASH_ReadOutProtection(FunctionalState NewState)

四個函數需要修改。

????2) IAP 在應用中編程

????描述:GD32 由于自有flash 的0 訪問時序,同STM32 在Flash 的Erase 和Program 上存在差別,GD32 的Erase 和Program 時間比STM32 的稍微長些,建議對Erase 和Program 時間進行修改。

????解決方法:將宏定義

#define EraseTimeout ((uint32_t)0x000B0000)

#define ProgramTimeout ((uint32_t)0x00002000)

修改為:

#define EraseTimeout ((uint32_t)0x000FFFFF)

#define ProgramTimeout ((uint32_t)0x0000FFFF)

備注: Erase 和Program 時間宏定義在stm32f10x_flash.c 源文件中

(路徑:\..\Libraries\STM32F10x_StdPeriph_Driver\src)

3) 用IAR 下載配置

????解決方法:在批量生產的時候首先會燒寫一個USB 的boot,這個boot 自動運行后在由上位機軟件進行燒寫應用程序。如果boot 程序不能自動運行則需要重新插拔一次電源。給生產造成一些麻煩。產生不能自動運行程序的原因是如果程序設置讀保護的話需要等待FLASH_CR 的第9[OPTWRE]位為1.如果沒有置位的話繼續執行就會出錯。由于ST 的執行速度慢,程序執行到讀FLASH_CR 寄存器的時候該位已經置1,GD 的執行速度比較快,程序運行到這的時候該位還沒置1,因此需要在FLASH_ReadOutProtection 函數里面添加一些輪詢該位為1 或者加一些延時。

3. ISP 燒寫軟件

????1) ISP 燒寫,建議使用官方燒寫軟件

????描述:GD32 芯片內部flash 同STM32 有區別。

????解決方法:建議到www.mcuisp.com?下載最新版本的MCUISP。另外GD32 也有專門的燒寫軟件(GigaDevice MCU ISP Programmer)可以到http://bbs.21ic.com/gd32?論壇下載。如果使用自制的ISP 軟件或脫機編程器,實現ST 和GD 完全兼容,建議修改以下參數:

????1、 頁擦除等待超時時間增加至300ms,整片擦除等待超時時間增加至3s 左右。

????2、 字編程等待超時時間增加至2ms,頁編程等等超時時間增加至300ms。

4.I/O 口

????1) IO 口外部中斷使用方法

????描述:在關閉期間,如果外部引腳有電平的變化,在使用IMR 打開中斷后會馬上進入中斷服務程序。理論是打開中斷前,不管管腳是否有電平的變化,都不會影響到打開后的中斷響應。

????解決方法:所以解決方法就是通過禁用上升沿或者下降沿檢測寄存器來開關中斷,不能使用IMR 屏蔽寄存器。程序如下:

EXTI->FTSR &= ~EXTI_Line3; //關閉沿檢測,以達到關閉中斷的目的,下降沿使用FTSR 寄存器,上升沿使用RTSR 寄存器

EXTI->PR = EXTI_Line3;

EXTI->FTSR |= EXTI_Line3;

????2) 在待機模式,PA8 引腳特殊設置

????描述:在使用低功耗的情況下,PA8 會被MCU 在內部被設置為地PA8 復用為MCU 內部頻率輸出,超低功耗設置時需要懸空。

????解決方法:在待機模式,PA8 懸空不用。

????3) 低功耗下必須注意

????描述:在使用低功耗情況下,把軟件全部端口(A-F)時鐘關掉,無論是否有該端口。

4) 當有脈沖群沖擊管腳

????描述:需要在在進入中斷后關閉中斷。

5. 定時器

????1) 定時器輸入捕獲模式需要軟件清中斷

????描述:STM 定時器輸入捕獲模式默認能硬件清中斷,GD 為了更加嚴格要求配置,需要做軟件清中斷 。

????解決方法:軟件清除標志位。

????2) 定時器向上脈沖計數模式設置

????描述:定時器的用法差異。

????解決方法:脈沖計數模式下,裝載值必須設置為比預期值大,否則不計數在ST 上如果重載值不設置(初始為0)的時候,CNT 可以正常計數。 在GD 上如果重載值不設置保持初始為0 的時候,會因為重載值為零,即便是來一個脈沖也會導致所有的寄存器復位從而不能正常計數。

????3) TIM、ADC 模塊

????描述:Timer、ADC 模塊的觸發信號寬度要求。

????解決方法:由于內部有高速和低速兩條外圍總線,Timer、ADC 模塊和其他外設共同使用這兩個總線。GD32F103/101 系列Flash 128KB 及以下的型號,Timer、ADC 等模塊識別觸發信號的條件是觸發信號寬度大于模塊所在總線的時鐘寬度。

6. 串口USART

????1) USART 連續發送數據字節有空閑位

????描述:字節間有空閑位。

????解決方法:對于一般的通訊來說,不會有影響,只對于一般在通訊上有特殊協議的,才會產生數據不準確的情況所以,特定情況,修改程序。

7. I2C 總線

????1) 硬件I2C 特殊配置

????描述:GD 的I2C 相對STM 的來說要少一個標志位

????解決方法

????1、宏地址定義改變

#define I2C_EVENT_SLAVE_TRANSMITTER_ADDRESS_MATCHED

((uint32_t)0x00060002)

#define I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED

((uint32_t)0x00070002)

????2、硬件I2C 在會在向從機發送7bits 地址完成后,從機還沒來得及識別。(看客戶應用)我們可以在發送完7bits 后加個延時,讓從機完全識別:

I2C_Send7bitAddress(I2C1, EEPROM_ADDRESS, I2C_Direction_Transmitter);

{

int i = 0xfff;

while(i --);

}

????3、檢測ADDR 不能使用I2C_CheckEvent 函數,因為他會清除ADDR,可以使用I2C_GetFlagStatus 函數。

就是把while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));

改為while(!I2C_GetFlagStatus(I2C1, I2C_FLAG_ADDR));

????4、還有個關于編程步驟的嚴謹性,跟STM 想比,我們是先Clear_ACK,再Clear_ARRD。

8. ADC 采集

????1) ADC 采樣設置

????描述:ADC 啟動

????解決方法:

????1. 當ADON=0 時寫入1 后,需要等待一段時間t_WAIT,如果用ST 庫的話就在ADC_CMD 后面加20us 左右的延時。

????2. 如果采用中斷獲得采樣數據后,需要軟件清除中斷。

9. SDIO

????1) SDIO DAT 3 pin 的在 1 bit bus mode 和4 bit bus mode 下的配置

????描述:

????1、 SDIO 在 1 bit bus mode 下,DAT 3 pin 是低電平,這樣會導致 SD Card 進入SPI 模式。

????原因:初始化失敗的原因主要是因為GD32 的芯片SDIO 的DAT3 口存在BUG。

????2、 在4 位模式下,通過上面的方法,程序能正常初始化,但不能正常讀寫SD卡。

????原因:因為DAT3 口在前面已經配置成推挽輸出,所以在4 位模式下,不能正常讀下。在調用4 位模式前,把DAT3 的端口配置成復用推挽輸入即可解決問題。

????解決方法 1、 1 bit bus mode 的解決方法:建議在SDIO 使能之前,先把 SDIO DAT 3 pin 配置成推挽輸出,并且要置成高電平,使 SDIO DAT 3 pin 保持高電平即可.

????2、 4 bit bus mode 的解決方法:在調用4 位模式前,把DAT3 的端口配置成復用輸出即可解決問題。

????2) 程序在剛燒完后能正常讀寫SD 卡,斷電再上電后,SD 卡初始化失敗,需要手動復位一次后才正常

描述 在某些SD 卡中,GD32 斷電再上電,會引起SD 卡上的時鐘信號不正常,導致SD 卡發送命令失敗。

????解決方法:在程序中,打開SD 卡時鐘后,增加一小段延時,以保證SD 卡時鐘信號穩定。這個延時添加的地方:在sdcard.c(即SDIO 的配置文件中),然后在SD_Error SD_Init(void)這個函數中找到SDIO_DeInit();就在這個后面加個延時。

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE);

SDIO_DeInit();

{

int i = 0xffff;

while(i --);

}

10. USB

????A. USB_OTG

????1) 客戶使用STM32 的DFU 原工程時需要注意幾點

????解決方法:


????1、 在usb_istr.c 中,增加如下語句

for (i=0;i<8;i++) EP[i] = _GetENDPOINT(i);

for (i=0;i<8;i++)

_SetENDPOINT(i, EP[i] & 0x7070);

????2、 在usb_conf.h 中,按照下圖紅色字體語句進行修改

#if defined(STM32L1XX_MD) || defined(STM32L1XX_HD)||

defined(STM32L1XX_MD_PLUS)

#define INTERN_FLASH_SECTOR_ERASE_TIME 100

#define INTERN_FLASH_SECTOR_WRITE_TIME 104

#else

#define INTERN_FLASH_SECTOR_ERASE_TIME 100

#define INTERN_FLASH_SECTOR_WRITE_TIME 100

????3、 把固件庫中的stm32f10x_flash.c 使用附件的進行替換。

????4、 軟件進行讀保護位時需要選使用FLASH_Unlock();函數

int main(void)

{

#if defined (USE_STM32L152D_EVAL)

FLASH_Unlock();

FLASH_ClearFlag(FLASH_FLAG_OPTVERRUSR);

#endif

FLASH_Unlock();

FLASH_ReadOutProtection(ENABLE);

FLASH_Lock();

????2) 部分USB 兼容性

????解決方法:

????1. 部分U 盤有3 個端點,數組越界導致Itf_Desc 被清空,所以主機不能識別設備類型。USBH_conf.h 文件的USBH_MAX_NUM_ENDPOINTS 的定義由2 改成3 就可以了將:#define USBH_MAX_NUM_ENDPOINTS 2

改為:#define USBH_MAX_NUM_ENDPOINTS 3

????2. 在In 端點中斷處理程序USB_OTG_USBH_handle_hc_n_In_ISR 中,對于NAK 中斷,V1.0.0 版本的處理如下:

else if (hcint.b.nak)

{

if(hcchar.b.eptype == EP_TYPE_INTR)

{

UNMASK_HOST_INT_CHH (num);

USB_OTG_HC_Halt(pdev, num);

CLEAR_HC_INT(hcreg , nak);

}

else if ((hcchar.b.eptype == EP_TYPE_CTRL)||

(hcchar.b.eptype == EP_TYPE_BULK))

{

/* re-activate the channel */

hcchar.b.chen = 1;

hcchar.b.chdis = 0;

USB_OTG_WRITE_REG32(&pdev->regs.HC_REGS[num]->HCCHAR, hcchar.d32);

}

pdev->host.HC_Status = HC_NAK;

}

而V2.1.0 版本的NAK 處理過程如下:

else if (hcint.b.nak)

{

if(hcchar.b.eptype == EP_TYPE_INTR)

{

UNMASK_HOST_INT_CHH (num);

USB_OTG_HC_Halt(pdev, num);

}

else if ((hcchar.b.eptype == EP_TYPE_CTRL)||

(hcchar.b.eptype == EP_TYPE_BULK))

{

/* re-activate the channel */

hcchar.b.chen = 1;

hcchar.b.chdis = 0;

USB_OTG_WRITE_REG32(&pdev->regs.HC_REGS[num]->HCCHAR, hcchar.d32);

}

pdev->host.HC_Status[num] = HC_NAK;

CLEAR_HC_INT(hcreg , nak);


}

????唯一的區別就是CLEAR_HC_INT(hcreg , nak)的位置,在V1.0.0 版本中對于CTRL 和BULK 端點的NAK 中斷沒有清除NAK,我們的芯片會因此產生多次IN 傳輸的請求,導致數據傳輸錯 誤。改為V2.1.1 的寫法后傳輸正常。(注意HC_Status 在V2.1.0 是數組,在V1.0.0 是單個數據,直接拷貝的話要去掉后面的[num])

B. USB 外設的工作頻率有限制

????描述:有最低工作頻率的要求,也就是APB1 分頻后的時鐘必須大于12MHz,比如HCLK 為56MHz,APB1 的最大分頻系數為4,56/4 = 14MHz,可以正常工作。

11. SPI

????1) 輸入與輸出配置要求(STM32 不需要如此要求)

????解決方法 :

????GD32 在使用SPI 時,IO 的配置必須嚴格遵守主從模式下的輸入與輸出配置,而STM32 無此要求,相關代碼如下:主機模式下IO 配置(主機以SPI 為例):

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_7;

GPIO_Init(GPIOA,&GPIO_InitStructure);

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;

GPIO_Init(GPIOA,&GPIO_InitStructure);

從機模式下IO 配置(從機以SPI2 為例):

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_15;

GPIO_Init(GPIOB,&GPIO_InitStructure);

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;

GPIO_Init(GPIOB,&GPIO_InitStructure);

????3) 在GD32 的SPI 的時鐘信號,空閑狀態需要配置成高電平,以保證數據的穩定性,具體代碼如下

????解決方法

SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;

SPI_InitStructure.SPI_Mode = SPI_Mode_Master;


SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;

SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;

SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;

SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;

SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;

SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;

SPI_InitStructure.SPI_CRCPolynomial = 7;

SPI_Init(SPI1, &SPI_InitStructure);

????4) 當作為從機時,在GD32 中,時鐘信號必須為8 的整數倍。

????解決方法

SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;

SPI_InitStructure.SPI_Mode = SPI_Mode_Master;

SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;

SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;

SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;

SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;

SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;

SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;

SPI_InitStructure.SPI_CRCPolynomial = 7;

SPI_Init(SPI1, &SPI_InitStructure);

????5) 在GD32 中,不能使用SPI_I2S_FLAG_BSY 該位來判斷SPI 總線數據是否接收或發送完成。


12. 看門狗

????1) 進入STOP 模式前打開看門狗,通過RTC 的ALR 喚醒后,程序會不斷被復位的現像

????描述:IWDG 內部有個Reload 信號,KEY 寄存器寫AAAA 會使其拉高,過一段時間自動拉低。在拉底之前進入STOP 狀態會使Reload 信號一直為高,等到退出STOP 后也保持為高,之后再寫AAAA 沒有辦法讓Reload 產生上升沿,也就沒辦法更新計數器了。

????解決方法:進STOP 之前不要Reload,也可以調整下程序的順序,把IWDG 的配置放到RTC配置之前,效果是一樣的。


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/457856.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/457856.shtml
英文地址,請注明出處:http://en.pswp.cn/news/457856.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

干將莫邪

干將莫邪也為凡鐵鑄成&#xff0c;只是善加鍛造、融入心神&#xff0c;而成上古神兵。寶劍從來都是雙刃&#xff0c;正邪之道&#xff0c;存乎一心。

js反混淆還原工具_SATURN反混淆框架

本文為看雪論壇精華文章看雪論壇作者ID&#xff1a;夢野間摘要&#xff1a;近幾年&#xff0c;軟件的混淆強度一直在不斷提升。基于編譯器的混淆已經成為業界事實上的標準&#xff0c;最近的一些論文也表明軟件的保護方式使用的是編譯器級別的混淆。在這篇文章中&#xff0c;我…

android 彈起鍵盤把ui頂上去的解決辦法

鍵盤輸入框上面的ui布局必須為Relative相對布局。然后設置 <activityandroid:name".activity.HomeActivity"Android:windowSoftInputMode"adjustPan|stateHidden"></activity>轉載于:https://www.cnblogs.com/zhaoleigege/p/5925831.html

python 多線程并發_尋找python大神!!!python如何多線程并發?

不是大神。嘗試回答一下。 首先解釋下什么叫做線程&#xff0c;什么叫做進程&#xff0c;在解釋這兩個概念前&#xff0c;我們還需要明白什么叫做GIL全局解釋器鎖。GIL 全局解釋器鎖&#xff1a; GIL(全局解釋器鎖&#xff0c;GIL 只有cpython有)&#xff1a;在同一個時刻&…

Nginx/Apache發大招

導讀網站程序的上傳目錄通常是不需要PHP執行解釋權限&#xff0c;通過限制目錄的PHP執行權限可以提網站的安全性&#xff0c;減少被攻擊的機率。下面和大家一起分享下如何在Apache和Nginx禁止上傳目錄里PHP的執行權限。 Apache下禁止指定目錄運行PHP腳本在虛擬主機配置文件中增…

第二輪沖刺-Runner站立會議08

今天完成的內容&#xff1a;簡單的做了一下主界面的美化和日歷界面的美化 遇到的問題&#xff1a;美化按鈕還不能自己自定義按鈕 如何解決&#xff1a;暫無思路 明天將要進行的內容&#xff1a;調試bug 轉載于:https://www.cnblogs.com/Againzg/p/5544301.html

STM32串口通信中使用printf發送數據配置方法 開發環境 Keil

STM32串口通信中使用printf發送數據配置方法(開發環境 Keil RVMDK) 已有 12456 次閱讀2011-6-29 23:29 | 在STM32串口通信程序中使用printf發送數據&#xff0c;非常的方便。可在剛開始使用的時候總是遇到問題&#xff0c;常見的是硬件訪真時無法進入main主函數&#xff0c;其實…

dmp文件查看表空間_innoDb文件

一&#xff0e;文件總體概述InnoDb文件主要有以下文件1. 參數文件&#xff1a;啟動需要的各種參數作2. 日志文件&#xff1a;記錄mysql實例某種條件做出的響應而寫入的文件&#xff0c;如錯誤日志、二進制日志、慢查詢日志、查詢日志等3. Socket文件&#xff1a;連接需要的文件…

論文筆記之:Deep Attention Recurrent Q-Network

Deep Attention Recurrent Q-Network 5vision groups 摘要&#xff1a;本文將 DQN 引入了 Attention 機制&#xff0c;使得學習更具有方向性和指導性。&#xff08;前段時間做一個工作打算就這么干&#xff0c;誰想到&#xff0c;這么快就被這幾個孩子給實現了&#xff0c;自愧…

Codeforces Round #354 (Div. 2)

貪心 A Nicholas and Permutation #include <bits/stdc.h>typedef long long ll; const int N 1e5 5; int a[105]; int pos[105];int main() {int n;scanf ("%d", &n);for (int i1; i<n; i) {scanf ("%d", ai);pos[a[i]] i;}int ans abs …

linux c程序中內核態與用戶態內存存儲問題

Unix/Linux的體系架構 如上圖所示&#xff0c;從宏觀上來看&#xff0c;Linux操作系統的體系架構分為用戶態和內核態&#xff08;或者用戶空間和內核&#xff09;。內核從本質上看是一種軟件——控制計算機的硬件資源&#xff0c;并提供上層應用程序運行的環境。用戶態即上層應…

線程自動退出_C++基礎 多線程筆記(一)

join & detachjoin和detach為最基本的用法&#xff0c;join可以使主線程&#xff08;main函數&#xff09;等待子線程&#xff08;自定義的function_1函數&#xff09;完成后再退出程序&#xff0c;而detach可以使子線程與主線程毫無關聯的獨立運行&#xff0c;當主線程執行…

WEB在線預覽PDF

這是我在博客園發表的第一篇文章。以后會陸續把在線預覽其他格式文檔的解決方案發表出來。 解決思路&#xff1a;把pdf轉換成html顯示。 在線預覽pdf我暫時了解3種解決方案&#xff0c;歡迎大家補充。 方案一&#xff1a; 利用pdf2html軟件將PDF轉換成HTML。 用法: PDF2HTML [選…

[算法]判斷一個數是不是2的N次方

如果一個數是2^n&#xff0c;說明這個二進制里面只有一個1。除了1. a (10000)b a-1 (01111)b a&(a-1) 0。 如果一個數不是2^n&#xff0c; 說明它的二進制里含有多一個1。 a (1xxx100)b a-1(1xxx011)b 那么 a&(a-1)就是 (1xxx000)b&#xff0c; 而不會為0。 所以可…

VMware Ubuntu 全屏問題解決

在終端中輸入&#xff1a; sudo apt install open-vm* 回車 自動解決

數組拼接時中間怎么加入空格_【題解二維數組】1123:圖像相似度

1123&#xff1a;圖像相似度時間限制: 1000 ms 內存限制: 65536 KB【題目描述】給出兩幅相同大小的黑白圖像(用0-1矩陣)表示&#xff0c;求它們的相似度。說明&#xff1a;若兩幅圖像在相同位置上的像素點顏色相同&#xff0c;則稱它們在該位置具有相同的像素點。兩幅圖像的…

(舊)子數涵數·C語言——條件語句

首先&#xff0c;我們講一下理論知識&#xff0c;在編程中有三種結構&#xff0c;分別是順序結構、條件結構、循環結構&#xff0c;如果用流程圖來表示的話就是&#xff1a; 那么在C語言中&#xff0c;如何靈活運用這三種結構呢&#xff1f;這就需要用到控制語句了。 而條件語句…

apache.commons.lang.StringUtils 使用心得

apache.commons.lang.StringUtils 使用心得 轉載于:https://www.cnblogs.com/qinglizlp/p/5549687.html

python哪個版本支持xp_windows支持哪個版本的python

Windows操作系統支持Python的Python2版本和Python3版本&#xff0c;下載安裝時要根據windows的操作系統來選擇對應的Python安裝包&#xff0c;否則將不能安裝成功。 Python是跨平臺的&#xff0c;免費開源的一門計算機編程語言。是一種面向對象的動態類型語言&#xff0c;最初被…

Ubuntu 鍵盤錯位解決 更改鍵盤布局

原因是鍵盤布局不能適應鍵盤 解絕方法&#xff1a;更改鍵盤布局 一般改為標準104鍵盤就行 在終端輸入 sudo dpkg-reconfigure keyboard-configuration 選擇 標準104鍵盤 然后一直回車就行