【联盛德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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/400111.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何开发一个异常检测系统:如何评价一个异常检测算法

利用数值来评价一个异常检测算法的重要性 使用实数评价法很重要&#xff0c;当你用某个算法来开发一个具体的机器学习应用时&#xff0c;你常常需要做出很多决定&#xff0c;如选择什么样的特征等等&#xff0c;如果你能找到如何来评价算法&#xff0c;直接返回一个实数来告诉你…

【联盛德W806上手笔记】四、PWM模块

目录PWM 控制器库函数函数参数宏测试程序独立模式main.cwm_hal_msp.cwm_it.c实验现象多通道同步模式main.cwm_hal_msp.cwm_it.c实验现象Windows 10 20H2 HLK-W806-V1.0-KIT WM_SDK_W806_v0.6.0 摘自《W806 芯片设计指导书 V1.0》、《W806 MCU 芯片规格书 V2.0》 PWM 控制器 5 …

C#中如何稳定精确地每隔5ms执行某个函数?

C#中如何稳定精确地每隔5ms执行某个函数&#xff1f; 在开始前我有一些资料&#xff0c;是我根据自己从业十年经验&#xff0c;熬夜搞了几个通宵&#xff0c;精心整理了一份「C#的资料从专业入门到高级教程工具包」&#xff0c;点个关注&#xff0c;全部无偿共享给大家&#xf…

【联盛德W806上手笔记】五、TIM定时器

目录定时器库函数函数参数宏Demo中的测试程序main.cwm_hal_msp.cwm_it.c实验现象Windows 10 20H2 HLK-W806-V1.0-KIT WM_SDK_W806_v0.6.0 摘自《W806 芯片设计指导书 V1.0》、《W806 MCU 芯片规格书 V2.0》 定时器 微秒与毫秒计时&#xff08;据时钟频率配置计数个数&#xff…

IOS-企业开发人员账号amp;邓白氏码申请记录

Apple开发人员账号分三种&#xff0c;个人。公司&#xff0c;还有企业。个人和公司都称为标准账号。另一种是教育机构的账号。 账号介绍 个人和公司的就不说了。如今仅仅说企业账号 首先是申请企业账号的地址&#xff1a; https://developer.apple.com/programs/ios/enterpri…

wordpress置顶文章调用与设置

文章来源: https://www.xuewangzhan.net/wpbbs/15737.html wordpress网站后台允许我们设置一些置顶文章&#xff0c;然后通过调用置顶文章的代码把它调用到自己的网站前台。 下面是最常用的wordpress调用置顶文章代码&#xff0c;适用于所有模板使用。 <?php $sticky g…

【联盛德W806上手笔记】六、7816/UART 控制器

目录7816/UART 控制器串口功能7816 接口功能下载口库函数函数参数宏Demo中的测试程序main.cwm_hal_msp.cwm_it.cfifo.cfifo.hWindows 10 20H2 HLK-W806-V1.0-KIT WM_SDK_W806_v0.6.0 摘自《W806 芯片设计指导书 V1.0》、《W806 MCU 芯片规格书 V2.0》 7816/UART 控制器 设备端…

【联盛德W806上手笔记】七、I2C

目录WM_SDK_W806_v0.6.0的库函数函数参数宏应用示例初始化使用测试I2C 控制器功能概述主要特性功能描述传输速率选择中断及启动停止可控快速输出及检测信号寄存器描述寄存器列表时钟分频寄存器_1时钟分频寄存器_2控制寄存器数据寄存器收发控制寄存器TXR 读出寄存器CR 读出寄存器…

【联盛德W806上手笔记】八、SPI及其DMA

目录高速 SPI 设备控制器库函数函数参数宏应用示例初始化引脚复用中断相关使用注意事项DataAlignmentDirection测试main.cwm_hal_msp.cwm_it.c其他改动实验现象Windows 10 20H2 HLK-W806-V1.0-KIT WM_SDK_W806_v0.6.0 摘自《W806 芯片设计指导书 V1.0》、《W806 MCU 芯片规格书…

安装配置 radicale

为什么80%的码农都做不了架构师&#xff1f;>>> 可以直接pip安装,也可以下载源码安装,如果要存储到sql里面,则需要下载源码包,用里面的schema.sql 建表 默认安装后没有相应的配置文件,源码包里面也包含了 logging 和config,放到/etc/radicale 下 安装没什么说的,下…

【联盛德W806上手笔记】九、DMA

目录DMA 控制器功能概述功能描述DMA 通道DMA 数据流DMA 循环模式DMA 传输模式DMA 外设选择DMA 链表模式DMA 中断中断请求库函数函数参数宏应用Windows 10 20H2 HLK-W806-V1.0-KIT WM_SDK_W806_v0.6.0 摘自《W806 MCU 芯片规格书 V2.0》、《WM_W800_寄存器手册 V2.1》 DMA 控制…

SNF快速开发平台MVC-自由排序组件

1. 自由排序功能使用 在一些需要排序优先级的数据进行调整处理&#xff0c;如民族数据&#xff0c;在北方实施的时候汉族比较多&#xff0c;希望把汉族放在第一位。在蒙古实施项目时&#xff0c;蒙古族人最多把蒙古族放在第一选择位。 1.1. 效果展示 图 1.1 1.2. …

【联盛德W806上手笔记】十、ADC

目录ADCADC 电路设计库函数函数参数宏Demo中的例程main.cwm_hal_msp.cwm_it.cWindows 10 20H2 HLK-W806-V1.0-KIT WM_SDK_W806_v0.6.0 摘自《W806 芯片设计指导书 V1.0》、《W806 MCU 芯片规格书 V2.0》 ADC 基于 Sigma-Delta ADC 的采集模块&#xff0c;集成 4 路 16 比特 AD…

【电路补习笔记】8、稳压电路 —— 线性电源及LDO

目录有名的电源芯片品牌DCDC电源分类开关电源vs线性稳压器线性电源参数线性电源工作原理集成稳压器78/79系列&#xff08;固定输出电压&#xff09;正、负对称输出两组电源的稳压电路扩展输出电压扩大输出电流LM317/LM337&#xff08;可调输出电压&#xff09;正、负对称输出两…

ajax代码整理

$.ajax({ type: "post", 【以POST或GET的方式请求。默认GET。PUT和DELETE也可以用&#xff0c;有的浏览器不支持】 url: url, 【请求的目的地址&#xff0c;须是一个字符串。】 contentType: "application/json", 【以哪种数据类型发送请求】 data: data, …

创建一个简单的WCF程序

为了使读者对基于WCF的编程模型有一个直观的映像&#xff0c;我将带领读者一步一步地创建一个完整的WCF应用。本应用功能虽然简单&#xff0c;但它涵盖了一个完整WCF应用的基本结构。对那些对WCF不是很了解的读者来说&#xff0c;这个例子将带领你正式进入WCF的世界。 在这个例…

深圳IO —— 一个汇编编程小游戏

目录简介数据手册接口简单 I/OXBus简单 I/O 对比 XBus语言参考程序结构注释标签寄存器accdatp0、p1、x0、x1、x2、x3null 伪寄存器指令操作数确保进行足够的睡眠 (slp)&#xff01;基本指令算法指令条件指令隐藏指令游戏界面DIY版本&#xff1a; 简介 以下介绍摘自未来软件园 …

unity shader 编辑器扩展类 ShaderGUI

这应该unity5才出的新功能了&#xff0c;今天看文档时刚巧看到了&#xff0c;就来尝试了一下。 效果如图&#xff1a; shader 的编辑器扩展分为2种方法&#xff1a; 是通过UnityEditor下的ShaderGUI类来实现的&#xff0c;形式比较近似于我们一般对unity编辑器的扩展方式。是通…

【电路补习笔记】9、电容式开关电源(电荷泵)

目录分类原理电荷泵基础开关电容稳压器的细调功能电荷泵的电压增益调节输出电容&#xff08;Co&#xff09;优点电容式开关稳压器减小纹波相关应用老师的主页&#xff1a;唐老师讲电赛 视频地址&#xff1a; 电源大师3——电容式开关电源&#xff08;电荷泵&#xff09;工作原理…

CPU 硬盘性能到底相差多少

本文以一个现代的、实际的个人电脑为对象&#xff0c;分析其中CPU&#xff08;Intel Core 2 Duo 3.0GHz&#xff09;以及各类子系统的运行速度——延迟和数据吞吐量。通过粗略的估算PC各个组件的相对运行速度&#xff0c;希望能给大家留下一个比较直观的印象。本文中的数据来自…