【联盛德W806上手笔记】三、MCU系统与时钟结构
目錄
- 總線結構
- AHB-1 總線
- AHB-2 總線
- 時鐘與復位
- 主要特性
- 時鐘結構
- 功能描述
- 時鐘門控
- 時鐘自適應關斷
- 功能復位
- 時鐘分頻
- 寄存器描述
- 寄存器列表
- 軟件時鐘門控使能寄存器
- 軟件時鐘掩碼寄存器
- 軟件復位控制寄存器
- 時鐘分頻配置寄存器
- 調試控制寄存器
- I2S 時鐘控制寄存器
- 復位狀態寄存器
- 調試功能控制
- 參考時鐘電路設計
- 啟動配置
- 地址空間
- SRAM
- Flash
- QFlash
- SPI Flash
- PSRAM
- 庫函數
- wm_cpu.h
- 函數
- 參數
- 宏
- wm_gpio_ex.h:引腳復用相關
- 宏
- wm_rcc.h:時鐘相關
- 宏
- wm_it.h:中斷服務函數的聲明
Windows 10 20H2
HLK-W806-V1.0-KIT
WM_SDK_W806_v0.6.0
???????摘自《W806 芯片設計指導書 V1.0》、《W806 MCU 芯片規格書 V2.0》
總線結構
???????這里沒有找到W806的,不過找到了與之差不多的W800的:
???????W800 芯片由兩級總線構成,如下圖所示
AHB-1 總線
???????本級總線有四個主設備-即 XT804,DMA,GPSEC 以及 5 個從設備。
???????XT804 是面向控制領域的 32 位高能效嵌入式 CPU 核, 采用 16/32 位混合編碼指令系統,設計了精簡高效的 3 級流水線。
???????XT804 提供多種可配置功能,包括硬件浮點單元、片上高速緩存、DSP 加速單元、可信防護技術、片上緊耦合 IP 等,用戶可根據應用需要進行配置。此外,XT804 提供多總線接口,支持系統總線、指令總線、數據總線的靈活配置。XT804 針對中斷響應做了特殊的加速,中斷響應延時僅需 13 個周期。
???????總線時鐘最快工作在 240MHz 頻率,可以配置為 240/160/120/80/40MHz,或更低。
AHB-2 總線
???????本條總線有 4 個主設備,3 個從設備,使用 crossbar 連接結構,能夠實現不同主設備對不同從設備的同時訪問,從而加大帶寬。總線時鐘最快工作在 40MHz 頻率,可以根據需要配置為更低。
???????各主設備采用固定優先級,自上而下優先級遞減。
時鐘與復位
???????支持芯片時鐘和復位系統的控制,時鐘控制包括時鐘變頻,時鐘關斷以及自適應門控;復位控制包括系統以及子模塊的軟復位控制。
主要特性
支持各模塊時鐘關斷
支持部分模塊時鐘自適應關斷
支持各模塊軟件復位
支持 CPU 頻率設置
支持 ADC/DAC 回環測試
支持 I2S 時鐘設置
時鐘結構
???????這里沒有找到W806的,不過找到了與之差不多的W800的:
???????W800 使用 24/40MHz 晶體作為 SoC 時鐘源,片內內置 1 個 DPLL 輸出 480MHz,供給CPU,系統總線,數據總線及 WiFi 系統使用;片內另外內置 32.768KHZ RC 振蕩器,供 PMU 及 LCD 模塊使用。時鐘結構概括圖如下圖所示。
功能描述
時鐘門控
???????通過配置時鐘門控使能寄存器 CLK_GATE_EN 可以控制指定功能的時鐘關斷,從而達到關斷某一模塊功能的目的。
???????為了提供固件對系統功耗控制的靈活性,時鐘與復位模塊提供了系統內各模塊的時鐘門控功能。當關閉相應模塊的時鐘時,該模塊的數字邏輯與時鐘樹將停止工作,能夠降低系統的動態功耗。
???????具體各模塊的開關對應寄存器 SW_CLKG_EN 的詳細描述。
時鐘自適應關斷
???????芯片依據內部的某些狀態的遷移,自適應關斷某些功能模塊的時鐘。
???????用戶請不要更改配置,否則可能會在配置 PMU 功能時導致系統異常。
功能復位
???????芯片提供了各子系統的軟復位功能,通過設置 SW_RST_CTRL 相應 BIT 為 0 可以達到子系統復位。
???????但是,復位狀態不會自動清除,要恢復正常工作需將 SW_RST_CTRL 相應 BIT 位置 1。
???????軟復位功能并不會復位 CPU 及 WatchDog。
???????該寄存器中,對 APB/BUS1/BUS2(對應 APB 總線,系統總線及數據總線)的復位操作不推薦,會導致系統訪問設備異常。
時鐘分頻
???????W800 系統采用 40MHz/24MHz 晶體作為系統時鐘源,系統內置 DPLL,固定輸出 480MHz 時鐘作為全系統的時鐘源(如下圖)。
???????系統總線的時鐘與 CPU 時鐘一致,數據總線的時鐘固定為 WLAN 根時鐘的 1/4。
???????WLAN 根時鐘同時也是整個 WLAN 系統的時鐘源頭。
???????此模塊中提供了設定 CPU 時鐘與 WLAN 根時鐘的功能,供固件調節系統性能及功耗使用。
???????設置 SYS_CLK_DIV 寄存器的 BIT[7:0]可以調整 CPU 時鐘分頻系數。CPU 時鐘分頻的源時鐘為 DPLL 的輸出,固定為 480MHz。CPU 時鐘分頻系數默認值為 6,即 CPU 默認工作頻率為 480MHz 的 6 分頻,即 80MHz。當需要調整 CPU 所需時鐘時,可以重新配置本參數。
???????CLK_PERI 時鐘提供 SoC 系統中加密模塊的運行時鐘的根時鐘,以及某些接口的運行時鐘的根時鐘,比如 PWM 接口,I2S 接口,Flash 接口時鐘。此時鐘也由 DPLL 輸出的 480MHz 分頻得出。正常工作情況下應固定為 3 分頻,得到 CLK_PERI 根時鐘 160MHz。由 CLK_PERI 根時鐘進行 2 分頻,4 分頻得到80MHz 和 40MHz,提供給加密模塊和接口模塊使用。
???????設置 SYS_CLK_DIV 寄存器的 BIT[15:8]可以調整 WLAN 時鐘分頻系數。默認分頻因子為 3,即對 DPLL的 480MHz 輸出 3 分頻,得到 160MHz 時鐘,作為根節點時鐘送給 WLAN(WLAN 再繼續分頻得到更為詳細的低頻時鐘供 WLAN 系統使用。
???????注意:如果希望 WLAN 系統正常工作,WLAN 根時鐘需要保持在 160MHz,否則 WLAN 系統將失效。
???????當不需要 WLAN 系統工作的時候,可以將 WLAN 根時鐘降低,降低系統動態功耗。
???????在改變系統時鐘配置的時候,需要注意:系統總線與數據總線的比例需要維持在 M:1,其中 M 為整數,最小為 1。在改變系統時鐘配置時,也需要同時更新寄存器 SYS_CLK_DIV 的 BIT [23:16], 設置正確的比例系數。否則,訪問數據總線將得到異常數據。
???????SYS_CLK_SEL 的[15:8]提供了設置 SAR_ADC 工作頻率的分頻因子,以 40M 為時鐘源進行分頻。分頻系數即為所配分頻值。
???????SYS_CLK_SEL 的 BIT[4]為配置 RSA 模塊核心運算的時鐘頻率選擇,可以選擇 80MHz 或者 160MHz。
???????BIT[5]為配置 GPSEC 模塊核心運算的時鐘頻率選擇,可以選擇 80MHz 或者 160MHz。
???????BIT[6]為配置 FLASH 模塊對外總線的時鐘頻率選擇,可以選擇 40MHz 或者 80MHz。
???????當需要重新配置 cpu_clk_divider,wlan_clk_divider,bus2_syncdn_factor,sdadc_fdiv 時,需要置位 SYS_CLK_DIV 的 BIT[31],硬件自動更新上述四個參數到分頻器,然后清零 BIT[31]。
???????I2S_CLK_CTRL 提供了 I2S 模塊的時鐘配置功能。
寄存器描述
寄存器列表
軟件時鐘門控使能寄存器
軟件時鐘掩碼寄存器
軟件復位控制寄存器
時鐘分頻配置寄存器
調試控制寄存器
I2S 時鐘控制寄存器
復位狀態寄存器
調試功能控制
???????用戶可以通過設置 DEBUG_CTRL 的值(SYS_CLK_SEL- BIT[16])來達到使能和禁用 JTAG 功能的目的。
參考時鐘電路設計
???????芯片參考時鐘選用 40MHz 頻率,用戶根據實際產品需求選用不同溫度等級、穩定度、負載電容值的晶體。晶體兩端所接負載電容根據不同廠家晶體及頻偏情況需要調整。
???????晶體擺放盡量靠近芯片,走線盡量短,并且遠離干擾源,時鐘周圍多地孔隔離。時鐘下面各層禁止其它走線穿過,防止干擾時鐘源。
啟動配置
???????W800 芯片上電后,CPU 會啟動執行 ROM 中的固件,加載 Flash 中指定地址的用戶 Image。ROM 固件在開始運行時會讀取 BootMode(PA0)引腳,根據引腳的信號判斷進入啟動狀態:
???????通常,BootMode 引腳應該用于生產或者調試階段。在生產階段,用戶通過將 BootMode 引腳持續拉低 30ms 以上,進入功能模式,可以快速進行燒錄 Flash 工作。
???????在產品返工或者維修的場景中,在芯片未進入“最高安全等級”(關于安全等級的描述請參考《WM_W800_ROM 功能簡述》)時,可以通過該引腳進入功能模式,擦除舊的 Image,寫入新的Image。
???????在調試階段,無論固件出現任何故障,都可以通過將 BootMode 引腳持續拉低 30ms 以上,進入串口下載功能,燒錄新的固件。
地址空間
???????這里沒有找到W806的,不過找到了與之差不多的W800的:
???????XT804 支持 4G 存儲空間,如上圖所示分為 6 個 block,分別為代碼區,內存區,片上外設,片外存儲區,片外外設和系統外設區。根據需求,w800 片內存儲空間如圖三所示映射到前三區。
SRAM
???????W800 內置 288KB SRAM。其中 160KB 掛載一級 AHB 總線上,128KB 掛載在二級 AHB 總線上。CPU等一級總線設備可以訪問所有內存區域,但是二級總線上的設備只能訪問二級總線上 128KB 的內存。
Flash
QFlash
???????W800 內部集成 2MBytes QFlash。通過芯片內部集成 32KB cache 實現 XIP 方式在 QFlash 上執行程序。 程序運行過程中,CPU 首先從 Cache 中讀取指令,當不能獲取指令時,以 8Bytes 一行的方式從QFlash 讀取指令,存入 Cache 內。因此,當持續運行代碼大小小于 32K 時,CPU 將無需從 QFlash 讀取指令,此時 CPU 可以運行在更高的頻率。上述方式為讀取指令操作方式,整個 Image 的 RO 段都會以這種方式操作。此過程用戶無需干預。
???????QFlash 也可以存儲數據,當用戶程序需要讀寫 QFlash 內數據時,需要通過內置的 QFlash 控制器進行操作,QFlash 提供了相應的地址、指令等寄存器來協助實現用戶想要的操作。
???????用戶需要注意的是,程序進行讀取或者寫入數據時,無需進行狀態判斷、等待等操作,因為 QFlash 控制器本身會進行判斷。當 QFlash 控制器返回時,表明讀取或者寫入已經完成。
SPI Flash
???????W800 芯片除了支持 6PIN 的 QFlash 接口之外(內置 PIN,未封裝),還支持低速 SPI 接口訪問。該 SPI接口的最高工作頻率可達 20MHz,支持主從功能。
PSRAM
???????W800 內置 SPI/QSPI 接口的 PSRAM 控制器,支持外置最大容量 64Mb 的 PSRAM 設備訪問,提供總線方式的 PSRAM 讀寫擦操作。最高讀寫速度 80MHz。當存儲容量需要擴充時,可以使用片外 PSRAM 擴充代碼存儲空間或者數據存儲空間。PSRAM 同樣支持 XIP 方式執行程序,CPU Cache 同樣支持緩存PSRAM 中數據。
庫函數
wm_cpu.h
函數
???????打開wm_cpu.h,有如下的函數聲明:
void SystemClock_Config(uint32_t clk); //該函數用于設置CPU時鐘,如SystemClock_Config(CPU_CLK_160M); void SystemClock_Get(wm_sys_clk *sysclk); //這個函數用來獲取CPU時鐘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); //設定中斷優先級,Priority為0~15的值,值越小,優先級越高。如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); //失能中斷通道參數
結構體和枚舉類型
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;宏參數
/**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:引腳復用相關
宏
#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:時鐘相關
打開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:中斷服務函數的聲明
#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 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的【联盛德W806上手笔记】三、MCU系统与时钟结构的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SAP HANA解读-2012 SAP商
- 下一篇: windows2003添加普通用户的远程