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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > windows >内容正文

windows

【联盛德W806上手笔记】三、MCU系统与时钟结构

發(fā)布時(shí)間:2023/12/9 windows 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【联盛德W806上手笔记】三、MCU系统与时钟结构 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

目錄

  • 總線結(jié)構(gòu)
    • AHB-1 總線
    • AHB-2 總線
  • 時(shí)鐘與復(fù)位
    • 主要特性
    • 時(shí)鐘結(jié)構(gòu)
    • 功能描述
      • 時(shí)鐘門控
      • 時(shí)鐘自適應(yīng)關(guān)斷
      • 功能復(fù)位
      • 時(shí)鐘分頻
      • 寄存器描述
        • 寄存器列表
        • 軟件時(shí)鐘門控使能寄存器
        • 軟件時(shí)鐘掩碼寄存器
        • 軟件復(fù)位控制寄存器
        • 時(shí)鐘分頻配置寄存器
        • 調(diào)試控制寄存器
        • I2S 時(shí)鐘控制寄存器
        • 復(fù)位狀態(tài)寄存器
      • 調(diào)試功能控制
    • 參考時(shí)鐘電路設(shè)計(jì)
    • 啟動(dòng)配置
  • 地址空間
  • SRAM
  • Flash
    • QFlash
    • SPI Flash
  • PSRAM
  • 庫函數(shù)
    • wm_cpu.h
      • 函數(shù)
      • 參數(shù)
    • wm_gpio_ex.h:引腳復(fù)用相關(guān)
    • wm_rcc.h:時(shí)鐘相關(guān)
    • wm_it.h:中斷服務(wù)函數(shù)的聲明

Windows 10 20H2
HLK-W806-V1.0-KIT
WM_SDK_W806_v0.6.0


???????摘自《W806 芯片設(shè)計(jì)指導(dǎo)書 V1.0》、《W806 MCU 芯片規(guī)格書 V2.0》

總線結(jié)構(gòu)

???????這里沒有找到W806的,不過找到了與之差不多的W800的:
???????W800 芯片由兩級總線構(gòu)成,如下圖所示

AHB-1 總線

???????本級總線有四個(gè)主設(shè)備-即 XT804,DMA,GPSEC 以及 5 個(gè)從設(shè)備。
???????XT804 是面向控制領(lǐng)域的 32 位高能效嵌入式 CPU 核, 采用 16/32 位混合編碼指令系統(tǒng),設(shè)計(jì)了精簡高效的 3 級流水線。
???????XT804 提供多種可配置功能,包括硬件浮點(diǎn)單元、片上高速緩存、DSP 加速單元、可信防護(hù)技術(shù)、片上緊耦合 IP 等,用戶可根據(jù)應(yīng)用需要進(jìn)行配置。此外,XT804 提供多總線接口,支持系統(tǒng)總線、指令總線、數(shù)據(jù)總線的靈活配置。XT804 針對中斷響應(yīng)做了特殊的加速,中斷響應(yīng)延時(shí)僅需 13 個(gè)周期。
???????總線時(shí)鐘最快工作在 240MHz 頻率,可以配置為 240/160/120/80/40MHz,或更低。


AHB-2 總線

???????本條總線有 4 個(gè)主設(shè)備,3 個(gè)從設(shè)備,使用 crossbar 連接結(jié)構(gòu),能夠?qū)崿F(xiàn)不同主設(shè)備對不同從設(shè)備的同時(shí)訪問,從而加大帶寬。總線時(shí)鐘最快工作在 40MHz 頻率,可以根據(jù)需要配置為更低。

???????各主設(shè)備采用固定優(yōu)先級,自上而下優(yōu)先級遞減。

時(shí)鐘與復(fù)位

???????支持芯片時(shí)鐘和復(fù)位系統(tǒng)的控制,時(shí)鐘控制包括時(shí)鐘變頻,時(shí)鐘關(guān)斷以及自適應(yīng)門控;復(fù)位控制包括系統(tǒng)以及子模塊的軟復(fù)位控制。

主要特性

支持各模塊時(shí)鐘關(guān)斷
支持部分模塊時(shí)鐘自適應(yīng)關(guān)斷
支持各模塊軟件復(fù)位
支持 CPU 頻率設(shè)置
支持 ADC/DAC 回環(huán)測試
支持 I2S 時(shí)鐘設(shè)置

時(shí)鐘結(jié)構(gòu)

???????這里沒有找到W806的,不過找到了與之差不多的W800的:
???????W800 使用 24/40MHz 晶體作為 SoC 時(shí)鐘源,片內(nèi)內(nèi)置 1 個(gè) DPLL 輸出 480MHz,供給CPU,系統(tǒng)總線,數(shù)據(jù)總線及 WiFi 系統(tǒng)使用;片內(nèi)另外內(nèi)置 32.768KHZ RC 振蕩器,供 PMU 及 LCD 模塊使用。時(shí)鐘結(jié)構(gòu)概括圖如下圖所示。

功能描述

時(shí)鐘門控

???????通過配置時(shí)鐘門控使能寄存器 CLK_GATE_EN 可以控制指定功能的時(shí)鐘關(guān)斷,從而達(dá)到關(guān)斷某一模塊功能的目的。
???????為了提供固件對系統(tǒng)功耗控制的靈活性,時(shí)鐘與復(fù)位模塊提供了系統(tǒng)內(nèi)各模塊的時(shí)鐘門控功能。當(dāng)關(guān)閉相應(yīng)模塊的時(shí)鐘時(shí),該模塊的數(shù)字邏輯與時(shí)鐘樹將停止工作,能夠降低系統(tǒng)的動(dòng)態(tài)功耗。
???????具體各模塊的開關(guān)對應(yīng)寄存器 SW_CLKG_EN 的詳細(xì)描述。

時(shí)鐘自適應(yīng)關(guān)斷

???????芯片依據(jù)內(nèi)部的某些狀態(tài)的遷移,自適應(yīng)關(guān)斷某些功能模塊的時(shí)鐘。
???????用戶請不要更改配置,否則可能會(huì)在配置 PMU 功能時(shí)導(dǎo)致系統(tǒng)異常。

功能復(fù)位

???????芯片提供了各子系統(tǒng)的軟復(fù)位功能,通過設(shè)置 SW_RST_CTRL 相應(yīng) BIT 為 0 可以達(dá)到子系統(tǒng)復(fù)位。
???????但是,復(fù)位狀態(tài)不會(huì)自動(dòng)清除,要恢復(fù)正常工作需將 SW_RST_CTRL 相應(yīng) BIT 位置 1。
???????軟復(fù)位功能并不會(huì)復(fù)位 CPU 及 WatchDog。
???????該寄存器中,對 APB/BUS1/BUS2(對應(yīng) APB 總線,系統(tǒng)總線及數(shù)據(jù)總線)的復(fù)位操作不推薦,會(huì)導(dǎo)致系統(tǒng)訪問設(shè)備異常。

時(shí)鐘分頻

???????W800 系統(tǒng)采用 40MHz/24MHz 晶體作為系統(tǒng)時(shí)鐘源,系統(tǒng)內(nèi)置 DPLL,固定輸出 480MHz 時(shí)鐘作為全系統(tǒng)的時(shí)鐘源(如下圖)。

???????系統(tǒng)總線的時(shí)鐘與 CPU 時(shí)鐘一致,數(shù)據(jù)總線的時(shí)鐘固定為 WLAN 根時(shí)鐘的 1/4。
???????WLAN 根時(shí)鐘同時(shí)也是整個(gè) WLAN 系統(tǒng)的時(shí)鐘源頭。
???????此模塊中提供了設(shè)定 CPU 時(shí)鐘與 WLAN 根時(shí)鐘的功能,供固件調(diào)節(jié)系統(tǒng)性能及功耗使用。
???????設(shè)置 SYS_CLK_DIV 寄存器的 BIT[7:0]可以調(diào)整 CPU 時(shí)鐘分頻系數(shù)。CPU 時(shí)鐘分頻的源時(shí)鐘為 DPLL 的輸出,固定為 480MHz。CPU 時(shí)鐘分頻系數(shù)默認(rèn)值為 6,即 CPU 默認(rèn)工作頻率為 480MHz 的 6 分頻,即 80MHz。當(dāng)需要調(diào)整 CPU 所需時(shí)鐘時(shí),可以重新配置本參數(shù)。
???????CLK_PERI 時(shí)鐘提供 SoC 系統(tǒng)中加密模塊的運(yùn)行時(shí)鐘的根時(shí)鐘,以及某些接口的運(yùn)行時(shí)鐘的根時(shí)鐘,比如 PWM 接口,I2S 接口,Flash 接口時(shí)鐘。此時(shí)鐘也由 DPLL 輸出的 480MHz 分頻得出。正常工作情況下應(yīng)固定為 3 分頻,得到 CLK_PERI 根時(shí)鐘 160MHz。由 CLK_PERI 根時(shí)鐘進(jìn)行 2 分頻,4 分頻得到80MHz 和 40MHz,提供給加密模塊和接口模塊使用。
???????設(shè)置 SYS_CLK_DIV 寄存器的 BIT[15:8]可以調(diào)整 WLAN 時(shí)鐘分頻系數(shù)。默認(rèn)分頻因子為 3,即對 DPLL的 480MHz 輸出 3 分頻,得到 160MHz 時(shí)鐘,作為根節(jié)點(diǎn)時(shí)鐘送給 WLAN(WLAN 再繼續(xù)分頻得到更為詳細(xì)的低頻時(shí)鐘供 WLAN 系統(tǒng)使用。
???????注意:如果希望 WLAN 系統(tǒng)正常工作,WLAN 根時(shí)鐘需要保持在 160MHz,否則 WLAN 系統(tǒng)將失效。
???????當(dāng)不需要 WLAN 系統(tǒng)工作的時(shí)候,可以將 WLAN 根時(shí)鐘降低,降低系統(tǒng)動(dòng)態(tài)功耗。
???????在改變系統(tǒng)時(shí)鐘配置的時(shí)候,需要注意:系統(tǒng)總線與數(shù)據(jù)總線的比例需要維持在 M:1,其中 M 為整數(shù),最小為 1。在改變系統(tǒng)時(shí)鐘配置時(shí),也需要同時(shí)更新寄存器 SYS_CLK_DIV 的 BIT [23:16], 設(shè)置正確的比例系數(shù)。否則,訪問數(shù)據(jù)總線將得到異常數(shù)據(jù)。
???????SYS_CLK_SEL 的[15:8]提供了設(shè)置 SAR_ADC 工作頻率的分頻因子,以 40M 為時(shí)鐘源進(jìn)行分頻。分頻系數(shù)即為所配分頻值。
???????SYS_CLK_SEL 的 BIT[4]為配置 RSA 模塊核心運(yùn)算的時(shí)鐘頻率選擇,可以選擇 80MHz 或者 160MHz。
???????BIT[5]為配置 GPSEC 模塊核心運(yùn)算的時(shí)鐘頻率選擇,可以選擇 80MHz 或者 160MHz。
???????BIT[6]為配置 FLASH 模塊對外總線的時(shí)鐘頻率選擇,可以選擇 40MHz 或者 80MHz。
???????當(dāng)需要重新配置 cpu_clk_divider,wlan_clk_divider,bus2_syncdn_factor,sdadc_fdiv 時(shí),需要置位 SYS_CLK_DIV 的 BIT[31],硬件自動(dòng)更新上述四個(gè)參數(shù)到分頻器,然后清零 BIT[31]。
???????I2S_CLK_CTRL 提供了 I2S 模塊的時(shí)鐘配置功能。

寄存器描述

寄存器列表

軟件時(shí)鐘門控使能寄存器




軟件時(shí)鐘掩碼寄存器

軟件復(fù)位控制寄存器




時(shí)鐘分頻配置寄存器



調(diào)試控制寄存器


I2S 時(shí)鐘控制寄存器


復(fù)位狀態(tài)寄存器

調(diào)試功能控制

???????用戶可以通過設(shè)置 DEBUG_CTRL 的值(SYS_CLK_SEL- BIT[16])來達(dá)到使能和禁用 JTAG 功能的目的。

參考時(shí)鐘電路設(shè)計(jì)

???????芯片參考時(shí)鐘選用 40MHz 頻率,用戶根據(jù)實(shí)際產(chǎn)品需求選用不同溫度等級、穩(wěn)定度、負(fù)載電容值的晶體。晶體兩端所接負(fù)載電容根據(jù)不同廠家晶體及頻偏情況需要調(diào)整。

???????晶體擺放盡量靠近芯片,走線盡量短,并且遠(yuǎn)離干擾源,時(shí)鐘周圍多地孔隔離。時(shí)鐘下面各層禁止其它走線穿過,防止干擾時(shí)鐘源。

啟動(dòng)配置

???????W800 芯片上電后,CPU 會(huì)啟動(dòng)執(zhí)行 ROM 中的固件,加載 Flash 中指定地址的用戶 Image。ROM 固件在開始運(yùn)行時(shí)會(huì)讀取 BootMode(PA0)引腳,根據(jù)引腳的信號判斷進(jìn)入啟動(dòng)狀態(tài):

???????通常,BootMode 引腳應(yīng)該用于生產(chǎn)或者調(diào)試階段。在生產(chǎn)階段,用戶通過將 BootMode 引腳持續(xù)拉低 30ms 以上,進(jìn)入功能模式,可以快速進(jìn)行燒錄 Flash 工作。
???????在產(chǎn)品返工或者維修的場景中,在芯片未進(jìn)入“最高安全等級”(關(guān)于安全等級的描述請參考《WM_W800_ROM 功能簡述》)時(shí),可以通過該引腳進(jìn)入功能模式,擦除舊的 Image,寫入新的Image。
???????在調(diào)試階段,無論固件出現(xiàn)任何故障,都可以通過將 BootMode 引腳持續(xù)拉低 30ms 以上,進(jìn)入串口下載功能,燒錄新的固件。

地址空間

???????這里沒有找到W806的,不過找到了與之差不多的W800的:

???????XT804 支持 4G 存儲(chǔ)空間,如上圖所示分為 6 個(gè) block,分別為代碼區(qū),內(nèi)存區(qū),片上外設(shè),片外存儲(chǔ)區(qū),片外外設(shè)和系統(tǒng)外設(shè)區(qū)。根據(jù)需求,w800 片內(nèi)存儲(chǔ)空間如圖三所示映射到前三區(qū)。



SRAM

???????W800 內(nèi)置 288KB SRAM。其中 160KB 掛載一級 AHB 總線上,128KB 掛載在二級 AHB 總線上。CPU等一級總線設(shè)備可以訪問所有內(nèi)存區(qū)域,但是二級總線上的設(shè)備只能訪問二級總線上 128KB 的內(nèi)存。

Flash

QFlash

???????W800 內(nèi)部集成 2MBytes QFlash。通過芯片內(nèi)部集成 32KB cache 實(shí)現(xiàn) XIP 方式在 QFlash 上執(zhí)行程序。 程序運(yùn)行過程中,CPU 首先從 Cache 中讀取指令,當(dāng)不能獲取指令時(shí),以 8Bytes 一行的方式從QFlash 讀取指令,存入 Cache 內(nèi)。因此,當(dāng)持續(xù)運(yùn)行代碼大小小于 32K 時(shí),CPU 將無需從 QFlash 讀取指令,此時(shí) CPU 可以運(yùn)行在更高的頻率。上述方式為讀取指令操作方式,整個(gè) Image 的 RO 段都會(huì)以這種方式操作。此過程用戶無需干預(yù)。
???????QFlash 也可以存儲(chǔ)數(shù)據(jù),當(dāng)用戶程序需要讀寫 QFlash 內(nèi)數(shù)據(jù)時(shí),需要通過內(nèi)置的 QFlash 控制器進(jìn)行操作,QFlash 提供了相應(yīng)的地址、指令等寄存器來協(xié)助實(shí)現(xiàn)用戶想要的操作。
???????用戶需要注意的是,程序進(jìn)行讀取或者寫入數(shù)據(jù)時(shí),無需進(jìn)行狀態(tài)判斷、等待等操作,因?yàn)?QFlash 控制器本身會(huì)進(jìn)行判斷。當(dāng) QFlash 控制器返回時(shí),表明讀取或者寫入已經(jīng)完成。

SPI Flash

???????W800 芯片除了支持 6PIN 的 QFlash 接口之外(內(nèi)置 PIN,未封裝),還支持低速 SPI 接口訪問。該 SPI接口的最高工作頻率可達(dá) 20MHz,支持主從功能。

PSRAM

???????W800 內(nèi)置 SPI/QSPI 接口的 PSRAM 控制器,支持外置最大容量 64Mb 的 PSRAM 設(shè)備訪問,提供總線方式的 PSRAM 讀寫擦操作。最高讀寫速度 80MHz。當(dāng)存儲(chǔ)容量需要擴(kuò)充時(shí),可以使用片外 PSRAM 擴(kuò)充代碼存儲(chǔ)空間或者數(shù)據(jù)存儲(chǔ)空間。PSRAM 同樣支持 XIP 方式執(zhí)行程序,CPU Cache 同樣支持緩存PSRAM 中數(shù)據(jù)。

庫函數(shù)

wm_cpu.h

函數(shù)

???????打開wm_cpu.h,有如下的函數(shù)聲明:

void SystemClock_Config(uint32_t clk); //該函數(shù)用于設(shè)置CPU時(shí)鐘,如SystemClock_Config(CPU_CLK_160M); void SystemClock_Get(wm_sys_clk *sysclk); //這個(gè)函數(shù)用來獲取CPU時(shí)鐘HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority); void HAL_IncTick(void); uint32_t HAL_GetTick(void); void HAL_Delay(uint32_t Delay);void HAL_NVIC_SetPriority(IRQn_Type IRQn, uint32_t Priority); //設(shè)定中斷優(yōu)先級,Priority為0~15的值,值越小,優(yōu)先級越高。如HAL_NVIC_SetPriority(GPIOA_IRQn, 0); void HAL_NVIC_EnableIRQ(IRQn_Type IRQn); //使能中斷通道,如HAL_NVIC_EnableIRQ(GPIOA_IRQn); void HAL_NVIC_DisableIRQ(IRQn_Type IRQn); //失能中斷通道

參數(shù)

結(jié)構(gòu)體和枚舉類型

enum CPU_CLK{CPU_CLK_240M = 2,CPU_CLK_160M = 3,CPU_CLK_80M = 6,CPU_CLK_40M = 12,CPU_CLK_2M = 240, };typedef union {struct {uint32_t CPU: 8; /*!< bit: 0.. 7 cpu clock divider */uint32_t WLAN: 8; /*!< bit: 8.. 15 Wlan clock divider */uint32_t BUS2: 8; /*!< bit: 16.. 23 clock dividing ratio of bus2 & bus1 */uint32_t PD: 4; /*!< bit: 24.. 27 peripheral divider */uint32_t RSV: 3; /*!< bit: 28.. 30 Reserved */uint32_t DIV_EN: 1; /*!< bit: 31 divide frequency enable */} b;uint32_t w; } clk_div_reg;typedef struct{uint32_t apbclk;uint32_t cpuclk;uint32_t wlanclk; }wm_sys_clk;typedef enum {HAL_TICK_FREQ_10HZ = 10,HAL_TICK_FREQ_100HZ = 100,HAL_TICK_FREQ_1KHZ = 1000,HAL_TICK_FREQ_DEFAULT = HAL_TICK_FREQ_1KHZ } HAL_TickFreqTypeDef;

宏參數(shù)

/**BASE PLL CLOCK*/ #define W805_PLL_CLK_MHZ (480)#define UNIT_MHZ (1000000)

#define IS_NVIC_DEVICE_IRQ(IRQ) ((IRQ) >= (IRQn_Type)0x00U)

wm_gpio_ex.h:引腳復(fù)用相關(guān)

#define __AFIO_REMAP_SET_OPT1(__HANDLE__, __IOPOSITION__) do{ \SET_BIT(__HANDLE__->AF_SEL, __IOPOSITION__); \CLEAR_BIT(__HANDLE__->AF_S1, __IOPOSITION__); \CLEAR_BIT(__HANDLE__->AF_S0, __IOPOSITION__); \}while (0)#define __AFIO_REMAP_SET_OPT2(__HANDLE__, __IOPOSITION__) do{ \SET_BIT(__HANDLE__->AF_SEL, __IOPOSITION__); \CLEAR_BIT(__HANDLE__->AF_S1, __IOPOSITION__); \SET_BIT(__HANDLE__->AF_S0, __IOPOSITION__); \}while (0)#define __AFIO_REMAP_SET_OPT3(__HANDLE__, __IOPOSITION__) do{ \SET_BIT(__HANDLE__->AF_SEL, __IOPOSITION__); \SET_BIT(__HANDLE__->AF_S1, __IOPOSITION__); \CLEAR_BIT(__HANDLE__->AF_S0, __IOPOSITION__); \}while (0)#define __AFIO_REMAP_SET_OPT4(__HANDLE__, __IOPOSITION__) do{ \SET_BIT(__HANDLE__->AF_SEL, __IOPOSITION__); \SET_BIT(__HANDLE__->AF_S1, __IOPOSITION__); \SET_BIT(__HANDLE__->AF_S0, __IOPOSITION__); \}while (0)#define __AFIO_REMAP_SET_OPT5(__HANDLE__, __IOPOSITION__) do{ \CLEAR_BIT(__HANDLE__->AF_SEL, __IOPOSITION__); \}while (0)#define __AFIO_REMAP_SET_OPT6(__HANDLE__, __IOPOSITION__) do{ \CLEAR_BIT(__HANDLE__->AF_SEL, __IOPOSITION__); \CLEAR_BIT(__HANDLE__->DIR, __IOPOSITION__); \SET_BIT(__HANDLE__->PULLUP_EN, __IOPOSITION__); \CLEAR_BIT(__HANDLE__->PULLDOWN_EN, __IOPOSITION__); \}while (0)#define __AFIO_REMAP_SET_OPT7(__HANDLE__, __IOPOSITION__) do{ \CLEAR_BIT(__HANDLE__->AF_SEL, __IOPOSITION__); \CLEAR_BIT(__HANDLE__->DIR, __IOPOSITION__); \SET_BIT(__HANDLE__->PULLUP_EN, __IOPOSITION__); \CLEAR_BIT(__HANDLE__->PULLDOWN_EN, __IOPOSITION__); \}while (0)#define __HAL_AFIO_REMAP_SPI_CLK(__HANDLE__, __IOPOSITION__) do{ \if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_1)) \{ \__AFIO_REMAP_SET_OPT2(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_2)) \{ \__AFIO_REMAP_SET_OPT2(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_15)) \{ \__AFIO_REMAP_SET_OPT3(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_24)) \{ \__AFIO_REMAP_SET_OPT1(__HANDLE__, __IOPOSITION__); \} \}while (0) #define __HAL_AFIO_REMAP_SPI_CS(__HANDLE__, __IOPOSITION__) do{ \if ((__HANDLE__ == GPIOA) && (__IOPOSITION__ == GPIO_PIN_0)) \{ \__AFIO_REMAP_SET_OPT2(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_4)) \{ \__AFIO_REMAP_SET_OPT1(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_14)) \{ \__AFIO_REMAP_SET_OPT3(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_23)) \{ \__AFIO_REMAP_SET_OPT1(__HANDLE__, __IOPOSITION__); \} \}while (0) #define __HAL_AFIO_REMAP_SPI_MISO(__HANDLE__, __IOPOSITION__) do{ \if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_0)) \{ \__AFIO_REMAP_SET_OPT2(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_3)) \{ \__AFIO_REMAP_SET_OPT2(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_16)) \{ \__AFIO_REMAP_SET_OPT3(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_25)) \{ \__AFIO_REMAP_SET_OPT1(__HANDLE__, __IOPOSITION__); \} \}while (0) #define __HAL_AFIO_REMAP_SPI_MOSI(__HANDLE__, __IOPOSITION__) do{ \if ((__HANDLE__ == GPIOA) && (__IOPOSITION__ == GPIO_PIN_7)) \{ \__AFIO_REMAP_SET_OPT2(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_5)) \{ \__AFIO_REMAP_SET_OPT1(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_17)) \{ \__AFIO_REMAP_SET_OPT3(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_26)) \{ \__AFIO_REMAP_SET_OPT1(__HANDLE__, __IOPOSITION__); \} \}while (0) #define __HAL_AFIO_REMAP_UART0_TX(__HANDLE__, __IOPOSITION__) do{ \if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_19)) \{ \__AFIO_REMAP_SET_OPT1(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_27)) \{ \__AFIO_REMAP_SET_OPT2(__HANDLE__, __IOPOSITION__); \} \}while (0)#define __HAL_AFIO_REMAP_UART0_RX(__HANDLE__, __IOPOSITION__) do{ \if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_20)) \{ \__AFIO_REMAP_SET_OPT1(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_28)) \{ \__AFIO_REMAP_SET_OPT2(__HANDLE__, __IOPOSITION__); \} \CLEAR_BIT(__HANDLE__->PULLUP_EN, __IOPOSITION__); \}while (0)#define __HAL_AFIO_REMAP_UART0_RTS(__HANDLE__, __IOPOSITION__) do{ \if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_21)) \{ \__AFIO_REMAP_SET_OPT1(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_29)) \{ \__AFIO_REMAP_SET_OPT2(__HANDLE__, __IOPOSITION__); \} \}while (0)#define __HAL_AFIO_REMAP_UART0_CTS(__HANDLE__, __IOPOSITION__) do{ \if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_22)) \{ \__AFIO_REMAP_SET_OPT1(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_30)) \{ \__AFIO_REMAP_SET_OPT2(__HANDLE__, __IOPOSITION__); \} \}while (0)#define __HAL_AFIO_REMAP_UART1_TX(__HANDLE__, __IOPOSITION__) do{ \if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_6)) \{ \__AFIO_REMAP_SET_OPT1(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_31)) \{ \__AFIO_REMAP_SET_OPT2(__HANDLE__, __IOPOSITION__); \} \}while (0)#define __HAL_AFIO_REMAP_UART1_RX(__HANDLE__, __IOPOSITION__) do{ \if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_7)) \{ \__AFIO_REMAP_SET_OPT1(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_16)) \{ \__AFIO_REMAP_SET_OPT4(__HANDLE__, __IOPOSITION__); \} \CLEAR_BIT(__HANDLE__->PULLUP_EN, __IOPOSITION__); \}while (0)#define __HAL_AFIO_REMAP_UART1_RTS(__HANDLE__, __IOPOSITION__) do{ \if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_19)) \{ \__AFIO_REMAP_SET_OPT3(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOA) && (__IOPOSITION__ == GPIO_PIN_2)) \{ \__AFIO_REMAP_SET_OPT1(__HANDLE__, __IOPOSITION__); \} \}while (0)#define __HAL_AFIO_REMAP_UART1_CTS(__HANDLE__, __IOPOSITION__) do{ \if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_20)) \{ \__AFIO_REMAP_SET_OPT3(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOA) && (__IOPOSITION__ == GPIO_PIN_3)) \{ \__AFIO_REMAP_SET_OPT1(__HANDLE__, __IOPOSITION__); \} \}while (0)#define __HAL_AFIO_REMAP_UART2_TX(__HANDLE__, __IOPOSITION__) do{ \if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_2)) \{ \__AFIO_REMAP_SET_OPT3(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOA) && (__IOPOSITION__ == GPIO_PIN_2)) \{ \__AFIO_REMAP_SET_OPT2(__HANDLE__, __IOPOSITION__); \} \}while (0)#define __HAL_AFIO_REMAP_UART2_RX(__HANDLE__, __IOPOSITION__) do{ \if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_3)) \{ \__AFIO_REMAP_SET_OPT3(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOA) && (__IOPOSITION__ == GPIO_PIN_3)) \{ \__AFIO_REMAP_SET_OPT2(__HANDLE__, __IOPOSITION__); \} \CLEAR_BIT(__HANDLE__->PULLUP_EN, __IOPOSITION__); \}while (0)#define __HAL_AFIO_REMAP_UART2_RTS(__HANDLE__, __IOPOSITION__) do{ \if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_4)) \{ \__AFIO_REMAP_SET_OPT2(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOA) && (__IOPOSITION__ == GPIO_PIN_5)) \{ \__AFIO_REMAP_SET_OPT2(__HANDLE__, __IOPOSITION__); \} \}while (0)#define __HAL_AFIO_REMAP_UART2_CTS(__HANDLE__, __IOPOSITION__) do{ \if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_5)) \{ \__AFIO_REMAP_SET_OPT2(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOA) && (__IOPOSITION__ == GPIO_PIN_6)) \{ \__AFIO_REMAP_SET_OPT2(__HANDLE__, __IOPOSITION__); \} \}while (0)#define __HAL_AFIO_REMAP_UART3_TX(__HANDLE__, __IOPOSITION__) do{ \if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_0)) \{ \__AFIO_REMAP_SET_OPT3(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOA) && (__IOPOSITION__ == GPIO_PIN_5)) \{ \__AFIO_REMAP_SET_OPT1(__HANDLE__, __IOPOSITION__); \} \}while (0)#define __HAL_AFIO_REMAP_UART3_RX(__HANDLE__, __IOPOSITION__) do{ \if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_1)) \{ \__AFIO_REMAP_SET_OPT3(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOA) && (__IOPOSITION__ == GPIO_PIN_6)) \{ \__AFIO_REMAP_SET_OPT1(__HANDLE__, __IOPOSITION__); \} \CLEAR_BIT(__HANDLE__->PULLUP_EN, __IOPOSITION__); \}while (0)#define __HAL_AFIO_REMAP_UART3_RTS(__HANDLE__, __IOPOSITION__) do{ \if ((__HANDLE__ == GPIOA) && (__IOPOSITION__ == GPIO_PIN_2)) \{ \__AFIO_REMAP_SET_OPT4(__HANDLE__, __IOPOSITION__); \} \}while (0)#define __HAL_AFIO_REMAP_UART3_CTS(__HANDLE__, __IOPOSITION__) do{ \if ((__HANDLE__ == GPIOA) && (__IOPOSITION__ == GPIO_PIN_3)) \{ \__AFIO_REMAP_SET_OPT4(__HANDLE__, __IOPOSITION__); \} \}while (0)#define __HAL_AFIO_REMAP_UART4_TX(__HANDLE__, __IOPOSITION__) do{ \if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_4)) \{ \__AFIO_REMAP_SET_OPT3(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOA) && (__IOPOSITION__ == GPIO_PIN_8)) \{ \__AFIO_REMAP_SET_OPT2(__HANDLE__, __IOPOSITION__); \} \}while (0)#define __HAL_AFIO_REMAP_UART4_RX(__HANDLE__, __IOPOSITION__) do{ \if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_5)) \{ \__AFIO_REMAP_SET_OPT3(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOA) && (__IOPOSITION__ == GPIO_PIN_9)) \{ \__AFIO_REMAP_SET_OPT2(__HANDLE__, __IOPOSITION__); \} \CLEAR_BIT(__HANDLE__->PULLUP_EN, __IOPOSITION__); \}while (0)#define __HAL_AFIO_REMAP_UART4_RTS(__HANDLE__, __IOPOSITION__) do{ \if ((__HANDLE__ == GPIOA) && (__IOPOSITION__ == GPIO_PIN_5)) \{ \__AFIO_REMAP_SET_OPT4(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOA) && (__IOPOSITION__ == GPIO_PIN_10)) \{ \__AFIO_REMAP_SET_OPT2(__HANDLE__, __IOPOSITION__); \} \}while (0)#define __HAL_AFIO_REMAP_UART4_CTS(__HANDLE__, __IOPOSITION__) do{ \if ((__HANDLE__ == GPIOA) && (__IOPOSITION__ == GPIO_PIN_6)) \{ \__AFIO_REMAP_SET_OPT4(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOA) && (__IOPOSITION__ == GPIO_PIN_11)) \{ \__AFIO_REMAP_SET_OPT2(__HANDLE__, __IOPOSITION__); \} \}while (0) #define __HAL_AFIO_REMAP_UART5_TX(__HANDLE__, __IOPOSITION__) do{ \if ((__HANDLE__ == GPIOA) && (__IOPOSITION__ == GPIO_PIN_12)) \{ \__AFIO_REMAP_SET_OPT2(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOA) && (__IOPOSITION__ == GPIO_PIN_08)) \{ \__AFIO_REMAP_SET_OPT3(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_18)) \{ \__AFIO_REMAP_SET_OPT1(__HANDLE__, __IOPOSITION__); \} \}while (0)#define __HAL_AFIO_REMAP_UART5_RX(__HANDLE__, __IOPOSITION__) do{ \if ((__HANDLE__ == GPIOA) && (__IOPOSITION__ == GPIO_PIN_13)) \{ \__AFIO_REMAP_SET_OPT2(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOA) && (__IOPOSITION__ == GPIO_PIN_9)) \{ \__AFIO_REMAP_SET_OPT3(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_17)) \{ \__AFIO_REMAP_SET_OPT1(__HANDLE__, __IOPOSITION__); \} \CLEAR_BIT(__HANDLE__->PULLUP_EN, __IOPOSITION__); \}while (0)#define __HAL_AFIO_REMAP_UART5_RTS(__HANDLE__, __IOPOSITION__) do{ \if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_12)) \{ \__AFIO_REMAP_SET_OPT3(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOA) && (__IOPOSITION__ == GPIO_PIN_14)) \{ \__AFIO_REMAP_SET_OPT2(__HANDLE__, __IOPOSITION__); \} \}while (0)#define __HAL_AFIO_REMAP_UART5_CTS(__HANDLE__, __IOPOSITION__) do{ \if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_13)) \{ \__AFIO_REMAP_SET_OPT3(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOA) && (__IOPOSITION__ == GPIO_PIN_15)) \{ \__AFIO_REMAP_SET_OPT2(__HANDLE__, __IOPOSITION__); \} \}while (0)#define __HAL_AFIO_REMAP_ADC(__HANDLE__, __IOPOSITION__) do{ \if ((__HANDLE__ == GPIOA) && \((__IOPOSITION__ == GPIO_PIN_1) || (__IOPOSITION__ == GPIO_PIN_2) || \(__IOPOSITION__ == GPIO_PIN_3) || (__IOPOSITION__ == GPIO_PIN_4))) \{ \__AFIO_REMAP_SET_OPT6(__HANDLE__, __IOPOSITION__); \} \}while (0)#define __HAL_AFIO_REMAP_PWM0(__HANDLE__, __IOPOSITION__) do{ \if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_0)) \{ \__AFIO_REMAP_SET_OPT1(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_19)) \{ \__AFIO_REMAP_SET_OPT2(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_12)) \{ \__AFIO_REMAP_SET_OPT2(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOA) && (__IOPOSITION__ == GPIO_PIN_2)) \{ \__AFIO_REMAP_SET_OPT3(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOA) && (__IOPOSITION__ == GPIO_PIN_10)) \{ \__AFIO_REMAP_SET_OPT3(__HANDLE__, __IOPOSITION__); \} \}while (0)#define __HAL_AFIO_REMAP_PWM1(__HANDLE__, __IOPOSITION__) do{ \if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_1)) \{ \__AFIO_REMAP_SET_OPT1(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_20)) \{ \__AFIO_REMAP_SET_OPT2(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOA) && (__IOPOSITION__ == GPIO_PIN_3)) \{ \__AFIO_REMAP_SET_OPT3(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOA) && (__IOPOSITION__ == GPIO_PIN_11)) \{ \__AFIO_REMAP_SET_OPT3(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_13)) \{ \__AFIO_REMAP_SET_OPT3(__HANDLE__, __IOPOSITION__); \} \}while (0)#define __HAL_AFIO_REMAP_PWM2(__HANDLE__, __IOPOSITION__) do{ \if ((__HANDLE__ == GPIOA) && (__IOPOSITION__ == GPIO_PIN_0)) \{ \__AFIO_REMAP_SET_OPT3(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_2)) \{ \__AFIO_REMAP_SET_OPT1(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOA) && (__IOPOSITION__ == GPIO_PIN_12)) \{ \__AFIO_REMAP_SET_OPT3(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_14)) \{ \__AFIO_REMAP_SET_OPT2(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_24)) \{ \__AFIO_REMAP_SET_OPT2(__HANDLE__, __IOPOSITION__); \} \}while (0)#define __HAL_AFIO_REMAP_PWM3(__HANDLE__, __IOPOSITION__) do{ \if ((__HANDLE__ == GPIOA) && (__IOPOSITION__ == GPIO_PIN_1)) \{ \__AFIO_REMAP_SET_OPT3(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_3)) \{ \__AFIO_REMAP_SET_OPT1(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOA) && (__IOPOSITION__ == GPIO_PIN_13)) \{ \__AFIO_REMAP_SET_OPT3(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_15)) \{ \__AFIO_REMAP_SET_OPT2(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_25)) \{ \__AFIO_REMAP_SET_OPT2(__HANDLE__, __IOPOSITION__); \} \}while (0)#define __HAL_AFIO_REMAP_PWM4(__HANDLE__, __IOPOSITION__) do{ \if ((__HANDLE__ == GPIOA) && (__IOPOSITION__ == GPIO_PIN_4)) \{ \__AFIO_REMAP_SET_OPT3(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOA) && (__IOPOSITION__ == GPIO_PIN_7)) \{ \__AFIO_REMAP_SET_OPT1(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOA) && (__IOPOSITION__ == GPIO_PIN_14)) \{ \__AFIO_REMAP_SET_OPT3(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_16)) \{ \__AFIO_REMAP_SET_OPT2(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_26)) \{ \__AFIO_REMAP_SET_OPT2(__HANDLE__, __IOPOSITION__); \} \}while (0)#define __HAL_AFIO_REMAP_I2C_SCL(__HANDLE__, __IOPOSITION__) do{ \if ((__HANDLE__ == GPIOA) && (__IOPOSITION__ == GPIO_PIN_1)) \{ \__AFIO_REMAP_SET_OPT2(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_20)) \{ \__AFIO_REMAP_SET_OPT4(__HANDLE__, __IOPOSITION__); \} \}while (0) #define __HAL_AFIO_REMAP_I2C_SDA(__HANDLE__, __IOPOSITION__) do{ \if ((__HANDLE__ == GPIOA) && (__IOPOSITION__ == GPIO_PIN_4)) \{ \__AFIO_REMAP_SET_OPT2(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_19)) \{ \__AFIO_REMAP_SET_OPT4(__HANDLE__, __IOPOSITION__); \} \}while (0) #define __HAL_AFIO_REMAP_TOUCH(__HANDLE__, __IOPOSITION__) do{ \if (((__HANDLE__ == GPIOA) && (__IOPOSITION__ == GPIO_PIN_7)) || \((__HANDLE__ == GPIOA) && (__IOPOSITION__ == GPIO_PIN_9)) || \((__HANDLE__ == GPIOA) && (__IOPOSITION__ == GPIO_PIN_10)) || \((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_0)) || \((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_1)) || \((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_2)) || \((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_3)) || \((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_4)) || \((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_5)) || \((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_6)) || \((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_7)) || \((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_8)) || \((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_9)) || \((__HANDLE__ == GPIOA) && (__IOPOSITION__ == GPIO_PIN_12)) || \((__HANDLE__ == GPIOA) && (__IOPOSITION__ == GPIO_PIN_14)) || \((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_29))) \{ \if ((__HANDLE__ != GPIOA) || (__IOPOSITION__ != GPIO_PIN_7)) \{ \__AFIO_REMAP_SET_OPT7(GPIOA, GPIO_PIN_7); \} \__AFIO_REMAP_SET_OPT7(__HANDLE__, __IOPOSITION__); \} \}while (0)#define __HAL_AFIO_REMAP_I2S_EXT_MCK(__HANDLE__, __IOPOSITION__) do{ \if ((__HANDLE__ == GPIOA) && (__IOPOSITION__ == GPIO_PIN_7)) \{ \__AFIO_REMAP_SET_OPT3(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_17)) \{ \__AFIO_REMAP_SET_OPT4(__HANDLE__, __IOPOSITION__); \} \}while (0)#define __HAL_AFIO_REMAP_I2S_MCK(__HANDLE__, __IOPOSITION__) do{ \if ((__HANDLE__ == GPIOA) && (__IOPOSITION__ == GPIO_PIN_0)) \{ \__AFIO_REMAP_SET_OPT1(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOA) && (__IOPOSITION__ == GPIO_PIN_7)) \{ \__AFIO_REMAP_SET_OPT3(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_17)) \{ \__AFIO_REMAP_SET_OPT4(__HANDLE__, __IOPOSITION__); \} \}while (0)#define __HAL_AFIO_REMAP_I2S_WS(__HANDLE__, __IOPOSITION__) do{ \if ((__HANDLE__ == GPIOA) && (__IOPOSITION__ == GPIO_PIN_1)) \{ \__AFIO_REMAP_SET_OPT4(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_9)) \{ \__AFIO_REMAP_SET_OPT1(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOA) && (__IOPOSITION__ == GPIO_PIN_9)) \{ \__AFIO_REMAP_SET_OPT4(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_13)) \{ \__AFIO_REMAP_SET_OPT4(__HANDLE__, __IOPOSITION__); \} \}while (0)#define __HAL_AFIO_REMAP_I2S_CK(__HANDLE__, __IOPOSITION__) do{ \if ((__HANDLE__ == GPIOA) && (__IOPOSITION__ == GPIO_PIN_4)) \{ \__AFIO_REMAP_SET_OPT4(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_8)) \{ \__AFIO_REMAP_SET_OPT1(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOA) && (__IOPOSITION__ == GPIO_PIN_8)) \{ \__AFIO_REMAP_SET_OPT4(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_12)) \{ \__AFIO_REMAP_SET_OPT4(__HANDLE__, __IOPOSITION__); \} \}while (0)#define __HAL_AFIO_REMAP_I2S_MOSI(__HANDLE__, __IOPOSITION__) do{ \if ((__HANDLE__ == GPIOA) && (__IOPOSITION__ == GPIO_PIN_0)) \{ \__AFIO_REMAP_SET_OPT4(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_11)) \{ \__AFIO_REMAP_SET_OPT1(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOA) && (__IOPOSITION__ == GPIO_PIN_10)) \{ \__AFIO_REMAP_SET_OPT4(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_14)) \{ \__AFIO_REMAP_SET_OPT4(__HANDLE__, __IOPOSITION__); \} \}while (0)#define __HAL_AFIO_REMAP_I2S_MISO(__HANDLE__, __IOPOSITION__) do{ \if ((__HANDLE__ == GPIOA) && (__IOPOSITION__ == GPIO_PIN_7)) \{ \__AFIO_REMAP_SET_OPT4(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_10)) \{ \__AFIO_REMAP_SET_OPT1(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOA) && (__IOPOSITION__ == GPIO_PIN_11)) \{ \__AFIO_REMAP_SET_OPT4(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_15)) \{ \__AFIO_REMAP_SET_OPT4(__HANDLE__, __IOPOSITION__); \} \}while (0)#define __HAL_AFIO_REMAP_SWJ_ENABLE do { \__AFIO_REMAP_SET_OPT1(GPIOA, GPIO_PIN_1); \__AFIO_REMAP_SET_OPT1(GPIOA, GPIO_PIN_4); \} while(0)#define __HAL_AFIO_REMAP_SWJ_DISABLE do { \__AFIO_REMAP_SET_OPT5(GPIOA, GPIO_PIN_1); \__AFIO_REMAP_SET_OPT5(GPIOA, GPIO_PIN_4); \} while(0)

wm_rcc.h:時(shí)鐘相關(guān)

打開wm_rcc.h,有如下宏

#define RCC ((RCC_TypeDef *)RCC_BASE)#define __HAL_RCC_ALL_CLK_DISABLE() CLEAR_BIT(RCC->CLK_EN, RCC_CLK_EN_ALL)#define __HAL_RCC_SPI_CLK_ENABLE() SET_BIT(RCC->CLK_EN, RCC_CLK_EN_LSPI)#define __HAL_RCC_SPI_CLK_DISABLE() CLEAR_BIT(RCC->CLK_EN, RCC_CLK_EN_LSPI)#define __HAL_RCC_PWM_CLK_ENABLE() SET_BIT(RCC->CLK_EN, RCC_CLK_EN_PWM)#define __HAL_RCC_PWM_CLK_DISABLE() CLEAR_BIT(RCC->CLK_EN, RCC_CLK_EN_PWM)#define __HAL_RCC_ADC_CLK_ENABLE() SET_BIT(RCC->CLK_EN, RCC_CLK_EN_ADC)#define __HAL_RCC_ADC_CLK_DISABLE() CLEAR_BIT(RCC->CLK_EN, RCC_CLK_EN_ADC)#define __HAL_RCC_GPIO_CLK_ENABLE() SET_BIT(RCC->CLK_EN, RCC_CLK_EN_GPIO)#define __HAL_RCC_GPIO_CLK_DISABLE() CLEAR_BIT(RCC->CLK_EN, RCC_CLK_EN_GPIO)#define __HAL_RCC_UART0_CLK_ENABLE() SET_BIT(RCC->CLK_EN, RCC_CLK_EN_UART0)#define __HAL_RCC_UART0_CLK_DISABLE() CLEAR_BIT(RCC->CLK_EN, RCC_CLK_EN_UART0)#define __HAL_RCC_UART1_CLK_ENABLE() SET_BIT(RCC->CLK_EN, RCC_CLK_EN_UART1)#define __HAL_RCC_UART1_CLK_DISABLE() CLEAR_BIT(RCC->CLK_EN, RCC_CLK_EN_UART1)#define __HAL_RCC_UART2_CLK_ENABLE() SET_BIT(RCC->CLK_EN, RCC_CLK_EN_UART2)#define __HAL_RCC_UART2_CLK_DISABLE() CLEAR_BIT(RCC->CLK_EN, RCC_CLK_EN_UART2)#define __HAL_RCC_UART3_CLK_ENABLE() SET_BIT(RCC->CLK_EN, RCC_CLK_EN_UART3)#define __HAL_RCC_UART3_CLK_DISABLE() CLEAR_BIT(RCC->CLK_EN, RCC_CLK_EN_UART3)#define __HAL_RCC_UART4_CLK_ENABLE() SET_BIT(RCC->CLK_EN, RCC_CLK_EN_UART4)#define __HAL_RCC_UART4_CLK_DISABLE() CLEAR_BIT(RCC->CLK_EN, RCC_CLK_EN_UART4)#define __HAL_RCC_UART5_CLK_ENABLE() SET_BIT(RCC->CLK_EN, RCC_CLK_EN_UART5)#define __HAL_RCC_UART5_CLK_DISABLE() CLEAR_BIT(RCC->CLK_EN, RCC_CLK_EN_UART5)#define __HAL_RCC_TIM_CLK_ENABLE() SET_BIT(RCC->CLK_EN, RCC_CLK_EN_TIMER)#define __HAL_RCC_TIM_CLK_DISABLE() CLEAR_BIT(RCC->CLK_EN, RCC_CLK_EN_TIMER)#define __HAL_RCC_I2C_CLK_ENABLE() SET_BIT(RCC->CLK_EN, RCC_CLK_EN_I2C)#define __HAL_RCC_I2C_CLK_DISABLE() CLEAR_BIT(RCC->CLK_EN, RCC_CLK_EN_I2C)#define __HAL_RCC_TOUCH_CLK_ENABLE() SET_BIT(RCC->CLK_EN, RCC_CLK_EN_TOUCH)#define __HAL_RCC_TOUCH_CLK_DISABLE() CLEAR_BIT(RCC->CLK_EN, RCC_CLK_EN_TOUCH)#define __HAL_RCC_DMA_CLK_ENABLE() SET_BIT(RCC->CLK_EN, RCC_CLK_EN_DMA)#define __HAL_RCC_DMA_CLK_DISABLE() CLEAR_BIT(RCC->CLK_EN, RCC_CLK_EN_DMA)#define __HAL_RCC_I2S_CLK_ENABLE() SET_BIT(RCC->CLK_EN, RCC_CLK_EN_I2S)#define __HAL_RCC_I2S_CLK_DISABLE() CLEAR_BIT(RCC->CLK_EN, RCC_CLK_EN_I2S)

wm_it.h:中斷服務(wù)函數(shù)的聲明

#ifndef __WM_IT_H__ #define __WM_IT_H__void CORET_IRQHandler(void); void GPIOA_IRQHandler(void); void GPIOB_IRQHandler(void); void UART0_IRQHandler(void); void UART1_IRQHandler(void); void UART2_5_IRQHandler(void); void WDG_IRQHandler(void); void TIM0_5_IRQHandler(void); void ADC_IRQHandler(void); void PMU_IRQHandler(void); void TOUCH_IRQHandler(void); void I2S_IRQHandler(void); void DMA_Channel0_IRQHandler(void); void DMA_Channel1_IRQHandler(void); void DMA_Channel2_IRQHandler(void); void DMA_Channel3_IRQHandler(void); void DMA_Channel4_7_IRQHandler(void);#endif 創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的【联盛德W806上手笔记】三、MCU系统与时钟结构的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。