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

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
  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: w806是一款(Lichee)公司生产的开发板,支持Micropython编程语言。Micropython是一种基于Python的嵌入式系统开发语言,可以在微控制器上运行Python程序。使用Micropython可以方便地开发嵌入式系统,实现各种功能。的w806开发板支持多种外设,如WIFI、蓝牙、摄像头等,可以满足各种应用需求。 ### 回答2: W806是(LELSD)出品的一款基于MicroPython的开发板,它拥有低功耗、高效、易用等特点,适用于物网、AR/VR、智能家居等领域的开发使用。W806的芯片采用的是飞思卡尔(Freescale)的Kinetis K66F,它的主频高达180MHz,拥有256KB的RAM和1MB的Flash,支持LwIP、SSL/TLS等多种协议。W806还配备了丰富的接口,例如可以通过WIFI、蓝牙、Zigbee等多种协议进行连接,还拥有USB和JTAG等调试接口,为开发人员提供了更加便捷的开发环境。 除了硬件控制,w806还支持各种高级语言编程,其中就包括了Micropython,这是一种非常便捷的语言,它已经成为了物网领域的一种核心语言。利用Micropython可以直接在W806上进行代码编写和调试,并且可以利用其强大的历史数据存储和展示能力来进行数据分析和处理。通过Micropython,w806 可以接收和发送数据,进行大量的实时数据分析和控制,大大提高了物网应用的可靠性和效率。 总之,W806Micropython这个组合非常适合开发物系统和智能家居等智能设备,它让开发人员可以通过Micropython的编程语言进行开发,支持多种协议,拥有丰富的硬件控制接口,可以快速地进行产品原型测试,最终实现智能化的物网设备。 ### 回答3: W806是一款支持MicroPython编程语言的智能小车。它的流线型设计和高性能的电机使得它在运动中非常稳定,能够在各种复杂地形下行走。 W806的核心是一块STM32F407VET6单片机,它拥有240MHz的主频以及512KB的Flash存储和192KB的SRAM。这使得W806能够流畅地运行MicroPython脚本,同时还可以轻松处理传感器数据和控制命令。此外,W806还配备了多个传感器模块,包括超声波模块、红外线循迹模块和心率传感器模块等,可以满足不同的应用需求。 的W806还支持WiFi和蓝牙通信,可以通过手机APP或者PC控制,并支持远程控制和远程更新程序。这也让W806在科研、教育、开发等领域得到广泛的应用。 总之,W806是一款功能丰富、扩展性高的智能小车,既适用于初学者快速上手,也适用于高级开发人员进行二次开发。作为一款支持MicroPython编程语言的智能小车,W806将成为未来机器人领域的重要一员,为智能生活和人工智能的发展做出重要贡献。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

乙酸氧铍

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值