#include "./SYSTEM/sys/sys.h"
void sys_nvic_set_vector_table(uint32_tbaseaddr, uint32_t offset) // (割り込みベクタテーブルを設定)
{
// Cortex-M プロセッサの VTOR レジスタはアドレスの 0 ~ 8 ビットのみを考慮し、9 ~ 31 ビット (上位 23 ビット) の値は無視されます
// ビット単位の AND 演算により、オフセット アドレスの 0 ~ 8 のバイナリ ビットが予約されます。
// これにより、割り込みベクタテーブルの開始位置のアドレスオフセットをVTORレジスタに設定することができ、割り込みベクタテーブルのオフセット演算が完了します。
SCB->VTOR = ベースアドレス | (オフセット & (uint32_t)0xFFFFFE00);
// 実装方法: 指定された割り込みベクタテーブルのオフセットアドレス offset と下位 9 ビット (つまり、オフセットアドレスの 0~8 ビット) とのビット単位の AND 演算、
// 次に、変数baseaddrとビット単位のOR演算を実行し、結果をVTORレジスタに割り当てます。
}
static void sys_nvic_priority_group_config(uint8_t group) // (--ローカル関数-- NVIC 割り込み優先順位グループを構成します)
{
/*--補足--
NVIC_PRIORITYGROUP_4 は、優先順位のグループ化を実装するための割り込みコントローラー (NVIC) に基づくスキームです。
これは、Cortex-M プロセッサのハードウェア優先順位に基づくグループ化方法です。
NVIC_PRIORITYGROUP_4 には、0 から 3 までの 4 つの優先グループがあります (優先順位は高から低)。
各優先グループ内には 16 の優先レベルがあります。このうち優先度 0 が最高レベル、優先度 15 が最低レベルとなります。
同じ優先順位グループ内で、各割り込みに異なるサブ優先順位を設定できます。
プリエンプション優先度、レスポンス優先度ともに 16 段階あります。プリエンプション優先度は割り込み間のプリエンプションに使用され、レスポンス優先度は割り込みサービス関数内の優先度制御に使用されます。
割り込みベクタテーブル ----------> リファレンスマニュアル p130 ページ テーブル 54
*/
uint32_t 温度、温度 1;
temp1 = (~group) & 0x07; // 変数グループに対してビット単位の反転 (~) を実行し、2 進数 0x07 とビット単位の AND 演算を実行します。
temp1 <<= 8; // temp1 を 8 ビット左にシフトします。目的は、AIRCR の 15 ~ 13 ビット目にプライオリティ グループの値を入れることです。
temp = SCB->AIRCR; // システム制御ブロック (SCB) レジスタの AIRCR (アプリケーション割り込みおよびリセット制御レジスタ) の値を temp に読み取ります。
temp &= 0X0000F8FF; // temp と 0x0000F8FF の間のビットごとの AND 演算、目的は、再コンフィギュレーションのために AIRCR の(割り込み優先順位グループ)と(サブ優先順位)を 0 に設定することです
temp |= 0X05FA0000; // temp の値を 0x05FA0000 でビットごとに演算します。この数値は、優先エンコードに NVIC_PRIORITYGROUP_4 スキームを使用することを意味します。このシナリオでは、優先度のグループ化は 0b10 です。
temp |= temp1; // temp1 と temp に対してビットごとの OR 演算を実行し、グループ化された値を対応するビットに配置します。最後に、最初の 3 ビットが優先グループ値として設定されます。
SCB->AIRCR = temp; // (SCB) レジスタの (AIRCR) に temp を書き込み、NVCI 割り込み優先順位グループを構成するプロセス全体を完了します。
}
void sys_nvic_init(uint8_t pprio, uint8_t sprio, uint8_t ch, uint8_t group) // (NVIC 割り込みコントローラーの初期化)
{
sys_nvic_priority_group_config(group); // sys_nvic_priority_group_config 関数を呼び出し、パラメーターは group で、NVCI 割り込み優先度グループ化の構成を完了します
uint32_t 温度;
temp = pprio << (4 - group); // pprio の値を左にシフトし (4-group)、結果を temp に格納します。目的はマスター優先度を計算することです
temp |= sprio & (0x0f >> group); // sprio の下位 4 ビットを temp に格納し、0x0f を使用してビットを右にシフトし (グループ化)、ビットごとの AND 演算を実行し、下位 4 ビットを temp に保持します。目的は優先度から計算することです
temp &= 0xf; // temp と 0xf をビットごとに演算し、(&) して temp の値が 15 を超えないようにします。
NVIC->ISER[ch / 32] |= 1 << (ch % 32); // NVIC->ISER[ch/32] レジスタ内の対応する割り込みラインの位置を 1 に設定し、対応する割り込みを有効にするワイヤー;
NVIC->IP[ch] |= temp << 4; // 計算された優先度 temp を左に 4 ビットシフトし、NVIC->IP[ch] レジスタに書き込み、対応する割り込みの優先度を指定します。
}
void sys_nvic_ex_config(GPIO_TypeDef *p_gpiox, uint16_t pinx, uint8_t tmode) //(NVIC 外部割り込み構成)
{
uint8_t オフセット;
uint32_t gpio_num = 0;
uint32_t ピンポス = 0、カーピン = 0、ポス = 0;
/*パラメータの説明
offset は、ピン番号のビット オフセットを EXTICR レジスタに保存するために使用されます。
gpio_num には、対応する GPIO 番号が格納されます。
pinpos と curpin は、それぞれピン番号の各ビットを走査してチェックするために使用されます。
pos はビットマスクの生成に使用されます。
*/
gpio_num = ((uint32_t)p_gpiox - (uint32_t)GPIOA) / 0X400; // AHB バスの GPIO ポート GPIOA のアドレスと入力パラメーター p_gpiox のアドレスの差を計算し、それを 0x400 で割って取得します。対応する GPIO 番号。
RCC->APB2ENR |= 1 << 0; // AFIO クロックを有効にし、RCC->APB2ENR レジスタの AFIO クロック ビットを設定して AFIO レジスタにアクセスします
for (pinpos = 0; pinpos < 16; pinpos++) // ピン番号の各ビットをスキャンします
{
pos = 1 << pinpos; // pos を使用してビットマスクを生成します。
curpin = pinx & pos; // ビット単位の AND (&) 演算を使用して、ピン番号の現在のビット curpin を取得します
if (curpin == pos) // 現在のビットが 1 の場合、ピンを EXTI 機能で設定する必要があることを意味します。
{
offset = (pinpos % 4) * 4; // EXTICR レジスタ内の対応するビット オフセット offset を計算します。
AFIO->EXTICR[pinpos / 4] &= ~(0x000F << offset); // 次に、AFIO->EXTICR[pinpos / 4] レジスタの指定された位置の値をクリアします
AFIO->EXTICR[pinpos / 4] |= gpio_num << offset; // 次に、offset offset のビット オフセット値に従って gpio_num をこの位置に格納します
EXTI->IMR |= 1 << pinpos; // EXTI->IMR レジスタ内の対応するピンの位置を 1 に設定し、そのピンに対応する EXTI 割り込みを有効にします (つまり、ライン BITx 割り込みを有効にできます) )。
/*さらに、受信トリガーモード tmode に応じて EXTI 対応回線のトリガーモードを設定します*/
if (tmode & 0x01)
EXTI->FTSR |= 1 << pinpos; // tmode の最下位ビットが 1 の場合、立ち下がりエッジ トリガーを有効にします。
if (tmode & 0x02)
EXTI->RTSR |= 1 << pinpos; // tmode の 2 番目の下位ビットが 1 の場合、立ち上がりエッジ トリガーを有効にします。
}
}
}
void sys_gpio_remap_set(uint8_t pos, uint8_t bit, uint8_t val) //(GPIO ピンの再マッピング)
{
uint32_t temp = 0; // temp は生成されたビットマスクを保存するために使用され、i は構成する必要があるビットを走査するために使用されます。
uint8_t i = 0;
RCC->APB2ENR |= 1 << 0; // AFIO クロックを有効にし、temp は生成されたビット マスクを保存するために使用され、i は構成する必要があるビットをトラバースするために使用されます。
for (i = 0; i < bit; i++) // 渡されたビットパラメータに従って設定する必要があるビットマスク温度を計算します。
{
temp <<= 1; // パラメータのビットは設定する必要があるビット数を示すため、下位ビットがすべて 1 であるマスクを生成する必要があります。
temp += 1; // temp のビット単位の左シフトとビット単位の OR 演算を使用して生成されます。
}
AFIO->MAPR &= ~(temp << pos); // AFIO->MAPR レジスタに設定する位置をクリアします。これは、pos ビットを temp の左側にシフトして反転 (~) することで実行できます。元の値を取得するビット単位の AND (&) 演算の実装
AFIO->MAPR |= (uint32_t)val << pos; // 最後に、AFIO->MAPR レジスタ内の新しい値に設定するビットを設定します。新しい値を左に pos ビット移動し、または (|) を押して元の値に戻すと、設定が完了します。
}
//(GPIOピンの設定)
// 構造体の定義:
// typedef 構造体
// {
// volatile uint32_t MODER; // GPIO ポート モード レジスタ
// volatile uint16_t OTYPER; // GPIO ポート出力タイプ レジスタ
// uint16_t RESERVED0; // 予約済み、値は 0x02
// volatile uint32_t OSPEEDR; // GPIO ポート出力速度レジスタ
// volatile uint32_t PUPDR; // GPIO ポートのプルアップ/プルダウン レジスタ
// volatile uint16_t IDR; // GPIO ポート入力データ レジスタ
// uint16_t RESERVED1; // 予約済み、値は 0x0A
// volatile uint16_t ODR; // GPIO ポート出力データ レジスタ
// uint16_t RESERVED2; // 予約済み、値は 0x0E
// volatile uint16_t BSRR; // GPIO ポート ビット セット/リセット レジスタ
// uint16_t RESERVED3; // 予約済み、値は 0x12
// volatile uint16_t LCKR; // GPIO ポート設定ロック レジスタ
// uint16_t RESERVED4; // 予約済み、値は 0x16
// volatile uint16_t AFR[2]; // GPIO ポート代替機能レジスタ
// uint16_t RESERVED5[10]; // 予約済み、値は 0x1C ~ 0x28
// 揮発性 uint32_t BRR; // GPIO ビット リセット レジスタ
// } GPIO_TypeDef;
void sys_gpio_set(GPIO_TypeDef *p_gpiox、uint16_t pinx、uint32_t モード、uint32_totype、uint32_tospeed、uint32_t pupd)
{
/*パラメータの導入
p_gpiox は GPIOx のレジスタ アドレスを指します (x は A、B、C など)。
pinx は設定するピンを表します (複数の場合があり、バイナリ ビットで表されます)
、mode はピンの動作モード (入力、出力、多重化など) を示します。
otype は出力タイプ (オープン ドレインまたはプッシュプル) を示します。
ospeed は出力レートを示します。
pupd はプルアップおよびプルダウン モードを意味します。*/
uint32_t ピンポス = 0、ポス = 0、カーピン = 0;
// pinpos は GPIO ポートの各ピンを周期的にチェックするために使用され、pos はピンを構成する必要があるかどうかをチェックするために使用され、curpin はチェックの結果です。
uint32_t 設定 = 0;
// 設定変数、初期値は 0 で、特定の IO 設定を保存するために使用されます
for (pinpos = 0; pinpos < 16; pinpos++) // for ループを使用して pinpos 0 ~ 15 のピンを順番に処理します。
{
pos = 1 << pinpos; // pinpos の左に 1 をシフトし、pos に割り当てます。つまり、pos は、対応するピンを設定する必要があるかどうかを確認するために使用されます。
curpin = pinx & pos; // ピン設定情報は pinx に格納されており、ビット演算 & を使用して curpin、つまりピンを設定する必要があるかどうかを取得します。
if (curpin == pos) // curpin が pos と等しい場合、ピンを設定する必要があることを意味します。
{
config = 0; // 設定が必要な場合は、まず config をクリアして、ピンがデフォルトのアナログ入力モードとして設定されていることを示します。
if ((mode == 0X01) || (mode == 0X02)) // モードが通常出力モードまたは代替機能モードの場合
{
config = ospeed & 0X03; // 速度パラメータ ospeed の下位 2 ビットと config の下位 2 ビットの OR を演算して、MODE[1:0] の設定を示す bit0/1 を取得します。
config |= (otype & 0X01) << 2; // otype の下位ビットと config の 2 番目のビットの OR を演算して、CNF[0] の設定を取得します。
config |= (mode - 1) << 3; // mode の値から 1 を引いた値を 3 ビット左にシフトし、config の 3 ビット目と OR して CNF[1] の設定を取得します。
}
else if (mode == 0) // mode が 0 の場合、通常の入力モードです。
{
if (pupd == 0) // プルアップとプルダウンがない場合は、フローティング入力モードを意味します。
{
config = 1 << 2; // config の 2 番目と 3 番目のビットを 0 1、つまり浮動入力モードに設定します。
}
else // それ以外の場合 (つまり、プルアップおよびプルダウン入力モードの場合)。
{
config = 1 << 3; // config の 2 番目と 3 番目のビットを 1 0 に設定し、アップとダウンの入力モードを示します
/*以下は、pupd パラメータの下位ビットに従って GPIO ポートのピンをプルアップまたはプルダウンします。*/
p_gpiox->ODR &= ~(1 << pinpos); // ODR の対応するピン ビットをクリアし、
p_gpiox->ODR |= (pupd & 0X01) << pinpos; // 次に、pupd の下位ビットに従って、対応するピンのビットを左に移動し、OR 演算を実行して、プルアップまたはプルダウンとして設定します。
}
}
/*以下はpinposに従ってピンが配置されているCRHまたはCRLレジスタを判断します。*/
if (pinpos <= 7) // 現在処理されているピン pinpos が下位 8 ビットにある場合、対応するレジスタは CRL レジスタです。
{
p_gpiox->CRL &= ~(0X0F << (pinpos * 4)); // 最初に pinpos を 2 ビット左にシフトして (4 倍に相当)、(下位 8 ビット) オフセットを取得し、次に 0X0F を左にシフトします。シフトビット、
// レジスタに書き込むマスクを取得し、逆コードを使用してマスクで指定されたビットをクリアします
p_gpiox->CRL |= config << (pinpos * 4); // config をオフセット ビットだけ左にシフトし、結果を CRL レジスタに書き込みます。
}
else // 現在処理されているピン pinpos の位置が上位 8 ビットの場合、対応するレジスタは CRH レジスタです。
{
p_gpiox->CRH &= ~(0X0F << ((pinpos - 8) * 4)); // 計算前にオフセットを 8 (上位 8 ビット) 減算する必要があることを除いて、上記と同じ
p_gpiox->CRH |= config << ((pinpos - 8) * 4); // config をオフセット ビットだけ左にシフトし、結果を CRH レジスタに書き込みます。
}
}
}
}
void sys_gpio_pin_set(GPIO_TypeDef *p_gpiox, uint16_t pinx, uint8_t status) //(GPIO シングルピン出力ステータス)
{
/*パラメータの導入
p_gpiox は GPIOx のレジスタ アドレス (x は A、B、C など) を指し、pinx は制御されるピンを表し、status はピンのステータス (0 または 1) を表します。
*/
if (status & 0X01) // ステータスの最下位ビット(つまり、0か1)を判断し、実行する端子の動作を決定します
{
// このとき、pinx の値とマスク 0xFFFF (つまり、すべてのビットが 1) のビットごとの OR 演算を実行し、BSRR レジスタの下位 16 ビットを 1 に設定し、対応するピンのレベルを設定します高いレベルまで。
p_gpiox->BSRR |= pinx;
}
それ以外
{
// このとき、pinx の値とマスク 0xFFFF (つまり、すべてのビットが 1) のビットごとの OR 演算を実行し、BSRR レジスタの下位 16 ビットを 1 に設定し、対応するピンのレベルを設定します高いレベルまで。
p_gpiox->BSRR |= (uint32_t)pinx << 16;
}
}
uint8_t sys_gpio_pin_get(GPIO_TypeDef *p_gpiox, uint16_t pinx) // (GPIO 単一ピンのステータスを読み取る)
{
/*パラメータの導入
p_gpiox は GPIOx のレジスタ アドレスを指します (x は A、B、C など)。
pinx はステータスを取得するピンを表します
*/
if (p_gpiox->IDR & pinx) // if 判定文は IDR の特定のビット (つまり端子のレベルデータ) が 1 であるかどうかを判定し、端子の実際のレベル状態を決定します
{
return 1; // ピンレベルが高いことを意味し、return 1
}
それ以外
{
return 0; // ビットが 0 の場合、ピンレベルが Low であることを意味し、return 0。
}
}
void sys_wfi_set(void) // (低消費電力状態に入る)
{
__ASM volatile("wfi"); // コードはアセンブリ命令 wfi を使用し、プロセッサを WFI モードにし、割り込み信号がトリガーされるのを待ちます。
}
void sys_intx_disable(void) // (すべての割り込みをオフにする)
{
__ASM volatile("cpsid i"); // コードはアセンブリ命令 cpsid i を使用しており、プロセッサの割り込みイネーブル ビットをクリアし、すべての割り込みトリガーを無効にします。
}
void sys_intx_enable(void) // (すべての割り込みを有効にする)
{
__ASM volatile("cpsie i"); // コードはアセンブリ命令 cpsie i を使用し、プロセッサの割り込みイネーブル ビットを設定して割り込み要求のトリガーを許可します。
}
void sys_msr_msp(uint32_t addr) // (スタックトップアドレスを設定)
{
// (Cortexマイコンソフトウェアインターフェース規格)
__set_MSP(addr); // このコードは CMSIS ライブラリ関数 __set_MSP() を使用しており、これは MSP レジスタの値を受信 addr パラメータに設定するために使用されます。
}
void sys_standby(void) // (スタンバイモードに入る)
{
RCC->APB1ENR |= 1 << 28; // RCC モジュールの APB1 バスで PWR (電力制御) モジュール クロックを有効にします (1 << 28 を 28 ビット左にシフトし、PWR を示す 0x10000000 を取得します) )
PWR->CSR |= 1 << 8; // PWR モジュールの CSR レジスタの 8 ビット目 (PDDS) を 1 に設定します。これはスタンバイ モードに入るという意味です。
PWR->CR |= 1 << 2; // PWRモジュールのCRレジスタのビット2(ULP)を1に設定し、ULP(Ultra Low Power)モードが選択されていることを示し、スタンバイに移行する動作モードが有効になっています。
PWR->CR |= 1 << 1; // PWRモジュールのCRレジスタのビット1(PDDS)を1、PDDS(パワーダウンディープスリープ)モードに設定し、スタンバイモードへの移行動作を開始します。
SCB->SCR |= 1 << 2; // SCB (システム制御ブロック) モジュールの SCR レジスタのビット 2 (SLEEPDEEP) を 1 に設定します。これは、ディープ スリープ状態に入ることを意味します。
sys_wfi_set(); // (低電力状態に入る)
}
void sys_soft_reset(void) // (システム ソフトウェア リセット)
{
// 0X05FA0000 と (uint32_t)0x04 の「or」演算により、システム ソフトウェア リセットが実行されたことを示す特定の値 0x05FA0004 が得られます。
// この値を SCB の AIRCR レジスタに割り当てると、プロセッサがソフトウェア リセットを実行します。
SCB->AIRCR = 0X05FA0000 | (uint32_t)0x04;
}
uint8_t sys_lock_set(uint32_t plln) // (クロック設定関数)
{
uint32_t 再試行 = 0;
uint8_t retval = 0;
// plln パラメータは、設定する必要があるクロック逓倍係数を示します。retry と retval は、それぞれ再試行回数と戻り値を記録するために使用されます。
// RCC はレジスタ コントローラ モジュールです
RCC->CR |= 0x00010000; // 「|=」演算を使用して、このレジスタのビット 16 (HSEON) を 1 に設定し、外部高速クロック (HSE) がオンになることを示します。
while (再試行 < 0XFFF0)
{
__nop(); // 空の命令ステートメント __nop()、外部高速クロックの準備ができるまで待機します。
if (RCC->CR & (1 << 17) && 再試行 > 0X8000)
{
Break; // 外部高速クロックが安定して準備ができている場合、クロック制御レジスタのビット 17 (HSERDY) が 1 に設定され、この時点でループを終了できます。
}
再試行++;
}
if (retry >= 0XFFF0) // 外部高速クロックが安定するまでにある程度の時間がかかるため、最大リトライ回数 0XFFF0 を設定します。
{
retval = 1; // retval が 1 の場合は、クロック設定が失敗したことを意味します。
}
else // 外部高速クロックが安定して準備ができている場合は、クロック構成のコア部分に入ります。
{
RCC->CFGR = 0X00000400;
// クロック分周器レジスタ CFGR の値を 0X00000400 に設定し、AHB (アドバンスト ハイパフォーマンス バス) と APB を示します。
// (Advanced Peripheral Bus) は周波数をそれぞれ分周しません。つまり、AHB と APB のクロック周波数は同じです。
plln -= 2; // 受信クロックの乗算係数から 2 を減算します plln,
RCC->CFGR |= plln << 18; // 18 ビット左にシフトし、「|=」演算を使用して CFGR レジスタの対応するビット [29:24] として設定します。 PLL クロックと周波数係数を掛け合わせた値を設定することを意味します。
RCC->CFGR |= 1 << 16; // CFGR レジスタの対応するビット [29:24] に設定します。これは、PLL クロックの倍率を設定することを意味します。
/* フラッシュメモリの遅延期間を設定します */
FLASH->ACR = 1 << 4; // 「or」演算を使用して ACR レジスタのビット 4 (LATENCY) を 1 に設定し、フラッシュ メモリの遅延期間が 1 クロック サイクルに設定されていることを示します。
FLASH->ACR |= 2 << 0; // 「or」演算を使用して ACR レジスタのビット [2:0] を 2 に設定します。これは、HCLK (AHB クロック) 遅延を使用することを意味します。
/*上記の設定の目的は、フラッシュ メモリが 48MHz のシステム クロックをサポートできるようにすることです。*/
RCC->CR |= 1 << 24; // 「or」演算を使用して CR レジスタのビット 24 (PLLON) を 1 に設定し、PLL クロックを有効にします。
while (!(RCC->CR >> 25)) // while ループを使用して、クロックが安定するまで待機します。つまり、CR レジスタの PLL ロック ビット (PLLRDY) が 1 になり、 PLLクロックは安定しています。
;
RCC->CFGR |= 2 << 0; // while ループを使用してクロックが安定するまで待機します。つまり、CR レジスタの PLL ロック ビット (PLLRDY) が 1 になり、PLL クロックが安定することを示します。安定しています。
while (((RCC->CFGR >> 2) & 0X03) != 2) // while ループを使用して、CFGR レジスタのビット [3:2] が 2 になり、PLL クロックが安定したことを示します。システムクロック。
;
}
return retval; // 最後に時計設定のステータスを返し、戻り値が 0 の場合は時計設定成功、戻り値 1 の場合は設定失敗です。
}
void sys_stm32_lock_init(uint32_t plln) // (クロック初期化関数)
{
RCC->APB1RSTR = 0x00000000; // クロックの初期化時にこのバス上のすべてのデバイスがリセット状態になるように、APB1 のリセット レジスタをクリア、つまりすべてのビットを 0 に設定します。
RCC->APB2RSTR = 0x00000000; // クロックの初期化時にこのバス上のすべてのデバイスがリセット状態になるように、APB2 のリセット レジスタをクリア、つまりすべてのビットを 0 に設定します。
RCC->AHBENR = 0x00000014; // AHB バス上のクロック イネーブル レジスタを設定して、DMA、GPIOA、および GPIOB ペリフェラルを有効にします。
RCC->APB2ENR = 0x00000000; // APB2 のクロック イネーブル レジスタをクリアします。つまり、そのすべてのビットを 0 に設定します。これにより、クロックの初期化時にこのバス上のすべてのデバイスがイネーブルにならないようにできます。
RCC->APB1ENR = 0x00000000; // APB1 のクロック イネーブル レジスタをクリアします。つまり、そのすべてのビットを 0 に設定します。これにより、クロックの初期化時にこのバス上のすべてのデバイスがイネーブルにならないようにできます。
RCC->CR |= 0x00000001; // RCC クロック制御レジスタのイネーブル ビットを設定して、外部高速クロック (HSE) をイネーブルにします。
RCC->CFGR &= 0xF8FF0000; // RCC クロック コンフィギュレーション レジスタの PLL、分周器、およびクロック オプション ビットをクリアします。
RCC->CR &= 0xFEF6FFFF; // RCC クロック コンフィギュレーション レジスタの PLL、分周器、およびクロック オプション ビットをクリアします。
RCC->CR &= 0xFFFBFFFF; // RCC クロック制御レジスタの HSE ディスエーブルビットをクリアします
RCC->CFGR &= 0xFF80FFFF; // RCC クロック コンフィギュレーション レジスタの PLL 乗算器ビットをクリアします
RCC->CIR = 0x009F0000; // RCC クロック割り込みレジスタをクリアします。
sys_ Clock_set(plln); // sys_lock_set 関数を使用して PLL 逓倍率を設定し、PLL をシステム クロックとして使用するかどうかを選択します。
#ifdef VECT_TAB_RAM
sys_nvic_set_vector_table(SRAM_BASE, 0x0); // ユーザープログラムのジャンプおよび割り込み処理用の RAM 内のベクタテーブルのアドレスを選択します。
#それ以外
sys_nvic_set_vector_table(FLASH_BASE, 0x0); // ユーザープログラムのジャンプおよび割り込み処理用の FLASH 内のベクタテーブルのアドレスを選択します。
#endif
}