GD32F4時鐘配置

1.前言

硬件:GD32F450? 最高時鐘頻率200MHZ(外部晶振8MHZ)

軟件:KEIL(V5.35)?

固件包:GD32F4xx_Firmware_Library_V3.2.0

2.時鐘樹

時鐘配置大概流程如下圖紅線指示,GD32F470的最高頻率可以到240MHZ,GD32F450最高頻率可以通過PLL倍頻到200MHZ。

預分頻器可以配置AHB/APB2/APB1域的時鐘頻率。AHB/APB2/APB1域的最高時鐘頻率分別為200MHZ/100MHZ/50MHZ。

3.軟件配置

3.1 修改晶振頻率

在system_gd32f4xx.c中,需要根據實際使用的外部晶振頻率修改__HXTAL的值,也就是HXTAL_VALUE的值,具體在gd32f4xx.h中修改。

#include "gd32f4xx.h"/* system frequency define */
#define __IRC16M          (IRC16M_VALUE)            /* internal 16 MHz RC oscillator frequency */
#define __HXTAL           (HXTAL_VALUE)             /* high speed crystal oscillator frequency */
//#define __SYS_OSC_CLK     (__IRC16M)                /* main oscillator frequency */
//沒有用到
#define __SYS_OSC_CLK     (__HXTAL)                /* main oscillator frequency *//* select a system clock by uncommenting the following line */
//#define __SYSTEM_CLOCK_IRC16M                   (uint32_t)(__IRC16M)
//#define __SYSTEM_CLOCK_HXTAL                    (uint32_t)(__HXTAL)
//#define __SYSTEM_CLOCK_120M_PLL_IRC16M          (uint32_t)(120000000)
//#define __SYSTEM_CLOCK_120M_PLL_8M_HXTAL          (uint32_t)(120000000)
//#define __SYSTEM_CLOCK_120M_PLL_25M_HXTAL       (uint32_t)(120000000)
//#define __SYSTEM_CLOCK_168M_PLL_IRC16M          (uint32_t)(168000000)
//#define __SYSTEM_CLOCK_168M_PLL_8M_HXTAL        (uint32_t)(168000000)
//#define __SYSTEM_CLOCK_168M_PLL_25M_HXTAL       (uint32_t)(168000000)
//#define __SYSTEM_CLOCK_200M_PLL_IRC16M          (uint32_t)(200000000)
#define __SYSTEM_CLOCK_200M_PLL_8M_HXTAL        (uint32_t)(200000000)
//#define __SYSTEM_CLOCK_200M_PLL_25M_HXTAL       (uint32_t)(200000000)

gd32f4xx.h,實際使用的是8MHZ晶振,如果使用的是其他頻率的晶振,需要對應修改。很多時候串口通信異常就是時鐘頻率不對導致的。如果上面的宏定義里面沒有自己想要的頻率,可以參考官方寫好的時鐘配置函數來設置PLL_M/PLL_N/PLL_P/PLL_Q。

#ifndef GD32F4XX_H
#define GD32F4XX_H#ifdef cplusplusextern "C" {
#endif /* define GD32F4xx */
#if !defined (GD32F450)  && !defined (GD32F405) && !defined (GD32F407)/* #define GD32F450 *//* #define GD32F405 *//* #define GD32F407 */
#endif /* define GD32F4xx */#if !defined (GD32F450)  && !defined (GD32F405) && !defined (GD32F407)#error "Please select the target GD32F4xx device in gd32f4xx.h file"
#endif /* undefine GD32F4xx tip *//* define value of high speed crystal oscillator (HXTAL) in Hz */
#if !defined  (HXTAL_VALUE)
#define HXTAL_VALUE    ((uint32_t)8000000)
#endif /* high speed crystal oscillator value *//* define startup timeout value of high speed crystal oscillator (HXTAL) */
#if !defined  (HXTAL_STARTUP_TIMEOUT)
#define HXTAL_STARTUP_TIMEOUT   ((uint16_t)0x0fff)//0x0800
#endif /* high speed crystal oscillator startup timeout */

3.2 時鐘初始化

打開 __SYSTEM_CLOCK_200M_PLL_8M_HXTAL 宏定義,也可以配置成168MHZ,根據實際情況來配置。系統默認選擇的是內部時鐘的那個宏定義。

說明: __SYS_OSC_CLK 這個宏定義改不改都沒關系,沒有用到這個宏。

/* system frequency define */
#define __IRC16M          (IRC16M_VALUE)            /* internal 16 MHz RC oscillator frequency */
#define __HXTAL           (HXTAL_VALUE)             /* high speed crystal oscillator frequency */
//#define __SYS_OSC_CLK     (__IRC16M)                /* main oscillator frequency */
//沒有用到
#define __SYS_OSC_CLK     (__HXTAL)                /* main oscillator frequency *//* select a system clock by uncommenting the following line */
//#define __SYSTEM_CLOCK_IRC16M                   (uint32_t)(__IRC16M)
//#define __SYSTEM_CLOCK_HXTAL                    (uint32_t)(__HXTAL)
//#define __SYSTEM_CLOCK_120M_PLL_IRC16M          (uint32_t)(120000000)
//#define __SYSTEM_CLOCK_120M_PLL_8M_HXTAL          (uint32_t)(120000000)
//#define __SYSTEM_CLOCK_120M_PLL_25M_HXTAL       (uint32_t)(120000000)
//#define __SYSTEM_CLOCK_168M_PLL_IRC16M          (uint32_t)(168000000)
//#define __SYSTEM_CLOCK_168M_PLL_8M_HXTAL        (uint32_t)(168000000)
//#define __SYSTEM_CLOCK_168M_PLL_25M_HXTAL       (uint32_t)(168000000)
//#define __SYSTEM_CLOCK_200M_PLL_IRC16M          (uint32_t)(200000000)
#define __SYSTEM_CLOCK_200M_PLL_8M_HXTAL        (uint32_t)(200000000)
//#define __SYSTEM_CLOCK_200M_PLL_25M_HXTAL       (uint32_t)(200000000)
#ifdef __SYSTEM_CLOCK_IRC16M
uint32_t SystemCoreClock = __SYSTEM_CLOCK_IRC16M;
static void system_clock_16m_irc16m(void);
#elif defined (__SYSTEM_CLOCK_HXTAL)
uint32_t SystemCoreClock = __SYSTEM_CLOCK_HXTAL;
static void system_clock_hxtal(void);
#elif defined (__SYSTEM_CLOCK_120M_PLL_IRC16M)
uint32_t SystemCoreClock = __SYSTEM_CLOCK_120M_PLL_IRC16M;
static void system_clock_120m_irc16m(void);
#elif defined (__SYSTEM_CLOCK_120M_PLL_8M_HXTAL)
uint32_t SystemCoreClock = __SYSTEM_CLOCK_120M_PLL_8M_HXTAL;
static void system_clock_120m_8m_hxtal(void);
#elif defined (__SYSTEM_CLOCK_120M_PLL_25M_HXTAL)
uint32_t SystemCoreClock = __SYSTEM_CLOCK_120M_PLL_25M_HXTAL;
static void system_clock_120m_25m_hxtal(void);
#elif defined (__SYSTEM_CLOCK_168M_PLL_IRC16M)
uint32_t SystemCoreClock = __SYSTEM_CLOCK_168M_PLL_IRC16M;
static void system_clock_168m_irc16m(void);
#elif defined (__SYSTEM_CLOCK_168M_PLL_8M_HXTAL)
uint32_t SystemCoreClock = __SYSTEM_CLOCK_168M_PLL_8M_HXTAL;
static void system_clock_168m_8m_hxtal(void);
#elif defined (__SYSTEM_CLOCK_168M_PLL_25M_HXTAL)
uint32_t SystemCoreClock = __SYSTEM_CLOCK_168M_PLL_25M_HXTAL;
static void system_clock_168m_25m_hxtal(void);
#elif defined (__SYSTEM_CLOCK_200M_PLL_IRC16M)
uint32_t SystemCoreClock = __SYSTEM_CLOCK_200M_PLL_IRC16M;
static void system_clock_200m_irc16m(void);
#elif defined (__SYSTEM_CLOCK_200M_PLL_8M_HXTAL)
uint32_t SystemCoreClock = __SYSTEM_CLOCK_200M_PLL_8M_HXTAL;
static void system_clock_200m_8m_hxtal(void);
#elif defined (__SYSTEM_CLOCK_200M_PLL_25M_HXTAL)
uint32_t SystemCoreClock = __SYSTEM_CLOCK_200M_PLL_25M_HXTAL;
static void system_clock_200m_25m_hxtal(void);#endif /* __SYSTEM_CLOCK_IRC16M *//* configure the system clock */
static void system_clock_config(void);/*!\brief      setup the microcontroller system, initialize the system\param[in]  none\param[out] none\retval     none
*/
void SystemInit (void)
{/* FPU settings ------------------------------------------------------------*/#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2));  /* set CP10 and CP11 Full Access */#endif/* Reset the RCU clock configuration to the default reset state ------------*//* Set IRC16MEN bit */RCU_CTL |= RCU_CTL_IRC16MEN;RCU_MODIFY/* Reset CFG0 register */RCU_CFG0 = 0x00000000U;/* Reset HXTALEN, CKMEN and PLLEN bits */RCU_CTL &= ~(RCU_CTL_PLLEN | RCU_CTL_CKMEN | RCU_CTL_HXTALEN);/* Reset PLLCFGR register */RCU_PLL = 0x24003010U;/* Reset HSEBYP bit */RCU_CTL &= ~(RCU_CTL_HXTALBPS);/* Disable all interrupts */RCU_INT = 0x00000000U;/* Configure the System clock source, PLL Multiplier and Divider factors, AHB/APBx prescalers and Flash settings ----------------------------------*/system_clock_config();
}

在SystemInit()函數最后調用時鐘配置函數 system_clock_config(),外部晶振為無源晶振。

#elif defined (__SYSTEM_CLOCK_200M_PLL_8M_HXTAL)
/*!\brief      configure the system clock to 200M by PLL which selects HXTAL(8M) as its clock source\param[in]  none\param[out] none\retval     none
*/
static void system_clock_200m_8m_hxtal(void)
{uint32_t timeout = 0U;uint32_t stab_flag = 0U;/* enable HXTAL */RCU_CTL |= RCU_CTL_HXTALEN;//HXTAL_STARTUP_TIMEOUT 默認為0x0800,需要加大等待晶振穩定的時長,改為0x0fff/* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */do{timeout++;stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB);}while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout));/* if fail */if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){while(1){}}RCU_APB1EN |= RCU_APB1EN_PMUEN;PMU_CTL |= PMU_CTL_LDOVS;/* HXTAL is stable *//* AHB = SYSCLK */RCU_CFG0 |= RCU_AHB_CKSYS_DIV1;/* APB2 = AHB/2 */RCU_CFG0 |= RCU_APB2_CKAHB_DIV2;/* APB1 = AHB/4 */RCU_CFG0 |= RCU_APB1_CKAHB_DIV4;/* Configure the main PLL, PLL_M = 8, PLL_N = 400, PLL_P = 2, PLL_Q = 9 */ RCU_PLL = (8U | (400U << 6U) | (((2U >> 1U) - 1U) << 16U) |(RCU_PLLSRC_HXTAL) | (9U << 24U));/* enable PLL */RCU_CTL |= RCU_CTL_PLLEN;/* wait until PLL is stable */while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){}/* Enable the high-drive to extend the clock frequency to 200 Mhz */PMU_CTL |= PMU_CTL_HDEN;while(0U == (PMU_CS & PMU_CS_HDRF)){}/* select the high-drive mode */PMU_CTL |= PMU_CTL_HDS;while(0U == (PMU_CS & PMU_CS_HDSRF)){} /* select PLL as system clock */RCU_CFG0 &= ~RCU_CFG0_SCS;RCU_CFG0 |= RCU_CKSYSSRC_PLLP;/* wait until PLL is selected as system clock */while(0U == (RCU_CFG0 & RCU_SCSS_PLLP)){}
}

避坑指南:在使用GD32F450的時候,時鐘配置時,等待外部時鐘穩定,HXTAL_STARTUP_TIMEOUT,這個宏默認為0x0800,有時候外部晶振在這個超時時間內沒有穩定,會導致程序卡死。我這邊將這個宏定義修改為0x0FFF,超時時間延長一倍,等待外部晶振穩定。

在gd32f4xx.h中修改HXTAL_STARTUP_TIMEUP這個宏的值,默認為0x0800。

/* define GD32F4xx */
#if !defined (GD32F450)  && !defined (GD32F405) && !defined (GD32F407)/* #define GD32F450 *//* #define GD32F405 *//* #define GD32F407 */
#endif /* define GD32F4xx */#if !defined (GD32F450)  && !defined (GD32F405) && !defined (GD32F407)#error "Please select the target GD32F4xx device in gd32f4xx.h file"
#endif /* undefine GD32F4xx tip *//* define value of high speed crystal oscillator (HXTAL) in Hz */
#if !defined  (HXTAL_VALUE)
#define HXTAL_VALUE    ((uint32_t)8000000)
#endif /* high speed crystal oscillator value *//* define startup timeout value of high speed crystal oscillator (HXTAL) */
#if !defined  (HXTAL_STARTUP_TIMEOUT)
#define HXTAL_STARTUP_TIMEOUT   ((uint16_t)0x0fff)//0x0800
#endif /* high speed crystal oscillator startup timeout */

如果外部晶振使用的是有源晶振,需要修改函數system_clock_200m_8m_hxtal(),在函數最前面添加rcu_osci_bypass_mode_enable(RCU_HXTAL)函數。

#elif defined (__SYSTEM_CLOCK_200M_PLL_8M_HXTAL)
/*!\brief      configure the system clock to 200M by PLL which selects HXTAL(8M) as its clock source\param[in]  none\param[out] none\retval     none
*/
static void system_clock_200m_8m_hxtal(void)
{uint32_t timeout = 0U;uint32_t stab_flag = 0U;rcu_osci_bypass_mode_enable(RCU_HXTAL);//外部有源晶振/* enable HXTAL */RCU_CTL |= RCU_CTL_HXTALEN;//HXTAL_STARTUP_TIMEOUT 默認為0x0800,需要加大等待晶振穩定的時長,改為0x0fff/* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */do{timeout++;stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB);}while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout));/* if fail */if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){while(1){}}RCU_APB1EN |= RCU_APB1EN_PMUEN;PMU_CTL |= PMU_CTL_LDOVS;/* HXTAL is stable *//* AHB = SYSCLK */RCU_CFG0 |= RCU_AHB_CKSYS_DIV1;/* APB2 = AHB/2 */RCU_CFG0 |= RCU_APB2_CKAHB_DIV2;/* APB1 = AHB/4 */RCU_CFG0 |= RCU_APB1_CKAHB_DIV4;/* Configure the main PLL, PLL_M = 8, PLL_N = 400, PLL_P = 2, PLL_Q = 9 */ RCU_PLL = (8U | (400U << 6U) | (((2U >> 1U) - 1U) << 16U) |(RCU_PLLSRC_HXTAL) | (9U << 24U));/* enable PLL */RCU_CTL |= RCU_CTL_PLLEN;/* wait until PLL is stable */while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){}/* Enable the high-drive to extend the clock frequency to 200 Mhz */PMU_CTL |= PMU_CTL_HDEN;while(0U == (PMU_CS & PMU_CS_HDRF)){}/* select the high-drive mode */PMU_CTL |= PMU_CTL_HDS;while(0U == (PMU_CS & PMU_CS_HDSRF)){} /* select PLL as system clock */RCU_CFG0 &= ~RCU_CFG0_SCS;RCU_CFG0 |= RCU_CKSYSSRC_PLLP;/* wait until PLL is selected as system clock */while(0U == (RCU_CFG0 & RCU_SCSS_PLLP)){}
}

?3.3 時鐘頻率測試

可以使用rcu_clock_freq_get()函數來獲取時鐘

//系統時鐘測試SYS_clk = rcu_clock_freq_get(CK_SYS);//200000000AHB_clk = rcu_clock_freq_get(CK_AHB);//200000000APB1_clk = rcu_clock_freq_get(CK_APB1);//50000000APB2_clk =  rcu_clock_freq_get(CK_APB2);//100000000

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

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

相關文章

【frp】cron定時檢查zfrpc.service是否啟動成功

zfrpc 經常自動啟動失敗cron定時檢查zfrpc.service是否啟動成功 ChatGPT 要使用 cron 定期檢查 zfrpc.service 是否啟動成功,并在服務未運行時嘗試啟動它,你可以按照以下步驟進行操作: 創建腳本 首先,你需要創建一個腳本,這個腳本將檢查 zfrpc.service 的狀態,并在服務未…

字符串反轉字符串單詞(1)

大家好&#xff0c;今天我們來探討一道經典的編程問題——翻轉字符串里的單詞。這個問題要求我們編寫一個函數&#xff0c;將輸入字符串中的所有單詞進行翻轉&#xff0c;但單詞內部的字符順序保持不變。 問題分析&#xff1a; 1. 首先&#xff0c;我們需要理解翻轉字符串里的…

Codeforces Round 143 (Div. 2) C. To Add or Not to Add 題解 前綴和 二分

To Add or Not to Add 題目描述 A piece of paper contains an array of n n n integers a 1 , a 2 , . . . , a n a_{1},a_{2},...,a_{n} a1?,a2?,...,an?. Your task is to find a number that occurs the maximum number of times in this array. However, before l…

點云壓縮配置開發環境遇到一些bug

1、配置基于cuda的計算庫&#xff0c;Chamfer3D和pointops 編譯chamfer3D時候會遇到一個cub版本的校驗錯誤。 解決方法&#xff1a;根據錯誤提示&#xff0c;進入cuda的config配置文件中&#xff0c;使用#define將校驗功能關閉 編譯pointops&#xff0c;會遇到報錯&#xff1a;…

C++Primer Plus 第十四章代碼重用:14.4.4 數組模板示例和非類型參數2

14.4.4 數組模板示例和非類型參數 提示&#xff1a;這里可以添加系列文章的所有文章的目錄&#xff0c;目錄需要自己手動添加 例如&#xff1a;第一章 Python 機器學習入門之pandas的使用 提示&#xff1a;寫完文章后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右…

《分析模式》漫談08-單繼承不是“唯一繼承”

DDD領域驅動設計批評文集 做強化自測題獲得“軟件方法建模師”稱號 《軟件方法》各章合集 《分析模式》第2章這一段&#xff1a; 劃線處的single inheritance&#xff0c;2004中譯本的翻譯&#xff1a; 翻譯為“單繼承”&#xff0c;是正確的。 2020中譯本的翻譯&#xff1a…

Java NIO(一) 概述

NIO主要用于以少量線程來管理多個網絡連接&#xff0c;處理其上的讀寫等事件。在大量連接情況下&#xff0c;不管是效率還是空間占用都要優于傳統的BIO。 Java NIO 由以下幾個核心部分組成&#xff1a; Channel Buffer Selector Selector 如果你的應用打開了多個連接&#x…

分頁插件 count有數據,代碼不往下執行

如下:如果打印了sql那么當row>0時會有圖2下面sql詳情的輸出 問題出在了分頁參數上,pageNum為1,并且pageSize>2才能打印出圖二的結果,圖一為pageNum值是0,注意,查詢第一頁,分頁應該傳入的是1而不是0

大數據批處理系統和業務系統是兩種不同類型的系統,它們在目的、設計、功能和使用場景上有所區別

大數據批處理系統和業務系統是兩種不同類型的系統&#xff0c;它們在目的、設計、功能和使用場景上有所區別。以下是大數據批處理系統和業務系統之間的一些主要差異&#xff1a; 1. **目的**&#xff1a; - **大數據批處理系統**&#xff1a;主要用于處理和分析大量數據&am…

MySQL高級1.0

目錄 &#x1f4cc;MySQL存儲過程和函數 ??存儲過程和函數介紹 ??存儲過程的創建和調用 ??存儲過程的查看和刪除 ??存儲過程語法-變量 ??存儲過程語法-if語句 ??存儲過程語法-參數傳遞 ??存儲過程語法-while循環 ??存儲過程語法-存儲函數 &#x1f4…

Linux高并發服務器開發(六)線程

文章目錄 1. 前言2 線程相關操作3 線程的創建4 進程數據段共享和回收5 線程分離6 線程退出和取消7 線程屬性&#xff08;了解&#xff09;8 資源競爭9 互斥鎖9.1 同步與互斥9.2 互斥鎖 10 死鎖11 讀寫鎖12 條件變量13 生產者消費者模型14 信號量15 哲學家就餐 1. 前言 進程是C…

【FFmpeg】avio_open2函數

【FFmpeg】avio_open2函數 1.avio_open21.1 創建URLContext&#xff08;ffurl_open_whitelist&#xff09;1.1.1 創建URLContext&#xff08;ffurl_alloc&#xff09;1.1.1.1 查找合適的protocol&#xff08;url_find_protocol&#xff09;1.1.1.2 為查找到的URLProtocol創建UR…

影響Cache命中率的因素有哪些?

緩存命中率&#xff08;Cache Hit Rate&#xff09;是指處理器訪問緩存時&#xff0c;所需數據已經在緩存中找到的次數與總訪問次數的比例。提高緩存命中率可以顯著提升系統性能&#xff0c;因為緩存訪問速度遠快于主存訪問速度。影響緩存命中率的關鍵因素包括&#xff1a; 1.…

C語言異常處理就機制setjmp()和longjmp()

C語言setjmp()和longjmp()實現異常處理機制。 setjmp() 用于保存當前的程序執行狀態。 longjmp() 用于在后面的某個時刻返回到setjmp()點的狀態。 類似goto。但goto是本地的&#xff0c;只能在函數內部跳轉。 setjmp()和longjmp()是非局部跳轉語句&#xff0c;可在調用棧上&a…

通信系統網絡架構_3.移動通信網絡架構

移動通信網為移動互聯網提供了強有力的支持&#xff0c;尤其是5G網絡為個人用戶、垂直行業等提供了多樣化的服務。以下從業務應用角度給出面向5G網絡的組網方式。 1.5GS與DN互連 5GS&#xff08;5G System&#xff09;在為移動終端用戶&#xff08;User Equipment&#xff0c;…

CSRF的其他防范措施?

一般情況下&#xff0c;我們可以通過各種防護策略來防御CSRF&#xff0c;對于QA、SRE、安全負責人等&#xff0c;我們可以做哪些事情來提升安全性呢&#xff1f; 一、CSRF測試 CSRFTester是一款CSRF漏洞的測試工具&#xff0c;CSRFTester工具的測試原理大概是這樣的&#xff…

BLACKBOX.AI:解鎖開發新紀元,加速編程學習的AI神器!

文章目錄 &#x1f4af;BLACKBOX.AI 官網&#x1f341;1 BLACKBOX.AI 工具使用教程&#x1f341;2 BLACKBOX.AI工具使用界面介紹&#x1f341;3 Chat(聊天)功能&#x1f341;4 Explore (探索)功能&#x1f48e;4.1 Terminal(終端)功能&#x1f48e;4.2 Discover(發現)功能&…

STM32 IWDG(獨立看門狗)

1 IWDG簡介 STM32有兩個看門狗&#xff1a;一個是獨立看門狗&#xff08;IWDG&#xff09;&#xff0c;另外一個是窗口看門狗。獨立看門狗也稱寵物狗&#xff0c;窗口看門狗也稱警犬。本文主要分析獨立看門狗的功能和它的應用。 獨立看門狗用通俗一點的話來解釋就是一個12位的…

關于轉BigDecimal對象時,精度問題

//浮點型數值Double d 0.0003d;//轉BigDecimal對象BigDecimal a new BigDecimal(d);System.out.println(String.format("浮點類型數字:%.4f創建BigDecimal對象并且保留多位小數并且保留多位小數時,精度會變多,結果為%s",d,a.setScale(8, BigDecimal.ROUND_DOWN)));…

format()方法——格式化字符串

自學python如何成為大佬(目錄):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 語法介紹 format()可以對數據進行格式化處理操作&#xff0c;語法如下&#xff1a; format(value, format_spec) format_spec為格式化解釋。當參數…