Browse Source

first commit

dropLin 3 weeks ago
commit
ee0915ee52
100 changed files with 33191 additions and 0 deletions
  1. 10 0
      .gitignore
  2. 69 0
      BSP/common(1).c
  3. 41 0
      BSP/common(1).h
  4. 69 0
      BSP/common(2).c
  5. 41 0
      BSP/common(2).h
  6. 69 0
      BSP/common(3).c
  7. 41 0
      BSP/common(3).h
  8. 69 0
      BSP/common.c
  9. 41 0
      BSP/common.h
  10. 99 0
      CIU32F003_LIB/Include/ciu32f003_std(1).h
  11. 99 0
      CIU32F003_LIB/Include/ciu32f003_std(2).h
  12. 99 0
      CIU32F003_LIB/Include/ciu32f003_std(3).h
  13. 99 0
      CIU32F003_LIB/Include/ciu32f003_std.h
  14. 592 0
      CIU32F003_LIB/Include/ciu32f003_std_adc(1).h
  15. 592 0
      CIU32F003_LIB/Include/ciu32f003_std_adc(2).h
  16. 592 0
      CIU32F003_LIB/Include/ciu32f003_std_adc(3).h
  17. 592 0
      CIU32F003_LIB/Include/ciu32f003_std_adc.h
  18. 135 0
      CIU32F003_LIB/Include/ciu32f003_std_common(1).h
  19. 135 0
      CIU32F003_LIB/Include/ciu32f003_std_common(2).h
  20. 135 0
      CIU32F003_LIB/Include/ciu32f003_std_common(3).h
  21. 135 0
      CIU32F003_LIB/Include/ciu32f003_std_common.h
  22. 407 0
      CIU32F003_LIB/Include/ciu32f003_std_comp(1).h
  23. 407 0
      CIU32F003_LIB/Include/ciu32f003_std_comp(2).h
  24. 407 0
      CIU32F003_LIB/Include/ciu32f003_std_comp(3).h
  25. 407 0
      CIU32F003_LIB/Include/ciu32f003_std_comp.h
  26. 129 0
      CIU32F003_LIB/Include/ciu32f003_std_config(1).h
  27. 129 0
      CIU32F003_LIB/Include/ciu32f003_std_config(2).h
  28. 129 0
      CIU32F003_LIB/Include/ciu32f003_std_config(3).h
  29. 129 0
      CIU32F003_LIB/Include/ciu32f003_std_config.h
  30. 134 0
      CIU32F003_LIB/Include/ciu32f003_std_crc(1).h
  31. 134 0
      CIU32F003_LIB/Include/ciu32f003_std_crc(2).h
  32. 134 0
      CIU32F003_LIB/Include/ciu32f003_std_crc(3).h
  33. 134 0
      CIU32F003_LIB/Include/ciu32f003_std_crc.h
  34. 151 0
      CIU32F003_LIB/Include/ciu32f003_std_dbg(1).h
  35. 151 0
      CIU32F003_LIB/Include/ciu32f003_std_dbg(2).h
  36. 151 0
      CIU32F003_LIB/Include/ciu32f003_std_dbg(3).h
  37. 151 0
      CIU32F003_LIB/Include/ciu32f003_std_dbg.h
  38. 372 0
      CIU32F003_LIB/Include/ciu32f003_std_exti(1).h
  39. 372 0
      CIU32F003_LIB/Include/ciu32f003_std_exti(2).h
  40. 372 0
      CIU32F003_LIB/Include/ciu32f003_std_exti(3).h
  41. 372 0
      CIU32F003_LIB/Include/ciu32f003_std_exti.h
  42. 454 0
      CIU32F003_LIB/Include/ciu32f003_std_flash(1).h
  43. 454 0
      CIU32F003_LIB/Include/ciu32f003_std_flash(2).h
  44. 454 0
      CIU32F003_LIB/Include/ciu32f003_std_flash(3).h
  45. 454 0
      CIU32F003_LIB/Include/ciu32f003_std_flash.h
  46. 537 0
      CIU32F003_LIB/Include/ciu32f003_std_gpio(1).h
  47. 537 0
      CIU32F003_LIB/Include/ciu32f003_std_gpio(2).h
  48. 537 0
      CIU32F003_LIB/Include/ciu32f003_std_gpio(3).h
  49. 537 0
      CIU32F003_LIB/Include/ciu32f003_std_gpio.h
  50. 342 0
      CIU32F003_LIB/Include/ciu32f003_std_i2c(1).h
  51. 342 0
      CIU32F003_LIB/Include/ciu32f003_std_i2c(2).h
  52. 342 0
      CIU32F003_LIB/Include/ciu32f003_std_i2c(3).h
  53. 342 0
      CIU32F003_LIB/Include/ciu32f003_std_i2c.h
  54. 140 0
      CIU32F003_LIB/Include/ciu32f003_std_irtim(1).h
  55. 140 0
      CIU32F003_LIB/Include/ciu32f003_std_irtim(2).h
  56. 140 0
      CIU32F003_LIB/Include/ciu32f003_std_irtim(3).h
  57. 140 0
      CIU32F003_LIB/Include/ciu32f003_std_irtim.h
  58. 180 0
      CIU32F003_LIB/Include/ciu32f003_std_iwdg(1).h
  59. 180 0
      CIU32F003_LIB/Include/ciu32f003_std_iwdg(2).h
  60. 180 0
      CIU32F003_LIB/Include/ciu32f003_std_iwdg(3).h
  61. 180 0
      CIU32F003_LIB/Include/ciu32f003_std_iwdg.h
  62. 301 0
      CIU32F003_LIB/Include/ciu32f003_std_lptim(1).h
  63. 301 0
      CIU32F003_LIB/Include/ciu32f003_std_lptim(2).h
  64. 301 0
      CIU32F003_LIB/Include/ciu32f003_std_lptim(3).h
  65. 301 0
      CIU32F003_LIB/Include/ciu32f003_std_lptim.h
  66. 110 0
      CIU32F003_LIB/Include/ciu32f003_std_pmu(1).h
  67. 110 0
      CIU32F003_LIB/Include/ciu32f003_std_pmu(2).h
  68. 110 0
      CIU32F003_LIB/Include/ciu32f003_std_pmu(3).h
  69. 110 0
      CIU32F003_LIB/Include/ciu32f003_std_pmu.h
  70. 822 0
      CIU32F003_LIB/Include/ciu32f003_std_rcc(1).h
  71. 822 0
      CIU32F003_LIB/Include/ciu32f003_std_rcc(2).h
  72. 822 0
      CIU32F003_LIB/Include/ciu32f003_std_rcc(3).h
  73. 822 0
      CIU32F003_LIB/Include/ciu32f003_std_rcc.h
  74. 442 0
      CIU32F003_LIB/Include/ciu32f003_std_spi(1).h
  75. 442 0
      CIU32F003_LIB/Include/ciu32f003_std_spi(2).h
  76. 442 0
      CIU32F003_LIB/Include/ciu32f003_std_spi(3).h
  77. 442 0
      CIU32F003_LIB/Include/ciu32f003_std_spi.h
  78. 1822 0
      CIU32F003_LIB/Include/ciu32f003_std_tim(1).h
  79. 1822 0
      CIU32F003_LIB/Include/ciu32f003_std_tim(2).h
  80. 1822 0
      CIU32F003_LIB/Include/ciu32f003_std_tim(3).h
  81. 1822 0
      CIU32F003_LIB/Include/ciu32f003_std_tim.h
  82. 664 0
      CIU32F003_LIB/Include/ciu32f003_std_uart(1).h
  83. 664 0
      CIU32F003_LIB/Include/ciu32f003_std_uart(2).h
  84. 664 0
      CIU32F003_LIB/Include/ciu32f003_std_uart(3).h
  85. 664 0
      CIU32F003_LIB/Include/ciu32f003_std_uart.h
  86. 140 0
      CIU32F003_LIB/Source/ciu32f003_std(1).c
  87. 140 0
      CIU32F003_LIB/Source/ciu32f003_std(2).c
  88. 140 0
      CIU32F003_LIB/Source/ciu32f003_std(3).c
  89. 140 0
      CIU32F003_LIB/Source/ciu32f003_std.c
  90. 69 0
      CIU32F003_LIB/Source/ciu32f003_std_adc(1).c
  91. 69 0
      CIU32F003_LIB/Source/ciu32f003_std_adc(2).c
  92. 69 0
      CIU32F003_LIB/Source/ciu32f003_std_adc(3).c
  93. 69 0
      CIU32F003_LIB/Source/ciu32f003_std_adc.c
  94. 72 0
      CIU32F003_LIB/Source/ciu32f003_std_comp(1).c
  95. 72 0
      CIU32F003_LIB/Source/ciu32f003_std_comp(2).c
  96. 72 0
      CIU32F003_LIB/Source/ciu32f003_std_comp(3).c
  97. 72 0
      CIU32F003_LIB/Source/ciu32f003_std_comp.c
  98. 95 0
      CIU32F003_LIB/Source/ciu32f003_std_crc(1).c
  99. 95 0
      CIU32F003_LIB/Source/ciu32f003_std_crc(2).c
  100. 95 0
      CIU32F003_LIB/Source/ciu32f003_std_crc(3).c

+ 10 - 0
.gitignore

@@ -0,0 +1,10 @@
+.vscode
+*.html
+gitPushRemote.bat
+gitInit.bat
+# 忽略my_folder文件夹下的所有文件和文件夹  
+keil_v5/*  
+  
+# 但不忽略keil_v5文件夹下的.uvprojx和.uvproj文件  
+!keil_v5/*.uvprojx  
+!keil_v5/*.uvoptx

+ 69 - 0
BSP/common(1).c

@@ -0,0 +1,69 @@
+/************************************************************************************************/
+/**
+* @file               common.c
+* @author             MCU Ecosystem Development Team
+* @brief              通用函数或本外设相关的配置实现函数。
+*
+*
+**************************************************************************************************
+* @attention
+* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
+*
+**************************************************************************************************
+*/
+
+/*------------------------------------------includes--------------------------------------------*/
+#include "common.h"
+
+/*------------------------------------------functions-------------------------------------------*/
+/**
+* @brief  系统时钟配置
+* @retval 无
+*/
+void system_clock_config(void)
+{
+    /* 设置Flash读访问等待时间 */
+    std_flash_set_latency(FLASH_LATENCY_1CLK);
+
+    /* 使能RCH */
+    std_rcc_rch_enable();
+    while(std_rcc_get_rch_ready() != RCC_CSR1_RCHRDY);
+  
+    /* 设置系统时钟源为RCH */
+    std_rcc_set_sysclk_source(RCC_SYSCLK_SRC_RCH);
+    while(std_rcc_get_sysclk_source() != RCC_SYSCLK_SRC_STATUS_RCH);
+
+    /* 设置AHB分频因子 */
+    std_rcc_set_ahbdiv(RCC_HCLK_DIV1);
+    /* 设置APB分频因子 */
+    std_rcc_set_apbdiv(RCC_PCLK_DIV1);
+    /* 配置系统时钟全局变量 */
+    SystemCoreClock = RCH_VALUE;
+}
+
+/**
+* @brief  GPIO初始化
+* @retval 无
+*/
+void gpio_init(void)
+{
+    std_gpio_init_t gpio_config = {0};
+
+    /* 使能LED对应的GPIO时钟 */
+    std_rcc_gpio_clk_enable(RCC_PERIPH_CLK_GPIOB);
+		std_rcc_gpio_clk_enable(RCC_PERIPH_CLK_GPIOA);
+
+    /* 配置LED的IO */
+    gpio_config.pin = LED_PIN;
+    gpio_config.mode = GPIO_MODE_OUTPUT;
+    gpio_config.pull = GPIO_NOPULL;
+    gpio_config.output_type = GPIO_OUTPUT_PUSHPULL;
+		std_gpio_init(GPIOA, &gpio_config);
+    std_gpio_set_pin(LED_GPIO_PORT,LED_PIN);
+		
+		gpio_config.pin = GPIO_PIN_6;              //PA2
+		gpio_config.mode = GPIO_MODE_INPUT;
+    gpio_config.pull = GPIO_PULLDOWN;
+    std_gpio_init(GPIOB, &gpio_config);
+		
+}

+ 41 - 0
BSP/common(1).h

@@ -0,0 +1,41 @@
+/************************************************************************************************/
+/**
+* @file               common.h
+* @author             MCU Ecosystem Development Team
+* @brief              COMMON头文件。
+*                           
+*
+**************************************************************************************************
+* @attention
+* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
+*
+**************************************************************************************************
+*/
+
+/* 避免头文件重复引用 */
+#ifndef COMMON_H
+#define COMMON_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*------------------------------------------includes--------------------------------------------*/
+#include "ciu32f003_std.h"
+
+/*-------------------------------------------define---------------------------------------------*/
+/* LED IO相关定义 */
+#define LED_GPIO_PORT            GPIOA
+#define LED_PIN                  GPIO_PIN_5
+
+
+/*-------------------------------------------functions------------------------------------------*/
+void system_clock_config(void);
+void gpio_init(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* COMMON_H */
+

+ 69 - 0
BSP/common(2).c

@@ -0,0 +1,69 @@
+/************************************************************************************************/
+/**
+* @file               common.c
+* @author             MCU Ecosystem Development Team
+* @brief              通用函数或本外设相关的配置实现函数。
+*
+*
+**************************************************************************************************
+* @attention
+* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
+*
+**************************************************************************************************
+*/
+
+/*------------------------------------------includes--------------------------------------------*/
+#include "common.h"
+
+/*------------------------------------------functions-------------------------------------------*/
+/**
+* @brief  系统时钟配置
+* @retval 无
+*/
+void system_clock_config(void)
+{
+    /* 设置Flash读访问等待时间 */
+    std_flash_set_latency(FLASH_LATENCY_1CLK);
+
+    /* 使能RCH */
+    std_rcc_rch_enable();
+    while(std_rcc_get_rch_ready() != RCC_CSR1_RCHRDY);
+  
+    /* 设置系统时钟源为RCH */
+    std_rcc_set_sysclk_source(RCC_SYSCLK_SRC_RCH);
+    while(std_rcc_get_sysclk_source() != RCC_SYSCLK_SRC_STATUS_RCH);
+
+    /* 设置AHB分频因子 */
+    std_rcc_set_ahbdiv(RCC_HCLK_DIV1);
+    /* 设置APB分频因子 */
+    std_rcc_set_apbdiv(RCC_PCLK_DIV1);
+    /* 配置系统时钟全局变量 */
+    SystemCoreClock = RCH_VALUE;
+}
+
+/**
+* @brief  GPIO初始化
+* @retval 无
+*/
+void gpio_init(void)
+{
+    std_gpio_init_t gpio_config = {0};
+
+    /* 使能LED对应的GPIO时钟 */
+    std_rcc_gpio_clk_enable(RCC_PERIPH_CLK_GPIOB);
+		std_rcc_gpio_clk_enable(RCC_PERIPH_CLK_GPIOA);
+
+    /* 配置LED的IO */
+    gpio_config.pin = LED_PIN;
+    gpio_config.mode = GPIO_MODE_OUTPUT;
+    gpio_config.pull = GPIO_NOPULL;
+    gpio_config.output_type = GPIO_OUTPUT_PUSHPULL;
+		std_gpio_init(GPIOA, &gpio_config);
+    std_gpio_set_pin(LED_GPIO_PORT,LED_PIN);
+		
+		gpio_config.pin = GPIO_PIN_6;              //PA2
+		gpio_config.mode = GPIO_MODE_INPUT;
+    gpio_config.pull = GPIO_PULLDOWN;
+    std_gpio_init(GPIOB, &gpio_config);
+		
+}

+ 41 - 0
BSP/common(2).h

@@ -0,0 +1,41 @@
+/************************************************************************************************/
+/**
+* @file               common.h
+* @author             MCU Ecosystem Development Team
+* @brief              COMMON头文件。
+*                           
+*
+**************************************************************************************************
+* @attention
+* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
+*
+**************************************************************************************************
+*/
+
+/* 避免头文件重复引用 */
+#ifndef COMMON_H
+#define COMMON_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*------------------------------------------includes--------------------------------------------*/
+#include "ciu32f003_std.h"
+
+/*-------------------------------------------define---------------------------------------------*/
+/* LED IO相关定义 */
+#define LED_GPIO_PORT            GPIOA
+#define LED_PIN                  GPIO_PIN_5
+
+
+/*-------------------------------------------functions------------------------------------------*/
+void system_clock_config(void);
+void gpio_init(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* COMMON_H */
+

+ 69 - 0
BSP/common(3).c

@@ -0,0 +1,69 @@
+/************************************************************************************************/
+/**
+* @file               common.c
+* @author             MCU Ecosystem Development Team
+* @brief              通用函数或本外设相关的配置实现函数。
+*
+*
+**************************************************************************************************
+* @attention
+* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
+*
+**************************************************************************************************
+*/
+
+/*------------------------------------------includes--------------------------------------------*/
+#include "common.h"
+
+/*------------------------------------------functions-------------------------------------------*/
+/**
+* @brief  系统时钟配置
+* @retval 无
+*/
+void system_clock_config(void)
+{
+    /* 设置Flash读访问等待时间 */
+    std_flash_set_latency(FLASH_LATENCY_1CLK);
+
+    /* 使能RCH */
+    std_rcc_rch_enable();
+    while(std_rcc_get_rch_ready() != RCC_CSR1_RCHRDY);
+  
+    /* 设置系统时钟源为RCH */
+    std_rcc_set_sysclk_source(RCC_SYSCLK_SRC_RCH);
+    while(std_rcc_get_sysclk_source() != RCC_SYSCLK_SRC_STATUS_RCH);
+
+    /* 设置AHB分频因子 */
+    std_rcc_set_ahbdiv(RCC_HCLK_DIV1);
+    /* 设置APB分频因子 */
+    std_rcc_set_apbdiv(RCC_PCLK_DIV1);
+    /* 配置系统时钟全局变量 */
+    SystemCoreClock = RCH_VALUE;
+}
+
+/**
+* @brief  GPIO初始化
+* @retval 无
+*/
+void gpio_init(void)
+{
+    std_gpio_init_t gpio_config = {0};
+
+    /* 使能LED对应的GPIO时钟 */
+    std_rcc_gpio_clk_enable(RCC_PERIPH_CLK_GPIOB);
+		std_rcc_gpio_clk_enable(RCC_PERIPH_CLK_GPIOA);
+
+    /* 配置LED的IO */
+    gpio_config.pin = LED_PIN;
+    gpio_config.mode = GPIO_MODE_OUTPUT;
+    gpio_config.pull = GPIO_NOPULL;
+    gpio_config.output_type = GPIO_OUTPUT_PUSHPULL;
+		std_gpio_init(GPIOA, &gpio_config);
+    std_gpio_set_pin(LED_GPIO_PORT,LED_PIN);
+		
+		gpio_config.pin = GPIO_PIN_6;              //PA2
+		gpio_config.mode = GPIO_MODE_INPUT;
+    gpio_config.pull = GPIO_PULLDOWN;
+    std_gpio_init(GPIOB, &gpio_config);
+		
+}

+ 41 - 0
BSP/common(3).h

@@ -0,0 +1,41 @@
+/************************************************************************************************/
+/**
+* @file               common.h
+* @author             MCU Ecosystem Development Team
+* @brief              COMMON头文件。
+*                           
+*
+**************************************************************************************************
+* @attention
+* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
+*
+**************************************************************************************************
+*/
+
+/* 避免头文件重复引用 */
+#ifndef COMMON_H
+#define COMMON_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*------------------------------------------includes--------------------------------------------*/
+#include "ciu32f003_std.h"
+
+/*-------------------------------------------define---------------------------------------------*/
+/* LED IO相关定义 */
+#define LED_GPIO_PORT            GPIOA
+#define LED_PIN                  GPIO_PIN_5
+
+
+/*-------------------------------------------functions------------------------------------------*/
+void system_clock_config(void);
+void gpio_init(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* COMMON_H */
+

+ 69 - 0
BSP/common.c

@@ -0,0 +1,69 @@
+/************************************************************************************************/
+/**
+* @file               common.c
+* @author             MCU Ecosystem Development Team
+* @brief              通用函数或本外设相关的配置实现函数。
+*
+*
+**************************************************************************************************
+* @attention
+* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
+*
+**************************************************************************************************
+*/
+
+/*------------------------------------------includes--------------------------------------------*/
+#include "common.h"
+
+/*------------------------------------------functions-------------------------------------------*/
+/**
+* @brief  系统时钟配置
+* @retval 无
+*/
+void system_clock_config(void)
+{
+    /* 设置Flash读访问等待时间 */
+    std_flash_set_latency(FLASH_LATENCY_1CLK);
+
+    /* 使能RCH */
+    std_rcc_rch_enable();
+    while(std_rcc_get_rch_ready() != RCC_CSR1_RCHRDY);
+  
+    /* 设置系统时钟源为RCH */
+    std_rcc_set_sysclk_source(RCC_SYSCLK_SRC_RCH);
+    while(std_rcc_get_sysclk_source() != RCC_SYSCLK_SRC_STATUS_RCH);
+
+    /* 设置AHB分频因子 */
+    std_rcc_set_ahbdiv(RCC_HCLK_DIV1);
+    /* 设置APB分频因子 */
+    std_rcc_set_apbdiv(RCC_PCLK_DIV1);
+    /* 配置系统时钟全局变量 */
+    SystemCoreClock = RCH_VALUE;
+}
+
+/**
+* @brief  GPIO初始化
+* @retval 无
+*/
+void gpio_init(void)
+{
+    std_gpio_init_t gpio_config = {0};
+
+    /* 使能LED对应的GPIO时钟 */
+    std_rcc_gpio_clk_enable(RCC_PERIPH_CLK_GPIOB);
+		std_rcc_gpio_clk_enable(RCC_PERIPH_CLK_GPIOA);
+
+    /* 配置LED的IO */
+    gpio_config.pin = LED_PIN;
+    gpio_config.mode = GPIO_MODE_OUTPUT;
+    gpio_config.pull = GPIO_NOPULL;
+    gpio_config.output_type = GPIO_OUTPUT_PUSHPULL;
+		std_gpio_init(GPIOA, &gpio_config);
+    std_gpio_set_pin(LED_GPIO_PORT,LED_PIN);
+		
+		gpio_config.pin = GPIO_PIN_6;              //PA2
+		gpio_config.mode = GPIO_MODE_INPUT;
+    gpio_config.pull = GPIO_PULLDOWN;
+    std_gpio_init(GPIOB, &gpio_config);
+		
+}

+ 41 - 0
BSP/common.h

@@ -0,0 +1,41 @@
+/************************************************************************************************/
+/**
+* @file               common.h
+* @author             MCU Ecosystem Development Team
+* @brief              COMMON头文件。
+*                           
+*
+**************************************************************************************************
+* @attention
+* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
+*
+**************************************************************************************************
+*/
+
+/* 避免头文件重复引用 */
+#ifndef COMMON_H
+#define COMMON_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*------------------------------------------includes--------------------------------------------*/
+#include "ciu32f003_std.h"
+
+/*-------------------------------------------define---------------------------------------------*/
+/* LED IO相关定义 */
+#define LED_GPIO_PORT            GPIOA
+#define LED_PIN                  GPIO_PIN_5
+
+
+/*-------------------------------------------functions------------------------------------------*/
+void system_clock_config(void);
+void gpio_init(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* COMMON_H */
+

+ 99 - 0
CIU32F003_LIB/Include/ciu32f003_std(1).h

@@ -0,0 +1,99 @@
+/************************************************************************************************/
+/**
+* @file               ciu32f003_std.h
+* @author             MCU Ecosystem Development Team
+* @brief              CIU32F003 STD库对外一级头文件。                           
+*                     用户使用STD库时,可以仅引用该头文件即可。
+*
+*
+**************************************************************************************************
+* @attention
+* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
+*
+**************************************************************************************************
+*/
+
+/*避免头文件重复引用*/
+#ifndef CIU32F003_STD_H
+#define CIU32F003_STD_H   
+
+
+/************************************************************************************************/
+/**
+* @addtogroup CIU32F003_STD_Driver
+* @{
+*/
+
+/**
+* @defgroup STD STD
+* @brief 支持STD库的计时等功能以及STD库对外的统一头文件
+* @{
+*
+*/
+/************************************************************************************************/  
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*------------------------------------------includes--------------------------------------------*/
+#include "ciu32f003_std_config.h"
+
+/*--------------------------------------------define--------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @defgroup STD_Constants STD Constants
+* @brief STD库基础功能的常量定义以及宏定义
+* @{
+*
+*/
+/************************************************************************************************/   
+
+/* STD库的计时有关配置 */
+#define STD_DELAY_US                     (SystemCoreClock/1000000)                      /**< STD中用于计时的基础值,与计时周期有关 */ 
+
+
+/** 
+* @} 
+*/
+/*-------------------------------------------functions------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @defgroup STD_External_Functions STD External Functions
+* @brief    STD库基础功能对外API
+* @{
+*
+*/
+/************************************************************************************************/ 
+/* STD库计时有关函数 */
+void std_delay_init(void);
+void std_delayus(uint32_t count);
+void std_delayms(uint32_t count);
+void std_delayus_start(uint32_t count);
+void std_delayms_start(uint32_t count);
+bool std_delay_end(void);
+
+
+/** 
+* @} 
+*/
+
+
+#ifdef __cplusplus
+}
+#endif
+
+/**
+* @} 
+*/  
+
+/**
+* @}
+*/
+
+
+#endif /* CIU32F003_STD_H */
+
+

+ 99 - 0
CIU32F003_LIB/Include/ciu32f003_std(2).h

@@ -0,0 +1,99 @@
+/************************************************************************************************/
+/**
+* @file               ciu32f003_std.h
+* @author             MCU Ecosystem Development Team
+* @brief              CIU32F003 STD库对外一级头文件。                           
+*                     用户使用STD库时,可以仅引用该头文件即可。
+*
+*
+**************************************************************************************************
+* @attention
+* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
+*
+**************************************************************************************************
+*/
+
+/*避免头文件重复引用*/
+#ifndef CIU32F003_STD_H
+#define CIU32F003_STD_H   
+
+
+/************************************************************************************************/
+/**
+* @addtogroup CIU32F003_STD_Driver
+* @{
+*/
+
+/**
+* @defgroup STD STD
+* @brief 支持STD库的计时等功能以及STD库对外的统一头文件
+* @{
+*
+*/
+/************************************************************************************************/  
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*------------------------------------------includes--------------------------------------------*/
+#include "ciu32f003_std_config.h"
+
+/*--------------------------------------------define--------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @defgroup STD_Constants STD Constants
+* @brief STD库基础功能的常量定义以及宏定义
+* @{
+*
+*/
+/************************************************************************************************/   
+
+/* STD库的计时有关配置 */
+#define STD_DELAY_US                     (SystemCoreClock/1000000)                      /**< STD中用于计时的基础值,与计时周期有关 */ 
+
+
+/** 
+* @} 
+*/
+/*-------------------------------------------functions------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @defgroup STD_External_Functions STD External Functions
+* @brief    STD库基础功能对外API
+* @{
+*
+*/
+/************************************************************************************************/ 
+/* STD库计时有关函数 */
+void std_delay_init(void);
+void std_delayus(uint32_t count);
+void std_delayms(uint32_t count);
+void std_delayus_start(uint32_t count);
+void std_delayms_start(uint32_t count);
+bool std_delay_end(void);
+
+
+/** 
+* @} 
+*/
+
+
+#ifdef __cplusplus
+}
+#endif
+
+/**
+* @} 
+*/  
+
+/**
+* @}
+*/
+
+
+#endif /* CIU32F003_STD_H */
+
+

+ 99 - 0
CIU32F003_LIB/Include/ciu32f003_std(3).h

@@ -0,0 +1,99 @@
+/************************************************************************************************/
+/**
+* @file               ciu32f003_std.h
+* @author             MCU Ecosystem Development Team
+* @brief              CIU32F003 STD库对外一级头文件。                           
+*                     用户使用STD库时,可以仅引用该头文件即可。
+*
+*
+**************************************************************************************************
+* @attention
+* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
+*
+**************************************************************************************************
+*/
+
+/*避免头文件重复引用*/
+#ifndef CIU32F003_STD_H
+#define CIU32F003_STD_H   
+
+
+/************************************************************************************************/
+/**
+* @addtogroup CIU32F003_STD_Driver
+* @{
+*/
+
+/**
+* @defgroup STD STD
+* @brief 支持STD库的计时等功能以及STD库对外的统一头文件
+* @{
+*
+*/
+/************************************************************************************************/  
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*------------------------------------------includes--------------------------------------------*/
+#include "ciu32f003_std_config.h"
+
+/*--------------------------------------------define--------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @defgroup STD_Constants STD Constants
+* @brief STD库基础功能的常量定义以及宏定义
+* @{
+*
+*/
+/************************************************************************************************/   
+
+/* STD库的计时有关配置 */
+#define STD_DELAY_US                     (SystemCoreClock/1000000)                      /**< STD中用于计时的基础值,与计时周期有关 */ 
+
+
+/** 
+* @} 
+*/
+/*-------------------------------------------functions------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @defgroup STD_External_Functions STD External Functions
+* @brief    STD库基础功能对外API
+* @{
+*
+*/
+/************************************************************************************************/ 
+/* STD库计时有关函数 */
+void std_delay_init(void);
+void std_delayus(uint32_t count);
+void std_delayms(uint32_t count);
+void std_delayus_start(uint32_t count);
+void std_delayms_start(uint32_t count);
+bool std_delay_end(void);
+
+
+/** 
+* @} 
+*/
+
+
+#ifdef __cplusplus
+}
+#endif
+
+/**
+* @} 
+*/  
+
+/**
+* @}
+*/
+
+
+#endif /* CIU32F003_STD_H */
+
+

+ 99 - 0
CIU32F003_LIB/Include/ciu32f003_std.h

@@ -0,0 +1,99 @@
+/************************************************************************************************/
+/**
+* @file               ciu32f003_std.h
+* @author             MCU Ecosystem Development Team
+* @brief              CIU32F003 STD库对外一级头文件。                           
+*                     用户使用STD库时,可以仅引用该头文件即可。
+*
+*
+**************************************************************************************************
+* @attention
+* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
+*
+**************************************************************************************************
+*/
+
+/*避免头文件重复引用*/
+#ifndef CIU32F003_STD_H
+#define CIU32F003_STD_H   
+
+
+/************************************************************************************************/
+/**
+* @addtogroup CIU32F003_STD_Driver
+* @{
+*/
+
+/**
+* @defgroup STD STD
+* @brief 支持STD库的计时等功能以及STD库对外的统一头文件
+* @{
+*
+*/
+/************************************************************************************************/  
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*------------------------------------------includes--------------------------------------------*/
+#include "ciu32f003_std_config.h"
+
+/*--------------------------------------------define--------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @defgroup STD_Constants STD Constants
+* @brief STD库基础功能的常量定义以及宏定义
+* @{
+*
+*/
+/************************************************************************************************/   
+
+/* STD库的计时有关配置 */
+#define STD_DELAY_US                     (SystemCoreClock/1000000)                      /**< STD中用于计时的基础值,与计时周期有关 */ 
+
+
+/** 
+* @} 
+*/
+/*-------------------------------------------functions------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @defgroup STD_External_Functions STD External Functions
+* @brief    STD库基础功能对外API
+* @{
+*
+*/
+/************************************************************************************************/ 
+/* STD库计时有关函数 */
+void std_delay_init(void);
+void std_delayus(uint32_t count);
+void std_delayms(uint32_t count);
+void std_delayus_start(uint32_t count);
+void std_delayms_start(uint32_t count);
+bool std_delay_end(void);
+
+
+/** 
+* @} 
+*/
+
+
+#ifdef __cplusplus
+}
+#endif
+
+/**
+* @} 
+*/  
+
+/**
+* @}
+*/
+
+
+#endif /* CIU32F003_STD_H */
+
+

+ 592 - 0
CIU32F003_LIB/Include/ciu32f003_std_adc(1).h

@@ -0,0 +1,592 @@
+/************************************************************************************************/
+/**
+* @file               ciu32f003_std_adc.h
+* @author             MCU Ecosystem Development Team
+* @brief              ADC STD库驱动头文件。
+*                     提供ADC相关的STD库操作函数声明、数据类型以及常量的定义。                         
+*
+*
+**************************************************************************************************
+* @attention
+* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
+*
+**************************************************************************************************
+*/
+
+/* 避免头文件重复引用 */
+#ifndef CIU32F003_STD_ADC_H
+#define CIU32F003_STD_ADC_H
+
+/************************************************************************************************/
+/** 
+* @addtogroup CIU32F003_STD_Driver
+* @{
+*/
+
+/**
+* @defgroup ADC ADC
+* @brief 模数转换器的STD库驱动
+* @{
+*/
+/************************************************************************************************/
+
+
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/*------------------------------------------includes--------------------------------------------*/
+#include "ciu32f003_std_common.h"
+
+/*--------------------------------------------define--------------------------------------------*/
+/************************************************************************************************/
+/**
+* @defgroup ADC_Constants  ADC Constants
+* @brief    ADC常量定义及宏定义
+* @{
+*
+*/
+/************************************************************************************************/
+/* ADC_CK时钟分频系数 */
+#define ADC_CK_DIV1                          ADC_CFG2_PRESC_DIV1                            /**< ADC_CK时钟: 不分频 */
+#define ADC_CK_DIV2                          ADC_CFG2_PRESC_DIV2                            /**< ADC_CK时钟: 2分频  */
+#define ADC_CK_DIV3                          ADC_CFG2_PRESC_DIV3                            /**< ADC_CK时钟: 3分频  */
+#define ADC_CK_DIV4                          ADC_CFG2_PRESC_DIV4                            /**< ADC_CK时钟: 4分频  */
+#define ADC_CK_DIV8                          ADC_CFG2_PRESC_DIV8                            /**< ADC_CK时钟: 8分频  */
+#define ADC_CK_DIV16                         ADC_CFG2_PRESC_DIV16                           /**< ADC_CK时钟: 16分频 */
+#define ADC_CK_DIV32                         ADC_CFG2_PRESC_DIV32                           /**< ADC_CK时钟: 32分频 */
+#define ADC_CK_DIV64                         ADC_CFG2_PRESC_DIV64                           /**< ADC_CK时钟: 64分频 */
+
+/* ADC转换模式 */
+#define ADC_SINGLE_CONVER_MODE               ADC_CFG1_CONV_MOD_SINGLE                       /**< ADC单次扫描转换 */
+#define ADC_CONTINUOUS_CONVER_MODE           ADC_CFG1_CONV_MOD_CONTINUOUS                   /**< ADC循环扫描转换 */
+#define ADC_DISCONTINUOUS_CONVER_MODE        ADC_CFG1_CONV_MOD_DISCONTINUOUS                /**< ADC循环间断转换 */
+
+/* ADC通道扫描方向 */
+#define ADC_SCAN_DIR_FORWARD                 (0x00000000U)                                  /**< ADC转换通道: 正向扫描 */
+#define ADC_SCAN_DIR_BACKWARD                ADC_CFG1_SDIR                                  /**< ADC转换通道: 反向扫描 */
+
+/* ADC转换触发模式: 触发沿 */
+#define ADC_TRIG_SW                          ADC_CFG1_TRIGEN_SW                             /**< 软件触发方式                 */
+#define ADC_TRIG_HW_EDGE_RISING              ADC_CFG1_TRIGEN_HW_EDGE_RISING                 /**< 外部硬件触发使能: 上升沿触发 */
+#define ADC_TRIG_HW_EDGE_FALLING             ADC_CFG1_TRIGEN_HW_EDGE_FALLING                /**< 外部硬件触发使能: 下降沿触发 */
+#define ADC_TRIG_HW_EDGE_BOTH                ADC_CFG1_TRIGEN_HW_EDGE_BOTH                   /**< 外部硬件触发使能: 双沿触发   */
+
+/*  ADC转换触发源 */
+#define ADC_EXTRIG_TIM1_TRGO                 ADC_CFG1_TRIG_TIM1_TRGO                        /**< ADC触发源: TIM1 TRGO      */
+#define ADC_EXTRIG_TIM1_OC4_ADC              ADC_CFG1_TRIG_TIM1_OC4_ADC                     /**< ADC触发源: TIM1 OC4       */
+#define ADC_EXTRIG_TIM3_TRGO                 ADC_CFG1_TRIG_TIM3_TRGO                        /**< ADC触发源: TIM3 TRGO      */
+#define ADC_EXTRIG_EXTI7                     ADC_CFG1_TRIG_EXTI7                            /**< ADC触发源: 外部中断EXTI_7 */
+
+/* ADC转换溢出后ADC_DR寄存器数据存储方式 */
+#define ADC_OVRN_MODE_PRESERVED              (0x00000000U)                                  /**< ADC_DR寄存器保留原数据 */
+#define ADC_OVRN_MODE_OVERWRITTEN            ADC_CFG1_OVRN_MOD                              /**< ADC_DR寄存器覆盖新数据 */
+
+/* ADC采样时间参数 */
+#define ADC_SAMPTIME_3CYCLES                 ADC_SAMPT_SAMPT_3CYCLES                        /**< 采样时间为3个时钟周期    */
+#define ADC_SAMPTIME_7CYCLES                 ADC_SAMPT_SAMPT_7CYCLES                        /**< 采样时间为7个时钟周期    */
+#define ADC_SAMPTIME_12CYCLES                ADC_SAMPT_SAMPT_12CYCLES                       /**< 采样时间为12个时钟周期   */
+#define ADC_SAMPTIME_19CYCLES                ADC_SAMPT_SAMPT_19CYCLES                       /**< 采样时间为19个时钟周期   */
+#define ADC_SAMPTIME_39CYCLES                ADC_SAMPT_SAMPT_39CYCLES                       /**< 采样时间为39个时钟周期   */
+#define ADC_SAMPTIME_79CYCLES                ADC_SAMPT_SAMPT_79CYCLES                       /**< 采样时间为79个时钟周期   */
+#define ADC_SAMPTIME_119CYCLES               ADC_SAMPT_SAMPT_119CYCLES                      /**< 采样时间为119个时钟周期  */
+#define ADC_SAMPTIME_159CYCLES               ADC_SAMPT_SAMPT_159CYCLES                      /**< 采样时间为159个时钟周期  */
+#define ADC_SAMPTIME_239CYCLES               ADC_SAMPT_SAMPT_239CYCLES                      /**< 采样时间为239个时钟周期  */
+#define ADC_SAMPTIME_319CYCLES               ADC_SAMPT_SAMPT_319CYCLES                      /**< 采样时间为319个时钟周期  */
+#define ADC_SAMPTIME_479CYCLES               ADC_SAMPT_SAMPT_479CYCLES                      /**< 采样时间为479个时钟周期  */
+#define ADC_SAMPTIME_639CYCLES               ADC_SAMPT_SAMPT_639CYCLES                      /**< 采样时间为639个时钟周期  */
+#define ADC_SAMPTIME_959CYCLES               ADC_SAMPT_SAMPT_959CYCLES                      /**< 采样时间为959个时钟周期  */
+#define ADC_SAMPTIME_1279CYCLES              ADC_SAMPT_SAMPT_1279CYCLES                     /**< 采样时间为1279个时钟周期 */
+#define ADC_SAMPTIME_1919CYCLES              ADC_SAMPT_SAMPT_1919CYCLES                     /**< 采样时间为1919个时钟周期 */
+
+/* ADC转换通道 */
+#define ADC_CHANNEL_NONE                     (0x00000000U)                                  /**< ADC 转换通道清除     */ 
+#define ADC_CHANNEL_0                        ADC_CHCFG_CHN0                                 /**< ADC 转换通道IN0      */
+#define ADC_CHANNEL_1                        ADC_CHCFG_CHN1                                 /**< ADC 转换通道IN1      */
+#define ADC_CHANNEL_2                        ADC_CHCFG_CHN2                                 /**< ADC 转换通道IN2      */
+#define ADC_CHANNEL_3                        ADC_CHCFG_CHN3                                 /**< ADC 转换通道IN3      */
+#define ADC_CHANNEL_4                        ADC_CHCFG_CHN4                                 /**< ADC 转换通道IN4      */
+#define ADC_CHANNEL_5                        ADC_CHCFG_CHN5                                 /**< ADC 转换通道IN5      */
+#define ADC_CHANNEL_6                        ADC_CHCFG_CHN6                                 /**< ADC 转换通道IN6      */
+#define ADC_CHANNEL_7                        ADC_CHCFG_CHN7                                 /**< ADC 转换通道IN7      */
+#define ADC_CHANNEL_8                        ADC_CHCFG_CHN8                                 /**< ADC 转换通道IN8      */
+#define ADC_CHANNEL_VBGR                     ADC_CHCFG_CHN8                                 /**< ADC 内部转换通道VBGR */
+#define ADC_CHANNEL_ALL                      ADC_CHCFG_CHN                                  /**< ADC 全部转换通道     */ 
+
+/* ADC模拟看门狗监测通道 */
+#define ADC_AWDG_CHANNEL_NONE                (0x00000000U)                                  /**< ADC 模拟看门狗监测通道清除 */ 
+#define ADC_AWDG_CHANNEL_0                   ADC_AWDGCR_CHN0                                /**< ADC 模拟看门狗监测通道0    */ 
+#define ADC_AWDG_CHANNEL_1                   ADC_AWDGCR_CHN1                                /**< ADC 模拟看门狗监测通道1    */ 
+#define ADC_AWDG_CHANNEL_2                   ADC_AWDGCR_CHN2                                /**< ADC 模拟看门狗监测通道2    */ 
+#define ADC_AWDG_CHANNEL_3                   ADC_AWDGCR_CHN3                                /**< ADC 模拟看门狗监测通道3    */ 
+#define ADC_AWDG_CHANNEL_4                   ADC_AWDGCR_CHN4                                /**< ADC 模拟看门狗监测通道4    */ 
+#define ADC_AWDG_CHANNEL_5                   ADC_AWDGCR_CHN5                                /**< ADC 模拟看门狗监测通道5    */ 
+#define ADC_AWDG_CHANNEL_6                   ADC_AWDGCR_CHN6                                /**< ADC 模拟看门狗监测通道6    */ 
+#define ADC_AWDG_CHANNEL_7                   ADC_AWDGCR_CHN7                                /**< ADC 模拟看门狗监测通道7    */ 
+#define ADC_AWDG_CHANNEL_8                   ADC_AWDGCR_CHN8                                /**< ADC 模拟看门狗监测通道8    */ 
+#define ADC_AWDG_CHANNEL_VBGR                ADC_AWDGCR_CHN8                                /**< ADC 模拟看门狗监测通道VBGR */ 
+#define ADC_AWDG_CHANNEL_ALL                 ADC_AWDGCR_CHN                                 /**< ADC 全部转换通道           */ 
+
+/* ADC内部通道使能 */
+#define ADC_INTERNAL_CHANNEL_VBGREN          ADC_CFG2_VBGREN                                /**< ADC 内部通道VBGR使能 */ 
+
+/* ADC中断源定义:IER中断寄存器 */
+#define ADC_INTERRUPT_EOSAMP                 ADC_IER_EOSAMPIE                               /**< ADC采样结束中断           */
+#define ADC_INTERRUPT_EOC                    ADC_IER_EOCIE                                  /**< ADC单通道转换完成中断     */
+#define ADC_INTERRUPT_EOS                    ADC_IER_EOSIE                                  /**< ADC通道序列转换完成中断   */
+#define ADC_INTERRUPT_OVRN                   ADC_IER_OVRNIE                                 /**< ADC数据溢出中断           */
+#define ADC_INTERRUPT_AWDG                   ADC_IER_AWDGIE                                 /**< ADC模拟看门狗电压监控中断 */
+#define ADC_INTERRUPT_EOCAL                  ADC_IER_EOCALIE                                /**< ADC校准结束中断           */
+
+/* ADC状态定义:ISR状态寄存器 */
+#define ADC_FLAG_EOSAMP                      ADC_ISR_EOSAMP                                 /**< ADC采样结束状态           */
+#define ADC_FLAG_EOC                         ADC_ISR_EOC                                    /**< ADC单通道转换完成状态     */
+#define ADC_FLAG_EOS                         ADC_ISR_EOS                                    /**< ADC通道序列转换完成状态   */
+#define ADC_FLAG_OVRN                        ADC_ISR_OVRN                                   /**< ADC数据溢出状态           */
+#define ADC_FLAG_AWDG                        ADC_ISR_AWDG                                   /**< ADC模拟看门狗监控电压状态 */
+#define ADC_FLAG_EOCAL                       ADC_ISR_EOCAL                                  /**< ADC校准状态               */
+#define ADC_FLAG_ALL                         (ADC_ISR_EOSAMP | ADC_ISR_EOC | ADC_ISR_EOS \
+                                              | ADC_ISR_OVRN | ADC_ISR_AWDG | ADC_ISR_EOCAL)/**< ADC全部状态               */
+                                              
+/* ADC工作模式定义 */
+#define ADC_MODE_INTERVAL                    (0x00000000U)                                  /**< ADC间歇工作模式           */
+#define ADC_MODE_NORMAL                      ADC_CFG3_MODE                                  /**< ADC正常工作模式           */
+                                              
+
+/* VBGR校准参数定义 */  
+#define VBGR_CAL_ADDR                        ((uint16_t *)(BGR_CAL))                        /**< VBGR校准参数存储地址       */
+#define VBGR_CAL_VREF                        (3300U)                                        /**< VBGR校准采用参考电压:3.3V */
+
+/* 等待内部通道VBGR的启动稳定。稳定时间最大值参考CIU32F003的数据手册(tADC_BUF参数) */
+#define ADC_VBGR_CHANNEL_DELAY               (22U)                                          /**< VBGR通道启动稳定时间:22us */
+
+/* ADC使能稳定时间,需等待1us稳定时间 */
+#define ADC_EN_DELAY                         (1U)                                           /**< ADC使能稳定时间 */
+
+/* ADC最大采样值 */
+#define ADC_CONVER_SCALE                     (4095U)                                        /**< ADC最大采样值,用于ADC电压转换计算 */
+
+/** 
+* @} 
+*/
+
+/*-------------------------------------------functions------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @defgroup ADC_External_Functions ADC External Functions
+* @brief    ADC对外函数
+* @{
+*
+*/
+/************************************************************************************************/
+/** 
+* @brief  使能ADC
+* @retval 无
+*/
+__STATIC_INLINE void std_adc_enable(void)
+{
+    ADC->CR = (ADC_CR_ADEN);
+}
+
+/** 
+* @brief  禁止ADC
+* @retval 无
+*/
+__STATIC_INLINE void std_adc_disable(void)
+{
+    ADC->CR = (ADC_CR_ADDIS);
+}
+
+/** 
+* @brief  获取ADC使能位状态
+* @retval uint32_t 返回逻辑表达式的判断结果
+*             @arg 非0: 表示ADC处于使能状态
+*             @arg 0:表示ADC处于禁止状态
+*/
+__STATIC_INLINE uint32_t std_adc_get_enable_status(void)
+{
+    return ((ADC->CR & ADC_CR_ADEN));
+}
+
+/** 
+* @brief  使能ADC校准
+* @note   当ADEN=1,ADC稳定后,且START=0、STOP=0、ADDIS=0,才允许通过软件将CALEN位置1
+* @retval 无
+*/
+__STATIC_INLINE void std_adc_calibration_enable(void)
+{
+    ADC->CR = (ADC_CR_CALEN);
+}
+
+/** 
+* @brief  启动ADC转换 
+* @retval 无
+*/
+__STATIC_INLINE void std_adc_start_conversion(void)
+{
+    ADC->CR = (ADC_CR_START);
+}
+
+/** 
+* @brief  获取ADC工作状态
+* @retval uint32_t 返回ADC工作状态
+*             @arg 非0: 表示ADC正处于工作状态
+*             @arg 0:表示ADC处于未工作状态
+*/
+__STATIC_INLINE uint32_t std_adc_get_conversion_status(void)
+{
+    return ((ADC->CR & ADC_CR_START));
+}
+
+/** 
+* @brief  ADC停止转换
+* @note   仅当START=1且ADDIS=0时,软件将STOP位置1生效
+* @retval 无
+*/
+__STATIC_INLINE void std_adc_stop_conversion(void)
+{
+    ADC->CR = (ADC_CR_STOP);
+}
+
+/** 
+* @brief  ADC中断使能
+* @param  interrupt ADC中断源   
+*             @arg ADC_INTERRUPT_EOSAMP
+*             @arg ADC_INTERRUPT_EOC
+*             @arg ADC_INTERRUPT_EOS
+*             @arg ADC_INTERRUPT_OVRN
+*             @arg ADC_INTERRUPT_AWDG
+*             @arg ADC_INTERRUPT_EOCAL
+* @retval 无
+*/
+__STATIC_INLINE void std_adc_interrupt_enable(uint32_t interrupt)
+{
+    ADC->IER |= (interrupt);
+}
+
+/** 
+* @brief  ADC中断禁止
+* @param  interrupt ADC中断源   
+*             @arg ADC_INTERRUPT_EOSAMP
+*             @arg ADC_INTERRUPT_EOC
+*             @arg ADC_INTERRUPT_EOS
+*             @arg ADC_INTERRUPT_OVRN
+*             @arg ADC_INTERRUPT_AWDG
+*             @arg ADC_INTERRUPT_EOCAL
+* @retval 无
+*/
+__STATIC_INLINE void std_adc_interrupt_disable(uint32_t interrupt)
+{
+    ADC->IER &= (~interrupt);
+}
+
+/** 
+* @brief  获取ADC中断源使能状态
+* @param  interrupt ADC中断源信息 
+*             @arg ADC_INTERRUPT_EOSAMP
+*             @arg ADC_INTERRUPT_EOC
+*             @arg ADC_INTERRUPT_EOS
+*             @arg ADC_INTERRUPT_OVRN
+*             @arg ADC_INTERRUPT_AWDG
+*             @arg ADC_INTERRUPT_EOCAL
+* @retval uint32_t 返回中断源使能状态
+*             @arg 非0: 表示指定的中断使能
+*             @arg 0:表示指定的中断未使能
+*/
+
+__STATIC_INLINE uint32_t std_adc_get_interrupt_enable(uint32_t interrupt)
+{
+    return((ADC->IER & (interrupt)));
+}
+
+/** 
+* @brief  获取ADC标志状态
+* @param  flag 获取ADC标志
+*             @arg ADC_FLAG_EOSAMP
+*             @arg ADC_FLAG_EOC
+*             @arg ADC_FLAG_EOS
+*             @arg ADC_FLAG_OVRN
+*             @arg ADC_FLAG_AWDG
+*             @arg ADC_FLAG_EOCAL
+* @retval uint32_t 返回标志位状态
+*             @arg 非0:表示当前标志为置位状态
+*             @arg 0:表示当前标志为清除状态
+*/
+__STATIC_INLINE uint32_t std_adc_get_flag(uint32_t flag)
+{
+    return((ADC->ISR & (flag)));
+}
+
+/** 
+* @brief  清除ADC标志
+* @param  flag 清除ADC标志
+*             @arg ADC_FLAG_EOSAMP
+*             @arg ADC_FLAG_EOC
+*             @arg ADC_FLAG_EOS
+*             @arg ADC_FLAG_OVRN
+*             @arg ADC_FLAG_AWDG
+*             @arg ADC_FLAG_EOCAL
+* @retval 无
+*/
+__STATIC_INLINE void std_adc_clear_flag(uint32_t flag)
+{
+    ADC->ISR = (flag);
+}
+
+/** 
+* @brief  配置ADC转换模式
+* @param  conversion_mode 转换模式选择
+*             @arg ADC_SINGLE_CONVER_MODE
+*             @arg ADC_CONTINUOUS_CONVER_MODE
+*             @arg ADC_DISCONTINUOUS_CONVER_MODE
+* @note   当START=0时,软件对此位域执行写操作生效
+* @retval 无
+*/
+__STATIC_INLINE void std_adc_conversion_mode_config(uint32_t conversion_mode)
+{
+    MODIFY_REG(ADC->CFG1, ADC_CFG1_CONV_MOD, conversion_mode);
+}
+
+/** 
+* @brief  ADC通道使能
+* @param  channel 通道号选择
+*             @arg ADC_CHANNEL_0
+*             @arg ADC_CHANNEL_1
+*             @arg ...
+*             @arg ADC_CHANNEL_ALL
+* @retval 无
+*/
+__STATIC_INLINE void std_adc_fix_sequence_channel_enable(uint32_t channel)
+{
+    ADC->CHCFG |= (channel);
+}
+
+/** 
+* @brief  ADC通道禁止
+* @param  channel 禁止通道选择
+*             @arg ADC_CHANNEL_0
+*             @arg ADC_CHANNEL_1
+*             @arg ...
+*             @arg ADC_CHANNEL_ALL
+* @retval 无
+*/
+__STATIC_INLINE void std_adc_fix_sequence_channel_disable(uint32_t channel)
+{
+    ADC->CHCFG &= (~channel);
+}
+
+/** 
+* @brief  配置ADC触发源为软件触发
+* @retval 无
+*/
+__STATIC_INLINE void std_adc_trig_sw(void)
+{
+    MODIFY_REG(ADC->CFG1, ADC_CFG1_TRIGEN, ADC_TRIG_SW);
+}
+
+/** 
+* @brief  配置ADC触发信号源和极性
+* @param  trig_edge 触发极性选择
+*             @arg ADC_TRIG_SW(软件触发方式)
+*             @arg ADC_TRIG_HW_EDGE_RISING
+*             @arg ADC_TRIG_HW_EDGE_FALLING
+*             @arg ADC_TRIG_HW_EDGE_BOTH
+* @param  trig_source 外部触发源性选择
+*             @arg ADC_EXTRIG_TIM1_TRGO
+*             @arg ADC_EXTRIG_TIM1_OC4_ADC
+*             @arg ADC_EXTRIG_TIM3_TRGO
+*             @arg ADC_EXTRIG_EXTI7
+* @note   当选择ADC_TRIG_SW(软件触发方式)时,触发源参数无意义。
+* @retval 无
+*/
+__STATIC_INLINE void std_adc_trig_config(uint32_t trig_edge,uint32_t trig_source)
+{
+    MODIFY_REG(ADC->CFG1, (ADC_CFG1_TRIGEN | ADC_CFG1_TRIG_SEL), (trig_edge | trig_source));
+}
+
+/** 
+* @brief  ADC采样时间参数1配置
+* @param  sample_time 采样时间选择
+*           @arg ADC_SAMPTIME_3CYCLES
+*           @arg ...
+*           @arg ADC_SAMPTIME_1919CYCLES 
+* @retval 无
+*/
+__STATIC_INLINE void std_adc_sampt_time_config(uint32_t sample_time)
+{
+    MODIFY_REG(ADC->SAMPT, ADC_SAMPT_SAMPT, sample_time);
+}
+
+/** 
+* @brief  配置ADC_CK时钟分频
+* @param  presc ADC_CK时钟源分频系数
+*             @arg  ADC_CK_DIV1: ADC_CK 不分频
+*             @arg  ADC_CK_DIV2: ADC_CK 2分频
+*             @arg  ADC_CK_DIV3: ADC_CK 3分频
+*             @arg ...
+*             @arg  ADC_CK_DIV64:ADC_CK 64分频
+* @retval 无
+*/
+__STATIC_INLINE void std_adc_clock_config(uint32_t presc)
+{
+    MODIFY_REG(ADC->CFG2, ADC_CFG2_PRESC, presc);
+}
+
+/** 
+* @brief  配置ADC校准系数
+* @param  calibration_factor 参数范围为0x00~0x3F
+* @retval 无
+*/
+__STATIC_INLINE void std_adc_calibration_factor_config(uint32_t calibration_factor)
+{
+    ADC->CALFACT = calibration_factor;
+}
+
+/** 
+* @brief  获取ADC校准系数
+* @retval uint16_t ADC校准系数
+*/
+__STATIC_INLINE uint16_t std_adc_get_calibration_factor(void)
+{
+    return ((uint16_t)(ADC->CALFACT));
+}
+
+/** 
+* @brief  使能ADC等待模式
+* @note   用于避免数据未及时读取,转换溢出
+* @retval 无
+*/
+__STATIC_INLINE void std_adc_wait_mode_enable(void)
+{
+    ADC->CFG1 |= (ADC_CFG1_WAIT_MOD);
+}
+
+/** 
+* @brief  禁止ADC等待模式
+* @retval 无
+*/
+__STATIC_INLINE void std_adc_wait_mode_disable(void)
+{
+    ADC->CFG1 &= (~ADC_CFG1_WAIT_MOD);
+}
+
+/** 
+* @brief  配置通道序列扫描方向
+* @param  dir ADC通道扫描方向
+*             @arg ADC_SCAN_DIR_FORWARD
+*             @arg ADC_SCAN_DIR_BACKWARD
+* @retval 无
+*/
+__STATIC_INLINE void std_adc_scan_direction_config(uint32_t dir)
+{
+    MODIFY_REG(ADC->CFG1, ADC_CFG1_SDIR, dir);
+}
+
+/** 
+* @brief  配置ADC数据溢出管理方式
+* @param  ovrn_mode ADC数据溢出管理方式
+*             @arg ADC_OVRN_MODE_PRESERVED
+*             @arg ADC_OVRN_MODE_OVERWRITTEN
+* @retval 无
+*/
+__STATIC_INLINE void std_adc_ovrn_mode_config(uint32_t ovrn_mode)
+{
+    MODIFY_REG(ADC->CFG1, ADC_CFG1_OVRN_MOD, ovrn_mode);
+}
+
+/** 
+* @brief  ADC内部通道VBGR使能
+* @retval 无
+*/
+__STATIC_INLINE void std_adc_internal_channel_vbgr_enable(void)
+{
+    ADC->CFG2 |= (ADC_INTERNAL_CHANNEL_VBGREN);
+}
+
+/** 
+* @brief  ADC内部通道VBGR禁止
+* @retval 无
+*/
+__STATIC_INLINE void std_adc_internal_channel_vbgr_disable(void)
+{
+    ADC->CFG2 &= (~ADC_INTERNAL_CHANNEL_VBGREN);
+}
+
+/** 
+* @brief  选择ADC模拟看门狗监控通道
+* @param  channel ADC看门狗监控通道选择
+*             @arg ADC_AWDG_CHANNEL_NONE
+*             @arg ADC_AWDG_CHANNEL_0
+*             @arg ...
+*             @arg ADC_AWDG_CHANNEL_ALL
+* @retval 无
+*/
+__STATIC_INLINE void std_adc_analog_watchdog_monit_channel(uint32_t channel)
+{
+    MODIFY_REG(ADC->AWDGCR, ADC_AWDGCR_CHN, channel);
+}
+
+/** 
+* @brief  配置看门狗监控通道电压阈值
+* @param  high_threshold 阈值上限选择范围为 0x000~0xFFF
+* @param  low_threshold  阈值下限选择范围为 0x000~0xFFF
+* @retval 无
+*/
+__STATIC_INLINE void std_adc_analog_watchdog_thresholds_config(uint32_t high_threshold, uint32_t low_threshold)
+{
+    MODIFY_REG(ADC->AWDGTR, (ADC_AWDGTR_AWDG_LT | ADC_AWDGTR_AWDG_HT), (high_threshold << ADC_AWDGTR_AWDG_HT_POS) | (low_threshold));
+}
+
+/** 
+* @brief  获取ADC采样值
+* @retval uint16_t ADC转换值
+*/
+__STATIC_INLINE uint16_t std_adc_get_conversion_value(void)
+{
+    return ((uint16_t)(ADC->DR));
+}
+
+/** 
+* @brief  获取校准后的参考电压值
+* @param  vbgr_sample_data ADC采集BGR的转换值
+* @retval uint32_t 校准后的参考电压值
+*/
+__STATIC_INLINE uint32_t std_adc_calc_vref_voltage(uint16_t vbgr_sample_data)
+{
+    return ((VBGR_CAL_VREF * (*VBGR_CAL_ADDR))/vbgr_sample_data);
+}
+
+/** 
+* @brief  配置ADC工作模式
+* @param  mode_sel ADC工作模式
+*             @arg ADC_MODE_INTERVAL
+*             @arg ADC_MODE_NORMAL
+* @retval 无
+*/
+__STATIC_INLINE void std_adc_mode_config(uint32_t mode_sel)
+{
+    MODIFY_REG(ADC->CFG3, ADC_CFG3_MODE_MASK, mode_sel);
+}
+
+/* ADC去初始化函数 */
+void std_adc_deinit(void);
+
+/**
+* @}
+*/
+
+#ifdef __cplusplus
+}
+#endif
+
+/**
+* @}
+*/
+
+/**
+* @}
+*/
+
+#endif /* CIU32F003_STD_ADC_H */

+ 592 - 0
CIU32F003_LIB/Include/ciu32f003_std_adc(2).h

@@ -0,0 +1,592 @@
+/************************************************************************************************/
+/**
+* @file               ciu32f003_std_adc.h
+* @author             MCU Ecosystem Development Team
+* @brief              ADC STD库驱动头文件。
+*                     提供ADC相关的STD库操作函数声明、数据类型以及常量的定义。                         
+*
+*
+**************************************************************************************************
+* @attention
+* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
+*
+**************************************************************************************************
+*/
+
+/* 避免头文件重复引用 */
+#ifndef CIU32F003_STD_ADC_H
+#define CIU32F003_STD_ADC_H
+
+/************************************************************************************************/
+/** 
+* @addtogroup CIU32F003_STD_Driver
+* @{
+*/
+
+/**
+* @defgroup ADC ADC
+* @brief 模数转换器的STD库驱动
+* @{
+*/
+/************************************************************************************************/
+
+
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/*------------------------------------------includes--------------------------------------------*/
+#include "ciu32f003_std_common.h"
+
+/*--------------------------------------------define--------------------------------------------*/
+/************************************************************************************************/
+/**
+* @defgroup ADC_Constants  ADC Constants
+* @brief    ADC常量定义及宏定义
+* @{
+*
+*/
+/************************************************************************************************/
+/* ADC_CK时钟分频系数 */
+#define ADC_CK_DIV1                          ADC_CFG2_PRESC_DIV1                            /**< ADC_CK时钟: 不分频 */
+#define ADC_CK_DIV2                          ADC_CFG2_PRESC_DIV2                            /**< ADC_CK时钟: 2分频  */
+#define ADC_CK_DIV3                          ADC_CFG2_PRESC_DIV3                            /**< ADC_CK时钟: 3分频  */
+#define ADC_CK_DIV4                          ADC_CFG2_PRESC_DIV4                            /**< ADC_CK时钟: 4分频  */
+#define ADC_CK_DIV8                          ADC_CFG2_PRESC_DIV8                            /**< ADC_CK时钟: 8分频  */
+#define ADC_CK_DIV16                         ADC_CFG2_PRESC_DIV16                           /**< ADC_CK时钟: 16分频 */
+#define ADC_CK_DIV32                         ADC_CFG2_PRESC_DIV32                           /**< ADC_CK时钟: 32分频 */
+#define ADC_CK_DIV64                         ADC_CFG2_PRESC_DIV64                           /**< ADC_CK时钟: 64分频 */
+
+/* ADC转换模式 */
+#define ADC_SINGLE_CONVER_MODE               ADC_CFG1_CONV_MOD_SINGLE                       /**< ADC单次扫描转换 */
+#define ADC_CONTINUOUS_CONVER_MODE           ADC_CFG1_CONV_MOD_CONTINUOUS                   /**< ADC循环扫描转换 */
+#define ADC_DISCONTINUOUS_CONVER_MODE        ADC_CFG1_CONV_MOD_DISCONTINUOUS                /**< ADC循环间断转换 */
+
+/* ADC通道扫描方向 */
+#define ADC_SCAN_DIR_FORWARD                 (0x00000000U)                                  /**< ADC转换通道: 正向扫描 */
+#define ADC_SCAN_DIR_BACKWARD                ADC_CFG1_SDIR                                  /**< ADC转换通道: 反向扫描 */
+
+/* ADC转换触发模式: 触发沿 */
+#define ADC_TRIG_SW                          ADC_CFG1_TRIGEN_SW                             /**< 软件触发方式                 */
+#define ADC_TRIG_HW_EDGE_RISING              ADC_CFG1_TRIGEN_HW_EDGE_RISING                 /**< 外部硬件触发使能: 上升沿触发 */
+#define ADC_TRIG_HW_EDGE_FALLING             ADC_CFG1_TRIGEN_HW_EDGE_FALLING                /**< 外部硬件触发使能: 下降沿触发 */
+#define ADC_TRIG_HW_EDGE_BOTH                ADC_CFG1_TRIGEN_HW_EDGE_BOTH                   /**< 外部硬件触发使能: 双沿触发   */
+
+/*  ADC转换触发源 */
+#define ADC_EXTRIG_TIM1_TRGO                 ADC_CFG1_TRIG_TIM1_TRGO                        /**< ADC触发源: TIM1 TRGO      */
+#define ADC_EXTRIG_TIM1_OC4_ADC              ADC_CFG1_TRIG_TIM1_OC4_ADC                     /**< ADC触发源: TIM1 OC4       */
+#define ADC_EXTRIG_TIM3_TRGO                 ADC_CFG1_TRIG_TIM3_TRGO                        /**< ADC触发源: TIM3 TRGO      */
+#define ADC_EXTRIG_EXTI7                     ADC_CFG1_TRIG_EXTI7                            /**< ADC触发源: 外部中断EXTI_7 */
+
+/* ADC转换溢出后ADC_DR寄存器数据存储方式 */
+#define ADC_OVRN_MODE_PRESERVED              (0x00000000U)                                  /**< ADC_DR寄存器保留原数据 */
+#define ADC_OVRN_MODE_OVERWRITTEN            ADC_CFG1_OVRN_MOD                              /**< ADC_DR寄存器覆盖新数据 */
+
+/* ADC采样时间参数 */
+#define ADC_SAMPTIME_3CYCLES                 ADC_SAMPT_SAMPT_3CYCLES                        /**< 采样时间为3个时钟周期    */
+#define ADC_SAMPTIME_7CYCLES                 ADC_SAMPT_SAMPT_7CYCLES                        /**< 采样时间为7个时钟周期    */
+#define ADC_SAMPTIME_12CYCLES                ADC_SAMPT_SAMPT_12CYCLES                       /**< 采样时间为12个时钟周期   */
+#define ADC_SAMPTIME_19CYCLES                ADC_SAMPT_SAMPT_19CYCLES                       /**< 采样时间为19个时钟周期   */
+#define ADC_SAMPTIME_39CYCLES                ADC_SAMPT_SAMPT_39CYCLES                       /**< 采样时间为39个时钟周期   */
+#define ADC_SAMPTIME_79CYCLES                ADC_SAMPT_SAMPT_79CYCLES                       /**< 采样时间为79个时钟周期   */
+#define ADC_SAMPTIME_119CYCLES               ADC_SAMPT_SAMPT_119CYCLES                      /**< 采样时间为119个时钟周期  */
+#define ADC_SAMPTIME_159CYCLES               ADC_SAMPT_SAMPT_159CYCLES                      /**< 采样时间为159个时钟周期  */
+#define ADC_SAMPTIME_239CYCLES               ADC_SAMPT_SAMPT_239CYCLES                      /**< 采样时间为239个时钟周期  */
+#define ADC_SAMPTIME_319CYCLES               ADC_SAMPT_SAMPT_319CYCLES                      /**< 采样时间为319个时钟周期  */
+#define ADC_SAMPTIME_479CYCLES               ADC_SAMPT_SAMPT_479CYCLES                      /**< 采样时间为479个时钟周期  */
+#define ADC_SAMPTIME_639CYCLES               ADC_SAMPT_SAMPT_639CYCLES                      /**< 采样时间为639个时钟周期  */
+#define ADC_SAMPTIME_959CYCLES               ADC_SAMPT_SAMPT_959CYCLES                      /**< 采样时间为959个时钟周期  */
+#define ADC_SAMPTIME_1279CYCLES              ADC_SAMPT_SAMPT_1279CYCLES                     /**< 采样时间为1279个时钟周期 */
+#define ADC_SAMPTIME_1919CYCLES              ADC_SAMPT_SAMPT_1919CYCLES                     /**< 采样时间为1919个时钟周期 */
+
+/* ADC转换通道 */
+#define ADC_CHANNEL_NONE                     (0x00000000U)                                  /**< ADC 转换通道清除     */ 
+#define ADC_CHANNEL_0                        ADC_CHCFG_CHN0                                 /**< ADC 转换通道IN0      */
+#define ADC_CHANNEL_1                        ADC_CHCFG_CHN1                                 /**< ADC 转换通道IN1      */
+#define ADC_CHANNEL_2                        ADC_CHCFG_CHN2                                 /**< ADC 转换通道IN2      */
+#define ADC_CHANNEL_3                        ADC_CHCFG_CHN3                                 /**< ADC 转换通道IN3      */
+#define ADC_CHANNEL_4                        ADC_CHCFG_CHN4                                 /**< ADC 转换通道IN4      */
+#define ADC_CHANNEL_5                        ADC_CHCFG_CHN5                                 /**< ADC 转换通道IN5      */
+#define ADC_CHANNEL_6                        ADC_CHCFG_CHN6                                 /**< ADC 转换通道IN6      */
+#define ADC_CHANNEL_7                        ADC_CHCFG_CHN7                                 /**< ADC 转换通道IN7      */
+#define ADC_CHANNEL_8                        ADC_CHCFG_CHN8                                 /**< ADC 转换通道IN8      */
+#define ADC_CHANNEL_VBGR                     ADC_CHCFG_CHN8                                 /**< ADC 内部转换通道VBGR */
+#define ADC_CHANNEL_ALL                      ADC_CHCFG_CHN                                  /**< ADC 全部转换通道     */ 
+
+/* ADC模拟看门狗监测通道 */
+#define ADC_AWDG_CHANNEL_NONE                (0x00000000U)                                  /**< ADC 模拟看门狗监测通道清除 */ 
+#define ADC_AWDG_CHANNEL_0                   ADC_AWDGCR_CHN0                                /**< ADC 模拟看门狗监测通道0    */ 
+#define ADC_AWDG_CHANNEL_1                   ADC_AWDGCR_CHN1                                /**< ADC 模拟看门狗监测通道1    */ 
+#define ADC_AWDG_CHANNEL_2                   ADC_AWDGCR_CHN2                                /**< ADC 模拟看门狗监测通道2    */ 
+#define ADC_AWDG_CHANNEL_3                   ADC_AWDGCR_CHN3                                /**< ADC 模拟看门狗监测通道3    */ 
+#define ADC_AWDG_CHANNEL_4                   ADC_AWDGCR_CHN4                                /**< ADC 模拟看门狗监测通道4    */ 
+#define ADC_AWDG_CHANNEL_5                   ADC_AWDGCR_CHN5                                /**< ADC 模拟看门狗监测通道5    */ 
+#define ADC_AWDG_CHANNEL_6                   ADC_AWDGCR_CHN6                                /**< ADC 模拟看门狗监测通道6    */ 
+#define ADC_AWDG_CHANNEL_7                   ADC_AWDGCR_CHN7                                /**< ADC 模拟看门狗监测通道7    */ 
+#define ADC_AWDG_CHANNEL_8                   ADC_AWDGCR_CHN8                                /**< ADC 模拟看门狗监测通道8    */ 
+#define ADC_AWDG_CHANNEL_VBGR                ADC_AWDGCR_CHN8                                /**< ADC 模拟看门狗监测通道VBGR */ 
+#define ADC_AWDG_CHANNEL_ALL                 ADC_AWDGCR_CHN                                 /**< ADC 全部转换通道           */ 
+
+/* ADC内部通道使能 */
+#define ADC_INTERNAL_CHANNEL_VBGREN          ADC_CFG2_VBGREN                                /**< ADC 内部通道VBGR使能 */ 
+
+/* ADC中断源定义:IER中断寄存器 */
+#define ADC_INTERRUPT_EOSAMP                 ADC_IER_EOSAMPIE                               /**< ADC采样结束中断           */
+#define ADC_INTERRUPT_EOC                    ADC_IER_EOCIE                                  /**< ADC单通道转换完成中断     */
+#define ADC_INTERRUPT_EOS                    ADC_IER_EOSIE                                  /**< ADC通道序列转换完成中断   */
+#define ADC_INTERRUPT_OVRN                   ADC_IER_OVRNIE                                 /**< ADC数据溢出中断           */
+#define ADC_INTERRUPT_AWDG                   ADC_IER_AWDGIE                                 /**< ADC模拟看门狗电压监控中断 */
+#define ADC_INTERRUPT_EOCAL                  ADC_IER_EOCALIE                                /**< ADC校准结束中断           */
+
+/* ADC状态定义:ISR状态寄存器 */
+#define ADC_FLAG_EOSAMP                      ADC_ISR_EOSAMP                                 /**< ADC采样结束状态           */
+#define ADC_FLAG_EOC                         ADC_ISR_EOC                                    /**< ADC单通道转换完成状态     */
+#define ADC_FLAG_EOS                         ADC_ISR_EOS                                    /**< ADC通道序列转换完成状态   */
+#define ADC_FLAG_OVRN                        ADC_ISR_OVRN                                   /**< ADC数据溢出状态           */
+#define ADC_FLAG_AWDG                        ADC_ISR_AWDG                                   /**< ADC模拟看门狗监控电压状态 */
+#define ADC_FLAG_EOCAL                       ADC_ISR_EOCAL                                  /**< ADC校准状态               */
+#define ADC_FLAG_ALL                         (ADC_ISR_EOSAMP | ADC_ISR_EOC | ADC_ISR_EOS \
+                                              | ADC_ISR_OVRN | ADC_ISR_AWDG | ADC_ISR_EOCAL)/**< ADC全部状态               */
+                                              
+/* ADC工作模式定义 */
+#define ADC_MODE_INTERVAL                    (0x00000000U)                                  /**< ADC间歇工作模式           */
+#define ADC_MODE_NORMAL                      ADC_CFG3_MODE                                  /**< ADC正常工作模式           */
+                                              
+
+/* VBGR校准参数定义 */  
+#define VBGR_CAL_ADDR                        ((uint16_t *)(BGR_CAL))                        /**< VBGR校准参数存储地址       */
+#define VBGR_CAL_VREF                        (3300U)                                        /**< VBGR校准采用参考电压:3.3V */
+
+/* 等待内部通道VBGR的启动稳定。稳定时间最大值参考CIU32F003的数据手册(tADC_BUF参数) */
+#define ADC_VBGR_CHANNEL_DELAY               (22U)                                          /**< VBGR通道启动稳定时间:22us */
+
+/* ADC使能稳定时间,需等待1us稳定时间 */
+#define ADC_EN_DELAY                         (1U)                                           /**< ADC使能稳定时间 */
+
+/* ADC最大采样值 */
+#define ADC_CONVER_SCALE                     (4095U)                                        /**< ADC最大采样值,用于ADC电压转换计算 */
+
+/** 
+* @} 
+*/
+
+/*-------------------------------------------functions------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @defgroup ADC_External_Functions ADC External Functions
+* @brief    ADC对外函数
+* @{
+*
+*/
+/************************************************************************************************/
+/** 
+* @brief  使能ADC
+* @retval 无
+*/
+__STATIC_INLINE void std_adc_enable(void)
+{
+    ADC->CR = (ADC_CR_ADEN);
+}
+
+/** 
+* @brief  禁止ADC
+* @retval 无
+*/
+__STATIC_INLINE void std_adc_disable(void)
+{
+    ADC->CR = (ADC_CR_ADDIS);
+}
+
+/** 
+* @brief  获取ADC使能位状态
+* @retval uint32_t 返回逻辑表达式的判断结果
+*             @arg 非0: 表示ADC处于使能状态
+*             @arg 0:表示ADC处于禁止状态
+*/
+__STATIC_INLINE uint32_t std_adc_get_enable_status(void)
+{
+    return ((ADC->CR & ADC_CR_ADEN));
+}
+
+/** 
+* @brief  使能ADC校准
+* @note   当ADEN=1,ADC稳定后,且START=0、STOP=0、ADDIS=0,才允许通过软件将CALEN位置1
+* @retval 无
+*/
+__STATIC_INLINE void std_adc_calibration_enable(void)
+{
+    ADC->CR = (ADC_CR_CALEN);
+}
+
+/** 
+* @brief  启动ADC转换 
+* @retval 无
+*/
+__STATIC_INLINE void std_adc_start_conversion(void)
+{
+    ADC->CR = (ADC_CR_START);
+}
+
+/** 
+* @brief  获取ADC工作状态
+* @retval uint32_t 返回ADC工作状态
+*             @arg 非0: 表示ADC正处于工作状态
+*             @arg 0:表示ADC处于未工作状态
+*/
+__STATIC_INLINE uint32_t std_adc_get_conversion_status(void)
+{
+    return ((ADC->CR & ADC_CR_START));
+}
+
+/** 
+* @brief  ADC停止转换
+* @note   仅当START=1且ADDIS=0时,软件将STOP位置1生效
+* @retval 无
+*/
+__STATIC_INLINE void std_adc_stop_conversion(void)
+{
+    ADC->CR = (ADC_CR_STOP);
+}
+
+/** 
+* @brief  ADC中断使能
+* @param  interrupt ADC中断源   
+*             @arg ADC_INTERRUPT_EOSAMP
+*             @arg ADC_INTERRUPT_EOC
+*             @arg ADC_INTERRUPT_EOS
+*             @arg ADC_INTERRUPT_OVRN
+*             @arg ADC_INTERRUPT_AWDG
+*             @arg ADC_INTERRUPT_EOCAL
+* @retval 无
+*/
+__STATIC_INLINE void std_adc_interrupt_enable(uint32_t interrupt)
+{
+    ADC->IER |= (interrupt);
+}
+
+/** 
+* @brief  ADC中断禁止
+* @param  interrupt ADC中断源   
+*             @arg ADC_INTERRUPT_EOSAMP
+*             @arg ADC_INTERRUPT_EOC
+*             @arg ADC_INTERRUPT_EOS
+*             @arg ADC_INTERRUPT_OVRN
+*             @arg ADC_INTERRUPT_AWDG
+*             @arg ADC_INTERRUPT_EOCAL
+* @retval 无
+*/
+__STATIC_INLINE void std_adc_interrupt_disable(uint32_t interrupt)
+{
+    ADC->IER &= (~interrupt);
+}
+
+/** 
+* @brief  获取ADC中断源使能状态
+* @param  interrupt ADC中断源信息 
+*             @arg ADC_INTERRUPT_EOSAMP
+*             @arg ADC_INTERRUPT_EOC
+*             @arg ADC_INTERRUPT_EOS
+*             @arg ADC_INTERRUPT_OVRN
+*             @arg ADC_INTERRUPT_AWDG
+*             @arg ADC_INTERRUPT_EOCAL
+* @retval uint32_t 返回中断源使能状态
+*             @arg 非0: 表示指定的中断使能
+*             @arg 0:表示指定的中断未使能
+*/
+
+__STATIC_INLINE uint32_t std_adc_get_interrupt_enable(uint32_t interrupt)
+{
+    return((ADC->IER & (interrupt)));
+}
+
+/** 
+* @brief  获取ADC标志状态
+* @param  flag 获取ADC标志
+*             @arg ADC_FLAG_EOSAMP
+*             @arg ADC_FLAG_EOC
+*             @arg ADC_FLAG_EOS
+*             @arg ADC_FLAG_OVRN
+*             @arg ADC_FLAG_AWDG
+*             @arg ADC_FLAG_EOCAL
+* @retval uint32_t 返回标志位状态
+*             @arg 非0:表示当前标志为置位状态
+*             @arg 0:表示当前标志为清除状态
+*/
+__STATIC_INLINE uint32_t std_adc_get_flag(uint32_t flag)
+{
+    return((ADC->ISR & (flag)));
+}
+
+/** 
+* @brief  清除ADC标志
+* @param  flag 清除ADC标志
+*             @arg ADC_FLAG_EOSAMP
+*             @arg ADC_FLAG_EOC
+*             @arg ADC_FLAG_EOS
+*             @arg ADC_FLAG_OVRN
+*             @arg ADC_FLAG_AWDG
+*             @arg ADC_FLAG_EOCAL
+* @retval 无
+*/
+__STATIC_INLINE void std_adc_clear_flag(uint32_t flag)
+{
+    ADC->ISR = (flag);
+}
+
+/** 
+* @brief  配置ADC转换模式
+* @param  conversion_mode 转换模式选择
+*             @arg ADC_SINGLE_CONVER_MODE
+*             @arg ADC_CONTINUOUS_CONVER_MODE
+*             @arg ADC_DISCONTINUOUS_CONVER_MODE
+* @note   当START=0时,软件对此位域执行写操作生效
+* @retval 无
+*/
+__STATIC_INLINE void std_adc_conversion_mode_config(uint32_t conversion_mode)
+{
+    MODIFY_REG(ADC->CFG1, ADC_CFG1_CONV_MOD, conversion_mode);
+}
+
+/** 
+* @brief  ADC通道使能
+* @param  channel 通道号选择
+*             @arg ADC_CHANNEL_0
+*             @arg ADC_CHANNEL_1
+*             @arg ...
+*             @arg ADC_CHANNEL_ALL
+* @retval 无
+*/
+__STATIC_INLINE void std_adc_fix_sequence_channel_enable(uint32_t channel)
+{
+    ADC->CHCFG |= (channel);
+}
+
+/** 
+* @brief  ADC通道禁止
+* @param  channel 禁止通道选择
+*             @arg ADC_CHANNEL_0
+*             @arg ADC_CHANNEL_1
+*             @arg ...
+*             @arg ADC_CHANNEL_ALL
+* @retval 无
+*/
+__STATIC_INLINE void std_adc_fix_sequence_channel_disable(uint32_t channel)
+{
+    ADC->CHCFG &= (~channel);
+}
+
+/** 
+* @brief  配置ADC触发源为软件触发
+* @retval 无
+*/
+__STATIC_INLINE void std_adc_trig_sw(void)
+{
+    MODIFY_REG(ADC->CFG1, ADC_CFG1_TRIGEN, ADC_TRIG_SW);
+}
+
+/** 
+* @brief  配置ADC触发信号源和极性
+* @param  trig_edge 触发极性选择
+*             @arg ADC_TRIG_SW(软件触发方式)
+*             @arg ADC_TRIG_HW_EDGE_RISING
+*             @arg ADC_TRIG_HW_EDGE_FALLING
+*             @arg ADC_TRIG_HW_EDGE_BOTH
+* @param  trig_source 外部触发源性选择
+*             @arg ADC_EXTRIG_TIM1_TRGO
+*             @arg ADC_EXTRIG_TIM1_OC4_ADC
+*             @arg ADC_EXTRIG_TIM3_TRGO
+*             @arg ADC_EXTRIG_EXTI7
+* @note   当选择ADC_TRIG_SW(软件触发方式)时,触发源参数无意义。
+* @retval 无
+*/
+__STATIC_INLINE void std_adc_trig_config(uint32_t trig_edge,uint32_t trig_source)
+{
+    MODIFY_REG(ADC->CFG1, (ADC_CFG1_TRIGEN | ADC_CFG1_TRIG_SEL), (trig_edge | trig_source));
+}
+
+/** 
+* @brief  ADC采样时间参数1配置
+* @param  sample_time 采样时间选择
+*           @arg ADC_SAMPTIME_3CYCLES
+*           @arg ...
+*           @arg ADC_SAMPTIME_1919CYCLES 
+* @retval 无
+*/
+__STATIC_INLINE void std_adc_sampt_time_config(uint32_t sample_time)
+{
+    MODIFY_REG(ADC->SAMPT, ADC_SAMPT_SAMPT, sample_time);
+}
+
+/** 
+* @brief  配置ADC_CK时钟分频
+* @param  presc ADC_CK时钟源分频系数
+*             @arg  ADC_CK_DIV1: ADC_CK 不分频
+*             @arg  ADC_CK_DIV2: ADC_CK 2分频
+*             @arg  ADC_CK_DIV3: ADC_CK 3分频
+*             @arg ...
+*             @arg  ADC_CK_DIV64:ADC_CK 64分频
+* @retval 无
+*/
+__STATIC_INLINE void std_adc_clock_config(uint32_t presc)
+{
+    MODIFY_REG(ADC->CFG2, ADC_CFG2_PRESC, presc);
+}
+
+/** 
+* @brief  配置ADC校准系数
+* @param  calibration_factor 参数范围为0x00~0x3F
+* @retval 无
+*/
+__STATIC_INLINE void std_adc_calibration_factor_config(uint32_t calibration_factor)
+{
+    ADC->CALFACT = calibration_factor;
+}
+
+/** 
+* @brief  获取ADC校准系数
+* @retval uint16_t ADC校准系数
+*/
+__STATIC_INLINE uint16_t std_adc_get_calibration_factor(void)
+{
+    return ((uint16_t)(ADC->CALFACT));
+}
+
+/** 
+* @brief  使能ADC等待模式
+* @note   用于避免数据未及时读取,转换溢出
+* @retval 无
+*/
+__STATIC_INLINE void std_adc_wait_mode_enable(void)
+{
+    ADC->CFG1 |= (ADC_CFG1_WAIT_MOD);
+}
+
+/** 
+* @brief  禁止ADC等待模式
+* @retval 无
+*/
+__STATIC_INLINE void std_adc_wait_mode_disable(void)
+{
+    ADC->CFG1 &= (~ADC_CFG1_WAIT_MOD);
+}
+
+/** 
+* @brief  配置通道序列扫描方向
+* @param  dir ADC通道扫描方向
+*             @arg ADC_SCAN_DIR_FORWARD
+*             @arg ADC_SCAN_DIR_BACKWARD
+* @retval 无
+*/
+__STATIC_INLINE void std_adc_scan_direction_config(uint32_t dir)
+{
+    MODIFY_REG(ADC->CFG1, ADC_CFG1_SDIR, dir);
+}
+
+/** 
+* @brief  配置ADC数据溢出管理方式
+* @param  ovrn_mode ADC数据溢出管理方式
+*             @arg ADC_OVRN_MODE_PRESERVED
+*             @arg ADC_OVRN_MODE_OVERWRITTEN
+* @retval 无
+*/
+__STATIC_INLINE void std_adc_ovrn_mode_config(uint32_t ovrn_mode)
+{
+    MODIFY_REG(ADC->CFG1, ADC_CFG1_OVRN_MOD, ovrn_mode);
+}
+
+/** 
+* @brief  ADC内部通道VBGR使能
+* @retval 无
+*/
+__STATIC_INLINE void std_adc_internal_channel_vbgr_enable(void)
+{
+    ADC->CFG2 |= (ADC_INTERNAL_CHANNEL_VBGREN);
+}
+
+/** 
+* @brief  ADC内部通道VBGR禁止
+* @retval 无
+*/
+__STATIC_INLINE void std_adc_internal_channel_vbgr_disable(void)
+{
+    ADC->CFG2 &= (~ADC_INTERNAL_CHANNEL_VBGREN);
+}
+
+/** 
+* @brief  选择ADC模拟看门狗监控通道
+* @param  channel ADC看门狗监控通道选择
+*             @arg ADC_AWDG_CHANNEL_NONE
+*             @arg ADC_AWDG_CHANNEL_0
+*             @arg ...
+*             @arg ADC_AWDG_CHANNEL_ALL
+* @retval 无
+*/
+__STATIC_INLINE void std_adc_analog_watchdog_monit_channel(uint32_t channel)
+{
+    MODIFY_REG(ADC->AWDGCR, ADC_AWDGCR_CHN, channel);
+}
+
+/** 
+* @brief  配置看门狗监控通道电压阈值
+* @param  high_threshold 阈值上限选择范围为 0x000~0xFFF
+* @param  low_threshold  阈值下限选择范围为 0x000~0xFFF
+* @retval 无
+*/
+__STATIC_INLINE void std_adc_analog_watchdog_thresholds_config(uint32_t high_threshold, uint32_t low_threshold)
+{
+    MODIFY_REG(ADC->AWDGTR, (ADC_AWDGTR_AWDG_LT | ADC_AWDGTR_AWDG_HT), (high_threshold << ADC_AWDGTR_AWDG_HT_POS) | (low_threshold));
+}
+
+/** 
+* @brief  获取ADC采样值
+* @retval uint16_t ADC转换值
+*/
+__STATIC_INLINE uint16_t std_adc_get_conversion_value(void)
+{
+    return ((uint16_t)(ADC->DR));
+}
+
+/** 
+* @brief  获取校准后的参考电压值
+* @param  vbgr_sample_data ADC采集BGR的转换值
+* @retval uint32_t 校准后的参考电压值
+*/
+__STATIC_INLINE uint32_t std_adc_calc_vref_voltage(uint16_t vbgr_sample_data)
+{
+    return ((VBGR_CAL_VREF * (*VBGR_CAL_ADDR))/vbgr_sample_data);
+}
+
+/** 
+* @brief  配置ADC工作模式
+* @param  mode_sel ADC工作模式
+*             @arg ADC_MODE_INTERVAL
+*             @arg ADC_MODE_NORMAL
+* @retval 无
+*/
+__STATIC_INLINE void std_adc_mode_config(uint32_t mode_sel)
+{
+    MODIFY_REG(ADC->CFG3, ADC_CFG3_MODE_MASK, mode_sel);
+}
+
+/* ADC去初始化函数 */
+void std_adc_deinit(void);
+
+/**
+* @}
+*/
+
+#ifdef __cplusplus
+}
+#endif
+
+/**
+* @}
+*/
+
+/**
+* @}
+*/
+
+#endif /* CIU32F003_STD_ADC_H */

+ 592 - 0
CIU32F003_LIB/Include/ciu32f003_std_adc(3).h

@@ -0,0 +1,592 @@
+/************************************************************************************************/
+/**
+* @file               ciu32f003_std_adc.h
+* @author             MCU Ecosystem Development Team
+* @brief              ADC STD库驱动头文件。
+*                     提供ADC相关的STD库操作函数声明、数据类型以及常量的定义。                         
+*
+*
+**************************************************************************************************
+* @attention
+* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
+*
+**************************************************************************************************
+*/
+
+/* 避免头文件重复引用 */
+#ifndef CIU32F003_STD_ADC_H
+#define CIU32F003_STD_ADC_H
+
+/************************************************************************************************/
+/** 
+* @addtogroup CIU32F003_STD_Driver
+* @{
+*/
+
+/**
+* @defgroup ADC ADC
+* @brief 模数转换器的STD库驱动
+* @{
+*/
+/************************************************************************************************/
+
+
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/*------------------------------------------includes--------------------------------------------*/
+#include "ciu32f003_std_common.h"
+
+/*--------------------------------------------define--------------------------------------------*/
+/************************************************************************************************/
+/**
+* @defgroup ADC_Constants  ADC Constants
+* @brief    ADC常量定义及宏定义
+* @{
+*
+*/
+/************************************************************************************************/
+/* ADC_CK时钟分频系数 */
+#define ADC_CK_DIV1                          ADC_CFG2_PRESC_DIV1                            /**< ADC_CK时钟: 不分频 */
+#define ADC_CK_DIV2                          ADC_CFG2_PRESC_DIV2                            /**< ADC_CK时钟: 2分频  */
+#define ADC_CK_DIV3                          ADC_CFG2_PRESC_DIV3                            /**< ADC_CK时钟: 3分频  */
+#define ADC_CK_DIV4                          ADC_CFG2_PRESC_DIV4                            /**< ADC_CK时钟: 4分频  */
+#define ADC_CK_DIV8                          ADC_CFG2_PRESC_DIV8                            /**< ADC_CK时钟: 8分频  */
+#define ADC_CK_DIV16                         ADC_CFG2_PRESC_DIV16                           /**< ADC_CK时钟: 16分频 */
+#define ADC_CK_DIV32                         ADC_CFG2_PRESC_DIV32                           /**< ADC_CK时钟: 32分频 */
+#define ADC_CK_DIV64                         ADC_CFG2_PRESC_DIV64                           /**< ADC_CK时钟: 64分频 */
+
+/* ADC转换模式 */
+#define ADC_SINGLE_CONVER_MODE               ADC_CFG1_CONV_MOD_SINGLE                       /**< ADC单次扫描转换 */
+#define ADC_CONTINUOUS_CONVER_MODE           ADC_CFG1_CONV_MOD_CONTINUOUS                   /**< ADC循环扫描转换 */
+#define ADC_DISCONTINUOUS_CONVER_MODE        ADC_CFG1_CONV_MOD_DISCONTINUOUS                /**< ADC循环间断转换 */
+
+/* ADC通道扫描方向 */
+#define ADC_SCAN_DIR_FORWARD                 (0x00000000U)                                  /**< ADC转换通道: 正向扫描 */
+#define ADC_SCAN_DIR_BACKWARD                ADC_CFG1_SDIR                                  /**< ADC转换通道: 反向扫描 */
+
+/* ADC转换触发模式: 触发沿 */
+#define ADC_TRIG_SW                          ADC_CFG1_TRIGEN_SW                             /**< 软件触发方式                 */
+#define ADC_TRIG_HW_EDGE_RISING              ADC_CFG1_TRIGEN_HW_EDGE_RISING                 /**< 外部硬件触发使能: 上升沿触发 */
+#define ADC_TRIG_HW_EDGE_FALLING             ADC_CFG1_TRIGEN_HW_EDGE_FALLING                /**< 外部硬件触发使能: 下降沿触发 */
+#define ADC_TRIG_HW_EDGE_BOTH                ADC_CFG1_TRIGEN_HW_EDGE_BOTH                   /**< 外部硬件触发使能: 双沿触发   */
+
+/*  ADC转换触发源 */
+#define ADC_EXTRIG_TIM1_TRGO                 ADC_CFG1_TRIG_TIM1_TRGO                        /**< ADC触发源: TIM1 TRGO      */
+#define ADC_EXTRIG_TIM1_OC4_ADC              ADC_CFG1_TRIG_TIM1_OC4_ADC                     /**< ADC触发源: TIM1 OC4       */
+#define ADC_EXTRIG_TIM3_TRGO                 ADC_CFG1_TRIG_TIM3_TRGO                        /**< ADC触发源: TIM3 TRGO      */
+#define ADC_EXTRIG_EXTI7                     ADC_CFG1_TRIG_EXTI7                            /**< ADC触发源: 外部中断EXTI_7 */
+
+/* ADC转换溢出后ADC_DR寄存器数据存储方式 */
+#define ADC_OVRN_MODE_PRESERVED              (0x00000000U)                                  /**< ADC_DR寄存器保留原数据 */
+#define ADC_OVRN_MODE_OVERWRITTEN            ADC_CFG1_OVRN_MOD                              /**< ADC_DR寄存器覆盖新数据 */
+
+/* ADC采样时间参数 */
+#define ADC_SAMPTIME_3CYCLES                 ADC_SAMPT_SAMPT_3CYCLES                        /**< 采样时间为3个时钟周期    */
+#define ADC_SAMPTIME_7CYCLES                 ADC_SAMPT_SAMPT_7CYCLES                        /**< 采样时间为7个时钟周期    */
+#define ADC_SAMPTIME_12CYCLES                ADC_SAMPT_SAMPT_12CYCLES                       /**< 采样时间为12个时钟周期   */
+#define ADC_SAMPTIME_19CYCLES                ADC_SAMPT_SAMPT_19CYCLES                       /**< 采样时间为19个时钟周期   */
+#define ADC_SAMPTIME_39CYCLES                ADC_SAMPT_SAMPT_39CYCLES                       /**< 采样时间为39个时钟周期   */
+#define ADC_SAMPTIME_79CYCLES                ADC_SAMPT_SAMPT_79CYCLES                       /**< 采样时间为79个时钟周期   */
+#define ADC_SAMPTIME_119CYCLES               ADC_SAMPT_SAMPT_119CYCLES                      /**< 采样时间为119个时钟周期  */
+#define ADC_SAMPTIME_159CYCLES               ADC_SAMPT_SAMPT_159CYCLES                      /**< 采样时间为159个时钟周期  */
+#define ADC_SAMPTIME_239CYCLES               ADC_SAMPT_SAMPT_239CYCLES                      /**< 采样时间为239个时钟周期  */
+#define ADC_SAMPTIME_319CYCLES               ADC_SAMPT_SAMPT_319CYCLES                      /**< 采样时间为319个时钟周期  */
+#define ADC_SAMPTIME_479CYCLES               ADC_SAMPT_SAMPT_479CYCLES                      /**< 采样时间为479个时钟周期  */
+#define ADC_SAMPTIME_639CYCLES               ADC_SAMPT_SAMPT_639CYCLES                      /**< 采样时间为639个时钟周期  */
+#define ADC_SAMPTIME_959CYCLES               ADC_SAMPT_SAMPT_959CYCLES                      /**< 采样时间为959个时钟周期  */
+#define ADC_SAMPTIME_1279CYCLES              ADC_SAMPT_SAMPT_1279CYCLES                     /**< 采样时间为1279个时钟周期 */
+#define ADC_SAMPTIME_1919CYCLES              ADC_SAMPT_SAMPT_1919CYCLES                     /**< 采样时间为1919个时钟周期 */
+
+/* ADC转换通道 */
+#define ADC_CHANNEL_NONE                     (0x00000000U)                                  /**< ADC 转换通道清除     */ 
+#define ADC_CHANNEL_0                        ADC_CHCFG_CHN0                                 /**< ADC 转换通道IN0      */
+#define ADC_CHANNEL_1                        ADC_CHCFG_CHN1                                 /**< ADC 转换通道IN1      */
+#define ADC_CHANNEL_2                        ADC_CHCFG_CHN2                                 /**< ADC 转换通道IN2      */
+#define ADC_CHANNEL_3                        ADC_CHCFG_CHN3                                 /**< ADC 转换通道IN3      */
+#define ADC_CHANNEL_4                        ADC_CHCFG_CHN4                                 /**< ADC 转换通道IN4      */
+#define ADC_CHANNEL_5                        ADC_CHCFG_CHN5                                 /**< ADC 转换通道IN5      */
+#define ADC_CHANNEL_6                        ADC_CHCFG_CHN6                                 /**< ADC 转换通道IN6      */
+#define ADC_CHANNEL_7                        ADC_CHCFG_CHN7                                 /**< ADC 转换通道IN7      */
+#define ADC_CHANNEL_8                        ADC_CHCFG_CHN8                                 /**< ADC 转换通道IN8      */
+#define ADC_CHANNEL_VBGR                     ADC_CHCFG_CHN8                                 /**< ADC 内部转换通道VBGR */
+#define ADC_CHANNEL_ALL                      ADC_CHCFG_CHN                                  /**< ADC 全部转换通道     */ 
+
+/* ADC模拟看门狗监测通道 */
+#define ADC_AWDG_CHANNEL_NONE                (0x00000000U)                                  /**< ADC 模拟看门狗监测通道清除 */ 
+#define ADC_AWDG_CHANNEL_0                   ADC_AWDGCR_CHN0                                /**< ADC 模拟看门狗监测通道0    */ 
+#define ADC_AWDG_CHANNEL_1                   ADC_AWDGCR_CHN1                                /**< ADC 模拟看门狗监测通道1    */ 
+#define ADC_AWDG_CHANNEL_2                   ADC_AWDGCR_CHN2                                /**< ADC 模拟看门狗监测通道2    */ 
+#define ADC_AWDG_CHANNEL_3                   ADC_AWDGCR_CHN3                                /**< ADC 模拟看门狗监测通道3    */ 
+#define ADC_AWDG_CHANNEL_4                   ADC_AWDGCR_CHN4                                /**< ADC 模拟看门狗监测通道4    */ 
+#define ADC_AWDG_CHANNEL_5                   ADC_AWDGCR_CHN5                                /**< ADC 模拟看门狗监测通道5    */ 
+#define ADC_AWDG_CHANNEL_6                   ADC_AWDGCR_CHN6                                /**< ADC 模拟看门狗监测通道6    */ 
+#define ADC_AWDG_CHANNEL_7                   ADC_AWDGCR_CHN7                                /**< ADC 模拟看门狗监测通道7    */ 
+#define ADC_AWDG_CHANNEL_8                   ADC_AWDGCR_CHN8                                /**< ADC 模拟看门狗监测通道8    */ 
+#define ADC_AWDG_CHANNEL_VBGR                ADC_AWDGCR_CHN8                                /**< ADC 模拟看门狗监测通道VBGR */ 
+#define ADC_AWDG_CHANNEL_ALL                 ADC_AWDGCR_CHN                                 /**< ADC 全部转换通道           */ 
+
+/* ADC内部通道使能 */
+#define ADC_INTERNAL_CHANNEL_VBGREN          ADC_CFG2_VBGREN                                /**< ADC 内部通道VBGR使能 */ 
+
+/* ADC中断源定义:IER中断寄存器 */
+#define ADC_INTERRUPT_EOSAMP                 ADC_IER_EOSAMPIE                               /**< ADC采样结束中断           */
+#define ADC_INTERRUPT_EOC                    ADC_IER_EOCIE                                  /**< ADC单通道转换完成中断     */
+#define ADC_INTERRUPT_EOS                    ADC_IER_EOSIE                                  /**< ADC通道序列转换完成中断   */
+#define ADC_INTERRUPT_OVRN                   ADC_IER_OVRNIE                                 /**< ADC数据溢出中断           */
+#define ADC_INTERRUPT_AWDG                   ADC_IER_AWDGIE                                 /**< ADC模拟看门狗电压监控中断 */
+#define ADC_INTERRUPT_EOCAL                  ADC_IER_EOCALIE                                /**< ADC校准结束中断           */
+
+/* ADC状态定义:ISR状态寄存器 */
+#define ADC_FLAG_EOSAMP                      ADC_ISR_EOSAMP                                 /**< ADC采样结束状态           */
+#define ADC_FLAG_EOC                         ADC_ISR_EOC                                    /**< ADC单通道转换完成状态     */
+#define ADC_FLAG_EOS                         ADC_ISR_EOS                                    /**< ADC通道序列转换完成状态   */
+#define ADC_FLAG_OVRN                        ADC_ISR_OVRN                                   /**< ADC数据溢出状态           */
+#define ADC_FLAG_AWDG                        ADC_ISR_AWDG                                   /**< ADC模拟看门狗监控电压状态 */
+#define ADC_FLAG_EOCAL                       ADC_ISR_EOCAL                                  /**< ADC校准状态               */
+#define ADC_FLAG_ALL                         (ADC_ISR_EOSAMP | ADC_ISR_EOC | ADC_ISR_EOS \
+                                              | ADC_ISR_OVRN | ADC_ISR_AWDG | ADC_ISR_EOCAL)/**< ADC全部状态               */
+                                              
+/* ADC工作模式定义 */
+#define ADC_MODE_INTERVAL                    (0x00000000U)                                  /**< ADC间歇工作模式           */
+#define ADC_MODE_NORMAL                      ADC_CFG3_MODE                                  /**< ADC正常工作模式           */
+                                              
+
+/* VBGR校准参数定义 */  
+#define VBGR_CAL_ADDR                        ((uint16_t *)(BGR_CAL))                        /**< VBGR校准参数存储地址       */
+#define VBGR_CAL_VREF                        (3300U)                                        /**< VBGR校准采用参考电压:3.3V */
+
+/* 等待内部通道VBGR的启动稳定。稳定时间最大值参考CIU32F003的数据手册(tADC_BUF参数) */
+#define ADC_VBGR_CHANNEL_DELAY               (22U)                                          /**< VBGR通道启动稳定时间:22us */
+
+/* ADC使能稳定时间,需等待1us稳定时间 */
+#define ADC_EN_DELAY                         (1U)                                           /**< ADC使能稳定时间 */
+
+/* ADC最大采样值 */
+#define ADC_CONVER_SCALE                     (4095U)                                        /**< ADC最大采样值,用于ADC电压转换计算 */
+
+/** 
+* @} 
+*/
+
+/*-------------------------------------------functions------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @defgroup ADC_External_Functions ADC External Functions
+* @brief    ADC对外函数
+* @{
+*
+*/
+/************************************************************************************************/
+/** 
+* @brief  使能ADC
+* @retval 无
+*/
+__STATIC_INLINE void std_adc_enable(void)
+{
+    ADC->CR = (ADC_CR_ADEN);
+}
+
+/** 
+* @brief  禁止ADC
+* @retval 无
+*/
+__STATIC_INLINE void std_adc_disable(void)
+{
+    ADC->CR = (ADC_CR_ADDIS);
+}
+
+/** 
+* @brief  获取ADC使能位状态
+* @retval uint32_t 返回逻辑表达式的判断结果
+*             @arg 非0: 表示ADC处于使能状态
+*             @arg 0:表示ADC处于禁止状态
+*/
+__STATIC_INLINE uint32_t std_adc_get_enable_status(void)
+{
+    return ((ADC->CR & ADC_CR_ADEN));
+}
+
+/** 
+* @brief  使能ADC校准
+* @note   当ADEN=1,ADC稳定后,且START=0、STOP=0、ADDIS=0,才允许通过软件将CALEN位置1
+* @retval 无
+*/
+__STATIC_INLINE void std_adc_calibration_enable(void)
+{
+    ADC->CR = (ADC_CR_CALEN);
+}
+
+/** 
+* @brief  启动ADC转换 
+* @retval 无
+*/
+__STATIC_INLINE void std_adc_start_conversion(void)
+{
+    ADC->CR = (ADC_CR_START);
+}
+
+/** 
+* @brief  获取ADC工作状态
+* @retval uint32_t 返回ADC工作状态
+*             @arg 非0: 表示ADC正处于工作状态
+*             @arg 0:表示ADC处于未工作状态
+*/
+__STATIC_INLINE uint32_t std_adc_get_conversion_status(void)
+{
+    return ((ADC->CR & ADC_CR_START));
+}
+
+/** 
+* @brief  ADC停止转换
+* @note   仅当START=1且ADDIS=0时,软件将STOP位置1生效
+* @retval 无
+*/
+__STATIC_INLINE void std_adc_stop_conversion(void)
+{
+    ADC->CR = (ADC_CR_STOP);
+}
+
+/** 
+* @brief  ADC中断使能
+* @param  interrupt ADC中断源   
+*             @arg ADC_INTERRUPT_EOSAMP
+*             @arg ADC_INTERRUPT_EOC
+*             @arg ADC_INTERRUPT_EOS
+*             @arg ADC_INTERRUPT_OVRN
+*             @arg ADC_INTERRUPT_AWDG
+*             @arg ADC_INTERRUPT_EOCAL
+* @retval 无
+*/
+__STATIC_INLINE void std_adc_interrupt_enable(uint32_t interrupt)
+{
+    ADC->IER |= (interrupt);
+}
+
+/** 
+* @brief  ADC中断禁止
+* @param  interrupt ADC中断源   
+*             @arg ADC_INTERRUPT_EOSAMP
+*             @arg ADC_INTERRUPT_EOC
+*             @arg ADC_INTERRUPT_EOS
+*             @arg ADC_INTERRUPT_OVRN
+*             @arg ADC_INTERRUPT_AWDG
+*             @arg ADC_INTERRUPT_EOCAL
+* @retval 无
+*/
+__STATIC_INLINE void std_adc_interrupt_disable(uint32_t interrupt)
+{
+    ADC->IER &= (~interrupt);
+}
+
+/** 
+* @brief  获取ADC中断源使能状态
+* @param  interrupt ADC中断源信息 
+*             @arg ADC_INTERRUPT_EOSAMP
+*             @arg ADC_INTERRUPT_EOC
+*             @arg ADC_INTERRUPT_EOS
+*             @arg ADC_INTERRUPT_OVRN
+*             @arg ADC_INTERRUPT_AWDG
+*             @arg ADC_INTERRUPT_EOCAL
+* @retval uint32_t 返回中断源使能状态
+*             @arg 非0: 表示指定的中断使能
+*             @arg 0:表示指定的中断未使能
+*/
+
+__STATIC_INLINE uint32_t std_adc_get_interrupt_enable(uint32_t interrupt)
+{
+    return((ADC->IER & (interrupt)));
+}
+
+/** 
+* @brief  获取ADC标志状态
+* @param  flag 获取ADC标志
+*             @arg ADC_FLAG_EOSAMP
+*             @arg ADC_FLAG_EOC
+*             @arg ADC_FLAG_EOS
+*             @arg ADC_FLAG_OVRN
+*             @arg ADC_FLAG_AWDG
+*             @arg ADC_FLAG_EOCAL
+* @retval uint32_t 返回标志位状态
+*             @arg 非0:表示当前标志为置位状态
+*             @arg 0:表示当前标志为清除状态
+*/
+__STATIC_INLINE uint32_t std_adc_get_flag(uint32_t flag)
+{
+    return((ADC->ISR & (flag)));
+}
+
+/** 
+* @brief  清除ADC标志
+* @param  flag 清除ADC标志
+*             @arg ADC_FLAG_EOSAMP
+*             @arg ADC_FLAG_EOC
+*             @arg ADC_FLAG_EOS
+*             @arg ADC_FLAG_OVRN
+*             @arg ADC_FLAG_AWDG
+*             @arg ADC_FLAG_EOCAL
+* @retval 无
+*/
+__STATIC_INLINE void std_adc_clear_flag(uint32_t flag)
+{
+    ADC->ISR = (flag);
+}
+
+/** 
+* @brief  配置ADC转换模式
+* @param  conversion_mode 转换模式选择
+*             @arg ADC_SINGLE_CONVER_MODE
+*             @arg ADC_CONTINUOUS_CONVER_MODE
+*             @arg ADC_DISCONTINUOUS_CONVER_MODE
+* @note   当START=0时,软件对此位域执行写操作生效
+* @retval 无
+*/
+__STATIC_INLINE void std_adc_conversion_mode_config(uint32_t conversion_mode)
+{
+    MODIFY_REG(ADC->CFG1, ADC_CFG1_CONV_MOD, conversion_mode);
+}
+
+/** 
+* @brief  ADC通道使能
+* @param  channel 通道号选择
+*             @arg ADC_CHANNEL_0
+*             @arg ADC_CHANNEL_1
+*             @arg ...
+*             @arg ADC_CHANNEL_ALL
+* @retval 无
+*/
+__STATIC_INLINE void std_adc_fix_sequence_channel_enable(uint32_t channel)
+{
+    ADC->CHCFG |= (channel);
+}
+
+/** 
+* @brief  ADC通道禁止
+* @param  channel 禁止通道选择
+*             @arg ADC_CHANNEL_0
+*             @arg ADC_CHANNEL_1
+*             @arg ...
+*             @arg ADC_CHANNEL_ALL
+* @retval 无
+*/
+__STATIC_INLINE void std_adc_fix_sequence_channel_disable(uint32_t channel)
+{
+    ADC->CHCFG &= (~channel);
+}
+
+/** 
+* @brief  配置ADC触发源为软件触发
+* @retval 无
+*/
+__STATIC_INLINE void std_adc_trig_sw(void)
+{
+    MODIFY_REG(ADC->CFG1, ADC_CFG1_TRIGEN, ADC_TRIG_SW);
+}
+
+/** 
+* @brief  配置ADC触发信号源和极性
+* @param  trig_edge 触发极性选择
+*             @arg ADC_TRIG_SW(软件触发方式)
+*             @arg ADC_TRIG_HW_EDGE_RISING
+*             @arg ADC_TRIG_HW_EDGE_FALLING
+*             @arg ADC_TRIG_HW_EDGE_BOTH
+* @param  trig_source 外部触发源性选择
+*             @arg ADC_EXTRIG_TIM1_TRGO
+*             @arg ADC_EXTRIG_TIM1_OC4_ADC
+*             @arg ADC_EXTRIG_TIM3_TRGO
+*             @arg ADC_EXTRIG_EXTI7
+* @note   当选择ADC_TRIG_SW(软件触发方式)时,触发源参数无意义。
+* @retval 无
+*/
+__STATIC_INLINE void std_adc_trig_config(uint32_t trig_edge,uint32_t trig_source)
+{
+    MODIFY_REG(ADC->CFG1, (ADC_CFG1_TRIGEN | ADC_CFG1_TRIG_SEL), (trig_edge | trig_source));
+}
+
+/** 
+* @brief  ADC采样时间参数1配置
+* @param  sample_time 采样时间选择
+*           @arg ADC_SAMPTIME_3CYCLES
+*           @arg ...
+*           @arg ADC_SAMPTIME_1919CYCLES 
+* @retval 无
+*/
+__STATIC_INLINE void std_adc_sampt_time_config(uint32_t sample_time)
+{
+    MODIFY_REG(ADC->SAMPT, ADC_SAMPT_SAMPT, sample_time);
+}
+
+/** 
+* @brief  配置ADC_CK时钟分频
+* @param  presc ADC_CK时钟源分频系数
+*             @arg  ADC_CK_DIV1: ADC_CK 不分频
+*             @arg  ADC_CK_DIV2: ADC_CK 2分频
+*             @arg  ADC_CK_DIV3: ADC_CK 3分频
+*             @arg ...
+*             @arg  ADC_CK_DIV64:ADC_CK 64分频
+* @retval 无
+*/
+__STATIC_INLINE void std_adc_clock_config(uint32_t presc)
+{
+    MODIFY_REG(ADC->CFG2, ADC_CFG2_PRESC, presc);
+}
+
+/** 
+* @brief  配置ADC校准系数
+* @param  calibration_factor 参数范围为0x00~0x3F
+* @retval 无
+*/
+__STATIC_INLINE void std_adc_calibration_factor_config(uint32_t calibration_factor)
+{
+    ADC->CALFACT = calibration_factor;
+}
+
+/** 
+* @brief  获取ADC校准系数
+* @retval uint16_t ADC校准系数
+*/
+__STATIC_INLINE uint16_t std_adc_get_calibration_factor(void)
+{
+    return ((uint16_t)(ADC->CALFACT));
+}
+
+/** 
+* @brief  使能ADC等待模式
+* @note   用于避免数据未及时读取,转换溢出
+* @retval 无
+*/
+__STATIC_INLINE void std_adc_wait_mode_enable(void)
+{
+    ADC->CFG1 |= (ADC_CFG1_WAIT_MOD);
+}
+
+/** 
+* @brief  禁止ADC等待模式
+* @retval 无
+*/
+__STATIC_INLINE void std_adc_wait_mode_disable(void)
+{
+    ADC->CFG1 &= (~ADC_CFG1_WAIT_MOD);
+}
+
+/** 
+* @brief  配置通道序列扫描方向
+* @param  dir ADC通道扫描方向
+*             @arg ADC_SCAN_DIR_FORWARD
+*             @arg ADC_SCAN_DIR_BACKWARD
+* @retval 无
+*/
+__STATIC_INLINE void std_adc_scan_direction_config(uint32_t dir)
+{
+    MODIFY_REG(ADC->CFG1, ADC_CFG1_SDIR, dir);
+}
+
+/** 
+* @brief  配置ADC数据溢出管理方式
+* @param  ovrn_mode ADC数据溢出管理方式
+*             @arg ADC_OVRN_MODE_PRESERVED
+*             @arg ADC_OVRN_MODE_OVERWRITTEN
+* @retval 无
+*/
+__STATIC_INLINE void std_adc_ovrn_mode_config(uint32_t ovrn_mode)
+{
+    MODIFY_REG(ADC->CFG1, ADC_CFG1_OVRN_MOD, ovrn_mode);
+}
+
+/** 
+* @brief  ADC内部通道VBGR使能
+* @retval 无
+*/
+__STATIC_INLINE void std_adc_internal_channel_vbgr_enable(void)
+{
+    ADC->CFG2 |= (ADC_INTERNAL_CHANNEL_VBGREN);
+}
+
+/** 
+* @brief  ADC内部通道VBGR禁止
+* @retval 无
+*/
+__STATIC_INLINE void std_adc_internal_channel_vbgr_disable(void)
+{
+    ADC->CFG2 &= (~ADC_INTERNAL_CHANNEL_VBGREN);
+}
+
+/** 
+* @brief  选择ADC模拟看门狗监控通道
+* @param  channel ADC看门狗监控通道选择
+*             @arg ADC_AWDG_CHANNEL_NONE
+*             @arg ADC_AWDG_CHANNEL_0
+*             @arg ...
+*             @arg ADC_AWDG_CHANNEL_ALL
+* @retval 无
+*/
+__STATIC_INLINE void std_adc_analog_watchdog_monit_channel(uint32_t channel)
+{
+    MODIFY_REG(ADC->AWDGCR, ADC_AWDGCR_CHN, channel);
+}
+
+/** 
+* @brief  配置看门狗监控通道电压阈值
+* @param  high_threshold 阈值上限选择范围为 0x000~0xFFF
+* @param  low_threshold  阈值下限选择范围为 0x000~0xFFF
+* @retval 无
+*/
+__STATIC_INLINE void std_adc_analog_watchdog_thresholds_config(uint32_t high_threshold, uint32_t low_threshold)
+{
+    MODIFY_REG(ADC->AWDGTR, (ADC_AWDGTR_AWDG_LT | ADC_AWDGTR_AWDG_HT), (high_threshold << ADC_AWDGTR_AWDG_HT_POS) | (low_threshold));
+}
+
+/** 
+* @brief  获取ADC采样值
+* @retval uint16_t ADC转换值
+*/
+__STATIC_INLINE uint16_t std_adc_get_conversion_value(void)
+{
+    return ((uint16_t)(ADC->DR));
+}
+
+/** 
+* @brief  获取校准后的参考电压值
+* @param  vbgr_sample_data ADC采集BGR的转换值
+* @retval uint32_t 校准后的参考电压值
+*/
+__STATIC_INLINE uint32_t std_adc_calc_vref_voltage(uint16_t vbgr_sample_data)
+{
+    return ((VBGR_CAL_VREF * (*VBGR_CAL_ADDR))/vbgr_sample_data);
+}
+
+/** 
+* @brief  配置ADC工作模式
+* @param  mode_sel ADC工作模式
+*             @arg ADC_MODE_INTERVAL
+*             @arg ADC_MODE_NORMAL
+* @retval 无
+*/
+__STATIC_INLINE void std_adc_mode_config(uint32_t mode_sel)
+{
+    MODIFY_REG(ADC->CFG3, ADC_CFG3_MODE_MASK, mode_sel);
+}
+
+/* ADC去初始化函数 */
+void std_adc_deinit(void);
+
+/**
+* @}
+*/
+
+#ifdef __cplusplus
+}
+#endif
+
+/**
+* @}
+*/
+
+/**
+* @}
+*/
+
+#endif /* CIU32F003_STD_ADC_H */

+ 592 - 0
CIU32F003_LIB/Include/ciu32f003_std_adc.h

@@ -0,0 +1,592 @@
+/************************************************************************************************/
+/**
+* @file               ciu32f003_std_adc.h
+* @author             MCU Ecosystem Development Team
+* @brief              ADC STD库驱动头文件。
+*                     提供ADC相关的STD库操作函数声明、数据类型以及常量的定义。                         
+*
+*
+**************************************************************************************************
+* @attention
+* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
+*
+**************************************************************************************************
+*/
+
+/* 避免头文件重复引用 */
+#ifndef CIU32F003_STD_ADC_H
+#define CIU32F003_STD_ADC_H
+
+/************************************************************************************************/
+/** 
+* @addtogroup CIU32F003_STD_Driver
+* @{
+*/
+
+/**
+* @defgroup ADC ADC
+* @brief 模数转换器的STD库驱动
+* @{
+*/
+/************************************************************************************************/
+
+
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/*------------------------------------------includes--------------------------------------------*/
+#include "ciu32f003_std_common.h"
+
+/*--------------------------------------------define--------------------------------------------*/
+/************************************************************************************************/
+/**
+* @defgroup ADC_Constants  ADC Constants
+* @brief    ADC常量定义及宏定义
+* @{
+*
+*/
+/************************************************************************************************/
+/* ADC_CK时钟分频系数 */
+#define ADC_CK_DIV1                          ADC_CFG2_PRESC_DIV1                            /**< ADC_CK时钟: 不分频 */
+#define ADC_CK_DIV2                          ADC_CFG2_PRESC_DIV2                            /**< ADC_CK时钟: 2分频  */
+#define ADC_CK_DIV3                          ADC_CFG2_PRESC_DIV3                            /**< ADC_CK时钟: 3分频  */
+#define ADC_CK_DIV4                          ADC_CFG2_PRESC_DIV4                            /**< ADC_CK时钟: 4分频  */
+#define ADC_CK_DIV8                          ADC_CFG2_PRESC_DIV8                            /**< ADC_CK时钟: 8分频  */
+#define ADC_CK_DIV16                         ADC_CFG2_PRESC_DIV16                           /**< ADC_CK时钟: 16分频 */
+#define ADC_CK_DIV32                         ADC_CFG2_PRESC_DIV32                           /**< ADC_CK时钟: 32分频 */
+#define ADC_CK_DIV64                         ADC_CFG2_PRESC_DIV64                           /**< ADC_CK时钟: 64分频 */
+
+/* ADC转换模式 */
+#define ADC_SINGLE_CONVER_MODE               ADC_CFG1_CONV_MOD_SINGLE                       /**< ADC单次扫描转换 */
+#define ADC_CONTINUOUS_CONVER_MODE           ADC_CFG1_CONV_MOD_CONTINUOUS                   /**< ADC循环扫描转换 */
+#define ADC_DISCONTINUOUS_CONVER_MODE        ADC_CFG1_CONV_MOD_DISCONTINUOUS                /**< ADC循环间断转换 */
+
+/* ADC通道扫描方向 */
+#define ADC_SCAN_DIR_FORWARD                 (0x00000000U)                                  /**< ADC转换通道: 正向扫描 */
+#define ADC_SCAN_DIR_BACKWARD                ADC_CFG1_SDIR                                  /**< ADC转换通道: 反向扫描 */
+
+/* ADC转换触发模式: 触发沿 */
+#define ADC_TRIG_SW                          ADC_CFG1_TRIGEN_SW                             /**< 软件触发方式                 */
+#define ADC_TRIG_HW_EDGE_RISING              ADC_CFG1_TRIGEN_HW_EDGE_RISING                 /**< 外部硬件触发使能: 上升沿触发 */
+#define ADC_TRIG_HW_EDGE_FALLING             ADC_CFG1_TRIGEN_HW_EDGE_FALLING                /**< 外部硬件触发使能: 下降沿触发 */
+#define ADC_TRIG_HW_EDGE_BOTH                ADC_CFG1_TRIGEN_HW_EDGE_BOTH                   /**< 外部硬件触发使能: 双沿触发   */
+
+/*  ADC转换触发源 */
+#define ADC_EXTRIG_TIM1_TRGO                 ADC_CFG1_TRIG_TIM1_TRGO                        /**< ADC触发源: TIM1 TRGO      */
+#define ADC_EXTRIG_TIM1_OC4_ADC              ADC_CFG1_TRIG_TIM1_OC4_ADC                     /**< ADC触发源: TIM1 OC4       */
+#define ADC_EXTRIG_TIM3_TRGO                 ADC_CFG1_TRIG_TIM3_TRGO                        /**< ADC触发源: TIM3 TRGO      */
+#define ADC_EXTRIG_EXTI7                     ADC_CFG1_TRIG_EXTI7                            /**< ADC触发源: 外部中断EXTI_7 */
+
+/* ADC转换溢出后ADC_DR寄存器数据存储方式 */
+#define ADC_OVRN_MODE_PRESERVED              (0x00000000U)                                  /**< ADC_DR寄存器保留原数据 */
+#define ADC_OVRN_MODE_OVERWRITTEN            ADC_CFG1_OVRN_MOD                              /**< ADC_DR寄存器覆盖新数据 */
+
+/* ADC采样时间参数 */
+#define ADC_SAMPTIME_3CYCLES                 ADC_SAMPT_SAMPT_3CYCLES                        /**< 采样时间为3个时钟周期    */
+#define ADC_SAMPTIME_7CYCLES                 ADC_SAMPT_SAMPT_7CYCLES                        /**< 采样时间为7个时钟周期    */
+#define ADC_SAMPTIME_12CYCLES                ADC_SAMPT_SAMPT_12CYCLES                       /**< 采样时间为12个时钟周期   */
+#define ADC_SAMPTIME_19CYCLES                ADC_SAMPT_SAMPT_19CYCLES                       /**< 采样时间为19个时钟周期   */
+#define ADC_SAMPTIME_39CYCLES                ADC_SAMPT_SAMPT_39CYCLES                       /**< 采样时间为39个时钟周期   */
+#define ADC_SAMPTIME_79CYCLES                ADC_SAMPT_SAMPT_79CYCLES                       /**< 采样时间为79个时钟周期   */
+#define ADC_SAMPTIME_119CYCLES               ADC_SAMPT_SAMPT_119CYCLES                      /**< 采样时间为119个时钟周期  */
+#define ADC_SAMPTIME_159CYCLES               ADC_SAMPT_SAMPT_159CYCLES                      /**< 采样时间为159个时钟周期  */
+#define ADC_SAMPTIME_239CYCLES               ADC_SAMPT_SAMPT_239CYCLES                      /**< 采样时间为239个时钟周期  */
+#define ADC_SAMPTIME_319CYCLES               ADC_SAMPT_SAMPT_319CYCLES                      /**< 采样时间为319个时钟周期  */
+#define ADC_SAMPTIME_479CYCLES               ADC_SAMPT_SAMPT_479CYCLES                      /**< 采样时间为479个时钟周期  */
+#define ADC_SAMPTIME_639CYCLES               ADC_SAMPT_SAMPT_639CYCLES                      /**< 采样时间为639个时钟周期  */
+#define ADC_SAMPTIME_959CYCLES               ADC_SAMPT_SAMPT_959CYCLES                      /**< 采样时间为959个时钟周期  */
+#define ADC_SAMPTIME_1279CYCLES              ADC_SAMPT_SAMPT_1279CYCLES                     /**< 采样时间为1279个时钟周期 */
+#define ADC_SAMPTIME_1919CYCLES              ADC_SAMPT_SAMPT_1919CYCLES                     /**< 采样时间为1919个时钟周期 */
+
+/* ADC转换通道 */
+#define ADC_CHANNEL_NONE                     (0x00000000U)                                  /**< ADC 转换通道清除     */ 
+#define ADC_CHANNEL_0                        ADC_CHCFG_CHN0                                 /**< ADC 转换通道IN0      */
+#define ADC_CHANNEL_1                        ADC_CHCFG_CHN1                                 /**< ADC 转换通道IN1      */
+#define ADC_CHANNEL_2                        ADC_CHCFG_CHN2                                 /**< ADC 转换通道IN2      */
+#define ADC_CHANNEL_3                        ADC_CHCFG_CHN3                                 /**< ADC 转换通道IN3      */
+#define ADC_CHANNEL_4                        ADC_CHCFG_CHN4                                 /**< ADC 转换通道IN4      */
+#define ADC_CHANNEL_5                        ADC_CHCFG_CHN5                                 /**< ADC 转换通道IN5      */
+#define ADC_CHANNEL_6                        ADC_CHCFG_CHN6                                 /**< ADC 转换通道IN6      */
+#define ADC_CHANNEL_7                        ADC_CHCFG_CHN7                                 /**< ADC 转换通道IN7      */
+#define ADC_CHANNEL_8                        ADC_CHCFG_CHN8                                 /**< ADC 转换通道IN8      */
+#define ADC_CHANNEL_VBGR                     ADC_CHCFG_CHN8                                 /**< ADC 内部转换通道VBGR */
+#define ADC_CHANNEL_ALL                      ADC_CHCFG_CHN                                  /**< ADC 全部转换通道     */ 
+
+/* ADC模拟看门狗监测通道 */
+#define ADC_AWDG_CHANNEL_NONE                (0x00000000U)                                  /**< ADC 模拟看门狗监测通道清除 */ 
+#define ADC_AWDG_CHANNEL_0                   ADC_AWDGCR_CHN0                                /**< ADC 模拟看门狗监测通道0    */ 
+#define ADC_AWDG_CHANNEL_1                   ADC_AWDGCR_CHN1                                /**< ADC 模拟看门狗监测通道1    */ 
+#define ADC_AWDG_CHANNEL_2                   ADC_AWDGCR_CHN2                                /**< ADC 模拟看门狗监测通道2    */ 
+#define ADC_AWDG_CHANNEL_3                   ADC_AWDGCR_CHN3                                /**< ADC 模拟看门狗监测通道3    */ 
+#define ADC_AWDG_CHANNEL_4                   ADC_AWDGCR_CHN4                                /**< ADC 模拟看门狗监测通道4    */ 
+#define ADC_AWDG_CHANNEL_5                   ADC_AWDGCR_CHN5                                /**< ADC 模拟看门狗监测通道5    */ 
+#define ADC_AWDG_CHANNEL_6                   ADC_AWDGCR_CHN6                                /**< ADC 模拟看门狗监测通道6    */ 
+#define ADC_AWDG_CHANNEL_7                   ADC_AWDGCR_CHN7                                /**< ADC 模拟看门狗监测通道7    */ 
+#define ADC_AWDG_CHANNEL_8                   ADC_AWDGCR_CHN8                                /**< ADC 模拟看门狗监测通道8    */ 
+#define ADC_AWDG_CHANNEL_VBGR                ADC_AWDGCR_CHN8                                /**< ADC 模拟看门狗监测通道VBGR */ 
+#define ADC_AWDG_CHANNEL_ALL                 ADC_AWDGCR_CHN                                 /**< ADC 全部转换通道           */ 
+
+/* ADC内部通道使能 */
+#define ADC_INTERNAL_CHANNEL_VBGREN          ADC_CFG2_VBGREN                                /**< ADC 内部通道VBGR使能 */ 
+
+/* ADC中断源定义:IER中断寄存器 */
+#define ADC_INTERRUPT_EOSAMP                 ADC_IER_EOSAMPIE                               /**< ADC采样结束中断           */
+#define ADC_INTERRUPT_EOC                    ADC_IER_EOCIE                                  /**< ADC单通道转换完成中断     */
+#define ADC_INTERRUPT_EOS                    ADC_IER_EOSIE                                  /**< ADC通道序列转换完成中断   */
+#define ADC_INTERRUPT_OVRN                   ADC_IER_OVRNIE                                 /**< ADC数据溢出中断           */
+#define ADC_INTERRUPT_AWDG                   ADC_IER_AWDGIE                                 /**< ADC模拟看门狗电压监控中断 */
+#define ADC_INTERRUPT_EOCAL                  ADC_IER_EOCALIE                                /**< ADC校准结束中断           */
+
+/* ADC状态定义:ISR状态寄存器 */
+#define ADC_FLAG_EOSAMP                      ADC_ISR_EOSAMP                                 /**< ADC采样结束状态           */
+#define ADC_FLAG_EOC                         ADC_ISR_EOC                                    /**< ADC单通道转换完成状态     */
+#define ADC_FLAG_EOS                         ADC_ISR_EOS                                    /**< ADC通道序列转换完成状态   */
+#define ADC_FLAG_OVRN                        ADC_ISR_OVRN                                   /**< ADC数据溢出状态           */
+#define ADC_FLAG_AWDG                        ADC_ISR_AWDG                                   /**< ADC模拟看门狗监控电压状态 */
+#define ADC_FLAG_EOCAL                       ADC_ISR_EOCAL                                  /**< ADC校准状态               */
+#define ADC_FLAG_ALL                         (ADC_ISR_EOSAMP | ADC_ISR_EOC | ADC_ISR_EOS \
+                                              | ADC_ISR_OVRN | ADC_ISR_AWDG | ADC_ISR_EOCAL)/**< ADC全部状态               */
+                                              
+/* ADC工作模式定义 */
+#define ADC_MODE_INTERVAL                    (0x00000000U)                                  /**< ADC间歇工作模式           */
+#define ADC_MODE_NORMAL                      ADC_CFG3_MODE                                  /**< ADC正常工作模式           */
+                                              
+
+/* VBGR校准参数定义 */  
+#define VBGR_CAL_ADDR                        ((uint16_t *)(BGR_CAL))                        /**< VBGR校准参数存储地址       */
+#define VBGR_CAL_VREF                        (3300U)                                        /**< VBGR校准采用参考电压:3.3V */
+
+/* 等待内部通道VBGR的启动稳定。稳定时间最大值参考CIU32F003的数据手册(tADC_BUF参数) */
+#define ADC_VBGR_CHANNEL_DELAY               (22U)                                          /**< VBGR通道启动稳定时间:22us */
+
+/* ADC使能稳定时间,需等待1us稳定时间 */
+#define ADC_EN_DELAY                         (1U)                                           /**< ADC使能稳定时间 */
+
+/* ADC最大采样值 */
+#define ADC_CONVER_SCALE                     (4095U)                                        /**< ADC最大采样值,用于ADC电压转换计算 */
+
+/** 
+* @} 
+*/
+
+/*-------------------------------------------functions------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @defgroup ADC_External_Functions ADC External Functions
+* @brief    ADC对外函数
+* @{
+*
+*/
+/************************************************************************************************/
+/** 
+* @brief  使能ADC
+* @retval 无
+*/
+__STATIC_INLINE void std_adc_enable(void)
+{
+    ADC->CR = (ADC_CR_ADEN);
+}
+
+/** 
+* @brief  禁止ADC
+* @retval 无
+*/
+__STATIC_INLINE void std_adc_disable(void)
+{
+    ADC->CR = (ADC_CR_ADDIS);
+}
+
+/** 
+* @brief  获取ADC使能位状态
+* @retval uint32_t 返回逻辑表达式的判断结果
+*             @arg 非0: 表示ADC处于使能状态
+*             @arg 0:表示ADC处于禁止状态
+*/
+__STATIC_INLINE uint32_t std_adc_get_enable_status(void)
+{
+    return ((ADC->CR & ADC_CR_ADEN));
+}
+
+/** 
+* @brief  使能ADC校准
+* @note   当ADEN=1,ADC稳定后,且START=0、STOP=0、ADDIS=0,才允许通过软件将CALEN位置1
+* @retval 无
+*/
+__STATIC_INLINE void std_adc_calibration_enable(void)
+{
+    ADC->CR = (ADC_CR_CALEN);
+}
+
+/** 
+* @brief  启动ADC转换 
+* @retval 无
+*/
+__STATIC_INLINE void std_adc_start_conversion(void)
+{
+    ADC->CR = (ADC_CR_START);
+}
+
+/** 
+* @brief  获取ADC工作状态
+* @retval uint32_t 返回ADC工作状态
+*             @arg 非0: 表示ADC正处于工作状态
+*             @arg 0:表示ADC处于未工作状态
+*/
+__STATIC_INLINE uint32_t std_adc_get_conversion_status(void)
+{
+    return ((ADC->CR & ADC_CR_START));
+}
+
+/** 
+* @brief  ADC停止转换
+* @note   仅当START=1且ADDIS=0时,软件将STOP位置1生效
+* @retval 无
+*/
+__STATIC_INLINE void std_adc_stop_conversion(void)
+{
+    ADC->CR = (ADC_CR_STOP);
+}
+
+/** 
+* @brief  ADC中断使能
+* @param  interrupt ADC中断源   
+*             @arg ADC_INTERRUPT_EOSAMP
+*             @arg ADC_INTERRUPT_EOC
+*             @arg ADC_INTERRUPT_EOS
+*             @arg ADC_INTERRUPT_OVRN
+*             @arg ADC_INTERRUPT_AWDG
+*             @arg ADC_INTERRUPT_EOCAL
+* @retval 无
+*/
+__STATIC_INLINE void std_adc_interrupt_enable(uint32_t interrupt)
+{
+    ADC->IER |= (interrupt);
+}
+
+/** 
+* @brief  ADC中断禁止
+* @param  interrupt ADC中断源   
+*             @arg ADC_INTERRUPT_EOSAMP
+*             @arg ADC_INTERRUPT_EOC
+*             @arg ADC_INTERRUPT_EOS
+*             @arg ADC_INTERRUPT_OVRN
+*             @arg ADC_INTERRUPT_AWDG
+*             @arg ADC_INTERRUPT_EOCAL
+* @retval 无
+*/
+__STATIC_INLINE void std_adc_interrupt_disable(uint32_t interrupt)
+{
+    ADC->IER &= (~interrupt);
+}
+
+/** 
+* @brief  获取ADC中断源使能状态
+* @param  interrupt ADC中断源信息 
+*             @arg ADC_INTERRUPT_EOSAMP
+*             @arg ADC_INTERRUPT_EOC
+*             @arg ADC_INTERRUPT_EOS
+*             @arg ADC_INTERRUPT_OVRN
+*             @arg ADC_INTERRUPT_AWDG
+*             @arg ADC_INTERRUPT_EOCAL
+* @retval uint32_t 返回中断源使能状态
+*             @arg 非0: 表示指定的中断使能
+*             @arg 0:表示指定的中断未使能
+*/
+
+__STATIC_INLINE uint32_t std_adc_get_interrupt_enable(uint32_t interrupt)
+{
+    return((ADC->IER & (interrupt)));
+}
+
+/** 
+* @brief  获取ADC标志状态
+* @param  flag 获取ADC标志
+*             @arg ADC_FLAG_EOSAMP
+*             @arg ADC_FLAG_EOC
+*             @arg ADC_FLAG_EOS
+*             @arg ADC_FLAG_OVRN
+*             @arg ADC_FLAG_AWDG
+*             @arg ADC_FLAG_EOCAL
+* @retval uint32_t 返回标志位状态
+*             @arg 非0:表示当前标志为置位状态
+*             @arg 0:表示当前标志为清除状态
+*/
+__STATIC_INLINE uint32_t std_adc_get_flag(uint32_t flag)
+{
+    return((ADC->ISR & (flag)));
+}
+
+/** 
+* @brief  清除ADC标志
+* @param  flag 清除ADC标志
+*             @arg ADC_FLAG_EOSAMP
+*             @arg ADC_FLAG_EOC
+*             @arg ADC_FLAG_EOS
+*             @arg ADC_FLAG_OVRN
+*             @arg ADC_FLAG_AWDG
+*             @arg ADC_FLAG_EOCAL
+* @retval 无
+*/
+__STATIC_INLINE void std_adc_clear_flag(uint32_t flag)
+{
+    ADC->ISR = (flag);
+}
+
+/** 
+* @brief  配置ADC转换模式
+* @param  conversion_mode 转换模式选择
+*             @arg ADC_SINGLE_CONVER_MODE
+*             @arg ADC_CONTINUOUS_CONVER_MODE
+*             @arg ADC_DISCONTINUOUS_CONVER_MODE
+* @note   当START=0时,软件对此位域执行写操作生效
+* @retval 无
+*/
+__STATIC_INLINE void std_adc_conversion_mode_config(uint32_t conversion_mode)
+{
+    MODIFY_REG(ADC->CFG1, ADC_CFG1_CONV_MOD, conversion_mode);
+}
+
+/** 
+* @brief  ADC通道使能
+* @param  channel 通道号选择
+*             @arg ADC_CHANNEL_0
+*             @arg ADC_CHANNEL_1
+*             @arg ...
+*             @arg ADC_CHANNEL_ALL
+* @retval 无
+*/
+__STATIC_INLINE void std_adc_fix_sequence_channel_enable(uint32_t channel)
+{
+    ADC->CHCFG |= (channel);
+}
+
+/** 
+* @brief  ADC通道禁止
+* @param  channel 禁止通道选择
+*             @arg ADC_CHANNEL_0
+*             @arg ADC_CHANNEL_1
+*             @arg ...
+*             @arg ADC_CHANNEL_ALL
+* @retval 无
+*/
+__STATIC_INLINE void std_adc_fix_sequence_channel_disable(uint32_t channel)
+{
+    ADC->CHCFG &= (~channel);
+}
+
+/** 
+* @brief  配置ADC触发源为软件触发
+* @retval 无
+*/
+__STATIC_INLINE void std_adc_trig_sw(void)
+{
+    MODIFY_REG(ADC->CFG1, ADC_CFG1_TRIGEN, ADC_TRIG_SW);
+}
+
+/** 
+* @brief  配置ADC触发信号源和极性
+* @param  trig_edge 触发极性选择
+*             @arg ADC_TRIG_SW(软件触发方式)
+*             @arg ADC_TRIG_HW_EDGE_RISING
+*             @arg ADC_TRIG_HW_EDGE_FALLING
+*             @arg ADC_TRIG_HW_EDGE_BOTH
+* @param  trig_source 外部触发源性选择
+*             @arg ADC_EXTRIG_TIM1_TRGO
+*             @arg ADC_EXTRIG_TIM1_OC4_ADC
+*             @arg ADC_EXTRIG_TIM3_TRGO
+*             @arg ADC_EXTRIG_EXTI7
+* @note   当选择ADC_TRIG_SW(软件触发方式)时,触发源参数无意义。
+* @retval 无
+*/
+__STATIC_INLINE void std_adc_trig_config(uint32_t trig_edge,uint32_t trig_source)
+{
+    MODIFY_REG(ADC->CFG1, (ADC_CFG1_TRIGEN | ADC_CFG1_TRIG_SEL), (trig_edge | trig_source));
+}
+
+/** 
+* @brief  ADC采样时间参数1配置
+* @param  sample_time 采样时间选择
+*           @arg ADC_SAMPTIME_3CYCLES
+*           @arg ...
+*           @arg ADC_SAMPTIME_1919CYCLES 
+* @retval 无
+*/
+__STATIC_INLINE void std_adc_sampt_time_config(uint32_t sample_time)
+{
+    MODIFY_REG(ADC->SAMPT, ADC_SAMPT_SAMPT, sample_time);
+}
+
+/** 
+* @brief  配置ADC_CK时钟分频
+* @param  presc ADC_CK时钟源分频系数
+*             @arg  ADC_CK_DIV1: ADC_CK 不分频
+*             @arg  ADC_CK_DIV2: ADC_CK 2分频
+*             @arg  ADC_CK_DIV3: ADC_CK 3分频
+*             @arg ...
+*             @arg  ADC_CK_DIV64:ADC_CK 64分频
+* @retval 无
+*/
+__STATIC_INLINE void std_adc_clock_config(uint32_t presc)
+{
+    MODIFY_REG(ADC->CFG2, ADC_CFG2_PRESC, presc);
+}
+
+/** 
+* @brief  配置ADC校准系数
+* @param  calibration_factor 参数范围为0x00~0x3F
+* @retval 无
+*/
+__STATIC_INLINE void std_adc_calibration_factor_config(uint32_t calibration_factor)
+{
+    ADC->CALFACT = calibration_factor;
+}
+
+/** 
+* @brief  获取ADC校准系数
+* @retval uint16_t ADC校准系数
+*/
+__STATIC_INLINE uint16_t std_adc_get_calibration_factor(void)
+{
+    return ((uint16_t)(ADC->CALFACT));
+}
+
+/** 
+* @brief  使能ADC等待模式
+* @note   用于避免数据未及时读取,转换溢出
+* @retval 无
+*/
+__STATIC_INLINE void std_adc_wait_mode_enable(void)
+{
+    ADC->CFG1 |= (ADC_CFG1_WAIT_MOD);
+}
+
+/** 
+* @brief  禁止ADC等待模式
+* @retval 无
+*/
+__STATIC_INLINE void std_adc_wait_mode_disable(void)
+{
+    ADC->CFG1 &= (~ADC_CFG1_WAIT_MOD);
+}
+
+/** 
+* @brief  配置通道序列扫描方向
+* @param  dir ADC通道扫描方向
+*             @arg ADC_SCAN_DIR_FORWARD
+*             @arg ADC_SCAN_DIR_BACKWARD
+* @retval 无
+*/
+__STATIC_INLINE void std_adc_scan_direction_config(uint32_t dir)
+{
+    MODIFY_REG(ADC->CFG1, ADC_CFG1_SDIR, dir);
+}
+
+/** 
+* @brief  配置ADC数据溢出管理方式
+* @param  ovrn_mode ADC数据溢出管理方式
+*             @arg ADC_OVRN_MODE_PRESERVED
+*             @arg ADC_OVRN_MODE_OVERWRITTEN
+* @retval 无
+*/
+__STATIC_INLINE void std_adc_ovrn_mode_config(uint32_t ovrn_mode)
+{
+    MODIFY_REG(ADC->CFG1, ADC_CFG1_OVRN_MOD, ovrn_mode);
+}
+
+/** 
+* @brief  ADC内部通道VBGR使能
+* @retval 无
+*/
+__STATIC_INLINE void std_adc_internal_channel_vbgr_enable(void)
+{
+    ADC->CFG2 |= (ADC_INTERNAL_CHANNEL_VBGREN);
+}
+
+/** 
+* @brief  ADC内部通道VBGR禁止
+* @retval 无
+*/
+__STATIC_INLINE void std_adc_internal_channel_vbgr_disable(void)
+{
+    ADC->CFG2 &= (~ADC_INTERNAL_CHANNEL_VBGREN);
+}
+
+/** 
+* @brief  选择ADC模拟看门狗监控通道
+* @param  channel ADC看门狗监控通道选择
+*             @arg ADC_AWDG_CHANNEL_NONE
+*             @arg ADC_AWDG_CHANNEL_0
+*             @arg ...
+*             @arg ADC_AWDG_CHANNEL_ALL
+* @retval 无
+*/
+__STATIC_INLINE void std_adc_analog_watchdog_monit_channel(uint32_t channel)
+{
+    MODIFY_REG(ADC->AWDGCR, ADC_AWDGCR_CHN, channel);
+}
+
+/** 
+* @brief  配置看门狗监控通道电压阈值
+* @param  high_threshold 阈值上限选择范围为 0x000~0xFFF
+* @param  low_threshold  阈值下限选择范围为 0x000~0xFFF
+* @retval 无
+*/
+__STATIC_INLINE void std_adc_analog_watchdog_thresholds_config(uint32_t high_threshold, uint32_t low_threshold)
+{
+    MODIFY_REG(ADC->AWDGTR, (ADC_AWDGTR_AWDG_LT | ADC_AWDGTR_AWDG_HT), (high_threshold << ADC_AWDGTR_AWDG_HT_POS) | (low_threshold));
+}
+
+/** 
+* @brief  获取ADC采样值
+* @retval uint16_t ADC转换值
+*/
+__STATIC_INLINE uint16_t std_adc_get_conversion_value(void)
+{
+    return ((uint16_t)(ADC->DR));
+}
+
+/** 
+* @brief  获取校准后的参考电压值
+* @param  vbgr_sample_data ADC采集BGR的转换值
+* @retval uint32_t 校准后的参考电压值
+*/
+__STATIC_INLINE uint32_t std_adc_calc_vref_voltage(uint16_t vbgr_sample_data)
+{
+    return ((VBGR_CAL_VREF * (*VBGR_CAL_ADDR))/vbgr_sample_data);
+}
+
+/** 
+* @brief  配置ADC工作模式
+* @param  mode_sel ADC工作模式
+*             @arg ADC_MODE_INTERVAL
+*             @arg ADC_MODE_NORMAL
+* @retval 无
+*/
+__STATIC_INLINE void std_adc_mode_config(uint32_t mode_sel)
+{
+    MODIFY_REG(ADC->CFG3, ADC_CFG3_MODE_MASK, mode_sel);
+}
+
+/* ADC去初始化函数 */
+void std_adc_deinit(void);
+
+/**
+* @}
+*/
+
+#ifdef __cplusplus
+}
+#endif
+
+/**
+* @}
+*/
+
+/**
+* @}
+*/
+
+#endif /* CIU32F003_STD_ADC_H */

+ 135 - 0
CIU32F003_LIB/Include/ciu32f003_std_common(1).h

@@ -0,0 +1,135 @@
+/************************************************************************************************/
+/**
+* @file               ciu32f003_std_common.h
+* @author             MCU Ecosystem Development Team
+* @brief              STD库通用的相关定义。  
+*                     
+*
+**************************************************************************************************
+* @attention
+* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
+*
+**************************************************************************************************
+*/
+
+/* 避免头文件重复引用 */
+#ifndef CIU32F003_STD_COMMON_H
+#define CIU32F003_STD_COMMON_H
+
+/************************************************************************************************/
+/**
+* @addtogroup CIU32F003_STD_Driver
+* @{
+*/
+
+/**
+* @addtogroup STD
+* @{
+*
+*/
+/************************************************************************************************/ 
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+       
+/*-----------------------------------------type define------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @defgroup STD_Types STD Types
+* @brief STD库通用数据类型定义
+* @{
+*
+*/
+/************************************************************************************************/ 
+/**
+* @brief  bit位状态定义
+*/
+typedef enum
+{
+    RESET = 0,
+    SET = !RESET
+}bit_status_t;
+
+
+/**
+* @brief  STD库API返回值类型定义
+*/
+typedef enum
+{
+    STD_OK                   = 0x00U,
+    STD_ERR                  = 0x01U,
+    STD_ERR_PARAM            = 0x02U,
+    STD_ERR_BUSY             = 0x03U,
+    STD_ERR_TIMEOUT          = 0x04U
+} std_status_t;
+
+
+/**
+* @}
+*/
+  
+
+/*--------------------------------------------define--------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @addtogroup STD_Constants 
+* @{
+*
+*/
+/************************************************************************************************/ 
+
+/* 避免编译警告 */
+#define UNUSED(X) (void)X      
+
+
+/* 编译器差异化定义 */
+#if  defined ( __GNUC__ )
+    #ifndef __weak
+        #define __weak   __attribute__((weak))
+    #endif /* __weak */
+    
+    #ifndef __packed
+        #define __packed __attribute__((__packed__))
+    #endif /* __packed */
+#endif /* __GNUC__ */
+
+
+/* bit operations */
+#define MODIFY_REG(REG, CLEARMASK, SETMASK)  ((REG) = (((REG) & (~(CLEARMASK))) | (SETMASK)))
+
+/** 
+* @} 
+*/
+                                    
+                                    
+/*------------------------------------------includes--------------------------------------------*/
+#include <stddef.h>
+#include <stdbool.h>
+#include "ciu32f003.h"
+#include "ciu32f003_std.h"
+
+
+/*-------------------------------------------functions------------------------------------------*/
+
+                                    
+#ifdef __cplusplus
+}
+#endif
+
+
+/**
+* @} 
+*/  
+
+/**
+* @}
+*/
+
+
+#endif /* CIU32F003_STD_COMMON_H */

+ 135 - 0
CIU32F003_LIB/Include/ciu32f003_std_common(2).h

@@ -0,0 +1,135 @@
+/************************************************************************************************/
+/**
+* @file               ciu32f003_std_common.h
+* @author             MCU Ecosystem Development Team
+* @brief              STD库通用的相关定义。  
+*                     
+*
+**************************************************************************************************
+* @attention
+* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
+*
+**************************************************************************************************
+*/
+
+/* 避免头文件重复引用 */
+#ifndef CIU32F003_STD_COMMON_H
+#define CIU32F003_STD_COMMON_H
+
+/************************************************************************************************/
+/**
+* @addtogroup CIU32F003_STD_Driver
+* @{
+*/
+
+/**
+* @addtogroup STD
+* @{
+*
+*/
+/************************************************************************************************/ 
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+       
+/*-----------------------------------------type define------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @defgroup STD_Types STD Types
+* @brief STD库通用数据类型定义
+* @{
+*
+*/
+/************************************************************************************************/ 
+/**
+* @brief  bit位状态定义
+*/
+typedef enum
+{
+    RESET = 0,
+    SET = !RESET
+}bit_status_t;
+
+
+/**
+* @brief  STD库API返回值类型定义
+*/
+typedef enum
+{
+    STD_OK                   = 0x00U,
+    STD_ERR                  = 0x01U,
+    STD_ERR_PARAM            = 0x02U,
+    STD_ERR_BUSY             = 0x03U,
+    STD_ERR_TIMEOUT          = 0x04U
+} std_status_t;
+
+
+/**
+* @}
+*/
+  
+
+/*--------------------------------------------define--------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @addtogroup STD_Constants 
+* @{
+*
+*/
+/************************************************************************************************/ 
+
+/* 避免编译警告 */
+#define UNUSED(X) (void)X      
+
+
+/* 编译器差异化定义 */
+#if  defined ( __GNUC__ )
+    #ifndef __weak
+        #define __weak   __attribute__((weak))
+    #endif /* __weak */
+    
+    #ifndef __packed
+        #define __packed __attribute__((__packed__))
+    #endif /* __packed */
+#endif /* __GNUC__ */
+
+
+/* bit operations */
+#define MODIFY_REG(REG, CLEARMASK, SETMASK)  ((REG) = (((REG) & (~(CLEARMASK))) | (SETMASK)))
+
+/** 
+* @} 
+*/
+                                    
+                                    
+/*------------------------------------------includes--------------------------------------------*/
+#include <stddef.h>
+#include <stdbool.h>
+#include "ciu32f003.h"
+#include "ciu32f003_std.h"
+
+
+/*-------------------------------------------functions------------------------------------------*/
+
+                                    
+#ifdef __cplusplus
+}
+#endif
+
+
+/**
+* @} 
+*/  
+
+/**
+* @}
+*/
+
+
+#endif /* CIU32F003_STD_COMMON_H */

+ 135 - 0
CIU32F003_LIB/Include/ciu32f003_std_common(3).h

@@ -0,0 +1,135 @@
+/************************************************************************************************/
+/**
+* @file               ciu32f003_std_common.h
+* @author             MCU Ecosystem Development Team
+* @brief              STD库通用的相关定义。  
+*                     
+*
+**************************************************************************************************
+* @attention
+* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
+*
+**************************************************************************************************
+*/
+
+/* 避免头文件重复引用 */
+#ifndef CIU32F003_STD_COMMON_H
+#define CIU32F003_STD_COMMON_H
+
+/************************************************************************************************/
+/**
+* @addtogroup CIU32F003_STD_Driver
+* @{
+*/
+
+/**
+* @addtogroup STD
+* @{
+*
+*/
+/************************************************************************************************/ 
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+       
+/*-----------------------------------------type define------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @defgroup STD_Types STD Types
+* @brief STD库通用数据类型定义
+* @{
+*
+*/
+/************************************************************************************************/ 
+/**
+* @brief  bit位状态定义
+*/
+typedef enum
+{
+    RESET = 0,
+    SET = !RESET
+}bit_status_t;
+
+
+/**
+* @brief  STD库API返回值类型定义
+*/
+typedef enum
+{
+    STD_OK                   = 0x00U,
+    STD_ERR                  = 0x01U,
+    STD_ERR_PARAM            = 0x02U,
+    STD_ERR_BUSY             = 0x03U,
+    STD_ERR_TIMEOUT          = 0x04U
+} std_status_t;
+
+
+/**
+* @}
+*/
+  
+
+/*--------------------------------------------define--------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @addtogroup STD_Constants 
+* @{
+*
+*/
+/************************************************************************************************/ 
+
+/* 避免编译警告 */
+#define UNUSED(X) (void)X      
+
+
+/* 编译器差异化定义 */
+#if  defined ( __GNUC__ )
+    #ifndef __weak
+        #define __weak   __attribute__((weak))
+    #endif /* __weak */
+    
+    #ifndef __packed
+        #define __packed __attribute__((__packed__))
+    #endif /* __packed */
+#endif /* __GNUC__ */
+
+
+/* bit operations */
+#define MODIFY_REG(REG, CLEARMASK, SETMASK)  ((REG) = (((REG) & (~(CLEARMASK))) | (SETMASK)))
+
+/** 
+* @} 
+*/
+                                    
+                                    
+/*------------------------------------------includes--------------------------------------------*/
+#include <stddef.h>
+#include <stdbool.h>
+#include "ciu32f003.h"
+#include "ciu32f003_std.h"
+
+
+/*-------------------------------------------functions------------------------------------------*/
+
+                                    
+#ifdef __cplusplus
+}
+#endif
+
+
+/**
+* @} 
+*/  
+
+/**
+* @}
+*/
+
+
+#endif /* CIU32F003_STD_COMMON_H */

+ 135 - 0
CIU32F003_LIB/Include/ciu32f003_std_common.h

@@ -0,0 +1,135 @@
+/************************************************************************************************/
+/**
+* @file               ciu32f003_std_common.h
+* @author             MCU Ecosystem Development Team
+* @brief              STD库通用的相关定义。  
+*                     
+*
+**************************************************************************************************
+* @attention
+* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
+*
+**************************************************************************************************
+*/
+
+/* 避免头文件重复引用 */
+#ifndef CIU32F003_STD_COMMON_H
+#define CIU32F003_STD_COMMON_H
+
+/************************************************************************************************/
+/**
+* @addtogroup CIU32F003_STD_Driver
+* @{
+*/
+
+/**
+* @addtogroup STD
+* @{
+*
+*/
+/************************************************************************************************/ 
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+       
+/*-----------------------------------------type define------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @defgroup STD_Types STD Types
+* @brief STD库通用数据类型定义
+* @{
+*
+*/
+/************************************************************************************************/ 
+/**
+* @brief  bit位状态定义
+*/
+typedef enum
+{
+    RESET = 0,
+    SET = !RESET
+}bit_status_t;
+
+
+/**
+* @brief  STD库API返回值类型定义
+*/
+typedef enum
+{
+    STD_OK                   = 0x00U,
+    STD_ERR                  = 0x01U,
+    STD_ERR_PARAM            = 0x02U,
+    STD_ERR_BUSY             = 0x03U,
+    STD_ERR_TIMEOUT          = 0x04U
+} std_status_t;
+
+
+/**
+* @}
+*/
+  
+
+/*--------------------------------------------define--------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @addtogroup STD_Constants 
+* @{
+*
+*/
+/************************************************************************************************/ 
+
+/* 避免编译警告 */
+#define UNUSED(X) (void)X      
+
+
+/* 编译器差异化定义 */
+#if  defined ( __GNUC__ )
+    #ifndef __weak
+        #define __weak   __attribute__((weak))
+    #endif /* __weak */
+    
+    #ifndef __packed
+        #define __packed __attribute__((__packed__))
+    #endif /* __packed */
+#endif /* __GNUC__ */
+
+
+/* bit operations */
+#define MODIFY_REG(REG, CLEARMASK, SETMASK)  ((REG) = (((REG) & (~(CLEARMASK))) | (SETMASK)))
+
+/** 
+* @} 
+*/
+                                    
+                                    
+/*------------------------------------------includes--------------------------------------------*/
+#include <stddef.h>
+#include <stdbool.h>
+#include "ciu32f003.h"
+#include "ciu32f003_std.h"
+
+
+/*-------------------------------------------functions------------------------------------------*/
+
+                                    
+#ifdef __cplusplus
+}
+#endif
+
+
+/**
+* @} 
+*/  
+
+/**
+* @}
+*/
+
+
+#endif /* CIU32F003_STD_COMMON_H */

+ 407 - 0
CIU32F003_LIB/Include/ciu32f003_std_comp(1).h

@@ -0,0 +1,407 @@
+/************************************************************************************************/
+/**
+* @file               ciu32f003_std_comp.h
+* @author             MCU Ecosystem Development Team
+* @brief              COMP STD库驱动头文件。
+*                     提供COMP相关的STD库操作函数声明、数据类型以及常量的定义。                         
+*                     
+*
+**************************************************************************************************
+* @attention
+* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
+*
+**************************************************************************************************
+*/
+
+/* 避免头文件重复引用 */
+#ifndef CIU32F003_STD_COMP_H
+#define CIU32F003_STD_COMP_H
+
+/************************************************************************************************/
+/** 
+* @addtogroup CIU32F003_STD_Driver
+* @{
+*/
+
+/**
+* @defgroup COMP COMP
+* @brief 比较器的STD库驱动
+* @{
+*/
+/************************************************************************************************/
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/*------------------------------------------includes--------------------------------------------*/
+#include "ciu32f003_std_common.h"
+
+/*--------------------------------------------define--------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @defgroup COMP_Constants COMP Constants 
+* @brief  COMP常量定义及宏定义
+* @{
+*
+*/
+/************************************************************************************************/
+     
+/* 比较器内部参考电压VDDA 分压 */     
+#define COMP_VDDA_DIV_1DIV16             COMP_CR_VCDIV_1DIV16         /**< VDDA 分压选择1/16    */
+#define COMP_VDDA_DIV_2DIV16             COMP_CR_VCDIV_2DIV16         /**< VDDA 分压选择2/16    */     
+#define COMP_VDDA_DIV_3DIV16             COMP_CR_VCDIV_3DIV16         /**< VDDA 分压选择3/16    */     
+#define COMP_VDDA_DIV_4DIV16             COMP_CR_VCDIV_4DIV16         /**< VDDA 分压选择4/16    */     
+#define COMP_VDDA_DIV_5DIV16             COMP_CR_VCDIV_5DIV16         /**< VDDA 分压选择5/16    */
+#define COMP_VDDA_DIV_6DIV16             COMP_CR_VCDIV_6DIV16         /**< VDDA 分压选择6/16    */
+#define COMP_VDDA_DIV_7DIV16             COMP_CR_VCDIV_7DIV16         /**< VDDA 分压选择7/16    */
+#define COMP_VDDA_DIV_8DIV16             COMP_CR_VCDIV_8DIV16         /**< VDDA 分压选择8/16    */
+#define COMP_VDDA_DIV_9DIV16             COMP_CR_VCDIV_9DIV16         /**< VDDA 分压选择9/16    */     
+#define COMP_VDDA_DIV_10DIV16            COMP_CR_VCDIV_10DIV16        /**< VDDA 分压选择10/16   */     
+#define COMP_VDDA_DIV_11DIV16            COMP_CR_VCDIV_11DIV16        /**< VDDA 分压选择11/16   */     
+#define COMP_VDDA_DIV_12DIV16            COMP_CR_VCDIV_12DIV16        /**< VDDA 分压选择12/16   */
+#define COMP_VDDA_DIV_13DIV16            COMP_CR_VCDIV_13DIV16        /**< VDDA 分压选择13/16   */
+
+/* 比较器正相输入 */
+#define COMP_INPSEL_IO1                   COMP_CSR_INP_IO1            /**< 正相输入 COMP1 = PB0, COMP2 = PA3 */
+#define COMP_INPSEL_IO2                   COMP_CSR_INP_IO2            /**< 正相输入 COMP1 = PB1, COMP2 = PA4 */
+
+/* 比较器反相输入 */
+#define COMP_INMSEL_INVREF                COMP_CSR_INM_INT_VREF       /**< 反相输入 内部参考电压 */
+#define COMP_INMSEL_IO                    COMP_CSR_INM_IO             /**< 反相输入 COMP1 = PB1, COMP2 = PA4 */                      
+
+/* 比较器正相输入模式选择,可用于选择窗口比较器功能 */
+#define COMP_INPMODE_EACH_INPUT           (0x00000000U)               /**< 正相输入各自独立,由各自inpsel决定 */
+#define COMP_INPMODE_COMMON_INPUT         COMP_CSR_INPMOD             /**< 正相输入相互连接,即窗口比较器模式 */
+
+/* 比较器滤波时间 */
+#define COMP_FLTIME_1CYCLE                COMP_CSR_FLTIME_1CYCLE      /**< 滤波时间 1个CYCLE    */
+#define COMP_FLTIME_3CYCLE                COMP_CSR_FLTIME_3CYCLE      /**< 滤波时间 3个CYCLE    */
+#define COMP_FLTIME_7CYCLE                COMP_CSR_FLTIME_7CYCLE      /**< 滤波时间 7个CYCLE    */
+#define COMP_FLTIME_15CYCLE               COMP_CSR_FLTIME_15CYCLE     /**< 滤波时间 15个CYCLE   */
+#define COMP_FLTIME_31CYCLE               COMP_CSR_FLTIME_31CYCLE     /**< 滤波时间 31个CYCLE   */
+#define COMP_FLTIME_63CYCLE               COMP_CSR_FLTIME_63CYCLE     /**< 滤波时间 63个CYCLE   */
+#define COMP_FLTIME_255CYCLE              COMP_CSR_FLTIME_255CYCLE    /**< 滤波时间 255个CYCLE  */
+#define COMP_FLTIME_1023CYCLE             COMP_CSR_FLTIME_1023CYCLE   /**< 滤波时间 1023个CYCLE */
+
+/* 比较器输出极性 */
+#define COMP_OUTPOL_NON_INVERTED          (0x00000000U)               /**< 输出状态不反相 */
+#define COMP_OUTPOL_INVERTED              COMP_CSR_POL                /**< 输出状态反相   */
+
+/* 比较器输出选择 */
+#define COMP_OUTMODE_EACH_OUT             (0x00000000U)               /**< 输出为其原始电压比较结果         */
+#define COMP_OUTMODE_COMMON_XOR_OUT       COMP_CSR_OUTMOD             /**< 输出为比较器1、2电压比较结果异或 */
+
+/* 比较器输出结果 */
+#define COMP_OUTPUT_LEVEL_LOW             (0x00000000UL)              /**< 比较器输出电平低 */
+#define COMP_OUTPUT_LEVEL_HIGH            (0x00000001UL)              /**< 比较器输出电平高 */
+
+/* 比较器内部参考电压源 */
+#define COMP_REFERENCE_VBGR               (0x00000000UL)              /**< 比较器内部参考电压源选择VBGR         */
+#define COMP_REFERENCE_VDDA_DIV           COMP_CR_VCSEL               /**< 比较器内部参考电压源选择VDDA 16级分压 */
+
+/* COMP启动稳定时间 */
+#define COMP_EN_DELAY                     (1U)                        /**< COMP使能启动时间 */
+
+/** 
+* @} 
+*/
+
+/*-------------------------------------------functions------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @defgroup COMP_External_Functions COMP External Functions
+* @brief    COMP对外函数
+* @{
+*
+*/
+/************************************************************************************************/
+/** 
+* @brief  使能COMP
+* @param  compx COMP外设
+* @retval 无
+*/
+__STATIC_INLINE void std_comp_enable(COMP_t *compx)
+{
+    compx->CSR |= (COMP_CSR_EN);
+}
+
+/** 
+* @brief  禁止COMP
+* @param  compx COMP外设
+* @retval 无
+*/
+__STATIC_INLINE void std_comp_disable(COMP_t *compx)
+{
+    compx->CSR &= (~COMP_CSR_EN);
+}
+
+/** 
+* @brief  设置COMP反相输入
+* @param  compx COMP外设
+* @param  input_minus 反相输入选择
+*             @arg COMP_INMSEL_INVREF
+*             @arg COMP_INMSEL_IO
+* @retval 无
+*/
+__STATIC_INLINE void std_comp_set_input_minus(COMP_t *compx, uint32_t input_minus)
+{
+    MODIFY_REG(compx->CSR, COMP_CSR_INM, input_minus);
+}
+
+/** 
+* @brief  获取COMP反相输入
+* @param  compx COMP外设
+* @retval uint32_t 返回反相输入
+*             @arg COMP_INMSEL_INVREF
+*             @arg COMP_INMSEL_IO
+*/
+__STATIC_INLINE uint32_t std_comp_get_input_minus(COMP_t *compx)
+{
+    return(compx->CSR & COMP_CSR_INM);
+}
+
+/** 
+* @brief  设置COMP正相输入
+* @param  compx COMP外设
+* @param  input_plus 正相输入选择
+*             @arg COMP_INPSEL_IO1
+*             @arg COMP_INPSEL_IO2
+* @retval 无
+*/
+__STATIC_INLINE void std_comp_set_input_plus(COMP_t *compx, uint32_t input_plus)
+{
+    MODIFY_REG(compx->CSR, COMP_CSR_INP, input_plus);
+}
+
+/** 
+* @brief  获取COMP正相输入
+* @param  compx COMP外设
+* @retval uint32_t 返回正相输入
+*             @arg COMP_INPSEL_IO1
+*             @arg COMP_INPSEL_IO2
+*/
+__STATIC_INLINE uint32_t std_comp_get_input_plus(COMP_t *compx)
+{
+    return(compx->CSR & COMP_CSR_INP);
+}
+
+/** 
+* @brief  设置COMP正相输入模式
+* @param  compx COMP外设
+* @param  input_mode 正相输入模式选择
+*             @arg COMP_INPMODE_EACH_INPUT
+*             @arg COMP_INPMODE_COMMON_INPUT
+* @retval 无
+*/
+__STATIC_INLINE void std_comp_set_input_plus_mode(COMP_t *compx, uint32_t input_mode)
+{
+    MODIFY_REG(compx->CSR, COMP_CSR_INPMOD, input_mode);
+}
+
+/** 
+* @brief  设置COMP输出模式
+* @param  compx COMP外设
+* @param  output_mode 输出模式选择
+*             @arg COMP_OUTMODE_EACH_OUT
+*             @arg COMP_OUTMODE_COMMON_XOR_OUT
+* @retval 无
+*/
+__STATIC_INLINE void std_comp_set_output_mode(COMP_t *compx, uint32_t output_mode)
+{
+    MODIFY_REG(compx->CSR, COMP_CSR_OUTMOD, output_mode);
+}
+
+/** 
+* @brief  设置COMP输出极性
+* @param  compx COMP外设
+* @param  output_polarity 输出极性选择
+*             @arg COMP_OUTPOL_NON_INVERTED
+*             @arg COMP_OUTPOL_INVERTED
+* @retval 无
+*/
+__STATIC_INLINE void std_comp_set_output_polarity(COMP_t *compx, uint32_t output_polarity)
+{
+    MODIFY_REG(compx->CSR, COMP_CSR_POL, output_polarity);
+}
+
+/** 
+* @brief  获取COMP输出极性
+* @param  compx COMP外设
+* @retval uint32_t 返回输出极性
+*             @arg COMP_OUTPOL_NON_INVERTED
+*             @arg COMP_OUTPOL_INVERTED
+*/
+__STATIC_INLINE uint32_t std_comp_get_output_polarity(COMP_t *compx)
+{
+    return(compx->CSR & COMP_CSR_POL);
+}
+
+/** 
+* @brief  使能COMP的输入迟滞
+* @retval 无
+*/
+__STATIC_INLINE void std_comp_input_hysteresis_enable(void)
+{
+    COMP_COMMON->CR |= COMP_CR_HYST;
+}
+
+/** 
+* @brief  禁止COMP的输入迟滞
+* @retval 无
+*/
+__STATIC_INLINE void std_comp_input_hysteresis_disable(void)
+{
+    COMP_COMMON->CR &= ~COMP_CR_HYST;
+}
+
+/** 
+* @brief  设置COMP输出滤波时间
+* @param  compx COMP外设
+* @param  filter_time 滤波时间选择
+*             @arg COMP_FLTIME_1CYCLE
+*             @arg COMP_FLTIME_3CYCLE
+*             @arg ...
+*             @arg COMP_FLTIME_1023CYCLE
+* @retval 无
+*/
+__STATIC_INLINE void std_comp_set_output_filter_time(COMP_t *compx, uint32_t filter_time)
+{
+    MODIFY_REG(compx->CSR, COMP_CSR_FLTIME, filter_time);
+}
+
+/** 
+* @brief  COMP输出滤波使能
+* @param  compx COMP外设
+* @retval 无
+*/
+__STATIC_INLINE void std_comp_output_filter_enable(COMP_t *compx)
+{
+    compx->CSR |= (COMP_CSR_FLTEN);
+}
+
+/** 
+* @brief  COMP输出滤波禁止
+* @param  compx COMP外设
+* @retval 无
+*/
+__STATIC_INLINE void std_comp_output_filter_disable(COMP_t *compx)
+{
+    compx->CSR &= (~COMP_CSR_FLTEN);
+}
+
+/** 
+* @brief  获取COMP使能状态
+* @param  compx COMP外设
+* @retval uint32_t 返回判断结果
+*             @arg 非0: 表示COMP已使能
+*             @arg 0:   表示COMP未使能
+*/
+__STATIC_INLINE uint32_t std_comp_get_enable_status(COMP_t *compx)
+{
+    return (compx->CSR & COMP_CSR_EN);
+}
+
+/** 
+* @brief  获取COMP输出结果
+* @param  compx COMP外设
+* @retval uint32_t 返回COMP输出结果
+*             @arg COMP_OUTPUT_LEVEL_LOW
+*             @arg COMP_OUTPUT_LEVEL_HIGH
+*/
+__STATIC_INLINE uint32_t std_comp_get_output_result(COMP_t *compx)
+{
+    return ((compx->CSR & COMP_CSR_VAL) >> COMP_CSR_VAL_POS);
+}
+
+/** 
+* @brief  COMP参考电压源设置
+*             @arg COMP_REFERENCE_VBGR
+*             @arg COMP_REFERENCE_VDDA_DIV
+* @note   VDDA分压作为参考电压源,需配置VDDA分压参数;
+* @retval 无
+*/
+__STATIC_INLINE void std_comp_set_reference_source(uint32_t reference_voltage)
+{
+    MODIFY_REG(COMP_COMMON->CR, COMP_CR_VCSEL, reference_voltage);
+}
+
+/** 
+* @brief  获取COMP参考电压源
+* @retval uint32_t  返回参考电源源
+*             @arg COMP_REFERENCE_VBGR
+*             @arg COMP_REFERENCE_VDDA_DIV
+*/
+__STATIC_INLINE uint32_t std_comp_get_reference_source(void)
+{
+    return (COMP_COMMON->CR & COMP_CR_VCSEL);
+}
+
+/** 
+* @brief  设置VDDA 16级分压
+* @param  vdda_div VDDA 16级分压
+*             @arg COMP_VDDA_DIV_1DIV16
+*             @arg COMP_VDDA_DIV_2DIV16
+*             @arg ...
+*             @arg COMP_VDDA_DIV_13DIV16
+* @retval 无
+*/
+__STATIC_INLINE void std_comp_set_ref_vdda_div(uint32_t vdda_div)
+{
+    MODIFY_REG(COMP_COMMON->CR, COMP_CR_VCDIV, vdda_div);
+}
+
+/** 
+* @brief  获取VDDA 16级分压
+* @retval uint32_t 返回 VDDA 16级分压
+*             @arg COMP_VDDA_DIV_1DIV16
+*             @arg COMP_VDDA_DIV_2DIV16
+*             @arg ...
+*             @arg COMP_VDDA_DIV_13DIV16
+*/
+__STATIC_INLINE uint32_t std_comp_get_ref_vdda_div(void)
+{
+    return (COMP_COMMON->CR & COMP_CR_VCDIV);
+}
+
+/** 
+* @brief  配置COMP的正相输入和反向输入
+* @param  compx COMP外设
+* @param  input_plus 正相输入选择
+*             @arg COMP_INPSEL_IO1
+*             @arg COMP_INPSEL_IO2
+* @param  input_minis 反向相输入选择
+*             @arg COMP_INMSEL_INVREF
+*             @arg COMP_INMSEL_IO
+*
+* @retval 无
+*/
+__STATIC_INLINE void std_comp_input_config(COMP_t *compx, uint32_t input_plus, uint32_t input_minis)
+{
+    MODIFY_REG(compx->CSR,
+               (COMP_CSR_INP | COMP_CSR_INM),
+               (input_plus | input_minis));
+}
+
+/* COMP去初始化函数 */
+void std_comp_deinit(COMP_t *compx);
+
+/**
+* @}
+*/
+
+#ifdef __cplusplus
+}
+#endif
+
+/**
+* @}
+*/
+
+/**
+* @}
+*/
+
+#endif /* CIU32F003_STD_COMP_H */

+ 407 - 0
CIU32F003_LIB/Include/ciu32f003_std_comp(2).h

@@ -0,0 +1,407 @@
+/************************************************************************************************/
+/**
+* @file               ciu32f003_std_comp.h
+* @author             MCU Ecosystem Development Team
+* @brief              COMP STD库驱动头文件。
+*                     提供COMP相关的STD库操作函数声明、数据类型以及常量的定义。                         
+*                     
+*
+**************************************************************************************************
+* @attention
+* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
+*
+**************************************************************************************************
+*/
+
+/* 避免头文件重复引用 */
+#ifndef CIU32F003_STD_COMP_H
+#define CIU32F003_STD_COMP_H
+
+/************************************************************************************************/
+/** 
+* @addtogroup CIU32F003_STD_Driver
+* @{
+*/
+
+/**
+* @defgroup COMP COMP
+* @brief 比较器的STD库驱动
+* @{
+*/
+/************************************************************************************************/
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/*------------------------------------------includes--------------------------------------------*/
+#include "ciu32f003_std_common.h"
+
+/*--------------------------------------------define--------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @defgroup COMP_Constants COMP Constants 
+* @brief  COMP常量定义及宏定义
+* @{
+*
+*/
+/************************************************************************************************/
+     
+/* 比较器内部参考电压VDDA 分压 */     
+#define COMP_VDDA_DIV_1DIV16             COMP_CR_VCDIV_1DIV16         /**< VDDA 分压选择1/16    */
+#define COMP_VDDA_DIV_2DIV16             COMP_CR_VCDIV_2DIV16         /**< VDDA 分压选择2/16    */     
+#define COMP_VDDA_DIV_3DIV16             COMP_CR_VCDIV_3DIV16         /**< VDDA 分压选择3/16    */     
+#define COMP_VDDA_DIV_4DIV16             COMP_CR_VCDIV_4DIV16         /**< VDDA 分压选择4/16    */     
+#define COMP_VDDA_DIV_5DIV16             COMP_CR_VCDIV_5DIV16         /**< VDDA 分压选择5/16    */
+#define COMP_VDDA_DIV_6DIV16             COMP_CR_VCDIV_6DIV16         /**< VDDA 分压选择6/16    */
+#define COMP_VDDA_DIV_7DIV16             COMP_CR_VCDIV_7DIV16         /**< VDDA 分压选择7/16    */
+#define COMP_VDDA_DIV_8DIV16             COMP_CR_VCDIV_8DIV16         /**< VDDA 分压选择8/16    */
+#define COMP_VDDA_DIV_9DIV16             COMP_CR_VCDIV_9DIV16         /**< VDDA 分压选择9/16    */     
+#define COMP_VDDA_DIV_10DIV16            COMP_CR_VCDIV_10DIV16        /**< VDDA 分压选择10/16   */     
+#define COMP_VDDA_DIV_11DIV16            COMP_CR_VCDIV_11DIV16        /**< VDDA 分压选择11/16   */     
+#define COMP_VDDA_DIV_12DIV16            COMP_CR_VCDIV_12DIV16        /**< VDDA 分压选择12/16   */
+#define COMP_VDDA_DIV_13DIV16            COMP_CR_VCDIV_13DIV16        /**< VDDA 分压选择13/16   */
+
+/* 比较器正相输入 */
+#define COMP_INPSEL_IO1                   COMP_CSR_INP_IO1            /**< 正相输入 COMP1 = PB0, COMP2 = PA3 */
+#define COMP_INPSEL_IO2                   COMP_CSR_INP_IO2            /**< 正相输入 COMP1 = PB1, COMP2 = PA4 */
+
+/* 比较器反相输入 */
+#define COMP_INMSEL_INVREF                COMP_CSR_INM_INT_VREF       /**< 反相输入 内部参考电压 */
+#define COMP_INMSEL_IO                    COMP_CSR_INM_IO             /**< 反相输入 COMP1 = PB1, COMP2 = PA4 */                      
+
+/* 比较器正相输入模式选择,可用于选择窗口比较器功能 */
+#define COMP_INPMODE_EACH_INPUT           (0x00000000U)               /**< 正相输入各自独立,由各自inpsel决定 */
+#define COMP_INPMODE_COMMON_INPUT         COMP_CSR_INPMOD             /**< 正相输入相互连接,即窗口比较器模式 */
+
+/* 比较器滤波时间 */
+#define COMP_FLTIME_1CYCLE                COMP_CSR_FLTIME_1CYCLE      /**< 滤波时间 1个CYCLE    */
+#define COMP_FLTIME_3CYCLE                COMP_CSR_FLTIME_3CYCLE      /**< 滤波时间 3个CYCLE    */
+#define COMP_FLTIME_7CYCLE                COMP_CSR_FLTIME_7CYCLE      /**< 滤波时间 7个CYCLE    */
+#define COMP_FLTIME_15CYCLE               COMP_CSR_FLTIME_15CYCLE     /**< 滤波时间 15个CYCLE   */
+#define COMP_FLTIME_31CYCLE               COMP_CSR_FLTIME_31CYCLE     /**< 滤波时间 31个CYCLE   */
+#define COMP_FLTIME_63CYCLE               COMP_CSR_FLTIME_63CYCLE     /**< 滤波时间 63个CYCLE   */
+#define COMP_FLTIME_255CYCLE              COMP_CSR_FLTIME_255CYCLE    /**< 滤波时间 255个CYCLE  */
+#define COMP_FLTIME_1023CYCLE             COMP_CSR_FLTIME_1023CYCLE   /**< 滤波时间 1023个CYCLE */
+
+/* 比较器输出极性 */
+#define COMP_OUTPOL_NON_INVERTED          (0x00000000U)               /**< 输出状态不反相 */
+#define COMP_OUTPOL_INVERTED              COMP_CSR_POL                /**< 输出状态反相   */
+
+/* 比较器输出选择 */
+#define COMP_OUTMODE_EACH_OUT             (0x00000000U)               /**< 输出为其原始电压比较结果         */
+#define COMP_OUTMODE_COMMON_XOR_OUT       COMP_CSR_OUTMOD             /**< 输出为比较器1、2电压比较结果异或 */
+
+/* 比较器输出结果 */
+#define COMP_OUTPUT_LEVEL_LOW             (0x00000000UL)              /**< 比较器输出电平低 */
+#define COMP_OUTPUT_LEVEL_HIGH            (0x00000001UL)              /**< 比较器输出电平高 */
+
+/* 比较器内部参考电压源 */
+#define COMP_REFERENCE_VBGR               (0x00000000UL)              /**< 比较器内部参考电压源选择VBGR         */
+#define COMP_REFERENCE_VDDA_DIV           COMP_CR_VCSEL               /**< 比较器内部参考电压源选择VDDA 16级分压 */
+
+/* COMP启动稳定时间 */
+#define COMP_EN_DELAY                     (1U)                        /**< COMP使能启动时间 */
+
+/** 
+* @} 
+*/
+
+/*-------------------------------------------functions------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @defgroup COMP_External_Functions COMP External Functions
+* @brief    COMP对外函数
+* @{
+*
+*/
+/************************************************************************************************/
+/** 
+* @brief  使能COMP
+* @param  compx COMP外设
+* @retval 无
+*/
+__STATIC_INLINE void std_comp_enable(COMP_t *compx)
+{
+    compx->CSR |= (COMP_CSR_EN);
+}
+
+/** 
+* @brief  禁止COMP
+* @param  compx COMP外设
+* @retval 无
+*/
+__STATIC_INLINE void std_comp_disable(COMP_t *compx)
+{
+    compx->CSR &= (~COMP_CSR_EN);
+}
+
+/** 
+* @brief  设置COMP反相输入
+* @param  compx COMP外设
+* @param  input_minus 反相输入选择
+*             @arg COMP_INMSEL_INVREF
+*             @arg COMP_INMSEL_IO
+* @retval 无
+*/
+__STATIC_INLINE void std_comp_set_input_minus(COMP_t *compx, uint32_t input_minus)
+{
+    MODIFY_REG(compx->CSR, COMP_CSR_INM, input_minus);
+}
+
+/** 
+* @brief  获取COMP反相输入
+* @param  compx COMP外设
+* @retval uint32_t 返回反相输入
+*             @arg COMP_INMSEL_INVREF
+*             @arg COMP_INMSEL_IO
+*/
+__STATIC_INLINE uint32_t std_comp_get_input_minus(COMP_t *compx)
+{
+    return(compx->CSR & COMP_CSR_INM);
+}
+
+/** 
+* @brief  设置COMP正相输入
+* @param  compx COMP外设
+* @param  input_plus 正相输入选择
+*             @arg COMP_INPSEL_IO1
+*             @arg COMP_INPSEL_IO2
+* @retval 无
+*/
+__STATIC_INLINE void std_comp_set_input_plus(COMP_t *compx, uint32_t input_plus)
+{
+    MODIFY_REG(compx->CSR, COMP_CSR_INP, input_plus);
+}
+
+/** 
+* @brief  获取COMP正相输入
+* @param  compx COMP外设
+* @retval uint32_t 返回正相输入
+*             @arg COMP_INPSEL_IO1
+*             @arg COMP_INPSEL_IO2
+*/
+__STATIC_INLINE uint32_t std_comp_get_input_plus(COMP_t *compx)
+{
+    return(compx->CSR & COMP_CSR_INP);
+}
+
+/** 
+* @brief  设置COMP正相输入模式
+* @param  compx COMP外设
+* @param  input_mode 正相输入模式选择
+*             @arg COMP_INPMODE_EACH_INPUT
+*             @arg COMP_INPMODE_COMMON_INPUT
+* @retval 无
+*/
+__STATIC_INLINE void std_comp_set_input_plus_mode(COMP_t *compx, uint32_t input_mode)
+{
+    MODIFY_REG(compx->CSR, COMP_CSR_INPMOD, input_mode);
+}
+
+/** 
+* @brief  设置COMP输出模式
+* @param  compx COMP外设
+* @param  output_mode 输出模式选择
+*             @arg COMP_OUTMODE_EACH_OUT
+*             @arg COMP_OUTMODE_COMMON_XOR_OUT
+* @retval 无
+*/
+__STATIC_INLINE void std_comp_set_output_mode(COMP_t *compx, uint32_t output_mode)
+{
+    MODIFY_REG(compx->CSR, COMP_CSR_OUTMOD, output_mode);
+}
+
+/** 
+* @brief  设置COMP输出极性
+* @param  compx COMP外设
+* @param  output_polarity 输出极性选择
+*             @arg COMP_OUTPOL_NON_INVERTED
+*             @arg COMP_OUTPOL_INVERTED
+* @retval 无
+*/
+__STATIC_INLINE void std_comp_set_output_polarity(COMP_t *compx, uint32_t output_polarity)
+{
+    MODIFY_REG(compx->CSR, COMP_CSR_POL, output_polarity);
+}
+
+/** 
+* @brief  获取COMP输出极性
+* @param  compx COMP外设
+* @retval uint32_t 返回输出极性
+*             @arg COMP_OUTPOL_NON_INVERTED
+*             @arg COMP_OUTPOL_INVERTED
+*/
+__STATIC_INLINE uint32_t std_comp_get_output_polarity(COMP_t *compx)
+{
+    return(compx->CSR & COMP_CSR_POL);
+}
+
+/** 
+* @brief  使能COMP的输入迟滞
+* @retval 无
+*/
+__STATIC_INLINE void std_comp_input_hysteresis_enable(void)
+{
+    COMP_COMMON->CR |= COMP_CR_HYST;
+}
+
+/** 
+* @brief  禁止COMP的输入迟滞
+* @retval 无
+*/
+__STATIC_INLINE void std_comp_input_hysteresis_disable(void)
+{
+    COMP_COMMON->CR &= ~COMP_CR_HYST;
+}
+
+/** 
+* @brief  设置COMP输出滤波时间
+* @param  compx COMP外设
+* @param  filter_time 滤波时间选择
+*             @arg COMP_FLTIME_1CYCLE
+*             @arg COMP_FLTIME_3CYCLE
+*             @arg ...
+*             @arg COMP_FLTIME_1023CYCLE
+* @retval 无
+*/
+__STATIC_INLINE void std_comp_set_output_filter_time(COMP_t *compx, uint32_t filter_time)
+{
+    MODIFY_REG(compx->CSR, COMP_CSR_FLTIME, filter_time);
+}
+
+/** 
+* @brief  COMP输出滤波使能
+* @param  compx COMP外设
+* @retval 无
+*/
+__STATIC_INLINE void std_comp_output_filter_enable(COMP_t *compx)
+{
+    compx->CSR |= (COMP_CSR_FLTEN);
+}
+
+/** 
+* @brief  COMP输出滤波禁止
+* @param  compx COMP外设
+* @retval 无
+*/
+__STATIC_INLINE void std_comp_output_filter_disable(COMP_t *compx)
+{
+    compx->CSR &= (~COMP_CSR_FLTEN);
+}
+
+/** 
+* @brief  获取COMP使能状态
+* @param  compx COMP外设
+* @retval uint32_t 返回判断结果
+*             @arg 非0: 表示COMP已使能
+*             @arg 0:   表示COMP未使能
+*/
+__STATIC_INLINE uint32_t std_comp_get_enable_status(COMP_t *compx)
+{
+    return (compx->CSR & COMP_CSR_EN);
+}
+
+/** 
+* @brief  获取COMP输出结果
+* @param  compx COMP外设
+* @retval uint32_t 返回COMP输出结果
+*             @arg COMP_OUTPUT_LEVEL_LOW
+*             @arg COMP_OUTPUT_LEVEL_HIGH
+*/
+__STATIC_INLINE uint32_t std_comp_get_output_result(COMP_t *compx)
+{
+    return ((compx->CSR & COMP_CSR_VAL) >> COMP_CSR_VAL_POS);
+}
+
+/** 
+* @brief  COMP参考电压源设置
+*             @arg COMP_REFERENCE_VBGR
+*             @arg COMP_REFERENCE_VDDA_DIV
+* @note   VDDA分压作为参考电压源,需配置VDDA分压参数;
+* @retval 无
+*/
+__STATIC_INLINE void std_comp_set_reference_source(uint32_t reference_voltage)
+{
+    MODIFY_REG(COMP_COMMON->CR, COMP_CR_VCSEL, reference_voltage);
+}
+
+/** 
+* @brief  获取COMP参考电压源
+* @retval uint32_t  返回参考电源源
+*             @arg COMP_REFERENCE_VBGR
+*             @arg COMP_REFERENCE_VDDA_DIV
+*/
+__STATIC_INLINE uint32_t std_comp_get_reference_source(void)
+{
+    return (COMP_COMMON->CR & COMP_CR_VCSEL);
+}
+
+/** 
+* @brief  设置VDDA 16级分压
+* @param  vdda_div VDDA 16级分压
+*             @arg COMP_VDDA_DIV_1DIV16
+*             @arg COMP_VDDA_DIV_2DIV16
+*             @arg ...
+*             @arg COMP_VDDA_DIV_13DIV16
+* @retval 无
+*/
+__STATIC_INLINE void std_comp_set_ref_vdda_div(uint32_t vdda_div)
+{
+    MODIFY_REG(COMP_COMMON->CR, COMP_CR_VCDIV, vdda_div);
+}
+
+/** 
+* @brief  获取VDDA 16级分压
+* @retval uint32_t 返回 VDDA 16级分压
+*             @arg COMP_VDDA_DIV_1DIV16
+*             @arg COMP_VDDA_DIV_2DIV16
+*             @arg ...
+*             @arg COMP_VDDA_DIV_13DIV16
+*/
+__STATIC_INLINE uint32_t std_comp_get_ref_vdda_div(void)
+{
+    return (COMP_COMMON->CR & COMP_CR_VCDIV);
+}
+
+/** 
+* @brief  配置COMP的正相输入和反向输入
+* @param  compx COMP外设
+* @param  input_plus 正相输入选择
+*             @arg COMP_INPSEL_IO1
+*             @arg COMP_INPSEL_IO2
+* @param  input_minis 反向相输入选择
+*             @arg COMP_INMSEL_INVREF
+*             @arg COMP_INMSEL_IO
+*
+* @retval 无
+*/
+__STATIC_INLINE void std_comp_input_config(COMP_t *compx, uint32_t input_plus, uint32_t input_minis)
+{
+    MODIFY_REG(compx->CSR,
+               (COMP_CSR_INP | COMP_CSR_INM),
+               (input_plus | input_minis));
+}
+
+/* COMP去初始化函数 */
+void std_comp_deinit(COMP_t *compx);
+
+/**
+* @}
+*/
+
+#ifdef __cplusplus
+}
+#endif
+
+/**
+* @}
+*/
+
+/**
+* @}
+*/
+
+#endif /* CIU32F003_STD_COMP_H */

+ 407 - 0
CIU32F003_LIB/Include/ciu32f003_std_comp(3).h

@@ -0,0 +1,407 @@
+/************************************************************************************************/
+/**
+* @file               ciu32f003_std_comp.h
+* @author             MCU Ecosystem Development Team
+* @brief              COMP STD库驱动头文件。
+*                     提供COMP相关的STD库操作函数声明、数据类型以及常量的定义。                         
+*                     
+*
+**************************************************************************************************
+* @attention
+* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
+*
+**************************************************************************************************
+*/
+
+/* 避免头文件重复引用 */
+#ifndef CIU32F003_STD_COMP_H
+#define CIU32F003_STD_COMP_H
+
+/************************************************************************************************/
+/** 
+* @addtogroup CIU32F003_STD_Driver
+* @{
+*/
+
+/**
+* @defgroup COMP COMP
+* @brief 比较器的STD库驱动
+* @{
+*/
+/************************************************************************************************/
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/*------------------------------------------includes--------------------------------------------*/
+#include "ciu32f003_std_common.h"
+
+/*--------------------------------------------define--------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @defgroup COMP_Constants COMP Constants 
+* @brief  COMP常量定义及宏定义
+* @{
+*
+*/
+/************************************************************************************************/
+     
+/* 比较器内部参考电压VDDA 分压 */     
+#define COMP_VDDA_DIV_1DIV16             COMP_CR_VCDIV_1DIV16         /**< VDDA 分压选择1/16    */
+#define COMP_VDDA_DIV_2DIV16             COMP_CR_VCDIV_2DIV16         /**< VDDA 分压选择2/16    */     
+#define COMP_VDDA_DIV_3DIV16             COMP_CR_VCDIV_3DIV16         /**< VDDA 分压选择3/16    */     
+#define COMP_VDDA_DIV_4DIV16             COMP_CR_VCDIV_4DIV16         /**< VDDA 分压选择4/16    */     
+#define COMP_VDDA_DIV_5DIV16             COMP_CR_VCDIV_5DIV16         /**< VDDA 分压选择5/16    */
+#define COMP_VDDA_DIV_6DIV16             COMP_CR_VCDIV_6DIV16         /**< VDDA 分压选择6/16    */
+#define COMP_VDDA_DIV_7DIV16             COMP_CR_VCDIV_7DIV16         /**< VDDA 分压选择7/16    */
+#define COMP_VDDA_DIV_8DIV16             COMP_CR_VCDIV_8DIV16         /**< VDDA 分压选择8/16    */
+#define COMP_VDDA_DIV_9DIV16             COMP_CR_VCDIV_9DIV16         /**< VDDA 分压选择9/16    */     
+#define COMP_VDDA_DIV_10DIV16            COMP_CR_VCDIV_10DIV16        /**< VDDA 分压选择10/16   */     
+#define COMP_VDDA_DIV_11DIV16            COMP_CR_VCDIV_11DIV16        /**< VDDA 分压选择11/16   */     
+#define COMP_VDDA_DIV_12DIV16            COMP_CR_VCDIV_12DIV16        /**< VDDA 分压选择12/16   */
+#define COMP_VDDA_DIV_13DIV16            COMP_CR_VCDIV_13DIV16        /**< VDDA 分压选择13/16   */
+
+/* 比较器正相输入 */
+#define COMP_INPSEL_IO1                   COMP_CSR_INP_IO1            /**< 正相输入 COMP1 = PB0, COMP2 = PA3 */
+#define COMP_INPSEL_IO2                   COMP_CSR_INP_IO2            /**< 正相输入 COMP1 = PB1, COMP2 = PA4 */
+
+/* 比较器反相输入 */
+#define COMP_INMSEL_INVREF                COMP_CSR_INM_INT_VREF       /**< 反相输入 内部参考电压 */
+#define COMP_INMSEL_IO                    COMP_CSR_INM_IO             /**< 反相输入 COMP1 = PB1, COMP2 = PA4 */                      
+
+/* 比较器正相输入模式选择,可用于选择窗口比较器功能 */
+#define COMP_INPMODE_EACH_INPUT           (0x00000000U)               /**< 正相输入各自独立,由各自inpsel决定 */
+#define COMP_INPMODE_COMMON_INPUT         COMP_CSR_INPMOD             /**< 正相输入相互连接,即窗口比较器模式 */
+
+/* 比较器滤波时间 */
+#define COMP_FLTIME_1CYCLE                COMP_CSR_FLTIME_1CYCLE      /**< 滤波时间 1个CYCLE    */
+#define COMP_FLTIME_3CYCLE                COMP_CSR_FLTIME_3CYCLE      /**< 滤波时间 3个CYCLE    */
+#define COMP_FLTIME_7CYCLE                COMP_CSR_FLTIME_7CYCLE      /**< 滤波时间 7个CYCLE    */
+#define COMP_FLTIME_15CYCLE               COMP_CSR_FLTIME_15CYCLE     /**< 滤波时间 15个CYCLE   */
+#define COMP_FLTIME_31CYCLE               COMP_CSR_FLTIME_31CYCLE     /**< 滤波时间 31个CYCLE   */
+#define COMP_FLTIME_63CYCLE               COMP_CSR_FLTIME_63CYCLE     /**< 滤波时间 63个CYCLE   */
+#define COMP_FLTIME_255CYCLE              COMP_CSR_FLTIME_255CYCLE    /**< 滤波时间 255个CYCLE  */
+#define COMP_FLTIME_1023CYCLE             COMP_CSR_FLTIME_1023CYCLE   /**< 滤波时间 1023个CYCLE */
+
+/* 比较器输出极性 */
+#define COMP_OUTPOL_NON_INVERTED          (0x00000000U)               /**< 输出状态不反相 */
+#define COMP_OUTPOL_INVERTED              COMP_CSR_POL                /**< 输出状态反相   */
+
+/* 比较器输出选择 */
+#define COMP_OUTMODE_EACH_OUT             (0x00000000U)               /**< 输出为其原始电压比较结果         */
+#define COMP_OUTMODE_COMMON_XOR_OUT       COMP_CSR_OUTMOD             /**< 输出为比较器1、2电压比较结果异或 */
+
+/* 比较器输出结果 */
+#define COMP_OUTPUT_LEVEL_LOW             (0x00000000UL)              /**< 比较器输出电平低 */
+#define COMP_OUTPUT_LEVEL_HIGH            (0x00000001UL)              /**< 比较器输出电平高 */
+
+/* 比较器内部参考电压源 */
+#define COMP_REFERENCE_VBGR               (0x00000000UL)              /**< 比较器内部参考电压源选择VBGR         */
+#define COMP_REFERENCE_VDDA_DIV           COMP_CR_VCSEL               /**< 比较器内部参考电压源选择VDDA 16级分压 */
+
+/* COMP启动稳定时间 */
+#define COMP_EN_DELAY                     (1U)                        /**< COMP使能启动时间 */
+
+/** 
+* @} 
+*/
+
+/*-------------------------------------------functions------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @defgroup COMP_External_Functions COMP External Functions
+* @brief    COMP对外函数
+* @{
+*
+*/
+/************************************************************************************************/
+/** 
+* @brief  使能COMP
+* @param  compx COMP外设
+* @retval 无
+*/
+__STATIC_INLINE void std_comp_enable(COMP_t *compx)
+{
+    compx->CSR |= (COMP_CSR_EN);
+}
+
+/** 
+* @brief  禁止COMP
+* @param  compx COMP外设
+* @retval 无
+*/
+__STATIC_INLINE void std_comp_disable(COMP_t *compx)
+{
+    compx->CSR &= (~COMP_CSR_EN);
+}
+
+/** 
+* @brief  设置COMP反相输入
+* @param  compx COMP外设
+* @param  input_minus 反相输入选择
+*             @arg COMP_INMSEL_INVREF
+*             @arg COMP_INMSEL_IO
+* @retval 无
+*/
+__STATIC_INLINE void std_comp_set_input_minus(COMP_t *compx, uint32_t input_minus)
+{
+    MODIFY_REG(compx->CSR, COMP_CSR_INM, input_minus);
+}
+
+/** 
+* @brief  获取COMP反相输入
+* @param  compx COMP外设
+* @retval uint32_t 返回反相输入
+*             @arg COMP_INMSEL_INVREF
+*             @arg COMP_INMSEL_IO
+*/
+__STATIC_INLINE uint32_t std_comp_get_input_minus(COMP_t *compx)
+{
+    return(compx->CSR & COMP_CSR_INM);
+}
+
+/** 
+* @brief  设置COMP正相输入
+* @param  compx COMP外设
+* @param  input_plus 正相输入选择
+*             @arg COMP_INPSEL_IO1
+*             @arg COMP_INPSEL_IO2
+* @retval 无
+*/
+__STATIC_INLINE void std_comp_set_input_plus(COMP_t *compx, uint32_t input_plus)
+{
+    MODIFY_REG(compx->CSR, COMP_CSR_INP, input_plus);
+}
+
+/** 
+* @brief  获取COMP正相输入
+* @param  compx COMP外设
+* @retval uint32_t 返回正相输入
+*             @arg COMP_INPSEL_IO1
+*             @arg COMP_INPSEL_IO2
+*/
+__STATIC_INLINE uint32_t std_comp_get_input_plus(COMP_t *compx)
+{
+    return(compx->CSR & COMP_CSR_INP);
+}
+
+/** 
+* @brief  设置COMP正相输入模式
+* @param  compx COMP外设
+* @param  input_mode 正相输入模式选择
+*             @arg COMP_INPMODE_EACH_INPUT
+*             @arg COMP_INPMODE_COMMON_INPUT
+* @retval 无
+*/
+__STATIC_INLINE void std_comp_set_input_plus_mode(COMP_t *compx, uint32_t input_mode)
+{
+    MODIFY_REG(compx->CSR, COMP_CSR_INPMOD, input_mode);
+}
+
+/** 
+* @brief  设置COMP输出模式
+* @param  compx COMP外设
+* @param  output_mode 输出模式选择
+*             @arg COMP_OUTMODE_EACH_OUT
+*             @arg COMP_OUTMODE_COMMON_XOR_OUT
+* @retval 无
+*/
+__STATIC_INLINE void std_comp_set_output_mode(COMP_t *compx, uint32_t output_mode)
+{
+    MODIFY_REG(compx->CSR, COMP_CSR_OUTMOD, output_mode);
+}
+
+/** 
+* @brief  设置COMP输出极性
+* @param  compx COMP外设
+* @param  output_polarity 输出极性选择
+*             @arg COMP_OUTPOL_NON_INVERTED
+*             @arg COMP_OUTPOL_INVERTED
+* @retval 无
+*/
+__STATIC_INLINE void std_comp_set_output_polarity(COMP_t *compx, uint32_t output_polarity)
+{
+    MODIFY_REG(compx->CSR, COMP_CSR_POL, output_polarity);
+}
+
+/** 
+* @brief  获取COMP输出极性
+* @param  compx COMP外设
+* @retval uint32_t 返回输出极性
+*             @arg COMP_OUTPOL_NON_INVERTED
+*             @arg COMP_OUTPOL_INVERTED
+*/
+__STATIC_INLINE uint32_t std_comp_get_output_polarity(COMP_t *compx)
+{
+    return(compx->CSR & COMP_CSR_POL);
+}
+
+/** 
+* @brief  使能COMP的输入迟滞
+* @retval 无
+*/
+__STATIC_INLINE void std_comp_input_hysteresis_enable(void)
+{
+    COMP_COMMON->CR |= COMP_CR_HYST;
+}
+
+/** 
+* @brief  禁止COMP的输入迟滞
+* @retval 无
+*/
+__STATIC_INLINE void std_comp_input_hysteresis_disable(void)
+{
+    COMP_COMMON->CR &= ~COMP_CR_HYST;
+}
+
+/** 
+* @brief  设置COMP输出滤波时间
+* @param  compx COMP外设
+* @param  filter_time 滤波时间选择
+*             @arg COMP_FLTIME_1CYCLE
+*             @arg COMP_FLTIME_3CYCLE
+*             @arg ...
+*             @arg COMP_FLTIME_1023CYCLE
+* @retval 无
+*/
+__STATIC_INLINE void std_comp_set_output_filter_time(COMP_t *compx, uint32_t filter_time)
+{
+    MODIFY_REG(compx->CSR, COMP_CSR_FLTIME, filter_time);
+}
+
+/** 
+* @brief  COMP输出滤波使能
+* @param  compx COMP外设
+* @retval 无
+*/
+__STATIC_INLINE void std_comp_output_filter_enable(COMP_t *compx)
+{
+    compx->CSR |= (COMP_CSR_FLTEN);
+}
+
+/** 
+* @brief  COMP输出滤波禁止
+* @param  compx COMP外设
+* @retval 无
+*/
+__STATIC_INLINE void std_comp_output_filter_disable(COMP_t *compx)
+{
+    compx->CSR &= (~COMP_CSR_FLTEN);
+}
+
+/** 
+* @brief  获取COMP使能状态
+* @param  compx COMP外设
+* @retval uint32_t 返回判断结果
+*             @arg 非0: 表示COMP已使能
+*             @arg 0:   表示COMP未使能
+*/
+__STATIC_INLINE uint32_t std_comp_get_enable_status(COMP_t *compx)
+{
+    return (compx->CSR & COMP_CSR_EN);
+}
+
+/** 
+* @brief  获取COMP输出结果
+* @param  compx COMP外设
+* @retval uint32_t 返回COMP输出结果
+*             @arg COMP_OUTPUT_LEVEL_LOW
+*             @arg COMP_OUTPUT_LEVEL_HIGH
+*/
+__STATIC_INLINE uint32_t std_comp_get_output_result(COMP_t *compx)
+{
+    return ((compx->CSR & COMP_CSR_VAL) >> COMP_CSR_VAL_POS);
+}
+
+/** 
+* @brief  COMP参考电压源设置
+*             @arg COMP_REFERENCE_VBGR
+*             @arg COMP_REFERENCE_VDDA_DIV
+* @note   VDDA分压作为参考电压源,需配置VDDA分压参数;
+* @retval 无
+*/
+__STATIC_INLINE void std_comp_set_reference_source(uint32_t reference_voltage)
+{
+    MODIFY_REG(COMP_COMMON->CR, COMP_CR_VCSEL, reference_voltage);
+}
+
+/** 
+* @brief  获取COMP参考电压源
+* @retval uint32_t  返回参考电源源
+*             @arg COMP_REFERENCE_VBGR
+*             @arg COMP_REFERENCE_VDDA_DIV
+*/
+__STATIC_INLINE uint32_t std_comp_get_reference_source(void)
+{
+    return (COMP_COMMON->CR & COMP_CR_VCSEL);
+}
+
+/** 
+* @brief  设置VDDA 16级分压
+* @param  vdda_div VDDA 16级分压
+*             @arg COMP_VDDA_DIV_1DIV16
+*             @arg COMP_VDDA_DIV_2DIV16
+*             @arg ...
+*             @arg COMP_VDDA_DIV_13DIV16
+* @retval 无
+*/
+__STATIC_INLINE void std_comp_set_ref_vdda_div(uint32_t vdda_div)
+{
+    MODIFY_REG(COMP_COMMON->CR, COMP_CR_VCDIV, vdda_div);
+}
+
+/** 
+* @brief  获取VDDA 16级分压
+* @retval uint32_t 返回 VDDA 16级分压
+*             @arg COMP_VDDA_DIV_1DIV16
+*             @arg COMP_VDDA_DIV_2DIV16
+*             @arg ...
+*             @arg COMP_VDDA_DIV_13DIV16
+*/
+__STATIC_INLINE uint32_t std_comp_get_ref_vdda_div(void)
+{
+    return (COMP_COMMON->CR & COMP_CR_VCDIV);
+}
+
+/** 
+* @brief  配置COMP的正相输入和反向输入
+* @param  compx COMP外设
+* @param  input_plus 正相输入选择
+*             @arg COMP_INPSEL_IO1
+*             @arg COMP_INPSEL_IO2
+* @param  input_minis 反向相输入选择
+*             @arg COMP_INMSEL_INVREF
+*             @arg COMP_INMSEL_IO
+*
+* @retval 无
+*/
+__STATIC_INLINE void std_comp_input_config(COMP_t *compx, uint32_t input_plus, uint32_t input_minis)
+{
+    MODIFY_REG(compx->CSR,
+               (COMP_CSR_INP | COMP_CSR_INM),
+               (input_plus | input_minis));
+}
+
+/* COMP去初始化函数 */
+void std_comp_deinit(COMP_t *compx);
+
+/**
+* @}
+*/
+
+#ifdef __cplusplus
+}
+#endif
+
+/**
+* @}
+*/
+
+/**
+* @}
+*/
+
+#endif /* CIU32F003_STD_COMP_H */

+ 407 - 0
CIU32F003_LIB/Include/ciu32f003_std_comp.h

@@ -0,0 +1,407 @@
+/************************************************************************************************/
+/**
+* @file               ciu32f003_std_comp.h
+* @author             MCU Ecosystem Development Team
+* @brief              COMP STD库驱动头文件。
+*                     提供COMP相关的STD库操作函数声明、数据类型以及常量的定义。                         
+*                     
+*
+**************************************************************************************************
+* @attention
+* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
+*
+**************************************************************************************************
+*/
+
+/* 避免头文件重复引用 */
+#ifndef CIU32F003_STD_COMP_H
+#define CIU32F003_STD_COMP_H
+
+/************************************************************************************************/
+/** 
+* @addtogroup CIU32F003_STD_Driver
+* @{
+*/
+
+/**
+* @defgroup COMP COMP
+* @brief 比较器的STD库驱动
+* @{
+*/
+/************************************************************************************************/
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/*------------------------------------------includes--------------------------------------------*/
+#include "ciu32f003_std_common.h"
+
+/*--------------------------------------------define--------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @defgroup COMP_Constants COMP Constants 
+* @brief  COMP常量定义及宏定义
+* @{
+*
+*/
+/************************************************************************************************/
+     
+/* 比较器内部参考电压VDDA 分压 */     
+#define COMP_VDDA_DIV_1DIV16             COMP_CR_VCDIV_1DIV16         /**< VDDA 分压选择1/16    */
+#define COMP_VDDA_DIV_2DIV16             COMP_CR_VCDIV_2DIV16         /**< VDDA 分压选择2/16    */     
+#define COMP_VDDA_DIV_3DIV16             COMP_CR_VCDIV_3DIV16         /**< VDDA 分压选择3/16    */     
+#define COMP_VDDA_DIV_4DIV16             COMP_CR_VCDIV_4DIV16         /**< VDDA 分压选择4/16    */     
+#define COMP_VDDA_DIV_5DIV16             COMP_CR_VCDIV_5DIV16         /**< VDDA 分压选择5/16    */
+#define COMP_VDDA_DIV_6DIV16             COMP_CR_VCDIV_6DIV16         /**< VDDA 分压选择6/16    */
+#define COMP_VDDA_DIV_7DIV16             COMP_CR_VCDIV_7DIV16         /**< VDDA 分压选择7/16    */
+#define COMP_VDDA_DIV_8DIV16             COMP_CR_VCDIV_8DIV16         /**< VDDA 分压选择8/16    */
+#define COMP_VDDA_DIV_9DIV16             COMP_CR_VCDIV_9DIV16         /**< VDDA 分压选择9/16    */     
+#define COMP_VDDA_DIV_10DIV16            COMP_CR_VCDIV_10DIV16        /**< VDDA 分压选择10/16   */     
+#define COMP_VDDA_DIV_11DIV16            COMP_CR_VCDIV_11DIV16        /**< VDDA 分压选择11/16   */     
+#define COMP_VDDA_DIV_12DIV16            COMP_CR_VCDIV_12DIV16        /**< VDDA 分压选择12/16   */
+#define COMP_VDDA_DIV_13DIV16            COMP_CR_VCDIV_13DIV16        /**< VDDA 分压选择13/16   */
+
+/* 比较器正相输入 */
+#define COMP_INPSEL_IO1                   COMP_CSR_INP_IO1            /**< 正相输入 COMP1 = PB0, COMP2 = PA3 */
+#define COMP_INPSEL_IO2                   COMP_CSR_INP_IO2            /**< 正相输入 COMP1 = PB1, COMP2 = PA4 */
+
+/* 比较器反相输入 */
+#define COMP_INMSEL_INVREF                COMP_CSR_INM_INT_VREF       /**< 反相输入 内部参考电压 */
+#define COMP_INMSEL_IO                    COMP_CSR_INM_IO             /**< 反相输入 COMP1 = PB1, COMP2 = PA4 */                      
+
+/* 比较器正相输入模式选择,可用于选择窗口比较器功能 */
+#define COMP_INPMODE_EACH_INPUT           (0x00000000U)               /**< 正相输入各自独立,由各自inpsel决定 */
+#define COMP_INPMODE_COMMON_INPUT         COMP_CSR_INPMOD             /**< 正相输入相互连接,即窗口比较器模式 */
+
+/* 比较器滤波时间 */
+#define COMP_FLTIME_1CYCLE                COMP_CSR_FLTIME_1CYCLE      /**< 滤波时间 1个CYCLE    */
+#define COMP_FLTIME_3CYCLE                COMP_CSR_FLTIME_3CYCLE      /**< 滤波时间 3个CYCLE    */
+#define COMP_FLTIME_7CYCLE                COMP_CSR_FLTIME_7CYCLE      /**< 滤波时间 7个CYCLE    */
+#define COMP_FLTIME_15CYCLE               COMP_CSR_FLTIME_15CYCLE     /**< 滤波时间 15个CYCLE   */
+#define COMP_FLTIME_31CYCLE               COMP_CSR_FLTIME_31CYCLE     /**< 滤波时间 31个CYCLE   */
+#define COMP_FLTIME_63CYCLE               COMP_CSR_FLTIME_63CYCLE     /**< 滤波时间 63个CYCLE   */
+#define COMP_FLTIME_255CYCLE              COMP_CSR_FLTIME_255CYCLE    /**< 滤波时间 255个CYCLE  */
+#define COMP_FLTIME_1023CYCLE             COMP_CSR_FLTIME_1023CYCLE   /**< 滤波时间 1023个CYCLE */
+
+/* 比较器输出极性 */
+#define COMP_OUTPOL_NON_INVERTED          (0x00000000U)               /**< 输出状态不反相 */
+#define COMP_OUTPOL_INVERTED              COMP_CSR_POL                /**< 输出状态反相   */
+
+/* 比较器输出选择 */
+#define COMP_OUTMODE_EACH_OUT             (0x00000000U)               /**< 输出为其原始电压比较结果         */
+#define COMP_OUTMODE_COMMON_XOR_OUT       COMP_CSR_OUTMOD             /**< 输出为比较器1、2电压比较结果异或 */
+
+/* 比较器输出结果 */
+#define COMP_OUTPUT_LEVEL_LOW             (0x00000000UL)              /**< 比较器输出电平低 */
+#define COMP_OUTPUT_LEVEL_HIGH            (0x00000001UL)              /**< 比较器输出电平高 */
+
+/* 比较器内部参考电压源 */
+#define COMP_REFERENCE_VBGR               (0x00000000UL)              /**< 比较器内部参考电压源选择VBGR         */
+#define COMP_REFERENCE_VDDA_DIV           COMP_CR_VCSEL               /**< 比较器内部参考电压源选择VDDA 16级分压 */
+
+/* COMP启动稳定时间 */
+#define COMP_EN_DELAY                     (1U)                        /**< COMP使能启动时间 */
+
+/** 
+* @} 
+*/
+
+/*-------------------------------------------functions------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @defgroup COMP_External_Functions COMP External Functions
+* @brief    COMP对外函数
+* @{
+*
+*/
+/************************************************************************************************/
+/** 
+* @brief  使能COMP
+* @param  compx COMP外设
+* @retval 无
+*/
+__STATIC_INLINE void std_comp_enable(COMP_t *compx)
+{
+    compx->CSR |= (COMP_CSR_EN);
+}
+
+/** 
+* @brief  禁止COMP
+* @param  compx COMP外设
+* @retval 无
+*/
+__STATIC_INLINE void std_comp_disable(COMP_t *compx)
+{
+    compx->CSR &= (~COMP_CSR_EN);
+}
+
+/** 
+* @brief  设置COMP反相输入
+* @param  compx COMP外设
+* @param  input_minus 反相输入选择
+*             @arg COMP_INMSEL_INVREF
+*             @arg COMP_INMSEL_IO
+* @retval 无
+*/
+__STATIC_INLINE void std_comp_set_input_minus(COMP_t *compx, uint32_t input_minus)
+{
+    MODIFY_REG(compx->CSR, COMP_CSR_INM, input_minus);
+}
+
+/** 
+* @brief  获取COMP反相输入
+* @param  compx COMP外设
+* @retval uint32_t 返回反相输入
+*             @arg COMP_INMSEL_INVREF
+*             @arg COMP_INMSEL_IO
+*/
+__STATIC_INLINE uint32_t std_comp_get_input_minus(COMP_t *compx)
+{
+    return(compx->CSR & COMP_CSR_INM);
+}
+
+/** 
+* @brief  设置COMP正相输入
+* @param  compx COMP外设
+* @param  input_plus 正相输入选择
+*             @arg COMP_INPSEL_IO1
+*             @arg COMP_INPSEL_IO2
+* @retval 无
+*/
+__STATIC_INLINE void std_comp_set_input_plus(COMP_t *compx, uint32_t input_plus)
+{
+    MODIFY_REG(compx->CSR, COMP_CSR_INP, input_plus);
+}
+
+/** 
+* @brief  获取COMP正相输入
+* @param  compx COMP外设
+* @retval uint32_t 返回正相输入
+*             @arg COMP_INPSEL_IO1
+*             @arg COMP_INPSEL_IO2
+*/
+__STATIC_INLINE uint32_t std_comp_get_input_plus(COMP_t *compx)
+{
+    return(compx->CSR & COMP_CSR_INP);
+}
+
+/** 
+* @brief  设置COMP正相输入模式
+* @param  compx COMP外设
+* @param  input_mode 正相输入模式选择
+*             @arg COMP_INPMODE_EACH_INPUT
+*             @arg COMP_INPMODE_COMMON_INPUT
+* @retval 无
+*/
+__STATIC_INLINE void std_comp_set_input_plus_mode(COMP_t *compx, uint32_t input_mode)
+{
+    MODIFY_REG(compx->CSR, COMP_CSR_INPMOD, input_mode);
+}
+
+/** 
+* @brief  设置COMP输出模式
+* @param  compx COMP外设
+* @param  output_mode 输出模式选择
+*             @arg COMP_OUTMODE_EACH_OUT
+*             @arg COMP_OUTMODE_COMMON_XOR_OUT
+* @retval 无
+*/
+__STATIC_INLINE void std_comp_set_output_mode(COMP_t *compx, uint32_t output_mode)
+{
+    MODIFY_REG(compx->CSR, COMP_CSR_OUTMOD, output_mode);
+}
+
+/** 
+* @brief  设置COMP输出极性
+* @param  compx COMP外设
+* @param  output_polarity 输出极性选择
+*             @arg COMP_OUTPOL_NON_INVERTED
+*             @arg COMP_OUTPOL_INVERTED
+* @retval 无
+*/
+__STATIC_INLINE void std_comp_set_output_polarity(COMP_t *compx, uint32_t output_polarity)
+{
+    MODIFY_REG(compx->CSR, COMP_CSR_POL, output_polarity);
+}
+
+/** 
+* @brief  获取COMP输出极性
+* @param  compx COMP外设
+* @retval uint32_t 返回输出极性
+*             @arg COMP_OUTPOL_NON_INVERTED
+*             @arg COMP_OUTPOL_INVERTED
+*/
+__STATIC_INLINE uint32_t std_comp_get_output_polarity(COMP_t *compx)
+{
+    return(compx->CSR & COMP_CSR_POL);
+}
+
+/** 
+* @brief  使能COMP的输入迟滞
+* @retval 无
+*/
+__STATIC_INLINE void std_comp_input_hysteresis_enable(void)
+{
+    COMP_COMMON->CR |= COMP_CR_HYST;
+}
+
+/** 
+* @brief  禁止COMP的输入迟滞
+* @retval 无
+*/
+__STATIC_INLINE void std_comp_input_hysteresis_disable(void)
+{
+    COMP_COMMON->CR &= ~COMP_CR_HYST;
+}
+
+/** 
+* @brief  设置COMP输出滤波时间
+* @param  compx COMP外设
+* @param  filter_time 滤波时间选择
+*             @arg COMP_FLTIME_1CYCLE
+*             @arg COMP_FLTIME_3CYCLE
+*             @arg ...
+*             @arg COMP_FLTIME_1023CYCLE
+* @retval 无
+*/
+__STATIC_INLINE void std_comp_set_output_filter_time(COMP_t *compx, uint32_t filter_time)
+{
+    MODIFY_REG(compx->CSR, COMP_CSR_FLTIME, filter_time);
+}
+
+/** 
+* @brief  COMP输出滤波使能
+* @param  compx COMP外设
+* @retval 无
+*/
+__STATIC_INLINE void std_comp_output_filter_enable(COMP_t *compx)
+{
+    compx->CSR |= (COMP_CSR_FLTEN);
+}
+
+/** 
+* @brief  COMP输出滤波禁止
+* @param  compx COMP外设
+* @retval 无
+*/
+__STATIC_INLINE void std_comp_output_filter_disable(COMP_t *compx)
+{
+    compx->CSR &= (~COMP_CSR_FLTEN);
+}
+
+/** 
+* @brief  获取COMP使能状态
+* @param  compx COMP外设
+* @retval uint32_t 返回判断结果
+*             @arg 非0: 表示COMP已使能
+*             @arg 0:   表示COMP未使能
+*/
+__STATIC_INLINE uint32_t std_comp_get_enable_status(COMP_t *compx)
+{
+    return (compx->CSR & COMP_CSR_EN);
+}
+
+/** 
+* @brief  获取COMP输出结果
+* @param  compx COMP外设
+* @retval uint32_t 返回COMP输出结果
+*             @arg COMP_OUTPUT_LEVEL_LOW
+*             @arg COMP_OUTPUT_LEVEL_HIGH
+*/
+__STATIC_INLINE uint32_t std_comp_get_output_result(COMP_t *compx)
+{
+    return ((compx->CSR & COMP_CSR_VAL) >> COMP_CSR_VAL_POS);
+}
+
+/** 
+* @brief  COMP参考电压源设置
+*             @arg COMP_REFERENCE_VBGR
+*             @arg COMP_REFERENCE_VDDA_DIV
+* @note   VDDA分压作为参考电压源,需配置VDDA分压参数;
+* @retval 无
+*/
+__STATIC_INLINE void std_comp_set_reference_source(uint32_t reference_voltage)
+{
+    MODIFY_REG(COMP_COMMON->CR, COMP_CR_VCSEL, reference_voltage);
+}
+
+/** 
+* @brief  获取COMP参考电压源
+* @retval uint32_t  返回参考电源源
+*             @arg COMP_REFERENCE_VBGR
+*             @arg COMP_REFERENCE_VDDA_DIV
+*/
+__STATIC_INLINE uint32_t std_comp_get_reference_source(void)
+{
+    return (COMP_COMMON->CR & COMP_CR_VCSEL);
+}
+
+/** 
+* @brief  设置VDDA 16级分压
+* @param  vdda_div VDDA 16级分压
+*             @arg COMP_VDDA_DIV_1DIV16
+*             @arg COMP_VDDA_DIV_2DIV16
+*             @arg ...
+*             @arg COMP_VDDA_DIV_13DIV16
+* @retval 无
+*/
+__STATIC_INLINE void std_comp_set_ref_vdda_div(uint32_t vdda_div)
+{
+    MODIFY_REG(COMP_COMMON->CR, COMP_CR_VCDIV, vdda_div);
+}
+
+/** 
+* @brief  获取VDDA 16级分压
+* @retval uint32_t 返回 VDDA 16级分压
+*             @arg COMP_VDDA_DIV_1DIV16
+*             @arg COMP_VDDA_DIV_2DIV16
+*             @arg ...
+*             @arg COMP_VDDA_DIV_13DIV16
+*/
+__STATIC_INLINE uint32_t std_comp_get_ref_vdda_div(void)
+{
+    return (COMP_COMMON->CR & COMP_CR_VCDIV);
+}
+
+/** 
+* @brief  配置COMP的正相输入和反向输入
+* @param  compx COMP外设
+* @param  input_plus 正相输入选择
+*             @arg COMP_INPSEL_IO1
+*             @arg COMP_INPSEL_IO2
+* @param  input_minis 反向相输入选择
+*             @arg COMP_INMSEL_INVREF
+*             @arg COMP_INMSEL_IO
+*
+* @retval 无
+*/
+__STATIC_INLINE void std_comp_input_config(COMP_t *compx, uint32_t input_plus, uint32_t input_minis)
+{
+    MODIFY_REG(compx->CSR,
+               (COMP_CSR_INP | COMP_CSR_INM),
+               (input_plus | input_minis));
+}
+
+/* COMP去初始化函数 */
+void std_comp_deinit(COMP_t *compx);
+
+/**
+* @}
+*/
+
+#ifdef __cplusplus
+}
+#endif
+
+/**
+* @}
+*/
+
+/**
+* @}
+*/
+
+#endif /* CIU32F003_STD_COMP_H */

+ 129 - 0
CIU32F003_LIB/Include/ciu32f003_std_config(1).h

@@ -0,0 +1,129 @@
+/************************************************************************************************/
+/**
+* @file               ciu32f003_std_config.h
+* @author             MCU Ecosystem Development Team
+* @brief              STD库相关配置项定义。
+*                     
+*
+**************************************************************************************************
+* @attention
+* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
+*
+**************************************************************************************************
+*/
+
+/*避免头文件重复引用*/
+#ifndef CIU32F003_STD_CONFIG_H
+#define CIU32F003_STD_CONFIG_H   
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+    
+/*--------------------------------------------define--------------------------------------------*/
+/* 定义CIU32F003 STD库中所有芯片外设的使用开关 */
+#define STD_ADC_PERIPHERAL_USED
+#define STD_COMP_PERIPHERAL_USED
+#define STD_CRC_PERIPHERAL_USED
+#define STD_DBG_PERIPHERAL_USED
+#define STD_EXTI_PERIPHERAL_USED 
+#define STD_FLASH_PERIPHERAL_USED
+#define STD_GPIO_PERIPHERAL_USED
+#define STD_I2C_PERIPHERAL_USED
+#define STD_IRTIM_PERIPHERAL_USED
+#define STD_IWDG_PERIPHERAL_USED
+#define STD_LPTIM_PERIPHERAL_USED
+#define STD_PMU_PERIPHERAL_USED
+#define STD_SPI_PERIPHERAL_USED
+#define STD_TIM_PERIPHERAL_USED
+#define STD_UART_PERIPHERAL_USED  
+
+
+#if !defined  (EXTCLK_VALUE)  
+    #define EXTCLK_VALUE    (8000000UL)     /**< EXTclock frequency(Hz)  */
+#endif 
+#if !defined  (RCH_VALUE)
+    #define RCH_VALUE      (48000000UL)     /**< RCH clock frequency(Hz) */
+#endif 
+
+#if !defined  (RCL_VALUE)
+    #define RCL_VALUE      (32000UL)        /**< RCL clock frequency(Hz) */
+#endif 
+
+
+
+/*------------------------------------------includes--------------------------------------------*/
+
+/* 根据外设配置,引用外设头文件 */
+#include "ciu32f003_std_rcc.h"
+    
+#ifdef STD_ADC_PERIPHERAL_USED
+    #include "ciu32f003_std_adc.h"
+#endif 
+
+#ifdef STD_COMP_PERIPHERAL_USED
+    #include "ciu32f003_std_comp.h"
+#endif 
+
+#ifdef STD_CRC_PERIPHERAL_USED
+    #include "ciu32f003_std_crc.h"
+#endif 
+
+#ifdef STD_DBG_PERIPHERAL_USED
+    #include "ciu32f003_std_dbg.h"
+#endif 
+
+#ifdef STD_EXTI_PERIPHERAL_USED
+    #include "ciu32f003_std_exti.h"
+#endif 
+
+#ifdef STD_FLASH_PERIPHERAL_USED
+    #include "ciu32f003_std_flash.h"
+#endif 
+
+#ifdef STD_GPIO_PERIPHERAL_USED
+    #include "ciu32f003_std_gpio.h"
+#endif 
+
+#ifdef STD_I2C_PERIPHERAL_USED
+    #include "ciu32f003_std_i2c.h"
+#endif 
+
+#ifdef STD_IRTIM_PERIPHERAL_USED
+    #include "ciu32f003_std_irtim.h"
+#endif 
+
+#ifdef STD_IWDG_PERIPHERAL_USED
+    #include "ciu32f003_std_iwdg.h"
+#endif 
+
+#ifdef STD_LPTIM_PERIPHERAL_USED
+    #include "ciu32f003_std_lptim.h"
+#endif 
+
+#ifdef STD_PMU_PERIPHERAL_USED
+    #include "ciu32f003_std_pmu.h"
+#endif 
+
+#ifdef STD_SPI_PERIPHERAL_USED
+    #include "ciu32f003_std_spi.h"
+#endif
+
+#ifdef STD_TIM_PERIPHERAL_USED
+    #include "ciu32f003_std_tim.h"
+#endif
+
+#ifdef STD_UART_PERIPHERAL_USED
+    #include "ciu32f003_std_uart.h"
+#endif
+
+
+/*-------------------------------------------functions------------------------------------------*/
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* CIU32F003_STD_CONFIG_H */
+

+ 129 - 0
CIU32F003_LIB/Include/ciu32f003_std_config(2).h

@@ -0,0 +1,129 @@
+/************************************************************************************************/
+/**
+* @file               ciu32f003_std_config.h
+* @author             MCU Ecosystem Development Team
+* @brief              STD库相关配置项定义。
+*                     
+*
+**************************************************************************************************
+* @attention
+* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
+*
+**************************************************************************************************
+*/
+
+/*避免头文件重复引用*/
+#ifndef CIU32F003_STD_CONFIG_H
+#define CIU32F003_STD_CONFIG_H   
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+    
+/*--------------------------------------------define--------------------------------------------*/
+/* 定义CIU32F003 STD库中所有芯片外设的使用开关 */
+#define STD_ADC_PERIPHERAL_USED
+#define STD_COMP_PERIPHERAL_USED
+#define STD_CRC_PERIPHERAL_USED
+#define STD_DBG_PERIPHERAL_USED
+#define STD_EXTI_PERIPHERAL_USED 
+#define STD_FLASH_PERIPHERAL_USED
+#define STD_GPIO_PERIPHERAL_USED
+#define STD_I2C_PERIPHERAL_USED
+#define STD_IRTIM_PERIPHERAL_USED
+#define STD_IWDG_PERIPHERAL_USED
+#define STD_LPTIM_PERIPHERAL_USED
+#define STD_PMU_PERIPHERAL_USED
+#define STD_SPI_PERIPHERAL_USED
+#define STD_TIM_PERIPHERAL_USED
+#define STD_UART_PERIPHERAL_USED  
+
+
+#if !defined  (EXTCLK_VALUE)  
+    #define EXTCLK_VALUE    (8000000UL)     /**< EXTclock frequency(Hz)  */
+#endif 
+#if !defined  (RCH_VALUE)
+    #define RCH_VALUE      (48000000UL)     /**< RCH clock frequency(Hz) */
+#endif 
+
+#if !defined  (RCL_VALUE)
+    #define RCL_VALUE      (32000UL)        /**< RCL clock frequency(Hz) */
+#endif 
+
+
+
+/*------------------------------------------includes--------------------------------------------*/
+
+/* 根据外设配置,引用外设头文件 */
+#include "ciu32f003_std_rcc.h"
+    
+#ifdef STD_ADC_PERIPHERAL_USED
+    #include "ciu32f003_std_adc.h"
+#endif 
+
+#ifdef STD_COMP_PERIPHERAL_USED
+    #include "ciu32f003_std_comp.h"
+#endif 
+
+#ifdef STD_CRC_PERIPHERAL_USED
+    #include "ciu32f003_std_crc.h"
+#endif 
+
+#ifdef STD_DBG_PERIPHERAL_USED
+    #include "ciu32f003_std_dbg.h"
+#endif 
+
+#ifdef STD_EXTI_PERIPHERAL_USED
+    #include "ciu32f003_std_exti.h"
+#endif 
+
+#ifdef STD_FLASH_PERIPHERAL_USED
+    #include "ciu32f003_std_flash.h"
+#endif 
+
+#ifdef STD_GPIO_PERIPHERAL_USED
+    #include "ciu32f003_std_gpio.h"
+#endif 
+
+#ifdef STD_I2C_PERIPHERAL_USED
+    #include "ciu32f003_std_i2c.h"
+#endif 
+
+#ifdef STD_IRTIM_PERIPHERAL_USED
+    #include "ciu32f003_std_irtim.h"
+#endif 
+
+#ifdef STD_IWDG_PERIPHERAL_USED
+    #include "ciu32f003_std_iwdg.h"
+#endif 
+
+#ifdef STD_LPTIM_PERIPHERAL_USED
+    #include "ciu32f003_std_lptim.h"
+#endif 
+
+#ifdef STD_PMU_PERIPHERAL_USED
+    #include "ciu32f003_std_pmu.h"
+#endif 
+
+#ifdef STD_SPI_PERIPHERAL_USED
+    #include "ciu32f003_std_spi.h"
+#endif
+
+#ifdef STD_TIM_PERIPHERAL_USED
+    #include "ciu32f003_std_tim.h"
+#endif
+
+#ifdef STD_UART_PERIPHERAL_USED
+    #include "ciu32f003_std_uart.h"
+#endif
+
+
+/*-------------------------------------------functions------------------------------------------*/
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* CIU32F003_STD_CONFIG_H */
+

+ 129 - 0
CIU32F003_LIB/Include/ciu32f003_std_config(3).h

@@ -0,0 +1,129 @@
+/************************************************************************************************/
+/**
+* @file               ciu32f003_std_config.h
+* @author             MCU Ecosystem Development Team
+* @brief              STD库相关配置项定义。
+*                     
+*
+**************************************************************************************************
+* @attention
+* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
+*
+**************************************************************************************************
+*/
+
+/*避免头文件重复引用*/
+#ifndef CIU32F003_STD_CONFIG_H
+#define CIU32F003_STD_CONFIG_H   
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+    
+/*--------------------------------------------define--------------------------------------------*/
+/* 定义CIU32F003 STD库中所有芯片外设的使用开关 */
+#define STD_ADC_PERIPHERAL_USED
+#define STD_COMP_PERIPHERAL_USED
+#define STD_CRC_PERIPHERAL_USED
+#define STD_DBG_PERIPHERAL_USED
+#define STD_EXTI_PERIPHERAL_USED 
+#define STD_FLASH_PERIPHERAL_USED
+#define STD_GPIO_PERIPHERAL_USED
+#define STD_I2C_PERIPHERAL_USED
+#define STD_IRTIM_PERIPHERAL_USED
+#define STD_IWDG_PERIPHERAL_USED
+#define STD_LPTIM_PERIPHERAL_USED
+#define STD_PMU_PERIPHERAL_USED
+#define STD_SPI_PERIPHERAL_USED
+#define STD_TIM_PERIPHERAL_USED
+#define STD_UART_PERIPHERAL_USED  
+
+
+#if !defined  (EXTCLK_VALUE)  
+    #define EXTCLK_VALUE    (8000000UL)     /**< EXTclock frequency(Hz)  */
+#endif 
+#if !defined  (RCH_VALUE)
+    #define RCH_VALUE      (48000000UL)     /**< RCH clock frequency(Hz) */
+#endif 
+
+#if !defined  (RCL_VALUE)
+    #define RCL_VALUE      (32000UL)        /**< RCL clock frequency(Hz) */
+#endif 
+
+
+
+/*------------------------------------------includes--------------------------------------------*/
+
+/* 根据外设配置,引用外设头文件 */
+#include "ciu32f003_std_rcc.h"
+    
+#ifdef STD_ADC_PERIPHERAL_USED
+    #include "ciu32f003_std_adc.h"
+#endif 
+
+#ifdef STD_COMP_PERIPHERAL_USED
+    #include "ciu32f003_std_comp.h"
+#endif 
+
+#ifdef STD_CRC_PERIPHERAL_USED
+    #include "ciu32f003_std_crc.h"
+#endif 
+
+#ifdef STD_DBG_PERIPHERAL_USED
+    #include "ciu32f003_std_dbg.h"
+#endif 
+
+#ifdef STD_EXTI_PERIPHERAL_USED
+    #include "ciu32f003_std_exti.h"
+#endif 
+
+#ifdef STD_FLASH_PERIPHERAL_USED
+    #include "ciu32f003_std_flash.h"
+#endif 
+
+#ifdef STD_GPIO_PERIPHERAL_USED
+    #include "ciu32f003_std_gpio.h"
+#endif 
+
+#ifdef STD_I2C_PERIPHERAL_USED
+    #include "ciu32f003_std_i2c.h"
+#endif 
+
+#ifdef STD_IRTIM_PERIPHERAL_USED
+    #include "ciu32f003_std_irtim.h"
+#endif 
+
+#ifdef STD_IWDG_PERIPHERAL_USED
+    #include "ciu32f003_std_iwdg.h"
+#endif 
+
+#ifdef STD_LPTIM_PERIPHERAL_USED
+    #include "ciu32f003_std_lptim.h"
+#endif 
+
+#ifdef STD_PMU_PERIPHERAL_USED
+    #include "ciu32f003_std_pmu.h"
+#endif 
+
+#ifdef STD_SPI_PERIPHERAL_USED
+    #include "ciu32f003_std_spi.h"
+#endif
+
+#ifdef STD_TIM_PERIPHERAL_USED
+    #include "ciu32f003_std_tim.h"
+#endif
+
+#ifdef STD_UART_PERIPHERAL_USED
+    #include "ciu32f003_std_uart.h"
+#endif
+
+
+/*-------------------------------------------functions------------------------------------------*/
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* CIU32F003_STD_CONFIG_H */
+

+ 129 - 0
CIU32F003_LIB/Include/ciu32f003_std_config.h

@@ -0,0 +1,129 @@
+/************************************************************************************************/
+/**
+* @file               ciu32f003_std_config.h
+* @author             MCU Ecosystem Development Team
+* @brief              STD库相关配置项定义。
+*                     
+*
+**************************************************************************************************
+* @attention
+* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
+*
+**************************************************************************************************
+*/
+
+/*避免头文件重复引用*/
+#ifndef CIU32F003_STD_CONFIG_H
+#define CIU32F003_STD_CONFIG_H   
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+    
+/*--------------------------------------------define--------------------------------------------*/
+/* 定义CIU32F003 STD库中所有芯片外设的使用开关 */
+#define STD_ADC_PERIPHERAL_USED
+#define STD_COMP_PERIPHERAL_USED
+#define STD_CRC_PERIPHERAL_USED
+#define STD_DBG_PERIPHERAL_USED
+#define STD_EXTI_PERIPHERAL_USED 
+#define STD_FLASH_PERIPHERAL_USED
+#define STD_GPIO_PERIPHERAL_USED
+#define STD_I2C_PERIPHERAL_USED
+#define STD_IRTIM_PERIPHERAL_USED
+#define STD_IWDG_PERIPHERAL_USED
+#define STD_LPTIM_PERIPHERAL_USED
+#define STD_PMU_PERIPHERAL_USED
+#define STD_SPI_PERIPHERAL_USED
+#define STD_TIM_PERIPHERAL_USED
+#define STD_UART_PERIPHERAL_USED  
+
+
+#if !defined  (EXTCLK_VALUE)  
+    #define EXTCLK_VALUE    (8000000UL)     /**< EXTclock frequency(Hz)  */
+#endif 
+#if !defined  (RCH_VALUE)
+    #define RCH_VALUE      (48000000UL)     /**< RCH clock frequency(Hz) */
+#endif 
+
+#if !defined  (RCL_VALUE)
+    #define RCL_VALUE      (32000UL)        /**< RCL clock frequency(Hz) */
+#endif 
+
+
+
+/*------------------------------------------includes--------------------------------------------*/
+
+/* 根据外设配置,引用外设头文件 */
+#include "ciu32f003_std_rcc.h"
+    
+#ifdef STD_ADC_PERIPHERAL_USED
+    #include "ciu32f003_std_adc.h"
+#endif 
+
+#ifdef STD_COMP_PERIPHERAL_USED
+    #include "ciu32f003_std_comp.h"
+#endif 
+
+#ifdef STD_CRC_PERIPHERAL_USED
+    #include "ciu32f003_std_crc.h"
+#endif 
+
+#ifdef STD_DBG_PERIPHERAL_USED
+    #include "ciu32f003_std_dbg.h"
+#endif 
+
+#ifdef STD_EXTI_PERIPHERAL_USED
+    #include "ciu32f003_std_exti.h"
+#endif 
+
+#ifdef STD_FLASH_PERIPHERAL_USED
+    #include "ciu32f003_std_flash.h"
+#endif 
+
+#ifdef STD_GPIO_PERIPHERAL_USED
+    #include "ciu32f003_std_gpio.h"
+#endif 
+
+#ifdef STD_I2C_PERIPHERAL_USED
+    #include "ciu32f003_std_i2c.h"
+#endif 
+
+#ifdef STD_IRTIM_PERIPHERAL_USED
+    #include "ciu32f003_std_irtim.h"
+#endif 
+
+#ifdef STD_IWDG_PERIPHERAL_USED
+    #include "ciu32f003_std_iwdg.h"
+#endif 
+
+#ifdef STD_LPTIM_PERIPHERAL_USED
+    #include "ciu32f003_std_lptim.h"
+#endif 
+
+#ifdef STD_PMU_PERIPHERAL_USED
+    #include "ciu32f003_std_pmu.h"
+#endif 
+
+#ifdef STD_SPI_PERIPHERAL_USED
+    #include "ciu32f003_std_spi.h"
+#endif
+
+#ifdef STD_TIM_PERIPHERAL_USED
+    #include "ciu32f003_std_tim.h"
+#endif
+
+#ifdef STD_UART_PERIPHERAL_USED
+    #include "ciu32f003_std_uart.h"
+#endif
+
+
+/*-------------------------------------------functions------------------------------------------*/
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* CIU32F003_STD_CONFIG_H */
+

+ 134 - 0
CIU32F003_LIB/Include/ciu32f003_std_crc(1).h

@@ -0,0 +1,134 @@
+/************************************************************************************************/
+/**
+* @file               ciu32f003_std_crc.h
+* @author             MCU Ecosystem Development Team
+* @brief              CRC STD库驱动头文件。
+*                     提供CRC相关的STD库操作函数声明、数据类型以及常量的定义。                         
+*                     
+*
+**************************************************************************************************
+* @attention
+* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
+*
+**************************************************************************************************
+*/
+
+/* 避免头文件重复引用 */
+#ifndef CIU32F003_STD_CRC_H
+#define CIU32F003_STD_CRC_H
+
+/************************************************************************************************/
+/** 
+* @addtogroup CIU32F003_STD_Driver
+* @{
+*/
+
+/**
+* @defgroup CRC CRC
+* @brief 循环冗余校验的STD库驱动
+* @{
+*/
+/************************************************************************************************/
+
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/*------------------------------------------includes--------------------------------------------*/
+#include "ciu32F003_std_common.h"
+
+
+/*--------------------------------------------define--------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @defgroup CRC_Constants CRC Constants 
+* @brief    CRC常量定义及宏定义
+* @{
+*
+*/
+/************************************************************************************************/
+/* CRC多项式选择 */
+#define CRC_POLY_16                           CRC_CSR_POLY_SIZE_16     /**< 16位多项式       */
+#define CRC_POLY_32                           CRC_CSR_POLY_SIZE_32     /**< 32位多项式       */
+
+/* CRC默认初始值 */
+#define CRC_DEFAULT_INIT_VALUE                (0xFFFFFFFFU)            /**< CRC默认初始值    */
+
+/** 
+* @} 
+*/
+
+/*-------------------------------------------functions------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @defgroup CRC_External_Functions CRC External Functions
+* @brief    CRC对外函数
+* @{
+*
+*/
+/************************************************************************************************/
+/** 
+* @brief  配置CRC多项式
+* @param  poly_size 多项式选择
+*             @arg CRC_POLY_16:16位多项式
+*             @arg CRC_POLY_32:32位多项式
+* @retval 无
+*/
+__STATIC_INLINE void std_crc_set_poly_size(uint32_t poly_size)
+{
+    CRC->CSR = poly_size;
+}
+
+/**
+* @brief  将CRC初始值未进行反转直接写入寄存器
+* @param  init_value CRC的初始值
+* @retval 无
+*/
+__STATIC_INLINE void std_crc_set_init_value(uint32_t init_value)
+{
+    CRC->RDR = init_value;
+}
+
+/**
+* @brief  读取CRC计算结果
+* @retval uint32_t CRC计算结果
+*/
+__STATIC_INLINE uint32_t std_crc_get_value(void)
+{
+    return(CRC->RDR);
+}
+
+/**
+* @brief  向数据寄存器中写入输入的1字节数据
+* @param  input_data 要进行CRC计算的原始数据
+* @retval 无
+*/
+__STATIC_INLINE void std_crc_set_byte(uint8_t input_data)
+{
+    CRC->DR = (uint32_t)input_data;
+}
+
+
+void std_crc_deinit(void);
+void std_crc_set_init_value_invert(uint32_t poly_sel, uint32_t init_value);
+
+/** 
+* @} 
+*/
+
+#ifdef __cplusplus
+}
+#endif
+
+/**
+* @}
+*/  
+
+/**
+* @}
+*/
+
+#endif /* CIU32F003_STD_CRC_H */

+ 134 - 0
CIU32F003_LIB/Include/ciu32f003_std_crc(2).h

@@ -0,0 +1,134 @@
+/************************************************************************************************/
+/**
+* @file               ciu32f003_std_crc.h
+* @author             MCU Ecosystem Development Team
+* @brief              CRC STD库驱动头文件。
+*                     提供CRC相关的STD库操作函数声明、数据类型以及常量的定义。                         
+*                     
+*
+**************************************************************************************************
+* @attention
+* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
+*
+**************************************************************************************************
+*/
+
+/* 避免头文件重复引用 */
+#ifndef CIU32F003_STD_CRC_H
+#define CIU32F003_STD_CRC_H
+
+/************************************************************************************************/
+/** 
+* @addtogroup CIU32F003_STD_Driver
+* @{
+*/
+
+/**
+* @defgroup CRC CRC
+* @brief 循环冗余校验的STD库驱动
+* @{
+*/
+/************************************************************************************************/
+
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/*------------------------------------------includes--------------------------------------------*/
+#include "ciu32F003_std_common.h"
+
+
+/*--------------------------------------------define--------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @defgroup CRC_Constants CRC Constants 
+* @brief    CRC常量定义及宏定义
+* @{
+*
+*/
+/************************************************************************************************/
+/* CRC多项式选择 */
+#define CRC_POLY_16                           CRC_CSR_POLY_SIZE_16     /**< 16位多项式       */
+#define CRC_POLY_32                           CRC_CSR_POLY_SIZE_32     /**< 32位多项式       */
+
+/* CRC默认初始值 */
+#define CRC_DEFAULT_INIT_VALUE                (0xFFFFFFFFU)            /**< CRC默认初始值    */
+
+/** 
+* @} 
+*/
+
+/*-------------------------------------------functions------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @defgroup CRC_External_Functions CRC External Functions
+* @brief    CRC对外函数
+* @{
+*
+*/
+/************************************************************************************************/
+/** 
+* @brief  配置CRC多项式
+* @param  poly_size 多项式选择
+*             @arg CRC_POLY_16:16位多项式
+*             @arg CRC_POLY_32:32位多项式
+* @retval 无
+*/
+__STATIC_INLINE void std_crc_set_poly_size(uint32_t poly_size)
+{
+    CRC->CSR = poly_size;
+}
+
+/**
+* @brief  将CRC初始值未进行反转直接写入寄存器
+* @param  init_value CRC的初始值
+* @retval 无
+*/
+__STATIC_INLINE void std_crc_set_init_value(uint32_t init_value)
+{
+    CRC->RDR = init_value;
+}
+
+/**
+* @brief  读取CRC计算结果
+* @retval uint32_t CRC计算结果
+*/
+__STATIC_INLINE uint32_t std_crc_get_value(void)
+{
+    return(CRC->RDR);
+}
+
+/**
+* @brief  向数据寄存器中写入输入的1字节数据
+* @param  input_data 要进行CRC计算的原始数据
+* @retval 无
+*/
+__STATIC_INLINE void std_crc_set_byte(uint8_t input_data)
+{
+    CRC->DR = (uint32_t)input_data;
+}
+
+
+void std_crc_deinit(void);
+void std_crc_set_init_value_invert(uint32_t poly_sel, uint32_t init_value);
+
+/** 
+* @} 
+*/
+
+#ifdef __cplusplus
+}
+#endif
+
+/**
+* @}
+*/  
+
+/**
+* @}
+*/
+
+#endif /* CIU32F003_STD_CRC_H */

+ 134 - 0
CIU32F003_LIB/Include/ciu32f003_std_crc(3).h

@@ -0,0 +1,134 @@
+/************************************************************************************************/
+/**
+* @file               ciu32f003_std_crc.h
+* @author             MCU Ecosystem Development Team
+* @brief              CRC STD库驱动头文件。
+*                     提供CRC相关的STD库操作函数声明、数据类型以及常量的定义。                         
+*                     
+*
+**************************************************************************************************
+* @attention
+* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
+*
+**************************************************************************************************
+*/
+
+/* 避免头文件重复引用 */
+#ifndef CIU32F003_STD_CRC_H
+#define CIU32F003_STD_CRC_H
+
+/************************************************************************************************/
+/** 
+* @addtogroup CIU32F003_STD_Driver
+* @{
+*/
+
+/**
+* @defgroup CRC CRC
+* @brief 循环冗余校验的STD库驱动
+* @{
+*/
+/************************************************************************************************/
+
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/*------------------------------------------includes--------------------------------------------*/
+#include "ciu32F003_std_common.h"
+
+
+/*--------------------------------------------define--------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @defgroup CRC_Constants CRC Constants 
+* @brief    CRC常量定义及宏定义
+* @{
+*
+*/
+/************************************************************************************************/
+/* CRC多项式选择 */
+#define CRC_POLY_16                           CRC_CSR_POLY_SIZE_16     /**< 16位多项式       */
+#define CRC_POLY_32                           CRC_CSR_POLY_SIZE_32     /**< 32位多项式       */
+
+/* CRC默认初始值 */
+#define CRC_DEFAULT_INIT_VALUE                (0xFFFFFFFFU)            /**< CRC默认初始值    */
+
+/** 
+* @} 
+*/
+
+/*-------------------------------------------functions------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @defgroup CRC_External_Functions CRC External Functions
+* @brief    CRC对外函数
+* @{
+*
+*/
+/************************************************************************************************/
+/** 
+* @brief  配置CRC多项式
+* @param  poly_size 多项式选择
+*             @arg CRC_POLY_16:16位多项式
+*             @arg CRC_POLY_32:32位多项式
+* @retval 无
+*/
+__STATIC_INLINE void std_crc_set_poly_size(uint32_t poly_size)
+{
+    CRC->CSR = poly_size;
+}
+
+/**
+* @brief  将CRC初始值未进行反转直接写入寄存器
+* @param  init_value CRC的初始值
+* @retval 无
+*/
+__STATIC_INLINE void std_crc_set_init_value(uint32_t init_value)
+{
+    CRC->RDR = init_value;
+}
+
+/**
+* @brief  读取CRC计算结果
+* @retval uint32_t CRC计算结果
+*/
+__STATIC_INLINE uint32_t std_crc_get_value(void)
+{
+    return(CRC->RDR);
+}
+
+/**
+* @brief  向数据寄存器中写入输入的1字节数据
+* @param  input_data 要进行CRC计算的原始数据
+* @retval 无
+*/
+__STATIC_INLINE void std_crc_set_byte(uint8_t input_data)
+{
+    CRC->DR = (uint32_t)input_data;
+}
+
+
+void std_crc_deinit(void);
+void std_crc_set_init_value_invert(uint32_t poly_sel, uint32_t init_value);
+
+/** 
+* @} 
+*/
+
+#ifdef __cplusplus
+}
+#endif
+
+/**
+* @}
+*/  
+
+/**
+* @}
+*/
+
+#endif /* CIU32F003_STD_CRC_H */

+ 134 - 0
CIU32F003_LIB/Include/ciu32f003_std_crc.h

@@ -0,0 +1,134 @@
+/************************************************************************************************/
+/**
+* @file               ciu32f003_std_crc.h
+* @author             MCU Ecosystem Development Team
+* @brief              CRC STD库驱动头文件。
+*                     提供CRC相关的STD库操作函数声明、数据类型以及常量的定义。                         
+*                     
+*
+**************************************************************************************************
+* @attention
+* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
+*
+**************************************************************************************************
+*/
+
+/* 避免头文件重复引用 */
+#ifndef CIU32F003_STD_CRC_H
+#define CIU32F003_STD_CRC_H
+
+/************************************************************************************************/
+/** 
+* @addtogroup CIU32F003_STD_Driver
+* @{
+*/
+
+/**
+* @defgroup CRC CRC
+* @brief 循环冗余校验的STD库驱动
+* @{
+*/
+/************************************************************************************************/
+
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/*------------------------------------------includes--------------------------------------------*/
+#include "ciu32F003_std_common.h"
+
+
+/*--------------------------------------------define--------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @defgroup CRC_Constants CRC Constants 
+* @brief    CRC常量定义及宏定义
+* @{
+*
+*/
+/************************************************************************************************/
+/* CRC多项式选择 */
+#define CRC_POLY_16                           CRC_CSR_POLY_SIZE_16     /**< 16位多项式       */
+#define CRC_POLY_32                           CRC_CSR_POLY_SIZE_32     /**< 32位多项式       */
+
+/* CRC默认初始值 */
+#define CRC_DEFAULT_INIT_VALUE                (0xFFFFFFFFU)            /**< CRC默认初始值    */
+
+/** 
+* @} 
+*/
+
+/*-------------------------------------------functions------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @defgroup CRC_External_Functions CRC External Functions
+* @brief    CRC对外函数
+* @{
+*
+*/
+/************************************************************************************************/
+/** 
+* @brief  配置CRC多项式
+* @param  poly_size 多项式选择
+*             @arg CRC_POLY_16:16位多项式
+*             @arg CRC_POLY_32:32位多项式
+* @retval 无
+*/
+__STATIC_INLINE void std_crc_set_poly_size(uint32_t poly_size)
+{
+    CRC->CSR = poly_size;
+}
+
+/**
+* @brief  将CRC初始值未进行反转直接写入寄存器
+* @param  init_value CRC的初始值
+* @retval 无
+*/
+__STATIC_INLINE void std_crc_set_init_value(uint32_t init_value)
+{
+    CRC->RDR = init_value;
+}
+
+/**
+* @brief  读取CRC计算结果
+* @retval uint32_t CRC计算结果
+*/
+__STATIC_INLINE uint32_t std_crc_get_value(void)
+{
+    return(CRC->RDR);
+}
+
+/**
+* @brief  向数据寄存器中写入输入的1字节数据
+* @param  input_data 要进行CRC计算的原始数据
+* @retval 无
+*/
+__STATIC_INLINE void std_crc_set_byte(uint8_t input_data)
+{
+    CRC->DR = (uint32_t)input_data;
+}
+
+
+void std_crc_deinit(void);
+void std_crc_set_init_value_invert(uint32_t poly_sel, uint32_t init_value);
+
+/** 
+* @} 
+*/
+
+#ifdef __cplusplus
+}
+#endif
+
+/**
+* @}
+*/  
+
+/**
+* @}
+*/
+
+#endif /* CIU32F003_STD_CRC_H */

+ 151 - 0
CIU32F003_LIB/Include/ciu32f003_std_dbg(1).h

@@ -0,0 +1,151 @@
+/************************************************************************************************/
+/**
+* @file               ciu32f003_std_dbg.h
+* @author             MCU Ecosystem Development Team
+* @brief              DBG STD库驱动头文件。
+*                     提供DBG相关的STD库操作函数声明、数据类型以及常量的定义。                         
+*
+*
+**************************************************************************************************
+* @attention
+* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
+*
+**************************************************************************************************
+*/
+
+/* 避免头文件重复引用 */
+#ifndef CIU32F003_STD_DBG_H
+#define CIU32F003_STD_DBG_H
+
+/************************************************************************************************/
+/**
+* @addtogroup CIU32F003_STD_Driver
+* @{
+*/
+
+/**
+* @defgroup DBG DBG
+* @brief 调试接口的STD库驱动
+* @{
+*/
+/************************************************************************************************/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*------------------------------------------includes--------------------------------------------*/
+#include "ciu32f003_std_common.h" 
+
+/*--------------------------------------------define--------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @defgroup DBG_Constants DBG Constants 
+* @brief  DBG常量定义及宏定义
+* @{
+*
+*/
+/************************************************************************************************/
+/* 外设的计数控制选择 */
+#define DBG_PERIPH_TIM3                DBG_APB_FZ1_TIM3_HOLD                /**< TIM3   计数控制位 */
+#define DBG_PERIPH_IWDG                DBG_APB_FZ1_IWDG_HOLD                /**< IWDG   计数控制位 */
+#define DBG_PERIPH_LPTIM1              DBG_APB_FZ1_LPTIM1_HOLD              /**< LPTIM1 计数控制位 */
+
+/**
+* @}
+*/
+
+/*------------------------------------functions-------------------------------------------------*/
+/************************************************************************************************/
+/**
+* @defgroup DBG_External_Functions DBG External Functions
+* @brief    DBG对外函数
+* @{
+*
+*/
+/************************************************************************************************/
+/**
+* @brief  使能Stop模式调试功能
+* @note   只能通过POR复位
+* @retval 无
+*/
+__STATIC_INLINE void std_dbg_stop_enable(void)
+{
+    DBG->CR = DBG_CR_DBG_STOP;
+}
+
+/**
+* @brief  禁止Stop模式调试功能
+* @note   只能通过POR复位
+* @retval 无
+*/
+__STATIC_INLINE void std_dbg_stop_disable(void)
+{
+    DBG->CR = (~DBG_CR_DBG_STOP);
+}
+
+/**
+* @brief  内核停止时停止计数
+* @param  periph_hold 指定停止的计数控制
+*             @arg DBG_PERIPH_TIM3
+*             @arg DBG_PERIPH_IWDG
+*             @arg DBG_PERIPH_LPTIM1
+* @note   只能通过POR复位
+* @retval 无
+*/
+__STATIC_INLINE void std_dbg_apb1_hold_enable(uint32_t periph_hold)
+{
+    DBG->APB_FZ1 |= periph_hold;
+}
+
+/**
+* @brief  内核停止时正常计数
+* @param  periph_hold 指定正常的计数控制
+*             @arg DBG_PERIPH_TIM3
+*             @arg DBG_PERIPH_IWDG
+*             @arg DBG_PERIPH_LPTIM1
+* @note   只能通过POR复位
+* @retval 无
+*/
+__STATIC_INLINE void std_dbg_apb1_hold_disable(uint32_t periph_hold)
+{
+    DBG->APB_FZ1 &= (~periph_hold);
+}
+
+/**
+* @brief  内核停止时TIM1停止计数
+* @note   只能通过POR复位
+* @retval 无
+*/
+__STATIC_INLINE void std_dbg_tim1_hold_enable(void)
+{
+    DBG->APB_FZ2 = DBG_APB_FZ2_TIM1_HOLD;
+}
+
+/**
+* @brief  内核停止时TIM1正常计数
+* @note   只能通过POR复位
+* @retval 无
+*/
+__STATIC_INLINE void std_dbg_tim1_hold_disable(void)
+{
+    DBG->APB_FZ2 = (~DBG_APB_FZ2_TIM1_HOLD);
+}
+
+/**
+* @}
+*/
+
+#ifdef __cplusplus
+}
+#endif
+
+/**
+* @}
+*/
+
+/**
+* @}
+*/
+#endif /* CIU32F003_STD_DBG_H */

+ 151 - 0
CIU32F003_LIB/Include/ciu32f003_std_dbg(2).h

@@ -0,0 +1,151 @@
+/************************************************************************************************/
+/**
+* @file               ciu32f003_std_dbg.h
+* @author             MCU Ecosystem Development Team
+* @brief              DBG STD库驱动头文件。
+*                     提供DBG相关的STD库操作函数声明、数据类型以及常量的定义。                         
+*
+*
+**************************************************************************************************
+* @attention
+* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
+*
+**************************************************************************************************
+*/
+
+/* 避免头文件重复引用 */
+#ifndef CIU32F003_STD_DBG_H
+#define CIU32F003_STD_DBG_H
+
+/************************************************************************************************/
+/**
+* @addtogroup CIU32F003_STD_Driver
+* @{
+*/
+
+/**
+* @defgroup DBG DBG
+* @brief 调试接口的STD库驱动
+* @{
+*/
+/************************************************************************************************/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*------------------------------------------includes--------------------------------------------*/
+#include "ciu32f003_std_common.h" 
+
+/*--------------------------------------------define--------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @defgroup DBG_Constants DBG Constants 
+* @brief  DBG常量定义及宏定义
+* @{
+*
+*/
+/************************************************************************************************/
+/* 外设的计数控制选择 */
+#define DBG_PERIPH_TIM3                DBG_APB_FZ1_TIM3_HOLD                /**< TIM3   计数控制位 */
+#define DBG_PERIPH_IWDG                DBG_APB_FZ1_IWDG_HOLD                /**< IWDG   计数控制位 */
+#define DBG_PERIPH_LPTIM1              DBG_APB_FZ1_LPTIM1_HOLD              /**< LPTIM1 计数控制位 */
+
+/**
+* @}
+*/
+
+/*------------------------------------functions-------------------------------------------------*/
+/************************************************************************************************/
+/**
+* @defgroup DBG_External_Functions DBG External Functions
+* @brief    DBG对外函数
+* @{
+*
+*/
+/************************************************************************************************/
+/**
+* @brief  使能Stop模式调试功能
+* @note   只能通过POR复位
+* @retval 无
+*/
+__STATIC_INLINE void std_dbg_stop_enable(void)
+{
+    DBG->CR = DBG_CR_DBG_STOP;
+}
+
+/**
+* @brief  禁止Stop模式调试功能
+* @note   只能通过POR复位
+* @retval 无
+*/
+__STATIC_INLINE void std_dbg_stop_disable(void)
+{
+    DBG->CR = (~DBG_CR_DBG_STOP);
+}
+
+/**
+* @brief  内核停止时停止计数
+* @param  periph_hold 指定停止的计数控制
+*             @arg DBG_PERIPH_TIM3
+*             @arg DBG_PERIPH_IWDG
+*             @arg DBG_PERIPH_LPTIM1
+* @note   只能通过POR复位
+* @retval 无
+*/
+__STATIC_INLINE void std_dbg_apb1_hold_enable(uint32_t periph_hold)
+{
+    DBG->APB_FZ1 |= periph_hold;
+}
+
+/**
+* @brief  内核停止时正常计数
+* @param  periph_hold 指定正常的计数控制
+*             @arg DBG_PERIPH_TIM3
+*             @arg DBG_PERIPH_IWDG
+*             @arg DBG_PERIPH_LPTIM1
+* @note   只能通过POR复位
+* @retval 无
+*/
+__STATIC_INLINE void std_dbg_apb1_hold_disable(uint32_t periph_hold)
+{
+    DBG->APB_FZ1 &= (~periph_hold);
+}
+
+/**
+* @brief  内核停止时TIM1停止计数
+* @note   只能通过POR复位
+* @retval 无
+*/
+__STATIC_INLINE void std_dbg_tim1_hold_enable(void)
+{
+    DBG->APB_FZ2 = DBG_APB_FZ2_TIM1_HOLD;
+}
+
+/**
+* @brief  内核停止时TIM1正常计数
+* @note   只能通过POR复位
+* @retval 无
+*/
+__STATIC_INLINE void std_dbg_tim1_hold_disable(void)
+{
+    DBG->APB_FZ2 = (~DBG_APB_FZ2_TIM1_HOLD);
+}
+
+/**
+* @}
+*/
+
+#ifdef __cplusplus
+}
+#endif
+
+/**
+* @}
+*/
+
+/**
+* @}
+*/
+#endif /* CIU32F003_STD_DBG_H */

+ 151 - 0
CIU32F003_LIB/Include/ciu32f003_std_dbg(3).h

@@ -0,0 +1,151 @@
+/************************************************************************************************/
+/**
+* @file               ciu32f003_std_dbg.h
+* @author             MCU Ecosystem Development Team
+* @brief              DBG STD库驱动头文件。
+*                     提供DBG相关的STD库操作函数声明、数据类型以及常量的定义。                         
+*
+*
+**************************************************************************************************
+* @attention
+* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
+*
+**************************************************************************************************
+*/
+
+/* 避免头文件重复引用 */
+#ifndef CIU32F003_STD_DBG_H
+#define CIU32F003_STD_DBG_H
+
+/************************************************************************************************/
+/**
+* @addtogroup CIU32F003_STD_Driver
+* @{
+*/
+
+/**
+* @defgroup DBG DBG
+* @brief 调试接口的STD库驱动
+* @{
+*/
+/************************************************************************************************/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*------------------------------------------includes--------------------------------------------*/
+#include "ciu32f003_std_common.h" 
+
+/*--------------------------------------------define--------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @defgroup DBG_Constants DBG Constants 
+* @brief  DBG常量定义及宏定义
+* @{
+*
+*/
+/************************************************************************************************/
+/* 外设的计数控制选择 */
+#define DBG_PERIPH_TIM3                DBG_APB_FZ1_TIM3_HOLD                /**< TIM3   计数控制位 */
+#define DBG_PERIPH_IWDG                DBG_APB_FZ1_IWDG_HOLD                /**< IWDG   计数控制位 */
+#define DBG_PERIPH_LPTIM1              DBG_APB_FZ1_LPTIM1_HOLD              /**< LPTIM1 计数控制位 */
+
+/**
+* @}
+*/
+
+/*------------------------------------functions-------------------------------------------------*/
+/************************************************************************************************/
+/**
+* @defgroup DBG_External_Functions DBG External Functions
+* @brief    DBG对外函数
+* @{
+*
+*/
+/************************************************************************************************/
+/**
+* @brief  使能Stop模式调试功能
+* @note   只能通过POR复位
+* @retval 无
+*/
+__STATIC_INLINE void std_dbg_stop_enable(void)
+{
+    DBG->CR = DBG_CR_DBG_STOP;
+}
+
+/**
+* @brief  禁止Stop模式调试功能
+* @note   只能通过POR复位
+* @retval 无
+*/
+__STATIC_INLINE void std_dbg_stop_disable(void)
+{
+    DBG->CR = (~DBG_CR_DBG_STOP);
+}
+
+/**
+* @brief  内核停止时停止计数
+* @param  periph_hold 指定停止的计数控制
+*             @arg DBG_PERIPH_TIM3
+*             @arg DBG_PERIPH_IWDG
+*             @arg DBG_PERIPH_LPTIM1
+* @note   只能通过POR复位
+* @retval 无
+*/
+__STATIC_INLINE void std_dbg_apb1_hold_enable(uint32_t periph_hold)
+{
+    DBG->APB_FZ1 |= periph_hold;
+}
+
+/**
+* @brief  内核停止时正常计数
+* @param  periph_hold 指定正常的计数控制
+*             @arg DBG_PERIPH_TIM3
+*             @arg DBG_PERIPH_IWDG
+*             @arg DBG_PERIPH_LPTIM1
+* @note   只能通过POR复位
+* @retval 无
+*/
+__STATIC_INLINE void std_dbg_apb1_hold_disable(uint32_t periph_hold)
+{
+    DBG->APB_FZ1 &= (~periph_hold);
+}
+
+/**
+* @brief  内核停止时TIM1停止计数
+* @note   只能通过POR复位
+* @retval 无
+*/
+__STATIC_INLINE void std_dbg_tim1_hold_enable(void)
+{
+    DBG->APB_FZ2 = DBG_APB_FZ2_TIM1_HOLD;
+}
+
+/**
+* @brief  内核停止时TIM1正常计数
+* @note   只能通过POR复位
+* @retval 无
+*/
+__STATIC_INLINE void std_dbg_tim1_hold_disable(void)
+{
+    DBG->APB_FZ2 = (~DBG_APB_FZ2_TIM1_HOLD);
+}
+
+/**
+* @}
+*/
+
+#ifdef __cplusplus
+}
+#endif
+
+/**
+* @}
+*/
+
+/**
+* @}
+*/
+#endif /* CIU32F003_STD_DBG_H */

+ 151 - 0
CIU32F003_LIB/Include/ciu32f003_std_dbg.h

@@ -0,0 +1,151 @@
+/************************************************************************************************/
+/**
+* @file               ciu32f003_std_dbg.h
+* @author             MCU Ecosystem Development Team
+* @brief              DBG STD库驱动头文件。
+*                     提供DBG相关的STD库操作函数声明、数据类型以及常量的定义。                         
+*
+*
+**************************************************************************************************
+* @attention
+* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
+*
+**************************************************************************************************
+*/
+
+/* 避免头文件重复引用 */
+#ifndef CIU32F003_STD_DBG_H
+#define CIU32F003_STD_DBG_H
+
+/************************************************************************************************/
+/**
+* @addtogroup CIU32F003_STD_Driver
+* @{
+*/
+
+/**
+* @defgroup DBG DBG
+* @brief 调试接口的STD库驱动
+* @{
+*/
+/************************************************************************************************/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*------------------------------------------includes--------------------------------------------*/
+#include "ciu32f003_std_common.h" 
+
+/*--------------------------------------------define--------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @defgroup DBG_Constants DBG Constants 
+* @brief  DBG常量定义及宏定义
+* @{
+*
+*/
+/************************************************************************************************/
+/* 外设的计数控制选择 */
+#define DBG_PERIPH_TIM3                DBG_APB_FZ1_TIM3_HOLD                /**< TIM3   计数控制位 */
+#define DBG_PERIPH_IWDG                DBG_APB_FZ1_IWDG_HOLD                /**< IWDG   计数控制位 */
+#define DBG_PERIPH_LPTIM1              DBG_APB_FZ1_LPTIM1_HOLD              /**< LPTIM1 计数控制位 */
+
+/**
+* @}
+*/
+
+/*------------------------------------functions-------------------------------------------------*/
+/************************************************************************************************/
+/**
+* @defgroup DBG_External_Functions DBG External Functions
+* @brief    DBG对外函数
+* @{
+*
+*/
+/************************************************************************************************/
+/**
+* @brief  使能Stop模式调试功能
+* @note   只能通过POR复位
+* @retval 无
+*/
+__STATIC_INLINE void std_dbg_stop_enable(void)
+{
+    DBG->CR = DBG_CR_DBG_STOP;
+}
+
+/**
+* @brief  禁止Stop模式调试功能
+* @note   只能通过POR复位
+* @retval 无
+*/
+__STATIC_INLINE void std_dbg_stop_disable(void)
+{
+    DBG->CR = (~DBG_CR_DBG_STOP);
+}
+
+/**
+* @brief  内核停止时停止计数
+* @param  periph_hold 指定停止的计数控制
+*             @arg DBG_PERIPH_TIM3
+*             @arg DBG_PERIPH_IWDG
+*             @arg DBG_PERIPH_LPTIM1
+* @note   只能通过POR复位
+* @retval 无
+*/
+__STATIC_INLINE void std_dbg_apb1_hold_enable(uint32_t periph_hold)
+{
+    DBG->APB_FZ1 |= periph_hold;
+}
+
+/**
+* @brief  内核停止时正常计数
+* @param  periph_hold 指定正常的计数控制
+*             @arg DBG_PERIPH_TIM3
+*             @arg DBG_PERIPH_IWDG
+*             @arg DBG_PERIPH_LPTIM1
+* @note   只能通过POR复位
+* @retval 无
+*/
+__STATIC_INLINE void std_dbg_apb1_hold_disable(uint32_t periph_hold)
+{
+    DBG->APB_FZ1 &= (~periph_hold);
+}
+
+/**
+* @brief  内核停止时TIM1停止计数
+* @note   只能通过POR复位
+* @retval 无
+*/
+__STATIC_INLINE void std_dbg_tim1_hold_enable(void)
+{
+    DBG->APB_FZ2 = DBG_APB_FZ2_TIM1_HOLD;
+}
+
+/**
+* @brief  内核停止时TIM1正常计数
+* @note   只能通过POR复位
+* @retval 无
+*/
+__STATIC_INLINE void std_dbg_tim1_hold_disable(void)
+{
+    DBG->APB_FZ2 = (~DBG_APB_FZ2_TIM1_HOLD);
+}
+
+/**
+* @}
+*/
+
+#ifdef __cplusplus
+}
+#endif
+
+/**
+* @}
+*/
+
+/**
+* @}
+*/
+#endif /* CIU32F003_STD_DBG_H */

+ 372 - 0
CIU32F003_LIB/Include/ciu32f003_std_exti(1).h

@@ -0,0 +1,372 @@
+/************************************************************************************************/
+/**
+* @file               ciu32f003_std_exti.h
+* @author             MCU Ecosystem Development Team
+* @brief              EXTI STD库驱动头文件。
+*                     提供EXTI相关的STD库操作函数声明、数据类型以及常量的定义。                         
+*                     
+*
+**************************************************************************************************
+* @attention
+* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
+*
+**************************************************************************************************
+*/
+
+/* 避免头文件重复引用 */
+#ifndef CIU32F003_STD_EXTI_H
+#define CIU32F003_STD_EXTI_H
+
+/************************************************************************************************/
+/** 
+* @addtogroup CIU32F003_STD_Driver
+* @{
+*/
+
+/**
+* @defgroup EXTI EXTI
+* @brief 扩展中断和事件控制器的STD库驱动
+* @{
+*/
+/************************************************************************************************/
+
+
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/*------------------------------------------includes--------------------------------------------*/
+#include "ciu32f003_std_common.h"
+
+/*-----------------------------------------type define------------------------------------------*/
+/************************************************************************************************/
+/** 
+* @defgroup EXTI_Types EXTI Types
+* @brief EXTI数据类型定义
+* @{
+*/
+/************************************************************************************************/
+
+/**
+* @brief  EXTI参数配置结构体定义
+*/
+typedef struct
+{
+    uint32_t line_id;                 /**< EXTI通道ID
+                                               @arg EXTI_LINE_GPIO_PIN0 ... */
+    uint32_t mode;                    /**< EXTI通道模式
+                                               @arg EXTI_MODE_INTERRUPT ... */
+    uint32_t trigger;                 /**< EXTI通道触发类型
+                                               @arg EXTI_TRIGGER_RISING ... */
+    uint32_t gpio_id;                 /**< GPIO端口ID
+                                               @arg EXTI_GPIOA ... */
+} std_exti_init_t;
+
+
+/**
+* @}
+*/
+
+/*--------------------------------------------define--------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @defgroup EXTI_Constants EXTI Constants 
+* @brief  EXTI常量定义及宏定义
+* @{
+*
+*/
+/************************************************************************************************/
+
+/* EXTI LINE ID定义 */
+#define EXTI_LINE_GPIO_PIN0                 (EXTI_GPIO     | 0x00U)                         /**< EXTI_LINE0  */
+#define EXTI_LINE_GPIO_PIN1                 (EXTI_GPIO     | 0x01U)                         /**< EXTI_LINE1  */
+#define EXTI_LINE_GPIO_PIN2                 (EXTI_GPIO     | 0x02U)                         /**< EXTI_LINE2  */
+#define EXTI_LINE_GPIO_PIN3                 (EXTI_GPIO     | 0x03U)                         /**< EXTI_LINE3  */
+#define EXTI_LINE_GPIO_PIN4                 (EXTI_GPIO     | 0x04U)                         /**< EXTI_LINE4  */
+#define EXTI_LINE_GPIO_PIN5                 (EXTI_GPIO     | 0x05U)                         /**< EXTI_LINE5  */
+#define EXTI_LINE_GPIO_PIN6                 (EXTI_GPIO     | 0x06U)                         /**< EXTI_LINE6  */
+#define EXTI_LINE_GPIO_PIN7                 (EXTI_GPIO     | 0x07U)                         /**< EXTI_LINE7  */
+#define EXTI_LINE_COMP1                     (EXTI_CONFIG   | 0x10U)                         /**< EXTI_LINE16 */
+#define EXTI_LINE_COMP2                     (EXTI_CONFIG   | 0x11U)                         /**< EXTI_LINE17 */ 
+#define EXTI_LINE_LPTIM1                    (EXTI_DIRECT   | 0x1EU)                         /**< EXTI_LINE30 */
+
+/* EXTI LINE 分组 */
+#define EXTI_DIRECT                         (0x01000000)                                    /**< 直接通道                    */
+#define EXTI_CONFIG                         (0x02000000)                                    /**< 其它可配置通道(COMP1/COMP2) */
+#define EXTI_GPIO                           (0x06000000)                                    /**< GPIO可配置通道              */
+#define EXTI_PROPERTY_MASK                  (EXTI_DIRECT | EXTI_CONFIG | EXTI_GPIO)         /**< 通道屏蔽掩码                */
+
+/* EXTI LINE屏蔽掩码,用于筛选EXTI LINE ID */ 
+#define EXTI_LINE_MASK                      (0x0000001FU)                                   /**< EXTI LINE屏蔽掩码 */
+
+/* EXTI LINE模式:中断、事件 */ 
+#define EXTI_MODE_NONE                      (0x00000000U)                                   /**< 无中断/事件唤醒 */
+#define EXTI_MODE_INTERRUPT                 (0x00000001U)                                   /**< 中断唤醒        */
+#define EXTI_MODE_EVENT                     (0x00000002U)                                   /**< 事件唤醒        */
+#define EXTI_MODE_INTERRUPT_EVENT           (EXTI_MODE_EVENT | EXTI_MODE_INTERRUPT)         /**< 中断/事件唤醒   */
+
+/* EXTI LINE 触发类型定义,用于可配置通道,信号触发类型配置 */
+#define EXTI_TRIGGER_NONE                   (0x00000000U)                                   /**< 不触发            */
+#define EXTI_TRIGGER_RISING                 (0x00000001U)                                   /**< 上降沿触发        */
+#define EXTI_TRIGGER_FALLING                (0x00000002U)                                   /**< 下降沿触发        */
+#define EXTI_TRIGGER_RISING_FALLING         (EXTI_TRIGGER_RISING | EXTI_TRIGGER_FALLING)    /**< 上升沿/下降沿触发 */
+
+/* EXTI LINE 触发类型屏蔽掩码,用于筛选EXTI 可配置通道触发类型 */
+#define EXTI_TRIGGER_MASK                   (EXTI_TRIGGER_RISING | EXTI_TRIGGER_FALLING)     /**< 触发类型屏蔽掩码 */
+
+/* GPIO端口ID定义 */
+#define EXTI_GPIOA                          (0x00000000UL)                                   /**< GPIOA ID */
+#define EXTI_GPIOB                          (0x00000001UL)                                   /**< GPIOB ID */
+#define EXTI_GPIOC                          (0x00000002UL)                                   /**< GPIOC ID */
+
+/** 
+* @} 
+*/
+
+/*-------------------------------------------functions------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @defgroup EXTI_External_Functions EXTI External Functions
+* @brief    EXTI对外函数
+* @{
+*
+*/
+/************************************************************************************************/
+
+/**
+* @brief  读取EXTI通道中断挂起状态
+* @param  exti_line  EXTI通道ID
+*             @arg EXTI_LINE_GPIO_PIN0
+*             @arg EXTI_LINE_GPIO_PIN1
+*             @arg ...
+*             @arg EXTI_LINE_COMP1
+*             @arg EXTI_LINE_COMP2
+* @retval uint32_t 上升沿中断挂起状态
+*             @arg 非0  表示已挂起
+*             @arg 0 表示未挂起
+*/
+__STATIC_INLINE uint32_t std_exti_get_pending_status(uint32_t exti_line)
+{
+    return (EXTI->PIR & (0x01U << (exti_line & EXTI_LINE_MASK)));
+}
+
+
+/**
+* @brief  清除EXTI通道中断挂起状态
+* @param  exti_line  EXTI通道ID
+*             @arg EXTI_LINE_GPIO_PIN0
+*             @arg EXTI_LINE_GPIO_PIN1
+*             @arg ...
+*             @arg EXTI_LINE_COMP1
+*             @arg EXTI_LINE_COMP2
+* @retval 无
+*/
+__STATIC_INLINE void std_exti_clear_pending(uint32_t exti_line)
+{
+    EXTI->PIR = (0x01U << (exti_line & EXTI_LINE_MASK));
+}
+
+/**
+* @brief  使能EXTI通道上升沿触发
+* @param  exti_line  EXTI通道ID
+*             @arg EXTI_LINE_GPIO_PIN0
+*             @arg EXTI_LINE_GPIO_PIN1
+*             @arg ...
+*             @arg EXTI_LINE_COMP1
+*             @arg EXTI_LINE_COMP2
+* @retval 无
+*/
+__STATIC_INLINE void std_exti_rising_trigger_enable(uint32_t exti_line)
+{
+    EXTI->RTSR |= (0x01U << (exti_line & EXTI_LINE_MASK));
+}
+
+/**
+* @brief  禁止EXTI通道上升沿触发
+* @param  exti_line  EXTI通道ID
+*             @arg EXTI_LINE_GPIO_PIN0
+*             @arg EXTI_LINE_GPIO_PIN1
+*             @arg ...
+*             @arg EXTI_LINE_COMP1
+*             @arg EXTI_LINE_COMP2
+* @retval 无
+*/
+__STATIC_INLINE void std_exti_rising_trigger_disable(uint32_t exti_line)
+{
+    EXTI->RTSR &= (~(0x01U << (exti_line & EXTI_LINE_MASK)));   
+}
+
+/**
+* @brief  使能EXTI通道下降沿触发
+* @param  exti_line  EXTI通道ID
+*             @arg EXTI_LINE_GPIO_PIN0
+*             @arg EXTI_LINE_GPIO_PIN1
+*             @arg ...
+*             @arg EXTI_LINE_COMP1
+*             @arg EXTI_LINE_COMP2
+* @retval 无
+*/
+__STATIC_INLINE void std_exti_falling_trigger_enable(uint32_t exti_line)
+{
+    EXTI->FTSR |= (0x01U << (exti_line & EXTI_LINE_MASK));
+}
+
+/**
+* @brief  禁止EXTI通道下降沿触发
+* @param  exti_line  EXTI通道ID
+*             @arg EXTI_LINE_GPIO_PIN0
+*             @arg EXTI_LINE_GPIO_PIN1
+*             @arg ...
+*             @arg EXTI_LINE_COMP1
+*             @arg EXTI_LINE_COMP2
+* @retval 无
+*/
+__STATIC_INLINE void std_exti_falling_trigger_disable(uint32_t exti_line)
+{
+    EXTI->FTSR &= (~(0x01U << (exti_line & EXTI_LINE_MASK)));
+}
+
+/**
+* @brief  读取EXTI通道上升沿触发状态
+* @param  exti_line  EXTI通道ID
+*             @arg EXTI_LINE_GPIO_PIN0
+*             @arg EXTI_LINE_GPIO_PIN1 
+*             @arg ...
+*             @arg EXTI_LINE_COMP1
+*             @arg EXTI_LINE_COMP2
+* @retval uint32_t 上升沿触发状态
+*             @arg 非0  表示已使能
+*             @arg 0 表示已禁止
+*/
+__STATIC_INLINE uint32_t std_exti_get_rising_trigger_enable(uint32_t exti_line)
+{
+    return (EXTI->RTSR & (0x01U << (exti_line & EXTI_LINE_MASK)));
+}
+
+/**
+* @brief  读取EXTI通道下降沿触发状态
+* @param  exti_line  EXTI通道ID
+*             @arg EXTI_LINE_GPIO_PIN0
+*             @arg EXTI_LINE_GPIO_PIN1
+*             @arg ...
+*             @arg EXTI_LINE_COMP1
+*             @arg EXTI_LINE_COMP2
+* @retval uint32_t 下降沿触发状态
+*             @arg 非0  表示已使能
+*             @arg 0 表示已禁止
+*/
+__STATIC_INLINE uint32_t std_exti_get_falling_trigger_enable(uint32_t exti_line)
+{
+    return (EXTI->FTSR & (0x01U << (exti_line & EXTI_LINE_MASK)));
+}
+
+/**
+* @brief  使能EXTI通道唤醒中断
+* @param  exti_line  EXTI通道ID
+*             @arg EXTI_LINE_GPIO_PIN0
+*             @arg EXTI_LINE_GPIO_PIN1
+*             @arg ...
+*             @arg EXTI_LINE_COMP1
+*             @arg EXTI_LINE_COMP2
+*             @arg EXTI_LINE_LPTIM1
+* @retval 无
+*/
+__STATIC_INLINE void std_exti_interrupt_enable(uint32_t exti_line)
+{
+    EXTI->IMR |= (0x01U << (exti_line & EXTI_LINE_MASK));
+}
+
+/**
+* @brief  禁止EXTI通道唤醒中断
+* @param  exti_line  EXTI通道ID
+*             @arg EXTI_LINE_GPIO_PIN0
+*             @arg EXTI_LINE_GPIO_PIN1
+*             @arg ...
+*             @arg EXTI_LINE_COMP1
+*             @arg EXTI_LINE_COMP2
+*             @arg EXTI_LINE_LPTIM1
+* @retval 无
+*/
+__STATIC_INLINE void std_exti_interrupt_disable(uint32_t exti_line)
+{
+    EXTI->IMR &= (~(0x01U << (exti_line & EXTI_LINE_MASK)));
+}
+
+/**
+* @brief  使能EXTI通道唤醒事件
+* @param  exti_line  EXTI通道ID
+*             @arg EXTI_LINE_GPIO_PIN0
+*             @arg EXTI_LINE_GPIO_PIN1
+*             @arg ...
+*             @arg EXTI_LINE_COMP1
+*             @arg EXTI_LINE_COMP2
+*             @arg EXTI_LINE_LPTIM1
+* @retval 无
+*/
+__STATIC_INLINE void std_exti_event_enable(uint32_t exti_line)
+{
+    EXTI->EMR |= (0x01U << (exti_line & EXTI_LINE_MASK));
+}
+
+/**
+* @brief  禁止EXTI通道唤醒事件
+* @param  exti_line  EXTI通道ID
+*             @arg EXTI_LINE_GPIO_PIN0
+*             @arg EXTI_LINE_GPIO_PIN1
+*             @arg ...
+*             @arg EXTI_LINE_COMP1
+*             @arg EXTI_LINE_COMP2
+*             @arg EXTI_LINE_LPTIM1
+* @retval 无
+*/
+__STATIC_INLINE void std_exti_event_disable(uint32_t exti_line)
+{
+    EXTI->EMR &= (~(0x01U << (exti_line & EXTI_LINE_MASK)));
+}
+
+/**
+* @brief  设置EXTI通道所对应GPIO端口
+* @param  gpio_id  GPIO端口ID
+*             @arg EXTI_GPIOA
+*             @arg EXTI_GPIOB
+*             @arg EXTI_GPIOC
+* @param  exti_line  EXTI通道ID
+*             @arg EXTI_LINE_GPIO_PIN0
+*             @arg EXTI_LINE_GPIO_PIN1
+*             @arg ...
+*             @arg EXTI_LINE_GPIO_PIN7
+* @retval 无
+*/
+__STATIC_INLINE void std_exti_set_gpio(uint32_t gpio_id, uint32_t exti_line)
+{
+    exti_line &= EXTI_LINE_MASK;
+    MODIFY_REG(EXTI->EXTICR1,
+              (EXTI_EXTICR1_EXTI0_MASK << (EXTI_EXTICR1_EXTI1_POS * exti_line)),
+              (gpio_id << (EXTI_EXTICR1_EXTI1_POS * exti_line)));
+}
+
+void std_exti_init(std_exti_init_t* exti_init_param);
+void std_exti_deinit(void);
+void std_exti_struct_init(std_exti_init_t* exti_init_struct);
+
+/** 
+* @} 
+*/
+
+
+#ifdef __cplusplus
+}
+#endif
+
+/**
+* @} 
+*/  
+
+/**
+* @}
+*/
+
+#endif /* CIU32F003_STD_EXTI_H */

+ 372 - 0
CIU32F003_LIB/Include/ciu32f003_std_exti(2).h

@@ -0,0 +1,372 @@
+/************************************************************************************************/
+/**
+* @file               ciu32f003_std_exti.h
+* @author             MCU Ecosystem Development Team
+* @brief              EXTI STD库驱动头文件。
+*                     提供EXTI相关的STD库操作函数声明、数据类型以及常量的定义。                         
+*                     
+*
+**************************************************************************************************
+* @attention
+* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
+*
+**************************************************************************************************
+*/
+
+/* 避免头文件重复引用 */
+#ifndef CIU32F003_STD_EXTI_H
+#define CIU32F003_STD_EXTI_H
+
+/************************************************************************************************/
+/** 
+* @addtogroup CIU32F003_STD_Driver
+* @{
+*/
+
+/**
+* @defgroup EXTI EXTI
+* @brief 扩展中断和事件控制器的STD库驱动
+* @{
+*/
+/************************************************************************************************/
+
+
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/*------------------------------------------includes--------------------------------------------*/
+#include "ciu32f003_std_common.h"
+
+/*-----------------------------------------type define------------------------------------------*/
+/************************************************************************************************/
+/** 
+* @defgroup EXTI_Types EXTI Types
+* @brief EXTI数据类型定义
+* @{
+*/
+/************************************************************************************************/
+
+/**
+* @brief  EXTI参数配置结构体定义
+*/
+typedef struct
+{
+    uint32_t line_id;                 /**< EXTI通道ID
+                                               @arg EXTI_LINE_GPIO_PIN0 ... */
+    uint32_t mode;                    /**< EXTI通道模式
+                                               @arg EXTI_MODE_INTERRUPT ... */
+    uint32_t trigger;                 /**< EXTI通道触发类型
+                                               @arg EXTI_TRIGGER_RISING ... */
+    uint32_t gpio_id;                 /**< GPIO端口ID
+                                               @arg EXTI_GPIOA ... */
+} std_exti_init_t;
+
+
+/**
+* @}
+*/
+
+/*--------------------------------------------define--------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @defgroup EXTI_Constants EXTI Constants 
+* @brief  EXTI常量定义及宏定义
+* @{
+*
+*/
+/************************************************************************************************/
+
+/* EXTI LINE ID定义 */
+#define EXTI_LINE_GPIO_PIN0                 (EXTI_GPIO     | 0x00U)                         /**< EXTI_LINE0  */
+#define EXTI_LINE_GPIO_PIN1                 (EXTI_GPIO     | 0x01U)                         /**< EXTI_LINE1  */
+#define EXTI_LINE_GPIO_PIN2                 (EXTI_GPIO     | 0x02U)                         /**< EXTI_LINE2  */
+#define EXTI_LINE_GPIO_PIN3                 (EXTI_GPIO     | 0x03U)                         /**< EXTI_LINE3  */
+#define EXTI_LINE_GPIO_PIN4                 (EXTI_GPIO     | 0x04U)                         /**< EXTI_LINE4  */
+#define EXTI_LINE_GPIO_PIN5                 (EXTI_GPIO     | 0x05U)                         /**< EXTI_LINE5  */
+#define EXTI_LINE_GPIO_PIN6                 (EXTI_GPIO     | 0x06U)                         /**< EXTI_LINE6  */
+#define EXTI_LINE_GPIO_PIN7                 (EXTI_GPIO     | 0x07U)                         /**< EXTI_LINE7  */
+#define EXTI_LINE_COMP1                     (EXTI_CONFIG   | 0x10U)                         /**< EXTI_LINE16 */
+#define EXTI_LINE_COMP2                     (EXTI_CONFIG   | 0x11U)                         /**< EXTI_LINE17 */ 
+#define EXTI_LINE_LPTIM1                    (EXTI_DIRECT   | 0x1EU)                         /**< EXTI_LINE30 */
+
+/* EXTI LINE 分组 */
+#define EXTI_DIRECT                         (0x01000000)                                    /**< 直接通道                    */
+#define EXTI_CONFIG                         (0x02000000)                                    /**< 其它可配置通道(COMP1/COMP2) */
+#define EXTI_GPIO                           (0x06000000)                                    /**< GPIO可配置通道              */
+#define EXTI_PROPERTY_MASK                  (EXTI_DIRECT | EXTI_CONFIG | EXTI_GPIO)         /**< 通道屏蔽掩码                */
+
+/* EXTI LINE屏蔽掩码,用于筛选EXTI LINE ID */ 
+#define EXTI_LINE_MASK                      (0x0000001FU)                                   /**< EXTI LINE屏蔽掩码 */
+
+/* EXTI LINE模式:中断、事件 */ 
+#define EXTI_MODE_NONE                      (0x00000000U)                                   /**< 无中断/事件唤醒 */
+#define EXTI_MODE_INTERRUPT                 (0x00000001U)                                   /**< 中断唤醒        */
+#define EXTI_MODE_EVENT                     (0x00000002U)                                   /**< 事件唤醒        */
+#define EXTI_MODE_INTERRUPT_EVENT           (EXTI_MODE_EVENT | EXTI_MODE_INTERRUPT)         /**< 中断/事件唤醒   */
+
+/* EXTI LINE 触发类型定义,用于可配置通道,信号触发类型配置 */
+#define EXTI_TRIGGER_NONE                   (0x00000000U)                                   /**< 不触发            */
+#define EXTI_TRIGGER_RISING                 (0x00000001U)                                   /**< 上降沿触发        */
+#define EXTI_TRIGGER_FALLING                (0x00000002U)                                   /**< 下降沿触发        */
+#define EXTI_TRIGGER_RISING_FALLING         (EXTI_TRIGGER_RISING | EXTI_TRIGGER_FALLING)    /**< 上升沿/下降沿触发 */
+
+/* EXTI LINE 触发类型屏蔽掩码,用于筛选EXTI 可配置通道触发类型 */
+#define EXTI_TRIGGER_MASK                   (EXTI_TRIGGER_RISING | EXTI_TRIGGER_FALLING)     /**< 触发类型屏蔽掩码 */
+
+/* GPIO端口ID定义 */
+#define EXTI_GPIOA                          (0x00000000UL)                                   /**< GPIOA ID */
+#define EXTI_GPIOB                          (0x00000001UL)                                   /**< GPIOB ID */
+#define EXTI_GPIOC                          (0x00000002UL)                                   /**< GPIOC ID */
+
+/** 
+* @} 
+*/
+
+/*-------------------------------------------functions------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @defgroup EXTI_External_Functions EXTI External Functions
+* @brief    EXTI对外函数
+* @{
+*
+*/
+/************************************************************************************************/
+
+/**
+* @brief  读取EXTI通道中断挂起状态
+* @param  exti_line  EXTI通道ID
+*             @arg EXTI_LINE_GPIO_PIN0
+*             @arg EXTI_LINE_GPIO_PIN1
+*             @arg ...
+*             @arg EXTI_LINE_COMP1
+*             @arg EXTI_LINE_COMP2
+* @retval uint32_t 上升沿中断挂起状态
+*             @arg 非0  表示已挂起
+*             @arg 0 表示未挂起
+*/
+__STATIC_INLINE uint32_t std_exti_get_pending_status(uint32_t exti_line)
+{
+    return (EXTI->PIR & (0x01U << (exti_line & EXTI_LINE_MASK)));
+}
+
+
+/**
+* @brief  清除EXTI通道中断挂起状态
+* @param  exti_line  EXTI通道ID
+*             @arg EXTI_LINE_GPIO_PIN0
+*             @arg EXTI_LINE_GPIO_PIN1
+*             @arg ...
+*             @arg EXTI_LINE_COMP1
+*             @arg EXTI_LINE_COMP2
+* @retval 无
+*/
+__STATIC_INLINE void std_exti_clear_pending(uint32_t exti_line)
+{
+    EXTI->PIR = (0x01U << (exti_line & EXTI_LINE_MASK));
+}
+
+/**
+* @brief  使能EXTI通道上升沿触发
+* @param  exti_line  EXTI通道ID
+*             @arg EXTI_LINE_GPIO_PIN0
+*             @arg EXTI_LINE_GPIO_PIN1
+*             @arg ...
+*             @arg EXTI_LINE_COMP1
+*             @arg EXTI_LINE_COMP2
+* @retval 无
+*/
+__STATIC_INLINE void std_exti_rising_trigger_enable(uint32_t exti_line)
+{
+    EXTI->RTSR |= (0x01U << (exti_line & EXTI_LINE_MASK));
+}
+
+/**
+* @brief  禁止EXTI通道上升沿触发
+* @param  exti_line  EXTI通道ID
+*             @arg EXTI_LINE_GPIO_PIN0
+*             @arg EXTI_LINE_GPIO_PIN1
+*             @arg ...
+*             @arg EXTI_LINE_COMP1
+*             @arg EXTI_LINE_COMP2
+* @retval 无
+*/
+__STATIC_INLINE void std_exti_rising_trigger_disable(uint32_t exti_line)
+{
+    EXTI->RTSR &= (~(0x01U << (exti_line & EXTI_LINE_MASK)));   
+}
+
+/**
+* @brief  使能EXTI通道下降沿触发
+* @param  exti_line  EXTI通道ID
+*             @arg EXTI_LINE_GPIO_PIN0
+*             @arg EXTI_LINE_GPIO_PIN1
+*             @arg ...
+*             @arg EXTI_LINE_COMP1
+*             @arg EXTI_LINE_COMP2
+* @retval 无
+*/
+__STATIC_INLINE void std_exti_falling_trigger_enable(uint32_t exti_line)
+{
+    EXTI->FTSR |= (0x01U << (exti_line & EXTI_LINE_MASK));
+}
+
+/**
+* @brief  禁止EXTI通道下降沿触发
+* @param  exti_line  EXTI通道ID
+*             @arg EXTI_LINE_GPIO_PIN0
+*             @arg EXTI_LINE_GPIO_PIN1
+*             @arg ...
+*             @arg EXTI_LINE_COMP1
+*             @arg EXTI_LINE_COMP2
+* @retval 无
+*/
+__STATIC_INLINE void std_exti_falling_trigger_disable(uint32_t exti_line)
+{
+    EXTI->FTSR &= (~(0x01U << (exti_line & EXTI_LINE_MASK)));
+}
+
+/**
+* @brief  读取EXTI通道上升沿触发状态
+* @param  exti_line  EXTI通道ID
+*             @arg EXTI_LINE_GPIO_PIN0
+*             @arg EXTI_LINE_GPIO_PIN1 
+*             @arg ...
+*             @arg EXTI_LINE_COMP1
+*             @arg EXTI_LINE_COMP2
+* @retval uint32_t 上升沿触发状态
+*             @arg 非0  表示已使能
+*             @arg 0 表示已禁止
+*/
+__STATIC_INLINE uint32_t std_exti_get_rising_trigger_enable(uint32_t exti_line)
+{
+    return (EXTI->RTSR & (0x01U << (exti_line & EXTI_LINE_MASK)));
+}
+
+/**
+* @brief  读取EXTI通道下降沿触发状态
+* @param  exti_line  EXTI通道ID
+*             @arg EXTI_LINE_GPIO_PIN0
+*             @arg EXTI_LINE_GPIO_PIN1
+*             @arg ...
+*             @arg EXTI_LINE_COMP1
+*             @arg EXTI_LINE_COMP2
+* @retval uint32_t 下降沿触发状态
+*             @arg 非0  表示已使能
+*             @arg 0 表示已禁止
+*/
+__STATIC_INLINE uint32_t std_exti_get_falling_trigger_enable(uint32_t exti_line)
+{
+    return (EXTI->FTSR & (0x01U << (exti_line & EXTI_LINE_MASK)));
+}
+
+/**
+* @brief  使能EXTI通道唤醒中断
+* @param  exti_line  EXTI通道ID
+*             @arg EXTI_LINE_GPIO_PIN0
+*             @arg EXTI_LINE_GPIO_PIN1
+*             @arg ...
+*             @arg EXTI_LINE_COMP1
+*             @arg EXTI_LINE_COMP2
+*             @arg EXTI_LINE_LPTIM1
+* @retval 无
+*/
+__STATIC_INLINE void std_exti_interrupt_enable(uint32_t exti_line)
+{
+    EXTI->IMR |= (0x01U << (exti_line & EXTI_LINE_MASK));
+}
+
+/**
+* @brief  禁止EXTI通道唤醒中断
+* @param  exti_line  EXTI通道ID
+*             @arg EXTI_LINE_GPIO_PIN0
+*             @arg EXTI_LINE_GPIO_PIN1
+*             @arg ...
+*             @arg EXTI_LINE_COMP1
+*             @arg EXTI_LINE_COMP2
+*             @arg EXTI_LINE_LPTIM1
+* @retval 无
+*/
+__STATIC_INLINE void std_exti_interrupt_disable(uint32_t exti_line)
+{
+    EXTI->IMR &= (~(0x01U << (exti_line & EXTI_LINE_MASK)));
+}
+
+/**
+* @brief  使能EXTI通道唤醒事件
+* @param  exti_line  EXTI通道ID
+*             @arg EXTI_LINE_GPIO_PIN0
+*             @arg EXTI_LINE_GPIO_PIN1
+*             @arg ...
+*             @arg EXTI_LINE_COMP1
+*             @arg EXTI_LINE_COMP2
+*             @arg EXTI_LINE_LPTIM1
+* @retval 无
+*/
+__STATIC_INLINE void std_exti_event_enable(uint32_t exti_line)
+{
+    EXTI->EMR |= (0x01U << (exti_line & EXTI_LINE_MASK));
+}
+
+/**
+* @brief  禁止EXTI通道唤醒事件
+* @param  exti_line  EXTI通道ID
+*             @arg EXTI_LINE_GPIO_PIN0
+*             @arg EXTI_LINE_GPIO_PIN1
+*             @arg ...
+*             @arg EXTI_LINE_COMP1
+*             @arg EXTI_LINE_COMP2
+*             @arg EXTI_LINE_LPTIM1
+* @retval 无
+*/
+__STATIC_INLINE void std_exti_event_disable(uint32_t exti_line)
+{
+    EXTI->EMR &= (~(0x01U << (exti_line & EXTI_LINE_MASK)));
+}
+
+/**
+* @brief  设置EXTI通道所对应GPIO端口
+* @param  gpio_id  GPIO端口ID
+*             @arg EXTI_GPIOA
+*             @arg EXTI_GPIOB
+*             @arg EXTI_GPIOC
+* @param  exti_line  EXTI通道ID
+*             @arg EXTI_LINE_GPIO_PIN0
+*             @arg EXTI_LINE_GPIO_PIN1
+*             @arg ...
+*             @arg EXTI_LINE_GPIO_PIN7
+* @retval 无
+*/
+__STATIC_INLINE void std_exti_set_gpio(uint32_t gpio_id, uint32_t exti_line)
+{
+    exti_line &= EXTI_LINE_MASK;
+    MODIFY_REG(EXTI->EXTICR1,
+              (EXTI_EXTICR1_EXTI0_MASK << (EXTI_EXTICR1_EXTI1_POS * exti_line)),
+              (gpio_id << (EXTI_EXTICR1_EXTI1_POS * exti_line)));
+}
+
+void std_exti_init(std_exti_init_t* exti_init_param);
+void std_exti_deinit(void);
+void std_exti_struct_init(std_exti_init_t* exti_init_struct);
+
+/** 
+* @} 
+*/
+
+
+#ifdef __cplusplus
+}
+#endif
+
+/**
+* @} 
+*/  
+
+/**
+* @}
+*/
+
+#endif /* CIU32F003_STD_EXTI_H */

+ 372 - 0
CIU32F003_LIB/Include/ciu32f003_std_exti(3).h

@@ -0,0 +1,372 @@
+/************************************************************************************************/
+/**
+* @file               ciu32f003_std_exti.h
+* @author             MCU Ecosystem Development Team
+* @brief              EXTI STD库驱动头文件。
+*                     提供EXTI相关的STD库操作函数声明、数据类型以及常量的定义。                         
+*                     
+*
+**************************************************************************************************
+* @attention
+* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
+*
+**************************************************************************************************
+*/
+
+/* 避免头文件重复引用 */
+#ifndef CIU32F003_STD_EXTI_H
+#define CIU32F003_STD_EXTI_H
+
+/************************************************************************************************/
+/** 
+* @addtogroup CIU32F003_STD_Driver
+* @{
+*/
+
+/**
+* @defgroup EXTI EXTI
+* @brief 扩展中断和事件控制器的STD库驱动
+* @{
+*/
+/************************************************************************************************/
+
+
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/*------------------------------------------includes--------------------------------------------*/
+#include "ciu32f003_std_common.h"
+
+/*-----------------------------------------type define------------------------------------------*/
+/************************************************************************************************/
+/** 
+* @defgroup EXTI_Types EXTI Types
+* @brief EXTI数据类型定义
+* @{
+*/
+/************************************************************************************************/
+
+/**
+* @brief  EXTI参数配置结构体定义
+*/
+typedef struct
+{
+    uint32_t line_id;                 /**< EXTI通道ID
+                                               @arg EXTI_LINE_GPIO_PIN0 ... */
+    uint32_t mode;                    /**< EXTI通道模式
+                                               @arg EXTI_MODE_INTERRUPT ... */
+    uint32_t trigger;                 /**< EXTI通道触发类型
+                                               @arg EXTI_TRIGGER_RISING ... */
+    uint32_t gpio_id;                 /**< GPIO端口ID
+                                               @arg EXTI_GPIOA ... */
+} std_exti_init_t;
+
+
+/**
+* @}
+*/
+
+/*--------------------------------------------define--------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @defgroup EXTI_Constants EXTI Constants 
+* @brief  EXTI常量定义及宏定义
+* @{
+*
+*/
+/************************************************************************************************/
+
+/* EXTI LINE ID定义 */
+#define EXTI_LINE_GPIO_PIN0                 (EXTI_GPIO     | 0x00U)                         /**< EXTI_LINE0  */
+#define EXTI_LINE_GPIO_PIN1                 (EXTI_GPIO     | 0x01U)                         /**< EXTI_LINE1  */
+#define EXTI_LINE_GPIO_PIN2                 (EXTI_GPIO     | 0x02U)                         /**< EXTI_LINE2  */
+#define EXTI_LINE_GPIO_PIN3                 (EXTI_GPIO     | 0x03U)                         /**< EXTI_LINE3  */
+#define EXTI_LINE_GPIO_PIN4                 (EXTI_GPIO     | 0x04U)                         /**< EXTI_LINE4  */
+#define EXTI_LINE_GPIO_PIN5                 (EXTI_GPIO     | 0x05U)                         /**< EXTI_LINE5  */
+#define EXTI_LINE_GPIO_PIN6                 (EXTI_GPIO     | 0x06U)                         /**< EXTI_LINE6  */
+#define EXTI_LINE_GPIO_PIN7                 (EXTI_GPIO     | 0x07U)                         /**< EXTI_LINE7  */
+#define EXTI_LINE_COMP1                     (EXTI_CONFIG   | 0x10U)                         /**< EXTI_LINE16 */
+#define EXTI_LINE_COMP2                     (EXTI_CONFIG   | 0x11U)                         /**< EXTI_LINE17 */ 
+#define EXTI_LINE_LPTIM1                    (EXTI_DIRECT   | 0x1EU)                         /**< EXTI_LINE30 */
+
+/* EXTI LINE 分组 */
+#define EXTI_DIRECT                         (0x01000000)                                    /**< 直接通道                    */
+#define EXTI_CONFIG                         (0x02000000)                                    /**< 其它可配置通道(COMP1/COMP2) */
+#define EXTI_GPIO                           (0x06000000)                                    /**< GPIO可配置通道              */
+#define EXTI_PROPERTY_MASK                  (EXTI_DIRECT | EXTI_CONFIG | EXTI_GPIO)         /**< 通道屏蔽掩码                */
+
+/* EXTI LINE屏蔽掩码,用于筛选EXTI LINE ID */ 
+#define EXTI_LINE_MASK                      (0x0000001FU)                                   /**< EXTI LINE屏蔽掩码 */
+
+/* EXTI LINE模式:中断、事件 */ 
+#define EXTI_MODE_NONE                      (0x00000000U)                                   /**< 无中断/事件唤醒 */
+#define EXTI_MODE_INTERRUPT                 (0x00000001U)                                   /**< 中断唤醒        */
+#define EXTI_MODE_EVENT                     (0x00000002U)                                   /**< 事件唤醒        */
+#define EXTI_MODE_INTERRUPT_EVENT           (EXTI_MODE_EVENT | EXTI_MODE_INTERRUPT)         /**< 中断/事件唤醒   */
+
+/* EXTI LINE 触发类型定义,用于可配置通道,信号触发类型配置 */
+#define EXTI_TRIGGER_NONE                   (0x00000000U)                                   /**< 不触发            */
+#define EXTI_TRIGGER_RISING                 (0x00000001U)                                   /**< 上降沿触发        */
+#define EXTI_TRIGGER_FALLING                (0x00000002U)                                   /**< 下降沿触发        */
+#define EXTI_TRIGGER_RISING_FALLING         (EXTI_TRIGGER_RISING | EXTI_TRIGGER_FALLING)    /**< 上升沿/下降沿触发 */
+
+/* EXTI LINE 触发类型屏蔽掩码,用于筛选EXTI 可配置通道触发类型 */
+#define EXTI_TRIGGER_MASK                   (EXTI_TRIGGER_RISING | EXTI_TRIGGER_FALLING)     /**< 触发类型屏蔽掩码 */
+
+/* GPIO端口ID定义 */
+#define EXTI_GPIOA                          (0x00000000UL)                                   /**< GPIOA ID */
+#define EXTI_GPIOB                          (0x00000001UL)                                   /**< GPIOB ID */
+#define EXTI_GPIOC                          (0x00000002UL)                                   /**< GPIOC ID */
+
+/** 
+* @} 
+*/
+
+/*-------------------------------------------functions------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @defgroup EXTI_External_Functions EXTI External Functions
+* @brief    EXTI对外函数
+* @{
+*
+*/
+/************************************************************************************************/
+
+/**
+* @brief  读取EXTI通道中断挂起状态
+* @param  exti_line  EXTI通道ID
+*             @arg EXTI_LINE_GPIO_PIN0
+*             @arg EXTI_LINE_GPIO_PIN1
+*             @arg ...
+*             @arg EXTI_LINE_COMP1
+*             @arg EXTI_LINE_COMP2
+* @retval uint32_t 上升沿中断挂起状态
+*             @arg 非0  表示已挂起
+*             @arg 0 表示未挂起
+*/
+__STATIC_INLINE uint32_t std_exti_get_pending_status(uint32_t exti_line)
+{
+    return (EXTI->PIR & (0x01U << (exti_line & EXTI_LINE_MASK)));
+}
+
+
+/**
+* @brief  清除EXTI通道中断挂起状态
+* @param  exti_line  EXTI通道ID
+*             @arg EXTI_LINE_GPIO_PIN0
+*             @arg EXTI_LINE_GPIO_PIN1
+*             @arg ...
+*             @arg EXTI_LINE_COMP1
+*             @arg EXTI_LINE_COMP2
+* @retval 无
+*/
+__STATIC_INLINE void std_exti_clear_pending(uint32_t exti_line)
+{
+    EXTI->PIR = (0x01U << (exti_line & EXTI_LINE_MASK));
+}
+
+/**
+* @brief  使能EXTI通道上升沿触发
+* @param  exti_line  EXTI通道ID
+*             @arg EXTI_LINE_GPIO_PIN0
+*             @arg EXTI_LINE_GPIO_PIN1
+*             @arg ...
+*             @arg EXTI_LINE_COMP1
+*             @arg EXTI_LINE_COMP2
+* @retval 无
+*/
+__STATIC_INLINE void std_exti_rising_trigger_enable(uint32_t exti_line)
+{
+    EXTI->RTSR |= (0x01U << (exti_line & EXTI_LINE_MASK));
+}
+
+/**
+* @brief  禁止EXTI通道上升沿触发
+* @param  exti_line  EXTI通道ID
+*             @arg EXTI_LINE_GPIO_PIN0
+*             @arg EXTI_LINE_GPIO_PIN1
+*             @arg ...
+*             @arg EXTI_LINE_COMP1
+*             @arg EXTI_LINE_COMP2
+* @retval 无
+*/
+__STATIC_INLINE void std_exti_rising_trigger_disable(uint32_t exti_line)
+{
+    EXTI->RTSR &= (~(0x01U << (exti_line & EXTI_LINE_MASK)));   
+}
+
+/**
+* @brief  使能EXTI通道下降沿触发
+* @param  exti_line  EXTI通道ID
+*             @arg EXTI_LINE_GPIO_PIN0
+*             @arg EXTI_LINE_GPIO_PIN1
+*             @arg ...
+*             @arg EXTI_LINE_COMP1
+*             @arg EXTI_LINE_COMP2
+* @retval 无
+*/
+__STATIC_INLINE void std_exti_falling_trigger_enable(uint32_t exti_line)
+{
+    EXTI->FTSR |= (0x01U << (exti_line & EXTI_LINE_MASK));
+}
+
+/**
+* @brief  禁止EXTI通道下降沿触发
+* @param  exti_line  EXTI通道ID
+*             @arg EXTI_LINE_GPIO_PIN0
+*             @arg EXTI_LINE_GPIO_PIN1
+*             @arg ...
+*             @arg EXTI_LINE_COMP1
+*             @arg EXTI_LINE_COMP2
+* @retval 无
+*/
+__STATIC_INLINE void std_exti_falling_trigger_disable(uint32_t exti_line)
+{
+    EXTI->FTSR &= (~(0x01U << (exti_line & EXTI_LINE_MASK)));
+}
+
+/**
+* @brief  读取EXTI通道上升沿触发状态
+* @param  exti_line  EXTI通道ID
+*             @arg EXTI_LINE_GPIO_PIN0
+*             @arg EXTI_LINE_GPIO_PIN1 
+*             @arg ...
+*             @arg EXTI_LINE_COMP1
+*             @arg EXTI_LINE_COMP2
+* @retval uint32_t 上升沿触发状态
+*             @arg 非0  表示已使能
+*             @arg 0 表示已禁止
+*/
+__STATIC_INLINE uint32_t std_exti_get_rising_trigger_enable(uint32_t exti_line)
+{
+    return (EXTI->RTSR & (0x01U << (exti_line & EXTI_LINE_MASK)));
+}
+
+/**
+* @brief  读取EXTI通道下降沿触发状态
+* @param  exti_line  EXTI通道ID
+*             @arg EXTI_LINE_GPIO_PIN0
+*             @arg EXTI_LINE_GPIO_PIN1
+*             @arg ...
+*             @arg EXTI_LINE_COMP1
+*             @arg EXTI_LINE_COMP2
+* @retval uint32_t 下降沿触发状态
+*             @arg 非0  表示已使能
+*             @arg 0 表示已禁止
+*/
+__STATIC_INLINE uint32_t std_exti_get_falling_trigger_enable(uint32_t exti_line)
+{
+    return (EXTI->FTSR & (0x01U << (exti_line & EXTI_LINE_MASK)));
+}
+
+/**
+* @brief  使能EXTI通道唤醒中断
+* @param  exti_line  EXTI通道ID
+*             @arg EXTI_LINE_GPIO_PIN0
+*             @arg EXTI_LINE_GPIO_PIN1
+*             @arg ...
+*             @arg EXTI_LINE_COMP1
+*             @arg EXTI_LINE_COMP2
+*             @arg EXTI_LINE_LPTIM1
+* @retval 无
+*/
+__STATIC_INLINE void std_exti_interrupt_enable(uint32_t exti_line)
+{
+    EXTI->IMR |= (0x01U << (exti_line & EXTI_LINE_MASK));
+}
+
+/**
+* @brief  禁止EXTI通道唤醒中断
+* @param  exti_line  EXTI通道ID
+*             @arg EXTI_LINE_GPIO_PIN0
+*             @arg EXTI_LINE_GPIO_PIN1
+*             @arg ...
+*             @arg EXTI_LINE_COMP1
+*             @arg EXTI_LINE_COMP2
+*             @arg EXTI_LINE_LPTIM1
+* @retval 无
+*/
+__STATIC_INLINE void std_exti_interrupt_disable(uint32_t exti_line)
+{
+    EXTI->IMR &= (~(0x01U << (exti_line & EXTI_LINE_MASK)));
+}
+
+/**
+* @brief  使能EXTI通道唤醒事件
+* @param  exti_line  EXTI通道ID
+*             @arg EXTI_LINE_GPIO_PIN0
+*             @arg EXTI_LINE_GPIO_PIN1
+*             @arg ...
+*             @arg EXTI_LINE_COMP1
+*             @arg EXTI_LINE_COMP2
+*             @arg EXTI_LINE_LPTIM1
+* @retval 无
+*/
+__STATIC_INLINE void std_exti_event_enable(uint32_t exti_line)
+{
+    EXTI->EMR |= (0x01U << (exti_line & EXTI_LINE_MASK));
+}
+
+/**
+* @brief  禁止EXTI通道唤醒事件
+* @param  exti_line  EXTI通道ID
+*             @arg EXTI_LINE_GPIO_PIN0
+*             @arg EXTI_LINE_GPIO_PIN1
+*             @arg ...
+*             @arg EXTI_LINE_COMP1
+*             @arg EXTI_LINE_COMP2
+*             @arg EXTI_LINE_LPTIM1
+* @retval 无
+*/
+__STATIC_INLINE void std_exti_event_disable(uint32_t exti_line)
+{
+    EXTI->EMR &= (~(0x01U << (exti_line & EXTI_LINE_MASK)));
+}
+
+/**
+* @brief  设置EXTI通道所对应GPIO端口
+* @param  gpio_id  GPIO端口ID
+*             @arg EXTI_GPIOA
+*             @arg EXTI_GPIOB
+*             @arg EXTI_GPIOC
+* @param  exti_line  EXTI通道ID
+*             @arg EXTI_LINE_GPIO_PIN0
+*             @arg EXTI_LINE_GPIO_PIN1
+*             @arg ...
+*             @arg EXTI_LINE_GPIO_PIN7
+* @retval 无
+*/
+__STATIC_INLINE void std_exti_set_gpio(uint32_t gpio_id, uint32_t exti_line)
+{
+    exti_line &= EXTI_LINE_MASK;
+    MODIFY_REG(EXTI->EXTICR1,
+              (EXTI_EXTICR1_EXTI0_MASK << (EXTI_EXTICR1_EXTI1_POS * exti_line)),
+              (gpio_id << (EXTI_EXTICR1_EXTI1_POS * exti_line)));
+}
+
+void std_exti_init(std_exti_init_t* exti_init_param);
+void std_exti_deinit(void);
+void std_exti_struct_init(std_exti_init_t* exti_init_struct);
+
+/** 
+* @} 
+*/
+
+
+#ifdef __cplusplus
+}
+#endif
+
+/**
+* @} 
+*/  
+
+/**
+* @}
+*/
+
+#endif /* CIU32F003_STD_EXTI_H */

+ 372 - 0
CIU32F003_LIB/Include/ciu32f003_std_exti.h

@@ -0,0 +1,372 @@
+/************************************************************************************************/
+/**
+* @file               ciu32f003_std_exti.h
+* @author             MCU Ecosystem Development Team
+* @brief              EXTI STD库驱动头文件。
+*                     提供EXTI相关的STD库操作函数声明、数据类型以及常量的定义。                         
+*                     
+*
+**************************************************************************************************
+* @attention
+* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
+*
+**************************************************************************************************
+*/
+
+/* 避免头文件重复引用 */
+#ifndef CIU32F003_STD_EXTI_H
+#define CIU32F003_STD_EXTI_H
+
+/************************************************************************************************/
+/** 
+* @addtogroup CIU32F003_STD_Driver
+* @{
+*/
+
+/**
+* @defgroup EXTI EXTI
+* @brief 扩展中断和事件控制器的STD库驱动
+* @{
+*/
+/************************************************************************************************/
+
+
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/*------------------------------------------includes--------------------------------------------*/
+#include "ciu32f003_std_common.h"
+
+/*-----------------------------------------type define------------------------------------------*/
+/************************************************************************************************/
+/** 
+* @defgroup EXTI_Types EXTI Types
+* @brief EXTI数据类型定义
+* @{
+*/
+/************************************************************************************************/
+
+/**
+* @brief  EXTI参数配置结构体定义
+*/
+typedef struct
+{
+    uint32_t line_id;                 /**< EXTI通道ID
+                                               @arg EXTI_LINE_GPIO_PIN0 ... */
+    uint32_t mode;                    /**< EXTI通道模式
+                                               @arg EXTI_MODE_INTERRUPT ... */
+    uint32_t trigger;                 /**< EXTI通道触发类型
+                                               @arg EXTI_TRIGGER_RISING ... */
+    uint32_t gpio_id;                 /**< GPIO端口ID
+                                               @arg EXTI_GPIOA ... */
+} std_exti_init_t;
+
+
+/**
+* @}
+*/
+
+/*--------------------------------------------define--------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @defgroup EXTI_Constants EXTI Constants 
+* @brief  EXTI常量定义及宏定义
+* @{
+*
+*/
+/************************************************************************************************/
+
+/* EXTI LINE ID定义 */
+#define EXTI_LINE_GPIO_PIN0                 (EXTI_GPIO     | 0x00U)                         /**< EXTI_LINE0  */
+#define EXTI_LINE_GPIO_PIN1                 (EXTI_GPIO     | 0x01U)                         /**< EXTI_LINE1  */
+#define EXTI_LINE_GPIO_PIN2                 (EXTI_GPIO     | 0x02U)                         /**< EXTI_LINE2  */
+#define EXTI_LINE_GPIO_PIN3                 (EXTI_GPIO     | 0x03U)                         /**< EXTI_LINE3  */
+#define EXTI_LINE_GPIO_PIN4                 (EXTI_GPIO     | 0x04U)                         /**< EXTI_LINE4  */
+#define EXTI_LINE_GPIO_PIN5                 (EXTI_GPIO     | 0x05U)                         /**< EXTI_LINE5  */
+#define EXTI_LINE_GPIO_PIN6                 (EXTI_GPIO     | 0x06U)                         /**< EXTI_LINE6  */
+#define EXTI_LINE_GPIO_PIN7                 (EXTI_GPIO     | 0x07U)                         /**< EXTI_LINE7  */
+#define EXTI_LINE_COMP1                     (EXTI_CONFIG   | 0x10U)                         /**< EXTI_LINE16 */
+#define EXTI_LINE_COMP2                     (EXTI_CONFIG   | 0x11U)                         /**< EXTI_LINE17 */ 
+#define EXTI_LINE_LPTIM1                    (EXTI_DIRECT   | 0x1EU)                         /**< EXTI_LINE30 */
+
+/* EXTI LINE 分组 */
+#define EXTI_DIRECT                         (0x01000000)                                    /**< 直接通道                    */
+#define EXTI_CONFIG                         (0x02000000)                                    /**< 其它可配置通道(COMP1/COMP2) */
+#define EXTI_GPIO                           (0x06000000)                                    /**< GPIO可配置通道              */
+#define EXTI_PROPERTY_MASK                  (EXTI_DIRECT | EXTI_CONFIG | EXTI_GPIO)         /**< 通道屏蔽掩码                */
+
+/* EXTI LINE屏蔽掩码,用于筛选EXTI LINE ID */ 
+#define EXTI_LINE_MASK                      (0x0000001FU)                                   /**< EXTI LINE屏蔽掩码 */
+
+/* EXTI LINE模式:中断、事件 */ 
+#define EXTI_MODE_NONE                      (0x00000000U)                                   /**< 无中断/事件唤醒 */
+#define EXTI_MODE_INTERRUPT                 (0x00000001U)                                   /**< 中断唤醒        */
+#define EXTI_MODE_EVENT                     (0x00000002U)                                   /**< 事件唤醒        */
+#define EXTI_MODE_INTERRUPT_EVENT           (EXTI_MODE_EVENT | EXTI_MODE_INTERRUPT)         /**< 中断/事件唤醒   */
+
+/* EXTI LINE 触发类型定义,用于可配置通道,信号触发类型配置 */
+#define EXTI_TRIGGER_NONE                   (0x00000000U)                                   /**< 不触发            */
+#define EXTI_TRIGGER_RISING                 (0x00000001U)                                   /**< 上降沿触发        */
+#define EXTI_TRIGGER_FALLING                (0x00000002U)                                   /**< 下降沿触发        */
+#define EXTI_TRIGGER_RISING_FALLING         (EXTI_TRIGGER_RISING | EXTI_TRIGGER_FALLING)    /**< 上升沿/下降沿触发 */
+
+/* EXTI LINE 触发类型屏蔽掩码,用于筛选EXTI 可配置通道触发类型 */
+#define EXTI_TRIGGER_MASK                   (EXTI_TRIGGER_RISING | EXTI_TRIGGER_FALLING)     /**< 触发类型屏蔽掩码 */
+
+/* GPIO端口ID定义 */
+#define EXTI_GPIOA                          (0x00000000UL)                                   /**< GPIOA ID */
+#define EXTI_GPIOB                          (0x00000001UL)                                   /**< GPIOB ID */
+#define EXTI_GPIOC                          (0x00000002UL)                                   /**< GPIOC ID */
+
+/** 
+* @} 
+*/
+
+/*-------------------------------------------functions------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @defgroup EXTI_External_Functions EXTI External Functions
+* @brief    EXTI对外函数
+* @{
+*
+*/
+/************************************************************************************************/
+
+/**
+* @brief  读取EXTI通道中断挂起状态
+* @param  exti_line  EXTI通道ID
+*             @arg EXTI_LINE_GPIO_PIN0
+*             @arg EXTI_LINE_GPIO_PIN1
+*             @arg ...
+*             @arg EXTI_LINE_COMP1
+*             @arg EXTI_LINE_COMP2
+* @retval uint32_t 上升沿中断挂起状态
+*             @arg 非0  表示已挂起
+*             @arg 0 表示未挂起
+*/
+__STATIC_INLINE uint32_t std_exti_get_pending_status(uint32_t exti_line)
+{
+    return (EXTI->PIR & (0x01U << (exti_line & EXTI_LINE_MASK)));
+}
+
+
+/**
+* @brief  清除EXTI通道中断挂起状态
+* @param  exti_line  EXTI通道ID
+*             @arg EXTI_LINE_GPIO_PIN0
+*             @arg EXTI_LINE_GPIO_PIN1
+*             @arg ...
+*             @arg EXTI_LINE_COMP1
+*             @arg EXTI_LINE_COMP2
+* @retval 无
+*/
+__STATIC_INLINE void std_exti_clear_pending(uint32_t exti_line)
+{
+    EXTI->PIR = (0x01U << (exti_line & EXTI_LINE_MASK));
+}
+
+/**
+* @brief  使能EXTI通道上升沿触发
+* @param  exti_line  EXTI通道ID
+*             @arg EXTI_LINE_GPIO_PIN0
+*             @arg EXTI_LINE_GPIO_PIN1
+*             @arg ...
+*             @arg EXTI_LINE_COMP1
+*             @arg EXTI_LINE_COMP2
+* @retval 无
+*/
+__STATIC_INLINE void std_exti_rising_trigger_enable(uint32_t exti_line)
+{
+    EXTI->RTSR |= (0x01U << (exti_line & EXTI_LINE_MASK));
+}
+
+/**
+* @brief  禁止EXTI通道上升沿触发
+* @param  exti_line  EXTI通道ID
+*             @arg EXTI_LINE_GPIO_PIN0
+*             @arg EXTI_LINE_GPIO_PIN1
+*             @arg ...
+*             @arg EXTI_LINE_COMP1
+*             @arg EXTI_LINE_COMP2
+* @retval 无
+*/
+__STATIC_INLINE void std_exti_rising_trigger_disable(uint32_t exti_line)
+{
+    EXTI->RTSR &= (~(0x01U << (exti_line & EXTI_LINE_MASK)));   
+}
+
+/**
+* @brief  使能EXTI通道下降沿触发
+* @param  exti_line  EXTI通道ID
+*             @arg EXTI_LINE_GPIO_PIN0
+*             @arg EXTI_LINE_GPIO_PIN1
+*             @arg ...
+*             @arg EXTI_LINE_COMP1
+*             @arg EXTI_LINE_COMP2
+* @retval 无
+*/
+__STATIC_INLINE void std_exti_falling_trigger_enable(uint32_t exti_line)
+{
+    EXTI->FTSR |= (0x01U << (exti_line & EXTI_LINE_MASK));
+}
+
+/**
+* @brief  禁止EXTI通道下降沿触发
+* @param  exti_line  EXTI通道ID
+*             @arg EXTI_LINE_GPIO_PIN0
+*             @arg EXTI_LINE_GPIO_PIN1
+*             @arg ...
+*             @arg EXTI_LINE_COMP1
+*             @arg EXTI_LINE_COMP2
+* @retval 无
+*/
+__STATIC_INLINE void std_exti_falling_trigger_disable(uint32_t exti_line)
+{
+    EXTI->FTSR &= (~(0x01U << (exti_line & EXTI_LINE_MASK)));
+}
+
+/**
+* @brief  读取EXTI通道上升沿触发状态
+* @param  exti_line  EXTI通道ID
+*             @arg EXTI_LINE_GPIO_PIN0
+*             @arg EXTI_LINE_GPIO_PIN1 
+*             @arg ...
+*             @arg EXTI_LINE_COMP1
+*             @arg EXTI_LINE_COMP2
+* @retval uint32_t 上升沿触发状态
+*             @arg 非0  表示已使能
+*             @arg 0 表示已禁止
+*/
+__STATIC_INLINE uint32_t std_exti_get_rising_trigger_enable(uint32_t exti_line)
+{
+    return (EXTI->RTSR & (0x01U << (exti_line & EXTI_LINE_MASK)));
+}
+
+/**
+* @brief  读取EXTI通道下降沿触发状态
+* @param  exti_line  EXTI通道ID
+*             @arg EXTI_LINE_GPIO_PIN0
+*             @arg EXTI_LINE_GPIO_PIN1
+*             @arg ...
+*             @arg EXTI_LINE_COMP1
+*             @arg EXTI_LINE_COMP2
+* @retval uint32_t 下降沿触发状态
+*             @arg 非0  表示已使能
+*             @arg 0 表示已禁止
+*/
+__STATIC_INLINE uint32_t std_exti_get_falling_trigger_enable(uint32_t exti_line)
+{
+    return (EXTI->FTSR & (0x01U << (exti_line & EXTI_LINE_MASK)));
+}
+
+/**
+* @brief  使能EXTI通道唤醒中断
+* @param  exti_line  EXTI通道ID
+*             @arg EXTI_LINE_GPIO_PIN0
+*             @arg EXTI_LINE_GPIO_PIN1
+*             @arg ...
+*             @arg EXTI_LINE_COMP1
+*             @arg EXTI_LINE_COMP2
+*             @arg EXTI_LINE_LPTIM1
+* @retval 无
+*/
+__STATIC_INLINE void std_exti_interrupt_enable(uint32_t exti_line)
+{
+    EXTI->IMR |= (0x01U << (exti_line & EXTI_LINE_MASK));
+}
+
+/**
+* @brief  禁止EXTI通道唤醒中断
+* @param  exti_line  EXTI通道ID
+*             @arg EXTI_LINE_GPIO_PIN0
+*             @arg EXTI_LINE_GPIO_PIN1
+*             @arg ...
+*             @arg EXTI_LINE_COMP1
+*             @arg EXTI_LINE_COMP2
+*             @arg EXTI_LINE_LPTIM1
+* @retval 无
+*/
+__STATIC_INLINE void std_exti_interrupt_disable(uint32_t exti_line)
+{
+    EXTI->IMR &= (~(0x01U << (exti_line & EXTI_LINE_MASK)));
+}
+
+/**
+* @brief  使能EXTI通道唤醒事件
+* @param  exti_line  EXTI通道ID
+*             @arg EXTI_LINE_GPIO_PIN0
+*             @arg EXTI_LINE_GPIO_PIN1
+*             @arg ...
+*             @arg EXTI_LINE_COMP1
+*             @arg EXTI_LINE_COMP2
+*             @arg EXTI_LINE_LPTIM1
+* @retval 无
+*/
+__STATIC_INLINE void std_exti_event_enable(uint32_t exti_line)
+{
+    EXTI->EMR |= (0x01U << (exti_line & EXTI_LINE_MASK));
+}
+
+/**
+* @brief  禁止EXTI通道唤醒事件
+* @param  exti_line  EXTI通道ID
+*             @arg EXTI_LINE_GPIO_PIN0
+*             @arg EXTI_LINE_GPIO_PIN1
+*             @arg ...
+*             @arg EXTI_LINE_COMP1
+*             @arg EXTI_LINE_COMP2
+*             @arg EXTI_LINE_LPTIM1
+* @retval 无
+*/
+__STATIC_INLINE void std_exti_event_disable(uint32_t exti_line)
+{
+    EXTI->EMR &= (~(0x01U << (exti_line & EXTI_LINE_MASK)));
+}
+
+/**
+* @brief  设置EXTI通道所对应GPIO端口
+* @param  gpio_id  GPIO端口ID
+*             @arg EXTI_GPIOA
+*             @arg EXTI_GPIOB
+*             @arg EXTI_GPIOC
+* @param  exti_line  EXTI通道ID
+*             @arg EXTI_LINE_GPIO_PIN0
+*             @arg EXTI_LINE_GPIO_PIN1
+*             @arg ...
+*             @arg EXTI_LINE_GPIO_PIN7
+* @retval 无
+*/
+__STATIC_INLINE void std_exti_set_gpio(uint32_t gpio_id, uint32_t exti_line)
+{
+    exti_line &= EXTI_LINE_MASK;
+    MODIFY_REG(EXTI->EXTICR1,
+              (EXTI_EXTICR1_EXTI0_MASK << (EXTI_EXTICR1_EXTI1_POS * exti_line)),
+              (gpio_id << (EXTI_EXTICR1_EXTI1_POS * exti_line)));
+}
+
+void std_exti_init(std_exti_init_t* exti_init_param);
+void std_exti_deinit(void);
+void std_exti_struct_init(std_exti_init_t* exti_init_struct);
+
+/** 
+* @} 
+*/
+
+
+#ifdef __cplusplus
+}
+#endif
+
+/**
+* @} 
+*/  
+
+/**
+* @}
+*/
+
+#endif /* CIU32F003_STD_EXTI_H */

+ 454 - 0
CIU32F003_LIB/Include/ciu32f003_std_flash(1).h

@@ -0,0 +1,454 @@
+/************************************************************************************************/
+/**
+* @file               ciu32f003_std_flash.h
+* @author             MCU Ecosystem Development Team
+* @brief              FLASH STD库驱动头文件。
+*                     提供FLASH相关的STD库操作函数声明、数据类型以及常量的定义。                         
+*
+*
+**************************************************************************************************
+* @attention
+* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
+*
+**************************************************************************************************
+*/
+
+/*避免头文件重复引用*/
+#ifndef CIU32F003_STD_FLASH_H
+#define CIU32F003_STD_FLASH_H
+
+/************************************************************************************************/
+/** 
+* @addtogroup CIU32F003_STD_Driver
+* @{
+*/
+
+/**
+* @defgroup FLASH FLASH
+* @brief FLASH存储器的STD库驱动
+* @{
+*/
+/************************************************************************************************/
+
+
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/*------------------------------------------includes--------------------------------------------*/
+#include "ciu32f003_std_common.h"
+
+/*-------------------------------------------define---------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @defgroup FLASH_Constants FLASH Constants 
+* @brief  FLASH常量定义及宏定义
+* @{
+*
+*/
+/************************************************************************************************/
+
+/* Flash读取访问等待周期 */      
+#define FLASH_LATENCY_0CLK                FLASH_ACR_LATENCY_0CLK                     /**< 等待周期:0 HCLK         */
+#define FLASH_LATENCY_1CLK                FLASH_ACR_LATENCY_1CLK                     /**< 等待周期:1 HCLK         */ 
+
+/* Flash控制寄存器解锁密钥 */                                                        
+#define FLASH_CR_KEY1                     (0xE57A1A85U)                              /**< Flash控制寄存器解锁密钥1 */
+#define FLASH_CR_KEY2                     (0x7C6E8391U)                              /**< Flash控制寄存器解锁密钥2 */
+
+/* Flash选项字节解锁密钥 */                                                          
+#define FLASH_OPT_KEY1                    (0x6A894D7BU)                              /**< Flash选项字节解锁密钥1   */
+#define FLASH_OPT_KEY2                    (0x7C311F5AU)                              /**< Flash选项字节解锁密钥2   */
+
+/* Flash操作状态 */                                                                  
+#define FLASH_FLAG_EOP                    FLASH_SR_EOP                               /**< Flash操作完成标志              */
+#define FLASH_FLAG_BSY                    FLASH_SR_BSY                               /**< Flash操作状态标志              */
+#define FLASH_FLAG_OPTVERR                FLASH_SR_OPTVERR                           /**< Flash option bytes校验错误标志 */
+#define FLASH_FLAG_WRPERR                 FLASH_SR_WRPERR                            /**< Flash写保护错误标志            */
+
+/* Flash中断源 */                      
+#define FLASH_INTERRUPT_OPERR             FLASH_CR_OPERRIE                           /**< Flash操作异常中断        */
+#define FLASH_INTERRUPT_EOP               FLASH_CR_EOPIE                             /**< Flash操作完成中断        */
+
+/* Flash操作模式 */                                                                  
+#define FLASH_MODE_IDLE                   FLASH_CR_OP_MODE_IDLE                      /**< Flash退出擦除编程模式    */
+#define FLASH_MODE_PAGE_ERASE             FLASH_CR_OP_MODE_PAGE_ERASE                /**< Flash页擦除模式          */
+#define FLASH_MODE_MASS_ERASE             FLASH_CR_OP_MODE_MASS_ERASE                /**< Flash批量擦除模式        */
+#define FLASH_MODE_PROGRAM                FLASH_CR_OP_MODE_PROGRAM                   /**< Flash编程模式            */
+
+/* 选项字节1 位域使能 */
+#define FLASH_PIN_MODE_MASK               FLASH_OPTR1_NRST_SWD_MODE_MASK             /**< NRST SWD引脚功能选择    */
+#define FLASH_PIN_MODE_NRST_SWD           FLASH_OPTR1_NRST_SWD_MODE_0                /**< PC0: NRST  PB6: SWDIO   */
+#define FLASH_PIN_MODE_GPIO_SWD           FLASH_OPTR1_NRST_SWD_MODE_2                /**< PC0: GPIO  PB6: SWDIO   */
+#define FLASH_PIN_MODE_SWD_GPIO           FLASH_OPTR1_NRST_SWD_MODE_3                /**< PC0: SWDIO PB6: GPIO    */
+
+#define FLASH_BOR_DISABLE                 (0x00000000U)                              /**< BOR禁止                             */
+#define FLASH_BOR_ENABLE                  FLASH_OPTR1_BOR_EN                         /**< BOR使能                             */
+
+#define FLASH_BOR_LEVEL_0                 FLASH_OPTR1_BOR_LEVEL_0                    /**< BOR检测电压上升/下降阈值:2.0/1.9V  */
+#define FLASH_BOR_LEVEL_1                 FLASH_OPTR1_BOR_LEVEL_1                    /**< BOR检测电压上升/下降阈值:2.4/2.3V  */
+#define FLASH_BOR_LEVEL_2                 FLASH_OPTR1_BOR_LEVEL_2                    /**< BOR检测电压上升/下降阈值:2.8/2.7V  */
+#define FLASH_BOR_LEVEL_3                 FLASH_OPTR1_BOR_LEVEL_3                    /**< BOR检测电压上升/下降阈值:3.2/3.1V  */
+
+#define FLASH_RDP_LEVEL_MASK              FLASH_OPTR1_RDPRP_MASK                     /**< RDP配置域       */
+#define FLASH_RDP_LEVEL_0                 (0x00000000U)                              /**< RDP保护等级0    */
+#define FLASH_RDP_LEVEL_1                 (0x00000001U)                              /**< RDP保护等级1    */
+
+/* 选项字节2 位域使能 */
+#define FLASH_IWDG_STOP_MODE_STOP         (0x00000000U)                              /**< IWDG在Stop模式下停止计数                       */
+#define FLASH_IWDG_STOP_MODE_NORMAL       FLASH_OPTR2_IWDG_STOP                      /**< IWDG在Stop模式下正常计数                       */
+
+#define FLASH_STOP_RESET_ENABLE           (0x00000000U)                              /**< 执行进入Stop模式操作,不进入Stop,产生复位     */
+#define FLASH_STOP_RESET_DISABLE          FLASH_OPTR2_RST_STOP                       /**< 执行进入Stop模式操作,正常进入Stop,不产生复位 */
+
+/* 写保护区域配置 */
+#define FLASH_WRP_AREA_0                  (0x0000003EU)                              /**< 写保护区域:0x00000000U ~ 0x00000FFF */
+#define FLASH_WRP_AREA_1                  (0x0000003DU)                              /**< 写保护区域:0x00001000U ~ 0x00001FFF */
+#define FLASH_WRP_AREA_2                  (0x0000003BU)                              /**< 写保护区域:0x00002000U ~ 0x00002FFF */
+#define FLASH_WRP_AREA_3                  (0x00000037U)                              /**< 写保护区域:0x00003000U ~ 0x00003FFF */
+#define FLASH_WRP_AREA_4                  (0x0000002FU)                              /**< 写保护区域:0x00004000U ~ 0x00004FFF */
+#define FLASH_WRP_AREA_5                  (0x0000001FU)                              /**< 写保护区域:0x00005000U ~ 0x00005FFF */
+#define FLASH_WRP_AREA_ALL                (0x00000000U)                              /**< User flash区域全部写保护             */
+#define FLASH_WRP_AREA_NONE               (0x0000003FU)                              /**< User flash区域写保护关闭             */
+
+
+/**
+* @brief  计算Option Bytes区编程值
+* @param  VAL OB区低16位预期编程值 
+* @retval OB高16位取反后与低16位相加的值
+*/
+#define FLASH_OB_DATA_CALCULATE(VAL)      ((uint32_t)(((VAL) & 0xFFFF) | ((~(VAL & 0xFFFF)) << 16)))
+
+/**
+* @} 
+*/
+
+/*-------------------------------------------functions------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @defgroup FLASH_External_Functions FLASH External Functions
+* @brief    FLASH对外函数
+* @{
+*
+*/
+/************************************************************************************************/
+
+/** 
+* @brief  Flash控制寄存器解锁
+* @note   FLASH控制器解锁后操作CRKEY寄存器会产生总线错误并锁定写保护,直至下次复位
+* @retval 无
+*/
+__STATIC_INLINE void std_flash_unlock(void)
+{
+    if ((FLASH->CR & FLASH_CR_LOCK) == FLASH_CR_LOCK)
+    {
+        FLASH->CRKEY = FLASH_CR_KEY1;
+        FLASH->CRKEY = FLASH_CR_KEY2; 
+    }
+}
+
+/** 
+* @brief  Flash控制寄存器锁定
+* @retval 无
+*/
+__STATIC_INLINE void std_flash_lock(void)
+{
+    FLASH->CR |= FLASH_CR_LOCK;
+}
+
+/** 
+* @brief  读取Flash锁定状态
+* @retval uint32_t Flash锁定状态
+*             @arg 非0: 锁定
+*             @arg 0:   未锁定
+*/
+__STATIC_INLINE uint32_t std_flash_get_lock_status(void)
+{
+    return (FLASH->CR & FLASH_CR_LOCK);
+}
+
+/** 
+* @brief  Flash选项字节解锁
+* @note   FLASH 选项字节解锁后操作OPTKEY寄存器会产生总线错误并锁定写保护,直至下次复位
+* @retval 无
+*/
+__STATIC_INLINE void std_flash_opt_unlock(void)
+{
+    if ((FLASH->CR & FLASH_CR_OPTLOCK) == FLASH_CR_OPTLOCK)
+    {
+        FLASH->OPTKEY = FLASH_OPT_KEY1;
+        FLASH->OPTKEY = FLASH_OPT_KEY2; 
+    }
+}
+
+/** 
+* @brief  Flash选项字节锁定
+* @retval 无
+*/
+__STATIC_INLINE void std_flash_opt_lock(void)
+{
+    FLASH->CR |= FLASH_CR_OPTLOCK;
+}
+
+/** 
+* @brief  读取Flash选项字节锁定状态
+* @retval uint32_t Flash选项字节锁定状态
+*             @arg 非0: 锁定
+*             @arg 0:   未锁定
+*/
+__STATIC_INLINE uint32_t std_flash_get_opt_lock_status(void)
+{
+    return (FLASH->CR & FLASH_CR_OPTLOCK);
+}
+
+/**
+* @brief  设置FLASH读取访问等待周期
+* @param  latency 读取访问等待周期
+*             @arg  FLASH_LATENCY_0CLK
+*             @arg  FLASH_LATENCY_1CLK
+* @retval 无
+*/
+__STATIC_INLINE void std_flash_set_latency(uint32_t latency)
+{
+    MODIFY_REG(FLASH->ACR, FLASH_ACR_LATENCY, latency);
+} 
+
+/**
+* @brief  读取FLASH读取访问等待周期
+* @retval uint32_t 读取访问等待周期
+*             @arg  FLASH_LATENCY_0CLK
+*             @arg  FLASH_LATENCY_1CLK
+*/
+__STATIC_INLINE uint32_t std_flash_get_latency(void)
+{
+    return (FLASH->ACR & FLASH_ACR_LATENCY);
+} 
+
+/**
+* @brief  使能FLASH中断
+* @param  interrupts 中断源
+*             @arg FLASH_INTERRUPT_OPERR
+*             @arg FLASH_INTERRUPT_EOP 
+* @retval 无
+*/
+__STATIC_INLINE void std_flash_interrupt_enable(uint32_t interrupts)
+{
+    FLASH->CR |= interrupts;
+}
+
+/**
+* @brief  禁止FLASH中断
+* @param  interrupts 中断源
+*             @arg FLASH_INTERRUPT_OPERR
+*             @arg FLASH_INTERRUPT_EOP 
+* @retval 无
+*/
+__STATIC_INLINE void std_flash_interrupt_disable(uint32_t interrupts)
+{
+    FLASH->CR &= (~interrupts);
+}
+
+/**
+* @brief  读取FLASH中断使能状态
+* @param  interrupt 中断源
+*             @arg FLASH_INTERRUPT_OPERR
+*             @arg FLASH_INTERRUPT_EOP 
+* @retval uint32_t FLASH中断使能状态
+*             @arg 非0: 使能
+*             @arg 0:   禁止
+*/
+__STATIC_INLINE uint32_t std_flash_get_interrupt_enable(uint32_t interrupt)
+{
+    return (FLASH->CR & interrupt);
+}
+
+/**
+* @brief  读取FLASH状态标志
+* @param  flag 状态标志
+*             @arg FLASH_FLAG_EOP
+*             @arg FLASH_FLAG_BSY
+*             @arg FLASH_FLAG_OPTVERR
+*             @arg FLASH_FLAG_WRPERR
+* @retval uint32_t FLASH状态标志
+*             @arg 非0: 标志位置位
+*             @arg 0:   标志位清除
+*/
+__STATIC_INLINE uint32_t std_flash_get_flag(uint32_t flag)
+{
+    return (FLASH->SR & flag);
+}
+
+/**
+* @brief  清除FLASH状态标志
+* @param  flags 状态标志组合
+*             @arg FLASH_FLAG_EOP
+*             @arg FLASH_FLAG_WRPERR
+* @retval 无
+*/
+__STATIC_INLINE void std_flash_clear_flag(uint32_t flags)
+{
+    FLASH->SR = flags;
+}
+
+/** 
+* @brief  设置Flash操作模式
+* @param  mode 擦除模式
+*             @arg FLASH_MODE_IDLE
+*             @arg FLASH_MODE_PAGE_ERASE
+*             @arg FLASH_MODE_MASS_ERASE
+*             @arg FLASH_MODE_PROGRAM
+* @retval 无
+*/
+__STATIC_INLINE void std_flash_set_operate_mode(uint32_t mode)
+{
+    MODIFY_REG(FLASH->CR, FLASH_CR_OP_MODE, mode);
+}
+
+/**
+* @brief  读取选项字节寄存器1
+* @retval uint32_t 选项字节1加载值
+*/
+__STATIC_INLINE uint32_t std_flash_get_opt1(void)
+{
+    return (FLASH->OPTR1);
+}
+
+/**
+* @brief  读取FLASH读保护等级
+* @retval uint32_t FLASH读保护等级
+*             @arg FLASH_RDP_LEVEL_0
+*             @arg FLASH_RDP_LEVEL_1
+*/
+__STATIC_INLINE uint32_t std_flash_get_rdp_level(void)
+{
+    return (FLASH->OPTR1 & FLASH_OPTR1_RDPRP);
+}
+
+/**
+* @brief  读取BOR阈值等级
+* @retval uint32_t FLASH读保护等级
+*             @arg FLASH_BOR_LEVEL_0
+*             @arg ...
+*             @arg FLASH_BOR_LEVEL_3
+*/
+__STATIC_INLINE uint32_t std_flash_get_bor_level(void)
+{
+    return (FLASH->OPTR1 & FLASH_OPTR1_BOR_LEVEL);
+}
+
+/** 
+* @brief  读取BOR使能控制
+* @retval uint32_t BOR使能控制
+*             @arg FLASH_BOR_DISABLE
+*             @arg FLASH_BOR_ENABLE
+*/
+__STATIC_INLINE uint32_t std_flash_get_bor_en(void)
+{
+    return (FLASH->OPTR1 & FLASH_OPTR1_BOR_EN);
+}
+
+/** 
+* @brief  读取NRST SWD引脚功能控制
+* @retval uint32_t NRST SWD引脚功能选择
+*             @arg FLASH_PIN_MODE_NRST_SWD
+*             @arg FLASH_PIN_MODE_GPIO_SWD
+*             @arg FLASH_PIN_MODE_SWD_GPIO
+*/
+__STATIC_INLINE uint32_t std_flash_get_nrst_swd_mode(void)
+{
+    return (FLASH->OPTR1 & FLASH_PIN_MODE_MASK);
+}
+
+/**
+* @brief  读取选项字节寄存器2
+* @retval uint32_t 选项字节2加载值
+*/
+__STATIC_INLINE uint32_t std_flash_get_opt2(void)
+{
+    return (FLASH->OPTR2);
+}
+
+/** 
+* @brief  读取IWDG在STOP模式下计数器停止控制
+* @retval uint32_t IWDG_STOP设置
+*             @arg FLASH_IWDG_STOP_MODE_STOP
+*             @arg FLASH_IWDG_STOP_MODE_NORMAL
+*/
+__STATIC_INLINE uint32_t std_flash_get_iwdg_stop(void)
+{
+    return (FLASH->OPTR2 & FLASH_OPTR2_IWDG_STOP);
+}
+
+/** 
+* @brief  读取进入STOP模式是否复位的配置
+* @retval uint32_t RST_STOP设置
+*             @arg FLASH_STOP_RESET_ENABLE
+*             @arg FLASH_STOP_RESET_DISABLE
+*/
+__STATIC_INLINE uint32_t std_flash_get_rst_stop(void)
+{
+    return (FLASH->OPTR2 & FLASH_OPTR2_RST_STOP);
+}
+
+/**
+* @brief  读取写保护区配置值
+* @retval uint32_t 写保护区配置值
+*/
+__STATIC_INLINE uint32_t std_flash_get_wrp(void)
+{
+    return (FLASH->WRP & FLASH_WRP_WRP);
+}
+
+/** 
+* @brief  读取芯片型号
+* @retval uint32_t 芯片型号
+*/
+__STATIC_INLINE uint32_t std_flash_get_device_type(void)
+{
+    return (*(uint32_t *)DEVICE_TYPE);
+}
+
+/** 
+* @brief  读取Flash空间大小
+* @retval uint32_t Flash空间大小
+*/
+__STATIC_INLINE uint32_t std_flash_get_flash_size(void)
+{
+    return (*(uint32_t *)USERFLASH_SIZE);
+}
+
+/** 
+* @brief  读取SRAM空间大小
+* @retval uint32_t SRAM空间大小
+*/
+__STATIC_INLINE uint32_t std_flash_get_sram_size(void)
+{
+    return (*(uint32_t *)SRAM_SIZE);
+}
+
+
+std_status_t std_flash_erase(uint32_t mode, uint32_t address);
+std_status_t std_flash_word_program(uint32_t address, uint32_t prog_data);
+
+/** 
+* @} 
+*/
+
+#ifdef __cplusplus
+}
+#endif
+
+/**
+* @} 
+*/  
+
+/**
+* @}
+*/
+
+#endif /* CIU32F003_STD_FLASH_H */
+
+

+ 454 - 0
CIU32F003_LIB/Include/ciu32f003_std_flash(2).h

@@ -0,0 +1,454 @@
+/************************************************************************************************/
+/**
+* @file               ciu32f003_std_flash.h
+* @author             MCU Ecosystem Development Team
+* @brief              FLASH STD库驱动头文件。
+*                     提供FLASH相关的STD库操作函数声明、数据类型以及常量的定义。                         
+*
+*
+**************************************************************************************************
+* @attention
+* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
+*
+**************************************************************************************************
+*/
+
+/*避免头文件重复引用*/
+#ifndef CIU32F003_STD_FLASH_H
+#define CIU32F003_STD_FLASH_H
+
+/************************************************************************************************/
+/** 
+* @addtogroup CIU32F003_STD_Driver
+* @{
+*/
+
+/**
+* @defgroup FLASH FLASH
+* @brief FLASH存储器的STD库驱动
+* @{
+*/
+/************************************************************************************************/
+
+
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/*------------------------------------------includes--------------------------------------------*/
+#include "ciu32f003_std_common.h"
+
+/*-------------------------------------------define---------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @defgroup FLASH_Constants FLASH Constants 
+* @brief  FLASH常量定义及宏定义
+* @{
+*
+*/
+/************************************************************************************************/
+
+/* Flash读取访问等待周期 */      
+#define FLASH_LATENCY_0CLK                FLASH_ACR_LATENCY_0CLK                     /**< 等待周期:0 HCLK         */
+#define FLASH_LATENCY_1CLK                FLASH_ACR_LATENCY_1CLK                     /**< 等待周期:1 HCLK         */ 
+
+/* Flash控制寄存器解锁密钥 */                                                        
+#define FLASH_CR_KEY1                     (0xE57A1A85U)                              /**< Flash控制寄存器解锁密钥1 */
+#define FLASH_CR_KEY2                     (0x7C6E8391U)                              /**< Flash控制寄存器解锁密钥2 */
+
+/* Flash选项字节解锁密钥 */                                                          
+#define FLASH_OPT_KEY1                    (0x6A894D7BU)                              /**< Flash选项字节解锁密钥1   */
+#define FLASH_OPT_KEY2                    (0x7C311F5AU)                              /**< Flash选项字节解锁密钥2   */
+
+/* Flash操作状态 */                                                                  
+#define FLASH_FLAG_EOP                    FLASH_SR_EOP                               /**< Flash操作完成标志              */
+#define FLASH_FLAG_BSY                    FLASH_SR_BSY                               /**< Flash操作状态标志              */
+#define FLASH_FLAG_OPTVERR                FLASH_SR_OPTVERR                           /**< Flash option bytes校验错误标志 */
+#define FLASH_FLAG_WRPERR                 FLASH_SR_WRPERR                            /**< Flash写保护错误标志            */
+
+/* Flash中断源 */                      
+#define FLASH_INTERRUPT_OPERR             FLASH_CR_OPERRIE                           /**< Flash操作异常中断        */
+#define FLASH_INTERRUPT_EOP               FLASH_CR_EOPIE                             /**< Flash操作完成中断        */
+
+/* Flash操作模式 */                                                                  
+#define FLASH_MODE_IDLE                   FLASH_CR_OP_MODE_IDLE                      /**< Flash退出擦除编程模式    */
+#define FLASH_MODE_PAGE_ERASE             FLASH_CR_OP_MODE_PAGE_ERASE                /**< Flash页擦除模式          */
+#define FLASH_MODE_MASS_ERASE             FLASH_CR_OP_MODE_MASS_ERASE                /**< Flash批量擦除模式        */
+#define FLASH_MODE_PROGRAM                FLASH_CR_OP_MODE_PROGRAM                   /**< Flash编程模式            */
+
+/* 选项字节1 位域使能 */
+#define FLASH_PIN_MODE_MASK               FLASH_OPTR1_NRST_SWD_MODE_MASK             /**< NRST SWD引脚功能选择    */
+#define FLASH_PIN_MODE_NRST_SWD           FLASH_OPTR1_NRST_SWD_MODE_0                /**< PC0: NRST  PB6: SWDIO   */
+#define FLASH_PIN_MODE_GPIO_SWD           FLASH_OPTR1_NRST_SWD_MODE_2                /**< PC0: GPIO  PB6: SWDIO   */
+#define FLASH_PIN_MODE_SWD_GPIO           FLASH_OPTR1_NRST_SWD_MODE_3                /**< PC0: SWDIO PB6: GPIO    */
+
+#define FLASH_BOR_DISABLE                 (0x00000000U)                              /**< BOR禁止                             */
+#define FLASH_BOR_ENABLE                  FLASH_OPTR1_BOR_EN                         /**< BOR使能                             */
+
+#define FLASH_BOR_LEVEL_0                 FLASH_OPTR1_BOR_LEVEL_0                    /**< BOR检测电压上升/下降阈值:2.0/1.9V  */
+#define FLASH_BOR_LEVEL_1                 FLASH_OPTR1_BOR_LEVEL_1                    /**< BOR检测电压上升/下降阈值:2.4/2.3V  */
+#define FLASH_BOR_LEVEL_2                 FLASH_OPTR1_BOR_LEVEL_2                    /**< BOR检测电压上升/下降阈值:2.8/2.7V  */
+#define FLASH_BOR_LEVEL_3                 FLASH_OPTR1_BOR_LEVEL_3                    /**< BOR检测电压上升/下降阈值:3.2/3.1V  */
+
+#define FLASH_RDP_LEVEL_MASK              FLASH_OPTR1_RDPRP_MASK                     /**< RDP配置域       */
+#define FLASH_RDP_LEVEL_0                 (0x00000000U)                              /**< RDP保护等级0    */
+#define FLASH_RDP_LEVEL_1                 (0x00000001U)                              /**< RDP保护等级1    */
+
+/* 选项字节2 位域使能 */
+#define FLASH_IWDG_STOP_MODE_STOP         (0x00000000U)                              /**< IWDG在Stop模式下停止计数                       */
+#define FLASH_IWDG_STOP_MODE_NORMAL       FLASH_OPTR2_IWDG_STOP                      /**< IWDG在Stop模式下正常计数                       */
+
+#define FLASH_STOP_RESET_ENABLE           (0x00000000U)                              /**< 执行进入Stop模式操作,不进入Stop,产生复位     */
+#define FLASH_STOP_RESET_DISABLE          FLASH_OPTR2_RST_STOP                       /**< 执行进入Stop模式操作,正常进入Stop,不产生复位 */
+
+/* 写保护区域配置 */
+#define FLASH_WRP_AREA_0                  (0x0000003EU)                              /**< 写保护区域:0x00000000U ~ 0x00000FFF */
+#define FLASH_WRP_AREA_1                  (0x0000003DU)                              /**< 写保护区域:0x00001000U ~ 0x00001FFF */
+#define FLASH_WRP_AREA_2                  (0x0000003BU)                              /**< 写保护区域:0x00002000U ~ 0x00002FFF */
+#define FLASH_WRP_AREA_3                  (0x00000037U)                              /**< 写保护区域:0x00003000U ~ 0x00003FFF */
+#define FLASH_WRP_AREA_4                  (0x0000002FU)                              /**< 写保护区域:0x00004000U ~ 0x00004FFF */
+#define FLASH_WRP_AREA_5                  (0x0000001FU)                              /**< 写保护区域:0x00005000U ~ 0x00005FFF */
+#define FLASH_WRP_AREA_ALL                (0x00000000U)                              /**< User flash区域全部写保护             */
+#define FLASH_WRP_AREA_NONE               (0x0000003FU)                              /**< User flash区域写保护关闭             */
+
+
+/**
+* @brief  计算Option Bytes区编程值
+* @param  VAL OB区低16位预期编程值 
+* @retval OB高16位取反后与低16位相加的值
+*/
+#define FLASH_OB_DATA_CALCULATE(VAL)      ((uint32_t)(((VAL) & 0xFFFF) | ((~(VAL & 0xFFFF)) << 16)))
+
+/**
+* @} 
+*/
+
+/*-------------------------------------------functions------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @defgroup FLASH_External_Functions FLASH External Functions
+* @brief    FLASH对外函数
+* @{
+*
+*/
+/************************************************************************************************/
+
+/** 
+* @brief  Flash控制寄存器解锁
+* @note   FLASH控制器解锁后操作CRKEY寄存器会产生总线错误并锁定写保护,直至下次复位
+* @retval 无
+*/
+__STATIC_INLINE void std_flash_unlock(void)
+{
+    if ((FLASH->CR & FLASH_CR_LOCK) == FLASH_CR_LOCK)
+    {
+        FLASH->CRKEY = FLASH_CR_KEY1;
+        FLASH->CRKEY = FLASH_CR_KEY2; 
+    }
+}
+
+/** 
+* @brief  Flash控制寄存器锁定
+* @retval 无
+*/
+__STATIC_INLINE void std_flash_lock(void)
+{
+    FLASH->CR |= FLASH_CR_LOCK;
+}
+
+/** 
+* @brief  读取Flash锁定状态
+* @retval uint32_t Flash锁定状态
+*             @arg 非0: 锁定
+*             @arg 0:   未锁定
+*/
+__STATIC_INLINE uint32_t std_flash_get_lock_status(void)
+{
+    return (FLASH->CR & FLASH_CR_LOCK);
+}
+
+/** 
+* @brief  Flash选项字节解锁
+* @note   FLASH 选项字节解锁后操作OPTKEY寄存器会产生总线错误并锁定写保护,直至下次复位
+* @retval 无
+*/
+__STATIC_INLINE void std_flash_opt_unlock(void)
+{
+    if ((FLASH->CR & FLASH_CR_OPTLOCK) == FLASH_CR_OPTLOCK)
+    {
+        FLASH->OPTKEY = FLASH_OPT_KEY1;
+        FLASH->OPTKEY = FLASH_OPT_KEY2; 
+    }
+}
+
+/** 
+* @brief  Flash选项字节锁定
+* @retval 无
+*/
+__STATIC_INLINE void std_flash_opt_lock(void)
+{
+    FLASH->CR |= FLASH_CR_OPTLOCK;
+}
+
+/** 
+* @brief  读取Flash选项字节锁定状态
+* @retval uint32_t Flash选项字节锁定状态
+*             @arg 非0: 锁定
+*             @arg 0:   未锁定
+*/
+__STATIC_INLINE uint32_t std_flash_get_opt_lock_status(void)
+{
+    return (FLASH->CR & FLASH_CR_OPTLOCK);
+}
+
+/**
+* @brief  设置FLASH读取访问等待周期
+* @param  latency 读取访问等待周期
+*             @arg  FLASH_LATENCY_0CLK
+*             @arg  FLASH_LATENCY_1CLK
+* @retval 无
+*/
+__STATIC_INLINE void std_flash_set_latency(uint32_t latency)
+{
+    MODIFY_REG(FLASH->ACR, FLASH_ACR_LATENCY, latency);
+} 
+
+/**
+* @brief  读取FLASH读取访问等待周期
+* @retval uint32_t 读取访问等待周期
+*             @arg  FLASH_LATENCY_0CLK
+*             @arg  FLASH_LATENCY_1CLK
+*/
+__STATIC_INLINE uint32_t std_flash_get_latency(void)
+{
+    return (FLASH->ACR & FLASH_ACR_LATENCY);
+} 
+
+/**
+* @brief  使能FLASH中断
+* @param  interrupts 中断源
+*             @arg FLASH_INTERRUPT_OPERR
+*             @arg FLASH_INTERRUPT_EOP 
+* @retval 无
+*/
+__STATIC_INLINE void std_flash_interrupt_enable(uint32_t interrupts)
+{
+    FLASH->CR |= interrupts;
+}
+
+/**
+* @brief  禁止FLASH中断
+* @param  interrupts 中断源
+*             @arg FLASH_INTERRUPT_OPERR
+*             @arg FLASH_INTERRUPT_EOP 
+* @retval 无
+*/
+__STATIC_INLINE void std_flash_interrupt_disable(uint32_t interrupts)
+{
+    FLASH->CR &= (~interrupts);
+}
+
+/**
+* @brief  读取FLASH中断使能状态
+* @param  interrupt 中断源
+*             @arg FLASH_INTERRUPT_OPERR
+*             @arg FLASH_INTERRUPT_EOP 
+* @retval uint32_t FLASH中断使能状态
+*             @arg 非0: 使能
+*             @arg 0:   禁止
+*/
+__STATIC_INLINE uint32_t std_flash_get_interrupt_enable(uint32_t interrupt)
+{
+    return (FLASH->CR & interrupt);
+}
+
+/**
+* @brief  读取FLASH状态标志
+* @param  flag 状态标志
+*             @arg FLASH_FLAG_EOP
+*             @arg FLASH_FLAG_BSY
+*             @arg FLASH_FLAG_OPTVERR
+*             @arg FLASH_FLAG_WRPERR
+* @retval uint32_t FLASH状态标志
+*             @arg 非0: 标志位置位
+*             @arg 0:   标志位清除
+*/
+__STATIC_INLINE uint32_t std_flash_get_flag(uint32_t flag)
+{
+    return (FLASH->SR & flag);
+}
+
+/**
+* @brief  清除FLASH状态标志
+* @param  flags 状态标志组合
+*             @arg FLASH_FLAG_EOP
+*             @arg FLASH_FLAG_WRPERR
+* @retval 无
+*/
+__STATIC_INLINE void std_flash_clear_flag(uint32_t flags)
+{
+    FLASH->SR = flags;
+}
+
+/** 
+* @brief  设置Flash操作模式
+* @param  mode 擦除模式
+*             @arg FLASH_MODE_IDLE
+*             @arg FLASH_MODE_PAGE_ERASE
+*             @arg FLASH_MODE_MASS_ERASE
+*             @arg FLASH_MODE_PROGRAM
+* @retval 无
+*/
+__STATIC_INLINE void std_flash_set_operate_mode(uint32_t mode)
+{
+    MODIFY_REG(FLASH->CR, FLASH_CR_OP_MODE, mode);
+}
+
+/**
+* @brief  读取选项字节寄存器1
+* @retval uint32_t 选项字节1加载值
+*/
+__STATIC_INLINE uint32_t std_flash_get_opt1(void)
+{
+    return (FLASH->OPTR1);
+}
+
+/**
+* @brief  读取FLASH读保护等级
+* @retval uint32_t FLASH读保护等级
+*             @arg FLASH_RDP_LEVEL_0
+*             @arg FLASH_RDP_LEVEL_1
+*/
+__STATIC_INLINE uint32_t std_flash_get_rdp_level(void)
+{
+    return (FLASH->OPTR1 & FLASH_OPTR1_RDPRP);
+}
+
+/**
+* @brief  读取BOR阈值等级
+* @retval uint32_t FLASH读保护等级
+*             @arg FLASH_BOR_LEVEL_0
+*             @arg ...
+*             @arg FLASH_BOR_LEVEL_3
+*/
+__STATIC_INLINE uint32_t std_flash_get_bor_level(void)
+{
+    return (FLASH->OPTR1 & FLASH_OPTR1_BOR_LEVEL);
+}
+
+/** 
+* @brief  读取BOR使能控制
+* @retval uint32_t BOR使能控制
+*             @arg FLASH_BOR_DISABLE
+*             @arg FLASH_BOR_ENABLE
+*/
+__STATIC_INLINE uint32_t std_flash_get_bor_en(void)
+{
+    return (FLASH->OPTR1 & FLASH_OPTR1_BOR_EN);
+}
+
+/** 
+* @brief  读取NRST SWD引脚功能控制
+* @retval uint32_t NRST SWD引脚功能选择
+*             @arg FLASH_PIN_MODE_NRST_SWD
+*             @arg FLASH_PIN_MODE_GPIO_SWD
+*             @arg FLASH_PIN_MODE_SWD_GPIO
+*/
+__STATIC_INLINE uint32_t std_flash_get_nrst_swd_mode(void)
+{
+    return (FLASH->OPTR1 & FLASH_PIN_MODE_MASK);
+}
+
+/**
+* @brief  读取选项字节寄存器2
+* @retval uint32_t 选项字节2加载值
+*/
+__STATIC_INLINE uint32_t std_flash_get_opt2(void)
+{
+    return (FLASH->OPTR2);
+}
+
+/** 
+* @brief  读取IWDG在STOP模式下计数器停止控制
+* @retval uint32_t IWDG_STOP设置
+*             @arg FLASH_IWDG_STOP_MODE_STOP
+*             @arg FLASH_IWDG_STOP_MODE_NORMAL
+*/
+__STATIC_INLINE uint32_t std_flash_get_iwdg_stop(void)
+{
+    return (FLASH->OPTR2 & FLASH_OPTR2_IWDG_STOP);
+}
+
+/** 
+* @brief  读取进入STOP模式是否复位的配置
+* @retval uint32_t RST_STOP设置
+*             @arg FLASH_STOP_RESET_ENABLE
+*             @arg FLASH_STOP_RESET_DISABLE
+*/
+__STATIC_INLINE uint32_t std_flash_get_rst_stop(void)
+{
+    return (FLASH->OPTR2 & FLASH_OPTR2_RST_STOP);
+}
+
+/**
+* @brief  读取写保护区配置值
+* @retval uint32_t 写保护区配置值
+*/
+__STATIC_INLINE uint32_t std_flash_get_wrp(void)
+{
+    return (FLASH->WRP & FLASH_WRP_WRP);
+}
+
+/** 
+* @brief  读取芯片型号
+* @retval uint32_t 芯片型号
+*/
+__STATIC_INLINE uint32_t std_flash_get_device_type(void)
+{
+    return (*(uint32_t *)DEVICE_TYPE);
+}
+
+/** 
+* @brief  读取Flash空间大小
+* @retval uint32_t Flash空间大小
+*/
+__STATIC_INLINE uint32_t std_flash_get_flash_size(void)
+{
+    return (*(uint32_t *)USERFLASH_SIZE);
+}
+
+/** 
+* @brief  读取SRAM空间大小
+* @retval uint32_t SRAM空间大小
+*/
+__STATIC_INLINE uint32_t std_flash_get_sram_size(void)
+{
+    return (*(uint32_t *)SRAM_SIZE);
+}
+
+
+std_status_t std_flash_erase(uint32_t mode, uint32_t address);
+std_status_t std_flash_word_program(uint32_t address, uint32_t prog_data);
+
+/** 
+* @} 
+*/
+
+#ifdef __cplusplus
+}
+#endif
+
+/**
+* @} 
+*/  
+
+/**
+* @}
+*/
+
+#endif /* CIU32F003_STD_FLASH_H */
+
+

+ 454 - 0
CIU32F003_LIB/Include/ciu32f003_std_flash(3).h

@@ -0,0 +1,454 @@
+/************************************************************************************************/
+/**
+* @file               ciu32f003_std_flash.h
+* @author             MCU Ecosystem Development Team
+* @brief              FLASH STD库驱动头文件。
+*                     提供FLASH相关的STD库操作函数声明、数据类型以及常量的定义。                         
+*
+*
+**************************************************************************************************
+* @attention
+* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
+*
+**************************************************************************************************
+*/
+
+/*避免头文件重复引用*/
+#ifndef CIU32F003_STD_FLASH_H
+#define CIU32F003_STD_FLASH_H
+
+/************************************************************************************************/
+/** 
+* @addtogroup CIU32F003_STD_Driver
+* @{
+*/
+
+/**
+* @defgroup FLASH FLASH
+* @brief FLASH存储器的STD库驱动
+* @{
+*/
+/************************************************************************************************/
+
+
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/*------------------------------------------includes--------------------------------------------*/
+#include "ciu32f003_std_common.h"
+
+/*-------------------------------------------define---------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @defgroup FLASH_Constants FLASH Constants 
+* @brief  FLASH常量定义及宏定义
+* @{
+*
+*/
+/************************************************************************************************/
+
+/* Flash读取访问等待周期 */      
+#define FLASH_LATENCY_0CLK                FLASH_ACR_LATENCY_0CLK                     /**< 等待周期:0 HCLK         */
+#define FLASH_LATENCY_1CLK                FLASH_ACR_LATENCY_1CLK                     /**< 等待周期:1 HCLK         */ 
+
+/* Flash控制寄存器解锁密钥 */                                                        
+#define FLASH_CR_KEY1                     (0xE57A1A85U)                              /**< Flash控制寄存器解锁密钥1 */
+#define FLASH_CR_KEY2                     (0x7C6E8391U)                              /**< Flash控制寄存器解锁密钥2 */
+
+/* Flash选项字节解锁密钥 */                                                          
+#define FLASH_OPT_KEY1                    (0x6A894D7BU)                              /**< Flash选项字节解锁密钥1   */
+#define FLASH_OPT_KEY2                    (0x7C311F5AU)                              /**< Flash选项字节解锁密钥2   */
+
+/* Flash操作状态 */                                                                  
+#define FLASH_FLAG_EOP                    FLASH_SR_EOP                               /**< Flash操作完成标志              */
+#define FLASH_FLAG_BSY                    FLASH_SR_BSY                               /**< Flash操作状态标志              */
+#define FLASH_FLAG_OPTVERR                FLASH_SR_OPTVERR                           /**< Flash option bytes校验错误标志 */
+#define FLASH_FLAG_WRPERR                 FLASH_SR_WRPERR                            /**< Flash写保护错误标志            */
+
+/* Flash中断源 */                      
+#define FLASH_INTERRUPT_OPERR             FLASH_CR_OPERRIE                           /**< Flash操作异常中断        */
+#define FLASH_INTERRUPT_EOP               FLASH_CR_EOPIE                             /**< Flash操作完成中断        */
+
+/* Flash操作模式 */                                                                  
+#define FLASH_MODE_IDLE                   FLASH_CR_OP_MODE_IDLE                      /**< Flash退出擦除编程模式    */
+#define FLASH_MODE_PAGE_ERASE             FLASH_CR_OP_MODE_PAGE_ERASE                /**< Flash页擦除模式          */
+#define FLASH_MODE_MASS_ERASE             FLASH_CR_OP_MODE_MASS_ERASE                /**< Flash批量擦除模式        */
+#define FLASH_MODE_PROGRAM                FLASH_CR_OP_MODE_PROGRAM                   /**< Flash编程模式            */
+
+/* 选项字节1 位域使能 */
+#define FLASH_PIN_MODE_MASK               FLASH_OPTR1_NRST_SWD_MODE_MASK             /**< NRST SWD引脚功能选择    */
+#define FLASH_PIN_MODE_NRST_SWD           FLASH_OPTR1_NRST_SWD_MODE_0                /**< PC0: NRST  PB6: SWDIO   */
+#define FLASH_PIN_MODE_GPIO_SWD           FLASH_OPTR1_NRST_SWD_MODE_2                /**< PC0: GPIO  PB6: SWDIO   */
+#define FLASH_PIN_MODE_SWD_GPIO           FLASH_OPTR1_NRST_SWD_MODE_3                /**< PC0: SWDIO PB6: GPIO    */
+
+#define FLASH_BOR_DISABLE                 (0x00000000U)                              /**< BOR禁止                             */
+#define FLASH_BOR_ENABLE                  FLASH_OPTR1_BOR_EN                         /**< BOR使能                             */
+
+#define FLASH_BOR_LEVEL_0                 FLASH_OPTR1_BOR_LEVEL_0                    /**< BOR检测电压上升/下降阈值:2.0/1.9V  */
+#define FLASH_BOR_LEVEL_1                 FLASH_OPTR1_BOR_LEVEL_1                    /**< BOR检测电压上升/下降阈值:2.4/2.3V  */
+#define FLASH_BOR_LEVEL_2                 FLASH_OPTR1_BOR_LEVEL_2                    /**< BOR检测电压上升/下降阈值:2.8/2.7V  */
+#define FLASH_BOR_LEVEL_3                 FLASH_OPTR1_BOR_LEVEL_3                    /**< BOR检测电压上升/下降阈值:3.2/3.1V  */
+
+#define FLASH_RDP_LEVEL_MASK              FLASH_OPTR1_RDPRP_MASK                     /**< RDP配置域       */
+#define FLASH_RDP_LEVEL_0                 (0x00000000U)                              /**< RDP保护等级0    */
+#define FLASH_RDP_LEVEL_1                 (0x00000001U)                              /**< RDP保护等级1    */
+
+/* 选项字节2 位域使能 */
+#define FLASH_IWDG_STOP_MODE_STOP         (0x00000000U)                              /**< IWDG在Stop模式下停止计数                       */
+#define FLASH_IWDG_STOP_MODE_NORMAL       FLASH_OPTR2_IWDG_STOP                      /**< IWDG在Stop模式下正常计数                       */
+
+#define FLASH_STOP_RESET_ENABLE           (0x00000000U)                              /**< 执行进入Stop模式操作,不进入Stop,产生复位     */
+#define FLASH_STOP_RESET_DISABLE          FLASH_OPTR2_RST_STOP                       /**< 执行进入Stop模式操作,正常进入Stop,不产生复位 */
+
+/* 写保护区域配置 */
+#define FLASH_WRP_AREA_0                  (0x0000003EU)                              /**< 写保护区域:0x00000000U ~ 0x00000FFF */
+#define FLASH_WRP_AREA_1                  (0x0000003DU)                              /**< 写保护区域:0x00001000U ~ 0x00001FFF */
+#define FLASH_WRP_AREA_2                  (0x0000003BU)                              /**< 写保护区域:0x00002000U ~ 0x00002FFF */
+#define FLASH_WRP_AREA_3                  (0x00000037U)                              /**< 写保护区域:0x00003000U ~ 0x00003FFF */
+#define FLASH_WRP_AREA_4                  (0x0000002FU)                              /**< 写保护区域:0x00004000U ~ 0x00004FFF */
+#define FLASH_WRP_AREA_5                  (0x0000001FU)                              /**< 写保护区域:0x00005000U ~ 0x00005FFF */
+#define FLASH_WRP_AREA_ALL                (0x00000000U)                              /**< User flash区域全部写保护             */
+#define FLASH_WRP_AREA_NONE               (0x0000003FU)                              /**< User flash区域写保护关闭             */
+
+
+/**
+* @brief  计算Option Bytes区编程值
+* @param  VAL OB区低16位预期编程值 
+* @retval OB高16位取反后与低16位相加的值
+*/
+#define FLASH_OB_DATA_CALCULATE(VAL)      ((uint32_t)(((VAL) & 0xFFFF) | ((~(VAL & 0xFFFF)) << 16)))
+
+/**
+* @} 
+*/
+
+/*-------------------------------------------functions------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @defgroup FLASH_External_Functions FLASH External Functions
+* @brief    FLASH对外函数
+* @{
+*
+*/
+/************************************************************************************************/
+
+/** 
+* @brief  Flash控制寄存器解锁
+* @note   FLASH控制器解锁后操作CRKEY寄存器会产生总线错误并锁定写保护,直至下次复位
+* @retval 无
+*/
+__STATIC_INLINE void std_flash_unlock(void)
+{
+    if ((FLASH->CR & FLASH_CR_LOCK) == FLASH_CR_LOCK)
+    {
+        FLASH->CRKEY = FLASH_CR_KEY1;
+        FLASH->CRKEY = FLASH_CR_KEY2; 
+    }
+}
+
+/** 
+* @brief  Flash控制寄存器锁定
+* @retval 无
+*/
+__STATIC_INLINE void std_flash_lock(void)
+{
+    FLASH->CR |= FLASH_CR_LOCK;
+}
+
+/** 
+* @brief  读取Flash锁定状态
+* @retval uint32_t Flash锁定状态
+*             @arg 非0: 锁定
+*             @arg 0:   未锁定
+*/
+__STATIC_INLINE uint32_t std_flash_get_lock_status(void)
+{
+    return (FLASH->CR & FLASH_CR_LOCK);
+}
+
+/** 
+* @brief  Flash选项字节解锁
+* @note   FLASH 选项字节解锁后操作OPTKEY寄存器会产生总线错误并锁定写保护,直至下次复位
+* @retval 无
+*/
+__STATIC_INLINE void std_flash_opt_unlock(void)
+{
+    if ((FLASH->CR & FLASH_CR_OPTLOCK) == FLASH_CR_OPTLOCK)
+    {
+        FLASH->OPTKEY = FLASH_OPT_KEY1;
+        FLASH->OPTKEY = FLASH_OPT_KEY2; 
+    }
+}
+
+/** 
+* @brief  Flash选项字节锁定
+* @retval 无
+*/
+__STATIC_INLINE void std_flash_opt_lock(void)
+{
+    FLASH->CR |= FLASH_CR_OPTLOCK;
+}
+
+/** 
+* @brief  读取Flash选项字节锁定状态
+* @retval uint32_t Flash选项字节锁定状态
+*             @arg 非0: 锁定
+*             @arg 0:   未锁定
+*/
+__STATIC_INLINE uint32_t std_flash_get_opt_lock_status(void)
+{
+    return (FLASH->CR & FLASH_CR_OPTLOCK);
+}
+
+/**
+* @brief  设置FLASH读取访问等待周期
+* @param  latency 读取访问等待周期
+*             @arg  FLASH_LATENCY_0CLK
+*             @arg  FLASH_LATENCY_1CLK
+* @retval 无
+*/
+__STATIC_INLINE void std_flash_set_latency(uint32_t latency)
+{
+    MODIFY_REG(FLASH->ACR, FLASH_ACR_LATENCY, latency);
+} 
+
+/**
+* @brief  读取FLASH读取访问等待周期
+* @retval uint32_t 读取访问等待周期
+*             @arg  FLASH_LATENCY_0CLK
+*             @arg  FLASH_LATENCY_1CLK
+*/
+__STATIC_INLINE uint32_t std_flash_get_latency(void)
+{
+    return (FLASH->ACR & FLASH_ACR_LATENCY);
+} 
+
+/**
+* @brief  使能FLASH中断
+* @param  interrupts 中断源
+*             @arg FLASH_INTERRUPT_OPERR
+*             @arg FLASH_INTERRUPT_EOP 
+* @retval 无
+*/
+__STATIC_INLINE void std_flash_interrupt_enable(uint32_t interrupts)
+{
+    FLASH->CR |= interrupts;
+}
+
+/**
+* @brief  禁止FLASH中断
+* @param  interrupts 中断源
+*             @arg FLASH_INTERRUPT_OPERR
+*             @arg FLASH_INTERRUPT_EOP 
+* @retval 无
+*/
+__STATIC_INLINE void std_flash_interrupt_disable(uint32_t interrupts)
+{
+    FLASH->CR &= (~interrupts);
+}
+
+/**
+* @brief  读取FLASH中断使能状态
+* @param  interrupt 中断源
+*             @arg FLASH_INTERRUPT_OPERR
+*             @arg FLASH_INTERRUPT_EOP 
+* @retval uint32_t FLASH中断使能状态
+*             @arg 非0: 使能
+*             @arg 0:   禁止
+*/
+__STATIC_INLINE uint32_t std_flash_get_interrupt_enable(uint32_t interrupt)
+{
+    return (FLASH->CR & interrupt);
+}
+
+/**
+* @brief  读取FLASH状态标志
+* @param  flag 状态标志
+*             @arg FLASH_FLAG_EOP
+*             @arg FLASH_FLAG_BSY
+*             @arg FLASH_FLAG_OPTVERR
+*             @arg FLASH_FLAG_WRPERR
+* @retval uint32_t FLASH状态标志
+*             @arg 非0: 标志位置位
+*             @arg 0:   标志位清除
+*/
+__STATIC_INLINE uint32_t std_flash_get_flag(uint32_t flag)
+{
+    return (FLASH->SR & flag);
+}
+
+/**
+* @brief  清除FLASH状态标志
+* @param  flags 状态标志组合
+*             @arg FLASH_FLAG_EOP
+*             @arg FLASH_FLAG_WRPERR
+* @retval 无
+*/
+__STATIC_INLINE void std_flash_clear_flag(uint32_t flags)
+{
+    FLASH->SR = flags;
+}
+
+/** 
+* @brief  设置Flash操作模式
+* @param  mode 擦除模式
+*             @arg FLASH_MODE_IDLE
+*             @arg FLASH_MODE_PAGE_ERASE
+*             @arg FLASH_MODE_MASS_ERASE
+*             @arg FLASH_MODE_PROGRAM
+* @retval 无
+*/
+__STATIC_INLINE void std_flash_set_operate_mode(uint32_t mode)
+{
+    MODIFY_REG(FLASH->CR, FLASH_CR_OP_MODE, mode);
+}
+
+/**
+* @brief  读取选项字节寄存器1
+* @retval uint32_t 选项字节1加载值
+*/
+__STATIC_INLINE uint32_t std_flash_get_opt1(void)
+{
+    return (FLASH->OPTR1);
+}
+
+/**
+* @brief  读取FLASH读保护等级
+* @retval uint32_t FLASH读保护等级
+*             @arg FLASH_RDP_LEVEL_0
+*             @arg FLASH_RDP_LEVEL_1
+*/
+__STATIC_INLINE uint32_t std_flash_get_rdp_level(void)
+{
+    return (FLASH->OPTR1 & FLASH_OPTR1_RDPRP);
+}
+
+/**
+* @brief  读取BOR阈值等级
+* @retval uint32_t FLASH读保护等级
+*             @arg FLASH_BOR_LEVEL_0
+*             @arg ...
+*             @arg FLASH_BOR_LEVEL_3
+*/
+__STATIC_INLINE uint32_t std_flash_get_bor_level(void)
+{
+    return (FLASH->OPTR1 & FLASH_OPTR1_BOR_LEVEL);
+}
+
+/** 
+* @brief  读取BOR使能控制
+* @retval uint32_t BOR使能控制
+*             @arg FLASH_BOR_DISABLE
+*             @arg FLASH_BOR_ENABLE
+*/
+__STATIC_INLINE uint32_t std_flash_get_bor_en(void)
+{
+    return (FLASH->OPTR1 & FLASH_OPTR1_BOR_EN);
+}
+
+/** 
+* @brief  读取NRST SWD引脚功能控制
+* @retval uint32_t NRST SWD引脚功能选择
+*             @arg FLASH_PIN_MODE_NRST_SWD
+*             @arg FLASH_PIN_MODE_GPIO_SWD
+*             @arg FLASH_PIN_MODE_SWD_GPIO
+*/
+__STATIC_INLINE uint32_t std_flash_get_nrst_swd_mode(void)
+{
+    return (FLASH->OPTR1 & FLASH_PIN_MODE_MASK);
+}
+
+/**
+* @brief  读取选项字节寄存器2
+* @retval uint32_t 选项字节2加载值
+*/
+__STATIC_INLINE uint32_t std_flash_get_opt2(void)
+{
+    return (FLASH->OPTR2);
+}
+
+/** 
+* @brief  读取IWDG在STOP模式下计数器停止控制
+* @retval uint32_t IWDG_STOP设置
+*             @arg FLASH_IWDG_STOP_MODE_STOP
+*             @arg FLASH_IWDG_STOP_MODE_NORMAL
+*/
+__STATIC_INLINE uint32_t std_flash_get_iwdg_stop(void)
+{
+    return (FLASH->OPTR2 & FLASH_OPTR2_IWDG_STOP);
+}
+
+/** 
+* @brief  读取进入STOP模式是否复位的配置
+* @retval uint32_t RST_STOP设置
+*             @arg FLASH_STOP_RESET_ENABLE
+*             @arg FLASH_STOP_RESET_DISABLE
+*/
+__STATIC_INLINE uint32_t std_flash_get_rst_stop(void)
+{
+    return (FLASH->OPTR2 & FLASH_OPTR2_RST_STOP);
+}
+
+/**
+* @brief  读取写保护区配置值
+* @retval uint32_t 写保护区配置值
+*/
+__STATIC_INLINE uint32_t std_flash_get_wrp(void)
+{
+    return (FLASH->WRP & FLASH_WRP_WRP);
+}
+
+/** 
+* @brief  读取芯片型号
+* @retval uint32_t 芯片型号
+*/
+__STATIC_INLINE uint32_t std_flash_get_device_type(void)
+{
+    return (*(uint32_t *)DEVICE_TYPE);
+}
+
+/** 
+* @brief  读取Flash空间大小
+* @retval uint32_t Flash空间大小
+*/
+__STATIC_INLINE uint32_t std_flash_get_flash_size(void)
+{
+    return (*(uint32_t *)USERFLASH_SIZE);
+}
+
+/** 
+* @brief  读取SRAM空间大小
+* @retval uint32_t SRAM空间大小
+*/
+__STATIC_INLINE uint32_t std_flash_get_sram_size(void)
+{
+    return (*(uint32_t *)SRAM_SIZE);
+}
+
+
+std_status_t std_flash_erase(uint32_t mode, uint32_t address);
+std_status_t std_flash_word_program(uint32_t address, uint32_t prog_data);
+
+/** 
+* @} 
+*/
+
+#ifdef __cplusplus
+}
+#endif
+
+/**
+* @} 
+*/  
+
+/**
+* @}
+*/
+
+#endif /* CIU32F003_STD_FLASH_H */
+
+

+ 454 - 0
CIU32F003_LIB/Include/ciu32f003_std_flash.h

@@ -0,0 +1,454 @@
+/************************************************************************************************/
+/**
+* @file               ciu32f003_std_flash.h
+* @author             MCU Ecosystem Development Team
+* @brief              FLASH STD库驱动头文件。
+*                     提供FLASH相关的STD库操作函数声明、数据类型以及常量的定义。                         
+*
+*
+**************************************************************************************************
+* @attention
+* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
+*
+**************************************************************************************************
+*/
+
+/*避免头文件重复引用*/
+#ifndef CIU32F003_STD_FLASH_H
+#define CIU32F003_STD_FLASH_H
+
+/************************************************************************************************/
+/** 
+* @addtogroup CIU32F003_STD_Driver
+* @{
+*/
+
+/**
+* @defgroup FLASH FLASH
+* @brief FLASH存储器的STD库驱动
+* @{
+*/
+/************************************************************************************************/
+
+
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/*------------------------------------------includes--------------------------------------------*/
+#include "ciu32f003_std_common.h"
+
+/*-------------------------------------------define---------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @defgroup FLASH_Constants FLASH Constants 
+* @brief  FLASH常量定义及宏定义
+* @{
+*
+*/
+/************************************************************************************************/
+
+/* Flash读取访问等待周期 */      
+#define FLASH_LATENCY_0CLK                FLASH_ACR_LATENCY_0CLK                     /**< 等待周期:0 HCLK         */
+#define FLASH_LATENCY_1CLK                FLASH_ACR_LATENCY_1CLK                     /**< 等待周期:1 HCLK         */ 
+
+/* Flash控制寄存器解锁密钥 */                                                        
+#define FLASH_CR_KEY1                     (0xE57A1A85U)                              /**< Flash控制寄存器解锁密钥1 */
+#define FLASH_CR_KEY2                     (0x7C6E8391U)                              /**< Flash控制寄存器解锁密钥2 */
+
+/* Flash选项字节解锁密钥 */                                                          
+#define FLASH_OPT_KEY1                    (0x6A894D7BU)                              /**< Flash选项字节解锁密钥1   */
+#define FLASH_OPT_KEY2                    (0x7C311F5AU)                              /**< Flash选项字节解锁密钥2   */
+
+/* Flash操作状态 */                                                                  
+#define FLASH_FLAG_EOP                    FLASH_SR_EOP                               /**< Flash操作完成标志              */
+#define FLASH_FLAG_BSY                    FLASH_SR_BSY                               /**< Flash操作状态标志              */
+#define FLASH_FLAG_OPTVERR                FLASH_SR_OPTVERR                           /**< Flash option bytes校验错误标志 */
+#define FLASH_FLAG_WRPERR                 FLASH_SR_WRPERR                            /**< Flash写保护错误标志            */
+
+/* Flash中断源 */                      
+#define FLASH_INTERRUPT_OPERR             FLASH_CR_OPERRIE                           /**< Flash操作异常中断        */
+#define FLASH_INTERRUPT_EOP               FLASH_CR_EOPIE                             /**< Flash操作完成中断        */
+
+/* Flash操作模式 */                                                                  
+#define FLASH_MODE_IDLE                   FLASH_CR_OP_MODE_IDLE                      /**< Flash退出擦除编程模式    */
+#define FLASH_MODE_PAGE_ERASE             FLASH_CR_OP_MODE_PAGE_ERASE                /**< Flash页擦除模式          */
+#define FLASH_MODE_MASS_ERASE             FLASH_CR_OP_MODE_MASS_ERASE                /**< Flash批量擦除模式        */
+#define FLASH_MODE_PROGRAM                FLASH_CR_OP_MODE_PROGRAM                   /**< Flash编程模式            */
+
+/* 选项字节1 位域使能 */
+#define FLASH_PIN_MODE_MASK               FLASH_OPTR1_NRST_SWD_MODE_MASK             /**< NRST SWD引脚功能选择    */
+#define FLASH_PIN_MODE_NRST_SWD           FLASH_OPTR1_NRST_SWD_MODE_0                /**< PC0: NRST  PB6: SWDIO   */
+#define FLASH_PIN_MODE_GPIO_SWD           FLASH_OPTR1_NRST_SWD_MODE_2                /**< PC0: GPIO  PB6: SWDIO   */
+#define FLASH_PIN_MODE_SWD_GPIO           FLASH_OPTR1_NRST_SWD_MODE_3                /**< PC0: SWDIO PB6: GPIO    */
+
+#define FLASH_BOR_DISABLE                 (0x00000000U)                              /**< BOR禁止                             */
+#define FLASH_BOR_ENABLE                  FLASH_OPTR1_BOR_EN                         /**< BOR使能                             */
+
+#define FLASH_BOR_LEVEL_0                 FLASH_OPTR1_BOR_LEVEL_0                    /**< BOR检测电压上升/下降阈值:2.0/1.9V  */
+#define FLASH_BOR_LEVEL_1                 FLASH_OPTR1_BOR_LEVEL_1                    /**< BOR检测电压上升/下降阈值:2.4/2.3V  */
+#define FLASH_BOR_LEVEL_2                 FLASH_OPTR1_BOR_LEVEL_2                    /**< BOR检测电压上升/下降阈值:2.8/2.7V  */
+#define FLASH_BOR_LEVEL_3                 FLASH_OPTR1_BOR_LEVEL_3                    /**< BOR检测电压上升/下降阈值:3.2/3.1V  */
+
+#define FLASH_RDP_LEVEL_MASK              FLASH_OPTR1_RDPRP_MASK                     /**< RDP配置域       */
+#define FLASH_RDP_LEVEL_0                 (0x00000000U)                              /**< RDP保护等级0    */
+#define FLASH_RDP_LEVEL_1                 (0x00000001U)                              /**< RDP保护等级1    */
+
+/* 选项字节2 位域使能 */
+#define FLASH_IWDG_STOP_MODE_STOP         (0x00000000U)                              /**< IWDG在Stop模式下停止计数                       */
+#define FLASH_IWDG_STOP_MODE_NORMAL       FLASH_OPTR2_IWDG_STOP                      /**< IWDG在Stop模式下正常计数                       */
+
+#define FLASH_STOP_RESET_ENABLE           (0x00000000U)                              /**< 执行进入Stop模式操作,不进入Stop,产生复位     */
+#define FLASH_STOP_RESET_DISABLE          FLASH_OPTR2_RST_STOP                       /**< 执行进入Stop模式操作,正常进入Stop,不产生复位 */
+
+/* 写保护区域配置 */
+#define FLASH_WRP_AREA_0                  (0x0000003EU)                              /**< 写保护区域:0x00000000U ~ 0x00000FFF */
+#define FLASH_WRP_AREA_1                  (0x0000003DU)                              /**< 写保护区域:0x00001000U ~ 0x00001FFF */
+#define FLASH_WRP_AREA_2                  (0x0000003BU)                              /**< 写保护区域:0x00002000U ~ 0x00002FFF */
+#define FLASH_WRP_AREA_3                  (0x00000037U)                              /**< 写保护区域:0x00003000U ~ 0x00003FFF */
+#define FLASH_WRP_AREA_4                  (0x0000002FU)                              /**< 写保护区域:0x00004000U ~ 0x00004FFF */
+#define FLASH_WRP_AREA_5                  (0x0000001FU)                              /**< 写保护区域:0x00005000U ~ 0x00005FFF */
+#define FLASH_WRP_AREA_ALL                (0x00000000U)                              /**< User flash区域全部写保护             */
+#define FLASH_WRP_AREA_NONE               (0x0000003FU)                              /**< User flash区域写保护关闭             */
+
+
+/**
+* @brief  计算Option Bytes区编程值
+* @param  VAL OB区低16位预期编程值 
+* @retval OB高16位取反后与低16位相加的值
+*/
+#define FLASH_OB_DATA_CALCULATE(VAL)      ((uint32_t)(((VAL) & 0xFFFF) | ((~(VAL & 0xFFFF)) << 16)))
+
+/**
+* @} 
+*/
+
+/*-------------------------------------------functions------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @defgroup FLASH_External_Functions FLASH External Functions
+* @brief    FLASH对外函数
+* @{
+*
+*/
+/************************************************************************************************/
+
+/** 
+* @brief  Flash控制寄存器解锁
+* @note   FLASH控制器解锁后操作CRKEY寄存器会产生总线错误并锁定写保护,直至下次复位
+* @retval 无
+*/
+__STATIC_INLINE void std_flash_unlock(void)
+{
+    if ((FLASH->CR & FLASH_CR_LOCK) == FLASH_CR_LOCK)
+    {
+        FLASH->CRKEY = FLASH_CR_KEY1;
+        FLASH->CRKEY = FLASH_CR_KEY2; 
+    }
+}
+
+/** 
+* @brief  Flash控制寄存器锁定
+* @retval 无
+*/
+__STATIC_INLINE void std_flash_lock(void)
+{
+    FLASH->CR |= FLASH_CR_LOCK;
+}
+
+/** 
+* @brief  读取Flash锁定状态
+* @retval uint32_t Flash锁定状态
+*             @arg 非0: 锁定
+*             @arg 0:   未锁定
+*/
+__STATIC_INLINE uint32_t std_flash_get_lock_status(void)
+{
+    return (FLASH->CR & FLASH_CR_LOCK);
+}
+
+/** 
+* @brief  Flash选项字节解锁
+* @note   FLASH 选项字节解锁后操作OPTKEY寄存器会产生总线错误并锁定写保护,直至下次复位
+* @retval 无
+*/
+__STATIC_INLINE void std_flash_opt_unlock(void)
+{
+    if ((FLASH->CR & FLASH_CR_OPTLOCK) == FLASH_CR_OPTLOCK)
+    {
+        FLASH->OPTKEY = FLASH_OPT_KEY1;
+        FLASH->OPTKEY = FLASH_OPT_KEY2; 
+    }
+}
+
+/** 
+* @brief  Flash选项字节锁定
+* @retval 无
+*/
+__STATIC_INLINE void std_flash_opt_lock(void)
+{
+    FLASH->CR |= FLASH_CR_OPTLOCK;
+}
+
+/** 
+* @brief  读取Flash选项字节锁定状态
+* @retval uint32_t Flash选项字节锁定状态
+*             @arg 非0: 锁定
+*             @arg 0:   未锁定
+*/
+__STATIC_INLINE uint32_t std_flash_get_opt_lock_status(void)
+{
+    return (FLASH->CR & FLASH_CR_OPTLOCK);
+}
+
+/**
+* @brief  设置FLASH读取访问等待周期
+* @param  latency 读取访问等待周期
+*             @arg  FLASH_LATENCY_0CLK
+*             @arg  FLASH_LATENCY_1CLK
+* @retval 无
+*/
+__STATIC_INLINE void std_flash_set_latency(uint32_t latency)
+{
+    MODIFY_REG(FLASH->ACR, FLASH_ACR_LATENCY, latency);
+} 
+
+/**
+* @brief  读取FLASH读取访问等待周期
+* @retval uint32_t 读取访问等待周期
+*             @arg  FLASH_LATENCY_0CLK
+*             @arg  FLASH_LATENCY_1CLK
+*/
+__STATIC_INLINE uint32_t std_flash_get_latency(void)
+{
+    return (FLASH->ACR & FLASH_ACR_LATENCY);
+} 
+
+/**
+* @brief  使能FLASH中断
+* @param  interrupts 中断源
+*             @arg FLASH_INTERRUPT_OPERR
+*             @arg FLASH_INTERRUPT_EOP 
+* @retval 无
+*/
+__STATIC_INLINE void std_flash_interrupt_enable(uint32_t interrupts)
+{
+    FLASH->CR |= interrupts;
+}
+
+/**
+* @brief  禁止FLASH中断
+* @param  interrupts 中断源
+*             @arg FLASH_INTERRUPT_OPERR
+*             @arg FLASH_INTERRUPT_EOP 
+* @retval 无
+*/
+__STATIC_INLINE void std_flash_interrupt_disable(uint32_t interrupts)
+{
+    FLASH->CR &= (~interrupts);
+}
+
+/**
+* @brief  读取FLASH中断使能状态
+* @param  interrupt 中断源
+*             @arg FLASH_INTERRUPT_OPERR
+*             @arg FLASH_INTERRUPT_EOP 
+* @retval uint32_t FLASH中断使能状态
+*             @arg 非0: 使能
+*             @arg 0:   禁止
+*/
+__STATIC_INLINE uint32_t std_flash_get_interrupt_enable(uint32_t interrupt)
+{
+    return (FLASH->CR & interrupt);
+}
+
+/**
+* @brief  读取FLASH状态标志
+* @param  flag 状态标志
+*             @arg FLASH_FLAG_EOP
+*             @arg FLASH_FLAG_BSY
+*             @arg FLASH_FLAG_OPTVERR
+*             @arg FLASH_FLAG_WRPERR
+* @retval uint32_t FLASH状态标志
+*             @arg 非0: 标志位置位
+*             @arg 0:   标志位清除
+*/
+__STATIC_INLINE uint32_t std_flash_get_flag(uint32_t flag)
+{
+    return (FLASH->SR & flag);
+}
+
+/**
+* @brief  清除FLASH状态标志
+* @param  flags 状态标志组合
+*             @arg FLASH_FLAG_EOP
+*             @arg FLASH_FLAG_WRPERR
+* @retval 无
+*/
+__STATIC_INLINE void std_flash_clear_flag(uint32_t flags)
+{
+    FLASH->SR = flags;
+}
+
+/** 
+* @brief  设置Flash操作模式
+* @param  mode 擦除模式
+*             @arg FLASH_MODE_IDLE
+*             @arg FLASH_MODE_PAGE_ERASE
+*             @arg FLASH_MODE_MASS_ERASE
+*             @arg FLASH_MODE_PROGRAM
+* @retval 无
+*/
+__STATIC_INLINE void std_flash_set_operate_mode(uint32_t mode)
+{
+    MODIFY_REG(FLASH->CR, FLASH_CR_OP_MODE, mode);
+}
+
+/**
+* @brief  读取选项字节寄存器1
+* @retval uint32_t 选项字节1加载值
+*/
+__STATIC_INLINE uint32_t std_flash_get_opt1(void)
+{
+    return (FLASH->OPTR1);
+}
+
+/**
+* @brief  读取FLASH读保护等级
+* @retval uint32_t FLASH读保护等级
+*             @arg FLASH_RDP_LEVEL_0
+*             @arg FLASH_RDP_LEVEL_1
+*/
+__STATIC_INLINE uint32_t std_flash_get_rdp_level(void)
+{
+    return (FLASH->OPTR1 & FLASH_OPTR1_RDPRP);
+}
+
+/**
+* @brief  读取BOR阈值等级
+* @retval uint32_t FLASH读保护等级
+*             @arg FLASH_BOR_LEVEL_0
+*             @arg ...
+*             @arg FLASH_BOR_LEVEL_3
+*/
+__STATIC_INLINE uint32_t std_flash_get_bor_level(void)
+{
+    return (FLASH->OPTR1 & FLASH_OPTR1_BOR_LEVEL);
+}
+
+/** 
+* @brief  读取BOR使能控制
+* @retval uint32_t BOR使能控制
+*             @arg FLASH_BOR_DISABLE
+*             @arg FLASH_BOR_ENABLE
+*/
+__STATIC_INLINE uint32_t std_flash_get_bor_en(void)
+{
+    return (FLASH->OPTR1 & FLASH_OPTR1_BOR_EN);
+}
+
+/** 
+* @brief  读取NRST SWD引脚功能控制
+* @retval uint32_t NRST SWD引脚功能选择
+*             @arg FLASH_PIN_MODE_NRST_SWD
+*             @arg FLASH_PIN_MODE_GPIO_SWD
+*             @arg FLASH_PIN_MODE_SWD_GPIO
+*/
+__STATIC_INLINE uint32_t std_flash_get_nrst_swd_mode(void)
+{
+    return (FLASH->OPTR1 & FLASH_PIN_MODE_MASK);
+}
+
+/**
+* @brief  读取选项字节寄存器2
+* @retval uint32_t 选项字节2加载值
+*/
+__STATIC_INLINE uint32_t std_flash_get_opt2(void)
+{
+    return (FLASH->OPTR2);
+}
+
+/** 
+* @brief  读取IWDG在STOP模式下计数器停止控制
+* @retval uint32_t IWDG_STOP设置
+*             @arg FLASH_IWDG_STOP_MODE_STOP
+*             @arg FLASH_IWDG_STOP_MODE_NORMAL
+*/
+__STATIC_INLINE uint32_t std_flash_get_iwdg_stop(void)
+{
+    return (FLASH->OPTR2 & FLASH_OPTR2_IWDG_STOP);
+}
+
+/** 
+* @brief  读取进入STOP模式是否复位的配置
+* @retval uint32_t RST_STOP设置
+*             @arg FLASH_STOP_RESET_ENABLE
+*             @arg FLASH_STOP_RESET_DISABLE
+*/
+__STATIC_INLINE uint32_t std_flash_get_rst_stop(void)
+{
+    return (FLASH->OPTR2 & FLASH_OPTR2_RST_STOP);
+}
+
+/**
+* @brief  读取写保护区配置值
+* @retval uint32_t 写保护区配置值
+*/
+__STATIC_INLINE uint32_t std_flash_get_wrp(void)
+{
+    return (FLASH->WRP & FLASH_WRP_WRP);
+}
+
+/** 
+* @brief  读取芯片型号
+* @retval uint32_t 芯片型号
+*/
+__STATIC_INLINE uint32_t std_flash_get_device_type(void)
+{
+    return (*(uint32_t *)DEVICE_TYPE);
+}
+
+/** 
+* @brief  读取Flash空间大小
+* @retval uint32_t Flash空间大小
+*/
+__STATIC_INLINE uint32_t std_flash_get_flash_size(void)
+{
+    return (*(uint32_t *)USERFLASH_SIZE);
+}
+
+/** 
+* @brief  读取SRAM空间大小
+* @retval uint32_t SRAM空间大小
+*/
+__STATIC_INLINE uint32_t std_flash_get_sram_size(void)
+{
+    return (*(uint32_t *)SRAM_SIZE);
+}
+
+
+std_status_t std_flash_erase(uint32_t mode, uint32_t address);
+std_status_t std_flash_word_program(uint32_t address, uint32_t prog_data);
+
+/** 
+* @} 
+*/
+
+#ifdef __cplusplus
+}
+#endif
+
+/**
+* @} 
+*/  
+
+/**
+* @}
+*/
+
+#endif /* CIU32F003_STD_FLASH_H */
+
+

+ 537 - 0
CIU32F003_LIB/Include/ciu32f003_std_gpio(1).h

@@ -0,0 +1,537 @@
+/************************************************************************************************/
+/**
+* @file               ciu32f003_std_gpio.h
+* @author             MCU Ecosystem Development Team
+* @brief              GPIO STD库驱动头文件。
+*                     提供GPIO相关的STD库操作函数声明、数据类型以及常量的定义。                         
+*                     
+*
+**************************************************************************************************
+* @attention
+* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
+*
+**************************************************************************************************
+*/
+
+/* 避免头文件重复引用 */
+#ifndef CIU32F003_STD_GPIO_H
+#define CIU32F003_STD_GPIO_H
+
+/************************************************************************************************/
+/** 
+* @addtogroup CIU32F003_STD_Driver
+* @{
+*/
+
+/**
+* @defgroup GPIO GPIO
+* @brief 通用输入/输出接口的STD库驱动
+* @{
+*/
+/************************************************************************************************/
+
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/*------------------------------------------includes--------------------------------------------*/
+#include "ciu32f003_std_common.h"
+
+/*-----------------------------------------type define------------------------------------------*/
+
+/************************************************************************************************/
+/** 
+* @defgroup GPIO_Types GPIO Types
+* @brief GPIO数据类型定义
+* @{
+*/
+/************************************************************************************************/
+/**
+* @brief  GPIO初始化结构体定义
+*/
+typedef struct
+{                         
+    uint32_t pin;                 /**< 指定GPIO引脚,可以是GPIO引脚组合 
+                                           @arg GPIO_PIN_0 ...           */
+
+    uint32_t mode;                /**< 指定GPIO引脚模式及输出类型配置 
+                                           @arg GPIO_MODE_INPUT
+                                           @arg GPIO_MODE_ANALOG
+                                           @arg GPIO_MODE_OUTPUT
+                                           @arg GPIO_MODE_ALTERNATE      */
+
+    uint32_t pull;                /**< 指定GPIO引脚上/下拉配置  
+                                           @arg GPIO_NOPULL ...          */
+
+    uint32_t output_type;         /**< 指定GPIO输出类型  
+                                           @arg GPIO_OUTPUT_PUSHPULL
+                                           @arg GPIO_OUTPUT_OPENDRAIN    */
+    
+    uint32_t alternate;           /**< 指定GPIO引脚复用功能配置   
+                                           @arg GPIO_AF0_SPI1 ...        */
+} std_gpio_init_t;
+
+/** 
+* @} 
+*/
+
+/*--------------------------------------------define--------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @defgroup GPIO_Constants GPIO Constants 
+* @brief  GPIO常量定义及宏定义
+* @{
+*
+*/
+/************************************************************************************************/
+
+/* GPIO PIN常量 */
+#define  GPIO_PIN_0                            ((uint16_t)0x0001U)        /**< 选定  PIN 0   */
+#define  GPIO_PIN_1                            ((uint16_t)0x0002U)        /**< 选定  PIN 1   */
+#define  GPIO_PIN_2                            ((uint16_t)0x0004U)        /**< 选定  PIN 2   */
+#define  GPIO_PIN_3                            ((uint16_t)0x0008U)        /**< 选定  PIN 3   */
+#define  GPIO_PIN_4                            ((uint16_t)0x0010U)        /**< 选定  PIN 4   */
+#define  GPIO_PIN_5                            ((uint16_t)0x0020U)        /**< 选定  PIN 5   */
+#define  GPIO_PIN_6                            ((uint16_t)0x0040U)        /**< 选定  PIN 6   */
+#define  GPIO_PIN_7                            ((uint16_t)0x0080U)        /**< 选定  PIN 7   */
+#define  GPIO_PIN_All                          ((uint16_t)0x00FFU)        /**< 选定  全部    */
+
+/* GPIO 模式配置常量 */
+#define  GPIO_MODE_INPUT                       (0x00000000U)              /**< 输入浮空 */
+#define  GPIO_MODE_OUTPUT                      (0x00000001U)              /**< 输出功能 */
+#define  GPIO_MODE_ALTERNATE                   (0x00000002U)              /**< 复用功能 */
+#define  GPIO_MODE_ANALOG                      (0x00000003U)              /**< 模拟功能 */
+
+/* GPIO 上下拉配置参数 */
+#define  GPIO_NOPULL                           (0x00000000U)              /**< 无上、下拉 */
+#define  GPIO_PULLUP                           (0x00000001U)              /**< 上拉       */
+#define  GPIO_PULLDOWN                         (0x00000002U)              /**< 下拉       */
+
+/* GPIO 输出类型 */
+#define  GPIO_OUTPUT_PUSHPULL                  (0x00000000U)              /**< 推挽输出 */
+#define  GPIO_OUTPUT_OPENDRAIN                 (0x00000001U)              /**< 开漏输出 */
+
+/* 复用功能0 */
+#define  GPIO_AF0_SPI1                         ((uint8_t)0x00U)           /**< SPI1   复用功能映射 */
+#define  GPIO_AF0_SWCLK                        ((uint8_t)0x00U)           /**< SWCLK  复用功能映射 */
+#define  GPIO_AF0_SWDIO                        ((uint8_t)0x00U)           /**< SWDIO  复用功能映射 */
+
+/* 复用功能1 */
+#define  GPIO_AF1_UART1                        ((uint8_t)0x01U)           /**< UART1  复用功能映射 */
+
+/* 复用功能2 */
+#define  GPIO_AF2_TIM1                         ((uint8_t)0x02U)           /**< TIM1   复用功能映射 */
+
+/* 复用功能3 */
+#define  GPIO_AF3_TIM1                         ((uint8_t)0x03U)           /**< TIM1   复用功能映射 */
+#define  GPIO_AF3_TIM3                         ((uint8_t)0x03U)           /**< TIM3   复用功能映射 */
+
+/* 复用功能4 */
+#define  GPIO_AF4_TIM1                         ((uint8_t)0x04U)           /**< TIM1   复用功能映射 */
+#define  GPIO_AF4_COMP1                        ((uint8_t)0x04U)           /**< COMP1  复用功能映射 */
+#define  GPIO_AF4_SPI1                         ((uint8_t)0x04U)           /**< SPI1   复用功能映射 */
+
+/* 复用功能5 */
+#define  GPIO_AF5_TIM1                         ((uint8_t)0x05U)           /**< TIM1   复用功能映射 */
+#define  GPIO_AF5_UART1                        ((uint8_t)0x05U)           /**< UART1  复用功能映射 */
+#define  GPIO_AF5_UART2                        ((uint8_t)0x05U)           /**< UART2  复用功能映射 */
+
+/* 复用功能6 */
+#define  GPIO_AF6_I2C1                         ((uint8_t)0x06U)           /**< I2C1   复用功能映射 */
+#define  GPIO_AF6_MCO                          ((uint8_t)0x06U)           /**< MCO    复用功能映射 */
+
+/* 复用功能7 */
+#define  GPIO_AF7_COMP2                        ((uint8_t)0x07U)           /**< COMP2  复用功能映射 */
+#define  GPIO_AF7_IR_OUT                       ((uint8_t)0x07U)           /**< IR_OUT 复用功能映射 */
+#define  GPIO_AF7_MCO                          ((uint8_t)0x07U)           /**< MCO    复用功能映射 */
+
+/* 复用功能寄存器GPIO源选择偏移位 */
+#define  GPIO_AF_SELECT_OFFSET                 (0x0000000FU)              /**< GPIO源选择偏移位 */
+
+/** 
+* @} 
+*/
+
+/*-------------------------------------------functions------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @defgroup GPIO_External_Functions GPIO External Functions
+* @brief    GPIO对外函数
+* @{
+*
+*/
+/************************************************************************************************/
+/**
+* @brief  设置GPIO引脚模式
+* @param  gpiox GPIO外设
+*             @arg GPIOA
+*             @arg GPIOB
+*             @arg GPIOC
+* @param  pin  GPIO引脚
+*             @arg GPIO_PIN_0
+*             @arg GPIO_PIN_1
+*             @arg ...
+*             @arg GPIO_PIN_7
+* @param  mode GPIO引脚模式
+*             @arg GPIO_MODE_INPUT     输入模式
+*             @arg GPIO_MODE_OUTPUT    输出模式
+*             @arg GPIO_MODE_ALTERNATE 复用模式
+*             @arg GPIO_MODE_ANALOG    模拟模式
+* @note   仅支持单个引脚
+* @retval 无
+*/
+__STATIC_INLINE void std_gpio_set_pin_mode(GPIO_t *gpiox, uint32_t pin, uint32_t mode)
+{
+    MODIFY_REG(gpiox->MODE, ((pin * pin) * GPIO_MODE_MODE0), ((pin * pin) * mode));
+}
+
+/**
+* @brief  读取GPIO引脚模式
+* @param  gpiox GPIO外设
+*             @arg GPIOA
+*             @arg GPIOB
+*             @arg GPIOC
+* @param  pin GPIO引脚
+*             @arg GPIO_PIN_0
+*             @arg GPIO_PIN_1
+*             @arg ...
+*             @arg GPIO_PIN_7
+* @note   仅支持单个引脚
+* @retval uint32_t GPIO引脚模式
+*             @arg GPIO_MODE_INPUT     输入模式
+*             @arg GPIO_MODE_OUTPUT    输出模式
+*             @arg GPIO_MODE_ALTERNATE 复用模式
+*             @arg GPIO_MODE_ANALOG    模拟模式
+*/
+__STATIC_INLINE uint32_t std_gpio_get_pin_mode(GPIO_t *gpiox, uint32_t pin)
+{
+    return ((gpiox->MODE & ((pin * pin) * GPIO_MODE_MODE0)) / (pin * pin));
+}
+
+/**
+* @brief  设置GPIO引脚输出类型
+* @param  gpiox GPIO外设
+*             @arg GPIOA
+*             @arg GPIOB
+*             @arg GPIOC
+* @param  pin_mask GPIO引脚组合
+*             @arg GPIO_PIN_0
+*             @arg GPIO_PIN_1
+*             @arg ...
+*             @arg GPIO_PIN_7
+* @param  output_type GPIO引脚输出类型
+*             @arg GPIO_OUTPUT_PUSHPULL  推挽输出
+*             @arg GPIO_OUTPUT_OPENDRAIN 开漏输出
+* @retval 无
+*/
+__STATIC_INLINE void std_gpio_set_pin_output_type(GPIO_t *gpiox, uint32_t pin_mask, uint32_t output_type)
+{
+    MODIFY_REG(gpiox->OTYPE, pin_mask, pin_mask * output_type);
+}
+
+/**
+* @brief  读取GPIO引脚输出类型
+* @param  gpiox GPIO外设
+*             @arg GPIOA
+*             @arg GPIOB
+*             @arg GPIOC
+* @param  pin  GPIO引脚
+*             @arg GPIO_PIN_0
+*             @arg GPIO_PIN_1
+*             @arg ...
+*             @arg GPIO_PIN_7
+* @note   仅支持单个引脚
+* @retval uint32_t GPIO引脚输出类型
+*             @arg GPIO_OUTPUT_PUSHPULL  推挽输出
+*             @arg GPIO_OUTPUT_OPENDRAIN 开漏输出
+*/
+__STATIC_INLINE uint32_t std_gpio_get_pin_output_type(GPIO_t *gpiox, uint32_t pin)
+{
+    return ((gpiox->OTYPE & (pin)) != 0U ? GPIO_OUTPUT_OPENDRAIN : GPIO_OUTPUT_PUSHPULL);
+}
+
+/**
+* @brief  设置GPIO引脚上下拉配置
+* @param  gpiox GPIO外设
+*             @arg GPIOA
+*             @arg GPIOB
+*             @arg GPIOC
+* @param  pin GPIO引脚
+*             @arg GPIO_PIN_0
+*             @arg GPIO_PIN_1
+*             @arg ...
+*             @arg GPIO_PIN_7
+* @param  pull GPIO引脚上下拉配置
+*             @arg GPIO_NOPULL   无上、下拉
+*             @arg GPIO_PULLUP   上拉
+*             @arg GPIO_PULLDOWN 下拉
+* @note   仅支持单个引脚
+* @retval 无
+*/
+__STATIC_INLINE void std_gpio_set_pin_pull(GPIO_t *gpiox, uint32_t pin, uint32_t pull)
+{
+    MODIFY_REG(gpiox->PUPD, ((pin * pin) * GPIO_PUPD_PUPD0), ((pin * pin) * pull));
+}
+
+/**
+* @brief  读取GPIO引脚上下拉配置
+* @param  gpiox GPIO外设
+*             @arg GPIOA
+*             @arg GPIOB
+*             @arg GPIOC
+* @param  pin  GPIO引脚
+*             @arg GPIO_PIN_0
+*             @arg GPIO_PIN_1
+*             @arg ...
+*             @arg GPIO_PIN_7
+* @note   仅支持单个引脚
+* @retval uint32_t GPIO引脚上下拉配置
+*             @arg GPIO_NOPULL   无上、下拉
+*             @arg GPIO_PULLUP   上拉
+*             @arg GPIO_PULLDOWN 下拉
+*/
+__STATIC_INLINE uint32_t std_gpio_get_pin_pull(GPIO_t *gpiox, uint32_t pin)
+{
+  return ((gpiox->PUPD & ((pin * pin) * GPIO_PUPD_PUPD0)) / (pin * pin));
+}
+
+/**
+* @brief  设置GPIO引脚(0~7)复用功能
+* @param  gpiox GPIO外设
+*             @arg GPIOA
+*             @arg GPIOB
+*             @arg GPIOC
+* @param  pin  GPIO引脚
+*             @arg GPIO_PIN_0
+*             @arg GPIO_PIN_1
+*             @arg ...
+*             @arg GPIO_PIN_7
+* @param  alternate GPIO引脚(0~7)复用功能
+*             @arg GPIO_AF0_SPI1                         
+*             @arg GPIO_AF0_SWCLK                       
+*             @arg GPIO_AF0_SWDIO             
+*             @arg GPIO_AF1_UART1                        
+*             @arg GPIO_AF2_TIM1                        
+*             @arg GPIO_AF3_TIM1                         
+*             @arg GPIO_AF3_TIM3                         
+*             @arg GPIO_AF4_TIM1                         
+*             @arg GPIO_AF4_COMP1                        
+*             @arg GPIO_AF4_SPI1                         
+*             @arg GPIO_AF5_TIM1                         
+*             @arg GPIO_AF5_UART1                        
+*             @arg GPIO_AF5_UART2                       
+*             @arg GPIO_AF6_I2C1                         
+*             @arg GPIO_AF6_MCO                          
+*             @arg GPIO_AF7_COMP2                       
+*             @arg GPIO_AF7_IR_OUT                       
+*             @arg GPIO_AF7_MCO                          
+* @note   仅支持单个引脚
+* @retval 无
+*/
+__STATIC_INLINE void std_gpio_set_afpin_0_7(GPIO_t *gpiox, uint32_t pin, uint32_t alternate)
+{
+    MODIFY_REG(gpiox->AFL, ((((pin * pin) * pin) * pin) * GPIO_AF_SELECT_OFFSET),
+               ((((pin * pin) * pin) * pin) * alternate)); 
+}
+
+/**
+* @brief  读取GPIO引脚(0~7)复用功能
+* @param  gpiox GPIO外设
+*             @arg GPIOA
+*             @arg GPIOB
+*             @arg GPIOC
+* @param  pin GPIO引脚
+*             @arg GPIO_PIN_0
+*             @arg GPIO_PIN_1
+*             @arg ...
+*             @arg GPIO_PIN_7
+* @note   仅支持单个引脚
+* @retval uint32_t GPIO引脚(0~7)复用功能
+*             @arg GPIO_AF0_SPI1                         
+*             @arg GPIO_AF0_SWCLK                       
+*             @arg GPIO_AF0_SWDIO             
+*             @arg GPIO_AF1_UART1                        
+*             @arg GPIO_AF2_TIM1                        
+*             @arg GPIO_AF3_TIM1                         
+*             @arg GPIO_AF3_TIM3                         
+*             @arg GPIO_AF4_TIM1                         
+*             @arg GPIO_AF4_COMP1                        
+*             @arg GPIO_AF4_SPI1                         
+*             @arg GPIO_AF5_TIM1                         
+*             @arg GPIO_AF5_UART1                        
+*             @arg GPIO_AF5_UART2                       
+*             @arg GPIO_AF6_I2C1                         
+*             @arg GPIO_AF6_MCO                          
+*             @arg GPIO_AF7_COMP2                       
+*             @arg GPIO_AF7_IR_OUT                       
+*             @arg GPIO_AF7_MCO  
+*/
+__STATIC_INLINE uint32_t std_gpio_get_afpin_0_7(GPIO_t *gpiox, uint32_t pin)
+{
+    return ((gpiox->AFL & ((((pin * pin) * pin) * pin) * GPIO_AF_SELECT_OFFSET)) / 
+            (((pin * pin) * pin) * pin));
+}
+
+/**
+* @brief  读取GPIO引脚输入状态
+* @param  gpiox GPIO外设
+*             @arg GPIOA
+*             @arg GPIOB
+*             @arg GPIOC
+* @param  pin  GPIO引脚
+*             @arg GPIO_PIN_0
+*             @arg GPIO_PIN_1
+*             @arg ...
+*             @arg GPIO_PIN_7
+* @note   仅支持单个引脚
+* @retval bool GPIO引脚输入状态
+*             @arg true  表示高电平
+*             @arg false 表示低电平
+*/
+__STATIC_INLINE bool std_gpio_get_input_pin(GPIO_t* gpiox, uint32_t pin)
+{
+    return ((gpiox->IDR & (pin)) == (pin));
+}
+
+/**
+* @brief  读取GPIO引脚输出状态
+* @param  gpiox GPIO外设
+*             @arg GPIOA
+*             @arg GPIOB
+*             @arg GPIOC
+* @param  pin GPIO引脚
+*             @arg GPIO_PIN_0
+*             @arg GPIO_PIN_1
+*             @arg ...
+*             @arg GPIO_PIN_7
+* @note   仅支持单个引脚
+* @retval bool GPIO引脚输出状态
+*             @arg true  表示高电平
+*             @arg false 表示低电平
+*/
+__STATIC_INLINE bool std_gpio_get_output_pin(GPIO_t* gpiox, uint32_t pin)
+{
+    return ((gpiox->ODR & (pin)) == (pin));
+}
+
+/**
+* @brief  读取GPIO端口输入数据
+* @param  gpiox GPIO外设
+*             @arg GPIOA
+*             @arg GPIOB
+*             @arg GPIOC
+* @retval uint32_t GPIO端口输入数据
+*/
+__STATIC_INLINE uint32_t std_gpio_read_input_port(GPIO_t* gpiox)
+{
+    return (gpiox->IDR);
+}
+
+/**
+* @brief  读取GPIO端口输出数据
+* @param  gpiox GPIO外设
+*             @arg GPIOA
+*             @arg GPIOB
+*             @arg GPIOC
+* @retval uint32_t GPIO端口输出数据
+*/
+__STATIC_INLINE uint32_t std_gpio_read_output_port(GPIO_t* gpiox)
+{
+    return (gpiox->ODR);
+}
+
+/**
+* @brief  写入GPIO端口输出数据
+* @param  gpiox GPIO外设
+*             @arg GPIOA
+*             @arg GPIOB
+*             @arg GPIOC
+* @param  value 输出数据
+* @retval 无
+*/
+__STATIC_INLINE void std_gpio_write_output_port(GPIO_t* gpiox, uint32_t value)
+{
+    gpiox->ODR = value;
+}
+
+/**
+* @brief  设置GPIO输出高电平
+* @param  gpiox GPIO外设
+*             @arg GPIOA
+*             @arg GPIOB
+*             @arg GPIOC
+* @param  pin_mask GPIO引脚组合
+*             @arg GPIO_PIN_0
+*             @arg GPIO_PIN_1
+*             @arg ...
+*             @arg GPIO_PIN_7
+* @retval 无
+*/
+__STATIC_INLINE void std_gpio_set_pin(GPIO_t* gpiox, uint32_t pin_mask)
+{
+    gpiox->BSR = pin_mask;
+}
+
+/**
+* @brief  设置GPIO输出低电平
+* @param  gpiox GPIO外设
+*             @arg GPIOA
+*             @arg GPIOB
+*             @arg GPIOC
+* @param  pin_mask  GPIO引脚组合
+*             @arg GPIO_PIN_0
+*             @arg GPIO_PIN_1
+*             @arg ...
+*             @arg GPIO_PIN_7
+* @retval 无
+*/
+__STATIC_INLINE void std_gpio_reset_pin(GPIO_t* gpiox, uint32_t pin_mask)
+{
+    gpiox->BR = pin_mask;
+}
+
+/**
+* @brief  切换GPIO端口高/低电平
+* @param  gpiox GPIO外设
+*             @arg GPIOA
+*             @arg GPIOB
+*             @arg GPIOC
+* @param  pin_mask  GPIO引脚组合
+*             @arg GPIO_PIN_0
+*             @arg GPIO_PIN_1
+*             @arg ...
+*             @arg GPIO_PIN_7
+* @retval 无
+*/
+__STATIC_INLINE void std_gpio_toggle_pin(GPIO_t* gpiox, uint32_t pin_mask)
+{
+    gpiox->ODR ^= pin_mask;
+}
+
+void std_gpio_init(GPIO_t* gpiox, std_gpio_init_t* gpio_init_param);
+void std_gpio_deinit(GPIO_t* gpiox);
+void std_gpio_struct_init(std_gpio_init_t* gpio_init_struct);
+
+/** 
+* @} 
+*/
+
+
+#ifdef __cplusplus
+}
+#endif
+
+/**
+* @} 
+*/  
+
+/**
+* @}
+*/
+
+#endif /* CIU32F003_STD_GPIO_H */
+
+

+ 537 - 0
CIU32F003_LIB/Include/ciu32f003_std_gpio(2).h

@@ -0,0 +1,537 @@
+/************************************************************************************************/
+/**
+* @file               ciu32f003_std_gpio.h
+* @author             MCU Ecosystem Development Team
+* @brief              GPIO STD库驱动头文件。
+*                     提供GPIO相关的STD库操作函数声明、数据类型以及常量的定义。                         
+*                     
+*
+**************************************************************************************************
+* @attention
+* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
+*
+**************************************************************************************************
+*/
+
+/* 避免头文件重复引用 */
+#ifndef CIU32F003_STD_GPIO_H
+#define CIU32F003_STD_GPIO_H
+
+/************************************************************************************************/
+/** 
+* @addtogroup CIU32F003_STD_Driver
+* @{
+*/
+
+/**
+* @defgroup GPIO GPIO
+* @brief 通用输入/输出接口的STD库驱动
+* @{
+*/
+/************************************************************************************************/
+
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/*------------------------------------------includes--------------------------------------------*/
+#include "ciu32f003_std_common.h"
+
+/*-----------------------------------------type define------------------------------------------*/
+
+/************************************************************************************************/
+/** 
+* @defgroup GPIO_Types GPIO Types
+* @brief GPIO数据类型定义
+* @{
+*/
+/************************************************************************************************/
+/**
+* @brief  GPIO初始化结构体定义
+*/
+typedef struct
+{                         
+    uint32_t pin;                 /**< 指定GPIO引脚,可以是GPIO引脚组合 
+                                           @arg GPIO_PIN_0 ...           */
+
+    uint32_t mode;                /**< 指定GPIO引脚模式及输出类型配置 
+                                           @arg GPIO_MODE_INPUT
+                                           @arg GPIO_MODE_ANALOG
+                                           @arg GPIO_MODE_OUTPUT
+                                           @arg GPIO_MODE_ALTERNATE      */
+
+    uint32_t pull;                /**< 指定GPIO引脚上/下拉配置  
+                                           @arg GPIO_NOPULL ...          */
+
+    uint32_t output_type;         /**< 指定GPIO输出类型  
+                                           @arg GPIO_OUTPUT_PUSHPULL
+                                           @arg GPIO_OUTPUT_OPENDRAIN    */
+    
+    uint32_t alternate;           /**< 指定GPIO引脚复用功能配置   
+                                           @arg GPIO_AF0_SPI1 ...        */
+} std_gpio_init_t;
+
+/** 
+* @} 
+*/
+
+/*--------------------------------------------define--------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @defgroup GPIO_Constants GPIO Constants 
+* @brief  GPIO常量定义及宏定义
+* @{
+*
+*/
+/************************************************************************************************/
+
+/* GPIO PIN常量 */
+#define  GPIO_PIN_0                            ((uint16_t)0x0001U)        /**< 选定  PIN 0   */
+#define  GPIO_PIN_1                            ((uint16_t)0x0002U)        /**< 选定  PIN 1   */
+#define  GPIO_PIN_2                            ((uint16_t)0x0004U)        /**< 选定  PIN 2   */
+#define  GPIO_PIN_3                            ((uint16_t)0x0008U)        /**< 选定  PIN 3   */
+#define  GPIO_PIN_4                            ((uint16_t)0x0010U)        /**< 选定  PIN 4   */
+#define  GPIO_PIN_5                            ((uint16_t)0x0020U)        /**< 选定  PIN 5   */
+#define  GPIO_PIN_6                            ((uint16_t)0x0040U)        /**< 选定  PIN 6   */
+#define  GPIO_PIN_7                            ((uint16_t)0x0080U)        /**< 选定  PIN 7   */
+#define  GPIO_PIN_All                          ((uint16_t)0x00FFU)        /**< 选定  全部    */
+
+/* GPIO 模式配置常量 */
+#define  GPIO_MODE_INPUT                       (0x00000000U)              /**< 输入浮空 */
+#define  GPIO_MODE_OUTPUT                      (0x00000001U)              /**< 输出功能 */
+#define  GPIO_MODE_ALTERNATE                   (0x00000002U)              /**< 复用功能 */
+#define  GPIO_MODE_ANALOG                      (0x00000003U)              /**< 模拟功能 */
+
+/* GPIO 上下拉配置参数 */
+#define  GPIO_NOPULL                           (0x00000000U)              /**< 无上、下拉 */
+#define  GPIO_PULLUP                           (0x00000001U)              /**< 上拉       */
+#define  GPIO_PULLDOWN                         (0x00000002U)              /**< 下拉       */
+
+/* GPIO 输出类型 */
+#define  GPIO_OUTPUT_PUSHPULL                  (0x00000000U)              /**< 推挽输出 */
+#define  GPIO_OUTPUT_OPENDRAIN                 (0x00000001U)              /**< 开漏输出 */
+
+/* 复用功能0 */
+#define  GPIO_AF0_SPI1                         ((uint8_t)0x00U)           /**< SPI1   复用功能映射 */
+#define  GPIO_AF0_SWCLK                        ((uint8_t)0x00U)           /**< SWCLK  复用功能映射 */
+#define  GPIO_AF0_SWDIO                        ((uint8_t)0x00U)           /**< SWDIO  复用功能映射 */
+
+/* 复用功能1 */
+#define  GPIO_AF1_UART1                        ((uint8_t)0x01U)           /**< UART1  复用功能映射 */
+
+/* 复用功能2 */
+#define  GPIO_AF2_TIM1                         ((uint8_t)0x02U)           /**< TIM1   复用功能映射 */
+
+/* 复用功能3 */
+#define  GPIO_AF3_TIM1                         ((uint8_t)0x03U)           /**< TIM1   复用功能映射 */
+#define  GPIO_AF3_TIM3                         ((uint8_t)0x03U)           /**< TIM3   复用功能映射 */
+
+/* 复用功能4 */
+#define  GPIO_AF4_TIM1                         ((uint8_t)0x04U)           /**< TIM1   复用功能映射 */
+#define  GPIO_AF4_COMP1                        ((uint8_t)0x04U)           /**< COMP1  复用功能映射 */
+#define  GPIO_AF4_SPI1                         ((uint8_t)0x04U)           /**< SPI1   复用功能映射 */
+
+/* 复用功能5 */
+#define  GPIO_AF5_TIM1                         ((uint8_t)0x05U)           /**< TIM1   复用功能映射 */
+#define  GPIO_AF5_UART1                        ((uint8_t)0x05U)           /**< UART1  复用功能映射 */
+#define  GPIO_AF5_UART2                        ((uint8_t)0x05U)           /**< UART2  复用功能映射 */
+
+/* 复用功能6 */
+#define  GPIO_AF6_I2C1                         ((uint8_t)0x06U)           /**< I2C1   复用功能映射 */
+#define  GPIO_AF6_MCO                          ((uint8_t)0x06U)           /**< MCO    复用功能映射 */
+
+/* 复用功能7 */
+#define  GPIO_AF7_COMP2                        ((uint8_t)0x07U)           /**< COMP2  复用功能映射 */
+#define  GPIO_AF7_IR_OUT                       ((uint8_t)0x07U)           /**< IR_OUT 复用功能映射 */
+#define  GPIO_AF7_MCO                          ((uint8_t)0x07U)           /**< MCO    复用功能映射 */
+
+/* 复用功能寄存器GPIO源选择偏移位 */
+#define  GPIO_AF_SELECT_OFFSET                 (0x0000000FU)              /**< GPIO源选择偏移位 */
+
+/** 
+* @} 
+*/
+
+/*-------------------------------------------functions------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @defgroup GPIO_External_Functions GPIO External Functions
+* @brief    GPIO对外函数
+* @{
+*
+*/
+/************************************************************************************************/
+/**
+* @brief  设置GPIO引脚模式
+* @param  gpiox GPIO外设
+*             @arg GPIOA
+*             @arg GPIOB
+*             @arg GPIOC
+* @param  pin  GPIO引脚
+*             @arg GPIO_PIN_0
+*             @arg GPIO_PIN_1
+*             @arg ...
+*             @arg GPIO_PIN_7
+* @param  mode GPIO引脚模式
+*             @arg GPIO_MODE_INPUT     输入模式
+*             @arg GPIO_MODE_OUTPUT    输出模式
+*             @arg GPIO_MODE_ALTERNATE 复用模式
+*             @arg GPIO_MODE_ANALOG    模拟模式
+* @note   仅支持单个引脚
+* @retval 无
+*/
+__STATIC_INLINE void std_gpio_set_pin_mode(GPIO_t *gpiox, uint32_t pin, uint32_t mode)
+{
+    MODIFY_REG(gpiox->MODE, ((pin * pin) * GPIO_MODE_MODE0), ((pin * pin) * mode));
+}
+
+/**
+* @brief  读取GPIO引脚模式
+* @param  gpiox GPIO外设
+*             @arg GPIOA
+*             @arg GPIOB
+*             @arg GPIOC
+* @param  pin GPIO引脚
+*             @arg GPIO_PIN_0
+*             @arg GPIO_PIN_1
+*             @arg ...
+*             @arg GPIO_PIN_7
+* @note   仅支持单个引脚
+* @retval uint32_t GPIO引脚模式
+*             @arg GPIO_MODE_INPUT     输入模式
+*             @arg GPIO_MODE_OUTPUT    输出模式
+*             @arg GPIO_MODE_ALTERNATE 复用模式
+*             @arg GPIO_MODE_ANALOG    模拟模式
+*/
+__STATIC_INLINE uint32_t std_gpio_get_pin_mode(GPIO_t *gpiox, uint32_t pin)
+{
+    return ((gpiox->MODE & ((pin * pin) * GPIO_MODE_MODE0)) / (pin * pin));
+}
+
+/**
+* @brief  设置GPIO引脚输出类型
+* @param  gpiox GPIO外设
+*             @arg GPIOA
+*             @arg GPIOB
+*             @arg GPIOC
+* @param  pin_mask GPIO引脚组合
+*             @arg GPIO_PIN_0
+*             @arg GPIO_PIN_1
+*             @arg ...
+*             @arg GPIO_PIN_7
+* @param  output_type GPIO引脚输出类型
+*             @arg GPIO_OUTPUT_PUSHPULL  推挽输出
+*             @arg GPIO_OUTPUT_OPENDRAIN 开漏输出
+* @retval 无
+*/
+__STATIC_INLINE void std_gpio_set_pin_output_type(GPIO_t *gpiox, uint32_t pin_mask, uint32_t output_type)
+{
+    MODIFY_REG(gpiox->OTYPE, pin_mask, pin_mask * output_type);
+}
+
+/**
+* @brief  读取GPIO引脚输出类型
+* @param  gpiox GPIO外设
+*             @arg GPIOA
+*             @arg GPIOB
+*             @arg GPIOC
+* @param  pin  GPIO引脚
+*             @arg GPIO_PIN_0
+*             @arg GPIO_PIN_1
+*             @arg ...
+*             @arg GPIO_PIN_7
+* @note   仅支持单个引脚
+* @retval uint32_t GPIO引脚输出类型
+*             @arg GPIO_OUTPUT_PUSHPULL  推挽输出
+*             @arg GPIO_OUTPUT_OPENDRAIN 开漏输出
+*/
+__STATIC_INLINE uint32_t std_gpio_get_pin_output_type(GPIO_t *gpiox, uint32_t pin)
+{
+    return ((gpiox->OTYPE & (pin)) != 0U ? GPIO_OUTPUT_OPENDRAIN : GPIO_OUTPUT_PUSHPULL);
+}
+
+/**
+* @brief  设置GPIO引脚上下拉配置
+* @param  gpiox GPIO外设
+*             @arg GPIOA
+*             @arg GPIOB
+*             @arg GPIOC
+* @param  pin GPIO引脚
+*             @arg GPIO_PIN_0
+*             @arg GPIO_PIN_1
+*             @arg ...
+*             @arg GPIO_PIN_7
+* @param  pull GPIO引脚上下拉配置
+*             @arg GPIO_NOPULL   无上、下拉
+*             @arg GPIO_PULLUP   上拉
+*             @arg GPIO_PULLDOWN 下拉
+* @note   仅支持单个引脚
+* @retval 无
+*/
+__STATIC_INLINE void std_gpio_set_pin_pull(GPIO_t *gpiox, uint32_t pin, uint32_t pull)
+{
+    MODIFY_REG(gpiox->PUPD, ((pin * pin) * GPIO_PUPD_PUPD0), ((pin * pin) * pull));
+}
+
+/**
+* @brief  读取GPIO引脚上下拉配置
+* @param  gpiox GPIO外设
+*             @arg GPIOA
+*             @arg GPIOB
+*             @arg GPIOC
+* @param  pin  GPIO引脚
+*             @arg GPIO_PIN_0
+*             @arg GPIO_PIN_1
+*             @arg ...
+*             @arg GPIO_PIN_7
+* @note   仅支持单个引脚
+* @retval uint32_t GPIO引脚上下拉配置
+*             @arg GPIO_NOPULL   无上、下拉
+*             @arg GPIO_PULLUP   上拉
+*             @arg GPIO_PULLDOWN 下拉
+*/
+__STATIC_INLINE uint32_t std_gpio_get_pin_pull(GPIO_t *gpiox, uint32_t pin)
+{
+  return ((gpiox->PUPD & ((pin * pin) * GPIO_PUPD_PUPD0)) / (pin * pin));
+}
+
+/**
+* @brief  设置GPIO引脚(0~7)复用功能
+* @param  gpiox GPIO外设
+*             @arg GPIOA
+*             @arg GPIOB
+*             @arg GPIOC
+* @param  pin  GPIO引脚
+*             @arg GPIO_PIN_0
+*             @arg GPIO_PIN_1
+*             @arg ...
+*             @arg GPIO_PIN_7
+* @param  alternate GPIO引脚(0~7)复用功能
+*             @arg GPIO_AF0_SPI1                         
+*             @arg GPIO_AF0_SWCLK                       
+*             @arg GPIO_AF0_SWDIO             
+*             @arg GPIO_AF1_UART1                        
+*             @arg GPIO_AF2_TIM1                        
+*             @arg GPIO_AF3_TIM1                         
+*             @arg GPIO_AF3_TIM3                         
+*             @arg GPIO_AF4_TIM1                         
+*             @arg GPIO_AF4_COMP1                        
+*             @arg GPIO_AF4_SPI1                         
+*             @arg GPIO_AF5_TIM1                         
+*             @arg GPIO_AF5_UART1                        
+*             @arg GPIO_AF5_UART2                       
+*             @arg GPIO_AF6_I2C1                         
+*             @arg GPIO_AF6_MCO                          
+*             @arg GPIO_AF7_COMP2                       
+*             @arg GPIO_AF7_IR_OUT                       
+*             @arg GPIO_AF7_MCO                          
+* @note   仅支持单个引脚
+* @retval 无
+*/
+__STATIC_INLINE void std_gpio_set_afpin_0_7(GPIO_t *gpiox, uint32_t pin, uint32_t alternate)
+{
+    MODIFY_REG(gpiox->AFL, ((((pin * pin) * pin) * pin) * GPIO_AF_SELECT_OFFSET),
+               ((((pin * pin) * pin) * pin) * alternate)); 
+}
+
+/**
+* @brief  读取GPIO引脚(0~7)复用功能
+* @param  gpiox GPIO外设
+*             @arg GPIOA
+*             @arg GPIOB
+*             @arg GPIOC
+* @param  pin GPIO引脚
+*             @arg GPIO_PIN_0
+*             @arg GPIO_PIN_1
+*             @arg ...
+*             @arg GPIO_PIN_7
+* @note   仅支持单个引脚
+* @retval uint32_t GPIO引脚(0~7)复用功能
+*             @arg GPIO_AF0_SPI1                         
+*             @arg GPIO_AF0_SWCLK                       
+*             @arg GPIO_AF0_SWDIO             
+*             @arg GPIO_AF1_UART1                        
+*             @arg GPIO_AF2_TIM1                        
+*             @arg GPIO_AF3_TIM1                         
+*             @arg GPIO_AF3_TIM3                         
+*             @arg GPIO_AF4_TIM1                         
+*             @arg GPIO_AF4_COMP1                        
+*             @arg GPIO_AF4_SPI1                         
+*             @arg GPIO_AF5_TIM1                         
+*             @arg GPIO_AF5_UART1                        
+*             @arg GPIO_AF5_UART2                       
+*             @arg GPIO_AF6_I2C1                         
+*             @arg GPIO_AF6_MCO                          
+*             @arg GPIO_AF7_COMP2                       
+*             @arg GPIO_AF7_IR_OUT                       
+*             @arg GPIO_AF7_MCO  
+*/
+__STATIC_INLINE uint32_t std_gpio_get_afpin_0_7(GPIO_t *gpiox, uint32_t pin)
+{
+    return ((gpiox->AFL & ((((pin * pin) * pin) * pin) * GPIO_AF_SELECT_OFFSET)) / 
+            (((pin * pin) * pin) * pin));
+}
+
+/**
+* @brief  读取GPIO引脚输入状态
+* @param  gpiox GPIO外设
+*             @arg GPIOA
+*             @arg GPIOB
+*             @arg GPIOC
+* @param  pin  GPIO引脚
+*             @arg GPIO_PIN_0
+*             @arg GPIO_PIN_1
+*             @arg ...
+*             @arg GPIO_PIN_7
+* @note   仅支持单个引脚
+* @retval bool GPIO引脚输入状态
+*             @arg true  表示高电平
+*             @arg false 表示低电平
+*/
+__STATIC_INLINE bool std_gpio_get_input_pin(GPIO_t* gpiox, uint32_t pin)
+{
+    return ((gpiox->IDR & (pin)) == (pin));
+}
+
+/**
+* @brief  读取GPIO引脚输出状态
+* @param  gpiox GPIO外设
+*             @arg GPIOA
+*             @arg GPIOB
+*             @arg GPIOC
+* @param  pin GPIO引脚
+*             @arg GPIO_PIN_0
+*             @arg GPIO_PIN_1
+*             @arg ...
+*             @arg GPIO_PIN_7
+* @note   仅支持单个引脚
+* @retval bool GPIO引脚输出状态
+*             @arg true  表示高电平
+*             @arg false 表示低电平
+*/
+__STATIC_INLINE bool std_gpio_get_output_pin(GPIO_t* gpiox, uint32_t pin)
+{
+    return ((gpiox->ODR & (pin)) == (pin));
+}
+
+/**
+* @brief  读取GPIO端口输入数据
+* @param  gpiox GPIO外设
+*             @arg GPIOA
+*             @arg GPIOB
+*             @arg GPIOC
+* @retval uint32_t GPIO端口输入数据
+*/
+__STATIC_INLINE uint32_t std_gpio_read_input_port(GPIO_t* gpiox)
+{
+    return (gpiox->IDR);
+}
+
+/**
+* @brief  读取GPIO端口输出数据
+* @param  gpiox GPIO外设
+*             @arg GPIOA
+*             @arg GPIOB
+*             @arg GPIOC
+* @retval uint32_t GPIO端口输出数据
+*/
+__STATIC_INLINE uint32_t std_gpio_read_output_port(GPIO_t* gpiox)
+{
+    return (gpiox->ODR);
+}
+
+/**
+* @brief  写入GPIO端口输出数据
+* @param  gpiox GPIO外设
+*             @arg GPIOA
+*             @arg GPIOB
+*             @arg GPIOC
+* @param  value 输出数据
+* @retval 无
+*/
+__STATIC_INLINE void std_gpio_write_output_port(GPIO_t* gpiox, uint32_t value)
+{
+    gpiox->ODR = value;
+}
+
+/**
+* @brief  设置GPIO输出高电平
+* @param  gpiox GPIO外设
+*             @arg GPIOA
+*             @arg GPIOB
+*             @arg GPIOC
+* @param  pin_mask GPIO引脚组合
+*             @arg GPIO_PIN_0
+*             @arg GPIO_PIN_1
+*             @arg ...
+*             @arg GPIO_PIN_7
+* @retval 无
+*/
+__STATIC_INLINE void std_gpio_set_pin(GPIO_t* gpiox, uint32_t pin_mask)
+{
+    gpiox->BSR = pin_mask;
+}
+
+/**
+* @brief  设置GPIO输出低电平
+* @param  gpiox GPIO外设
+*             @arg GPIOA
+*             @arg GPIOB
+*             @arg GPIOC
+* @param  pin_mask  GPIO引脚组合
+*             @arg GPIO_PIN_0
+*             @arg GPIO_PIN_1
+*             @arg ...
+*             @arg GPIO_PIN_7
+* @retval 无
+*/
+__STATIC_INLINE void std_gpio_reset_pin(GPIO_t* gpiox, uint32_t pin_mask)
+{
+    gpiox->BR = pin_mask;
+}
+
+/**
+* @brief  切换GPIO端口高/低电平
+* @param  gpiox GPIO外设
+*             @arg GPIOA
+*             @arg GPIOB
+*             @arg GPIOC
+* @param  pin_mask  GPIO引脚组合
+*             @arg GPIO_PIN_0
+*             @arg GPIO_PIN_1
+*             @arg ...
+*             @arg GPIO_PIN_7
+* @retval 无
+*/
+__STATIC_INLINE void std_gpio_toggle_pin(GPIO_t* gpiox, uint32_t pin_mask)
+{
+    gpiox->ODR ^= pin_mask;
+}
+
+void std_gpio_init(GPIO_t* gpiox, std_gpio_init_t* gpio_init_param);
+void std_gpio_deinit(GPIO_t* gpiox);
+void std_gpio_struct_init(std_gpio_init_t* gpio_init_struct);
+
+/** 
+* @} 
+*/
+
+
+#ifdef __cplusplus
+}
+#endif
+
+/**
+* @} 
+*/  
+
+/**
+* @}
+*/
+
+#endif /* CIU32F003_STD_GPIO_H */
+
+

+ 537 - 0
CIU32F003_LIB/Include/ciu32f003_std_gpio(3).h

@@ -0,0 +1,537 @@
+/************************************************************************************************/
+/**
+* @file               ciu32f003_std_gpio.h
+* @author             MCU Ecosystem Development Team
+* @brief              GPIO STD库驱动头文件。
+*                     提供GPIO相关的STD库操作函数声明、数据类型以及常量的定义。                         
+*                     
+*
+**************************************************************************************************
+* @attention
+* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
+*
+**************************************************************************************************
+*/
+
+/* 避免头文件重复引用 */
+#ifndef CIU32F003_STD_GPIO_H
+#define CIU32F003_STD_GPIO_H
+
+/************************************************************************************************/
+/** 
+* @addtogroup CIU32F003_STD_Driver
+* @{
+*/
+
+/**
+* @defgroup GPIO GPIO
+* @brief 通用输入/输出接口的STD库驱动
+* @{
+*/
+/************************************************************************************************/
+
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/*------------------------------------------includes--------------------------------------------*/
+#include "ciu32f003_std_common.h"
+
+/*-----------------------------------------type define------------------------------------------*/
+
+/************************************************************************************************/
+/** 
+* @defgroup GPIO_Types GPIO Types
+* @brief GPIO数据类型定义
+* @{
+*/
+/************************************************************************************************/
+/**
+* @brief  GPIO初始化结构体定义
+*/
+typedef struct
+{                         
+    uint32_t pin;                 /**< 指定GPIO引脚,可以是GPIO引脚组合 
+                                           @arg GPIO_PIN_0 ...           */
+
+    uint32_t mode;                /**< 指定GPIO引脚模式及输出类型配置 
+                                           @arg GPIO_MODE_INPUT
+                                           @arg GPIO_MODE_ANALOG
+                                           @arg GPIO_MODE_OUTPUT
+                                           @arg GPIO_MODE_ALTERNATE      */
+
+    uint32_t pull;                /**< 指定GPIO引脚上/下拉配置  
+                                           @arg GPIO_NOPULL ...          */
+
+    uint32_t output_type;         /**< 指定GPIO输出类型  
+                                           @arg GPIO_OUTPUT_PUSHPULL
+                                           @arg GPIO_OUTPUT_OPENDRAIN    */
+    
+    uint32_t alternate;           /**< 指定GPIO引脚复用功能配置   
+                                           @arg GPIO_AF0_SPI1 ...        */
+} std_gpio_init_t;
+
+/** 
+* @} 
+*/
+
+/*--------------------------------------------define--------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @defgroup GPIO_Constants GPIO Constants 
+* @brief  GPIO常量定义及宏定义
+* @{
+*
+*/
+/************************************************************************************************/
+
+/* GPIO PIN常量 */
+#define  GPIO_PIN_0                            ((uint16_t)0x0001U)        /**< 选定  PIN 0   */
+#define  GPIO_PIN_1                            ((uint16_t)0x0002U)        /**< 选定  PIN 1   */
+#define  GPIO_PIN_2                            ((uint16_t)0x0004U)        /**< 选定  PIN 2   */
+#define  GPIO_PIN_3                            ((uint16_t)0x0008U)        /**< 选定  PIN 3   */
+#define  GPIO_PIN_4                            ((uint16_t)0x0010U)        /**< 选定  PIN 4   */
+#define  GPIO_PIN_5                            ((uint16_t)0x0020U)        /**< 选定  PIN 5   */
+#define  GPIO_PIN_6                            ((uint16_t)0x0040U)        /**< 选定  PIN 6   */
+#define  GPIO_PIN_7                            ((uint16_t)0x0080U)        /**< 选定  PIN 7   */
+#define  GPIO_PIN_All                          ((uint16_t)0x00FFU)        /**< 选定  全部    */
+
+/* GPIO 模式配置常量 */
+#define  GPIO_MODE_INPUT                       (0x00000000U)              /**< 输入浮空 */
+#define  GPIO_MODE_OUTPUT                      (0x00000001U)              /**< 输出功能 */
+#define  GPIO_MODE_ALTERNATE                   (0x00000002U)              /**< 复用功能 */
+#define  GPIO_MODE_ANALOG                      (0x00000003U)              /**< 模拟功能 */
+
+/* GPIO 上下拉配置参数 */
+#define  GPIO_NOPULL                           (0x00000000U)              /**< 无上、下拉 */
+#define  GPIO_PULLUP                           (0x00000001U)              /**< 上拉       */
+#define  GPIO_PULLDOWN                         (0x00000002U)              /**< 下拉       */
+
+/* GPIO 输出类型 */
+#define  GPIO_OUTPUT_PUSHPULL                  (0x00000000U)              /**< 推挽输出 */
+#define  GPIO_OUTPUT_OPENDRAIN                 (0x00000001U)              /**< 开漏输出 */
+
+/* 复用功能0 */
+#define  GPIO_AF0_SPI1                         ((uint8_t)0x00U)           /**< SPI1   复用功能映射 */
+#define  GPIO_AF0_SWCLK                        ((uint8_t)0x00U)           /**< SWCLK  复用功能映射 */
+#define  GPIO_AF0_SWDIO                        ((uint8_t)0x00U)           /**< SWDIO  复用功能映射 */
+
+/* 复用功能1 */
+#define  GPIO_AF1_UART1                        ((uint8_t)0x01U)           /**< UART1  复用功能映射 */
+
+/* 复用功能2 */
+#define  GPIO_AF2_TIM1                         ((uint8_t)0x02U)           /**< TIM1   复用功能映射 */
+
+/* 复用功能3 */
+#define  GPIO_AF3_TIM1                         ((uint8_t)0x03U)           /**< TIM1   复用功能映射 */
+#define  GPIO_AF3_TIM3                         ((uint8_t)0x03U)           /**< TIM3   复用功能映射 */
+
+/* 复用功能4 */
+#define  GPIO_AF4_TIM1                         ((uint8_t)0x04U)           /**< TIM1   复用功能映射 */
+#define  GPIO_AF4_COMP1                        ((uint8_t)0x04U)           /**< COMP1  复用功能映射 */
+#define  GPIO_AF4_SPI1                         ((uint8_t)0x04U)           /**< SPI1   复用功能映射 */
+
+/* 复用功能5 */
+#define  GPIO_AF5_TIM1                         ((uint8_t)0x05U)           /**< TIM1   复用功能映射 */
+#define  GPIO_AF5_UART1                        ((uint8_t)0x05U)           /**< UART1  复用功能映射 */
+#define  GPIO_AF5_UART2                        ((uint8_t)0x05U)           /**< UART2  复用功能映射 */
+
+/* 复用功能6 */
+#define  GPIO_AF6_I2C1                         ((uint8_t)0x06U)           /**< I2C1   复用功能映射 */
+#define  GPIO_AF6_MCO                          ((uint8_t)0x06U)           /**< MCO    复用功能映射 */
+
+/* 复用功能7 */
+#define  GPIO_AF7_COMP2                        ((uint8_t)0x07U)           /**< COMP2  复用功能映射 */
+#define  GPIO_AF7_IR_OUT                       ((uint8_t)0x07U)           /**< IR_OUT 复用功能映射 */
+#define  GPIO_AF7_MCO                          ((uint8_t)0x07U)           /**< MCO    复用功能映射 */
+
+/* 复用功能寄存器GPIO源选择偏移位 */
+#define  GPIO_AF_SELECT_OFFSET                 (0x0000000FU)              /**< GPIO源选择偏移位 */
+
+/** 
+* @} 
+*/
+
+/*-------------------------------------------functions------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @defgroup GPIO_External_Functions GPIO External Functions
+* @brief    GPIO对外函数
+* @{
+*
+*/
+/************************************************************************************************/
+/**
+* @brief  设置GPIO引脚模式
+* @param  gpiox GPIO外设
+*             @arg GPIOA
+*             @arg GPIOB
+*             @arg GPIOC
+* @param  pin  GPIO引脚
+*             @arg GPIO_PIN_0
+*             @arg GPIO_PIN_1
+*             @arg ...
+*             @arg GPIO_PIN_7
+* @param  mode GPIO引脚模式
+*             @arg GPIO_MODE_INPUT     输入模式
+*             @arg GPIO_MODE_OUTPUT    输出模式
+*             @arg GPIO_MODE_ALTERNATE 复用模式
+*             @arg GPIO_MODE_ANALOG    模拟模式
+* @note   仅支持单个引脚
+* @retval 无
+*/
+__STATIC_INLINE void std_gpio_set_pin_mode(GPIO_t *gpiox, uint32_t pin, uint32_t mode)
+{
+    MODIFY_REG(gpiox->MODE, ((pin * pin) * GPIO_MODE_MODE0), ((pin * pin) * mode));
+}
+
+/**
+* @brief  读取GPIO引脚模式
+* @param  gpiox GPIO外设
+*             @arg GPIOA
+*             @arg GPIOB
+*             @arg GPIOC
+* @param  pin GPIO引脚
+*             @arg GPIO_PIN_0
+*             @arg GPIO_PIN_1
+*             @arg ...
+*             @arg GPIO_PIN_7
+* @note   仅支持单个引脚
+* @retval uint32_t GPIO引脚模式
+*             @arg GPIO_MODE_INPUT     输入模式
+*             @arg GPIO_MODE_OUTPUT    输出模式
+*             @arg GPIO_MODE_ALTERNATE 复用模式
+*             @arg GPIO_MODE_ANALOG    模拟模式
+*/
+__STATIC_INLINE uint32_t std_gpio_get_pin_mode(GPIO_t *gpiox, uint32_t pin)
+{
+    return ((gpiox->MODE & ((pin * pin) * GPIO_MODE_MODE0)) / (pin * pin));
+}
+
+/**
+* @brief  设置GPIO引脚输出类型
+* @param  gpiox GPIO外设
+*             @arg GPIOA
+*             @arg GPIOB
+*             @arg GPIOC
+* @param  pin_mask GPIO引脚组合
+*             @arg GPIO_PIN_0
+*             @arg GPIO_PIN_1
+*             @arg ...
+*             @arg GPIO_PIN_7
+* @param  output_type GPIO引脚输出类型
+*             @arg GPIO_OUTPUT_PUSHPULL  推挽输出
+*             @arg GPIO_OUTPUT_OPENDRAIN 开漏输出
+* @retval 无
+*/
+__STATIC_INLINE void std_gpio_set_pin_output_type(GPIO_t *gpiox, uint32_t pin_mask, uint32_t output_type)
+{
+    MODIFY_REG(gpiox->OTYPE, pin_mask, pin_mask * output_type);
+}
+
+/**
+* @brief  读取GPIO引脚输出类型
+* @param  gpiox GPIO外设
+*             @arg GPIOA
+*             @arg GPIOB
+*             @arg GPIOC
+* @param  pin  GPIO引脚
+*             @arg GPIO_PIN_0
+*             @arg GPIO_PIN_1
+*             @arg ...
+*             @arg GPIO_PIN_7
+* @note   仅支持单个引脚
+* @retval uint32_t GPIO引脚输出类型
+*             @arg GPIO_OUTPUT_PUSHPULL  推挽输出
+*             @arg GPIO_OUTPUT_OPENDRAIN 开漏输出
+*/
+__STATIC_INLINE uint32_t std_gpio_get_pin_output_type(GPIO_t *gpiox, uint32_t pin)
+{
+    return ((gpiox->OTYPE & (pin)) != 0U ? GPIO_OUTPUT_OPENDRAIN : GPIO_OUTPUT_PUSHPULL);
+}
+
+/**
+* @brief  设置GPIO引脚上下拉配置
+* @param  gpiox GPIO外设
+*             @arg GPIOA
+*             @arg GPIOB
+*             @arg GPIOC
+* @param  pin GPIO引脚
+*             @arg GPIO_PIN_0
+*             @arg GPIO_PIN_1
+*             @arg ...
+*             @arg GPIO_PIN_7
+* @param  pull GPIO引脚上下拉配置
+*             @arg GPIO_NOPULL   无上、下拉
+*             @arg GPIO_PULLUP   上拉
+*             @arg GPIO_PULLDOWN 下拉
+* @note   仅支持单个引脚
+* @retval 无
+*/
+__STATIC_INLINE void std_gpio_set_pin_pull(GPIO_t *gpiox, uint32_t pin, uint32_t pull)
+{
+    MODIFY_REG(gpiox->PUPD, ((pin * pin) * GPIO_PUPD_PUPD0), ((pin * pin) * pull));
+}
+
+/**
+* @brief  读取GPIO引脚上下拉配置
+* @param  gpiox GPIO外设
+*             @arg GPIOA
+*             @arg GPIOB
+*             @arg GPIOC
+* @param  pin  GPIO引脚
+*             @arg GPIO_PIN_0
+*             @arg GPIO_PIN_1
+*             @arg ...
+*             @arg GPIO_PIN_7
+* @note   仅支持单个引脚
+* @retval uint32_t GPIO引脚上下拉配置
+*             @arg GPIO_NOPULL   无上、下拉
+*             @arg GPIO_PULLUP   上拉
+*             @arg GPIO_PULLDOWN 下拉
+*/
+__STATIC_INLINE uint32_t std_gpio_get_pin_pull(GPIO_t *gpiox, uint32_t pin)
+{
+  return ((gpiox->PUPD & ((pin * pin) * GPIO_PUPD_PUPD0)) / (pin * pin));
+}
+
+/**
+* @brief  设置GPIO引脚(0~7)复用功能
+* @param  gpiox GPIO外设
+*             @arg GPIOA
+*             @arg GPIOB
+*             @arg GPIOC
+* @param  pin  GPIO引脚
+*             @arg GPIO_PIN_0
+*             @arg GPIO_PIN_1
+*             @arg ...
+*             @arg GPIO_PIN_7
+* @param  alternate GPIO引脚(0~7)复用功能
+*             @arg GPIO_AF0_SPI1                         
+*             @arg GPIO_AF0_SWCLK                       
+*             @arg GPIO_AF0_SWDIO             
+*             @arg GPIO_AF1_UART1                        
+*             @arg GPIO_AF2_TIM1                        
+*             @arg GPIO_AF3_TIM1                         
+*             @arg GPIO_AF3_TIM3                         
+*             @arg GPIO_AF4_TIM1                         
+*             @arg GPIO_AF4_COMP1                        
+*             @arg GPIO_AF4_SPI1                         
+*             @arg GPIO_AF5_TIM1                         
+*             @arg GPIO_AF5_UART1                        
+*             @arg GPIO_AF5_UART2                       
+*             @arg GPIO_AF6_I2C1                         
+*             @arg GPIO_AF6_MCO                          
+*             @arg GPIO_AF7_COMP2                       
+*             @arg GPIO_AF7_IR_OUT                       
+*             @arg GPIO_AF7_MCO                          
+* @note   仅支持单个引脚
+* @retval 无
+*/
+__STATIC_INLINE void std_gpio_set_afpin_0_7(GPIO_t *gpiox, uint32_t pin, uint32_t alternate)
+{
+    MODIFY_REG(gpiox->AFL, ((((pin * pin) * pin) * pin) * GPIO_AF_SELECT_OFFSET),
+               ((((pin * pin) * pin) * pin) * alternate)); 
+}
+
+/**
+* @brief  读取GPIO引脚(0~7)复用功能
+* @param  gpiox GPIO外设
+*             @arg GPIOA
+*             @arg GPIOB
+*             @arg GPIOC
+* @param  pin GPIO引脚
+*             @arg GPIO_PIN_0
+*             @arg GPIO_PIN_1
+*             @arg ...
+*             @arg GPIO_PIN_7
+* @note   仅支持单个引脚
+* @retval uint32_t GPIO引脚(0~7)复用功能
+*             @arg GPIO_AF0_SPI1                         
+*             @arg GPIO_AF0_SWCLK                       
+*             @arg GPIO_AF0_SWDIO             
+*             @arg GPIO_AF1_UART1                        
+*             @arg GPIO_AF2_TIM1                        
+*             @arg GPIO_AF3_TIM1                         
+*             @arg GPIO_AF3_TIM3                         
+*             @arg GPIO_AF4_TIM1                         
+*             @arg GPIO_AF4_COMP1                        
+*             @arg GPIO_AF4_SPI1                         
+*             @arg GPIO_AF5_TIM1                         
+*             @arg GPIO_AF5_UART1                        
+*             @arg GPIO_AF5_UART2                       
+*             @arg GPIO_AF6_I2C1                         
+*             @arg GPIO_AF6_MCO                          
+*             @arg GPIO_AF7_COMP2                       
+*             @arg GPIO_AF7_IR_OUT                       
+*             @arg GPIO_AF7_MCO  
+*/
+__STATIC_INLINE uint32_t std_gpio_get_afpin_0_7(GPIO_t *gpiox, uint32_t pin)
+{
+    return ((gpiox->AFL & ((((pin * pin) * pin) * pin) * GPIO_AF_SELECT_OFFSET)) / 
+            (((pin * pin) * pin) * pin));
+}
+
+/**
+* @brief  读取GPIO引脚输入状态
+* @param  gpiox GPIO外设
+*             @arg GPIOA
+*             @arg GPIOB
+*             @arg GPIOC
+* @param  pin  GPIO引脚
+*             @arg GPIO_PIN_0
+*             @arg GPIO_PIN_1
+*             @arg ...
+*             @arg GPIO_PIN_7
+* @note   仅支持单个引脚
+* @retval bool GPIO引脚输入状态
+*             @arg true  表示高电平
+*             @arg false 表示低电平
+*/
+__STATIC_INLINE bool std_gpio_get_input_pin(GPIO_t* gpiox, uint32_t pin)
+{
+    return ((gpiox->IDR & (pin)) == (pin));
+}
+
+/**
+* @brief  读取GPIO引脚输出状态
+* @param  gpiox GPIO外设
+*             @arg GPIOA
+*             @arg GPIOB
+*             @arg GPIOC
+* @param  pin GPIO引脚
+*             @arg GPIO_PIN_0
+*             @arg GPIO_PIN_1
+*             @arg ...
+*             @arg GPIO_PIN_7
+* @note   仅支持单个引脚
+* @retval bool GPIO引脚输出状态
+*             @arg true  表示高电平
+*             @arg false 表示低电平
+*/
+__STATIC_INLINE bool std_gpio_get_output_pin(GPIO_t* gpiox, uint32_t pin)
+{
+    return ((gpiox->ODR & (pin)) == (pin));
+}
+
+/**
+* @brief  读取GPIO端口输入数据
+* @param  gpiox GPIO外设
+*             @arg GPIOA
+*             @arg GPIOB
+*             @arg GPIOC
+* @retval uint32_t GPIO端口输入数据
+*/
+__STATIC_INLINE uint32_t std_gpio_read_input_port(GPIO_t* gpiox)
+{
+    return (gpiox->IDR);
+}
+
+/**
+* @brief  读取GPIO端口输出数据
+* @param  gpiox GPIO外设
+*             @arg GPIOA
+*             @arg GPIOB
+*             @arg GPIOC
+* @retval uint32_t GPIO端口输出数据
+*/
+__STATIC_INLINE uint32_t std_gpio_read_output_port(GPIO_t* gpiox)
+{
+    return (gpiox->ODR);
+}
+
+/**
+* @brief  写入GPIO端口输出数据
+* @param  gpiox GPIO外设
+*             @arg GPIOA
+*             @arg GPIOB
+*             @arg GPIOC
+* @param  value 输出数据
+* @retval 无
+*/
+__STATIC_INLINE void std_gpio_write_output_port(GPIO_t* gpiox, uint32_t value)
+{
+    gpiox->ODR = value;
+}
+
+/**
+* @brief  设置GPIO输出高电平
+* @param  gpiox GPIO外设
+*             @arg GPIOA
+*             @arg GPIOB
+*             @arg GPIOC
+* @param  pin_mask GPIO引脚组合
+*             @arg GPIO_PIN_0
+*             @arg GPIO_PIN_1
+*             @arg ...
+*             @arg GPIO_PIN_7
+* @retval 无
+*/
+__STATIC_INLINE void std_gpio_set_pin(GPIO_t* gpiox, uint32_t pin_mask)
+{
+    gpiox->BSR = pin_mask;
+}
+
+/**
+* @brief  设置GPIO输出低电平
+* @param  gpiox GPIO外设
+*             @arg GPIOA
+*             @arg GPIOB
+*             @arg GPIOC
+* @param  pin_mask  GPIO引脚组合
+*             @arg GPIO_PIN_0
+*             @arg GPIO_PIN_1
+*             @arg ...
+*             @arg GPIO_PIN_7
+* @retval 无
+*/
+__STATIC_INLINE void std_gpio_reset_pin(GPIO_t* gpiox, uint32_t pin_mask)
+{
+    gpiox->BR = pin_mask;
+}
+
+/**
+* @brief  切换GPIO端口高/低电平
+* @param  gpiox GPIO外设
+*             @arg GPIOA
+*             @arg GPIOB
+*             @arg GPIOC
+* @param  pin_mask  GPIO引脚组合
+*             @arg GPIO_PIN_0
+*             @arg GPIO_PIN_1
+*             @arg ...
+*             @arg GPIO_PIN_7
+* @retval 无
+*/
+__STATIC_INLINE void std_gpio_toggle_pin(GPIO_t* gpiox, uint32_t pin_mask)
+{
+    gpiox->ODR ^= pin_mask;
+}
+
+void std_gpio_init(GPIO_t* gpiox, std_gpio_init_t* gpio_init_param);
+void std_gpio_deinit(GPIO_t* gpiox);
+void std_gpio_struct_init(std_gpio_init_t* gpio_init_struct);
+
+/** 
+* @} 
+*/
+
+
+#ifdef __cplusplus
+}
+#endif
+
+/**
+* @} 
+*/  
+
+/**
+* @}
+*/
+
+#endif /* CIU32F003_STD_GPIO_H */
+
+

+ 537 - 0
CIU32F003_LIB/Include/ciu32f003_std_gpio.h

@@ -0,0 +1,537 @@
+/************************************************************************************************/
+/**
+* @file               ciu32f003_std_gpio.h
+* @author             MCU Ecosystem Development Team
+* @brief              GPIO STD库驱动头文件。
+*                     提供GPIO相关的STD库操作函数声明、数据类型以及常量的定义。                         
+*                     
+*
+**************************************************************************************************
+* @attention
+* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
+*
+**************************************************************************************************
+*/
+
+/* 避免头文件重复引用 */
+#ifndef CIU32F003_STD_GPIO_H
+#define CIU32F003_STD_GPIO_H
+
+/************************************************************************************************/
+/** 
+* @addtogroup CIU32F003_STD_Driver
+* @{
+*/
+
+/**
+* @defgroup GPIO GPIO
+* @brief 通用输入/输出接口的STD库驱动
+* @{
+*/
+/************************************************************************************************/
+
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/*------------------------------------------includes--------------------------------------------*/
+#include "ciu32f003_std_common.h"
+
+/*-----------------------------------------type define------------------------------------------*/
+
+/************************************************************************************************/
+/** 
+* @defgroup GPIO_Types GPIO Types
+* @brief GPIO数据类型定义
+* @{
+*/
+/************************************************************************************************/
+/**
+* @brief  GPIO初始化结构体定义
+*/
+typedef struct
+{                         
+    uint32_t pin;                 /**< 指定GPIO引脚,可以是GPIO引脚组合 
+                                           @arg GPIO_PIN_0 ...           */
+
+    uint32_t mode;                /**< 指定GPIO引脚模式及输出类型配置 
+                                           @arg GPIO_MODE_INPUT
+                                           @arg GPIO_MODE_ANALOG
+                                           @arg GPIO_MODE_OUTPUT
+                                           @arg GPIO_MODE_ALTERNATE      */
+
+    uint32_t pull;                /**< 指定GPIO引脚上/下拉配置  
+                                           @arg GPIO_NOPULL ...          */
+
+    uint32_t output_type;         /**< 指定GPIO输出类型  
+                                           @arg GPIO_OUTPUT_PUSHPULL
+                                           @arg GPIO_OUTPUT_OPENDRAIN    */
+    
+    uint32_t alternate;           /**< 指定GPIO引脚复用功能配置   
+                                           @arg GPIO_AF0_SPI1 ...        */
+} std_gpio_init_t;
+
+/** 
+* @} 
+*/
+
+/*--------------------------------------------define--------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @defgroup GPIO_Constants GPIO Constants 
+* @brief  GPIO常量定义及宏定义
+* @{
+*
+*/
+/************************************************************************************************/
+
+/* GPIO PIN常量 */
+#define  GPIO_PIN_0                            ((uint16_t)0x0001U)        /**< 选定  PIN 0   */
+#define  GPIO_PIN_1                            ((uint16_t)0x0002U)        /**< 选定  PIN 1   */
+#define  GPIO_PIN_2                            ((uint16_t)0x0004U)        /**< 选定  PIN 2   */
+#define  GPIO_PIN_3                            ((uint16_t)0x0008U)        /**< 选定  PIN 3   */
+#define  GPIO_PIN_4                            ((uint16_t)0x0010U)        /**< 选定  PIN 4   */
+#define  GPIO_PIN_5                            ((uint16_t)0x0020U)        /**< 选定  PIN 5   */
+#define  GPIO_PIN_6                            ((uint16_t)0x0040U)        /**< 选定  PIN 6   */
+#define  GPIO_PIN_7                            ((uint16_t)0x0080U)        /**< 选定  PIN 7   */
+#define  GPIO_PIN_All                          ((uint16_t)0x00FFU)        /**< 选定  全部    */
+
+/* GPIO 模式配置常量 */
+#define  GPIO_MODE_INPUT                       (0x00000000U)              /**< 输入浮空 */
+#define  GPIO_MODE_OUTPUT                      (0x00000001U)              /**< 输出功能 */
+#define  GPIO_MODE_ALTERNATE                   (0x00000002U)              /**< 复用功能 */
+#define  GPIO_MODE_ANALOG                      (0x00000003U)              /**< 模拟功能 */
+
+/* GPIO 上下拉配置参数 */
+#define  GPIO_NOPULL                           (0x00000000U)              /**< 无上、下拉 */
+#define  GPIO_PULLUP                           (0x00000001U)              /**< 上拉       */
+#define  GPIO_PULLDOWN                         (0x00000002U)              /**< 下拉       */
+
+/* GPIO 输出类型 */
+#define  GPIO_OUTPUT_PUSHPULL                  (0x00000000U)              /**< 推挽输出 */
+#define  GPIO_OUTPUT_OPENDRAIN                 (0x00000001U)              /**< 开漏输出 */
+
+/* 复用功能0 */
+#define  GPIO_AF0_SPI1                         ((uint8_t)0x00U)           /**< SPI1   复用功能映射 */
+#define  GPIO_AF0_SWCLK                        ((uint8_t)0x00U)           /**< SWCLK  复用功能映射 */
+#define  GPIO_AF0_SWDIO                        ((uint8_t)0x00U)           /**< SWDIO  复用功能映射 */
+
+/* 复用功能1 */
+#define  GPIO_AF1_UART1                        ((uint8_t)0x01U)           /**< UART1  复用功能映射 */
+
+/* 复用功能2 */
+#define  GPIO_AF2_TIM1                         ((uint8_t)0x02U)           /**< TIM1   复用功能映射 */
+
+/* 复用功能3 */
+#define  GPIO_AF3_TIM1                         ((uint8_t)0x03U)           /**< TIM1   复用功能映射 */
+#define  GPIO_AF3_TIM3                         ((uint8_t)0x03U)           /**< TIM3   复用功能映射 */
+
+/* 复用功能4 */
+#define  GPIO_AF4_TIM1                         ((uint8_t)0x04U)           /**< TIM1   复用功能映射 */
+#define  GPIO_AF4_COMP1                        ((uint8_t)0x04U)           /**< COMP1  复用功能映射 */
+#define  GPIO_AF4_SPI1                         ((uint8_t)0x04U)           /**< SPI1   复用功能映射 */
+
+/* 复用功能5 */
+#define  GPIO_AF5_TIM1                         ((uint8_t)0x05U)           /**< TIM1   复用功能映射 */
+#define  GPIO_AF5_UART1                        ((uint8_t)0x05U)           /**< UART1  复用功能映射 */
+#define  GPIO_AF5_UART2                        ((uint8_t)0x05U)           /**< UART2  复用功能映射 */
+
+/* 复用功能6 */
+#define  GPIO_AF6_I2C1                         ((uint8_t)0x06U)           /**< I2C1   复用功能映射 */
+#define  GPIO_AF6_MCO                          ((uint8_t)0x06U)           /**< MCO    复用功能映射 */
+
+/* 复用功能7 */
+#define  GPIO_AF7_COMP2                        ((uint8_t)0x07U)           /**< COMP2  复用功能映射 */
+#define  GPIO_AF7_IR_OUT                       ((uint8_t)0x07U)           /**< IR_OUT 复用功能映射 */
+#define  GPIO_AF7_MCO                          ((uint8_t)0x07U)           /**< MCO    复用功能映射 */
+
+/* 复用功能寄存器GPIO源选择偏移位 */
+#define  GPIO_AF_SELECT_OFFSET                 (0x0000000FU)              /**< GPIO源选择偏移位 */
+
+/** 
+* @} 
+*/
+
+/*-------------------------------------------functions------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @defgroup GPIO_External_Functions GPIO External Functions
+* @brief    GPIO对外函数
+* @{
+*
+*/
+/************************************************************************************************/
+/**
+* @brief  设置GPIO引脚模式
+* @param  gpiox GPIO外设
+*             @arg GPIOA
+*             @arg GPIOB
+*             @arg GPIOC
+* @param  pin  GPIO引脚
+*             @arg GPIO_PIN_0
+*             @arg GPIO_PIN_1
+*             @arg ...
+*             @arg GPIO_PIN_7
+* @param  mode GPIO引脚模式
+*             @arg GPIO_MODE_INPUT     输入模式
+*             @arg GPIO_MODE_OUTPUT    输出模式
+*             @arg GPIO_MODE_ALTERNATE 复用模式
+*             @arg GPIO_MODE_ANALOG    模拟模式
+* @note   仅支持单个引脚
+* @retval 无
+*/
+__STATIC_INLINE void std_gpio_set_pin_mode(GPIO_t *gpiox, uint32_t pin, uint32_t mode)
+{
+    MODIFY_REG(gpiox->MODE, ((pin * pin) * GPIO_MODE_MODE0), ((pin * pin) * mode));
+}
+
+/**
+* @brief  读取GPIO引脚模式
+* @param  gpiox GPIO外设
+*             @arg GPIOA
+*             @arg GPIOB
+*             @arg GPIOC
+* @param  pin GPIO引脚
+*             @arg GPIO_PIN_0
+*             @arg GPIO_PIN_1
+*             @arg ...
+*             @arg GPIO_PIN_7
+* @note   仅支持单个引脚
+* @retval uint32_t GPIO引脚模式
+*             @arg GPIO_MODE_INPUT     输入模式
+*             @arg GPIO_MODE_OUTPUT    输出模式
+*             @arg GPIO_MODE_ALTERNATE 复用模式
+*             @arg GPIO_MODE_ANALOG    模拟模式
+*/
+__STATIC_INLINE uint32_t std_gpio_get_pin_mode(GPIO_t *gpiox, uint32_t pin)
+{
+    return ((gpiox->MODE & ((pin * pin) * GPIO_MODE_MODE0)) / (pin * pin));
+}
+
+/**
+* @brief  设置GPIO引脚输出类型
+* @param  gpiox GPIO外设
+*             @arg GPIOA
+*             @arg GPIOB
+*             @arg GPIOC
+* @param  pin_mask GPIO引脚组合
+*             @arg GPIO_PIN_0
+*             @arg GPIO_PIN_1
+*             @arg ...
+*             @arg GPIO_PIN_7
+* @param  output_type GPIO引脚输出类型
+*             @arg GPIO_OUTPUT_PUSHPULL  推挽输出
+*             @arg GPIO_OUTPUT_OPENDRAIN 开漏输出
+* @retval 无
+*/
+__STATIC_INLINE void std_gpio_set_pin_output_type(GPIO_t *gpiox, uint32_t pin_mask, uint32_t output_type)
+{
+    MODIFY_REG(gpiox->OTYPE, pin_mask, pin_mask * output_type);
+}
+
+/**
+* @brief  读取GPIO引脚输出类型
+* @param  gpiox GPIO外设
+*             @arg GPIOA
+*             @arg GPIOB
+*             @arg GPIOC
+* @param  pin  GPIO引脚
+*             @arg GPIO_PIN_0
+*             @arg GPIO_PIN_1
+*             @arg ...
+*             @arg GPIO_PIN_7
+* @note   仅支持单个引脚
+* @retval uint32_t GPIO引脚输出类型
+*             @arg GPIO_OUTPUT_PUSHPULL  推挽输出
+*             @arg GPIO_OUTPUT_OPENDRAIN 开漏输出
+*/
+__STATIC_INLINE uint32_t std_gpio_get_pin_output_type(GPIO_t *gpiox, uint32_t pin)
+{
+    return ((gpiox->OTYPE & (pin)) != 0U ? GPIO_OUTPUT_OPENDRAIN : GPIO_OUTPUT_PUSHPULL);
+}
+
+/**
+* @brief  设置GPIO引脚上下拉配置
+* @param  gpiox GPIO外设
+*             @arg GPIOA
+*             @arg GPIOB
+*             @arg GPIOC
+* @param  pin GPIO引脚
+*             @arg GPIO_PIN_0
+*             @arg GPIO_PIN_1
+*             @arg ...
+*             @arg GPIO_PIN_7
+* @param  pull GPIO引脚上下拉配置
+*             @arg GPIO_NOPULL   无上、下拉
+*             @arg GPIO_PULLUP   上拉
+*             @arg GPIO_PULLDOWN 下拉
+* @note   仅支持单个引脚
+* @retval 无
+*/
+__STATIC_INLINE void std_gpio_set_pin_pull(GPIO_t *gpiox, uint32_t pin, uint32_t pull)
+{
+    MODIFY_REG(gpiox->PUPD, ((pin * pin) * GPIO_PUPD_PUPD0), ((pin * pin) * pull));
+}
+
+/**
+* @brief  读取GPIO引脚上下拉配置
+* @param  gpiox GPIO外设
+*             @arg GPIOA
+*             @arg GPIOB
+*             @arg GPIOC
+* @param  pin  GPIO引脚
+*             @arg GPIO_PIN_0
+*             @arg GPIO_PIN_1
+*             @arg ...
+*             @arg GPIO_PIN_7
+* @note   仅支持单个引脚
+* @retval uint32_t GPIO引脚上下拉配置
+*             @arg GPIO_NOPULL   无上、下拉
+*             @arg GPIO_PULLUP   上拉
+*             @arg GPIO_PULLDOWN 下拉
+*/
+__STATIC_INLINE uint32_t std_gpio_get_pin_pull(GPIO_t *gpiox, uint32_t pin)
+{
+  return ((gpiox->PUPD & ((pin * pin) * GPIO_PUPD_PUPD0)) / (pin * pin));
+}
+
+/**
+* @brief  设置GPIO引脚(0~7)复用功能
+* @param  gpiox GPIO外设
+*             @arg GPIOA
+*             @arg GPIOB
+*             @arg GPIOC
+* @param  pin  GPIO引脚
+*             @arg GPIO_PIN_0
+*             @arg GPIO_PIN_1
+*             @arg ...
+*             @arg GPIO_PIN_7
+* @param  alternate GPIO引脚(0~7)复用功能
+*             @arg GPIO_AF0_SPI1                         
+*             @arg GPIO_AF0_SWCLK                       
+*             @arg GPIO_AF0_SWDIO             
+*             @arg GPIO_AF1_UART1                        
+*             @arg GPIO_AF2_TIM1                        
+*             @arg GPIO_AF3_TIM1                         
+*             @arg GPIO_AF3_TIM3                         
+*             @arg GPIO_AF4_TIM1                         
+*             @arg GPIO_AF4_COMP1                        
+*             @arg GPIO_AF4_SPI1                         
+*             @arg GPIO_AF5_TIM1                         
+*             @arg GPIO_AF5_UART1                        
+*             @arg GPIO_AF5_UART2                       
+*             @arg GPIO_AF6_I2C1                         
+*             @arg GPIO_AF6_MCO                          
+*             @arg GPIO_AF7_COMP2                       
+*             @arg GPIO_AF7_IR_OUT                       
+*             @arg GPIO_AF7_MCO                          
+* @note   仅支持单个引脚
+* @retval 无
+*/
+__STATIC_INLINE void std_gpio_set_afpin_0_7(GPIO_t *gpiox, uint32_t pin, uint32_t alternate)
+{
+    MODIFY_REG(gpiox->AFL, ((((pin * pin) * pin) * pin) * GPIO_AF_SELECT_OFFSET),
+               ((((pin * pin) * pin) * pin) * alternate)); 
+}
+
+/**
+* @brief  读取GPIO引脚(0~7)复用功能
+* @param  gpiox GPIO外设
+*             @arg GPIOA
+*             @arg GPIOB
+*             @arg GPIOC
+* @param  pin GPIO引脚
+*             @arg GPIO_PIN_0
+*             @arg GPIO_PIN_1
+*             @arg ...
+*             @arg GPIO_PIN_7
+* @note   仅支持单个引脚
+* @retval uint32_t GPIO引脚(0~7)复用功能
+*             @arg GPIO_AF0_SPI1                         
+*             @arg GPIO_AF0_SWCLK                       
+*             @arg GPIO_AF0_SWDIO             
+*             @arg GPIO_AF1_UART1                        
+*             @arg GPIO_AF2_TIM1                        
+*             @arg GPIO_AF3_TIM1                         
+*             @arg GPIO_AF3_TIM3                         
+*             @arg GPIO_AF4_TIM1                         
+*             @arg GPIO_AF4_COMP1                        
+*             @arg GPIO_AF4_SPI1                         
+*             @arg GPIO_AF5_TIM1                         
+*             @arg GPIO_AF5_UART1                        
+*             @arg GPIO_AF5_UART2                       
+*             @arg GPIO_AF6_I2C1                         
+*             @arg GPIO_AF6_MCO                          
+*             @arg GPIO_AF7_COMP2                       
+*             @arg GPIO_AF7_IR_OUT                       
+*             @arg GPIO_AF7_MCO  
+*/
+__STATIC_INLINE uint32_t std_gpio_get_afpin_0_7(GPIO_t *gpiox, uint32_t pin)
+{
+    return ((gpiox->AFL & ((((pin * pin) * pin) * pin) * GPIO_AF_SELECT_OFFSET)) / 
+            (((pin * pin) * pin) * pin));
+}
+
+/**
+* @brief  读取GPIO引脚输入状态
+* @param  gpiox GPIO外设
+*             @arg GPIOA
+*             @arg GPIOB
+*             @arg GPIOC
+* @param  pin  GPIO引脚
+*             @arg GPIO_PIN_0
+*             @arg GPIO_PIN_1
+*             @arg ...
+*             @arg GPIO_PIN_7
+* @note   仅支持单个引脚
+* @retval bool GPIO引脚输入状态
+*             @arg true  表示高电平
+*             @arg false 表示低电平
+*/
+__STATIC_INLINE bool std_gpio_get_input_pin(GPIO_t* gpiox, uint32_t pin)
+{
+    return ((gpiox->IDR & (pin)) == (pin));
+}
+
+/**
+* @brief  读取GPIO引脚输出状态
+* @param  gpiox GPIO外设
+*             @arg GPIOA
+*             @arg GPIOB
+*             @arg GPIOC
+* @param  pin GPIO引脚
+*             @arg GPIO_PIN_0
+*             @arg GPIO_PIN_1
+*             @arg ...
+*             @arg GPIO_PIN_7
+* @note   仅支持单个引脚
+* @retval bool GPIO引脚输出状态
+*             @arg true  表示高电平
+*             @arg false 表示低电平
+*/
+__STATIC_INLINE bool std_gpio_get_output_pin(GPIO_t* gpiox, uint32_t pin)
+{
+    return ((gpiox->ODR & (pin)) == (pin));
+}
+
+/**
+* @brief  读取GPIO端口输入数据
+* @param  gpiox GPIO外设
+*             @arg GPIOA
+*             @arg GPIOB
+*             @arg GPIOC
+* @retval uint32_t GPIO端口输入数据
+*/
+__STATIC_INLINE uint32_t std_gpio_read_input_port(GPIO_t* gpiox)
+{
+    return (gpiox->IDR);
+}
+
+/**
+* @brief  读取GPIO端口输出数据
+* @param  gpiox GPIO外设
+*             @arg GPIOA
+*             @arg GPIOB
+*             @arg GPIOC
+* @retval uint32_t GPIO端口输出数据
+*/
+__STATIC_INLINE uint32_t std_gpio_read_output_port(GPIO_t* gpiox)
+{
+    return (gpiox->ODR);
+}
+
+/**
+* @brief  写入GPIO端口输出数据
+* @param  gpiox GPIO外设
+*             @arg GPIOA
+*             @arg GPIOB
+*             @arg GPIOC
+* @param  value 输出数据
+* @retval 无
+*/
+__STATIC_INLINE void std_gpio_write_output_port(GPIO_t* gpiox, uint32_t value)
+{
+    gpiox->ODR = value;
+}
+
+/**
+* @brief  设置GPIO输出高电平
+* @param  gpiox GPIO外设
+*             @arg GPIOA
+*             @arg GPIOB
+*             @arg GPIOC
+* @param  pin_mask GPIO引脚组合
+*             @arg GPIO_PIN_0
+*             @arg GPIO_PIN_1
+*             @arg ...
+*             @arg GPIO_PIN_7
+* @retval 无
+*/
+__STATIC_INLINE void std_gpio_set_pin(GPIO_t* gpiox, uint32_t pin_mask)
+{
+    gpiox->BSR = pin_mask;
+}
+
+/**
+* @brief  设置GPIO输出低电平
+* @param  gpiox GPIO外设
+*             @arg GPIOA
+*             @arg GPIOB
+*             @arg GPIOC
+* @param  pin_mask  GPIO引脚组合
+*             @arg GPIO_PIN_0
+*             @arg GPIO_PIN_1
+*             @arg ...
+*             @arg GPIO_PIN_7
+* @retval 无
+*/
+__STATIC_INLINE void std_gpio_reset_pin(GPIO_t* gpiox, uint32_t pin_mask)
+{
+    gpiox->BR = pin_mask;
+}
+
+/**
+* @brief  切换GPIO端口高/低电平
+* @param  gpiox GPIO外设
+*             @arg GPIOA
+*             @arg GPIOB
+*             @arg GPIOC
+* @param  pin_mask  GPIO引脚组合
+*             @arg GPIO_PIN_0
+*             @arg GPIO_PIN_1
+*             @arg ...
+*             @arg GPIO_PIN_7
+* @retval 无
+*/
+__STATIC_INLINE void std_gpio_toggle_pin(GPIO_t* gpiox, uint32_t pin_mask)
+{
+    gpiox->ODR ^= pin_mask;
+}
+
+void std_gpio_init(GPIO_t* gpiox, std_gpio_init_t* gpio_init_param);
+void std_gpio_deinit(GPIO_t* gpiox);
+void std_gpio_struct_init(std_gpio_init_t* gpio_init_struct);
+
+/** 
+* @} 
+*/
+
+
+#ifdef __cplusplus
+}
+#endif
+
+/**
+* @} 
+*/  
+
+/**
+* @}
+*/
+
+#endif /* CIU32F003_STD_GPIO_H */
+
+

+ 342 - 0
CIU32F003_LIB/Include/ciu32f003_std_i2c(1).h

@@ -0,0 +1,342 @@
+/************************************************************************************************/
+/**
+* @file               ciu32f003_std_i2c.h
+* @author             MCU Ecosystem Development Team
+* @brief              I2C STD库驱动头文件。
+*                     提供I2C相关的STD库操作函数声明、数据类型以及常量的定义。                         
+*                     
+*
+**************************************************************************************************
+* @attention
+* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
+*
+**************************************************************************************************
+*/
+
+/* 避免头文件重复引用 */
+#ifndef CIU32F003_STD_I2C_H
+#define CIU32F003_STD_I2C_H
+
+/************************************************************************************************/
+/** 
+* @addtogroup CIU32F003_STD_Driver
+* @{
+*/
+
+/**
+* @defgroup I2C I2C
+* @brief I2C接口的STD库驱动
+* @{
+*/
+/************************************************************************************************/
+
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/*------------------------------------includes--------------------------------------------------*/
+#include "ciu32f003_std_common.h"
+
+/*--------------------------------------------define--------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @defgroup I2C_Constants I2C Constants
+* @brief    I2C常量定义及宏定义
+* @{
+*
+*/
+/************************************************************************************************/
+/* 数字滤波器配置 */
+#define I2C_DIGITALFILTER_DISABLE       I2C_CR1_DNF_DISABLE         /**< 数字滤波器禁止             */
+#define I2C_DIGITALFILTER_1CLK          I2C_CR1_DNF_1CLK            /**< 滤除小于1个I2C_KCLK的噪声  */
+#define I2C_DIGITALFILTER_2CLK          I2C_CR1_DNF_2CLK            /**< 滤除小于2个I2C_KCLK的噪声  */
+#define I2C_DIGITALFILTER_3CLK          I2C_CR1_DNF_3CLK            /**< 滤除小于3个I2C_KCLK的噪声  */
+#define I2C_DIGITALFILTER_4CLK          I2C_CR1_DNF_4CLK            /**< 滤除小于4个I2C_KCLK的噪声  */
+#define I2C_DIGITALFILTER_5CLK          I2C_CR1_DNF_5CLK            /**< 滤除小于5个I2C_KCLK的噪声  */
+#define I2C_DIGITALFILTER_6CLK          I2C_CR1_DNF_6CLK            /**< 滤除小于6个I2C_KCLK的噪声  */
+#define I2C_DIGITALFILTER_7CLK          I2C_CR1_DNF_7CLK            /**< 滤除小于7个I2C_KCLK的噪声  */
+#define I2C_DIGITALFILTER_8CLK          I2C_CR1_DNF_8CLK            /**< 滤除小于8个I2C_KCLK的噪声  */
+#define I2C_DIGITALFILTER_9CLK          I2C_CR1_DNF_9CLK            /**< 滤除小于9个I2C_KCLK的噪声  */
+#define I2C_DIGITALFILTER_10CLK         I2C_CR1_DNF_10CLK           /**< 滤除小于10个I2C_KCLK的噪声 */
+#define I2C_DIGITALFILTER_11CLK         I2C_CR1_DNF_11CLK           /**< 滤除小于11个I2C_KCLK的噪声 */
+#define I2C_DIGITALFILTER_12CLK         I2C_CR1_DNF_12CLK           /**< 滤除小于12个I2C_KCLK的噪声 */
+#define I2C_DIGITALFILTER_13CLK         I2C_CR1_DNF_13CLK           /**< 滤除小于13个I2C_KCLK的噪声 */
+#define I2C_DIGITALFILTER_14CLK         I2C_CR1_DNF_14CLK           /**< 滤除小于14个I2C_KCLK的噪声 */
+#define I2C_DIGITALFILTER_15CLK         I2C_CR1_DNF_15CLK           /**< 滤除小于15个I2C_KCLK的噪声 */
+
+/* I2C 中断源配置 */
+#define I2C_INTERRUPT_ERR               I2C_CR1_ERRIE               /**< 错误中断        */
+#define I2C_INTERRUPT_BUF               I2C_CR1_BUFIE               /**< 缓冲器中断      */
+#define I2C_INTERRUPT_EVT               I2C_CR1_EVTIE               /**< 事件中断        */
+
+/* I2C 状态标志位 */
+#define I2C_FLAG_TXE                    I2C_ISR_TXE                 /**< 发送数据寄存器为空标志    */
+#define I2C_FLAG_TXIS                   I2C_ISR_TXIS                /**< 发送中断状态标志          */
+#define I2C_FLAG_RXNE                   I2C_ISR_RXNE                /**< 接收数据寄存器非空标志    */
+#define I2C_FLAG_ADDR                   I2C_ISR_ADDR                /**< 地址匹配标志              */
+#define I2C_FLAG_NACK                   I2C_ISR_NACKF               /**< 接收NACK标志              */
+#define I2C_FLAG_STOP                   I2C_ISR_STOPF               /**< 停止位检测标志            */
+#define I2C_FLAG_BERR                   I2C_ISR_BERR                /**< 总线错误标志              */
+#define I2C_FLAG_OVR                    I2C_ISR_OVR                 /**< 溢出标志                  */
+#define I2C_FLAG_BUSY                   I2C_ISR_BUSY                /**< 总线被占用标志            */
+#define I2C_FLAG_DIR                    I2C_ISR_DIR                 /**< 数据传输方向标志          */
+
+/* I2C 清除状态位 */
+#define I2C_CLEAR_ADDR                  I2C_ICR_ADDRCF              /**< 清除地址匹配标志          */
+#define I2C_CLEAR_NACK                  I2C_ICR_NACKCF              /**< 清除NACK标志              */
+#define I2C_CLEAR_STOP                  I2C_ICR_STOPCF              /**< 清除停止位检测标志        */
+#define I2C_CLEAR_BERR                  I2C_ICR_BERRCF              /**< 清除总线错误标志          */
+#define I2C_CLEAR_OVR                   I2C_ICR_OVRCF               /**< 清除溢出标志              */
+
+/* I2C传输方向 */
+#define I2C_DIR_RX                      (0x00000000U)               /**< I2C接收数据               */
+#define I2C_DIR_TX                      I2C_ISR_DIR                 /**< I2C发送数据               */
+
+/* I2C 数据传输方向配置 */
+#define I2C_REQUEST_WRITE               (0x00000000U)               /**< 写请求     */
+#define I2C_REQUEST_READ                I2C_CR2_RD_WRN              /**< 读请求     */
+
+/** 
+* @} 
+*/
+
+/*-------------------------------------------functions------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @defgroup I2C_External_Functions I2C External Functions
+* @brief    I2C对外函数
+* @{
+*
+*/
+/************************************************************************************************/
+/** 
+* @brief  使能I2C接口
+* @retval 无
+*/
+__STATIC_INLINE void std_i2c_enable(void)
+{
+    I2C1->CR1 |= I2C_CR1_PE;
+}
+
+
+/** 
+* @brief  禁止I2C接口
+* @retval 无
+*/
+__STATIC_INLINE void std_i2c_disable(void)
+{
+    I2C1->CR1 &= (~I2C_CR1_PE);
+}
+
+
+/** 
+* @brief  配置数字滤波器
+* @param  digital_filter 数字滤波器配置参数
+*             @arg I2C_DIGITALFILTER_DISABLE: 禁止数字滤波器
+*             @arg I2C_DIGITALFILTER_1CLK:    滤波脉宽小于1 * I2C_KCLK
+*             @arg I2C_DIGITALFILTER_2CLK:    滤波脉宽小于2 * I2C_KCLK
+*             @arg ...
+*             @arg I2C_DIGITALFILTER_15CLK:   滤波脉宽小于15 * I2C_KCLK
+* @note   滤波器配置只能在I2C禁止的状态下条件下有效
+* @retval 无
+*/
+__STATIC_INLINE void std_i2c_digital_filter_config(uint32_t digital_filter)
+{
+    MODIFY_REG(I2C1->CR1, I2C_CR1_DNF, digital_filter);
+}
+
+
+/** 
+* @brief  I2C从模式时钟延长功能开启
+* @retval 无
+*/
+__STATIC_INLINE void std_i2c_clock_stretch_enable(void)
+{
+    I2C1->CR1 &= (~I2C_CR1_NOSTRETCH);
+}
+
+
+/** 
+* @brief  I2C从模式时钟延长功能禁止
+* @retval 无
+*/
+__STATIC_INLINE void std_i2c_clock_stretch_disable(void)
+{
+    I2C1->CR1 |= I2C_CR1_NOSTRETCH;
+}
+
+
+/** 
+* @brief  I2C广播地址应答使能
+* @retval 无
+*/
+__STATIC_INLINE void std_i2c_general_call_address_enable(void)
+{
+    I2C1->CR1 |= I2C_CR1_GCEN;
+}
+
+
+/** 
+* @brief  I2C广播地址应答禁止
+* @retval 无
+*/
+__STATIC_INLINE void std_i2c_general_call_address_disable(void)
+{
+    I2C1->CR1 &= (~I2C_CR1_GCEN);
+}
+
+
+/** 
+* @brief  设置I2C从模式地址1
+* @param  dev_address I2C设备地址1(该变量的范围在0x0~0x7F之间)
+* @retval 无
+*/
+__STATIC_INLINE void std_i2c_device_address1_config(uint32_t dev_address)
+{
+    I2C1->ADDR1 = dev_address;
+}
+
+
+/** 
+* @brief  使能I2C中断
+* @param  interrupt 使能I2C中断源选择
+*             @arg I2C_INTERRUPT_ERR:  I2C错误中断
+*             @arg I2C_INTERRUPT_BUF:  I2C缓冲器中断
+*             @arg I2C_INTERRUPT_EVT:  I2C事件中断
+* @retval 无
+*/
+__STATIC_INLINE void std_i2c_interrupt_enable(uint32_t interrupt)
+{
+    I2C1->CR1 |= interrupt;
+}
+
+
+/** 
+* @brief  禁止I2C中断
+* @param  interrupt I2C中断选择
+*             @arg I2C_INTERRUPT_ERR:  I2C错误中断
+*             @arg I2C_INTERRUPT_BUF:  I2C缓冲器中断
+*             @arg I2C_INTERRUPT_EVT:  I2C事件中断
+* @retval 无
+*/
+__STATIC_INLINE void std_i2c_interrupt_disable(uint32_t interrupt)
+{
+    I2C1->CR1 &= (~interrupt);
+}
+
+
+/** 
+* @brief  获取I2C中断使能状态
+* @param  interrupt I2C中断选择
+*             @arg I2C_INTERRUPT_ERR:  I2C错误中断
+*             @arg I2C_INTERRUPT_BUF:  I2C缓冲器中断
+*             @arg I2C_INTERRUPT_EVT:  I2C事件中断
+* @retval uint32_t 返回选择的I2C中断使能状态
+*             @arg 非0: 使能
+*             @arg 0:   禁止
+*/
+__STATIC_INLINE uint32_t std_i2c_get_interrupt_enable(uint32_t interrupt)
+{
+    return (I2C1->CR1 & interrupt);
+}
+
+
+/** 
+* @brief  获取I2C状态标志位或数据传输方向
+* @param  flag I2C状态标志位选择
+*             @arg I2C_FLAG_TXE:      I2C发送数据寄存器为空
+*             @arg I2C_FLAG_TXIS:     I2C发送中断状态
+*             @arg I2C_FLAG_RXNE:     I2C接收数据寄存器非空
+*             @arg ...
+*             @arg I2C_FLAG_DIR:      I2C数据传输方向标志
+* @retval uint32_t 返回选择的I2C状态标志位状态
+*             @arg 非0: 标志位置位
+*             @arg 0:   标志位清除
+*/
+__STATIC_INLINE uint32_t std_i2c_get_flag(uint32_t flag)
+{
+    return (I2C1->ISR & flag);
+}
+
+
+/** 
+* @brief  清除I2C状态标志位
+* @param  flag I2C状态标志位选择
+*             @arg I2C_CLEAR_ADDR:     清除ADDR标志
+*             @arg I2C_CLEAR_NACK:     清除NACKF标志
+*             @arg I2C_CLEAR_STOP:     清除STOPF标志
+*             @arg I2C_CLEAR_BERR:     清除BERR标志
+*             @arg I2C_CLEAR_OVR:      清除OVR标志
+* @retval 无
+*/
+__STATIC_INLINE void std_i2c_clear_flag(uint32_t flag)
+{
+    I2C1->ICR = flag;
+}
+
+
+/** 
+* @brief  配置从模式下地址匹配或接收下个数据时返回NACK应答
+* @retval 无
+*/
+__STATIC_INLINE void std_i2c_set_next_data_nack(void)
+{
+    I2C1->CR2 = I2C_CR2_NACK;
+}
+
+
+/** 
+* @brief  读数据寄存器
+* @retval uint8_t 接收数据寄存器中的值(该值范围为0x00~0xFF)
+*/
+__STATIC_INLINE uint8_t std_i2c_receive_byte(void)
+{
+    return (uint8_t)(I2C1->RDR);
+}
+
+
+/** 
+* @brief  写数据寄存器
+* @param  send_data 写入I2C TDR寄存器中的值(该变量范围为0x00~0xFF)
+* @retval 无
+*/
+__STATIC_INLINE void std_i2c_transmit_byte(uint8_t send_data)
+{
+    I2C1->TDR = send_data;
+}
+
+
+/** 
+* @brief  清除发送数据寄存器
+* @retval 无
+*/
+__STATIC_INLINE void std_i2c_clear_tx_data(void)
+{
+    I2C1->ISR = I2C_ISR_TXE;
+}
+
+
+/* I2C去初始化函数 */
+void std_i2c_deinit(void);
+
+/** 
+* @} 
+*/
+
+
+#ifdef __cplusplus
+}
+#endif
+
+/**
+* @} 
+*/  
+
+/**
+* @}
+*/
+
+#endif /* CIU32F003_STD_I2C_H */

+ 342 - 0
CIU32F003_LIB/Include/ciu32f003_std_i2c(2).h

@@ -0,0 +1,342 @@
+/************************************************************************************************/
+/**
+* @file               ciu32f003_std_i2c.h
+* @author             MCU Ecosystem Development Team
+* @brief              I2C STD库驱动头文件。
+*                     提供I2C相关的STD库操作函数声明、数据类型以及常量的定义。                         
+*                     
+*
+**************************************************************************************************
+* @attention
+* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
+*
+**************************************************************************************************
+*/
+
+/* 避免头文件重复引用 */
+#ifndef CIU32F003_STD_I2C_H
+#define CIU32F003_STD_I2C_H
+
+/************************************************************************************************/
+/** 
+* @addtogroup CIU32F003_STD_Driver
+* @{
+*/
+
+/**
+* @defgroup I2C I2C
+* @brief I2C接口的STD库驱动
+* @{
+*/
+/************************************************************************************************/
+
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/*------------------------------------includes--------------------------------------------------*/
+#include "ciu32f003_std_common.h"
+
+/*--------------------------------------------define--------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @defgroup I2C_Constants I2C Constants
+* @brief    I2C常量定义及宏定义
+* @{
+*
+*/
+/************************************************************************************************/
+/* 数字滤波器配置 */
+#define I2C_DIGITALFILTER_DISABLE       I2C_CR1_DNF_DISABLE         /**< 数字滤波器禁止             */
+#define I2C_DIGITALFILTER_1CLK          I2C_CR1_DNF_1CLK            /**< 滤除小于1个I2C_KCLK的噪声  */
+#define I2C_DIGITALFILTER_2CLK          I2C_CR1_DNF_2CLK            /**< 滤除小于2个I2C_KCLK的噪声  */
+#define I2C_DIGITALFILTER_3CLK          I2C_CR1_DNF_3CLK            /**< 滤除小于3个I2C_KCLK的噪声  */
+#define I2C_DIGITALFILTER_4CLK          I2C_CR1_DNF_4CLK            /**< 滤除小于4个I2C_KCLK的噪声  */
+#define I2C_DIGITALFILTER_5CLK          I2C_CR1_DNF_5CLK            /**< 滤除小于5个I2C_KCLK的噪声  */
+#define I2C_DIGITALFILTER_6CLK          I2C_CR1_DNF_6CLK            /**< 滤除小于6个I2C_KCLK的噪声  */
+#define I2C_DIGITALFILTER_7CLK          I2C_CR1_DNF_7CLK            /**< 滤除小于7个I2C_KCLK的噪声  */
+#define I2C_DIGITALFILTER_8CLK          I2C_CR1_DNF_8CLK            /**< 滤除小于8个I2C_KCLK的噪声  */
+#define I2C_DIGITALFILTER_9CLK          I2C_CR1_DNF_9CLK            /**< 滤除小于9个I2C_KCLK的噪声  */
+#define I2C_DIGITALFILTER_10CLK         I2C_CR1_DNF_10CLK           /**< 滤除小于10个I2C_KCLK的噪声 */
+#define I2C_DIGITALFILTER_11CLK         I2C_CR1_DNF_11CLK           /**< 滤除小于11个I2C_KCLK的噪声 */
+#define I2C_DIGITALFILTER_12CLK         I2C_CR1_DNF_12CLK           /**< 滤除小于12个I2C_KCLK的噪声 */
+#define I2C_DIGITALFILTER_13CLK         I2C_CR1_DNF_13CLK           /**< 滤除小于13个I2C_KCLK的噪声 */
+#define I2C_DIGITALFILTER_14CLK         I2C_CR1_DNF_14CLK           /**< 滤除小于14个I2C_KCLK的噪声 */
+#define I2C_DIGITALFILTER_15CLK         I2C_CR1_DNF_15CLK           /**< 滤除小于15个I2C_KCLK的噪声 */
+
+/* I2C 中断源配置 */
+#define I2C_INTERRUPT_ERR               I2C_CR1_ERRIE               /**< 错误中断        */
+#define I2C_INTERRUPT_BUF               I2C_CR1_BUFIE               /**< 缓冲器中断      */
+#define I2C_INTERRUPT_EVT               I2C_CR1_EVTIE               /**< 事件中断        */
+
+/* I2C 状态标志位 */
+#define I2C_FLAG_TXE                    I2C_ISR_TXE                 /**< 发送数据寄存器为空标志    */
+#define I2C_FLAG_TXIS                   I2C_ISR_TXIS                /**< 发送中断状态标志          */
+#define I2C_FLAG_RXNE                   I2C_ISR_RXNE                /**< 接收数据寄存器非空标志    */
+#define I2C_FLAG_ADDR                   I2C_ISR_ADDR                /**< 地址匹配标志              */
+#define I2C_FLAG_NACK                   I2C_ISR_NACKF               /**< 接收NACK标志              */
+#define I2C_FLAG_STOP                   I2C_ISR_STOPF               /**< 停止位检测标志            */
+#define I2C_FLAG_BERR                   I2C_ISR_BERR                /**< 总线错误标志              */
+#define I2C_FLAG_OVR                    I2C_ISR_OVR                 /**< 溢出标志                  */
+#define I2C_FLAG_BUSY                   I2C_ISR_BUSY                /**< 总线被占用标志            */
+#define I2C_FLAG_DIR                    I2C_ISR_DIR                 /**< 数据传输方向标志          */
+
+/* I2C 清除状态位 */
+#define I2C_CLEAR_ADDR                  I2C_ICR_ADDRCF              /**< 清除地址匹配标志          */
+#define I2C_CLEAR_NACK                  I2C_ICR_NACKCF              /**< 清除NACK标志              */
+#define I2C_CLEAR_STOP                  I2C_ICR_STOPCF              /**< 清除停止位检测标志        */
+#define I2C_CLEAR_BERR                  I2C_ICR_BERRCF              /**< 清除总线错误标志          */
+#define I2C_CLEAR_OVR                   I2C_ICR_OVRCF               /**< 清除溢出标志              */
+
+/* I2C传输方向 */
+#define I2C_DIR_RX                      (0x00000000U)               /**< I2C接收数据               */
+#define I2C_DIR_TX                      I2C_ISR_DIR                 /**< I2C发送数据               */
+
+/* I2C 数据传输方向配置 */
+#define I2C_REQUEST_WRITE               (0x00000000U)               /**< 写请求     */
+#define I2C_REQUEST_READ                I2C_CR2_RD_WRN              /**< 读请求     */
+
+/** 
+* @} 
+*/
+
+/*-------------------------------------------functions------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @defgroup I2C_External_Functions I2C External Functions
+* @brief    I2C对外函数
+* @{
+*
+*/
+/************************************************************************************************/
+/** 
+* @brief  使能I2C接口
+* @retval 无
+*/
+__STATIC_INLINE void std_i2c_enable(void)
+{
+    I2C1->CR1 |= I2C_CR1_PE;
+}
+
+
+/** 
+* @brief  禁止I2C接口
+* @retval 无
+*/
+__STATIC_INLINE void std_i2c_disable(void)
+{
+    I2C1->CR1 &= (~I2C_CR1_PE);
+}
+
+
+/** 
+* @brief  配置数字滤波器
+* @param  digital_filter 数字滤波器配置参数
+*             @arg I2C_DIGITALFILTER_DISABLE: 禁止数字滤波器
+*             @arg I2C_DIGITALFILTER_1CLK:    滤波脉宽小于1 * I2C_KCLK
+*             @arg I2C_DIGITALFILTER_2CLK:    滤波脉宽小于2 * I2C_KCLK
+*             @arg ...
+*             @arg I2C_DIGITALFILTER_15CLK:   滤波脉宽小于15 * I2C_KCLK
+* @note   滤波器配置只能在I2C禁止的状态下条件下有效
+* @retval 无
+*/
+__STATIC_INLINE void std_i2c_digital_filter_config(uint32_t digital_filter)
+{
+    MODIFY_REG(I2C1->CR1, I2C_CR1_DNF, digital_filter);
+}
+
+
+/** 
+* @brief  I2C从模式时钟延长功能开启
+* @retval 无
+*/
+__STATIC_INLINE void std_i2c_clock_stretch_enable(void)
+{
+    I2C1->CR1 &= (~I2C_CR1_NOSTRETCH);
+}
+
+
+/** 
+* @brief  I2C从模式时钟延长功能禁止
+* @retval 无
+*/
+__STATIC_INLINE void std_i2c_clock_stretch_disable(void)
+{
+    I2C1->CR1 |= I2C_CR1_NOSTRETCH;
+}
+
+
+/** 
+* @brief  I2C广播地址应答使能
+* @retval 无
+*/
+__STATIC_INLINE void std_i2c_general_call_address_enable(void)
+{
+    I2C1->CR1 |= I2C_CR1_GCEN;
+}
+
+
+/** 
+* @brief  I2C广播地址应答禁止
+* @retval 无
+*/
+__STATIC_INLINE void std_i2c_general_call_address_disable(void)
+{
+    I2C1->CR1 &= (~I2C_CR1_GCEN);
+}
+
+
+/** 
+* @brief  设置I2C从模式地址1
+* @param  dev_address I2C设备地址1(该变量的范围在0x0~0x7F之间)
+* @retval 无
+*/
+__STATIC_INLINE void std_i2c_device_address1_config(uint32_t dev_address)
+{
+    I2C1->ADDR1 = dev_address;
+}
+
+
+/** 
+* @brief  使能I2C中断
+* @param  interrupt 使能I2C中断源选择
+*             @arg I2C_INTERRUPT_ERR:  I2C错误中断
+*             @arg I2C_INTERRUPT_BUF:  I2C缓冲器中断
+*             @arg I2C_INTERRUPT_EVT:  I2C事件中断
+* @retval 无
+*/
+__STATIC_INLINE void std_i2c_interrupt_enable(uint32_t interrupt)
+{
+    I2C1->CR1 |= interrupt;
+}
+
+
+/** 
+* @brief  禁止I2C中断
+* @param  interrupt I2C中断选择
+*             @arg I2C_INTERRUPT_ERR:  I2C错误中断
+*             @arg I2C_INTERRUPT_BUF:  I2C缓冲器中断
+*             @arg I2C_INTERRUPT_EVT:  I2C事件中断
+* @retval 无
+*/
+__STATIC_INLINE void std_i2c_interrupt_disable(uint32_t interrupt)
+{
+    I2C1->CR1 &= (~interrupt);
+}
+
+
+/** 
+* @brief  获取I2C中断使能状态
+* @param  interrupt I2C中断选择
+*             @arg I2C_INTERRUPT_ERR:  I2C错误中断
+*             @arg I2C_INTERRUPT_BUF:  I2C缓冲器中断
+*             @arg I2C_INTERRUPT_EVT:  I2C事件中断
+* @retval uint32_t 返回选择的I2C中断使能状态
+*             @arg 非0: 使能
+*             @arg 0:   禁止
+*/
+__STATIC_INLINE uint32_t std_i2c_get_interrupt_enable(uint32_t interrupt)
+{
+    return (I2C1->CR1 & interrupt);
+}
+
+
+/** 
+* @brief  获取I2C状态标志位或数据传输方向
+* @param  flag I2C状态标志位选择
+*             @arg I2C_FLAG_TXE:      I2C发送数据寄存器为空
+*             @arg I2C_FLAG_TXIS:     I2C发送中断状态
+*             @arg I2C_FLAG_RXNE:     I2C接收数据寄存器非空
+*             @arg ...
+*             @arg I2C_FLAG_DIR:      I2C数据传输方向标志
+* @retval uint32_t 返回选择的I2C状态标志位状态
+*             @arg 非0: 标志位置位
+*             @arg 0:   标志位清除
+*/
+__STATIC_INLINE uint32_t std_i2c_get_flag(uint32_t flag)
+{
+    return (I2C1->ISR & flag);
+}
+
+
+/** 
+* @brief  清除I2C状态标志位
+* @param  flag I2C状态标志位选择
+*             @arg I2C_CLEAR_ADDR:     清除ADDR标志
+*             @arg I2C_CLEAR_NACK:     清除NACKF标志
+*             @arg I2C_CLEAR_STOP:     清除STOPF标志
+*             @arg I2C_CLEAR_BERR:     清除BERR标志
+*             @arg I2C_CLEAR_OVR:      清除OVR标志
+* @retval 无
+*/
+__STATIC_INLINE void std_i2c_clear_flag(uint32_t flag)
+{
+    I2C1->ICR = flag;
+}
+
+
+/** 
+* @brief  配置从模式下地址匹配或接收下个数据时返回NACK应答
+* @retval 无
+*/
+__STATIC_INLINE void std_i2c_set_next_data_nack(void)
+{
+    I2C1->CR2 = I2C_CR2_NACK;
+}
+
+
+/** 
+* @brief  读数据寄存器
+* @retval uint8_t 接收数据寄存器中的值(该值范围为0x00~0xFF)
+*/
+__STATIC_INLINE uint8_t std_i2c_receive_byte(void)
+{
+    return (uint8_t)(I2C1->RDR);
+}
+
+
+/** 
+* @brief  写数据寄存器
+* @param  send_data 写入I2C TDR寄存器中的值(该变量范围为0x00~0xFF)
+* @retval 无
+*/
+__STATIC_INLINE void std_i2c_transmit_byte(uint8_t send_data)
+{
+    I2C1->TDR = send_data;
+}
+
+
+/** 
+* @brief  清除发送数据寄存器
+* @retval 无
+*/
+__STATIC_INLINE void std_i2c_clear_tx_data(void)
+{
+    I2C1->ISR = I2C_ISR_TXE;
+}
+
+
+/* I2C去初始化函数 */
+void std_i2c_deinit(void);
+
+/** 
+* @} 
+*/
+
+
+#ifdef __cplusplus
+}
+#endif
+
+/**
+* @} 
+*/  
+
+/**
+* @}
+*/
+
+#endif /* CIU32F003_STD_I2C_H */

+ 342 - 0
CIU32F003_LIB/Include/ciu32f003_std_i2c(3).h

@@ -0,0 +1,342 @@
+/************************************************************************************************/
+/**
+* @file               ciu32f003_std_i2c.h
+* @author             MCU Ecosystem Development Team
+* @brief              I2C STD库驱动头文件。
+*                     提供I2C相关的STD库操作函数声明、数据类型以及常量的定义。                         
+*                     
+*
+**************************************************************************************************
+* @attention
+* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
+*
+**************************************************************************************************
+*/
+
+/* 避免头文件重复引用 */
+#ifndef CIU32F003_STD_I2C_H
+#define CIU32F003_STD_I2C_H
+
+/************************************************************************************************/
+/** 
+* @addtogroup CIU32F003_STD_Driver
+* @{
+*/
+
+/**
+* @defgroup I2C I2C
+* @brief I2C接口的STD库驱动
+* @{
+*/
+/************************************************************************************************/
+
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/*------------------------------------includes--------------------------------------------------*/
+#include "ciu32f003_std_common.h"
+
+/*--------------------------------------------define--------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @defgroup I2C_Constants I2C Constants
+* @brief    I2C常量定义及宏定义
+* @{
+*
+*/
+/************************************************************************************************/
+/* 数字滤波器配置 */
+#define I2C_DIGITALFILTER_DISABLE       I2C_CR1_DNF_DISABLE         /**< 数字滤波器禁止             */
+#define I2C_DIGITALFILTER_1CLK          I2C_CR1_DNF_1CLK            /**< 滤除小于1个I2C_KCLK的噪声  */
+#define I2C_DIGITALFILTER_2CLK          I2C_CR1_DNF_2CLK            /**< 滤除小于2个I2C_KCLK的噪声  */
+#define I2C_DIGITALFILTER_3CLK          I2C_CR1_DNF_3CLK            /**< 滤除小于3个I2C_KCLK的噪声  */
+#define I2C_DIGITALFILTER_4CLK          I2C_CR1_DNF_4CLK            /**< 滤除小于4个I2C_KCLK的噪声  */
+#define I2C_DIGITALFILTER_5CLK          I2C_CR1_DNF_5CLK            /**< 滤除小于5个I2C_KCLK的噪声  */
+#define I2C_DIGITALFILTER_6CLK          I2C_CR1_DNF_6CLK            /**< 滤除小于6个I2C_KCLK的噪声  */
+#define I2C_DIGITALFILTER_7CLK          I2C_CR1_DNF_7CLK            /**< 滤除小于7个I2C_KCLK的噪声  */
+#define I2C_DIGITALFILTER_8CLK          I2C_CR1_DNF_8CLK            /**< 滤除小于8个I2C_KCLK的噪声  */
+#define I2C_DIGITALFILTER_9CLK          I2C_CR1_DNF_9CLK            /**< 滤除小于9个I2C_KCLK的噪声  */
+#define I2C_DIGITALFILTER_10CLK         I2C_CR1_DNF_10CLK           /**< 滤除小于10个I2C_KCLK的噪声 */
+#define I2C_DIGITALFILTER_11CLK         I2C_CR1_DNF_11CLK           /**< 滤除小于11个I2C_KCLK的噪声 */
+#define I2C_DIGITALFILTER_12CLK         I2C_CR1_DNF_12CLK           /**< 滤除小于12个I2C_KCLK的噪声 */
+#define I2C_DIGITALFILTER_13CLK         I2C_CR1_DNF_13CLK           /**< 滤除小于13个I2C_KCLK的噪声 */
+#define I2C_DIGITALFILTER_14CLK         I2C_CR1_DNF_14CLK           /**< 滤除小于14个I2C_KCLK的噪声 */
+#define I2C_DIGITALFILTER_15CLK         I2C_CR1_DNF_15CLK           /**< 滤除小于15个I2C_KCLK的噪声 */
+
+/* I2C 中断源配置 */
+#define I2C_INTERRUPT_ERR               I2C_CR1_ERRIE               /**< 错误中断        */
+#define I2C_INTERRUPT_BUF               I2C_CR1_BUFIE               /**< 缓冲器中断      */
+#define I2C_INTERRUPT_EVT               I2C_CR1_EVTIE               /**< 事件中断        */
+
+/* I2C 状态标志位 */
+#define I2C_FLAG_TXE                    I2C_ISR_TXE                 /**< 发送数据寄存器为空标志    */
+#define I2C_FLAG_TXIS                   I2C_ISR_TXIS                /**< 发送中断状态标志          */
+#define I2C_FLAG_RXNE                   I2C_ISR_RXNE                /**< 接收数据寄存器非空标志    */
+#define I2C_FLAG_ADDR                   I2C_ISR_ADDR                /**< 地址匹配标志              */
+#define I2C_FLAG_NACK                   I2C_ISR_NACKF               /**< 接收NACK标志              */
+#define I2C_FLAG_STOP                   I2C_ISR_STOPF               /**< 停止位检测标志            */
+#define I2C_FLAG_BERR                   I2C_ISR_BERR                /**< 总线错误标志              */
+#define I2C_FLAG_OVR                    I2C_ISR_OVR                 /**< 溢出标志                  */
+#define I2C_FLAG_BUSY                   I2C_ISR_BUSY                /**< 总线被占用标志            */
+#define I2C_FLAG_DIR                    I2C_ISR_DIR                 /**< 数据传输方向标志          */
+
+/* I2C 清除状态位 */
+#define I2C_CLEAR_ADDR                  I2C_ICR_ADDRCF              /**< 清除地址匹配标志          */
+#define I2C_CLEAR_NACK                  I2C_ICR_NACKCF              /**< 清除NACK标志              */
+#define I2C_CLEAR_STOP                  I2C_ICR_STOPCF              /**< 清除停止位检测标志        */
+#define I2C_CLEAR_BERR                  I2C_ICR_BERRCF              /**< 清除总线错误标志          */
+#define I2C_CLEAR_OVR                   I2C_ICR_OVRCF               /**< 清除溢出标志              */
+
+/* I2C传输方向 */
+#define I2C_DIR_RX                      (0x00000000U)               /**< I2C接收数据               */
+#define I2C_DIR_TX                      I2C_ISR_DIR                 /**< I2C发送数据               */
+
+/* I2C 数据传输方向配置 */
+#define I2C_REQUEST_WRITE               (0x00000000U)               /**< 写请求     */
+#define I2C_REQUEST_READ                I2C_CR2_RD_WRN              /**< 读请求     */
+
+/** 
+* @} 
+*/
+
+/*-------------------------------------------functions------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @defgroup I2C_External_Functions I2C External Functions
+* @brief    I2C对外函数
+* @{
+*
+*/
+/************************************************************************************************/
+/** 
+* @brief  使能I2C接口
+* @retval 无
+*/
+__STATIC_INLINE void std_i2c_enable(void)
+{
+    I2C1->CR1 |= I2C_CR1_PE;
+}
+
+
+/** 
+* @brief  禁止I2C接口
+* @retval 无
+*/
+__STATIC_INLINE void std_i2c_disable(void)
+{
+    I2C1->CR1 &= (~I2C_CR1_PE);
+}
+
+
+/** 
+* @brief  配置数字滤波器
+* @param  digital_filter 数字滤波器配置参数
+*             @arg I2C_DIGITALFILTER_DISABLE: 禁止数字滤波器
+*             @arg I2C_DIGITALFILTER_1CLK:    滤波脉宽小于1 * I2C_KCLK
+*             @arg I2C_DIGITALFILTER_2CLK:    滤波脉宽小于2 * I2C_KCLK
+*             @arg ...
+*             @arg I2C_DIGITALFILTER_15CLK:   滤波脉宽小于15 * I2C_KCLK
+* @note   滤波器配置只能在I2C禁止的状态下条件下有效
+* @retval 无
+*/
+__STATIC_INLINE void std_i2c_digital_filter_config(uint32_t digital_filter)
+{
+    MODIFY_REG(I2C1->CR1, I2C_CR1_DNF, digital_filter);
+}
+
+
+/** 
+* @brief  I2C从模式时钟延长功能开启
+* @retval 无
+*/
+__STATIC_INLINE void std_i2c_clock_stretch_enable(void)
+{
+    I2C1->CR1 &= (~I2C_CR1_NOSTRETCH);
+}
+
+
+/** 
+* @brief  I2C从模式时钟延长功能禁止
+* @retval 无
+*/
+__STATIC_INLINE void std_i2c_clock_stretch_disable(void)
+{
+    I2C1->CR1 |= I2C_CR1_NOSTRETCH;
+}
+
+
+/** 
+* @brief  I2C广播地址应答使能
+* @retval 无
+*/
+__STATIC_INLINE void std_i2c_general_call_address_enable(void)
+{
+    I2C1->CR1 |= I2C_CR1_GCEN;
+}
+
+
+/** 
+* @brief  I2C广播地址应答禁止
+* @retval 无
+*/
+__STATIC_INLINE void std_i2c_general_call_address_disable(void)
+{
+    I2C1->CR1 &= (~I2C_CR1_GCEN);
+}
+
+
+/** 
+* @brief  设置I2C从模式地址1
+* @param  dev_address I2C设备地址1(该变量的范围在0x0~0x7F之间)
+* @retval 无
+*/
+__STATIC_INLINE void std_i2c_device_address1_config(uint32_t dev_address)
+{
+    I2C1->ADDR1 = dev_address;
+}
+
+
+/** 
+* @brief  使能I2C中断
+* @param  interrupt 使能I2C中断源选择
+*             @arg I2C_INTERRUPT_ERR:  I2C错误中断
+*             @arg I2C_INTERRUPT_BUF:  I2C缓冲器中断
+*             @arg I2C_INTERRUPT_EVT:  I2C事件中断
+* @retval 无
+*/
+__STATIC_INLINE void std_i2c_interrupt_enable(uint32_t interrupt)
+{
+    I2C1->CR1 |= interrupt;
+}
+
+
+/** 
+* @brief  禁止I2C中断
+* @param  interrupt I2C中断选择
+*             @arg I2C_INTERRUPT_ERR:  I2C错误中断
+*             @arg I2C_INTERRUPT_BUF:  I2C缓冲器中断
+*             @arg I2C_INTERRUPT_EVT:  I2C事件中断
+* @retval 无
+*/
+__STATIC_INLINE void std_i2c_interrupt_disable(uint32_t interrupt)
+{
+    I2C1->CR1 &= (~interrupt);
+}
+
+
+/** 
+* @brief  获取I2C中断使能状态
+* @param  interrupt I2C中断选择
+*             @arg I2C_INTERRUPT_ERR:  I2C错误中断
+*             @arg I2C_INTERRUPT_BUF:  I2C缓冲器中断
+*             @arg I2C_INTERRUPT_EVT:  I2C事件中断
+* @retval uint32_t 返回选择的I2C中断使能状态
+*             @arg 非0: 使能
+*             @arg 0:   禁止
+*/
+__STATIC_INLINE uint32_t std_i2c_get_interrupt_enable(uint32_t interrupt)
+{
+    return (I2C1->CR1 & interrupt);
+}
+
+
+/** 
+* @brief  获取I2C状态标志位或数据传输方向
+* @param  flag I2C状态标志位选择
+*             @arg I2C_FLAG_TXE:      I2C发送数据寄存器为空
+*             @arg I2C_FLAG_TXIS:     I2C发送中断状态
+*             @arg I2C_FLAG_RXNE:     I2C接收数据寄存器非空
+*             @arg ...
+*             @arg I2C_FLAG_DIR:      I2C数据传输方向标志
+* @retval uint32_t 返回选择的I2C状态标志位状态
+*             @arg 非0: 标志位置位
+*             @arg 0:   标志位清除
+*/
+__STATIC_INLINE uint32_t std_i2c_get_flag(uint32_t flag)
+{
+    return (I2C1->ISR & flag);
+}
+
+
+/** 
+* @brief  清除I2C状态标志位
+* @param  flag I2C状态标志位选择
+*             @arg I2C_CLEAR_ADDR:     清除ADDR标志
+*             @arg I2C_CLEAR_NACK:     清除NACKF标志
+*             @arg I2C_CLEAR_STOP:     清除STOPF标志
+*             @arg I2C_CLEAR_BERR:     清除BERR标志
+*             @arg I2C_CLEAR_OVR:      清除OVR标志
+* @retval 无
+*/
+__STATIC_INLINE void std_i2c_clear_flag(uint32_t flag)
+{
+    I2C1->ICR = flag;
+}
+
+
+/** 
+* @brief  配置从模式下地址匹配或接收下个数据时返回NACK应答
+* @retval 无
+*/
+__STATIC_INLINE void std_i2c_set_next_data_nack(void)
+{
+    I2C1->CR2 = I2C_CR2_NACK;
+}
+
+
+/** 
+* @brief  读数据寄存器
+* @retval uint8_t 接收数据寄存器中的值(该值范围为0x00~0xFF)
+*/
+__STATIC_INLINE uint8_t std_i2c_receive_byte(void)
+{
+    return (uint8_t)(I2C1->RDR);
+}
+
+
+/** 
+* @brief  写数据寄存器
+* @param  send_data 写入I2C TDR寄存器中的值(该变量范围为0x00~0xFF)
+* @retval 无
+*/
+__STATIC_INLINE void std_i2c_transmit_byte(uint8_t send_data)
+{
+    I2C1->TDR = send_data;
+}
+
+
+/** 
+* @brief  清除发送数据寄存器
+* @retval 无
+*/
+__STATIC_INLINE void std_i2c_clear_tx_data(void)
+{
+    I2C1->ISR = I2C_ISR_TXE;
+}
+
+
+/* I2C去初始化函数 */
+void std_i2c_deinit(void);
+
+/** 
+* @} 
+*/
+
+
+#ifdef __cplusplus
+}
+#endif
+
+/**
+* @} 
+*/  
+
+/**
+* @}
+*/
+
+#endif /* CIU32F003_STD_I2C_H */

+ 342 - 0
CIU32F003_LIB/Include/ciu32f003_std_i2c.h

@@ -0,0 +1,342 @@
+/************************************************************************************************/
+/**
+* @file               ciu32f003_std_i2c.h
+* @author             MCU Ecosystem Development Team
+* @brief              I2C STD库驱动头文件。
+*                     提供I2C相关的STD库操作函数声明、数据类型以及常量的定义。                         
+*                     
+*
+**************************************************************************************************
+* @attention
+* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
+*
+**************************************************************************************************
+*/
+
+/* 避免头文件重复引用 */
+#ifndef CIU32F003_STD_I2C_H
+#define CIU32F003_STD_I2C_H
+
+/************************************************************************************************/
+/** 
+* @addtogroup CIU32F003_STD_Driver
+* @{
+*/
+
+/**
+* @defgroup I2C I2C
+* @brief I2C接口的STD库驱动
+* @{
+*/
+/************************************************************************************************/
+
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/*------------------------------------includes--------------------------------------------------*/
+#include "ciu32f003_std_common.h"
+
+/*--------------------------------------------define--------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @defgroup I2C_Constants I2C Constants
+* @brief    I2C常量定义及宏定义
+* @{
+*
+*/
+/************************************************************************************************/
+/* 数字滤波器配置 */
+#define I2C_DIGITALFILTER_DISABLE       I2C_CR1_DNF_DISABLE         /**< 数字滤波器禁止             */
+#define I2C_DIGITALFILTER_1CLK          I2C_CR1_DNF_1CLK            /**< 滤除小于1个I2C_KCLK的噪声  */
+#define I2C_DIGITALFILTER_2CLK          I2C_CR1_DNF_2CLK            /**< 滤除小于2个I2C_KCLK的噪声  */
+#define I2C_DIGITALFILTER_3CLK          I2C_CR1_DNF_3CLK            /**< 滤除小于3个I2C_KCLK的噪声  */
+#define I2C_DIGITALFILTER_4CLK          I2C_CR1_DNF_4CLK            /**< 滤除小于4个I2C_KCLK的噪声  */
+#define I2C_DIGITALFILTER_5CLK          I2C_CR1_DNF_5CLK            /**< 滤除小于5个I2C_KCLK的噪声  */
+#define I2C_DIGITALFILTER_6CLK          I2C_CR1_DNF_6CLK            /**< 滤除小于6个I2C_KCLK的噪声  */
+#define I2C_DIGITALFILTER_7CLK          I2C_CR1_DNF_7CLK            /**< 滤除小于7个I2C_KCLK的噪声  */
+#define I2C_DIGITALFILTER_8CLK          I2C_CR1_DNF_8CLK            /**< 滤除小于8个I2C_KCLK的噪声  */
+#define I2C_DIGITALFILTER_9CLK          I2C_CR1_DNF_9CLK            /**< 滤除小于9个I2C_KCLK的噪声  */
+#define I2C_DIGITALFILTER_10CLK         I2C_CR1_DNF_10CLK           /**< 滤除小于10个I2C_KCLK的噪声 */
+#define I2C_DIGITALFILTER_11CLK         I2C_CR1_DNF_11CLK           /**< 滤除小于11个I2C_KCLK的噪声 */
+#define I2C_DIGITALFILTER_12CLK         I2C_CR1_DNF_12CLK           /**< 滤除小于12个I2C_KCLK的噪声 */
+#define I2C_DIGITALFILTER_13CLK         I2C_CR1_DNF_13CLK           /**< 滤除小于13个I2C_KCLK的噪声 */
+#define I2C_DIGITALFILTER_14CLK         I2C_CR1_DNF_14CLK           /**< 滤除小于14个I2C_KCLK的噪声 */
+#define I2C_DIGITALFILTER_15CLK         I2C_CR1_DNF_15CLK           /**< 滤除小于15个I2C_KCLK的噪声 */
+
+/* I2C 中断源配置 */
+#define I2C_INTERRUPT_ERR               I2C_CR1_ERRIE               /**< 错误中断        */
+#define I2C_INTERRUPT_BUF               I2C_CR1_BUFIE               /**< 缓冲器中断      */
+#define I2C_INTERRUPT_EVT               I2C_CR1_EVTIE               /**< 事件中断        */
+
+/* I2C 状态标志位 */
+#define I2C_FLAG_TXE                    I2C_ISR_TXE                 /**< 发送数据寄存器为空标志    */
+#define I2C_FLAG_TXIS                   I2C_ISR_TXIS                /**< 发送中断状态标志          */
+#define I2C_FLAG_RXNE                   I2C_ISR_RXNE                /**< 接收数据寄存器非空标志    */
+#define I2C_FLAG_ADDR                   I2C_ISR_ADDR                /**< 地址匹配标志              */
+#define I2C_FLAG_NACK                   I2C_ISR_NACKF               /**< 接收NACK标志              */
+#define I2C_FLAG_STOP                   I2C_ISR_STOPF               /**< 停止位检测标志            */
+#define I2C_FLAG_BERR                   I2C_ISR_BERR                /**< 总线错误标志              */
+#define I2C_FLAG_OVR                    I2C_ISR_OVR                 /**< 溢出标志                  */
+#define I2C_FLAG_BUSY                   I2C_ISR_BUSY                /**< 总线被占用标志            */
+#define I2C_FLAG_DIR                    I2C_ISR_DIR                 /**< 数据传输方向标志          */
+
+/* I2C 清除状态位 */
+#define I2C_CLEAR_ADDR                  I2C_ICR_ADDRCF              /**< 清除地址匹配标志          */
+#define I2C_CLEAR_NACK                  I2C_ICR_NACKCF              /**< 清除NACK标志              */
+#define I2C_CLEAR_STOP                  I2C_ICR_STOPCF              /**< 清除停止位检测标志        */
+#define I2C_CLEAR_BERR                  I2C_ICR_BERRCF              /**< 清除总线错误标志          */
+#define I2C_CLEAR_OVR                   I2C_ICR_OVRCF               /**< 清除溢出标志              */
+
+/* I2C传输方向 */
+#define I2C_DIR_RX                      (0x00000000U)               /**< I2C接收数据               */
+#define I2C_DIR_TX                      I2C_ISR_DIR                 /**< I2C发送数据               */
+
+/* I2C 数据传输方向配置 */
+#define I2C_REQUEST_WRITE               (0x00000000U)               /**< 写请求     */
+#define I2C_REQUEST_READ                I2C_CR2_RD_WRN              /**< 读请求     */
+
+/** 
+* @} 
+*/
+
+/*-------------------------------------------functions------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @defgroup I2C_External_Functions I2C External Functions
+* @brief    I2C对外函数
+* @{
+*
+*/
+/************************************************************************************************/
+/** 
+* @brief  使能I2C接口
+* @retval 无
+*/
+__STATIC_INLINE void std_i2c_enable(void)
+{
+    I2C1->CR1 |= I2C_CR1_PE;
+}
+
+
+/** 
+* @brief  禁止I2C接口
+* @retval 无
+*/
+__STATIC_INLINE void std_i2c_disable(void)
+{
+    I2C1->CR1 &= (~I2C_CR1_PE);
+}
+
+
+/** 
+* @brief  配置数字滤波器
+* @param  digital_filter 数字滤波器配置参数
+*             @arg I2C_DIGITALFILTER_DISABLE: 禁止数字滤波器
+*             @arg I2C_DIGITALFILTER_1CLK:    滤波脉宽小于1 * I2C_KCLK
+*             @arg I2C_DIGITALFILTER_2CLK:    滤波脉宽小于2 * I2C_KCLK
+*             @arg ...
+*             @arg I2C_DIGITALFILTER_15CLK:   滤波脉宽小于15 * I2C_KCLK
+* @note   滤波器配置只能在I2C禁止的状态下条件下有效
+* @retval 无
+*/
+__STATIC_INLINE void std_i2c_digital_filter_config(uint32_t digital_filter)
+{
+    MODIFY_REG(I2C1->CR1, I2C_CR1_DNF, digital_filter);
+}
+
+
+/** 
+* @brief  I2C从模式时钟延长功能开启
+* @retval 无
+*/
+__STATIC_INLINE void std_i2c_clock_stretch_enable(void)
+{
+    I2C1->CR1 &= (~I2C_CR1_NOSTRETCH);
+}
+
+
+/** 
+* @brief  I2C从模式时钟延长功能禁止
+* @retval 无
+*/
+__STATIC_INLINE void std_i2c_clock_stretch_disable(void)
+{
+    I2C1->CR1 |= I2C_CR1_NOSTRETCH;
+}
+
+
+/** 
+* @brief  I2C广播地址应答使能
+* @retval 无
+*/
+__STATIC_INLINE void std_i2c_general_call_address_enable(void)
+{
+    I2C1->CR1 |= I2C_CR1_GCEN;
+}
+
+
+/** 
+* @brief  I2C广播地址应答禁止
+* @retval 无
+*/
+__STATIC_INLINE void std_i2c_general_call_address_disable(void)
+{
+    I2C1->CR1 &= (~I2C_CR1_GCEN);
+}
+
+
+/** 
+* @brief  设置I2C从模式地址1
+* @param  dev_address I2C设备地址1(该变量的范围在0x0~0x7F之间)
+* @retval 无
+*/
+__STATIC_INLINE void std_i2c_device_address1_config(uint32_t dev_address)
+{
+    I2C1->ADDR1 = dev_address;
+}
+
+
+/** 
+* @brief  使能I2C中断
+* @param  interrupt 使能I2C中断源选择
+*             @arg I2C_INTERRUPT_ERR:  I2C错误中断
+*             @arg I2C_INTERRUPT_BUF:  I2C缓冲器中断
+*             @arg I2C_INTERRUPT_EVT:  I2C事件中断
+* @retval 无
+*/
+__STATIC_INLINE void std_i2c_interrupt_enable(uint32_t interrupt)
+{
+    I2C1->CR1 |= interrupt;
+}
+
+
+/** 
+* @brief  禁止I2C中断
+* @param  interrupt I2C中断选择
+*             @arg I2C_INTERRUPT_ERR:  I2C错误中断
+*             @arg I2C_INTERRUPT_BUF:  I2C缓冲器中断
+*             @arg I2C_INTERRUPT_EVT:  I2C事件中断
+* @retval 无
+*/
+__STATIC_INLINE void std_i2c_interrupt_disable(uint32_t interrupt)
+{
+    I2C1->CR1 &= (~interrupt);
+}
+
+
+/** 
+* @brief  获取I2C中断使能状态
+* @param  interrupt I2C中断选择
+*             @arg I2C_INTERRUPT_ERR:  I2C错误中断
+*             @arg I2C_INTERRUPT_BUF:  I2C缓冲器中断
+*             @arg I2C_INTERRUPT_EVT:  I2C事件中断
+* @retval uint32_t 返回选择的I2C中断使能状态
+*             @arg 非0: 使能
+*             @arg 0:   禁止
+*/
+__STATIC_INLINE uint32_t std_i2c_get_interrupt_enable(uint32_t interrupt)
+{
+    return (I2C1->CR1 & interrupt);
+}
+
+
+/** 
+* @brief  获取I2C状态标志位或数据传输方向
+* @param  flag I2C状态标志位选择
+*             @arg I2C_FLAG_TXE:      I2C发送数据寄存器为空
+*             @arg I2C_FLAG_TXIS:     I2C发送中断状态
+*             @arg I2C_FLAG_RXNE:     I2C接收数据寄存器非空
+*             @arg ...
+*             @arg I2C_FLAG_DIR:      I2C数据传输方向标志
+* @retval uint32_t 返回选择的I2C状态标志位状态
+*             @arg 非0: 标志位置位
+*             @arg 0:   标志位清除
+*/
+__STATIC_INLINE uint32_t std_i2c_get_flag(uint32_t flag)
+{
+    return (I2C1->ISR & flag);
+}
+
+
+/** 
+* @brief  清除I2C状态标志位
+* @param  flag I2C状态标志位选择
+*             @arg I2C_CLEAR_ADDR:     清除ADDR标志
+*             @arg I2C_CLEAR_NACK:     清除NACKF标志
+*             @arg I2C_CLEAR_STOP:     清除STOPF标志
+*             @arg I2C_CLEAR_BERR:     清除BERR标志
+*             @arg I2C_CLEAR_OVR:      清除OVR标志
+* @retval 无
+*/
+__STATIC_INLINE void std_i2c_clear_flag(uint32_t flag)
+{
+    I2C1->ICR = flag;
+}
+
+
+/** 
+* @brief  配置从模式下地址匹配或接收下个数据时返回NACK应答
+* @retval 无
+*/
+__STATIC_INLINE void std_i2c_set_next_data_nack(void)
+{
+    I2C1->CR2 = I2C_CR2_NACK;
+}
+
+
+/** 
+* @brief  读数据寄存器
+* @retval uint8_t 接收数据寄存器中的值(该值范围为0x00~0xFF)
+*/
+__STATIC_INLINE uint8_t std_i2c_receive_byte(void)
+{
+    return (uint8_t)(I2C1->RDR);
+}
+
+
+/** 
+* @brief  写数据寄存器
+* @param  send_data 写入I2C TDR寄存器中的值(该变量范围为0x00~0xFF)
+* @retval 无
+*/
+__STATIC_INLINE void std_i2c_transmit_byte(uint8_t send_data)
+{
+    I2C1->TDR = send_data;
+}
+
+
+/** 
+* @brief  清除发送数据寄存器
+* @retval 无
+*/
+__STATIC_INLINE void std_i2c_clear_tx_data(void)
+{
+    I2C1->ISR = I2C_ISR_TXE;
+}
+
+
+/* I2C去初始化函数 */
+void std_i2c_deinit(void);
+
+/** 
+* @} 
+*/
+
+
+#ifdef __cplusplus
+}
+#endif
+
+/**
+* @} 
+*/  
+
+/**
+* @}
+*/
+
+#endif /* CIU32F003_STD_I2C_H */

+ 140 - 0
CIU32F003_LIB/Include/ciu32f003_std_irtim(1).h

@@ -0,0 +1,140 @@
+/************************************************************************************************/
+/**
+* @file               ciu32f003_std_irtim.h
+* @author             MCU Ecosystem Development Team
+* @brief              IRTIM STD库驱动头文件。
+*                     提供IRTIM相关的STD库操作函数声明、数据类型以及常量的定义。                         
+*
+*
+**************************************************************************************************
+* @attention
+* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
+*
+**************************************************************************************************
+*/
+
+/* 避免头文件重复引用 */
+#ifndef CIU32F003_STD_IRTIM_H
+#define CIU32F003_STD_IRTIM_H
+
+/************************************************************************************************/
+/** 
+* @addtogroup CIU32F003_STD_Driver
+* @{
+*/
+
+/**
+* @defgroup IRTIM IRTIM
+* @brief 红外控制模块的STD库驱动
+* @{
+*/
+/************************************************************************************************/
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/*------------------------------------------includes--------------------------------------------*/
+#include "ciu32f003_std_common.h"
+
+/*--------------------------------------------define--------------------------------------------*/
+/************************************************************************************************/
+/**
+* @defgroup IRTIM_Constants  IRTIM Constants
+* @brief    IRTIM常量定义及宏定义
+* @{
+*
+*/
+/************************************************************************************************/
+
+/* IRTIM 调制信号源选择  */    
+#define ITRIM_SIGNAL_SOURCE_TIM3_OC1                       IRTIM_CR_IR_MODE_TIM3_OC1                /**< 调制信号源于TIM3_OC1  */
+#define ITRIM_SIGNAL_SOURCE_UART1_TX                       IRTIM_CR_IR_MODE_UART1_TX                /**< 调制信号源于UART1_TX  */
+#define ITRIM_SIGNAL_SOURCE_UART2_TX                       IRTIM_CR_IR_MODE_UART2_TX                /**< 调制信号源于UART2_TX  */
+                    
+/* IRTIM 输出信号极性选择 */
+#define IRTIM_POLARITY_DIRECT                              (0x00000000U)                            /**< IRTIM 输出信号未反相  */
+#define IRTIM_POLARITY_INVERSE                             IRTIM_CR_IR_POL                          /**< IRTIM 输出信号反相    */
+     
+     
+/** 
+* @} 
+*/
+
+/*-------------------------------------------functions------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @defgroup IRTIM_External_Functions IRTIM External Functions
+* @brief    IRTIM对外函数
+* @{
+*
+*/
+/************************************************************************************************/
+/** 
+* @brief  配置IRTIM调制信号源
+* @param  source 调制信号源选择
+*             @arg ITRIM_SIGNAL_SOURCE_TIM3_OC1: 调制信号源为TIM3的OC1
+*             @arg ITRIM_SIGNAL_SOURCE_UART1_TX: 调制信号源为UART1
+*             @arg ITRIM_SIGNAL_SOURCE_UART2_TX: 调制信号源为UART2
+* @retval 无
+*/
+__STATIC_INLINE void std_irtim_set_signal_source(uint32_t source)
+{
+    MODIFY_REG(IRTIM->CR, IRTIM_CR_IR_MODE, source);
+}
+
+/**
+* @brief  获取IRTIM调制信号源
+* @retval uint32_t 调制信号源
+*             @arg ITRIM_SIGNAL_SOURCE_TIM3_OC1: 调制信号源为TIM3的OC1
+*             @arg ITRIM_SIGNAL_SOURCE_UART1_TX: 调制信号源为UART1
+*             @arg ITRIM_SIGNAL_SOURCE_UART2_TX: 调制信号源为UART2
+*/
+__STATIC_INLINE uint32_t std_irtim_get_signal_source(void)
+{
+    return(IRTIM->CR & IRTIM_CR_IR_MODE);
+}
+
+/**
+* @brief  IR_OUT输出信号极性选择
+* @param  polarity 输出信号极性
+*             @arg IRTIM_POLARITY_DIRECT:  输出信号未反相
+*             @arg IRTIM_POLARITY_INVERSE: 输出信号反相
+* @retval 无
+*/
+__STATIC_INLINE void std_irtim_set_polarity(uint32_t polarity)
+{
+    MODIFY_REG(IRTIM->CR, IRTIM_CR_IR_POL, polarity);
+}
+
+/**
+* @brief  获取IR_OUT输出信号极性状态
+* @retval uint32_t 返回逻辑表达式的判断结果
+*             @arg 非0: 表示IRTIM输出信号反相
+*             @arg  0:  表示IRTIM输出信号未相反
+*/
+__STATIC_INLINE uint32_t std_irtim_get_polarity(void)
+{
+    return(IRTIM->CR & IRTIM_CR_IR_POL);
+}
+
+
+
+/**
+* @}
+*/
+
+#ifdef __cplusplus
+}
+#endif
+
+/**
+* @}
+*/
+
+/**
+* @}
+*/
+
+#endif /* CIU32F003_STD_IRTIM_H */

+ 140 - 0
CIU32F003_LIB/Include/ciu32f003_std_irtim(2).h

@@ -0,0 +1,140 @@
+/************************************************************************************************/
+/**
+* @file               ciu32f003_std_irtim.h
+* @author             MCU Ecosystem Development Team
+* @brief              IRTIM STD库驱动头文件。
+*                     提供IRTIM相关的STD库操作函数声明、数据类型以及常量的定义。                         
+*
+*
+**************************************************************************************************
+* @attention
+* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
+*
+**************************************************************************************************
+*/
+
+/* 避免头文件重复引用 */
+#ifndef CIU32F003_STD_IRTIM_H
+#define CIU32F003_STD_IRTIM_H
+
+/************************************************************************************************/
+/** 
+* @addtogroup CIU32F003_STD_Driver
+* @{
+*/
+
+/**
+* @defgroup IRTIM IRTIM
+* @brief 红外控制模块的STD库驱动
+* @{
+*/
+/************************************************************************************************/
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/*------------------------------------------includes--------------------------------------------*/
+#include "ciu32f003_std_common.h"
+
+/*--------------------------------------------define--------------------------------------------*/
+/************************************************************************************************/
+/**
+* @defgroup IRTIM_Constants  IRTIM Constants
+* @brief    IRTIM常量定义及宏定义
+* @{
+*
+*/
+/************************************************************************************************/
+
+/* IRTIM 调制信号源选择  */    
+#define ITRIM_SIGNAL_SOURCE_TIM3_OC1                       IRTIM_CR_IR_MODE_TIM3_OC1                /**< 调制信号源于TIM3_OC1  */
+#define ITRIM_SIGNAL_SOURCE_UART1_TX                       IRTIM_CR_IR_MODE_UART1_TX                /**< 调制信号源于UART1_TX  */
+#define ITRIM_SIGNAL_SOURCE_UART2_TX                       IRTIM_CR_IR_MODE_UART2_TX                /**< 调制信号源于UART2_TX  */
+                    
+/* IRTIM 输出信号极性选择 */
+#define IRTIM_POLARITY_DIRECT                              (0x00000000U)                            /**< IRTIM 输出信号未反相  */
+#define IRTIM_POLARITY_INVERSE                             IRTIM_CR_IR_POL                          /**< IRTIM 输出信号反相    */
+     
+     
+/** 
+* @} 
+*/
+
+/*-------------------------------------------functions------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @defgroup IRTIM_External_Functions IRTIM External Functions
+* @brief    IRTIM对外函数
+* @{
+*
+*/
+/************************************************************************************************/
+/** 
+* @brief  配置IRTIM调制信号源
+* @param  source 调制信号源选择
+*             @arg ITRIM_SIGNAL_SOURCE_TIM3_OC1: 调制信号源为TIM3的OC1
+*             @arg ITRIM_SIGNAL_SOURCE_UART1_TX: 调制信号源为UART1
+*             @arg ITRIM_SIGNAL_SOURCE_UART2_TX: 调制信号源为UART2
+* @retval 无
+*/
+__STATIC_INLINE void std_irtim_set_signal_source(uint32_t source)
+{
+    MODIFY_REG(IRTIM->CR, IRTIM_CR_IR_MODE, source);
+}
+
+/**
+* @brief  获取IRTIM调制信号源
+* @retval uint32_t 调制信号源
+*             @arg ITRIM_SIGNAL_SOURCE_TIM3_OC1: 调制信号源为TIM3的OC1
+*             @arg ITRIM_SIGNAL_SOURCE_UART1_TX: 调制信号源为UART1
+*             @arg ITRIM_SIGNAL_SOURCE_UART2_TX: 调制信号源为UART2
+*/
+__STATIC_INLINE uint32_t std_irtim_get_signal_source(void)
+{
+    return(IRTIM->CR & IRTIM_CR_IR_MODE);
+}
+
+/**
+* @brief  IR_OUT输出信号极性选择
+* @param  polarity 输出信号极性
+*             @arg IRTIM_POLARITY_DIRECT:  输出信号未反相
+*             @arg IRTIM_POLARITY_INVERSE: 输出信号反相
+* @retval 无
+*/
+__STATIC_INLINE void std_irtim_set_polarity(uint32_t polarity)
+{
+    MODIFY_REG(IRTIM->CR, IRTIM_CR_IR_POL, polarity);
+}
+
+/**
+* @brief  获取IR_OUT输出信号极性状态
+* @retval uint32_t 返回逻辑表达式的判断结果
+*             @arg 非0: 表示IRTIM输出信号反相
+*             @arg  0:  表示IRTIM输出信号未相反
+*/
+__STATIC_INLINE uint32_t std_irtim_get_polarity(void)
+{
+    return(IRTIM->CR & IRTIM_CR_IR_POL);
+}
+
+
+
+/**
+* @}
+*/
+
+#ifdef __cplusplus
+}
+#endif
+
+/**
+* @}
+*/
+
+/**
+* @}
+*/
+
+#endif /* CIU32F003_STD_IRTIM_H */

+ 140 - 0
CIU32F003_LIB/Include/ciu32f003_std_irtim(3).h

@@ -0,0 +1,140 @@
+/************************************************************************************************/
+/**
+* @file               ciu32f003_std_irtim.h
+* @author             MCU Ecosystem Development Team
+* @brief              IRTIM STD库驱动头文件。
+*                     提供IRTIM相关的STD库操作函数声明、数据类型以及常量的定义。                         
+*
+*
+**************************************************************************************************
+* @attention
+* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
+*
+**************************************************************************************************
+*/
+
+/* 避免头文件重复引用 */
+#ifndef CIU32F003_STD_IRTIM_H
+#define CIU32F003_STD_IRTIM_H
+
+/************************************************************************************************/
+/** 
+* @addtogroup CIU32F003_STD_Driver
+* @{
+*/
+
+/**
+* @defgroup IRTIM IRTIM
+* @brief 红外控制模块的STD库驱动
+* @{
+*/
+/************************************************************************************************/
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/*------------------------------------------includes--------------------------------------------*/
+#include "ciu32f003_std_common.h"
+
+/*--------------------------------------------define--------------------------------------------*/
+/************************************************************************************************/
+/**
+* @defgroup IRTIM_Constants  IRTIM Constants
+* @brief    IRTIM常量定义及宏定义
+* @{
+*
+*/
+/************************************************************************************************/
+
+/* IRTIM 调制信号源选择  */    
+#define ITRIM_SIGNAL_SOURCE_TIM3_OC1                       IRTIM_CR_IR_MODE_TIM3_OC1                /**< 调制信号源于TIM3_OC1  */
+#define ITRIM_SIGNAL_SOURCE_UART1_TX                       IRTIM_CR_IR_MODE_UART1_TX                /**< 调制信号源于UART1_TX  */
+#define ITRIM_SIGNAL_SOURCE_UART2_TX                       IRTIM_CR_IR_MODE_UART2_TX                /**< 调制信号源于UART2_TX  */
+                    
+/* IRTIM 输出信号极性选择 */
+#define IRTIM_POLARITY_DIRECT                              (0x00000000U)                            /**< IRTIM 输出信号未反相  */
+#define IRTIM_POLARITY_INVERSE                             IRTIM_CR_IR_POL                          /**< IRTIM 输出信号反相    */
+     
+     
+/** 
+* @} 
+*/
+
+/*-------------------------------------------functions------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @defgroup IRTIM_External_Functions IRTIM External Functions
+* @brief    IRTIM对外函数
+* @{
+*
+*/
+/************************************************************************************************/
+/** 
+* @brief  配置IRTIM调制信号源
+* @param  source 调制信号源选择
+*             @arg ITRIM_SIGNAL_SOURCE_TIM3_OC1: 调制信号源为TIM3的OC1
+*             @arg ITRIM_SIGNAL_SOURCE_UART1_TX: 调制信号源为UART1
+*             @arg ITRIM_SIGNAL_SOURCE_UART2_TX: 调制信号源为UART2
+* @retval 无
+*/
+__STATIC_INLINE void std_irtim_set_signal_source(uint32_t source)
+{
+    MODIFY_REG(IRTIM->CR, IRTIM_CR_IR_MODE, source);
+}
+
+/**
+* @brief  获取IRTIM调制信号源
+* @retval uint32_t 调制信号源
+*             @arg ITRIM_SIGNAL_SOURCE_TIM3_OC1: 调制信号源为TIM3的OC1
+*             @arg ITRIM_SIGNAL_SOURCE_UART1_TX: 调制信号源为UART1
+*             @arg ITRIM_SIGNAL_SOURCE_UART2_TX: 调制信号源为UART2
+*/
+__STATIC_INLINE uint32_t std_irtim_get_signal_source(void)
+{
+    return(IRTIM->CR & IRTIM_CR_IR_MODE);
+}
+
+/**
+* @brief  IR_OUT输出信号极性选择
+* @param  polarity 输出信号极性
+*             @arg IRTIM_POLARITY_DIRECT:  输出信号未反相
+*             @arg IRTIM_POLARITY_INVERSE: 输出信号反相
+* @retval 无
+*/
+__STATIC_INLINE void std_irtim_set_polarity(uint32_t polarity)
+{
+    MODIFY_REG(IRTIM->CR, IRTIM_CR_IR_POL, polarity);
+}
+
+/**
+* @brief  获取IR_OUT输出信号极性状态
+* @retval uint32_t 返回逻辑表达式的判断结果
+*             @arg 非0: 表示IRTIM输出信号反相
+*             @arg  0:  表示IRTIM输出信号未相反
+*/
+__STATIC_INLINE uint32_t std_irtim_get_polarity(void)
+{
+    return(IRTIM->CR & IRTIM_CR_IR_POL);
+}
+
+
+
+/**
+* @}
+*/
+
+#ifdef __cplusplus
+}
+#endif
+
+/**
+* @}
+*/
+
+/**
+* @}
+*/
+
+#endif /* CIU32F003_STD_IRTIM_H */

+ 140 - 0
CIU32F003_LIB/Include/ciu32f003_std_irtim.h

@@ -0,0 +1,140 @@
+/************************************************************************************************/
+/**
+* @file               ciu32f003_std_irtim.h
+* @author             MCU Ecosystem Development Team
+* @brief              IRTIM STD库驱动头文件。
+*                     提供IRTIM相关的STD库操作函数声明、数据类型以及常量的定义。                         
+*
+*
+**************************************************************************************************
+* @attention
+* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
+*
+**************************************************************************************************
+*/
+
+/* 避免头文件重复引用 */
+#ifndef CIU32F003_STD_IRTIM_H
+#define CIU32F003_STD_IRTIM_H
+
+/************************************************************************************************/
+/** 
+* @addtogroup CIU32F003_STD_Driver
+* @{
+*/
+
+/**
+* @defgroup IRTIM IRTIM
+* @brief 红外控制模块的STD库驱动
+* @{
+*/
+/************************************************************************************************/
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/*------------------------------------------includes--------------------------------------------*/
+#include "ciu32f003_std_common.h"
+
+/*--------------------------------------------define--------------------------------------------*/
+/************************************************************************************************/
+/**
+* @defgroup IRTIM_Constants  IRTIM Constants
+* @brief    IRTIM常量定义及宏定义
+* @{
+*
+*/
+/************************************************************************************************/
+
+/* IRTIM 调制信号源选择  */    
+#define ITRIM_SIGNAL_SOURCE_TIM3_OC1                       IRTIM_CR_IR_MODE_TIM3_OC1                /**< 调制信号源于TIM3_OC1  */
+#define ITRIM_SIGNAL_SOURCE_UART1_TX                       IRTIM_CR_IR_MODE_UART1_TX                /**< 调制信号源于UART1_TX  */
+#define ITRIM_SIGNAL_SOURCE_UART2_TX                       IRTIM_CR_IR_MODE_UART2_TX                /**< 调制信号源于UART2_TX  */
+                    
+/* IRTIM 输出信号极性选择 */
+#define IRTIM_POLARITY_DIRECT                              (0x00000000U)                            /**< IRTIM 输出信号未反相  */
+#define IRTIM_POLARITY_INVERSE                             IRTIM_CR_IR_POL                          /**< IRTIM 输出信号反相    */
+     
+     
+/** 
+* @} 
+*/
+
+/*-------------------------------------------functions------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @defgroup IRTIM_External_Functions IRTIM External Functions
+* @brief    IRTIM对外函数
+* @{
+*
+*/
+/************************************************************************************************/
+/** 
+* @brief  配置IRTIM调制信号源
+* @param  source 调制信号源选择
+*             @arg ITRIM_SIGNAL_SOURCE_TIM3_OC1: 调制信号源为TIM3的OC1
+*             @arg ITRIM_SIGNAL_SOURCE_UART1_TX: 调制信号源为UART1
+*             @arg ITRIM_SIGNAL_SOURCE_UART2_TX: 调制信号源为UART2
+* @retval 无
+*/
+__STATIC_INLINE void std_irtim_set_signal_source(uint32_t source)
+{
+    MODIFY_REG(IRTIM->CR, IRTIM_CR_IR_MODE, source);
+}
+
+/**
+* @brief  获取IRTIM调制信号源
+* @retval uint32_t 调制信号源
+*             @arg ITRIM_SIGNAL_SOURCE_TIM3_OC1: 调制信号源为TIM3的OC1
+*             @arg ITRIM_SIGNAL_SOURCE_UART1_TX: 调制信号源为UART1
+*             @arg ITRIM_SIGNAL_SOURCE_UART2_TX: 调制信号源为UART2
+*/
+__STATIC_INLINE uint32_t std_irtim_get_signal_source(void)
+{
+    return(IRTIM->CR & IRTIM_CR_IR_MODE);
+}
+
+/**
+* @brief  IR_OUT输出信号极性选择
+* @param  polarity 输出信号极性
+*             @arg IRTIM_POLARITY_DIRECT:  输出信号未反相
+*             @arg IRTIM_POLARITY_INVERSE: 输出信号反相
+* @retval 无
+*/
+__STATIC_INLINE void std_irtim_set_polarity(uint32_t polarity)
+{
+    MODIFY_REG(IRTIM->CR, IRTIM_CR_IR_POL, polarity);
+}
+
+/**
+* @brief  获取IR_OUT输出信号极性状态
+* @retval uint32_t 返回逻辑表达式的判断结果
+*             @arg 非0: 表示IRTIM输出信号反相
+*             @arg  0:  表示IRTIM输出信号未相反
+*/
+__STATIC_INLINE uint32_t std_irtim_get_polarity(void)
+{
+    return(IRTIM->CR & IRTIM_CR_IR_POL);
+}
+
+
+
+/**
+* @}
+*/
+
+#ifdef __cplusplus
+}
+#endif
+
+/**
+* @}
+*/
+
+/**
+* @}
+*/
+
+#endif /* CIU32F003_STD_IRTIM_H */

+ 180 - 0
CIU32F003_LIB/Include/ciu32f003_std_iwdg(1).h

@@ -0,0 +1,180 @@
+/************************************************************************************************/
+/**
+* @file               ciu32f003_std_iwdg.h
+* @author             MCU Ecosystem Development Team
+* @brief              IWDG STD库驱动头文件。
+*                     提供IWDG相关的STD库操作函数声明、数据类型以及常量的定义。 
+*
+*
+**************************************************************************************************
+* @attention
+* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
+*
+**************************************************************************************************
+*/
+
+/* 避免头文件重复引用 */
+#ifndef CIU32F003_STD_IWDG_H
+#define CIU32F003_STD_IWDG_H
+
+/************************************************************************************************/
+/**
+* @addtogroup CIU32F003_STD_Driver
+* @{
+*/
+
+/**
+* @defgroup IWDG IWDG
+* @brief 独立看门狗的STD库驱动
+* @{
+*
+*/
+/************************************************************************************************/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*------------------------------------------includes--------------------------------------------*/
+#include "ciu32f003_std_common.h"
+
+/*--------------------------------------------define--------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @defgroup IWDG_Constants IWDG Constants
+* @brief IWDG常量定义及宏定义
+* @{
+*
+*/
+/************************************************************************************************/
+
+/* IWDG控制值定义 */
+#define IWDG_RELOAD                      (0x0000AAAAUL)                 /**< IWDG 喂狗             */
+#define IWDG_ENABLE                      (0x0000CCCCUL)                 /**< IWDG 使能             */
+#define IWDG_WRITE_ACCESS_ENABLE         (0x00005555UL)                 /**< IWDG 写权限使能       */
+#define IWDG_WRITE_ACCESS_DISABLE        (0x00000000UL)                 /**< IWDG 写权限关闭       */
+
+/* IWDG计数溢出时间定义 */
+#define IWDG_OVERFLOW_PERIOD_128         IWDG_CFG_OVP_128               /**< IWDG溢出时间为128ms   */
+#define IWDG_OVERFLOW_PERIOD_256         IWDG_CFG_OVP_256               /**< IWDG溢出时间为256ms   */
+#define IWDG_OVERFLOW_PERIOD_512         IWDG_CFG_OVP_512               /**< IWDG溢出时间为512ms   */
+#define IWDG_OVERFLOW_PERIOD_1024        IWDG_CFG_OVP_1024              /**< IWDG溢出时间为1.024s  */
+#define IWDG_OVERFLOW_PERIOD_2048        IWDG_CFG_OVP_2048              /**< IWDG溢出时间为2.048s  */
+#define IWDG_OVERFLOW_PERIOD_4096        IWDG_CFG_OVP_4096              /**< IWDG溢出时间为4.096s  */
+#define IWDG_OVERFLOW_PERIOD_8192        IWDG_CFG_OVP_8192              /**< IWDG溢出时间为8.192s  */
+#define IWDG_OVERFLOW_PERIOD_16384       IWDG_CFG_OVP_16384             /**< IWDG溢出时间为16.384s */
+
+
+/** 
+* @} 
+*/
+
+/*-------------------------------------------functions------------------------------------------*/
+/************************************************************************************************/
+/**
+* @defgroup IWDG_External_Functions IWDG External Functions
+* @brief    IWDG对外函数
+* @{
+*
+*/
+/************************************************************************************************/
+/** 
+* @brief  启动IWDG计数
+* @note   使能IWDG后,IWDG无法停止
+* @retval 无
+*/
+__STATIC_INLINE void std_iwdg_start(void)
+{
+    IWDG->CR = IWDG_ENABLE;
+}
+
+/** 
+* @brief  使能IWDG配置寄存器写权限
+* @retval 无
+*/
+__STATIC_INLINE void std_iwdg_write_access_enable(void)
+{
+    IWDG->CR = IWDG_WRITE_ACCESS_ENABLE;
+}
+
+/** 
+* @brief  禁止IWDG配置寄存器写权限
+* @retval 无
+*/
+__STATIC_INLINE void std_iwdg_write_access_disable(void)
+{
+    IWDG->CR = IWDG_WRITE_ACCESS_DISABLE;
+}
+
+/** 
+* @brief  IWDG喂狗
+* @retval 无
+*/
+__STATIC_INLINE void std_iwdg_refresh(void)
+{
+    IWDG->CR = IWDG_RELOAD;
+}
+
+/**
+* @brief  配置溢出时间
+* @param  overflow_period IWDG的溢出时间:
+*             @arg IWDG_OVERFLOW_PERIOD_128
+*             @arg IWDG_OVERFLOW_PERIOD_256
+*             @arg IWDG_OVERFLOW_PERIOD_512
+*             @arg IWDG_OVERFLOW_PERIOD_1024
+*             @arg IWDG_OVERFLOW_PERIOD_2048
+*             @arg IWDG_OVERFLOW_PERIOD_4096
+*             @arg IWDG_OVERFLOW_PERIOD_8192
+*             @arg IWDG_OVERFLOW_PERIOD_16384
+* @retval 无
+*/
+__STATIC_INLINE void std_iwdg_set_overflow_period(uint32_t overflow_period)
+{
+    IWDG->CFG = overflow_period;
+}
+
+/**
+* @brief  获取溢出时间
+* @retval uint32_t IWDG的溢出时间:
+*             @arg IWDG_OVERFLOW_PERIOD_128
+*             @arg IWDG_OVERFLOW_PERIOD_256
+*             @arg IWDG_OVERFLOW_PERIOD_512
+*             @arg IWDG_OVERFLOW_PERIOD_1024
+*             @arg IWDG_OVERFLOW_PERIOD_2048
+*             @arg IWDG_OVERFLOW_PERIOD_4096
+*             @arg IWDG_OVERFLOW_PERIOD_8192
+*             @arg IWDG_OVERFLOW_PERIOD_16384
+*/
+__STATIC_INLINE uint32_t std_iwdg_get_overflow_period(void)
+{
+    return(IWDG->CFG);
+}
+
+/**
+* @brief 获取计数值
+* @retval uint32_t IWDG的计数值
+*/
+__STATIC_INLINE uint32_t std_iwdg_get_counter(void)
+{
+    return(IWDG->CNT);
+}
+
+
+/** 
+* @} 
+*/
+
+#ifdef __cplusplus
+}
+#endif
+
+/**
+* @} 
+*/  
+
+/** 
+* @} 
+*/
+
+#endif /* CIU32F003_STD_IWDG_H */

+ 180 - 0
CIU32F003_LIB/Include/ciu32f003_std_iwdg(2).h

@@ -0,0 +1,180 @@
+/************************************************************************************************/
+/**
+* @file               ciu32f003_std_iwdg.h
+* @author             MCU Ecosystem Development Team
+* @brief              IWDG STD库驱动头文件。
+*                     提供IWDG相关的STD库操作函数声明、数据类型以及常量的定义。 
+*
+*
+**************************************************************************************************
+* @attention
+* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
+*
+**************************************************************************************************
+*/
+
+/* 避免头文件重复引用 */
+#ifndef CIU32F003_STD_IWDG_H
+#define CIU32F003_STD_IWDG_H
+
+/************************************************************************************************/
+/**
+* @addtogroup CIU32F003_STD_Driver
+* @{
+*/
+
+/**
+* @defgroup IWDG IWDG
+* @brief 独立看门狗的STD库驱动
+* @{
+*
+*/
+/************************************************************************************************/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*------------------------------------------includes--------------------------------------------*/
+#include "ciu32f003_std_common.h"
+
+/*--------------------------------------------define--------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @defgroup IWDG_Constants IWDG Constants
+* @brief IWDG常量定义及宏定义
+* @{
+*
+*/
+/************************************************************************************************/
+
+/* IWDG控制值定义 */
+#define IWDG_RELOAD                      (0x0000AAAAUL)                 /**< IWDG 喂狗             */
+#define IWDG_ENABLE                      (0x0000CCCCUL)                 /**< IWDG 使能             */
+#define IWDG_WRITE_ACCESS_ENABLE         (0x00005555UL)                 /**< IWDG 写权限使能       */
+#define IWDG_WRITE_ACCESS_DISABLE        (0x00000000UL)                 /**< IWDG 写权限关闭       */
+
+/* IWDG计数溢出时间定义 */
+#define IWDG_OVERFLOW_PERIOD_128         IWDG_CFG_OVP_128               /**< IWDG溢出时间为128ms   */
+#define IWDG_OVERFLOW_PERIOD_256         IWDG_CFG_OVP_256               /**< IWDG溢出时间为256ms   */
+#define IWDG_OVERFLOW_PERIOD_512         IWDG_CFG_OVP_512               /**< IWDG溢出时间为512ms   */
+#define IWDG_OVERFLOW_PERIOD_1024        IWDG_CFG_OVP_1024              /**< IWDG溢出时间为1.024s  */
+#define IWDG_OVERFLOW_PERIOD_2048        IWDG_CFG_OVP_2048              /**< IWDG溢出时间为2.048s  */
+#define IWDG_OVERFLOW_PERIOD_4096        IWDG_CFG_OVP_4096              /**< IWDG溢出时间为4.096s  */
+#define IWDG_OVERFLOW_PERIOD_8192        IWDG_CFG_OVP_8192              /**< IWDG溢出时间为8.192s  */
+#define IWDG_OVERFLOW_PERIOD_16384       IWDG_CFG_OVP_16384             /**< IWDG溢出时间为16.384s */
+
+
+/** 
+* @} 
+*/
+
+/*-------------------------------------------functions------------------------------------------*/
+/************************************************************************************************/
+/**
+* @defgroup IWDG_External_Functions IWDG External Functions
+* @brief    IWDG对外函数
+* @{
+*
+*/
+/************************************************************************************************/
+/** 
+* @brief  启动IWDG计数
+* @note   使能IWDG后,IWDG无法停止
+* @retval 无
+*/
+__STATIC_INLINE void std_iwdg_start(void)
+{
+    IWDG->CR = IWDG_ENABLE;
+}
+
+/** 
+* @brief  使能IWDG配置寄存器写权限
+* @retval 无
+*/
+__STATIC_INLINE void std_iwdg_write_access_enable(void)
+{
+    IWDG->CR = IWDG_WRITE_ACCESS_ENABLE;
+}
+
+/** 
+* @brief  禁止IWDG配置寄存器写权限
+* @retval 无
+*/
+__STATIC_INLINE void std_iwdg_write_access_disable(void)
+{
+    IWDG->CR = IWDG_WRITE_ACCESS_DISABLE;
+}
+
+/** 
+* @brief  IWDG喂狗
+* @retval 无
+*/
+__STATIC_INLINE void std_iwdg_refresh(void)
+{
+    IWDG->CR = IWDG_RELOAD;
+}
+
+/**
+* @brief  配置溢出时间
+* @param  overflow_period IWDG的溢出时间:
+*             @arg IWDG_OVERFLOW_PERIOD_128
+*             @arg IWDG_OVERFLOW_PERIOD_256
+*             @arg IWDG_OVERFLOW_PERIOD_512
+*             @arg IWDG_OVERFLOW_PERIOD_1024
+*             @arg IWDG_OVERFLOW_PERIOD_2048
+*             @arg IWDG_OVERFLOW_PERIOD_4096
+*             @arg IWDG_OVERFLOW_PERIOD_8192
+*             @arg IWDG_OVERFLOW_PERIOD_16384
+* @retval 无
+*/
+__STATIC_INLINE void std_iwdg_set_overflow_period(uint32_t overflow_period)
+{
+    IWDG->CFG = overflow_period;
+}
+
+/**
+* @brief  获取溢出时间
+* @retval uint32_t IWDG的溢出时间:
+*             @arg IWDG_OVERFLOW_PERIOD_128
+*             @arg IWDG_OVERFLOW_PERIOD_256
+*             @arg IWDG_OVERFLOW_PERIOD_512
+*             @arg IWDG_OVERFLOW_PERIOD_1024
+*             @arg IWDG_OVERFLOW_PERIOD_2048
+*             @arg IWDG_OVERFLOW_PERIOD_4096
+*             @arg IWDG_OVERFLOW_PERIOD_8192
+*             @arg IWDG_OVERFLOW_PERIOD_16384
+*/
+__STATIC_INLINE uint32_t std_iwdg_get_overflow_period(void)
+{
+    return(IWDG->CFG);
+}
+
+/**
+* @brief 获取计数值
+* @retval uint32_t IWDG的计数值
+*/
+__STATIC_INLINE uint32_t std_iwdg_get_counter(void)
+{
+    return(IWDG->CNT);
+}
+
+
+/** 
+* @} 
+*/
+
+#ifdef __cplusplus
+}
+#endif
+
+/**
+* @} 
+*/  
+
+/** 
+* @} 
+*/
+
+#endif /* CIU32F003_STD_IWDG_H */

+ 180 - 0
CIU32F003_LIB/Include/ciu32f003_std_iwdg(3).h

@@ -0,0 +1,180 @@
+/************************************************************************************************/
+/**
+* @file               ciu32f003_std_iwdg.h
+* @author             MCU Ecosystem Development Team
+* @brief              IWDG STD库驱动头文件。
+*                     提供IWDG相关的STD库操作函数声明、数据类型以及常量的定义。 
+*
+*
+**************************************************************************************************
+* @attention
+* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
+*
+**************************************************************************************************
+*/
+
+/* 避免头文件重复引用 */
+#ifndef CIU32F003_STD_IWDG_H
+#define CIU32F003_STD_IWDG_H
+
+/************************************************************************************************/
+/**
+* @addtogroup CIU32F003_STD_Driver
+* @{
+*/
+
+/**
+* @defgroup IWDG IWDG
+* @brief 独立看门狗的STD库驱动
+* @{
+*
+*/
+/************************************************************************************************/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*------------------------------------------includes--------------------------------------------*/
+#include "ciu32f003_std_common.h"
+
+/*--------------------------------------------define--------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @defgroup IWDG_Constants IWDG Constants
+* @brief IWDG常量定义及宏定义
+* @{
+*
+*/
+/************************************************************************************************/
+
+/* IWDG控制值定义 */
+#define IWDG_RELOAD                      (0x0000AAAAUL)                 /**< IWDG 喂狗             */
+#define IWDG_ENABLE                      (0x0000CCCCUL)                 /**< IWDG 使能             */
+#define IWDG_WRITE_ACCESS_ENABLE         (0x00005555UL)                 /**< IWDG 写权限使能       */
+#define IWDG_WRITE_ACCESS_DISABLE        (0x00000000UL)                 /**< IWDG 写权限关闭       */
+
+/* IWDG计数溢出时间定义 */
+#define IWDG_OVERFLOW_PERIOD_128         IWDG_CFG_OVP_128               /**< IWDG溢出时间为128ms   */
+#define IWDG_OVERFLOW_PERIOD_256         IWDG_CFG_OVP_256               /**< IWDG溢出时间为256ms   */
+#define IWDG_OVERFLOW_PERIOD_512         IWDG_CFG_OVP_512               /**< IWDG溢出时间为512ms   */
+#define IWDG_OVERFLOW_PERIOD_1024        IWDG_CFG_OVP_1024              /**< IWDG溢出时间为1.024s  */
+#define IWDG_OVERFLOW_PERIOD_2048        IWDG_CFG_OVP_2048              /**< IWDG溢出时间为2.048s  */
+#define IWDG_OVERFLOW_PERIOD_4096        IWDG_CFG_OVP_4096              /**< IWDG溢出时间为4.096s  */
+#define IWDG_OVERFLOW_PERIOD_8192        IWDG_CFG_OVP_8192              /**< IWDG溢出时间为8.192s  */
+#define IWDG_OVERFLOW_PERIOD_16384       IWDG_CFG_OVP_16384             /**< IWDG溢出时间为16.384s */
+
+
+/** 
+* @} 
+*/
+
+/*-------------------------------------------functions------------------------------------------*/
+/************************************************************************************************/
+/**
+* @defgroup IWDG_External_Functions IWDG External Functions
+* @brief    IWDG对外函数
+* @{
+*
+*/
+/************************************************************************************************/
+/** 
+* @brief  启动IWDG计数
+* @note   使能IWDG后,IWDG无法停止
+* @retval 无
+*/
+__STATIC_INLINE void std_iwdg_start(void)
+{
+    IWDG->CR = IWDG_ENABLE;
+}
+
+/** 
+* @brief  使能IWDG配置寄存器写权限
+* @retval 无
+*/
+__STATIC_INLINE void std_iwdg_write_access_enable(void)
+{
+    IWDG->CR = IWDG_WRITE_ACCESS_ENABLE;
+}
+
+/** 
+* @brief  禁止IWDG配置寄存器写权限
+* @retval 无
+*/
+__STATIC_INLINE void std_iwdg_write_access_disable(void)
+{
+    IWDG->CR = IWDG_WRITE_ACCESS_DISABLE;
+}
+
+/** 
+* @brief  IWDG喂狗
+* @retval 无
+*/
+__STATIC_INLINE void std_iwdg_refresh(void)
+{
+    IWDG->CR = IWDG_RELOAD;
+}
+
+/**
+* @brief  配置溢出时间
+* @param  overflow_period IWDG的溢出时间:
+*             @arg IWDG_OVERFLOW_PERIOD_128
+*             @arg IWDG_OVERFLOW_PERIOD_256
+*             @arg IWDG_OVERFLOW_PERIOD_512
+*             @arg IWDG_OVERFLOW_PERIOD_1024
+*             @arg IWDG_OVERFLOW_PERIOD_2048
+*             @arg IWDG_OVERFLOW_PERIOD_4096
+*             @arg IWDG_OVERFLOW_PERIOD_8192
+*             @arg IWDG_OVERFLOW_PERIOD_16384
+* @retval 无
+*/
+__STATIC_INLINE void std_iwdg_set_overflow_period(uint32_t overflow_period)
+{
+    IWDG->CFG = overflow_period;
+}
+
+/**
+* @brief  获取溢出时间
+* @retval uint32_t IWDG的溢出时间:
+*             @arg IWDG_OVERFLOW_PERIOD_128
+*             @arg IWDG_OVERFLOW_PERIOD_256
+*             @arg IWDG_OVERFLOW_PERIOD_512
+*             @arg IWDG_OVERFLOW_PERIOD_1024
+*             @arg IWDG_OVERFLOW_PERIOD_2048
+*             @arg IWDG_OVERFLOW_PERIOD_4096
+*             @arg IWDG_OVERFLOW_PERIOD_8192
+*             @arg IWDG_OVERFLOW_PERIOD_16384
+*/
+__STATIC_INLINE uint32_t std_iwdg_get_overflow_period(void)
+{
+    return(IWDG->CFG);
+}
+
+/**
+* @brief 获取计数值
+* @retval uint32_t IWDG的计数值
+*/
+__STATIC_INLINE uint32_t std_iwdg_get_counter(void)
+{
+    return(IWDG->CNT);
+}
+
+
+/** 
+* @} 
+*/
+
+#ifdef __cplusplus
+}
+#endif
+
+/**
+* @} 
+*/  
+
+/** 
+* @} 
+*/
+
+#endif /* CIU32F003_STD_IWDG_H */

+ 180 - 0
CIU32F003_LIB/Include/ciu32f003_std_iwdg.h

@@ -0,0 +1,180 @@
+/************************************************************************************************/
+/**
+* @file               ciu32f003_std_iwdg.h
+* @author             MCU Ecosystem Development Team
+* @brief              IWDG STD库驱动头文件。
+*                     提供IWDG相关的STD库操作函数声明、数据类型以及常量的定义。 
+*
+*
+**************************************************************************************************
+* @attention
+* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
+*
+**************************************************************************************************
+*/
+
+/* 避免头文件重复引用 */
+#ifndef CIU32F003_STD_IWDG_H
+#define CIU32F003_STD_IWDG_H
+
+/************************************************************************************************/
+/**
+* @addtogroup CIU32F003_STD_Driver
+* @{
+*/
+
+/**
+* @defgroup IWDG IWDG
+* @brief 独立看门狗的STD库驱动
+* @{
+*
+*/
+/************************************************************************************************/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*------------------------------------------includes--------------------------------------------*/
+#include "ciu32f003_std_common.h"
+
+/*--------------------------------------------define--------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @defgroup IWDG_Constants IWDG Constants
+* @brief IWDG常量定义及宏定义
+* @{
+*
+*/
+/************************************************************************************************/
+
+/* IWDG控制值定义 */
+#define IWDG_RELOAD                      (0x0000AAAAUL)                 /**< IWDG 喂狗             */
+#define IWDG_ENABLE                      (0x0000CCCCUL)                 /**< IWDG 使能             */
+#define IWDG_WRITE_ACCESS_ENABLE         (0x00005555UL)                 /**< IWDG 写权限使能       */
+#define IWDG_WRITE_ACCESS_DISABLE        (0x00000000UL)                 /**< IWDG 写权限关闭       */
+
+/* IWDG计数溢出时间定义 */
+#define IWDG_OVERFLOW_PERIOD_128         IWDG_CFG_OVP_128               /**< IWDG溢出时间为128ms   */
+#define IWDG_OVERFLOW_PERIOD_256         IWDG_CFG_OVP_256               /**< IWDG溢出时间为256ms   */
+#define IWDG_OVERFLOW_PERIOD_512         IWDG_CFG_OVP_512               /**< IWDG溢出时间为512ms   */
+#define IWDG_OVERFLOW_PERIOD_1024        IWDG_CFG_OVP_1024              /**< IWDG溢出时间为1.024s  */
+#define IWDG_OVERFLOW_PERIOD_2048        IWDG_CFG_OVP_2048              /**< IWDG溢出时间为2.048s  */
+#define IWDG_OVERFLOW_PERIOD_4096        IWDG_CFG_OVP_4096              /**< IWDG溢出时间为4.096s  */
+#define IWDG_OVERFLOW_PERIOD_8192        IWDG_CFG_OVP_8192              /**< IWDG溢出时间为8.192s  */
+#define IWDG_OVERFLOW_PERIOD_16384       IWDG_CFG_OVP_16384             /**< IWDG溢出时间为16.384s */
+
+
+/** 
+* @} 
+*/
+
+/*-------------------------------------------functions------------------------------------------*/
+/************************************************************************************************/
+/**
+* @defgroup IWDG_External_Functions IWDG External Functions
+* @brief    IWDG对外函数
+* @{
+*
+*/
+/************************************************************************************************/
+/** 
+* @brief  启动IWDG计数
+* @note   使能IWDG后,IWDG无法停止
+* @retval 无
+*/
+__STATIC_INLINE void std_iwdg_start(void)
+{
+    IWDG->CR = IWDG_ENABLE;
+}
+
+/** 
+* @brief  使能IWDG配置寄存器写权限
+* @retval 无
+*/
+__STATIC_INLINE void std_iwdg_write_access_enable(void)
+{
+    IWDG->CR = IWDG_WRITE_ACCESS_ENABLE;
+}
+
+/** 
+* @brief  禁止IWDG配置寄存器写权限
+* @retval 无
+*/
+__STATIC_INLINE void std_iwdg_write_access_disable(void)
+{
+    IWDG->CR = IWDG_WRITE_ACCESS_DISABLE;
+}
+
+/** 
+* @brief  IWDG喂狗
+* @retval 无
+*/
+__STATIC_INLINE void std_iwdg_refresh(void)
+{
+    IWDG->CR = IWDG_RELOAD;
+}
+
+/**
+* @brief  配置溢出时间
+* @param  overflow_period IWDG的溢出时间:
+*             @arg IWDG_OVERFLOW_PERIOD_128
+*             @arg IWDG_OVERFLOW_PERIOD_256
+*             @arg IWDG_OVERFLOW_PERIOD_512
+*             @arg IWDG_OVERFLOW_PERIOD_1024
+*             @arg IWDG_OVERFLOW_PERIOD_2048
+*             @arg IWDG_OVERFLOW_PERIOD_4096
+*             @arg IWDG_OVERFLOW_PERIOD_8192
+*             @arg IWDG_OVERFLOW_PERIOD_16384
+* @retval 无
+*/
+__STATIC_INLINE void std_iwdg_set_overflow_period(uint32_t overflow_period)
+{
+    IWDG->CFG = overflow_period;
+}
+
+/**
+* @brief  获取溢出时间
+* @retval uint32_t IWDG的溢出时间:
+*             @arg IWDG_OVERFLOW_PERIOD_128
+*             @arg IWDG_OVERFLOW_PERIOD_256
+*             @arg IWDG_OVERFLOW_PERIOD_512
+*             @arg IWDG_OVERFLOW_PERIOD_1024
+*             @arg IWDG_OVERFLOW_PERIOD_2048
+*             @arg IWDG_OVERFLOW_PERIOD_4096
+*             @arg IWDG_OVERFLOW_PERIOD_8192
+*             @arg IWDG_OVERFLOW_PERIOD_16384
+*/
+__STATIC_INLINE uint32_t std_iwdg_get_overflow_period(void)
+{
+    return(IWDG->CFG);
+}
+
+/**
+* @brief 获取计数值
+* @retval uint32_t IWDG的计数值
+*/
+__STATIC_INLINE uint32_t std_iwdg_get_counter(void)
+{
+    return(IWDG->CNT);
+}
+
+
+/** 
+* @} 
+*/
+
+#ifdef __cplusplus
+}
+#endif
+
+/**
+* @} 
+*/  
+
+/** 
+* @} 
+*/
+
+#endif /* CIU32F003_STD_IWDG_H */

+ 301 - 0
CIU32F003_LIB/Include/ciu32f003_std_lptim(1).h

@@ -0,0 +1,301 @@
+/************************************************************************************************/
+/**
+* @file               ciu32f003_std_lptim.h
+* @author             MCU Ecosystem Development Team
+* @brief              LPTIM STD库驱动头文件。
+*                     提供LPTIM相关的STD库操作函数声明、数据类型以及常量的定义。
+*
+*
+**************************************************************************************************
+* @attention
+* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
+*
+**************************************************************************************************
+*/
+
+/*避免头文件重复引用*/
+#ifndef CIU32F003_STD_LPTIM_H
+#define CIU32F003_STD_LPTIM_H
+
+/************************************************************************************************/
+/** 
+* @addtogroup CIU32F003_STD_Driver
+* @{
+*/
+
+/**
+* @defgroup LPTIM LPTIM
+* @brief 低功耗定时器的STD库驱动
+* @{
+*/
+/************************************************************************************************/
+
+
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+     
+/*------------------------------------------includes--------------------------------------------*/
+#include "ciu32f003_std_common.h"
+
+/*--------------------------------------------define--------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @defgroup LPTIM_Constants LPTIM Constants
+* @brief    LPTIM常量定义及宏定义
+* @{
+*
+*/
+/************************************************************************************************/
+/* 计数器计数模式 */
+#define LPTIM_COUNT_CONTINUOUS          LPTIM_CR_CNTSTRT            /**< 连续计数模式    */
+#define LPTIM_COUNT_SINGLE              LPTIM_CR_SNGSTRT            /**< 单次计数模式    */
+
+/* LPTIM PSC预分频器分频系数选择 */
+#define LPTIM_PRESCALER_DIV1            LPTIM_CFG_PRESC_1           /**< PSC预分频器1分频   */
+#define LPTIM_PRESCALER_DIV2            LPTIM_CFG_PRESC_2           /**< PSC预分频器2分频   */
+#define LPTIM_PRESCALER_DIV4            LPTIM_CFG_PRESC_4           /**< PSC预分频器4分频   */
+#define LPTIM_PRESCALER_DIV8            LPTIM_CFG_PRESC_8           /**< PSC预分频器8分频   */
+#define LPTIM_PRESCALER_DIV16           LPTIM_CFG_PRESC_16          /**< PSC预分频器16分频  */
+#define LPTIM_PRESCALER_DIV32           LPTIM_CFG_PRESC_32          /**< PSC预分频器32分频  */
+#define LPTIM_PRESCALER_DIV64           LPTIM_CFG_PRESC_64          /**< PSC预分频器64分频  */
+#define LPTIM_PRESCALER_DIV128          LPTIM_CFG_PRESC_128         /**< PSC预分频器128分频 */
+
+/* LPTIM中断源 */
+#define LPTIM_INTERRUPT_ARRM            LPTIM_IER_ARRM_IE           /**< 自动重载匹配中断使能 */
+#define LPTIM_INTERRUPT_ITRF            LPTIM_IER_ITRF_IE           /**< 级联触发中断使能     */
+
+/* LPTIM中断状态标志 */
+#define LPTIM_FLAG_ARRM                 LPTIM_ISR_ARRM              /**< 自动重载匹配标志     */
+#define LPTIM_FLAG_ITRF                 LPTIM_ISR_ITRF              /**< 级联触发标志         */
+
+/* LPTIM中断清除标志 */
+#define LPTIM_CLEAR_ARRM                LPTIM_ICR_ARRM_CF           /**< 自动重载匹配标志清零 */
+#define LPTIM_CLEAR_ITRF                LPTIM_ICR_ITRF_CF           /**< 级联触发标志清零     */
+
+/** 
+* @} 
+*/
+
+/*-------------------------------------------functions------------------------------------------*/
+/************************************************************************************************/
+/**
+* @defgroup LPTIM_External_Functions LPTIM External Functions
+* @brief    LPTIM对外函数
+* @{
+*
+*/
+/************************************************************************************************/
+
+
+/** 
+* @brief  使能LPTIM
+* @note   在LPTIM使能位置位后,需要两个计数器周期后才能生效
+* @retval 无
+*/
+__STATIC_INLINE void std_lptim_enable(void)
+{
+    LPTIM1->CR |= LPTIM_CR_ENABLE;
+}
+
+
+/** 
+* @brief  禁止LPTIM
+* @retval 无
+*/
+__STATIC_INLINE void std_lptim_disable(void)
+{
+    LPTIM1->CR &= (~LPTIM_CR_ENABLE);
+}
+
+
+/** 
+* @brief  配置LPTIM计数器按照预期模式开始计数
+* @param  operate_mode 计数模式选择
+*             @arg LPTIM_COUNT_CONTINUOUS:    连续计数模式
+*             @arg LPTIM_COUNT_SINGLE:        单次计数模式
+* @note   必须使能LPTIM后才能启动计数器计数
+* @retval 无
+*/
+__STATIC_INLINE void std_lptim_start_counter(uint32_t operate_mode)
+{
+    MODIFY_REG(LPTIM1->CR, (LPTIM_CR_CNTSTRT | LPTIM_CR_SNGSTRT), operate_mode);
+}
+
+
+/** 
+* @brief  设置LPTIM自动重装载值
+* @param  auto_reload 自动重装载值(该变量的范围为0x0~0xFFFF)
+* @retval 无
+*/
+__STATIC_INLINE void std_lptim_set_auto_reload(uint32_t auto_reload)
+{
+    LPTIM1->ARR = auto_reload;
+}
+
+
+/** 
+* @brief  获取LPTIM自动重装载值
+* @retval uint32_t 自动重装载值(该变量的范围为0x0~0xFFFF)
+*/
+__STATIC_INLINE uint32_t std_lptim_get_auto_reload(void)
+{
+    return (LPTIM1->ARR);
+}
+
+
+/** 
+* @brief  获取LPTIM计数值
+* @note   当LPTIM为异步时钟计数时,为确保获取正确的计数值,需要确保两次读取的计数值一致。
+* @retval uint32_t LPTIM计数值(该变量的范围为0x0~0xFFFF)
+*/
+__STATIC_INLINE uint32_t std_lptim_get_count(void)
+{
+    return (LPTIM1->CNT);
+}
+
+
+/** 
+* @brief  设置LPTIM预分频器分频系数
+* @param  prescaler 预分频系数选择
+*             @arg LPTIM_PRESCALER_DIV1
+*             @arg LPTIM_PRESCALER_DIV2
+*             @arg LPTIM_PRESCALER_DIV4
+*             @arg ...
+*             @arg LPTIM_PRESCALER_DIV128
+* @retval 无
+*/
+__STATIC_INLINE void std_lptim_set_prescaler(uint32_t prescaler)
+{
+    MODIFY_REG(LPTIM1->CFG, LPTIM_CFG_PRESC, prescaler);
+}
+
+
+/** 
+* @brief  获取LPTIM预分频器分频系数
+* @retval uint32_t 预分频系数选择
+*             @arg LPTIM_PRESCALER_DIV1
+*             @arg LPTIM_PRESCALER_DIV2
+*             @arg LPTIM_PRESCALER_DIV4
+*             @arg ...
+*             @arg LPTIM_PRESCALER_DIV128
+*/
+__STATIC_INLINE uint32_t std_lptim_get_prescaler(void)
+{
+    return (LPTIM1->CFG & LPTIM_CFG_PRESC);
+}
+
+
+/** 
+* @brief  使能LPTIM级联触发
+* @retval 无
+*/
+__STATIC_INLINE void std_lptim_internal_trigger_enable(void)
+{
+    LPTIM1->CFG |= LPTIM_CFG_ITREN;
+}
+
+
+/** 
+* @brief  禁止LPTIM级联触发
+* @retval 无
+*/
+__STATIC_INLINE void std_lptim_internal_trigger_disable(void)
+{
+    LPTIM1->CFG &= ~LPTIM_CFG_ITREN;
+}
+
+
+/** 
+* @brief  使能LPTIM中断
+* @param  interrupt LPTIM中断源
+*             @arg LPTIM_INTERRUPT_ARRM:      自动重载匹配中断
+*             @arg LPTIM_INTERRUPT_ITRF:      级联触发中断使能
+* @retval 无
+*/
+__STATIC_INLINE void std_lptim_interrupt_enable(uint32_t interrupt)
+{
+    LPTIM1->IER |= interrupt;
+}
+
+
+/** 
+* @brief  禁止LPTIM中断
+* @param  interrupt LPTIM中断源
+*             @arg LPTIM_INTERRUPT_ARRM:      自动重载匹配中断
+*             @arg LPTIM_INTERRUPT_ITRF:      级联触发中断使能
+* @retval 无
+*/
+__STATIC_INLINE void std_lptim_interrupt_disable(uint32_t interrupt)
+{
+    LPTIM1->IER &= (~interrupt);
+}
+
+
+/** 
+* @brief  获取LPTIM中断状态
+* @param  interrupt LPTIM中断源
+*             @arg LPTIM_INTERRUPT_ARRM:      自动重载匹配中断
+*             @arg LPTIM_INTERRUPT_ITRF:      级联触发中断使能
+* @retval uint32_t LPTIM中断源使能状态
+*             @arg 非0: 使能
+*             @arg 0:   禁止
+*/
+__STATIC_INLINE uint32_t std_lptim_get_interrupt_status(uint32_t interrupt)
+{
+    return (LPTIM1->IER & interrupt);
+}
+
+
+/** 
+* @brief  获取LPTIM状态标志位
+* @param  flag LPTIM状态标志位
+*             @arg LPTIM_FLAG_ARRM:        自动重载匹配标志
+*             @arg LPTIM_FLAG_ITRF:        级联触发标志
+* @retval uint32_t LPTIM标志位的状态
+*             @arg 非0: 标志位置位
+*             @arg 0:   标志位清除
+*/
+__STATIC_INLINE uint32_t std_lptim_get_flag(uint32_t flag)
+{
+    return (LPTIM1->ISR & flag);
+}
+
+
+/** 
+* @brief  清除LPTIM状态标志位
+* @param  flag LPTIM状态标志位
+*             @arg LPTIM_CLEAR_ARRM:        自动重载匹配标志
+*             @arg LPTIM_CLEAR_ITRF:        级联触发标志清零
+* @retval 无
+*/
+__STATIC_INLINE void std_lptim_clear_flag(uint32_t flag)
+{
+    LPTIM1->ICR = flag;
+}
+
+
+/* LPTIM去初始化函数 */
+void std_lptim_deinit(void);
+
+/** 
+* @} 
+*/
+
+
+
+#ifdef __cplusplus
+}
+#endif
+
+/** 
+* @}
+*/
+
+/** 
+* @}
+*/
+     
+#endif /* CIU32F003_STD_LPTIM_H */

+ 301 - 0
CIU32F003_LIB/Include/ciu32f003_std_lptim(2).h

@@ -0,0 +1,301 @@
+/************************************************************************************************/
+/**
+* @file               ciu32f003_std_lptim.h
+* @author             MCU Ecosystem Development Team
+* @brief              LPTIM STD库驱动头文件。
+*                     提供LPTIM相关的STD库操作函数声明、数据类型以及常量的定义。
+*
+*
+**************************************************************************************************
+* @attention
+* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
+*
+**************************************************************************************************
+*/
+
+/*避免头文件重复引用*/
+#ifndef CIU32F003_STD_LPTIM_H
+#define CIU32F003_STD_LPTIM_H
+
+/************************************************************************************************/
+/** 
+* @addtogroup CIU32F003_STD_Driver
+* @{
+*/
+
+/**
+* @defgroup LPTIM LPTIM
+* @brief 低功耗定时器的STD库驱动
+* @{
+*/
+/************************************************************************************************/
+
+
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+     
+/*------------------------------------------includes--------------------------------------------*/
+#include "ciu32f003_std_common.h"
+
+/*--------------------------------------------define--------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @defgroup LPTIM_Constants LPTIM Constants
+* @brief    LPTIM常量定义及宏定义
+* @{
+*
+*/
+/************************************************************************************************/
+/* 计数器计数模式 */
+#define LPTIM_COUNT_CONTINUOUS          LPTIM_CR_CNTSTRT            /**< 连续计数模式    */
+#define LPTIM_COUNT_SINGLE              LPTIM_CR_SNGSTRT            /**< 单次计数模式    */
+
+/* LPTIM PSC预分频器分频系数选择 */
+#define LPTIM_PRESCALER_DIV1            LPTIM_CFG_PRESC_1           /**< PSC预分频器1分频   */
+#define LPTIM_PRESCALER_DIV2            LPTIM_CFG_PRESC_2           /**< PSC预分频器2分频   */
+#define LPTIM_PRESCALER_DIV4            LPTIM_CFG_PRESC_4           /**< PSC预分频器4分频   */
+#define LPTIM_PRESCALER_DIV8            LPTIM_CFG_PRESC_8           /**< PSC预分频器8分频   */
+#define LPTIM_PRESCALER_DIV16           LPTIM_CFG_PRESC_16          /**< PSC预分频器16分频  */
+#define LPTIM_PRESCALER_DIV32           LPTIM_CFG_PRESC_32          /**< PSC预分频器32分频  */
+#define LPTIM_PRESCALER_DIV64           LPTIM_CFG_PRESC_64          /**< PSC预分频器64分频  */
+#define LPTIM_PRESCALER_DIV128          LPTIM_CFG_PRESC_128         /**< PSC预分频器128分频 */
+
+/* LPTIM中断源 */
+#define LPTIM_INTERRUPT_ARRM            LPTIM_IER_ARRM_IE           /**< 自动重载匹配中断使能 */
+#define LPTIM_INTERRUPT_ITRF            LPTIM_IER_ITRF_IE           /**< 级联触发中断使能     */
+
+/* LPTIM中断状态标志 */
+#define LPTIM_FLAG_ARRM                 LPTIM_ISR_ARRM              /**< 自动重载匹配标志     */
+#define LPTIM_FLAG_ITRF                 LPTIM_ISR_ITRF              /**< 级联触发标志         */
+
+/* LPTIM中断清除标志 */
+#define LPTIM_CLEAR_ARRM                LPTIM_ICR_ARRM_CF           /**< 自动重载匹配标志清零 */
+#define LPTIM_CLEAR_ITRF                LPTIM_ICR_ITRF_CF           /**< 级联触发标志清零     */
+
+/** 
+* @} 
+*/
+
+/*-------------------------------------------functions------------------------------------------*/
+/************************************************************************************************/
+/**
+* @defgroup LPTIM_External_Functions LPTIM External Functions
+* @brief    LPTIM对外函数
+* @{
+*
+*/
+/************************************************************************************************/
+
+
+/** 
+* @brief  使能LPTIM
+* @note   在LPTIM使能位置位后,需要两个计数器周期后才能生效
+* @retval 无
+*/
+__STATIC_INLINE void std_lptim_enable(void)
+{
+    LPTIM1->CR |= LPTIM_CR_ENABLE;
+}
+
+
+/** 
+* @brief  禁止LPTIM
+* @retval 无
+*/
+__STATIC_INLINE void std_lptim_disable(void)
+{
+    LPTIM1->CR &= (~LPTIM_CR_ENABLE);
+}
+
+
+/** 
+* @brief  配置LPTIM计数器按照预期模式开始计数
+* @param  operate_mode 计数模式选择
+*             @arg LPTIM_COUNT_CONTINUOUS:    连续计数模式
+*             @arg LPTIM_COUNT_SINGLE:        单次计数模式
+* @note   必须使能LPTIM后才能启动计数器计数
+* @retval 无
+*/
+__STATIC_INLINE void std_lptim_start_counter(uint32_t operate_mode)
+{
+    MODIFY_REG(LPTIM1->CR, (LPTIM_CR_CNTSTRT | LPTIM_CR_SNGSTRT), operate_mode);
+}
+
+
+/** 
+* @brief  设置LPTIM自动重装载值
+* @param  auto_reload 自动重装载值(该变量的范围为0x0~0xFFFF)
+* @retval 无
+*/
+__STATIC_INLINE void std_lptim_set_auto_reload(uint32_t auto_reload)
+{
+    LPTIM1->ARR = auto_reload;
+}
+
+
+/** 
+* @brief  获取LPTIM自动重装载值
+* @retval uint32_t 自动重装载值(该变量的范围为0x0~0xFFFF)
+*/
+__STATIC_INLINE uint32_t std_lptim_get_auto_reload(void)
+{
+    return (LPTIM1->ARR);
+}
+
+
+/** 
+* @brief  获取LPTIM计数值
+* @note   当LPTIM为异步时钟计数时,为确保获取正确的计数值,需要确保两次读取的计数值一致。
+* @retval uint32_t LPTIM计数值(该变量的范围为0x0~0xFFFF)
+*/
+__STATIC_INLINE uint32_t std_lptim_get_count(void)
+{
+    return (LPTIM1->CNT);
+}
+
+
+/** 
+* @brief  设置LPTIM预分频器分频系数
+* @param  prescaler 预分频系数选择
+*             @arg LPTIM_PRESCALER_DIV1
+*             @arg LPTIM_PRESCALER_DIV2
+*             @arg LPTIM_PRESCALER_DIV4
+*             @arg ...
+*             @arg LPTIM_PRESCALER_DIV128
+* @retval 无
+*/
+__STATIC_INLINE void std_lptim_set_prescaler(uint32_t prescaler)
+{
+    MODIFY_REG(LPTIM1->CFG, LPTIM_CFG_PRESC, prescaler);
+}
+
+
+/** 
+* @brief  获取LPTIM预分频器分频系数
+* @retval uint32_t 预分频系数选择
+*             @arg LPTIM_PRESCALER_DIV1
+*             @arg LPTIM_PRESCALER_DIV2
+*             @arg LPTIM_PRESCALER_DIV4
+*             @arg ...
+*             @arg LPTIM_PRESCALER_DIV128
+*/
+__STATIC_INLINE uint32_t std_lptim_get_prescaler(void)
+{
+    return (LPTIM1->CFG & LPTIM_CFG_PRESC);
+}
+
+
+/** 
+* @brief  使能LPTIM级联触发
+* @retval 无
+*/
+__STATIC_INLINE void std_lptim_internal_trigger_enable(void)
+{
+    LPTIM1->CFG |= LPTIM_CFG_ITREN;
+}
+
+
+/** 
+* @brief  禁止LPTIM级联触发
+* @retval 无
+*/
+__STATIC_INLINE void std_lptim_internal_trigger_disable(void)
+{
+    LPTIM1->CFG &= ~LPTIM_CFG_ITREN;
+}
+
+
+/** 
+* @brief  使能LPTIM中断
+* @param  interrupt LPTIM中断源
+*             @arg LPTIM_INTERRUPT_ARRM:      自动重载匹配中断
+*             @arg LPTIM_INTERRUPT_ITRF:      级联触发中断使能
+* @retval 无
+*/
+__STATIC_INLINE void std_lptim_interrupt_enable(uint32_t interrupt)
+{
+    LPTIM1->IER |= interrupt;
+}
+
+
+/** 
+* @brief  禁止LPTIM中断
+* @param  interrupt LPTIM中断源
+*             @arg LPTIM_INTERRUPT_ARRM:      自动重载匹配中断
+*             @arg LPTIM_INTERRUPT_ITRF:      级联触发中断使能
+* @retval 无
+*/
+__STATIC_INLINE void std_lptim_interrupt_disable(uint32_t interrupt)
+{
+    LPTIM1->IER &= (~interrupt);
+}
+
+
+/** 
+* @brief  获取LPTIM中断状态
+* @param  interrupt LPTIM中断源
+*             @arg LPTIM_INTERRUPT_ARRM:      自动重载匹配中断
+*             @arg LPTIM_INTERRUPT_ITRF:      级联触发中断使能
+* @retval uint32_t LPTIM中断源使能状态
+*             @arg 非0: 使能
+*             @arg 0:   禁止
+*/
+__STATIC_INLINE uint32_t std_lptim_get_interrupt_status(uint32_t interrupt)
+{
+    return (LPTIM1->IER & interrupt);
+}
+
+
+/** 
+* @brief  获取LPTIM状态标志位
+* @param  flag LPTIM状态标志位
+*             @arg LPTIM_FLAG_ARRM:        自动重载匹配标志
+*             @arg LPTIM_FLAG_ITRF:        级联触发标志
+* @retval uint32_t LPTIM标志位的状态
+*             @arg 非0: 标志位置位
+*             @arg 0:   标志位清除
+*/
+__STATIC_INLINE uint32_t std_lptim_get_flag(uint32_t flag)
+{
+    return (LPTIM1->ISR & flag);
+}
+
+
+/** 
+* @brief  清除LPTIM状态标志位
+* @param  flag LPTIM状态标志位
+*             @arg LPTIM_CLEAR_ARRM:        自动重载匹配标志
+*             @arg LPTIM_CLEAR_ITRF:        级联触发标志清零
+* @retval 无
+*/
+__STATIC_INLINE void std_lptim_clear_flag(uint32_t flag)
+{
+    LPTIM1->ICR = flag;
+}
+
+
+/* LPTIM去初始化函数 */
+void std_lptim_deinit(void);
+
+/** 
+* @} 
+*/
+
+
+
+#ifdef __cplusplus
+}
+#endif
+
+/** 
+* @}
+*/
+
+/** 
+* @}
+*/
+     
+#endif /* CIU32F003_STD_LPTIM_H */

+ 301 - 0
CIU32F003_LIB/Include/ciu32f003_std_lptim(3).h

@@ -0,0 +1,301 @@
+/************************************************************************************************/
+/**
+* @file               ciu32f003_std_lptim.h
+* @author             MCU Ecosystem Development Team
+* @brief              LPTIM STD库驱动头文件。
+*                     提供LPTIM相关的STD库操作函数声明、数据类型以及常量的定义。
+*
+*
+**************************************************************************************************
+* @attention
+* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
+*
+**************************************************************************************************
+*/
+
+/*避免头文件重复引用*/
+#ifndef CIU32F003_STD_LPTIM_H
+#define CIU32F003_STD_LPTIM_H
+
+/************************************************************************************************/
+/** 
+* @addtogroup CIU32F003_STD_Driver
+* @{
+*/
+
+/**
+* @defgroup LPTIM LPTIM
+* @brief 低功耗定时器的STD库驱动
+* @{
+*/
+/************************************************************************************************/
+
+
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+     
+/*------------------------------------------includes--------------------------------------------*/
+#include "ciu32f003_std_common.h"
+
+/*--------------------------------------------define--------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @defgroup LPTIM_Constants LPTIM Constants
+* @brief    LPTIM常量定义及宏定义
+* @{
+*
+*/
+/************************************************************************************************/
+/* 计数器计数模式 */
+#define LPTIM_COUNT_CONTINUOUS          LPTIM_CR_CNTSTRT            /**< 连续计数模式    */
+#define LPTIM_COUNT_SINGLE              LPTIM_CR_SNGSTRT            /**< 单次计数模式    */
+
+/* LPTIM PSC预分频器分频系数选择 */
+#define LPTIM_PRESCALER_DIV1            LPTIM_CFG_PRESC_1           /**< PSC预分频器1分频   */
+#define LPTIM_PRESCALER_DIV2            LPTIM_CFG_PRESC_2           /**< PSC预分频器2分频   */
+#define LPTIM_PRESCALER_DIV4            LPTIM_CFG_PRESC_4           /**< PSC预分频器4分频   */
+#define LPTIM_PRESCALER_DIV8            LPTIM_CFG_PRESC_8           /**< PSC预分频器8分频   */
+#define LPTIM_PRESCALER_DIV16           LPTIM_CFG_PRESC_16          /**< PSC预分频器16分频  */
+#define LPTIM_PRESCALER_DIV32           LPTIM_CFG_PRESC_32          /**< PSC预分频器32分频  */
+#define LPTIM_PRESCALER_DIV64           LPTIM_CFG_PRESC_64          /**< PSC预分频器64分频  */
+#define LPTIM_PRESCALER_DIV128          LPTIM_CFG_PRESC_128         /**< PSC预分频器128分频 */
+
+/* LPTIM中断源 */
+#define LPTIM_INTERRUPT_ARRM            LPTIM_IER_ARRM_IE           /**< 自动重载匹配中断使能 */
+#define LPTIM_INTERRUPT_ITRF            LPTIM_IER_ITRF_IE           /**< 级联触发中断使能     */
+
+/* LPTIM中断状态标志 */
+#define LPTIM_FLAG_ARRM                 LPTIM_ISR_ARRM              /**< 自动重载匹配标志     */
+#define LPTIM_FLAG_ITRF                 LPTIM_ISR_ITRF              /**< 级联触发标志         */
+
+/* LPTIM中断清除标志 */
+#define LPTIM_CLEAR_ARRM                LPTIM_ICR_ARRM_CF           /**< 自动重载匹配标志清零 */
+#define LPTIM_CLEAR_ITRF                LPTIM_ICR_ITRF_CF           /**< 级联触发标志清零     */
+
+/** 
+* @} 
+*/
+
+/*-------------------------------------------functions------------------------------------------*/
+/************************************************************************************************/
+/**
+* @defgroup LPTIM_External_Functions LPTIM External Functions
+* @brief    LPTIM对外函数
+* @{
+*
+*/
+/************************************************************************************************/
+
+
+/** 
+* @brief  使能LPTIM
+* @note   在LPTIM使能位置位后,需要两个计数器周期后才能生效
+* @retval 无
+*/
+__STATIC_INLINE void std_lptim_enable(void)
+{
+    LPTIM1->CR |= LPTIM_CR_ENABLE;
+}
+
+
+/** 
+* @brief  禁止LPTIM
+* @retval 无
+*/
+__STATIC_INLINE void std_lptim_disable(void)
+{
+    LPTIM1->CR &= (~LPTIM_CR_ENABLE);
+}
+
+
+/** 
+* @brief  配置LPTIM计数器按照预期模式开始计数
+* @param  operate_mode 计数模式选择
+*             @arg LPTIM_COUNT_CONTINUOUS:    连续计数模式
+*             @arg LPTIM_COUNT_SINGLE:        单次计数模式
+* @note   必须使能LPTIM后才能启动计数器计数
+* @retval 无
+*/
+__STATIC_INLINE void std_lptim_start_counter(uint32_t operate_mode)
+{
+    MODIFY_REG(LPTIM1->CR, (LPTIM_CR_CNTSTRT | LPTIM_CR_SNGSTRT), operate_mode);
+}
+
+
+/** 
+* @brief  设置LPTIM自动重装载值
+* @param  auto_reload 自动重装载值(该变量的范围为0x0~0xFFFF)
+* @retval 无
+*/
+__STATIC_INLINE void std_lptim_set_auto_reload(uint32_t auto_reload)
+{
+    LPTIM1->ARR = auto_reload;
+}
+
+
+/** 
+* @brief  获取LPTIM自动重装载值
+* @retval uint32_t 自动重装载值(该变量的范围为0x0~0xFFFF)
+*/
+__STATIC_INLINE uint32_t std_lptim_get_auto_reload(void)
+{
+    return (LPTIM1->ARR);
+}
+
+
+/** 
+* @brief  获取LPTIM计数值
+* @note   当LPTIM为异步时钟计数时,为确保获取正确的计数值,需要确保两次读取的计数值一致。
+* @retval uint32_t LPTIM计数值(该变量的范围为0x0~0xFFFF)
+*/
+__STATIC_INLINE uint32_t std_lptim_get_count(void)
+{
+    return (LPTIM1->CNT);
+}
+
+
+/** 
+* @brief  设置LPTIM预分频器分频系数
+* @param  prescaler 预分频系数选择
+*             @arg LPTIM_PRESCALER_DIV1
+*             @arg LPTIM_PRESCALER_DIV2
+*             @arg LPTIM_PRESCALER_DIV4
+*             @arg ...
+*             @arg LPTIM_PRESCALER_DIV128
+* @retval 无
+*/
+__STATIC_INLINE void std_lptim_set_prescaler(uint32_t prescaler)
+{
+    MODIFY_REG(LPTIM1->CFG, LPTIM_CFG_PRESC, prescaler);
+}
+
+
+/** 
+* @brief  获取LPTIM预分频器分频系数
+* @retval uint32_t 预分频系数选择
+*             @arg LPTIM_PRESCALER_DIV1
+*             @arg LPTIM_PRESCALER_DIV2
+*             @arg LPTIM_PRESCALER_DIV4
+*             @arg ...
+*             @arg LPTIM_PRESCALER_DIV128
+*/
+__STATIC_INLINE uint32_t std_lptim_get_prescaler(void)
+{
+    return (LPTIM1->CFG & LPTIM_CFG_PRESC);
+}
+
+
+/** 
+* @brief  使能LPTIM级联触发
+* @retval 无
+*/
+__STATIC_INLINE void std_lptim_internal_trigger_enable(void)
+{
+    LPTIM1->CFG |= LPTIM_CFG_ITREN;
+}
+
+
+/** 
+* @brief  禁止LPTIM级联触发
+* @retval 无
+*/
+__STATIC_INLINE void std_lptim_internal_trigger_disable(void)
+{
+    LPTIM1->CFG &= ~LPTIM_CFG_ITREN;
+}
+
+
+/** 
+* @brief  使能LPTIM中断
+* @param  interrupt LPTIM中断源
+*             @arg LPTIM_INTERRUPT_ARRM:      自动重载匹配中断
+*             @arg LPTIM_INTERRUPT_ITRF:      级联触发中断使能
+* @retval 无
+*/
+__STATIC_INLINE void std_lptim_interrupt_enable(uint32_t interrupt)
+{
+    LPTIM1->IER |= interrupt;
+}
+
+
+/** 
+* @brief  禁止LPTIM中断
+* @param  interrupt LPTIM中断源
+*             @arg LPTIM_INTERRUPT_ARRM:      自动重载匹配中断
+*             @arg LPTIM_INTERRUPT_ITRF:      级联触发中断使能
+* @retval 无
+*/
+__STATIC_INLINE void std_lptim_interrupt_disable(uint32_t interrupt)
+{
+    LPTIM1->IER &= (~interrupt);
+}
+
+
+/** 
+* @brief  获取LPTIM中断状态
+* @param  interrupt LPTIM中断源
+*             @arg LPTIM_INTERRUPT_ARRM:      自动重载匹配中断
+*             @arg LPTIM_INTERRUPT_ITRF:      级联触发中断使能
+* @retval uint32_t LPTIM中断源使能状态
+*             @arg 非0: 使能
+*             @arg 0:   禁止
+*/
+__STATIC_INLINE uint32_t std_lptim_get_interrupt_status(uint32_t interrupt)
+{
+    return (LPTIM1->IER & interrupt);
+}
+
+
+/** 
+* @brief  获取LPTIM状态标志位
+* @param  flag LPTIM状态标志位
+*             @arg LPTIM_FLAG_ARRM:        自动重载匹配标志
+*             @arg LPTIM_FLAG_ITRF:        级联触发标志
+* @retval uint32_t LPTIM标志位的状态
+*             @arg 非0: 标志位置位
+*             @arg 0:   标志位清除
+*/
+__STATIC_INLINE uint32_t std_lptim_get_flag(uint32_t flag)
+{
+    return (LPTIM1->ISR & flag);
+}
+
+
+/** 
+* @brief  清除LPTIM状态标志位
+* @param  flag LPTIM状态标志位
+*             @arg LPTIM_CLEAR_ARRM:        自动重载匹配标志
+*             @arg LPTIM_CLEAR_ITRF:        级联触发标志清零
+* @retval 无
+*/
+__STATIC_INLINE void std_lptim_clear_flag(uint32_t flag)
+{
+    LPTIM1->ICR = flag;
+}
+
+
+/* LPTIM去初始化函数 */
+void std_lptim_deinit(void);
+
+/** 
+* @} 
+*/
+
+
+
+#ifdef __cplusplus
+}
+#endif
+
+/** 
+* @}
+*/
+
+/** 
+* @}
+*/
+     
+#endif /* CIU32F003_STD_LPTIM_H */

+ 301 - 0
CIU32F003_LIB/Include/ciu32f003_std_lptim.h

@@ -0,0 +1,301 @@
+/************************************************************************************************/
+/**
+* @file               ciu32f003_std_lptim.h
+* @author             MCU Ecosystem Development Team
+* @brief              LPTIM STD库驱动头文件。
+*                     提供LPTIM相关的STD库操作函数声明、数据类型以及常量的定义。
+*
+*
+**************************************************************************************************
+* @attention
+* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
+*
+**************************************************************************************************
+*/
+
+/*避免头文件重复引用*/
+#ifndef CIU32F003_STD_LPTIM_H
+#define CIU32F003_STD_LPTIM_H
+
+/************************************************************************************************/
+/** 
+* @addtogroup CIU32F003_STD_Driver
+* @{
+*/
+
+/**
+* @defgroup LPTIM LPTIM
+* @brief 低功耗定时器的STD库驱动
+* @{
+*/
+/************************************************************************************************/
+
+
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+     
+/*------------------------------------------includes--------------------------------------------*/
+#include "ciu32f003_std_common.h"
+
+/*--------------------------------------------define--------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @defgroup LPTIM_Constants LPTIM Constants
+* @brief    LPTIM常量定义及宏定义
+* @{
+*
+*/
+/************************************************************************************************/
+/* 计数器计数模式 */
+#define LPTIM_COUNT_CONTINUOUS          LPTIM_CR_CNTSTRT            /**< 连续计数模式    */
+#define LPTIM_COUNT_SINGLE              LPTIM_CR_SNGSTRT            /**< 单次计数模式    */
+
+/* LPTIM PSC预分频器分频系数选择 */
+#define LPTIM_PRESCALER_DIV1            LPTIM_CFG_PRESC_1           /**< PSC预分频器1分频   */
+#define LPTIM_PRESCALER_DIV2            LPTIM_CFG_PRESC_2           /**< PSC预分频器2分频   */
+#define LPTIM_PRESCALER_DIV4            LPTIM_CFG_PRESC_4           /**< PSC预分频器4分频   */
+#define LPTIM_PRESCALER_DIV8            LPTIM_CFG_PRESC_8           /**< PSC预分频器8分频   */
+#define LPTIM_PRESCALER_DIV16           LPTIM_CFG_PRESC_16          /**< PSC预分频器16分频  */
+#define LPTIM_PRESCALER_DIV32           LPTIM_CFG_PRESC_32          /**< PSC预分频器32分频  */
+#define LPTIM_PRESCALER_DIV64           LPTIM_CFG_PRESC_64          /**< PSC预分频器64分频  */
+#define LPTIM_PRESCALER_DIV128          LPTIM_CFG_PRESC_128         /**< PSC预分频器128分频 */
+
+/* LPTIM中断源 */
+#define LPTIM_INTERRUPT_ARRM            LPTIM_IER_ARRM_IE           /**< 自动重载匹配中断使能 */
+#define LPTIM_INTERRUPT_ITRF            LPTIM_IER_ITRF_IE           /**< 级联触发中断使能     */
+
+/* LPTIM中断状态标志 */
+#define LPTIM_FLAG_ARRM                 LPTIM_ISR_ARRM              /**< 自动重载匹配标志     */
+#define LPTIM_FLAG_ITRF                 LPTIM_ISR_ITRF              /**< 级联触发标志         */
+
+/* LPTIM中断清除标志 */
+#define LPTIM_CLEAR_ARRM                LPTIM_ICR_ARRM_CF           /**< 自动重载匹配标志清零 */
+#define LPTIM_CLEAR_ITRF                LPTIM_ICR_ITRF_CF           /**< 级联触发标志清零     */
+
+/** 
+* @} 
+*/
+
+/*-------------------------------------------functions------------------------------------------*/
+/************************************************************************************************/
+/**
+* @defgroup LPTIM_External_Functions LPTIM External Functions
+* @brief    LPTIM对外函数
+* @{
+*
+*/
+/************************************************************************************************/
+
+
+/** 
+* @brief  使能LPTIM
+* @note   在LPTIM使能位置位后,需要两个计数器周期后才能生效
+* @retval 无
+*/
+__STATIC_INLINE void std_lptim_enable(void)
+{
+    LPTIM1->CR |= LPTIM_CR_ENABLE;
+}
+
+
+/** 
+* @brief  禁止LPTIM
+* @retval 无
+*/
+__STATIC_INLINE void std_lptim_disable(void)
+{
+    LPTIM1->CR &= (~LPTIM_CR_ENABLE);
+}
+
+
+/** 
+* @brief  配置LPTIM计数器按照预期模式开始计数
+* @param  operate_mode 计数模式选择
+*             @arg LPTIM_COUNT_CONTINUOUS:    连续计数模式
+*             @arg LPTIM_COUNT_SINGLE:        单次计数模式
+* @note   必须使能LPTIM后才能启动计数器计数
+* @retval 无
+*/
+__STATIC_INLINE void std_lptim_start_counter(uint32_t operate_mode)
+{
+    MODIFY_REG(LPTIM1->CR, (LPTIM_CR_CNTSTRT | LPTIM_CR_SNGSTRT), operate_mode);
+}
+
+
+/** 
+* @brief  设置LPTIM自动重装载值
+* @param  auto_reload 自动重装载值(该变量的范围为0x0~0xFFFF)
+* @retval 无
+*/
+__STATIC_INLINE void std_lptim_set_auto_reload(uint32_t auto_reload)
+{
+    LPTIM1->ARR = auto_reload;
+}
+
+
+/** 
+* @brief  获取LPTIM自动重装载值
+* @retval uint32_t 自动重装载值(该变量的范围为0x0~0xFFFF)
+*/
+__STATIC_INLINE uint32_t std_lptim_get_auto_reload(void)
+{
+    return (LPTIM1->ARR);
+}
+
+
+/** 
+* @brief  获取LPTIM计数值
+* @note   当LPTIM为异步时钟计数时,为确保获取正确的计数值,需要确保两次读取的计数值一致。
+* @retval uint32_t LPTIM计数值(该变量的范围为0x0~0xFFFF)
+*/
+__STATIC_INLINE uint32_t std_lptim_get_count(void)
+{
+    return (LPTIM1->CNT);
+}
+
+
+/** 
+* @brief  设置LPTIM预分频器分频系数
+* @param  prescaler 预分频系数选择
+*             @arg LPTIM_PRESCALER_DIV1
+*             @arg LPTIM_PRESCALER_DIV2
+*             @arg LPTIM_PRESCALER_DIV4
+*             @arg ...
+*             @arg LPTIM_PRESCALER_DIV128
+* @retval 无
+*/
+__STATIC_INLINE void std_lptim_set_prescaler(uint32_t prescaler)
+{
+    MODIFY_REG(LPTIM1->CFG, LPTIM_CFG_PRESC, prescaler);
+}
+
+
+/** 
+* @brief  获取LPTIM预分频器分频系数
+* @retval uint32_t 预分频系数选择
+*             @arg LPTIM_PRESCALER_DIV1
+*             @arg LPTIM_PRESCALER_DIV2
+*             @arg LPTIM_PRESCALER_DIV4
+*             @arg ...
+*             @arg LPTIM_PRESCALER_DIV128
+*/
+__STATIC_INLINE uint32_t std_lptim_get_prescaler(void)
+{
+    return (LPTIM1->CFG & LPTIM_CFG_PRESC);
+}
+
+
+/** 
+* @brief  使能LPTIM级联触发
+* @retval 无
+*/
+__STATIC_INLINE void std_lptim_internal_trigger_enable(void)
+{
+    LPTIM1->CFG |= LPTIM_CFG_ITREN;
+}
+
+
+/** 
+* @brief  禁止LPTIM级联触发
+* @retval 无
+*/
+__STATIC_INLINE void std_lptim_internal_trigger_disable(void)
+{
+    LPTIM1->CFG &= ~LPTIM_CFG_ITREN;
+}
+
+
+/** 
+* @brief  使能LPTIM中断
+* @param  interrupt LPTIM中断源
+*             @arg LPTIM_INTERRUPT_ARRM:      自动重载匹配中断
+*             @arg LPTIM_INTERRUPT_ITRF:      级联触发中断使能
+* @retval 无
+*/
+__STATIC_INLINE void std_lptim_interrupt_enable(uint32_t interrupt)
+{
+    LPTIM1->IER |= interrupt;
+}
+
+
+/** 
+* @brief  禁止LPTIM中断
+* @param  interrupt LPTIM中断源
+*             @arg LPTIM_INTERRUPT_ARRM:      自动重载匹配中断
+*             @arg LPTIM_INTERRUPT_ITRF:      级联触发中断使能
+* @retval 无
+*/
+__STATIC_INLINE void std_lptim_interrupt_disable(uint32_t interrupt)
+{
+    LPTIM1->IER &= (~interrupt);
+}
+
+
+/** 
+* @brief  获取LPTIM中断状态
+* @param  interrupt LPTIM中断源
+*             @arg LPTIM_INTERRUPT_ARRM:      自动重载匹配中断
+*             @arg LPTIM_INTERRUPT_ITRF:      级联触发中断使能
+* @retval uint32_t LPTIM中断源使能状态
+*             @arg 非0: 使能
+*             @arg 0:   禁止
+*/
+__STATIC_INLINE uint32_t std_lptim_get_interrupt_status(uint32_t interrupt)
+{
+    return (LPTIM1->IER & interrupt);
+}
+
+
+/** 
+* @brief  获取LPTIM状态标志位
+* @param  flag LPTIM状态标志位
+*             @arg LPTIM_FLAG_ARRM:        自动重载匹配标志
+*             @arg LPTIM_FLAG_ITRF:        级联触发标志
+* @retval uint32_t LPTIM标志位的状态
+*             @arg 非0: 标志位置位
+*             @arg 0:   标志位清除
+*/
+__STATIC_INLINE uint32_t std_lptim_get_flag(uint32_t flag)
+{
+    return (LPTIM1->ISR & flag);
+}
+
+
+/** 
+* @brief  清除LPTIM状态标志位
+* @param  flag LPTIM状态标志位
+*             @arg LPTIM_CLEAR_ARRM:        自动重载匹配标志
+*             @arg LPTIM_CLEAR_ITRF:        级联触发标志清零
+* @retval 无
+*/
+__STATIC_INLINE void std_lptim_clear_flag(uint32_t flag)
+{
+    LPTIM1->ICR = flag;
+}
+
+
+/* LPTIM去初始化函数 */
+void std_lptim_deinit(void);
+
+/** 
+* @} 
+*/
+
+
+
+#ifdef __cplusplus
+}
+#endif
+
+/** 
+* @}
+*/
+
+/** 
+* @}
+*/
+     
+#endif /* CIU32F003_STD_LPTIM_H */

+ 110 - 0
CIU32F003_LIB/Include/ciu32f003_std_pmu(1).h

@@ -0,0 +1,110 @@
+/************************************************************************************************/
+/**
+* @file               ciu32f003_std_pmu.h
+* @author             MCU Ecosystem Development Team
+* @brief              PMU STD库驱动头文件。
+*                     提供PMU相关STD库操作函数声明、数据类型以及常量的定义。 
+*                      
+*
+**************************************************************************************************
+* @attention
+* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
+*
+**************************************************************************************************
+*/
+
+/*避免头文件重复引用*/
+#ifndef CIU32F003_STD_PMU_H
+#define CIU32F003_STD_PMU_H
+
+/************************************************************************************************/
+/** 
+* @addtogroup CIU32F003_STD_Driver
+* @{
+*/
+
+/**
+* @defgroup PMU PMU
+* @brief 电源管理单元的STD库驱动
+* @{
+*/
+/************************************************************************************************/
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/*------------------------------------------includes--------------------------------------------*/
+#include "ciu32f003_std_common.h"
+
+
+/*--------------------------------------------define--------------------------------------------*/
+/************************************************************************************************/
+/** 
+* @defgroup PMU_Constants PMU Constants
+* @brief PMU常量定义及宏定义
+* @{
+*/
+/************************************************************************************************/
+/* 低功耗进入方式定义 */
+#define PMU_ENTRY_LOWPOWER_MODE_WFI         (0x00UL)                            /**< WFI方式进入低功耗   */
+#define PMU_ENTRY_LOWPOWER_MODE_WFE         (0x01UL)                            /**< WFE方式进入低功耗   */
+     
+/* 低功耗模式定义 */     
+#define PMU_MODE_STOP                       PMU_CR_LP_MODE_STOP                 /**< Stop模式            */
+#define PMU_MODE_DEEPSTOP                   PMU_CR_LP_MODE_DEEPSTOP             /**< Deepstop模式        */
+
+/* Deepstop模式唤醒过程中Flash的唤醒等待时间定义 */
+#define PMU_DEEPSTOP_FLASH_WAKEUP_TIME_0       (0x3UL << PMU_FLASH_WAKEUP_FLASH_WAKEUP_POS)       /**< Deepstop模式唤醒过程中Flash的唤醒等待时间为0us   */
+#define PMU_DEEPSTOP_FLASH_WAKEUP_TIME_10      (0x00000000U)                                      /**< Deepstop模式唤醒过程中Flash的唤醒等待时间为10us  */
+
+
+/** 
+* @} 
+*/
+
+/*-------------------------------------------functions------------------------------------------*/
+/************************************************************************************************/
+/**
+* @defgroup PMU_External_Functions PMU External Functions
+* @brief    PMU对外函数
+* @{
+*/
+/************************************************************************************************/
+/**
+* @brief  配置Deepstop模式唤醒过程中Flash的唤醒等待时间
+* @param  time_value 等待时间
+*             @arg PMU_DEEPSTOP_FLASH_WAKEUP_TIME_0 : 0us
+*             @arg PMU_DEEPSTOP_FLASH_WAKEUP_TIME_10: 10us
+* @retval 无
+*/
+__STATIC_INLINE void std_pmu_deepstop_flash_wakeup_time_config(uint32_t time_value)           
+{
+    MODIFY_REG(PMU->FLASH_WAKEUP, PMU_FLASH_WAKEUP_FLASH_WAKEUP, time_value);
+}
+
+
+/* PMU低功耗模式相关函数 */
+void std_pmu_enter_sleep(uint32_t mode_entry);
+void std_pmu_enter_stop(uint32_t stop_mode, uint32_t mode_entry);
+
+
+/**
+* @}
+*/
+
+
+#ifdef __cplusplus
+}
+#endif
+
+/**
+* @}
+*/
+
+/**
+* @}
+*/
+
+#endif /* CIU32F003_STD_PMU_H */
+

+ 110 - 0
CIU32F003_LIB/Include/ciu32f003_std_pmu(2).h

@@ -0,0 +1,110 @@
+/************************************************************************************************/
+/**
+* @file               ciu32f003_std_pmu.h
+* @author             MCU Ecosystem Development Team
+* @brief              PMU STD库驱动头文件。
+*                     提供PMU相关STD库操作函数声明、数据类型以及常量的定义。 
+*                      
+*
+**************************************************************************************************
+* @attention
+* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
+*
+**************************************************************************************************
+*/
+
+/*避免头文件重复引用*/
+#ifndef CIU32F003_STD_PMU_H
+#define CIU32F003_STD_PMU_H
+
+/************************************************************************************************/
+/** 
+* @addtogroup CIU32F003_STD_Driver
+* @{
+*/
+
+/**
+* @defgroup PMU PMU
+* @brief 电源管理单元的STD库驱动
+* @{
+*/
+/************************************************************************************************/
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/*------------------------------------------includes--------------------------------------------*/
+#include "ciu32f003_std_common.h"
+
+
+/*--------------------------------------------define--------------------------------------------*/
+/************************************************************************************************/
+/** 
+* @defgroup PMU_Constants PMU Constants
+* @brief PMU常量定义及宏定义
+* @{
+*/
+/************************************************************************************************/
+/* 低功耗进入方式定义 */
+#define PMU_ENTRY_LOWPOWER_MODE_WFI         (0x00UL)                            /**< WFI方式进入低功耗   */
+#define PMU_ENTRY_LOWPOWER_MODE_WFE         (0x01UL)                            /**< WFE方式进入低功耗   */
+     
+/* 低功耗模式定义 */     
+#define PMU_MODE_STOP                       PMU_CR_LP_MODE_STOP                 /**< Stop模式            */
+#define PMU_MODE_DEEPSTOP                   PMU_CR_LP_MODE_DEEPSTOP             /**< Deepstop模式        */
+
+/* Deepstop模式唤醒过程中Flash的唤醒等待时间定义 */
+#define PMU_DEEPSTOP_FLASH_WAKEUP_TIME_0       (0x3UL << PMU_FLASH_WAKEUP_FLASH_WAKEUP_POS)       /**< Deepstop模式唤醒过程中Flash的唤醒等待时间为0us   */
+#define PMU_DEEPSTOP_FLASH_WAKEUP_TIME_10      (0x00000000U)                                      /**< Deepstop模式唤醒过程中Flash的唤醒等待时间为10us  */
+
+
+/** 
+* @} 
+*/
+
+/*-------------------------------------------functions------------------------------------------*/
+/************************************************************************************************/
+/**
+* @defgroup PMU_External_Functions PMU External Functions
+* @brief    PMU对外函数
+* @{
+*/
+/************************************************************************************************/
+/**
+* @brief  配置Deepstop模式唤醒过程中Flash的唤醒等待时间
+* @param  time_value 等待时间
+*             @arg PMU_DEEPSTOP_FLASH_WAKEUP_TIME_0 : 0us
+*             @arg PMU_DEEPSTOP_FLASH_WAKEUP_TIME_10: 10us
+* @retval 无
+*/
+__STATIC_INLINE void std_pmu_deepstop_flash_wakeup_time_config(uint32_t time_value)           
+{
+    MODIFY_REG(PMU->FLASH_WAKEUP, PMU_FLASH_WAKEUP_FLASH_WAKEUP, time_value);
+}
+
+
+/* PMU低功耗模式相关函数 */
+void std_pmu_enter_sleep(uint32_t mode_entry);
+void std_pmu_enter_stop(uint32_t stop_mode, uint32_t mode_entry);
+
+
+/**
+* @}
+*/
+
+
+#ifdef __cplusplus
+}
+#endif
+
+/**
+* @}
+*/
+
+/**
+* @}
+*/
+
+#endif /* CIU32F003_STD_PMU_H */
+

+ 110 - 0
CIU32F003_LIB/Include/ciu32f003_std_pmu(3).h

@@ -0,0 +1,110 @@
+/************************************************************************************************/
+/**
+* @file               ciu32f003_std_pmu.h
+* @author             MCU Ecosystem Development Team
+* @brief              PMU STD库驱动头文件。
+*                     提供PMU相关STD库操作函数声明、数据类型以及常量的定义。 
+*                      
+*
+**************************************************************************************************
+* @attention
+* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
+*
+**************************************************************************************************
+*/
+
+/*避免头文件重复引用*/
+#ifndef CIU32F003_STD_PMU_H
+#define CIU32F003_STD_PMU_H
+
+/************************************************************************************************/
+/** 
+* @addtogroup CIU32F003_STD_Driver
+* @{
+*/
+
+/**
+* @defgroup PMU PMU
+* @brief 电源管理单元的STD库驱动
+* @{
+*/
+/************************************************************************************************/
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/*------------------------------------------includes--------------------------------------------*/
+#include "ciu32f003_std_common.h"
+
+
+/*--------------------------------------------define--------------------------------------------*/
+/************************************************************************************************/
+/** 
+* @defgroup PMU_Constants PMU Constants
+* @brief PMU常量定义及宏定义
+* @{
+*/
+/************************************************************************************************/
+/* 低功耗进入方式定义 */
+#define PMU_ENTRY_LOWPOWER_MODE_WFI         (0x00UL)                            /**< WFI方式进入低功耗   */
+#define PMU_ENTRY_LOWPOWER_MODE_WFE         (0x01UL)                            /**< WFE方式进入低功耗   */
+     
+/* 低功耗模式定义 */     
+#define PMU_MODE_STOP                       PMU_CR_LP_MODE_STOP                 /**< Stop模式            */
+#define PMU_MODE_DEEPSTOP                   PMU_CR_LP_MODE_DEEPSTOP             /**< Deepstop模式        */
+
+/* Deepstop模式唤醒过程中Flash的唤醒等待时间定义 */
+#define PMU_DEEPSTOP_FLASH_WAKEUP_TIME_0       (0x3UL << PMU_FLASH_WAKEUP_FLASH_WAKEUP_POS)       /**< Deepstop模式唤醒过程中Flash的唤醒等待时间为0us   */
+#define PMU_DEEPSTOP_FLASH_WAKEUP_TIME_10      (0x00000000U)                                      /**< Deepstop模式唤醒过程中Flash的唤醒等待时间为10us  */
+
+
+/** 
+* @} 
+*/
+
+/*-------------------------------------------functions------------------------------------------*/
+/************************************************************************************************/
+/**
+* @defgroup PMU_External_Functions PMU External Functions
+* @brief    PMU对外函数
+* @{
+*/
+/************************************************************************************************/
+/**
+* @brief  配置Deepstop模式唤醒过程中Flash的唤醒等待时间
+* @param  time_value 等待时间
+*             @arg PMU_DEEPSTOP_FLASH_WAKEUP_TIME_0 : 0us
+*             @arg PMU_DEEPSTOP_FLASH_WAKEUP_TIME_10: 10us
+* @retval 无
+*/
+__STATIC_INLINE void std_pmu_deepstop_flash_wakeup_time_config(uint32_t time_value)           
+{
+    MODIFY_REG(PMU->FLASH_WAKEUP, PMU_FLASH_WAKEUP_FLASH_WAKEUP, time_value);
+}
+
+
+/* PMU低功耗模式相关函数 */
+void std_pmu_enter_sleep(uint32_t mode_entry);
+void std_pmu_enter_stop(uint32_t stop_mode, uint32_t mode_entry);
+
+
+/**
+* @}
+*/
+
+
+#ifdef __cplusplus
+}
+#endif
+
+/**
+* @}
+*/
+
+/**
+* @}
+*/
+
+#endif /* CIU32F003_STD_PMU_H */
+

+ 110 - 0
CIU32F003_LIB/Include/ciu32f003_std_pmu.h

@@ -0,0 +1,110 @@
+/************************************************************************************************/
+/**
+* @file               ciu32f003_std_pmu.h
+* @author             MCU Ecosystem Development Team
+* @brief              PMU STD库驱动头文件。
+*                     提供PMU相关STD库操作函数声明、数据类型以及常量的定义。 
+*                      
+*
+**************************************************************************************************
+* @attention
+* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
+*
+**************************************************************************************************
+*/
+
+/*避免头文件重复引用*/
+#ifndef CIU32F003_STD_PMU_H
+#define CIU32F003_STD_PMU_H
+
+/************************************************************************************************/
+/** 
+* @addtogroup CIU32F003_STD_Driver
+* @{
+*/
+
+/**
+* @defgroup PMU PMU
+* @brief 电源管理单元的STD库驱动
+* @{
+*/
+/************************************************************************************************/
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/*------------------------------------------includes--------------------------------------------*/
+#include "ciu32f003_std_common.h"
+
+
+/*--------------------------------------------define--------------------------------------------*/
+/************************************************************************************************/
+/** 
+* @defgroup PMU_Constants PMU Constants
+* @brief PMU常量定义及宏定义
+* @{
+*/
+/************************************************************************************************/
+/* 低功耗进入方式定义 */
+#define PMU_ENTRY_LOWPOWER_MODE_WFI         (0x00UL)                            /**< WFI方式进入低功耗   */
+#define PMU_ENTRY_LOWPOWER_MODE_WFE         (0x01UL)                            /**< WFE方式进入低功耗   */
+     
+/* 低功耗模式定义 */     
+#define PMU_MODE_STOP                       PMU_CR_LP_MODE_STOP                 /**< Stop模式            */
+#define PMU_MODE_DEEPSTOP                   PMU_CR_LP_MODE_DEEPSTOP             /**< Deepstop模式        */
+
+/* Deepstop模式唤醒过程中Flash的唤醒等待时间定义 */
+#define PMU_DEEPSTOP_FLASH_WAKEUP_TIME_0       (0x3UL << PMU_FLASH_WAKEUP_FLASH_WAKEUP_POS)       /**< Deepstop模式唤醒过程中Flash的唤醒等待时间为0us   */
+#define PMU_DEEPSTOP_FLASH_WAKEUP_TIME_10      (0x00000000U)                                      /**< Deepstop模式唤醒过程中Flash的唤醒等待时间为10us  */
+
+
+/** 
+* @} 
+*/
+
+/*-------------------------------------------functions------------------------------------------*/
+/************************************************************************************************/
+/**
+* @defgroup PMU_External_Functions PMU External Functions
+* @brief    PMU对外函数
+* @{
+*/
+/************************************************************************************************/
+/**
+* @brief  配置Deepstop模式唤醒过程中Flash的唤醒等待时间
+* @param  time_value 等待时间
+*             @arg PMU_DEEPSTOP_FLASH_WAKEUP_TIME_0 : 0us
+*             @arg PMU_DEEPSTOP_FLASH_WAKEUP_TIME_10: 10us
+* @retval 无
+*/
+__STATIC_INLINE void std_pmu_deepstop_flash_wakeup_time_config(uint32_t time_value)           
+{
+    MODIFY_REG(PMU->FLASH_WAKEUP, PMU_FLASH_WAKEUP_FLASH_WAKEUP, time_value);
+}
+
+
+/* PMU低功耗模式相关函数 */
+void std_pmu_enter_sleep(uint32_t mode_entry);
+void std_pmu_enter_stop(uint32_t stop_mode, uint32_t mode_entry);
+
+
+/**
+* @}
+*/
+
+
+#ifdef __cplusplus
+}
+#endif
+
+/**
+* @}
+*/
+
+/**
+* @}
+*/
+
+#endif /* CIU32F003_STD_PMU_H */
+

+ 822 - 0
CIU32F003_LIB/Include/ciu32f003_std_rcc(1).h

@@ -0,0 +1,822 @@
+/************************************************************************************************/
+/**
+* @file               ciu32f003_std_rcc.h
+* @author             MCU Ecosystem Development Team
+* @brief              RCC STD库驱动头文件。
+*                     提供RCC相关的STD库操作函数声明、数据类型以及常量的定义。                         
+*                     
+*
+**************************************************************************************************
+* @attention
+* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
+*
+**************************************************************************************************
+*/
+
+/*避免头文件重复引用*/
+#ifndef CIU32F003_STD_RCC_H
+#define CIU32F003_STD_RCC_H
+
+/************************************************************************************************/
+/** 
+* @addtogroup CIU32F003_STD_Driver
+* @{
+*/
+
+/**
+* @defgroup RCC RCC
+* @brief 复位和时钟控制器的STD库驱动
+* @{
+*/
+/************************************************************************************************/
+
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/*------------------------------------------includes--------------------------------------------*/
+#include "ciu32f003_std_common.h"
+
+
+/*--------------------------------------------define--------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @defgroup RCC_Constants RCC Constants 
+* @brief  RCC常量定义及宏定义
+* @{
+*
+*/
+/************************************************************************************************/
+/* 系统时钟源选择 */
+#define RCC_SYSCLK_SRC_RCHDIV6         RCC_CFG_SYSW_RCHDIV6                         /**< 选择RCHDIV6作为系统时钟源   */
+#define RCC_SYSCLK_SRC_RCHDIV3         RCC_CFG_SYSW_RCHDIV3                         /**< 选择RCHDIV3作为系统时钟源   */
+#define RCC_SYSCLK_SRC_RCH             RCC_CFG_SYSW_RCH                             /**< 选择RCH作为系统时钟源       */
+#define RCC_SYSCLK_SRC_RCL             RCC_CFG_SYSW_RCL                             /**< 选择RCL作为系统时钟源       */
+#define RCC_SYSCLK_SRC_EXTCLK          RCC_CFG_SYSW_EXTCLK                          /**< 选择EXTCLK作为系统时钟源    */
+
+/* 系统时钟源状态定义 */
+#define RCC_SYSCLK_SRC_STATUS_RCHDIV6      RCC_CFG_SYSWS_RCHDIV6                    /**< 系统时钟为RCHDIV6  */
+#define RCC_SYSCLK_SRC_STATUS_RCHDIV3      RCC_CFG_SYSWS_RCHDIV3                    /**< 系统时钟为RCHDIV3  */
+#define RCC_SYSCLK_SRC_STATUS_RCH          RCC_CFG_SYSWS_RCH                        /**< 系统时钟为RCH      */
+#define RCC_SYSCLK_SRC_STATUS_RCL          RCC_CFG_SYSWS_RCL                        /**< 系统时钟为RCL      */
+#define RCC_SYSCLK_SRC_STATUS_EXTCLK       RCC_CFG_SYSWS_EXTCLK                     /**< 系统时钟为EXTCLK   */
+
+/* AHB时钟分频参数定义 */
+#define RCC_HCLK_DIV1                      RCC_CFG_HPRE_1                           /**< HCLK不分频         */
+#define RCC_HCLK_DIV2                      RCC_CFG_HPRE_2                           /**< HCLK分频因子 = 2   */
+#define RCC_HCLK_DIV4                      RCC_CFG_HPRE_4                           /**< HCLK分频因子 = 4   */
+#define RCC_HCLK_DIV8                      RCC_CFG_HPRE_8                           /**< HCLK分频因子 = 8   */
+#define RCC_HCLK_DIV16                     RCC_CFG_HPRE_16                          /**< HCLK分频因子 = 16  */
+#define RCC_HCLK_DIV32                     RCC_CFG_HPRE_32                          /**< HCLK分频因子 = 32  */
+#define RCC_HCLK_DIV64                     RCC_CFG_HPRE_64                          /**< HCLK分频因子 = 64  */
+#define RCC_HCLK_DIV128                    RCC_CFG_HPRE_128                         /**< HCLK分频因子 = 128 */
+
+/* APB时钟分频参数定义 */
+#define RCC_PCLK_DIV1                      RCC_CFG_PPRE_1                           /**< APB总线时钟不分频        */
+#define RCC_PCLK_DIV2                      RCC_CFG_PPRE_2                           /**< APB总线时钟分频因子 = 2  */
+#define RCC_PCLK_DIV4                      RCC_CFG_PPRE_4                           /**< APB总线时钟分频因子 = 4  */
+#define RCC_PCLK_DIV8                      RCC_CFG_PPRE_8                           /**< APB总线时钟分频因子 = 8  */
+#define RCC_PCLK_DIV16                     RCC_CFG_PPRE_16                          /**< APB总线时钟分频因子 = 16 */
+        
+/* MCO时钟源参数定义 */                                                                            
+#define RCC_MCO_SRC_DISABLE                RCC_CFG_MCOSEL_DISABLE                   /**< MCO输出无效         */
+#define RCC_MCO_SRC_SYSCLK                 RCC_CFG_MCOSEL_SYSCLK                    /**< MCO选择SYSCLK输出   */
+#define RCC_MCO_SRC_RCHDIV6                RCC_CFG_MCOSEL_RCHDIV6                   /**< MCO选择RCHDIV6输出  */
+#define RCC_MCO_SRC_EXTCLK                 RCC_CFG_MCOSEL_EXTCLK                    /**< MCO选择EXTCLK输出   */
+#define RCC_MCO_SRC_RCL                    RCC_CFG_MCOSEL_RCL                       /**< MCO选择RCL输出      */
+
+/* MCO时钟分频参数定义 */
+#define RCC_MCO_DIV1                       RCC_CFG_MCOPRE_DIV1                      /**< MCO不分频         */
+#define RCC_MCO_DIV2                       RCC_CFG_MCOPRE_DIV2                      /**< MCO分频因子 = 2   */
+#define RCC_MCO_DIV4                       RCC_CFG_MCOPRE_DIV4                      /**< MCO分频因子 = 4   */
+#define RCC_MCO_DIV8                       RCC_CFG_MCOPRE_DIV8                      /**< MCO分频因子 = 8   */
+#define RCC_MCO_DIV16                      RCC_CFG_MCOPRE_DIV16                     /**< MCO分频因子 = 16  */
+#define RCC_MCO_DIV32                      RCC_CFG_MCOPRE_DIV32                     /**< MCO分频因子 = 32  */
+#define RCC_MCO_DIV64                      RCC_CFG_MCOPRE_DIV64                     /**< MCO分频因子 = 64  */
+#define RCC_MCO_DIV128                     RCC_CFG_MCOPRE_DIV128                    /**< MCO分频因子 = 128 */
+
+/* RCC中断控制位定义 */
+#define RCC_INTERRUPT_RCL_READY            RCC_IER_RCL_RDYIE                        /**< RCL Ready的中断控制位   */
+#define RCC_INTERRUPT_RCH_READY            RCC_IER_RCH_RDYIE                        /**< RCH Ready的中断控制位   */
+
+/* RCC中断标志位定义 */
+#define RCC_FLAG_RCL_READY                 RCC_ISR_RCL_RDYF                         /**< RCL Ready的中断标志位   */
+#define RCC_FLAG_RCH_READY                 RCC_ISR_RCH_RDYF                         /**< RCH Ready的中断标志位   */
+
+/* RCC清除控制位定义 */
+#define RCC_CLEAR_RCL_READY                RCC_ICR_RCL_RDYC                         /**< RCL Ready的清除控制位   */
+#define RCC_CLEAR_RCH_READY                RCC_ICR_RCH_RDYC                         /**< RCH Ready的清除控制位   */
+
+/* IO端口时钟选择 */
+#define RCC_PERIPH_CLK_GPIOA              RCC_IOPEN_GPIOAEN                        /**< GPIOA 时钟控制位  */
+#define RCC_PERIPH_CLK_GPIOB              RCC_IOPEN_GPIOBEN                        /**< GPIOB 时钟控制位  */
+#define RCC_PERIPH_CLK_GPIOC              RCC_IOPEN_GPIOCEN                        /**< GPIOC 时钟控制位  */
+
+/* IO端口复位选择 */
+#define RCC_PERIPH_RESET_GPIOA            RCC_IOPRST_GPIOA_RST                            /**< GPIOA端口复位控制位  */
+#define RCC_PERIPH_RESET_GPIOB            RCC_IOPRST_GPIOB_RST                            /**< GPIOB端口复位控制位  */
+#define RCC_PERIPH_RESET_GPIOC            RCC_IOPRST_GPIOC_RST                            /**< GPIOC端口复位控制位  */
+
+/* AHB外设时钟选择 */
+#define RCC_PERIPH_CLK_CRC                RCC_AHBEN_CRCEN                                 /**< AHB外设CRC时钟控制位  */
+
+/* AHB外设复位选择 */
+#define RCC_PERIPH_RESET_CRC              RCC_AHBRST_CRC_RST                              /**< AHB外设CRC复位控制位  */
+
+/* APB外设时钟选择 */
+#define RCC_PERIPH_CLK_TIM3               RCC_APBEN1_TIM3EN                               /**< APB外设TIM3时钟控制位    */
+#define RCC_PERIPH_CLK_UART2              RCC_APBEN1_UART2EN                              /**< APB外设UART2时钟控制位   */
+#define RCC_PERIPH_CLK_I2C1               RCC_APBEN1_I2C1EN                               /**< APB外设I2C1时钟控制位    */
+#define RCC_PERIPH_CLK_PMU                RCC_APBEN1_PMUEN                                /**< APB外设PMU时钟控制位     */
+#define RCC_PERIPH_CLK_LPTIM1             RCC_APBEN1_LPTIM1EN                             /**< APB外设LPTIM1时钟控制位  */
+
+#define RCC_PERIPH_CLK_COMP               RCC_APBEN2_COMPEN                               /**< APB外设COMP时钟控制位    */
+#define RCC_PERIPH_CLK_TIM1               RCC_APBEN2_TIM1EN                               /**< APB外设TIM1时钟控制位    */
+#define RCC_PERIPH_CLK_SPI1               RCC_APBEN2_SPI1EN                               /**< APB外设SPI1时钟控制位    */
+#define RCC_PERIPH_CLK_UART1              RCC_APBEN2_UART1EN                              /**< APB外设UART1时钟控制位   */
+#define RCC_PERIPH_CLK_ADC                RCC_APBEN2_ADCEN                                /**< APB外设ADC时钟控制位     */
+#define RCC_PERIPH_CLK_DBG                RCC_APBEN2_DBGEN                                /**< APB外设DBG时钟控制位     */
+
+/* APB外设复位选择 */
+#define RCC_PERIPH_RESET_TIM3             RCC_APBRST1_TIM3_RST                            /**< APB外设TIM3复位控制位    */
+#define RCC_PERIPH_RESET_UART2            RCC_APBRST1_UART2_RST                           /**< APB外设UART2复位控制位   */
+#define RCC_PERIPH_RESET_I2C1             RCC_APBRST1_I2C1_RST                            /**< APB外设I2C1复位控制位    */
+#define RCC_PERIPH_RESET_LPTIM1           RCC_APBRST1_LPTIM1_RST                          /**< APB外设LPTIM1复位控制位  */
+                                                                                                                                                                  
+#define RCC_PERIPH_RESET_COMP             RCC_APBRST2_COMP_RST                            /**< APB外设COMP复位制位      */
+#define RCC_PERIPH_RESET_TIM1             RCC_APBRST2_TIM1_RST                            /**< APB外设TIM1复位控制位    */
+#define RCC_PERIPH_RESET_SPI1             RCC_APBRST2_SPI1_RST                            /**< APB外设SPI1复位控制位    */
+#define RCC_PERIPH_RESET_UART1            RCC_APBRST2_UART1_RST                           /**< APB外设UART复位控制位    */
+#define RCC_PERIPH_RESET_ADC              RCC_APBRST2_ADC_RST                             /**< APB外设ADC复位控制位     */
+#define RCC_PERIPH_RESET_DBG              RCC_APBRST2_DBG_RST                             /**< APB外设DBG复位控制位     */
+
+/* LPTIM1异步时钟源选择 */
+#define RCC_LPTIM1_ASYNC_CLK_SRC_PCLK         RCC_CLKSEL_LPTIM1_SEL_PCLK             /**< PCLK时钟作为LPTIM1时钟      */
+#define RCC_LPTIM1_ASYNC_CLK_SRC_RCL          RCC_CLKSEL_LPTIM1_SEL_RCL              /**< RCL时钟作为LPTIM1时钟       */
+#define RCC_LPTIM1_ASYNC_CLK_SRC_MCO          RCC_CLKSEL_LPTIM1_SEL_MCO              /**< MCO时钟作为LPTIM1时钟       */
+
+/* COMP1异步时钟源选择 */
+#define RCC_COMP1_ASYNC_CLK_SRC_PCLK          RCC_CLKSEL_COMP1_SEL_PCLK             /**< PCLK时钟作为COMP1时钟      */
+#define RCC_COMP1_ASYNC_CLK_SRC_RCL           RCC_CLKSEL_COMP1_SEL_RCL              /**< RCL时钟作为COMP1时钟       */
+
+/* COMP2异步时钟源选择 */
+#define RCC_COMP2_ASYNC_CLK_SRC_PCLK          RCC_CLKSEL_COMP2_SEL_PCLK             /**< PCLK时钟作为COMP2时钟      */
+#define RCC_COMP2_ASYNC_CLK_SRC_RCL           RCC_CLKSEL_COMP2_SEL_RCL              /**< RCL时钟作为COMP2时钟       */
+
+/* 复位标志定义 */
+#define RCC_RESET_FLAG_LOCKUP                   RCC_CSR2_LOCKUP_RSTF                  /**< LOCKUP复位标志           */
+#define RCC_RESET_FLAG_NRST                     RCC_CSR2_NRST_RSTF                    /**< NRST引脚复位标志         */
+#define RCC_RESET_FLAG_PMU                      RCC_CSR2_PMU_RSTF                     /**< POR/PDR、BOR复位标志     */
+#define RCC_RESET_FLAG_SW                       RCC_CSR2_SW_RSTF                      /**< 软件复位标志             */
+#define RCC_RESET_FLAG_IWDG                     RCC_CSR2_IWDG_RSTF                    /**< IWDG复位标志             */
+#define RCC_RESET_FLAG_LPM                      RCC_CSR2_LPM_RSTF                     /**< 低功耗复位标志           */
+#define RCC_RESET_FLAG_ALL                     (0xFFUL<<RCC_CSR2_LOCKUP_RSTF_POS)     /**< 所有复位标志             */
+
+
+/** 
+* @} 
+*/
+
+/*-------------------------------------------functions------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @defgroup RCC_External_Functions RCC External Functions
+* @brief    RCC对外函数
+* @{
+*
+*/
+/************************************************************************************************/
+/** 
+* @brief  使能RCH时钟
+* @note   使能RCH后,软件应等待RCHRDY标志置位后,再使用该时钟
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_rch_enable(void)
+{
+    RCC->CSR1 |= RCC_CSR1_RCHON;
+} 
+
+/** 
+* @brief  关闭RCH时钟
+* @note   如果RCH为系统时钟源,则其不能被停止。此时用户应先将系统时钟源切换为其他时钟,再关闭该时钟源
+* @note   当关闭RCH时,需等待RCHRDY标志清零
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_rch_disable(void)
+{
+    RCC->CSR1 &= (~RCC_CSR1_RCHON);
+}
+
+/** 
+* @brief  获取RCH ready标志
+* @retval uint32_t 返回RCH RDY标志状态
+*             @arg 非0: 表示RCH ready已置位
+*             @arg 0:表示RCH ready未置位
+*/
+__STATIC_INLINE uint32_t std_rcc_get_rch_ready(void) 
+{
+    return(RCC->CSR1 & RCC_CSR1_RCHRDY);
+}        
+
+/** 
+* @brief  设置系统时钟源
+* @param  clocksource 系统时钟源
+*             @arg RCC_SYSCLK_SRC_RCHDIV6
+*             @arg RCC_SYSCLK_SRC_RCHDIV3   
+*             @arg RCC_SYSCLK_SRC_RCH    
+*             @arg RCC_SYSCLK_SRC_RCL     
+*             @arg RCC_SYSCLK_SRC_EXTCLK
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_set_sysclk_source(uint32_t clocksource)
+{
+    MODIFY_REG(RCC->CFG, RCC_CFG_SYSW, clocksource);
+}    
+
+/** 
+* @brief  获取系统时钟源信息
+* @retval uint32_t 系统时钟源
+*             @arg RCC_SYSCLK_SRC_STATUS_RCHDIV6  
+*             @arg RCC_SYSCLK_SRC_STATUS_RCHDIV3   
+*             @arg RCC_SYSCLK_SRC_STATUS_RCH    
+*             @arg RCC_SYSCLK_SRC_STATUS_RCL    
+*             @arg RCC_SYSCLK_SRC_STATUS_EXTCLK 
+*/
+__STATIC_INLINE uint32_t std_rcc_get_sysclk_source(void)
+{
+    return(RCC->CFG & RCC_CFG_SYSWS);
+}    
+
+/** 
+* @brief  设置AHB时钟分频因子
+* @param  ahb_div AHB分频因子
+*             @arg RCC_HCLK_DIV1   
+*             @arg RCC_HCLK_DIV2     
+*             @arg ...   
+*             @arg RCC_HCLK_DIV128
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_set_ahbdiv(uint32_t ahb_div)
+{
+    MODIFY_REG(RCC->CFG, RCC_CFG_HPRE, ahb_div);
+}    
+
+/** 
+* @brief  获取AHB时钟分频因子
+* @retval uint32_t HCLK时钟分频因子
+*             @arg RCC_HCLK_DIV1   
+*             @arg RCC_HCLK_DIV2     
+*             @arg ...   
+*             @arg RCC_HCLK_DIV128
+*/
+__STATIC_INLINE uint32_t std_rcc_get_ahbdiv(void)
+{
+    return(RCC->CFG & RCC_CFG_HPRE);
+} 
+
+/** 
+* @brief  设置APB时钟分频因子
+* @param  apb_div APB分频因子
+*             @arg RCC_PCLK_DIV1   
+*             @arg RCC_PCLK_DIV2     
+*             @arg ...   
+*             @arg RCC_PCLK_DIV16
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_set_apbdiv(uint32_t apb_div)
+{
+    MODIFY_REG(RCC->CFG, RCC_CFG_PPRE, apb_div);
+}    
+
+/** 
+* @brief  获取APB时钟分频因子
+* @retval uint32_t PCLK1时钟分频因子
+*             @arg RCC_PCLK_DIV1   
+*             @arg RCC_PCLK_DIV2     
+*             @arg ...   
+*             @arg RCC_PCLK_DIV16
+*/
+__STATIC_INLINE uint32_t std_rcc_get_apbdiv(void)
+{
+    return(RCC->CFG & RCC_CFG_PPRE);
+} 
+
+/**
+* @brief  配置MCO输出信息
+* @param  mco_source MCO输出源选择
+*             @arg RCC_MCO_SRC_SYSCLK
+*             @arg RCC_MCO_SRC_RCHDIV6
+*             @arg RCC_MCO_SRC_EXTCLK
+*             @arg RCC_MCO_SRC_RCL
+* @param  mco_psc MCO输出分频因子
+*             @arg RCC_MCO_DIV1
+*             @arg RCC_MCO_DIV2
+*             @arg ...
+*             @arg RCC_MCO_DIV128
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_mco_config(uint32_t mco_source, uint32_t mco_psc)
+{
+    MODIFY_REG(RCC->CFG, RCC_CFG_MCOSEL | RCC_CFG_MCOPRE, mco_source | mco_psc);
+}
+
+/** 
+* @brief  使能EXTCLK时钟
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_extclk_enable(void) 
+{
+    RCC->CSR1 |= RCC_CSR1_EXTCLKON;     
+}
+
+/** 
+* @brief  关闭EXTCLK时钟
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_extclk_disable(void)
+{
+    RCC->CSR1 &= (~RCC_CSR1_EXTCLKON);
+} 
+
+/** 
+* @brief  使能RCC中断
+* @param  interrupt 使能RCC中断源的信息
+*             @arg  RCC_INTERRUPT_RCL_READY
+*             @arg  RCC_INTERRUPT_RCH_READY
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_interrupt_enable(uint32_t interrupt)     
+{
+    RCC->IER |= (interrupt);
+}
+
+/** 
+* @brief  关闭RCC中断
+* @param  interrupt 关闭RCC中断源的信息
+*             @arg  RCC_INTERRUPT_RCL_READY
+*             @arg  RCC_INTERRUPT_RCH_READY
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_interrupt_disable(uint32_t interrupt)    
+{
+    RCC->IER &= (~(interrupt));
+} 
+
+/**
+* @brief  获取RCC中断使能状态
+* @param  interrupt RCC中断源信息
+*             @arg  RCC_INTERRUPT_RCL_READY
+*             @arg  RCC_INTERRUPT_RCH_READY
+* @retval uint32_t 返回输入中断标志置位状态
+*             @arg 非0: 表示指定的中断处于使能状态
+*             @arg 0:表示指定的中断处于禁止状态
+*/
+__STATIC_INLINE uint32_t std_rcc_get_interrupt_enable(uint32_t interrupt)    
+{
+    return(RCC->IER & (interrupt));
+}
+
+/**
+* @brief  获取RCC中断标志状态
+* @param  flag RCC中断标志信息
+*             @arg  RCC_FLAG_RCL_READY
+*             @arg  RCC_FLAG_RCH_READY
+* @retval uint32_t 返回输入中断标志置位状态
+*             @arg 非0: 表示指定的中断已置位
+*             @arg 0:表示指定的中断未置位
+*/
+__STATIC_INLINE uint32_t std_rcc_get_flag(uint32_t flag) 
+{
+    return(RCC->ISR & (flag));
+}
+
+/** 
+* @brief  清除RCC标志
+* @param  flags 清除标志位
+*             @arg  RCC_CLEAR_RCL_READY
+*             @arg  RCC_CLEAR_RCH_READY
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_clear_flag(uint32_t flags)   
+{
+    RCC->ICR = (flags);
+}
+
+/** 
+* @brief  使能RCL时钟
+* @note   使能RCL后,软件应等待RCLRDY标志置位后,再使用该时钟
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_rcl_enable(void)
+{
+    RCC->CSR2 |= RCC_CSR2_RCLON;
+}          
+
+/** 
+* @brief  关闭RCL时钟
+* @note   如果RCL为系统时钟源,则其不能被停止。此时用户应先将系统时钟源切换为其他时钟,再关闭该时钟源
+* @note   当关闭RCL时,RCLRDY标志会在RCL关闭后自动清零
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_rcl_disable(void) 
+{
+    RCC->CSR2 &= (~RCC_CSR2_RCLON);
+}        
+
+/** 
+* @brief  获取RCL ready标志
+* @retval uint32_t 返回RCL RDY标志状态
+*             @arg 非0: 表示RCL ready已置位
+*             @arg 0:表示RCL ready未置位
+*/
+__STATIC_INLINE uint32_t std_rcc_get_rcl_ready(void)          
+{
+    return(RCC->CSR2 & RCC_CSR2_RCLRDY);
+}
+
+/** 
+* @brief  获取复位标志
+* @param  reset_flag 指定要获取的复位标志
+*             @arg RCC_RESET_FLAG_LOCKUP
+*             @arg RCC_RESET_FLAG_NRST  
+*             @arg RCC_RESET_FLAG_PMU   
+*             @arg RCC_RESET_FLAG_SW    
+*             @arg RCC_RESET_FLAG_IWDG  
+*             @arg RCC_RESET_FLAG_LPM   
+*             @arg RCC_RESET_FLAG_ALL   
+* @retval uint32_t 返回状态标志
+*             @arg 非0: 表示指定的复位标志已置位
+*             @arg 0:表示指定的复位标志未置位
+*/
+__STATIC_INLINE uint32_t std_rcc_get_reset_flag(uint32_t reset_flag)            
+{
+    return(RCC->CSR2 & (reset_flag));
+} 
+
+/** 
+* @brief  清除复位标志
+* @note   该函数将清除所有复位标志
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_clear_reset_flags(void)           
+{
+    RCC->CSR2 |= RCC_CSR2_RMVF;
+}
+
+/** 
+* @brief  GPIO端口时钟使能
+* @param  gpiox_clock 指定使能的GPIO时钟
+*             @arg RCC_PERIPH_CLK_GPIOA
+*             @arg RCC_PERIPH_CLK_GPIOB
+*             @arg RCC_PERIPH_CLK_GPIOC
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_gpio_clk_enable(uint32_t gpiox_clock)
+{
+    RCC->IOPEN |= gpiox_clock; 
+    
+    /* RCC外围时钟启用后的延迟 */  
+    __NOP(); __NOP(); __NOP(); 
+}
+
+/** 
+* @brief  GPIO端口时钟禁止
+* @param  gpiox_clock 指定禁止的GPIO时钟
+*             @arg RCC_PERIPH_CLK_GPIOA
+*             @arg RCC_PERIPH_CLK_GPIOB
+*             @arg RCC_PERIPH_CLK_GPIOC
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_gpio_clk_disable(uint32_t gpiox_clock) 
+{
+    RCC->IOPEN &= (~(gpiox_clock)); 
+    
+    /* RCC外围时钟启用后的延迟 */  
+    __NOP(); __NOP(); __NOP(); 
+}
+
+/** 
+* @brief  GPIO端口复位
+* @param  gpiox_rst 指定复位的GPIO端口
+*             @arg RCC_PERIPH_RESET_GPIOA
+*             @arg RCC_PERIPH_RESET_GPIOB
+*             @arg RCC_PERIPH_RESET_GPIOC
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_gpio_reset(uint32_t gpiox_rst)
+{
+    RCC->IOPRST |= (gpiox_rst);
+    RCC->IOPRST &= (~(gpiox_rst));
+}         
+
+/** 
+* @brief  AHB外设时钟使能
+* @param  periph_clock 指定使能的AHB外设时钟
+*             @arg RCC_PERIPH_CLK_CRC  
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_ahb_clk_enable(uint32_t periph_clock)
+{
+    RCC->AHBEN |= periph_clock;
+    
+    /* RCC外围时钟启用后的延迟 */    
+    __NOP(); __NOP(); __NOP(); 
+}   
+
+/** 
+* @brief  AHB外设时钟禁止
+* @param  periph_clock 指定禁止的AHB外设时钟
+*             @arg RCC_PERIPH_CLK_CRC  
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_ahb_clk_disable(uint32_t periph_clock)            
+{
+    RCC->AHBEN &= (~(periph_clock));
+}
+
+/** 
+* @brief  AHB外设复位
+* @param  periph_rst 指定复位的AHB外设
+*             @arg RCC_PERIPH_RESET_CRC
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_ahb_reset(uint32_t periph_rst)
+{
+    RCC->AHBRST |= (periph_rst);
+    RCC->AHBRST &= (~(periph_rst));
+}       
+
+/** 
+* @brief  APB外设1时钟使能
+* @param  periph_clock 指定使能的APB外设1时钟
+*             @arg RCC_PERIPH_CLK_TIM3   
+*             @arg RCC_PERIPH_CLK_UART2 
+*             @arg RCC_PERIPH_CLK_I2C1   
+*             @arg RCC_PERIPH_CLK_PMU       
+*             @arg RCC_PERIPH_CLK_LPTIM1 
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_apb1_clk_enable(uint32_t periph_clock)
+{
+    RCC->APBEN1 |= periph_clock;
+    
+    /* RCC外围时钟启用后的延迟 */    
+    __NOP(); __NOP(); __NOP(); 
+}
+
+/** 
+* @brief  APB外设1时钟禁止
+* @param  periph_clock 指定禁止的APB外设1时钟
+*             @arg RCC_PERIPH_CLK_TIM3      
+*             @arg RCC_PERIPH_CLK_UART2 
+*             @arg RCC_PERIPH_CLK_I2C1   
+*             @arg RCC_PERIPH_CLK_PMU      
+*             @arg RCC_PERIPH_CLK_LPTIM1 
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_apb1_clk_disable(uint32_t periph_clock)            
+{
+    RCC->APBEN1 &= (~(periph_clock));
+}
+
+/** 
+* @brief  APB外设1复位
+* @param  periph_rst 指定复位的APB外设1
+*             @arg RCC_PERIPH_RESET_TIM3     
+*             @arg RCC_PERIPH_RESET_UART2 
+*             @arg RCC_PERIPH_RESET_I2C1   
+*             @arg RCC_PERIPH_RESET_LPTIM1 
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_apb1_reset(uint32_t periph_rst)
+{
+    RCC->APBRST1 |= (periph_rst);
+    RCC->APBRST1 &= (~(periph_rst));
+}       
+
+/** 
+* @brief  APB外设2时钟使能
+* @param  periph_clock 指定使能的APB外设2时钟
+*             @arg RCC_PERIPH_CLK_COMP
+*             @arg RCC_PERIPH_CLK_TIM1   
+*             @arg RCC_PERIPH_CLK_SPI1   
+*             @arg RCC_PERIPH_CLK_UART1 
+*             @arg RCC_PERIPH_CLK_ADC    
+*             @arg RCC_PERIPH_CLK_DBG
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_apb2_clk_enable(uint32_t periph_clock)
+{
+    RCC->APBEN2 |= periph_clock;
+    
+    /* RCC外围时钟启用后的延迟 */    
+    __NOP(); __NOP(); __NOP(); 
+}
+
+/** 
+* @brief  APB外设2时钟禁止
+* @param  periph_clock 指定禁止的APB外设2时钟
+*             @arg RCC_PERIPH_CLK_COMP
+*             @arg RCC_PERIPH_CLK_TIM1   
+*             @arg RCC_PERIPH_CLK_SPI1   
+*             @arg RCC_PERIPH_CLK_UART1 
+*             @arg RCC_PERIPH_CLK_ADC    
+*             @arg RCC_PERIPH_CLK_DBG
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_apb2_clk_disable(uint32_t periph_clock)            
+{
+    RCC->APBEN2 &= (~(periph_clock));
+}
+
+/** 
+* @brief  APB外设2复位
+* @param  periph_rst 指定复位的APB外设2
+*             @arg RCC_PERIPH_RESET_COMP   
+*             @arg RCC_PERIPH_RESET_TIM1   
+*             @arg RCC_PERIPH_RESET_SPI1   
+*             @arg RCC_PERIPH_RESET_UART1 
+*             @arg RCC_PERIPH_RESET_ADC    
+*             @arg RCC_PERIPH_RESET_DBG  
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_apb2_reset(uint32_t periph_rst)
+{
+    RCC->APBRST2 |= (periph_rst);
+    RCC->APBRST2 &= (~(periph_rst));
+}       
+
+/** 
+* @brief  使能LOCKUP复位
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_lockup_reset_enable(void)
+{
+    RCC->CSR2 |= RCC_CSR2_LOCKUP_RSTEN;
+}
+
+/** 
+* @brief  禁止LOCKUP复位
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_lockup_reset_disable(void)
+{
+    RCC->CSR2 &= (~RCC_CSR2_LOCKUP_RSTEN);
+}
+
+/** 
+* @brief  LPTIM1时钟源选择
+* @param  lptim1clk_select LPTIM1时钟源
+*             @arg RCC_LPTIM1_ASYNC_CLK_SRC_PCLK
+*             @arg RCC_LPTIM1_ASYNC_CLK_SRC_RCL
+*             @arg RCC_LPTIM1_ASYNC_CLK_SRC_MCO
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_set_lptim1clk_source(uint32_t lptim1clk_select)
+{
+    MODIFY_REG(RCC->CLKSEL, RCC_CLKSEL_LPTIM1_SEL, (lptim1clk_select));
+}       
+
+/** 
+* @brief  获取LPTIM1时钟源
+* @retval uint32_t 返回LPTIM1时钟源信息
+*             @arg RCC_LPTIM1_ASYNC_CLK_SRC_PCLK1
+*             @arg RCC_LPTIM1_ASYNC_CLK_SRC_RCL
+*             @arg RCC_LPTIM1_ASYNC_CLK_SRC_MCO
+*/
+__STATIC_INLINE uint32_t std_rcc_get_lptim1clk_source(void)
+{
+    return(RCC->CLKSEL & RCC_CLKSEL_LPTIM1_SEL);
+} 
+
+/** 
+* @brief  COMP1时钟源选择
+* @param  comp1clk_select COMP1时钟源
+*             @arg RCC_COMP1_ASYNC_CLK_SRC_PCLK
+*             @arg RCC_COMP1_ASYNC_CLK_SRC_RCL
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_set_comp1clk_source(uint32_t comp1clk_select)
+{
+    MODIFY_REG(RCC->CLKSEL, RCC_CLKSEL_COMP1_SEL, (comp1clk_select));
+}       
+
+/** 
+* @brief  获取COMP1时钟源
+* @retval uint32_t 返回COMP1时钟源信息
+*             @arg RCC_COMP1_ASYNC_CLK_SRC_PCLK
+*             @arg RCC_COMP1_ASYNC_CLK_SRC_RCL
+*/
+__STATIC_INLINE uint32_t std_rcc_get_comp1clk_source(void)
+{
+    return(RCC->CLKSEL & RCC_CLKSEL_COMP1_SEL);
+} 
+
+/** 
+* @brief  COMP2时钟源选择
+* @param  comp2clk_select COMP2时钟源
+*             @arg RCC_COMP2_ASYNC_CLK_SRC_PCLK
+*             @arg RCC_COMP2_ASYNC_CLK_SRC_RCL
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_set_comp2clk_source(uint32_t comp2clk_select)
+{
+    MODIFY_REG(RCC->CLKSEL, RCC_CLKSEL_COMP2_SEL, (comp2clk_select));
+}       
+
+/** 
+* @brief  获取COMP2时钟源
+* @retval uint32_t 返回COMP2时钟源信息
+*             @arg RCC_COMP2_ASYNC_CLK_SRC_PCLK
+*             @arg RCC_COMP2_ASYNC_CLK_SRC_RCL
+*/
+__STATIC_INLINE uint32_t std_rcc_get_comp2clk_source(void)
+{
+    return(RCC->CLKSEL & RCC_CLKSEL_COMP2_SEL);
+} 
+
+/** 
+* @brief  写RCL校准值
+* @param  cal_value RCL校准值
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_write_rcl_calibration(uint32_t cal_value)
+{
+    RCC->RCLCAL = cal_value;
+}
+
+/** 
+* @brief  读取RCL校准值
+* @retval uint32_t RCL校准值
+*/
+__STATIC_INLINE uint32_t std_rcc_read_rcl_calibration(void)
+{
+    return(RCC->RCLCAL);
+}
+
+/** 
+* @brief  写RCH时钟粗调值
+* @param  cal_value RCH时钟粗调值
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_write_rch_coarse_calibration(uint32_t cal_value)
+{
+    MODIFY_REG(RCC->RCHCAL, RCC_RCHCAL_RCH_CAL_COARSE, cal_value << RCC_RCHCAL_RCH_CAL_COARSE_POS);
+}
+
+/** 
+* @brief  读取RCH时钟粗调值
+* @retval uint32_t RCH时钟粗调值
+*/
+__STATIC_INLINE uint32_t std_rcc_read_rch_coarse_calibration(void)
+{
+    return((RCC->RCHCAL & RCC_RCHCAL_RCH_CAL_COARSE) >> RCC_RCHCAL_RCH_CAL_COARSE_POS);
+}
+
+/** 
+* @brief  写RCH时钟微调值
+* @param  trim_value  RCH时钟微调值
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_write_rch_fine_calibration(uint32_t trim_value)
+{
+    MODIFY_REG(RCC->RCHCAL, RCC_RCHCAL_RCH_CAL_FINE, trim_value);
+}
+
+/** 
+* @brief  读取RCH时钟微调值
+* @retval uint32_t RCH时钟微调值
+*/
+__STATIC_INLINE uint32_t std_rcc_read_rch_fine_calibration(void)
+{
+    return(RCC->RCHCAL & RCC_RCHCAL_RCH_CAL_FINE);
+}
+
+
+/* 获取时钟频率函数 */
+uint32_t std_rcc_get_sysclkfreq(void);
+uint32_t std_rcc_get_hclkfreq(void);
+uint32_t std_rcc_get_pclkfreq(void); 
+
+
+/** 
+* @} 
+*/
+
+
+#ifdef __cplusplus
+}
+#endif
+
+/**
+* @} 
+*/  
+
+/**
+* @}
+*/
+
+#endif /* CIU32F003_STD_RCC_H */

+ 822 - 0
CIU32F003_LIB/Include/ciu32f003_std_rcc(2).h

@@ -0,0 +1,822 @@
+/************************************************************************************************/
+/**
+* @file               ciu32f003_std_rcc.h
+* @author             MCU Ecosystem Development Team
+* @brief              RCC STD库驱动头文件。
+*                     提供RCC相关的STD库操作函数声明、数据类型以及常量的定义。                         
+*                     
+*
+**************************************************************************************************
+* @attention
+* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
+*
+**************************************************************************************************
+*/
+
+/*避免头文件重复引用*/
+#ifndef CIU32F003_STD_RCC_H
+#define CIU32F003_STD_RCC_H
+
+/************************************************************************************************/
+/** 
+* @addtogroup CIU32F003_STD_Driver
+* @{
+*/
+
+/**
+* @defgroup RCC RCC
+* @brief 复位和时钟控制器的STD库驱动
+* @{
+*/
+/************************************************************************************************/
+
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/*------------------------------------------includes--------------------------------------------*/
+#include "ciu32f003_std_common.h"
+
+
+/*--------------------------------------------define--------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @defgroup RCC_Constants RCC Constants 
+* @brief  RCC常量定义及宏定义
+* @{
+*
+*/
+/************************************************************************************************/
+/* 系统时钟源选择 */
+#define RCC_SYSCLK_SRC_RCHDIV6         RCC_CFG_SYSW_RCHDIV6                         /**< 选择RCHDIV6作为系统时钟源   */
+#define RCC_SYSCLK_SRC_RCHDIV3         RCC_CFG_SYSW_RCHDIV3                         /**< 选择RCHDIV3作为系统时钟源   */
+#define RCC_SYSCLK_SRC_RCH             RCC_CFG_SYSW_RCH                             /**< 选择RCH作为系统时钟源       */
+#define RCC_SYSCLK_SRC_RCL             RCC_CFG_SYSW_RCL                             /**< 选择RCL作为系统时钟源       */
+#define RCC_SYSCLK_SRC_EXTCLK          RCC_CFG_SYSW_EXTCLK                          /**< 选择EXTCLK作为系统时钟源    */
+
+/* 系统时钟源状态定义 */
+#define RCC_SYSCLK_SRC_STATUS_RCHDIV6      RCC_CFG_SYSWS_RCHDIV6                    /**< 系统时钟为RCHDIV6  */
+#define RCC_SYSCLK_SRC_STATUS_RCHDIV3      RCC_CFG_SYSWS_RCHDIV3                    /**< 系统时钟为RCHDIV3  */
+#define RCC_SYSCLK_SRC_STATUS_RCH          RCC_CFG_SYSWS_RCH                        /**< 系统时钟为RCH      */
+#define RCC_SYSCLK_SRC_STATUS_RCL          RCC_CFG_SYSWS_RCL                        /**< 系统时钟为RCL      */
+#define RCC_SYSCLK_SRC_STATUS_EXTCLK       RCC_CFG_SYSWS_EXTCLK                     /**< 系统时钟为EXTCLK   */
+
+/* AHB时钟分频参数定义 */
+#define RCC_HCLK_DIV1                      RCC_CFG_HPRE_1                           /**< HCLK不分频         */
+#define RCC_HCLK_DIV2                      RCC_CFG_HPRE_2                           /**< HCLK分频因子 = 2   */
+#define RCC_HCLK_DIV4                      RCC_CFG_HPRE_4                           /**< HCLK分频因子 = 4   */
+#define RCC_HCLK_DIV8                      RCC_CFG_HPRE_8                           /**< HCLK分频因子 = 8   */
+#define RCC_HCLK_DIV16                     RCC_CFG_HPRE_16                          /**< HCLK分频因子 = 16  */
+#define RCC_HCLK_DIV32                     RCC_CFG_HPRE_32                          /**< HCLK分频因子 = 32  */
+#define RCC_HCLK_DIV64                     RCC_CFG_HPRE_64                          /**< HCLK分频因子 = 64  */
+#define RCC_HCLK_DIV128                    RCC_CFG_HPRE_128                         /**< HCLK分频因子 = 128 */
+
+/* APB时钟分频参数定义 */
+#define RCC_PCLK_DIV1                      RCC_CFG_PPRE_1                           /**< APB总线时钟不分频        */
+#define RCC_PCLK_DIV2                      RCC_CFG_PPRE_2                           /**< APB总线时钟分频因子 = 2  */
+#define RCC_PCLK_DIV4                      RCC_CFG_PPRE_4                           /**< APB总线时钟分频因子 = 4  */
+#define RCC_PCLK_DIV8                      RCC_CFG_PPRE_8                           /**< APB总线时钟分频因子 = 8  */
+#define RCC_PCLK_DIV16                     RCC_CFG_PPRE_16                          /**< APB总线时钟分频因子 = 16 */
+        
+/* MCO时钟源参数定义 */                                                                            
+#define RCC_MCO_SRC_DISABLE                RCC_CFG_MCOSEL_DISABLE                   /**< MCO输出无效         */
+#define RCC_MCO_SRC_SYSCLK                 RCC_CFG_MCOSEL_SYSCLK                    /**< MCO选择SYSCLK输出   */
+#define RCC_MCO_SRC_RCHDIV6                RCC_CFG_MCOSEL_RCHDIV6                   /**< MCO选择RCHDIV6输出  */
+#define RCC_MCO_SRC_EXTCLK                 RCC_CFG_MCOSEL_EXTCLK                    /**< MCO选择EXTCLK输出   */
+#define RCC_MCO_SRC_RCL                    RCC_CFG_MCOSEL_RCL                       /**< MCO选择RCL输出      */
+
+/* MCO时钟分频参数定义 */
+#define RCC_MCO_DIV1                       RCC_CFG_MCOPRE_DIV1                      /**< MCO不分频         */
+#define RCC_MCO_DIV2                       RCC_CFG_MCOPRE_DIV2                      /**< MCO分频因子 = 2   */
+#define RCC_MCO_DIV4                       RCC_CFG_MCOPRE_DIV4                      /**< MCO分频因子 = 4   */
+#define RCC_MCO_DIV8                       RCC_CFG_MCOPRE_DIV8                      /**< MCO分频因子 = 8   */
+#define RCC_MCO_DIV16                      RCC_CFG_MCOPRE_DIV16                     /**< MCO分频因子 = 16  */
+#define RCC_MCO_DIV32                      RCC_CFG_MCOPRE_DIV32                     /**< MCO分频因子 = 32  */
+#define RCC_MCO_DIV64                      RCC_CFG_MCOPRE_DIV64                     /**< MCO分频因子 = 64  */
+#define RCC_MCO_DIV128                     RCC_CFG_MCOPRE_DIV128                    /**< MCO分频因子 = 128 */
+
+/* RCC中断控制位定义 */
+#define RCC_INTERRUPT_RCL_READY            RCC_IER_RCL_RDYIE                        /**< RCL Ready的中断控制位   */
+#define RCC_INTERRUPT_RCH_READY            RCC_IER_RCH_RDYIE                        /**< RCH Ready的中断控制位   */
+
+/* RCC中断标志位定义 */
+#define RCC_FLAG_RCL_READY                 RCC_ISR_RCL_RDYF                         /**< RCL Ready的中断标志位   */
+#define RCC_FLAG_RCH_READY                 RCC_ISR_RCH_RDYF                         /**< RCH Ready的中断标志位   */
+
+/* RCC清除控制位定义 */
+#define RCC_CLEAR_RCL_READY                RCC_ICR_RCL_RDYC                         /**< RCL Ready的清除控制位   */
+#define RCC_CLEAR_RCH_READY                RCC_ICR_RCH_RDYC                         /**< RCH Ready的清除控制位   */
+
+/* IO端口时钟选择 */
+#define RCC_PERIPH_CLK_GPIOA              RCC_IOPEN_GPIOAEN                        /**< GPIOA 时钟控制位  */
+#define RCC_PERIPH_CLK_GPIOB              RCC_IOPEN_GPIOBEN                        /**< GPIOB 时钟控制位  */
+#define RCC_PERIPH_CLK_GPIOC              RCC_IOPEN_GPIOCEN                        /**< GPIOC 时钟控制位  */
+
+/* IO端口复位选择 */
+#define RCC_PERIPH_RESET_GPIOA            RCC_IOPRST_GPIOA_RST                            /**< GPIOA端口复位控制位  */
+#define RCC_PERIPH_RESET_GPIOB            RCC_IOPRST_GPIOB_RST                            /**< GPIOB端口复位控制位  */
+#define RCC_PERIPH_RESET_GPIOC            RCC_IOPRST_GPIOC_RST                            /**< GPIOC端口复位控制位  */
+
+/* AHB外设时钟选择 */
+#define RCC_PERIPH_CLK_CRC                RCC_AHBEN_CRCEN                                 /**< AHB外设CRC时钟控制位  */
+
+/* AHB外设复位选择 */
+#define RCC_PERIPH_RESET_CRC              RCC_AHBRST_CRC_RST                              /**< AHB外设CRC复位控制位  */
+
+/* APB外设时钟选择 */
+#define RCC_PERIPH_CLK_TIM3               RCC_APBEN1_TIM3EN                               /**< APB外设TIM3时钟控制位    */
+#define RCC_PERIPH_CLK_UART2              RCC_APBEN1_UART2EN                              /**< APB外设UART2时钟控制位   */
+#define RCC_PERIPH_CLK_I2C1               RCC_APBEN1_I2C1EN                               /**< APB外设I2C1时钟控制位    */
+#define RCC_PERIPH_CLK_PMU                RCC_APBEN1_PMUEN                                /**< APB外设PMU时钟控制位     */
+#define RCC_PERIPH_CLK_LPTIM1             RCC_APBEN1_LPTIM1EN                             /**< APB外设LPTIM1时钟控制位  */
+
+#define RCC_PERIPH_CLK_COMP               RCC_APBEN2_COMPEN                               /**< APB外设COMP时钟控制位    */
+#define RCC_PERIPH_CLK_TIM1               RCC_APBEN2_TIM1EN                               /**< APB外设TIM1时钟控制位    */
+#define RCC_PERIPH_CLK_SPI1               RCC_APBEN2_SPI1EN                               /**< APB外设SPI1时钟控制位    */
+#define RCC_PERIPH_CLK_UART1              RCC_APBEN2_UART1EN                              /**< APB外设UART1时钟控制位   */
+#define RCC_PERIPH_CLK_ADC                RCC_APBEN2_ADCEN                                /**< APB外设ADC时钟控制位     */
+#define RCC_PERIPH_CLK_DBG                RCC_APBEN2_DBGEN                                /**< APB外设DBG时钟控制位     */
+
+/* APB外设复位选择 */
+#define RCC_PERIPH_RESET_TIM3             RCC_APBRST1_TIM3_RST                            /**< APB外设TIM3复位控制位    */
+#define RCC_PERIPH_RESET_UART2            RCC_APBRST1_UART2_RST                           /**< APB外设UART2复位控制位   */
+#define RCC_PERIPH_RESET_I2C1             RCC_APBRST1_I2C1_RST                            /**< APB外设I2C1复位控制位    */
+#define RCC_PERIPH_RESET_LPTIM1           RCC_APBRST1_LPTIM1_RST                          /**< APB外设LPTIM1复位控制位  */
+                                                                                                                                                                  
+#define RCC_PERIPH_RESET_COMP             RCC_APBRST2_COMP_RST                            /**< APB外设COMP复位制位      */
+#define RCC_PERIPH_RESET_TIM1             RCC_APBRST2_TIM1_RST                            /**< APB外设TIM1复位控制位    */
+#define RCC_PERIPH_RESET_SPI1             RCC_APBRST2_SPI1_RST                            /**< APB外设SPI1复位控制位    */
+#define RCC_PERIPH_RESET_UART1            RCC_APBRST2_UART1_RST                           /**< APB外设UART复位控制位    */
+#define RCC_PERIPH_RESET_ADC              RCC_APBRST2_ADC_RST                             /**< APB外设ADC复位控制位     */
+#define RCC_PERIPH_RESET_DBG              RCC_APBRST2_DBG_RST                             /**< APB外设DBG复位控制位     */
+
+/* LPTIM1异步时钟源选择 */
+#define RCC_LPTIM1_ASYNC_CLK_SRC_PCLK         RCC_CLKSEL_LPTIM1_SEL_PCLK             /**< PCLK时钟作为LPTIM1时钟      */
+#define RCC_LPTIM1_ASYNC_CLK_SRC_RCL          RCC_CLKSEL_LPTIM1_SEL_RCL              /**< RCL时钟作为LPTIM1时钟       */
+#define RCC_LPTIM1_ASYNC_CLK_SRC_MCO          RCC_CLKSEL_LPTIM1_SEL_MCO              /**< MCO时钟作为LPTIM1时钟       */
+
+/* COMP1异步时钟源选择 */
+#define RCC_COMP1_ASYNC_CLK_SRC_PCLK          RCC_CLKSEL_COMP1_SEL_PCLK             /**< PCLK时钟作为COMP1时钟      */
+#define RCC_COMP1_ASYNC_CLK_SRC_RCL           RCC_CLKSEL_COMP1_SEL_RCL              /**< RCL时钟作为COMP1时钟       */
+
+/* COMP2异步时钟源选择 */
+#define RCC_COMP2_ASYNC_CLK_SRC_PCLK          RCC_CLKSEL_COMP2_SEL_PCLK             /**< PCLK时钟作为COMP2时钟      */
+#define RCC_COMP2_ASYNC_CLK_SRC_RCL           RCC_CLKSEL_COMP2_SEL_RCL              /**< RCL时钟作为COMP2时钟       */
+
+/* 复位标志定义 */
+#define RCC_RESET_FLAG_LOCKUP                   RCC_CSR2_LOCKUP_RSTF                  /**< LOCKUP复位标志           */
+#define RCC_RESET_FLAG_NRST                     RCC_CSR2_NRST_RSTF                    /**< NRST引脚复位标志         */
+#define RCC_RESET_FLAG_PMU                      RCC_CSR2_PMU_RSTF                     /**< POR/PDR、BOR复位标志     */
+#define RCC_RESET_FLAG_SW                       RCC_CSR2_SW_RSTF                      /**< 软件复位标志             */
+#define RCC_RESET_FLAG_IWDG                     RCC_CSR2_IWDG_RSTF                    /**< IWDG复位标志             */
+#define RCC_RESET_FLAG_LPM                      RCC_CSR2_LPM_RSTF                     /**< 低功耗复位标志           */
+#define RCC_RESET_FLAG_ALL                     (0xFFUL<<RCC_CSR2_LOCKUP_RSTF_POS)     /**< 所有复位标志             */
+
+
+/** 
+* @} 
+*/
+
+/*-------------------------------------------functions------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @defgroup RCC_External_Functions RCC External Functions
+* @brief    RCC对外函数
+* @{
+*
+*/
+/************************************************************************************************/
+/** 
+* @brief  使能RCH时钟
+* @note   使能RCH后,软件应等待RCHRDY标志置位后,再使用该时钟
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_rch_enable(void)
+{
+    RCC->CSR1 |= RCC_CSR1_RCHON;
+} 
+
+/** 
+* @brief  关闭RCH时钟
+* @note   如果RCH为系统时钟源,则其不能被停止。此时用户应先将系统时钟源切换为其他时钟,再关闭该时钟源
+* @note   当关闭RCH时,需等待RCHRDY标志清零
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_rch_disable(void)
+{
+    RCC->CSR1 &= (~RCC_CSR1_RCHON);
+}
+
+/** 
+* @brief  获取RCH ready标志
+* @retval uint32_t 返回RCH RDY标志状态
+*             @arg 非0: 表示RCH ready已置位
+*             @arg 0:表示RCH ready未置位
+*/
+__STATIC_INLINE uint32_t std_rcc_get_rch_ready(void) 
+{
+    return(RCC->CSR1 & RCC_CSR1_RCHRDY);
+}        
+
+/** 
+* @brief  设置系统时钟源
+* @param  clocksource 系统时钟源
+*             @arg RCC_SYSCLK_SRC_RCHDIV6
+*             @arg RCC_SYSCLK_SRC_RCHDIV3   
+*             @arg RCC_SYSCLK_SRC_RCH    
+*             @arg RCC_SYSCLK_SRC_RCL     
+*             @arg RCC_SYSCLK_SRC_EXTCLK
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_set_sysclk_source(uint32_t clocksource)
+{
+    MODIFY_REG(RCC->CFG, RCC_CFG_SYSW, clocksource);
+}    
+
+/** 
+* @brief  获取系统时钟源信息
+* @retval uint32_t 系统时钟源
+*             @arg RCC_SYSCLK_SRC_STATUS_RCHDIV6  
+*             @arg RCC_SYSCLK_SRC_STATUS_RCHDIV3   
+*             @arg RCC_SYSCLK_SRC_STATUS_RCH    
+*             @arg RCC_SYSCLK_SRC_STATUS_RCL    
+*             @arg RCC_SYSCLK_SRC_STATUS_EXTCLK 
+*/
+__STATIC_INLINE uint32_t std_rcc_get_sysclk_source(void)
+{
+    return(RCC->CFG & RCC_CFG_SYSWS);
+}    
+
+/** 
+* @brief  设置AHB时钟分频因子
+* @param  ahb_div AHB分频因子
+*             @arg RCC_HCLK_DIV1   
+*             @arg RCC_HCLK_DIV2     
+*             @arg ...   
+*             @arg RCC_HCLK_DIV128
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_set_ahbdiv(uint32_t ahb_div)
+{
+    MODIFY_REG(RCC->CFG, RCC_CFG_HPRE, ahb_div);
+}    
+
+/** 
+* @brief  获取AHB时钟分频因子
+* @retval uint32_t HCLK时钟分频因子
+*             @arg RCC_HCLK_DIV1   
+*             @arg RCC_HCLK_DIV2     
+*             @arg ...   
+*             @arg RCC_HCLK_DIV128
+*/
+__STATIC_INLINE uint32_t std_rcc_get_ahbdiv(void)
+{
+    return(RCC->CFG & RCC_CFG_HPRE);
+} 
+
+/** 
+* @brief  设置APB时钟分频因子
+* @param  apb_div APB分频因子
+*             @arg RCC_PCLK_DIV1   
+*             @arg RCC_PCLK_DIV2     
+*             @arg ...   
+*             @arg RCC_PCLK_DIV16
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_set_apbdiv(uint32_t apb_div)
+{
+    MODIFY_REG(RCC->CFG, RCC_CFG_PPRE, apb_div);
+}    
+
+/** 
+* @brief  获取APB时钟分频因子
+* @retval uint32_t PCLK1时钟分频因子
+*             @arg RCC_PCLK_DIV1   
+*             @arg RCC_PCLK_DIV2     
+*             @arg ...   
+*             @arg RCC_PCLK_DIV16
+*/
+__STATIC_INLINE uint32_t std_rcc_get_apbdiv(void)
+{
+    return(RCC->CFG & RCC_CFG_PPRE);
+} 
+
+/**
+* @brief  配置MCO输出信息
+* @param  mco_source MCO输出源选择
+*             @arg RCC_MCO_SRC_SYSCLK
+*             @arg RCC_MCO_SRC_RCHDIV6
+*             @arg RCC_MCO_SRC_EXTCLK
+*             @arg RCC_MCO_SRC_RCL
+* @param  mco_psc MCO输出分频因子
+*             @arg RCC_MCO_DIV1
+*             @arg RCC_MCO_DIV2
+*             @arg ...
+*             @arg RCC_MCO_DIV128
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_mco_config(uint32_t mco_source, uint32_t mco_psc)
+{
+    MODIFY_REG(RCC->CFG, RCC_CFG_MCOSEL | RCC_CFG_MCOPRE, mco_source | mco_psc);
+}
+
+/** 
+* @brief  使能EXTCLK时钟
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_extclk_enable(void) 
+{
+    RCC->CSR1 |= RCC_CSR1_EXTCLKON;     
+}
+
+/** 
+* @brief  关闭EXTCLK时钟
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_extclk_disable(void)
+{
+    RCC->CSR1 &= (~RCC_CSR1_EXTCLKON);
+} 
+
+/** 
+* @brief  使能RCC中断
+* @param  interrupt 使能RCC中断源的信息
+*             @arg  RCC_INTERRUPT_RCL_READY
+*             @arg  RCC_INTERRUPT_RCH_READY
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_interrupt_enable(uint32_t interrupt)     
+{
+    RCC->IER |= (interrupt);
+}
+
+/** 
+* @brief  关闭RCC中断
+* @param  interrupt 关闭RCC中断源的信息
+*             @arg  RCC_INTERRUPT_RCL_READY
+*             @arg  RCC_INTERRUPT_RCH_READY
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_interrupt_disable(uint32_t interrupt)    
+{
+    RCC->IER &= (~(interrupt));
+} 
+
+/**
+* @brief  获取RCC中断使能状态
+* @param  interrupt RCC中断源信息
+*             @arg  RCC_INTERRUPT_RCL_READY
+*             @arg  RCC_INTERRUPT_RCH_READY
+* @retval uint32_t 返回输入中断标志置位状态
+*             @arg 非0: 表示指定的中断处于使能状态
+*             @arg 0:表示指定的中断处于禁止状态
+*/
+__STATIC_INLINE uint32_t std_rcc_get_interrupt_enable(uint32_t interrupt)    
+{
+    return(RCC->IER & (interrupt));
+}
+
+/**
+* @brief  获取RCC中断标志状态
+* @param  flag RCC中断标志信息
+*             @arg  RCC_FLAG_RCL_READY
+*             @arg  RCC_FLAG_RCH_READY
+* @retval uint32_t 返回输入中断标志置位状态
+*             @arg 非0: 表示指定的中断已置位
+*             @arg 0:表示指定的中断未置位
+*/
+__STATIC_INLINE uint32_t std_rcc_get_flag(uint32_t flag) 
+{
+    return(RCC->ISR & (flag));
+}
+
+/** 
+* @brief  清除RCC标志
+* @param  flags 清除标志位
+*             @arg  RCC_CLEAR_RCL_READY
+*             @arg  RCC_CLEAR_RCH_READY
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_clear_flag(uint32_t flags)   
+{
+    RCC->ICR = (flags);
+}
+
+/** 
+* @brief  使能RCL时钟
+* @note   使能RCL后,软件应等待RCLRDY标志置位后,再使用该时钟
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_rcl_enable(void)
+{
+    RCC->CSR2 |= RCC_CSR2_RCLON;
+}          
+
+/** 
+* @brief  关闭RCL时钟
+* @note   如果RCL为系统时钟源,则其不能被停止。此时用户应先将系统时钟源切换为其他时钟,再关闭该时钟源
+* @note   当关闭RCL时,RCLRDY标志会在RCL关闭后自动清零
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_rcl_disable(void) 
+{
+    RCC->CSR2 &= (~RCC_CSR2_RCLON);
+}        
+
+/** 
+* @brief  获取RCL ready标志
+* @retval uint32_t 返回RCL RDY标志状态
+*             @arg 非0: 表示RCL ready已置位
+*             @arg 0:表示RCL ready未置位
+*/
+__STATIC_INLINE uint32_t std_rcc_get_rcl_ready(void)          
+{
+    return(RCC->CSR2 & RCC_CSR2_RCLRDY);
+}
+
+/** 
+* @brief  获取复位标志
+* @param  reset_flag 指定要获取的复位标志
+*             @arg RCC_RESET_FLAG_LOCKUP
+*             @arg RCC_RESET_FLAG_NRST  
+*             @arg RCC_RESET_FLAG_PMU   
+*             @arg RCC_RESET_FLAG_SW    
+*             @arg RCC_RESET_FLAG_IWDG  
+*             @arg RCC_RESET_FLAG_LPM   
+*             @arg RCC_RESET_FLAG_ALL   
+* @retval uint32_t 返回状态标志
+*             @arg 非0: 表示指定的复位标志已置位
+*             @arg 0:表示指定的复位标志未置位
+*/
+__STATIC_INLINE uint32_t std_rcc_get_reset_flag(uint32_t reset_flag)            
+{
+    return(RCC->CSR2 & (reset_flag));
+} 
+
+/** 
+* @brief  清除复位标志
+* @note   该函数将清除所有复位标志
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_clear_reset_flags(void)           
+{
+    RCC->CSR2 |= RCC_CSR2_RMVF;
+}
+
+/** 
+* @brief  GPIO端口时钟使能
+* @param  gpiox_clock 指定使能的GPIO时钟
+*             @arg RCC_PERIPH_CLK_GPIOA
+*             @arg RCC_PERIPH_CLK_GPIOB
+*             @arg RCC_PERIPH_CLK_GPIOC
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_gpio_clk_enable(uint32_t gpiox_clock)
+{
+    RCC->IOPEN |= gpiox_clock; 
+    
+    /* RCC外围时钟启用后的延迟 */  
+    __NOP(); __NOP(); __NOP(); 
+}
+
+/** 
+* @brief  GPIO端口时钟禁止
+* @param  gpiox_clock 指定禁止的GPIO时钟
+*             @arg RCC_PERIPH_CLK_GPIOA
+*             @arg RCC_PERIPH_CLK_GPIOB
+*             @arg RCC_PERIPH_CLK_GPIOC
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_gpio_clk_disable(uint32_t gpiox_clock) 
+{
+    RCC->IOPEN &= (~(gpiox_clock)); 
+    
+    /* RCC外围时钟启用后的延迟 */  
+    __NOP(); __NOP(); __NOP(); 
+}
+
+/** 
+* @brief  GPIO端口复位
+* @param  gpiox_rst 指定复位的GPIO端口
+*             @arg RCC_PERIPH_RESET_GPIOA
+*             @arg RCC_PERIPH_RESET_GPIOB
+*             @arg RCC_PERIPH_RESET_GPIOC
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_gpio_reset(uint32_t gpiox_rst)
+{
+    RCC->IOPRST |= (gpiox_rst);
+    RCC->IOPRST &= (~(gpiox_rst));
+}         
+
+/** 
+* @brief  AHB外设时钟使能
+* @param  periph_clock 指定使能的AHB外设时钟
+*             @arg RCC_PERIPH_CLK_CRC  
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_ahb_clk_enable(uint32_t periph_clock)
+{
+    RCC->AHBEN |= periph_clock;
+    
+    /* RCC外围时钟启用后的延迟 */    
+    __NOP(); __NOP(); __NOP(); 
+}   
+
+/** 
+* @brief  AHB外设时钟禁止
+* @param  periph_clock 指定禁止的AHB外设时钟
+*             @arg RCC_PERIPH_CLK_CRC  
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_ahb_clk_disable(uint32_t periph_clock)            
+{
+    RCC->AHBEN &= (~(periph_clock));
+}
+
+/** 
+* @brief  AHB外设复位
+* @param  periph_rst 指定复位的AHB外设
+*             @arg RCC_PERIPH_RESET_CRC
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_ahb_reset(uint32_t periph_rst)
+{
+    RCC->AHBRST |= (periph_rst);
+    RCC->AHBRST &= (~(periph_rst));
+}       
+
+/** 
+* @brief  APB外设1时钟使能
+* @param  periph_clock 指定使能的APB外设1时钟
+*             @arg RCC_PERIPH_CLK_TIM3   
+*             @arg RCC_PERIPH_CLK_UART2 
+*             @arg RCC_PERIPH_CLK_I2C1   
+*             @arg RCC_PERIPH_CLK_PMU       
+*             @arg RCC_PERIPH_CLK_LPTIM1 
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_apb1_clk_enable(uint32_t periph_clock)
+{
+    RCC->APBEN1 |= periph_clock;
+    
+    /* RCC外围时钟启用后的延迟 */    
+    __NOP(); __NOP(); __NOP(); 
+}
+
+/** 
+* @brief  APB外设1时钟禁止
+* @param  periph_clock 指定禁止的APB外设1时钟
+*             @arg RCC_PERIPH_CLK_TIM3      
+*             @arg RCC_PERIPH_CLK_UART2 
+*             @arg RCC_PERIPH_CLK_I2C1   
+*             @arg RCC_PERIPH_CLK_PMU      
+*             @arg RCC_PERIPH_CLK_LPTIM1 
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_apb1_clk_disable(uint32_t periph_clock)            
+{
+    RCC->APBEN1 &= (~(periph_clock));
+}
+
+/** 
+* @brief  APB外设1复位
+* @param  periph_rst 指定复位的APB外设1
+*             @arg RCC_PERIPH_RESET_TIM3     
+*             @arg RCC_PERIPH_RESET_UART2 
+*             @arg RCC_PERIPH_RESET_I2C1   
+*             @arg RCC_PERIPH_RESET_LPTIM1 
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_apb1_reset(uint32_t periph_rst)
+{
+    RCC->APBRST1 |= (periph_rst);
+    RCC->APBRST1 &= (~(periph_rst));
+}       
+
+/** 
+* @brief  APB外设2时钟使能
+* @param  periph_clock 指定使能的APB外设2时钟
+*             @arg RCC_PERIPH_CLK_COMP
+*             @arg RCC_PERIPH_CLK_TIM1   
+*             @arg RCC_PERIPH_CLK_SPI1   
+*             @arg RCC_PERIPH_CLK_UART1 
+*             @arg RCC_PERIPH_CLK_ADC    
+*             @arg RCC_PERIPH_CLK_DBG
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_apb2_clk_enable(uint32_t periph_clock)
+{
+    RCC->APBEN2 |= periph_clock;
+    
+    /* RCC外围时钟启用后的延迟 */    
+    __NOP(); __NOP(); __NOP(); 
+}
+
+/** 
+* @brief  APB外设2时钟禁止
+* @param  periph_clock 指定禁止的APB外设2时钟
+*             @arg RCC_PERIPH_CLK_COMP
+*             @arg RCC_PERIPH_CLK_TIM1   
+*             @arg RCC_PERIPH_CLK_SPI1   
+*             @arg RCC_PERIPH_CLK_UART1 
+*             @arg RCC_PERIPH_CLK_ADC    
+*             @arg RCC_PERIPH_CLK_DBG
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_apb2_clk_disable(uint32_t periph_clock)            
+{
+    RCC->APBEN2 &= (~(periph_clock));
+}
+
+/** 
+* @brief  APB外设2复位
+* @param  periph_rst 指定复位的APB外设2
+*             @arg RCC_PERIPH_RESET_COMP   
+*             @arg RCC_PERIPH_RESET_TIM1   
+*             @arg RCC_PERIPH_RESET_SPI1   
+*             @arg RCC_PERIPH_RESET_UART1 
+*             @arg RCC_PERIPH_RESET_ADC    
+*             @arg RCC_PERIPH_RESET_DBG  
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_apb2_reset(uint32_t periph_rst)
+{
+    RCC->APBRST2 |= (periph_rst);
+    RCC->APBRST2 &= (~(periph_rst));
+}       
+
+/** 
+* @brief  使能LOCKUP复位
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_lockup_reset_enable(void)
+{
+    RCC->CSR2 |= RCC_CSR2_LOCKUP_RSTEN;
+}
+
+/** 
+* @brief  禁止LOCKUP复位
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_lockup_reset_disable(void)
+{
+    RCC->CSR2 &= (~RCC_CSR2_LOCKUP_RSTEN);
+}
+
+/** 
+* @brief  LPTIM1时钟源选择
+* @param  lptim1clk_select LPTIM1时钟源
+*             @arg RCC_LPTIM1_ASYNC_CLK_SRC_PCLK
+*             @arg RCC_LPTIM1_ASYNC_CLK_SRC_RCL
+*             @arg RCC_LPTIM1_ASYNC_CLK_SRC_MCO
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_set_lptim1clk_source(uint32_t lptim1clk_select)
+{
+    MODIFY_REG(RCC->CLKSEL, RCC_CLKSEL_LPTIM1_SEL, (lptim1clk_select));
+}       
+
+/** 
+* @brief  获取LPTIM1时钟源
+* @retval uint32_t 返回LPTIM1时钟源信息
+*             @arg RCC_LPTIM1_ASYNC_CLK_SRC_PCLK1
+*             @arg RCC_LPTIM1_ASYNC_CLK_SRC_RCL
+*             @arg RCC_LPTIM1_ASYNC_CLK_SRC_MCO
+*/
+__STATIC_INLINE uint32_t std_rcc_get_lptim1clk_source(void)
+{
+    return(RCC->CLKSEL & RCC_CLKSEL_LPTIM1_SEL);
+} 
+
+/** 
+* @brief  COMP1时钟源选择
+* @param  comp1clk_select COMP1时钟源
+*             @arg RCC_COMP1_ASYNC_CLK_SRC_PCLK
+*             @arg RCC_COMP1_ASYNC_CLK_SRC_RCL
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_set_comp1clk_source(uint32_t comp1clk_select)
+{
+    MODIFY_REG(RCC->CLKSEL, RCC_CLKSEL_COMP1_SEL, (comp1clk_select));
+}       
+
+/** 
+* @brief  获取COMP1时钟源
+* @retval uint32_t 返回COMP1时钟源信息
+*             @arg RCC_COMP1_ASYNC_CLK_SRC_PCLK
+*             @arg RCC_COMP1_ASYNC_CLK_SRC_RCL
+*/
+__STATIC_INLINE uint32_t std_rcc_get_comp1clk_source(void)
+{
+    return(RCC->CLKSEL & RCC_CLKSEL_COMP1_SEL);
+} 
+
+/** 
+* @brief  COMP2时钟源选择
+* @param  comp2clk_select COMP2时钟源
+*             @arg RCC_COMP2_ASYNC_CLK_SRC_PCLK
+*             @arg RCC_COMP2_ASYNC_CLK_SRC_RCL
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_set_comp2clk_source(uint32_t comp2clk_select)
+{
+    MODIFY_REG(RCC->CLKSEL, RCC_CLKSEL_COMP2_SEL, (comp2clk_select));
+}       
+
+/** 
+* @brief  获取COMP2时钟源
+* @retval uint32_t 返回COMP2时钟源信息
+*             @arg RCC_COMP2_ASYNC_CLK_SRC_PCLK
+*             @arg RCC_COMP2_ASYNC_CLK_SRC_RCL
+*/
+__STATIC_INLINE uint32_t std_rcc_get_comp2clk_source(void)
+{
+    return(RCC->CLKSEL & RCC_CLKSEL_COMP2_SEL);
+} 
+
+/** 
+* @brief  写RCL校准值
+* @param  cal_value RCL校准值
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_write_rcl_calibration(uint32_t cal_value)
+{
+    RCC->RCLCAL = cal_value;
+}
+
+/** 
+* @brief  读取RCL校准值
+* @retval uint32_t RCL校准值
+*/
+__STATIC_INLINE uint32_t std_rcc_read_rcl_calibration(void)
+{
+    return(RCC->RCLCAL);
+}
+
+/** 
+* @brief  写RCH时钟粗调值
+* @param  cal_value RCH时钟粗调值
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_write_rch_coarse_calibration(uint32_t cal_value)
+{
+    MODIFY_REG(RCC->RCHCAL, RCC_RCHCAL_RCH_CAL_COARSE, cal_value << RCC_RCHCAL_RCH_CAL_COARSE_POS);
+}
+
+/** 
+* @brief  读取RCH时钟粗调值
+* @retval uint32_t RCH时钟粗调值
+*/
+__STATIC_INLINE uint32_t std_rcc_read_rch_coarse_calibration(void)
+{
+    return((RCC->RCHCAL & RCC_RCHCAL_RCH_CAL_COARSE) >> RCC_RCHCAL_RCH_CAL_COARSE_POS);
+}
+
+/** 
+* @brief  写RCH时钟微调值
+* @param  trim_value  RCH时钟微调值
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_write_rch_fine_calibration(uint32_t trim_value)
+{
+    MODIFY_REG(RCC->RCHCAL, RCC_RCHCAL_RCH_CAL_FINE, trim_value);
+}
+
+/** 
+* @brief  读取RCH时钟微调值
+* @retval uint32_t RCH时钟微调值
+*/
+__STATIC_INLINE uint32_t std_rcc_read_rch_fine_calibration(void)
+{
+    return(RCC->RCHCAL & RCC_RCHCAL_RCH_CAL_FINE);
+}
+
+
+/* 获取时钟频率函数 */
+uint32_t std_rcc_get_sysclkfreq(void);
+uint32_t std_rcc_get_hclkfreq(void);
+uint32_t std_rcc_get_pclkfreq(void); 
+
+
+/** 
+* @} 
+*/
+
+
+#ifdef __cplusplus
+}
+#endif
+
+/**
+* @} 
+*/  
+
+/**
+* @}
+*/
+
+#endif /* CIU32F003_STD_RCC_H */

+ 822 - 0
CIU32F003_LIB/Include/ciu32f003_std_rcc(3).h

@@ -0,0 +1,822 @@
+/************************************************************************************************/
+/**
+* @file               ciu32f003_std_rcc.h
+* @author             MCU Ecosystem Development Team
+* @brief              RCC STD库驱动头文件。
+*                     提供RCC相关的STD库操作函数声明、数据类型以及常量的定义。                         
+*                     
+*
+**************************************************************************************************
+* @attention
+* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
+*
+**************************************************************************************************
+*/
+
+/*避免头文件重复引用*/
+#ifndef CIU32F003_STD_RCC_H
+#define CIU32F003_STD_RCC_H
+
+/************************************************************************************************/
+/** 
+* @addtogroup CIU32F003_STD_Driver
+* @{
+*/
+
+/**
+* @defgroup RCC RCC
+* @brief 复位和时钟控制器的STD库驱动
+* @{
+*/
+/************************************************************************************************/
+
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/*------------------------------------------includes--------------------------------------------*/
+#include "ciu32f003_std_common.h"
+
+
+/*--------------------------------------------define--------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @defgroup RCC_Constants RCC Constants 
+* @brief  RCC常量定义及宏定义
+* @{
+*
+*/
+/************************************************************************************************/
+/* 系统时钟源选择 */
+#define RCC_SYSCLK_SRC_RCHDIV6         RCC_CFG_SYSW_RCHDIV6                         /**< 选择RCHDIV6作为系统时钟源   */
+#define RCC_SYSCLK_SRC_RCHDIV3         RCC_CFG_SYSW_RCHDIV3                         /**< 选择RCHDIV3作为系统时钟源   */
+#define RCC_SYSCLK_SRC_RCH             RCC_CFG_SYSW_RCH                             /**< 选择RCH作为系统时钟源       */
+#define RCC_SYSCLK_SRC_RCL             RCC_CFG_SYSW_RCL                             /**< 选择RCL作为系统时钟源       */
+#define RCC_SYSCLK_SRC_EXTCLK          RCC_CFG_SYSW_EXTCLK                          /**< 选择EXTCLK作为系统时钟源    */
+
+/* 系统时钟源状态定义 */
+#define RCC_SYSCLK_SRC_STATUS_RCHDIV6      RCC_CFG_SYSWS_RCHDIV6                    /**< 系统时钟为RCHDIV6  */
+#define RCC_SYSCLK_SRC_STATUS_RCHDIV3      RCC_CFG_SYSWS_RCHDIV3                    /**< 系统时钟为RCHDIV3  */
+#define RCC_SYSCLK_SRC_STATUS_RCH          RCC_CFG_SYSWS_RCH                        /**< 系统时钟为RCH      */
+#define RCC_SYSCLK_SRC_STATUS_RCL          RCC_CFG_SYSWS_RCL                        /**< 系统时钟为RCL      */
+#define RCC_SYSCLK_SRC_STATUS_EXTCLK       RCC_CFG_SYSWS_EXTCLK                     /**< 系统时钟为EXTCLK   */
+
+/* AHB时钟分频参数定义 */
+#define RCC_HCLK_DIV1                      RCC_CFG_HPRE_1                           /**< HCLK不分频         */
+#define RCC_HCLK_DIV2                      RCC_CFG_HPRE_2                           /**< HCLK分频因子 = 2   */
+#define RCC_HCLK_DIV4                      RCC_CFG_HPRE_4                           /**< HCLK分频因子 = 4   */
+#define RCC_HCLK_DIV8                      RCC_CFG_HPRE_8                           /**< HCLK分频因子 = 8   */
+#define RCC_HCLK_DIV16                     RCC_CFG_HPRE_16                          /**< HCLK分频因子 = 16  */
+#define RCC_HCLK_DIV32                     RCC_CFG_HPRE_32                          /**< HCLK分频因子 = 32  */
+#define RCC_HCLK_DIV64                     RCC_CFG_HPRE_64                          /**< HCLK分频因子 = 64  */
+#define RCC_HCLK_DIV128                    RCC_CFG_HPRE_128                         /**< HCLK分频因子 = 128 */
+
+/* APB时钟分频参数定义 */
+#define RCC_PCLK_DIV1                      RCC_CFG_PPRE_1                           /**< APB总线时钟不分频        */
+#define RCC_PCLK_DIV2                      RCC_CFG_PPRE_2                           /**< APB总线时钟分频因子 = 2  */
+#define RCC_PCLK_DIV4                      RCC_CFG_PPRE_4                           /**< APB总线时钟分频因子 = 4  */
+#define RCC_PCLK_DIV8                      RCC_CFG_PPRE_8                           /**< APB总线时钟分频因子 = 8  */
+#define RCC_PCLK_DIV16                     RCC_CFG_PPRE_16                          /**< APB总线时钟分频因子 = 16 */
+        
+/* MCO时钟源参数定义 */                                                                            
+#define RCC_MCO_SRC_DISABLE                RCC_CFG_MCOSEL_DISABLE                   /**< MCO输出无效         */
+#define RCC_MCO_SRC_SYSCLK                 RCC_CFG_MCOSEL_SYSCLK                    /**< MCO选择SYSCLK输出   */
+#define RCC_MCO_SRC_RCHDIV6                RCC_CFG_MCOSEL_RCHDIV6                   /**< MCO选择RCHDIV6输出  */
+#define RCC_MCO_SRC_EXTCLK                 RCC_CFG_MCOSEL_EXTCLK                    /**< MCO选择EXTCLK输出   */
+#define RCC_MCO_SRC_RCL                    RCC_CFG_MCOSEL_RCL                       /**< MCO选择RCL输出      */
+
+/* MCO时钟分频参数定义 */
+#define RCC_MCO_DIV1                       RCC_CFG_MCOPRE_DIV1                      /**< MCO不分频         */
+#define RCC_MCO_DIV2                       RCC_CFG_MCOPRE_DIV2                      /**< MCO分频因子 = 2   */
+#define RCC_MCO_DIV4                       RCC_CFG_MCOPRE_DIV4                      /**< MCO分频因子 = 4   */
+#define RCC_MCO_DIV8                       RCC_CFG_MCOPRE_DIV8                      /**< MCO分频因子 = 8   */
+#define RCC_MCO_DIV16                      RCC_CFG_MCOPRE_DIV16                     /**< MCO分频因子 = 16  */
+#define RCC_MCO_DIV32                      RCC_CFG_MCOPRE_DIV32                     /**< MCO分频因子 = 32  */
+#define RCC_MCO_DIV64                      RCC_CFG_MCOPRE_DIV64                     /**< MCO分频因子 = 64  */
+#define RCC_MCO_DIV128                     RCC_CFG_MCOPRE_DIV128                    /**< MCO分频因子 = 128 */
+
+/* RCC中断控制位定义 */
+#define RCC_INTERRUPT_RCL_READY            RCC_IER_RCL_RDYIE                        /**< RCL Ready的中断控制位   */
+#define RCC_INTERRUPT_RCH_READY            RCC_IER_RCH_RDYIE                        /**< RCH Ready的中断控制位   */
+
+/* RCC中断标志位定义 */
+#define RCC_FLAG_RCL_READY                 RCC_ISR_RCL_RDYF                         /**< RCL Ready的中断标志位   */
+#define RCC_FLAG_RCH_READY                 RCC_ISR_RCH_RDYF                         /**< RCH Ready的中断标志位   */
+
+/* RCC清除控制位定义 */
+#define RCC_CLEAR_RCL_READY                RCC_ICR_RCL_RDYC                         /**< RCL Ready的清除控制位   */
+#define RCC_CLEAR_RCH_READY                RCC_ICR_RCH_RDYC                         /**< RCH Ready的清除控制位   */
+
+/* IO端口时钟选择 */
+#define RCC_PERIPH_CLK_GPIOA              RCC_IOPEN_GPIOAEN                        /**< GPIOA 时钟控制位  */
+#define RCC_PERIPH_CLK_GPIOB              RCC_IOPEN_GPIOBEN                        /**< GPIOB 时钟控制位  */
+#define RCC_PERIPH_CLK_GPIOC              RCC_IOPEN_GPIOCEN                        /**< GPIOC 时钟控制位  */
+
+/* IO端口复位选择 */
+#define RCC_PERIPH_RESET_GPIOA            RCC_IOPRST_GPIOA_RST                            /**< GPIOA端口复位控制位  */
+#define RCC_PERIPH_RESET_GPIOB            RCC_IOPRST_GPIOB_RST                            /**< GPIOB端口复位控制位  */
+#define RCC_PERIPH_RESET_GPIOC            RCC_IOPRST_GPIOC_RST                            /**< GPIOC端口复位控制位  */
+
+/* AHB外设时钟选择 */
+#define RCC_PERIPH_CLK_CRC                RCC_AHBEN_CRCEN                                 /**< AHB外设CRC时钟控制位  */
+
+/* AHB外设复位选择 */
+#define RCC_PERIPH_RESET_CRC              RCC_AHBRST_CRC_RST                              /**< AHB外设CRC复位控制位  */
+
+/* APB外设时钟选择 */
+#define RCC_PERIPH_CLK_TIM3               RCC_APBEN1_TIM3EN                               /**< APB外设TIM3时钟控制位    */
+#define RCC_PERIPH_CLK_UART2              RCC_APBEN1_UART2EN                              /**< APB外设UART2时钟控制位   */
+#define RCC_PERIPH_CLK_I2C1               RCC_APBEN1_I2C1EN                               /**< APB外设I2C1时钟控制位    */
+#define RCC_PERIPH_CLK_PMU                RCC_APBEN1_PMUEN                                /**< APB外设PMU时钟控制位     */
+#define RCC_PERIPH_CLK_LPTIM1             RCC_APBEN1_LPTIM1EN                             /**< APB外设LPTIM1时钟控制位  */
+
+#define RCC_PERIPH_CLK_COMP               RCC_APBEN2_COMPEN                               /**< APB外设COMP时钟控制位    */
+#define RCC_PERIPH_CLK_TIM1               RCC_APBEN2_TIM1EN                               /**< APB外设TIM1时钟控制位    */
+#define RCC_PERIPH_CLK_SPI1               RCC_APBEN2_SPI1EN                               /**< APB外设SPI1时钟控制位    */
+#define RCC_PERIPH_CLK_UART1              RCC_APBEN2_UART1EN                              /**< APB外设UART1时钟控制位   */
+#define RCC_PERIPH_CLK_ADC                RCC_APBEN2_ADCEN                                /**< APB外设ADC时钟控制位     */
+#define RCC_PERIPH_CLK_DBG                RCC_APBEN2_DBGEN                                /**< APB外设DBG时钟控制位     */
+
+/* APB外设复位选择 */
+#define RCC_PERIPH_RESET_TIM3             RCC_APBRST1_TIM3_RST                            /**< APB外设TIM3复位控制位    */
+#define RCC_PERIPH_RESET_UART2            RCC_APBRST1_UART2_RST                           /**< APB外设UART2复位控制位   */
+#define RCC_PERIPH_RESET_I2C1             RCC_APBRST1_I2C1_RST                            /**< APB外设I2C1复位控制位    */
+#define RCC_PERIPH_RESET_LPTIM1           RCC_APBRST1_LPTIM1_RST                          /**< APB外设LPTIM1复位控制位  */
+                                                                                                                                                                  
+#define RCC_PERIPH_RESET_COMP             RCC_APBRST2_COMP_RST                            /**< APB外设COMP复位制位      */
+#define RCC_PERIPH_RESET_TIM1             RCC_APBRST2_TIM1_RST                            /**< APB外设TIM1复位控制位    */
+#define RCC_PERIPH_RESET_SPI1             RCC_APBRST2_SPI1_RST                            /**< APB外设SPI1复位控制位    */
+#define RCC_PERIPH_RESET_UART1            RCC_APBRST2_UART1_RST                           /**< APB外设UART复位控制位    */
+#define RCC_PERIPH_RESET_ADC              RCC_APBRST2_ADC_RST                             /**< APB外设ADC复位控制位     */
+#define RCC_PERIPH_RESET_DBG              RCC_APBRST2_DBG_RST                             /**< APB外设DBG复位控制位     */
+
+/* LPTIM1异步时钟源选择 */
+#define RCC_LPTIM1_ASYNC_CLK_SRC_PCLK         RCC_CLKSEL_LPTIM1_SEL_PCLK             /**< PCLK时钟作为LPTIM1时钟      */
+#define RCC_LPTIM1_ASYNC_CLK_SRC_RCL          RCC_CLKSEL_LPTIM1_SEL_RCL              /**< RCL时钟作为LPTIM1时钟       */
+#define RCC_LPTIM1_ASYNC_CLK_SRC_MCO          RCC_CLKSEL_LPTIM1_SEL_MCO              /**< MCO时钟作为LPTIM1时钟       */
+
+/* COMP1异步时钟源选择 */
+#define RCC_COMP1_ASYNC_CLK_SRC_PCLK          RCC_CLKSEL_COMP1_SEL_PCLK             /**< PCLK时钟作为COMP1时钟      */
+#define RCC_COMP1_ASYNC_CLK_SRC_RCL           RCC_CLKSEL_COMP1_SEL_RCL              /**< RCL时钟作为COMP1时钟       */
+
+/* COMP2异步时钟源选择 */
+#define RCC_COMP2_ASYNC_CLK_SRC_PCLK          RCC_CLKSEL_COMP2_SEL_PCLK             /**< PCLK时钟作为COMP2时钟      */
+#define RCC_COMP2_ASYNC_CLK_SRC_RCL           RCC_CLKSEL_COMP2_SEL_RCL              /**< RCL时钟作为COMP2时钟       */
+
+/* 复位标志定义 */
+#define RCC_RESET_FLAG_LOCKUP                   RCC_CSR2_LOCKUP_RSTF                  /**< LOCKUP复位标志           */
+#define RCC_RESET_FLAG_NRST                     RCC_CSR2_NRST_RSTF                    /**< NRST引脚复位标志         */
+#define RCC_RESET_FLAG_PMU                      RCC_CSR2_PMU_RSTF                     /**< POR/PDR、BOR复位标志     */
+#define RCC_RESET_FLAG_SW                       RCC_CSR2_SW_RSTF                      /**< 软件复位标志             */
+#define RCC_RESET_FLAG_IWDG                     RCC_CSR2_IWDG_RSTF                    /**< IWDG复位标志             */
+#define RCC_RESET_FLAG_LPM                      RCC_CSR2_LPM_RSTF                     /**< 低功耗复位标志           */
+#define RCC_RESET_FLAG_ALL                     (0xFFUL<<RCC_CSR2_LOCKUP_RSTF_POS)     /**< 所有复位标志             */
+
+
+/** 
+* @} 
+*/
+
+/*-------------------------------------------functions------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @defgroup RCC_External_Functions RCC External Functions
+* @brief    RCC对外函数
+* @{
+*
+*/
+/************************************************************************************************/
+/** 
+* @brief  使能RCH时钟
+* @note   使能RCH后,软件应等待RCHRDY标志置位后,再使用该时钟
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_rch_enable(void)
+{
+    RCC->CSR1 |= RCC_CSR1_RCHON;
+} 
+
+/** 
+* @brief  关闭RCH时钟
+* @note   如果RCH为系统时钟源,则其不能被停止。此时用户应先将系统时钟源切换为其他时钟,再关闭该时钟源
+* @note   当关闭RCH时,需等待RCHRDY标志清零
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_rch_disable(void)
+{
+    RCC->CSR1 &= (~RCC_CSR1_RCHON);
+}
+
+/** 
+* @brief  获取RCH ready标志
+* @retval uint32_t 返回RCH RDY标志状态
+*             @arg 非0: 表示RCH ready已置位
+*             @arg 0:表示RCH ready未置位
+*/
+__STATIC_INLINE uint32_t std_rcc_get_rch_ready(void) 
+{
+    return(RCC->CSR1 & RCC_CSR1_RCHRDY);
+}        
+
+/** 
+* @brief  设置系统时钟源
+* @param  clocksource 系统时钟源
+*             @arg RCC_SYSCLK_SRC_RCHDIV6
+*             @arg RCC_SYSCLK_SRC_RCHDIV3   
+*             @arg RCC_SYSCLK_SRC_RCH    
+*             @arg RCC_SYSCLK_SRC_RCL     
+*             @arg RCC_SYSCLK_SRC_EXTCLK
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_set_sysclk_source(uint32_t clocksource)
+{
+    MODIFY_REG(RCC->CFG, RCC_CFG_SYSW, clocksource);
+}    
+
+/** 
+* @brief  获取系统时钟源信息
+* @retval uint32_t 系统时钟源
+*             @arg RCC_SYSCLK_SRC_STATUS_RCHDIV6  
+*             @arg RCC_SYSCLK_SRC_STATUS_RCHDIV3   
+*             @arg RCC_SYSCLK_SRC_STATUS_RCH    
+*             @arg RCC_SYSCLK_SRC_STATUS_RCL    
+*             @arg RCC_SYSCLK_SRC_STATUS_EXTCLK 
+*/
+__STATIC_INLINE uint32_t std_rcc_get_sysclk_source(void)
+{
+    return(RCC->CFG & RCC_CFG_SYSWS);
+}    
+
+/** 
+* @brief  设置AHB时钟分频因子
+* @param  ahb_div AHB分频因子
+*             @arg RCC_HCLK_DIV1   
+*             @arg RCC_HCLK_DIV2     
+*             @arg ...   
+*             @arg RCC_HCLK_DIV128
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_set_ahbdiv(uint32_t ahb_div)
+{
+    MODIFY_REG(RCC->CFG, RCC_CFG_HPRE, ahb_div);
+}    
+
+/** 
+* @brief  获取AHB时钟分频因子
+* @retval uint32_t HCLK时钟分频因子
+*             @arg RCC_HCLK_DIV1   
+*             @arg RCC_HCLK_DIV2     
+*             @arg ...   
+*             @arg RCC_HCLK_DIV128
+*/
+__STATIC_INLINE uint32_t std_rcc_get_ahbdiv(void)
+{
+    return(RCC->CFG & RCC_CFG_HPRE);
+} 
+
+/** 
+* @brief  设置APB时钟分频因子
+* @param  apb_div APB分频因子
+*             @arg RCC_PCLK_DIV1   
+*             @arg RCC_PCLK_DIV2     
+*             @arg ...   
+*             @arg RCC_PCLK_DIV16
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_set_apbdiv(uint32_t apb_div)
+{
+    MODIFY_REG(RCC->CFG, RCC_CFG_PPRE, apb_div);
+}    
+
+/** 
+* @brief  获取APB时钟分频因子
+* @retval uint32_t PCLK1时钟分频因子
+*             @arg RCC_PCLK_DIV1   
+*             @arg RCC_PCLK_DIV2     
+*             @arg ...   
+*             @arg RCC_PCLK_DIV16
+*/
+__STATIC_INLINE uint32_t std_rcc_get_apbdiv(void)
+{
+    return(RCC->CFG & RCC_CFG_PPRE);
+} 
+
+/**
+* @brief  配置MCO输出信息
+* @param  mco_source MCO输出源选择
+*             @arg RCC_MCO_SRC_SYSCLK
+*             @arg RCC_MCO_SRC_RCHDIV6
+*             @arg RCC_MCO_SRC_EXTCLK
+*             @arg RCC_MCO_SRC_RCL
+* @param  mco_psc MCO输出分频因子
+*             @arg RCC_MCO_DIV1
+*             @arg RCC_MCO_DIV2
+*             @arg ...
+*             @arg RCC_MCO_DIV128
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_mco_config(uint32_t mco_source, uint32_t mco_psc)
+{
+    MODIFY_REG(RCC->CFG, RCC_CFG_MCOSEL | RCC_CFG_MCOPRE, mco_source | mco_psc);
+}
+
+/** 
+* @brief  使能EXTCLK时钟
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_extclk_enable(void) 
+{
+    RCC->CSR1 |= RCC_CSR1_EXTCLKON;     
+}
+
+/** 
+* @brief  关闭EXTCLK时钟
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_extclk_disable(void)
+{
+    RCC->CSR1 &= (~RCC_CSR1_EXTCLKON);
+} 
+
+/** 
+* @brief  使能RCC中断
+* @param  interrupt 使能RCC中断源的信息
+*             @arg  RCC_INTERRUPT_RCL_READY
+*             @arg  RCC_INTERRUPT_RCH_READY
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_interrupt_enable(uint32_t interrupt)     
+{
+    RCC->IER |= (interrupt);
+}
+
+/** 
+* @brief  关闭RCC中断
+* @param  interrupt 关闭RCC中断源的信息
+*             @arg  RCC_INTERRUPT_RCL_READY
+*             @arg  RCC_INTERRUPT_RCH_READY
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_interrupt_disable(uint32_t interrupt)    
+{
+    RCC->IER &= (~(interrupt));
+} 
+
+/**
+* @brief  获取RCC中断使能状态
+* @param  interrupt RCC中断源信息
+*             @arg  RCC_INTERRUPT_RCL_READY
+*             @arg  RCC_INTERRUPT_RCH_READY
+* @retval uint32_t 返回输入中断标志置位状态
+*             @arg 非0: 表示指定的中断处于使能状态
+*             @arg 0:表示指定的中断处于禁止状态
+*/
+__STATIC_INLINE uint32_t std_rcc_get_interrupt_enable(uint32_t interrupt)    
+{
+    return(RCC->IER & (interrupt));
+}
+
+/**
+* @brief  获取RCC中断标志状态
+* @param  flag RCC中断标志信息
+*             @arg  RCC_FLAG_RCL_READY
+*             @arg  RCC_FLAG_RCH_READY
+* @retval uint32_t 返回输入中断标志置位状态
+*             @arg 非0: 表示指定的中断已置位
+*             @arg 0:表示指定的中断未置位
+*/
+__STATIC_INLINE uint32_t std_rcc_get_flag(uint32_t flag) 
+{
+    return(RCC->ISR & (flag));
+}
+
+/** 
+* @brief  清除RCC标志
+* @param  flags 清除标志位
+*             @arg  RCC_CLEAR_RCL_READY
+*             @arg  RCC_CLEAR_RCH_READY
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_clear_flag(uint32_t flags)   
+{
+    RCC->ICR = (flags);
+}
+
+/** 
+* @brief  使能RCL时钟
+* @note   使能RCL后,软件应等待RCLRDY标志置位后,再使用该时钟
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_rcl_enable(void)
+{
+    RCC->CSR2 |= RCC_CSR2_RCLON;
+}          
+
+/** 
+* @brief  关闭RCL时钟
+* @note   如果RCL为系统时钟源,则其不能被停止。此时用户应先将系统时钟源切换为其他时钟,再关闭该时钟源
+* @note   当关闭RCL时,RCLRDY标志会在RCL关闭后自动清零
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_rcl_disable(void) 
+{
+    RCC->CSR2 &= (~RCC_CSR2_RCLON);
+}        
+
+/** 
+* @brief  获取RCL ready标志
+* @retval uint32_t 返回RCL RDY标志状态
+*             @arg 非0: 表示RCL ready已置位
+*             @arg 0:表示RCL ready未置位
+*/
+__STATIC_INLINE uint32_t std_rcc_get_rcl_ready(void)          
+{
+    return(RCC->CSR2 & RCC_CSR2_RCLRDY);
+}
+
+/** 
+* @brief  获取复位标志
+* @param  reset_flag 指定要获取的复位标志
+*             @arg RCC_RESET_FLAG_LOCKUP
+*             @arg RCC_RESET_FLAG_NRST  
+*             @arg RCC_RESET_FLAG_PMU   
+*             @arg RCC_RESET_FLAG_SW    
+*             @arg RCC_RESET_FLAG_IWDG  
+*             @arg RCC_RESET_FLAG_LPM   
+*             @arg RCC_RESET_FLAG_ALL   
+* @retval uint32_t 返回状态标志
+*             @arg 非0: 表示指定的复位标志已置位
+*             @arg 0:表示指定的复位标志未置位
+*/
+__STATIC_INLINE uint32_t std_rcc_get_reset_flag(uint32_t reset_flag)            
+{
+    return(RCC->CSR2 & (reset_flag));
+} 
+
+/** 
+* @brief  清除复位标志
+* @note   该函数将清除所有复位标志
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_clear_reset_flags(void)           
+{
+    RCC->CSR2 |= RCC_CSR2_RMVF;
+}
+
+/** 
+* @brief  GPIO端口时钟使能
+* @param  gpiox_clock 指定使能的GPIO时钟
+*             @arg RCC_PERIPH_CLK_GPIOA
+*             @arg RCC_PERIPH_CLK_GPIOB
+*             @arg RCC_PERIPH_CLK_GPIOC
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_gpio_clk_enable(uint32_t gpiox_clock)
+{
+    RCC->IOPEN |= gpiox_clock; 
+    
+    /* RCC外围时钟启用后的延迟 */  
+    __NOP(); __NOP(); __NOP(); 
+}
+
+/** 
+* @brief  GPIO端口时钟禁止
+* @param  gpiox_clock 指定禁止的GPIO时钟
+*             @arg RCC_PERIPH_CLK_GPIOA
+*             @arg RCC_PERIPH_CLK_GPIOB
+*             @arg RCC_PERIPH_CLK_GPIOC
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_gpio_clk_disable(uint32_t gpiox_clock) 
+{
+    RCC->IOPEN &= (~(gpiox_clock)); 
+    
+    /* RCC外围时钟启用后的延迟 */  
+    __NOP(); __NOP(); __NOP(); 
+}
+
+/** 
+* @brief  GPIO端口复位
+* @param  gpiox_rst 指定复位的GPIO端口
+*             @arg RCC_PERIPH_RESET_GPIOA
+*             @arg RCC_PERIPH_RESET_GPIOB
+*             @arg RCC_PERIPH_RESET_GPIOC
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_gpio_reset(uint32_t gpiox_rst)
+{
+    RCC->IOPRST |= (gpiox_rst);
+    RCC->IOPRST &= (~(gpiox_rst));
+}         
+
+/** 
+* @brief  AHB外设时钟使能
+* @param  periph_clock 指定使能的AHB外设时钟
+*             @arg RCC_PERIPH_CLK_CRC  
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_ahb_clk_enable(uint32_t periph_clock)
+{
+    RCC->AHBEN |= periph_clock;
+    
+    /* RCC外围时钟启用后的延迟 */    
+    __NOP(); __NOP(); __NOP(); 
+}   
+
+/** 
+* @brief  AHB外设时钟禁止
+* @param  periph_clock 指定禁止的AHB外设时钟
+*             @arg RCC_PERIPH_CLK_CRC  
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_ahb_clk_disable(uint32_t periph_clock)            
+{
+    RCC->AHBEN &= (~(periph_clock));
+}
+
+/** 
+* @brief  AHB外设复位
+* @param  periph_rst 指定复位的AHB外设
+*             @arg RCC_PERIPH_RESET_CRC
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_ahb_reset(uint32_t periph_rst)
+{
+    RCC->AHBRST |= (periph_rst);
+    RCC->AHBRST &= (~(periph_rst));
+}       
+
+/** 
+* @brief  APB外设1时钟使能
+* @param  periph_clock 指定使能的APB外设1时钟
+*             @arg RCC_PERIPH_CLK_TIM3   
+*             @arg RCC_PERIPH_CLK_UART2 
+*             @arg RCC_PERIPH_CLK_I2C1   
+*             @arg RCC_PERIPH_CLK_PMU       
+*             @arg RCC_PERIPH_CLK_LPTIM1 
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_apb1_clk_enable(uint32_t periph_clock)
+{
+    RCC->APBEN1 |= periph_clock;
+    
+    /* RCC外围时钟启用后的延迟 */    
+    __NOP(); __NOP(); __NOP(); 
+}
+
+/** 
+* @brief  APB外设1时钟禁止
+* @param  periph_clock 指定禁止的APB外设1时钟
+*             @arg RCC_PERIPH_CLK_TIM3      
+*             @arg RCC_PERIPH_CLK_UART2 
+*             @arg RCC_PERIPH_CLK_I2C1   
+*             @arg RCC_PERIPH_CLK_PMU      
+*             @arg RCC_PERIPH_CLK_LPTIM1 
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_apb1_clk_disable(uint32_t periph_clock)            
+{
+    RCC->APBEN1 &= (~(periph_clock));
+}
+
+/** 
+* @brief  APB外设1复位
+* @param  periph_rst 指定复位的APB外设1
+*             @arg RCC_PERIPH_RESET_TIM3     
+*             @arg RCC_PERIPH_RESET_UART2 
+*             @arg RCC_PERIPH_RESET_I2C1   
+*             @arg RCC_PERIPH_RESET_LPTIM1 
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_apb1_reset(uint32_t periph_rst)
+{
+    RCC->APBRST1 |= (periph_rst);
+    RCC->APBRST1 &= (~(periph_rst));
+}       
+
+/** 
+* @brief  APB外设2时钟使能
+* @param  periph_clock 指定使能的APB外设2时钟
+*             @arg RCC_PERIPH_CLK_COMP
+*             @arg RCC_PERIPH_CLK_TIM1   
+*             @arg RCC_PERIPH_CLK_SPI1   
+*             @arg RCC_PERIPH_CLK_UART1 
+*             @arg RCC_PERIPH_CLK_ADC    
+*             @arg RCC_PERIPH_CLK_DBG
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_apb2_clk_enable(uint32_t periph_clock)
+{
+    RCC->APBEN2 |= periph_clock;
+    
+    /* RCC外围时钟启用后的延迟 */    
+    __NOP(); __NOP(); __NOP(); 
+}
+
+/** 
+* @brief  APB外设2时钟禁止
+* @param  periph_clock 指定禁止的APB外设2时钟
+*             @arg RCC_PERIPH_CLK_COMP
+*             @arg RCC_PERIPH_CLK_TIM1   
+*             @arg RCC_PERIPH_CLK_SPI1   
+*             @arg RCC_PERIPH_CLK_UART1 
+*             @arg RCC_PERIPH_CLK_ADC    
+*             @arg RCC_PERIPH_CLK_DBG
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_apb2_clk_disable(uint32_t periph_clock)            
+{
+    RCC->APBEN2 &= (~(periph_clock));
+}
+
+/** 
+* @brief  APB外设2复位
+* @param  periph_rst 指定复位的APB外设2
+*             @arg RCC_PERIPH_RESET_COMP   
+*             @arg RCC_PERIPH_RESET_TIM1   
+*             @arg RCC_PERIPH_RESET_SPI1   
+*             @arg RCC_PERIPH_RESET_UART1 
+*             @arg RCC_PERIPH_RESET_ADC    
+*             @arg RCC_PERIPH_RESET_DBG  
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_apb2_reset(uint32_t periph_rst)
+{
+    RCC->APBRST2 |= (periph_rst);
+    RCC->APBRST2 &= (~(periph_rst));
+}       
+
+/** 
+* @brief  使能LOCKUP复位
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_lockup_reset_enable(void)
+{
+    RCC->CSR2 |= RCC_CSR2_LOCKUP_RSTEN;
+}
+
+/** 
+* @brief  禁止LOCKUP复位
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_lockup_reset_disable(void)
+{
+    RCC->CSR2 &= (~RCC_CSR2_LOCKUP_RSTEN);
+}
+
+/** 
+* @brief  LPTIM1时钟源选择
+* @param  lptim1clk_select LPTIM1时钟源
+*             @arg RCC_LPTIM1_ASYNC_CLK_SRC_PCLK
+*             @arg RCC_LPTIM1_ASYNC_CLK_SRC_RCL
+*             @arg RCC_LPTIM1_ASYNC_CLK_SRC_MCO
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_set_lptim1clk_source(uint32_t lptim1clk_select)
+{
+    MODIFY_REG(RCC->CLKSEL, RCC_CLKSEL_LPTIM1_SEL, (lptim1clk_select));
+}       
+
+/** 
+* @brief  获取LPTIM1时钟源
+* @retval uint32_t 返回LPTIM1时钟源信息
+*             @arg RCC_LPTIM1_ASYNC_CLK_SRC_PCLK1
+*             @arg RCC_LPTIM1_ASYNC_CLK_SRC_RCL
+*             @arg RCC_LPTIM1_ASYNC_CLK_SRC_MCO
+*/
+__STATIC_INLINE uint32_t std_rcc_get_lptim1clk_source(void)
+{
+    return(RCC->CLKSEL & RCC_CLKSEL_LPTIM1_SEL);
+} 
+
+/** 
+* @brief  COMP1时钟源选择
+* @param  comp1clk_select COMP1时钟源
+*             @arg RCC_COMP1_ASYNC_CLK_SRC_PCLK
+*             @arg RCC_COMP1_ASYNC_CLK_SRC_RCL
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_set_comp1clk_source(uint32_t comp1clk_select)
+{
+    MODIFY_REG(RCC->CLKSEL, RCC_CLKSEL_COMP1_SEL, (comp1clk_select));
+}       
+
+/** 
+* @brief  获取COMP1时钟源
+* @retval uint32_t 返回COMP1时钟源信息
+*             @arg RCC_COMP1_ASYNC_CLK_SRC_PCLK
+*             @arg RCC_COMP1_ASYNC_CLK_SRC_RCL
+*/
+__STATIC_INLINE uint32_t std_rcc_get_comp1clk_source(void)
+{
+    return(RCC->CLKSEL & RCC_CLKSEL_COMP1_SEL);
+} 
+
+/** 
+* @brief  COMP2时钟源选择
+* @param  comp2clk_select COMP2时钟源
+*             @arg RCC_COMP2_ASYNC_CLK_SRC_PCLK
+*             @arg RCC_COMP2_ASYNC_CLK_SRC_RCL
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_set_comp2clk_source(uint32_t comp2clk_select)
+{
+    MODIFY_REG(RCC->CLKSEL, RCC_CLKSEL_COMP2_SEL, (comp2clk_select));
+}       
+
+/** 
+* @brief  获取COMP2时钟源
+* @retval uint32_t 返回COMP2时钟源信息
+*             @arg RCC_COMP2_ASYNC_CLK_SRC_PCLK
+*             @arg RCC_COMP2_ASYNC_CLK_SRC_RCL
+*/
+__STATIC_INLINE uint32_t std_rcc_get_comp2clk_source(void)
+{
+    return(RCC->CLKSEL & RCC_CLKSEL_COMP2_SEL);
+} 
+
+/** 
+* @brief  写RCL校准值
+* @param  cal_value RCL校准值
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_write_rcl_calibration(uint32_t cal_value)
+{
+    RCC->RCLCAL = cal_value;
+}
+
+/** 
+* @brief  读取RCL校准值
+* @retval uint32_t RCL校准值
+*/
+__STATIC_INLINE uint32_t std_rcc_read_rcl_calibration(void)
+{
+    return(RCC->RCLCAL);
+}
+
+/** 
+* @brief  写RCH时钟粗调值
+* @param  cal_value RCH时钟粗调值
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_write_rch_coarse_calibration(uint32_t cal_value)
+{
+    MODIFY_REG(RCC->RCHCAL, RCC_RCHCAL_RCH_CAL_COARSE, cal_value << RCC_RCHCAL_RCH_CAL_COARSE_POS);
+}
+
+/** 
+* @brief  读取RCH时钟粗调值
+* @retval uint32_t RCH时钟粗调值
+*/
+__STATIC_INLINE uint32_t std_rcc_read_rch_coarse_calibration(void)
+{
+    return((RCC->RCHCAL & RCC_RCHCAL_RCH_CAL_COARSE) >> RCC_RCHCAL_RCH_CAL_COARSE_POS);
+}
+
+/** 
+* @brief  写RCH时钟微调值
+* @param  trim_value  RCH时钟微调值
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_write_rch_fine_calibration(uint32_t trim_value)
+{
+    MODIFY_REG(RCC->RCHCAL, RCC_RCHCAL_RCH_CAL_FINE, trim_value);
+}
+
+/** 
+* @brief  读取RCH时钟微调值
+* @retval uint32_t RCH时钟微调值
+*/
+__STATIC_INLINE uint32_t std_rcc_read_rch_fine_calibration(void)
+{
+    return(RCC->RCHCAL & RCC_RCHCAL_RCH_CAL_FINE);
+}
+
+
+/* 获取时钟频率函数 */
+uint32_t std_rcc_get_sysclkfreq(void);
+uint32_t std_rcc_get_hclkfreq(void);
+uint32_t std_rcc_get_pclkfreq(void); 
+
+
+/** 
+* @} 
+*/
+
+
+#ifdef __cplusplus
+}
+#endif
+
+/**
+* @} 
+*/  
+
+/**
+* @}
+*/
+
+#endif /* CIU32F003_STD_RCC_H */

+ 822 - 0
CIU32F003_LIB/Include/ciu32f003_std_rcc.h

@@ -0,0 +1,822 @@
+/************************************************************************************************/
+/**
+* @file               ciu32f003_std_rcc.h
+* @author             MCU Ecosystem Development Team
+* @brief              RCC STD库驱动头文件。
+*                     提供RCC相关的STD库操作函数声明、数据类型以及常量的定义。                         
+*                     
+*
+**************************************************************************************************
+* @attention
+* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
+*
+**************************************************************************************************
+*/
+
+/*避免头文件重复引用*/
+#ifndef CIU32F003_STD_RCC_H
+#define CIU32F003_STD_RCC_H
+
+/************************************************************************************************/
+/** 
+* @addtogroup CIU32F003_STD_Driver
+* @{
+*/
+
+/**
+* @defgroup RCC RCC
+* @brief 复位和时钟控制器的STD库驱动
+* @{
+*/
+/************************************************************************************************/
+
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/*------------------------------------------includes--------------------------------------------*/
+#include "ciu32f003_std_common.h"
+
+
+/*--------------------------------------------define--------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @defgroup RCC_Constants RCC Constants 
+* @brief  RCC常量定义及宏定义
+* @{
+*
+*/
+/************************************************************************************************/
+/* 系统时钟源选择 */
+#define RCC_SYSCLK_SRC_RCHDIV6         RCC_CFG_SYSW_RCHDIV6                         /**< 选择RCHDIV6作为系统时钟源   */
+#define RCC_SYSCLK_SRC_RCHDIV3         RCC_CFG_SYSW_RCHDIV3                         /**< 选择RCHDIV3作为系统时钟源   */
+#define RCC_SYSCLK_SRC_RCH             RCC_CFG_SYSW_RCH                             /**< 选择RCH作为系统时钟源       */
+#define RCC_SYSCLK_SRC_RCL             RCC_CFG_SYSW_RCL                             /**< 选择RCL作为系统时钟源       */
+#define RCC_SYSCLK_SRC_EXTCLK          RCC_CFG_SYSW_EXTCLK                          /**< 选择EXTCLK作为系统时钟源    */
+
+/* 系统时钟源状态定义 */
+#define RCC_SYSCLK_SRC_STATUS_RCHDIV6      RCC_CFG_SYSWS_RCHDIV6                    /**< 系统时钟为RCHDIV6  */
+#define RCC_SYSCLK_SRC_STATUS_RCHDIV3      RCC_CFG_SYSWS_RCHDIV3                    /**< 系统时钟为RCHDIV3  */
+#define RCC_SYSCLK_SRC_STATUS_RCH          RCC_CFG_SYSWS_RCH                        /**< 系统时钟为RCH      */
+#define RCC_SYSCLK_SRC_STATUS_RCL          RCC_CFG_SYSWS_RCL                        /**< 系统时钟为RCL      */
+#define RCC_SYSCLK_SRC_STATUS_EXTCLK       RCC_CFG_SYSWS_EXTCLK                     /**< 系统时钟为EXTCLK   */
+
+/* AHB时钟分频参数定义 */
+#define RCC_HCLK_DIV1                      RCC_CFG_HPRE_1                           /**< HCLK不分频         */
+#define RCC_HCLK_DIV2                      RCC_CFG_HPRE_2                           /**< HCLK分频因子 = 2   */
+#define RCC_HCLK_DIV4                      RCC_CFG_HPRE_4                           /**< HCLK分频因子 = 4   */
+#define RCC_HCLK_DIV8                      RCC_CFG_HPRE_8                           /**< HCLK分频因子 = 8   */
+#define RCC_HCLK_DIV16                     RCC_CFG_HPRE_16                          /**< HCLK分频因子 = 16  */
+#define RCC_HCLK_DIV32                     RCC_CFG_HPRE_32                          /**< HCLK分频因子 = 32  */
+#define RCC_HCLK_DIV64                     RCC_CFG_HPRE_64                          /**< HCLK分频因子 = 64  */
+#define RCC_HCLK_DIV128                    RCC_CFG_HPRE_128                         /**< HCLK分频因子 = 128 */
+
+/* APB时钟分频参数定义 */
+#define RCC_PCLK_DIV1                      RCC_CFG_PPRE_1                           /**< APB总线时钟不分频        */
+#define RCC_PCLK_DIV2                      RCC_CFG_PPRE_2                           /**< APB总线时钟分频因子 = 2  */
+#define RCC_PCLK_DIV4                      RCC_CFG_PPRE_4                           /**< APB总线时钟分频因子 = 4  */
+#define RCC_PCLK_DIV8                      RCC_CFG_PPRE_8                           /**< APB总线时钟分频因子 = 8  */
+#define RCC_PCLK_DIV16                     RCC_CFG_PPRE_16                          /**< APB总线时钟分频因子 = 16 */
+        
+/* MCO时钟源参数定义 */                                                                            
+#define RCC_MCO_SRC_DISABLE                RCC_CFG_MCOSEL_DISABLE                   /**< MCO输出无效         */
+#define RCC_MCO_SRC_SYSCLK                 RCC_CFG_MCOSEL_SYSCLK                    /**< MCO选择SYSCLK输出   */
+#define RCC_MCO_SRC_RCHDIV6                RCC_CFG_MCOSEL_RCHDIV6                   /**< MCO选择RCHDIV6输出  */
+#define RCC_MCO_SRC_EXTCLK                 RCC_CFG_MCOSEL_EXTCLK                    /**< MCO选择EXTCLK输出   */
+#define RCC_MCO_SRC_RCL                    RCC_CFG_MCOSEL_RCL                       /**< MCO选择RCL输出      */
+
+/* MCO时钟分频参数定义 */
+#define RCC_MCO_DIV1                       RCC_CFG_MCOPRE_DIV1                      /**< MCO不分频         */
+#define RCC_MCO_DIV2                       RCC_CFG_MCOPRE_DIV2                      /**< MCO分频因子 = 2   */
+#define RCC_MCO_DIV4                       RCC_CFG_MCOPRE_DIV4                      /**< MCO分频因子 = 4   */
+#define RCC_MCO_DIV8                       RCC_CFG_MCOPRE_DIV8                      /**< MCO分频因子 = 8   */
+#define RCC_MCO_DIV16                      RCC_CFG_MCOPRE_DIV16                     /**< MCO分频因子 = 16  */
+#define RCC_MCO_DIV32                      RCC_CFG_MCOPRE_DIV32                     /**< MCO分频因子 = 32  */
+#define RCC_MCO_DIV64                      RCC_CFG_MCOPRE_DIV64                     /**< MCO分频因子 = 64  */
+#define RCC_MCO_DIV128                     RCC_CFG_MCOPRE_DIV128                    /**< MCO分频因子 = 128 */
+
+/* RCC中断控制位定义 */
+#define RCC_INTERRUPT_RCL_READY            RCC_IER_RCL_RDYIE                        /**< RCL Ready的中断控制位   */
+#define RCC_INTERRUPT_RCH_READY            RCC_IER_RCH_RDYIE                        /**< RCH Ready的中断控制位   */
+
+/* RCC中断标志位定义 */
+#define RCC_FLAG_RCL_READY                 RCC_ISR_RCL_RDYF                         /**< RCL Ready的中断标志位   */
+#define RCC_FLAG_RCH_READY                 RCC_ISR_RCH_RDYF                         /**< RCH Ready的中断标志位   */
+
+/* RCC清除控制位定义 */
+#define RCC_CLEAR_RCL_READY                RCC_ICR_RCL_RDYC                         /**< RCL Ready的清除控制位   */
+#define RCC_CLEAR_RCH_READY                RCC_ICR_RCH_RDYC                         /**< RCH Ready的清除控制位   */
+
+/* IO端口时钟选择 */
+#define RCC_PERIPH_CLK_GPIOA              RCC_IOPEN_GPIOAEN                        /**< GPIOA 时钟控制位  */
+#define RCC_PERIPH_CLK_GPIOB              RCC_IOPEN_GPIOBEN                        /**< GPIOB 时钟控制位  */
+#define RCC_PERIPH_CLK_GPIOC              RCC_IOPEN_GPIOCEN                        /**< GPIOC 时钟控制位  */
+
+/* IO端口复位选择 */
+#define RCC_PERIPH_RESET_GPIOA            RCC_IOPRST_GPIOA_RST                            /**< GPIOA端口复位控制位  */
+#define RCC_PERIPH_RESET_GPIOB            RCC_IOPRST_GPIOB_RST                            /**< GPIOB端口复位控制位  */
+#define RCC_PERIPH_RESET_GPIOC            RCC_IOPRST_GPIOC_RST                            /**< GPIOC端口复位控制位  */
+
+/* AHB外设时钟选择 */
+#define RCC_PERIPH_CLK_CRC                RCC_AHBEN_CRCEN                                 /**< AHB外设CRC时钟控制位  */
+
+/* AHB外设复位选择 */
+#define RCC_PERIPH_RESET_CRC              RCC_AHBRST_CRC_RST                              /**< AHB外设CRC复位控制位  */
+
+/* APB外设时钟选择 */
+#define RCC_PERIPH_CLK_TIM3               RCC_APBEN1_TIM3EN                               /**< APB外设TIM3时钟控制位    */
+#define RCC_PERIPH_CLK_UART2              RCC_APBEN1_UART2EN                              /**< APB外设UART2时钟控制位   */
+#define RCC_PERIPH_CLK_I2C1               RCC_APBEN1_I2C1EN                               /**< APB外设I2C1时钟控制位    */
+#define RCC_PERIPH_CLK_PMU                RCC_APBEN1_PMUEN                                /**< APB外设PMU时钟控制位     */
+#define RCC_PERIPH_CLK_LPTIM1             RCC_APBEN1_LPTIM1EN                             /**< APB外设LPTIM1时钟控制位  */
+
+#define RCC_PERIPH_CLK_COMP               RCC_APBEN2_COMPEN                               /**< APB外设COMP时钟控制位    */
+#define RCC_PERIPH_CLK_TIM1               RCC_APBEN2_TIM1EN                               /**< APB外设TIM1时钟控制位    */
+#define RCC_PERIPH_CLK_SPI1               RCC_APBEN2_SPI1EN                               /**< APB外设SPI1时钟控制位    */
+#define RCC_PERIPH_CLK_UART1              RCC_APBEN2_UART1EN                              /**< APB外设UART1时钟控制位   */
+#define RCC_PERIPH_CLK_ADC                RCC_APBEN2_ADCEN                                /**< APB外设ADC时钟控制位     */
+#define RCC_PERIPH_CLK_DBG                RCC_APBEN2_DBGEN                                /**< APB外设DBG时钟控制位     */
+
+/* APB外设复位选择 */
+#define RCC_PERIPH_RESET_TIM3             RCC_APBRST1_TIM3_RST                            /**< APB外设TIM3复位控制位    */
+#define RCC_PERIPH_RESET_UART2            RCC_APBRST1_UART2_RST                           /**< APB外设UART2复位控制位   */
+#define RCC_PERIPH_RESET_I2C1             RCC_APBRST1_I2C1_RST                            /**< APB外设I2C1复位控制位    */
+#define RCC_PERIPH_RESET_LPTIM1           RCC_APBRST1_LPTIM1_RST                          /**< APB外设LPTIM1复位控制位  */
+                                                                                                                                                                  
+#define RCC_PERIPH_RESET_COMP             RCC_APBRST2_COMP_RST                            /**< APB外设COMP复位制位      */
+#define RCC_PERIPH_RESET_TIM1             RCC_APBRST2_TIM1_RST                            /**< APB外设TIM1复位控制位    */
+#define RCC_PERIPH_RESET_SPI1             RCC_APBRST2_SPI1_RST                            /**< APB外设SPI1复位控制位    */
+#define RCC_PERIPH_RESET_UART1            RCC_APBRST2_UART1_RST                           /**< APB外设UART复位控制位    */
+#define RCC_PERIPH_RESET_ADC              RCC_APBRST2_ADC_RST                             /**< APB外设ADC复位控制位     */
+#define RCC_PERIPH_RESET_DBG              RCC_APBRST2_DBG_RST                             /**< APB外设DBG复位控制位     */
+
+/* LPTIM1异步时钟源选择 */
+#define RCC_LPTIM1_ASYNC_CLK_SRC_PCLK         RCC_CLKSEL_LPTIM1_SEL_PCLK             /**< PCLK时钟作为LPTIM1时钟      */
+#define RCC_LPTIM1_ASYNC_CLK_SRC_RCL          RCC_CLKSEL_LPTIM1_SEL_RCL              /**< RCL时钟作为LPTIM1时钟       */
+#define RCC_LPTIM1_ASYNC_CLK_SRC_MCO          RCC_CLKSEL_LPTIM1_SEL_MCO              /**< MCO时钟作为LPTIM1时钟       */
+
+/* COMP1异步时钟源选择 */
+#define RCC_COMP1_ASYNC_CLK_SRC_PCLK          RCC_CLKSEL_COMP1_SEL_PCLK             /**< PCLK时钟作为COMP1时钟      */
+#define RCC_COMP1_ASYNC_CLK_SRC_RCL           RCC_CLKSEL_COMP1_SEL_RCL              /**< RCL时钟作为COMP1时钟       */
+
+/* COMP2异步时钟源选择 */
+#define RCC_COMP2_ASYNC_CLK_SRC_PCLK          RCC_CLKSEL_COMP2_SEL_PCLK             /**< PCLK时钟作为COMP2时钟      */
+#define RCC_COMP2_ASYNC_CLK_SRC_RCL           RCC_CLKSEL_COMP2_SEL_RCL              /**< RCL时钟作为COMP2时钟       */
+
+/* 复位标志定义 */
+#define RCC_RESET_FLAG_LOCKUP                   RCC_CSR2_LOCKUP_RSTF                  /**< LOCKUP复位标志           */
+#define RCC_RESET_FLAG_NRST                     RCC_CSR2_NRST_RSTF                    /**< NRST引脚复位标志         */
+#define RCC_RESET_FLAG_PMU                      RCC_CSR2_PMU_RSTF                     /**< POR/PDR、BOR复位标志     */
+#define RCC_RESET_FLAG_SW                       RCC_CSR2_SW_RSTF                      /**< 软件复位标志             */
+#define RCC_RESET_FLAG_IWDG                     RCC_CSR2_IWDG_RSTF                    /**< IWDG复位标志             */
+#define RCC_RESET_FLAG_LPM                      RCC_CSR2_LPM_RSTF                     /**< 低功耗复位标志           */
+#define RCC_RESET_FLAG_ALL                     (0xFFUL<<RCC_CSR2_LOCKUP_RSTF_POS)     /**< 所有复位标志             */
+
+
+/** 
+* @} 
+*/
+
+/*-------------------------------------------functions------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @defgroup RCC_External_Functions RCC External Functions
+* @brief    RCC对外函数
+* @{
+*
+*/
+/************************************************************************************************/
+/** 
+* @brief  使能RCH时钟
+* @note   使能RCH后,软件应等待RCHRDY标志置位后,再使用该时钟
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_rch_enable(void)
+{
+    RCC->CSR1 |= RCC_CSR1_RCHON;
+} 
+
+/** 
+* @brief  关闭RCH时钟
+* @note   如果RCH为系统时钟源,则其不能被停止。此时用户应先将系统时钟源切换为其他时钟,再关闭该时钟源
+* @note   当关闭RCH时,需等待RCHRDY标志清零
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_rch_disable(void)
+{
+    RCC->CSR1 &= (~RCC_CSR1_RCHON);
+}
+
+/** 
+* @brief  获取RCH ready标志
+* @retval uint32_t 返回RCH RDY标志状态
+*             @arg 非0: 表示RCH ready已置位
+*             @arg 0:表示RCH ready未置位
+*/
+__STATIC_INLINE uint32_t std_rcc_get_rch_ready(void) 
+{
+    return(RCC->CSR1 & RCC_CSR1_RCHRDY);
+}        
+
+/** 
+* @brief  设置系统时钟源
+* @param  clocksource 系统时钟源
+*             @arg RCC_SYSCLK_SRC_RCHDIV6
+*             @arg RCC_SYSCLK_SRC_RCHDIV3   
+*             @arg RCC_SYSCLK_SRC_RCH    
+*             @arg RCC_SYSCLK_SRC_RCL     
+*             @arg RCC_SYSCLK_SRC_EXTCLK
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_set_sysclk_source(uint32_t clocksource)
+{
+    MODIFY_REG(RCC->CFG, RCC_CFG_SYSW, clocksource);
+}    
+
+/** 
+* @brief  获取系统时钟源信息
+* @retval uint32_t 系统时钟源
+*             @arg RCC_SYSCLK_SRC_STATUS_RCHDIV6  
+*             @arg RCC_SYSCLK_SRC_STATUS_RCHDIV3   
+*             @arg RCC_SYSCLK_SRC_STATUS_RCH    
+*             @arg RCC_SYSCLK_SRC_STATUS_RCL    
+*             @arg RCC_SYSCLK_SRC_STATUS_EXTCLK 
+*/
+__STATIC_INLINE uint32_t std_rcc_get_sysclk_source(void)
+{
+    return(RCC->CFG & RCC_CFG_SYSWS);
+}    
+
+/** 
+* @brief  设置AHB时钟分频因子
+* @param  ahb_div AHB分频因子
+*             @arg RCC_HCLK_DIV1   
+*             @arg RCC_HCLK_DIV2     
+*             @arg ...   
+*             @arg RCC_HCLK_DIV128
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_set_ahbdiv(uint32_t ahb_div)
+{
+    MODIFY_REG(RCC->CFG, RCC_CFG_HPRE, ahb_div);
+}    
+
+/** 
+* @brief  获取AHB时钟分频因子
+* @retval uint32_t HCLK时钟分频因子
+*             @arg RCC_HCLK_DIV1   
+*             @arg RCC_HCLK_DIV2     
+*             @arg ...   
+*             @arg RCC_HCLK_DIV128
+*/
+__STATIC_INLINE uint32_t std_rcc_get_ahbdiv(void)
+{
+    return(RCC->CFG & RCC_CFG_HPRE);
+} 
+
+/** 
+* @brief  设置APB时钟分频因子
+* @param  apb_div APB分频因子
+*             @arg RCC_PCLK_DIV1   
+*             @arg RCC_PCLK_DIV2     
+*             @arg ...   
+*             @arg RCC_PCLK_DIV16
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_set_apbdiv(uint32_t apb_div)
+{
+    MODIFY_REG(RCC->CFG, RCC_CFG_PPRE, apb_div);
+}    
+
+/** 
+* @brief  获取APB时钟分频因子
+* @retval uint32_t PCLK1时钟分频因子
+*             @arg RCC_PCLK_DIV1   
+*             @arg RCC_PCLK_DIV2     
+*             @arg ...   
+*             @arg RCC_PCLK_DIV16
+*/
+__STATIC_INLINE uint32_t std_rcc_get_apbdiv(void)
+{
+    return(RCC->CFG & RCC_CFG_PPRE);
+} 
+
+/**
+* @brief  配置MCO输出信息
+* @param  mco_source MCO输出源选择
+*             @arg RCC_MCO_SRC_SYSCLK
+*             @arg RCC_MCO_SRC_RCHDIV6
+*             @arg RCC_MCO_SRC_EXTCLK
+*             @arg RCC_MCO_SRC_RCL
+* @param  mco_psc MCO输出分频因子
+*             @arg RCC_MCO_DIV1
+*             @arg RCC_MCO_DIV2
+*             @arg ...
+*             @arg RCC_MCO_DIV128
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_mco_config(uint32_t mco_source, uint32_t mco_psc)
+{
+    MODIFY_REG(RCC->CFG, RCC_CFG_MCOSEL | RCC_CFG_MCOPRE, mco_source | mco_psc);
+}
+
+/** 
+* @brief  使能EXTCLK时钟
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_extclk_enable(void) 
+{
+    RCC->CSR1 |= RCC_CSR1_EXTCLKON;     
+}
+
+/** 
+* @brief  关闭EXTCLK时钟
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_extclk_disable(void)
+{
+    RCC->CSR1 &= (~RCC_CSR1_EXTCLKON);
+} 
+
+/** 
+* @brief  使能RCC中断
+* @param  interrupt 使能RCC中断源的信息
+*             @arg  RCC_INTERRUPT_RCL_READY
+*             @arg  RCC_INTERRUPT_RCH_READY
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_interrupt_enable(uint32_t interrupt)     
+{
+    RCC->IER |= (interrupt);
+}
+
+/** 
+* @brief  关闭RCC中断
+* @param  interrupt 关闭RCC中断源的信息
+*             @arg  RCC_INTERRUPT_RCL_READY
+*             @arg  RCC_INTERRUPT_RCH_READY
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_interrupt_disable(uint32_t interrupt)    
+{
+    RCC->IER &= (~(interrupt));
+} 
+
+/**
+* @brief  获取RCC中断使能状态
+* @param  interrupt RCC中断源信息
+*             @arg  RCC_INTERRUPT_RCL_READY
+*             @arg  RCC_INTERRUPT_RCH_READY
+* @retval uint32_t 返回输入中断标志置位状态
+*             @arg 非0: 表示指定的中断处于使能状态
+*             @arg 0:表示指定的中断处于禁止状态
+*/
+__STATIC_INLINE uint32_t std_rcc_get_interrupt_enable(uint32_t interrupt)    
+{
+    return(RCC->IER & (interrupt));
+}
+
+/**
+* @brief  获取RCC中断标志状态
+* @param  flag RCC中断标志信息
+*             @arg  RCC_FLAG_RCL_READY
+*             @arg  RCC_FLAG_RCH_READY
+* @retval uint32_t 返回输入中断标志置位状态
+*             @arg 非0: 表示指定的中断已置位
+*             @arg 0:表示指定的中断未置位
+*/
+__STATIC_INLINE uint32_t std_rcc_get_flag(uint32_t flag) 
+{
+    return(RCC->ISR & (flag));
+}
+
+/** 
+* @brief  清除RCC标志
+* @param  flags 清除标志位
+*             @arg  RCC_CLEAR_RCL_READY
+*             @arg  RCC_CLEAR_RCH_READY
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_clear_flag(uint32_t flags)   
+{
+    RCC->ICR = (flags);
+}
+
+/** 
+* @brief  使能RCL时钟
+* @note   使能RCL后,软件应等待RCLRDY标志置位后,再使用该时钟
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_rcl_enable(void)
+{
+    RCC->CSR2 |= RCC_CSR2_RCLON;
+}          
+
+/** 
+* @brief  关闭RCL时钟
+* @note   如果RCL为系统时钟源,则其不能被停止。此时用户应先将系统时钟源切换为其他时钟,再关闭该时钟源
+* @note   当关闭RCL时,RCLRDY标志会在RCL关闭后自动清零
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_rcl_disable(void) 
+{
+    RCC->CSR2 &= (~RCC_CSR2_RCLON);
+}        
+
+/** 
+* @brief  获取RCL ready标志
+* @retval uint32_t 返回RCL RDY标志状态
+*             @arg 非0: 表示RCL ready已置位
+*             @arg 0:表示RCL ready未置位
+*/
+__STATIC_INLINE uint32_t std_rcc_get_rcl_ready(void)          
+{
+    return(RCC->CSR2 & RCC_CSR2_RCLRDY);
+}
+
+/** 
+* @brief  获取复位标志
+* @param  reset_flag 指定要获取的复位标志
+*             @arg RCC_RESET_FLAG_LOCKUP
+*             @arg RCC_RESET_FLAG_NRST  
+*             @arg RCC_RESET_FLAG_PMU   
+*             @arg RCC_RESET_FLAG_SW    
+*             @arg RCC_RESET_FLAG_IWDG  
+*             @arg RCC_RESET_FLAG_LPM   
+*             @arg RCC_RESET_FLAG_ALL   
+* @retval uint32_t 返回状态标志
+*             @arg 非0: 表示指定的复位标志已置位
+*             @arg 0:表示指定的复位标志未置位
+*/
+__STATIC_INLINE uint32_t std_rcc_get_reset_flag(uint32_t reset_flag)            
+{
+    return(RCC->CSR2 & (reset_flag));
+} 
+
+/** 
+* @brief  清除复位标志
+* @note   该函数将清除所有复位标志
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_clear_reset_flags(void)           
+{
+    RCC->CSR2 |= RCC_CSR2_RMVF;
+}
+
+/** 
+* @brief  GPIO端口时钟使能
+* @param  gpiox_clock 指定使能的GPIO时钟
+*             @arg RCC_PERIPH_CLK_GPIOA
+*             @arg RCC_PERIPH_CLK_GPIOB
+*             @arg RCC_PERIPH_CLK_GPIOC
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_gpio_clk_enable(uint32_t gpiox_clock)
+{
+    RCC->IOPEN |= gpiox_clock; 
+    
+    /* RCC外围时钟启用后的延迟 */  
+    __NOP(); __NOP(); __NOP(); 
+}
+
+/** 
+* @brief  GPIO端口时钟禁止
+* @param  gpiox_clock 指定禁止的GPIO时钟
+*             @arg RCC_PERIPH_CLK_GPIOA
+*             @arg RCC_PERIPH_CLK_GPIOB
+*             @arg RCC_PERIPH_CLK_GPIOC
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_gpio_clk_disable(uint32_t gpiox_clock) 
+{
+    RCC->IOPEN &= (~(gpiox_clock)); 
+    
+    /* RCC外围时钟启用后的延迟 */  
+    __NOP(); __NOP(); __NOP(); 
+}
+
+/** 
+* @brief  GPIO端口复位
+* @param  gpiox_rst 指定复位的GPIO端口
+*             @arg RCC_PERIPH_RESET_GPIOA
+*             @arg RCC_PERIPH_RESET_GPIOB
+*             @arg RCC_PERIPH_RESET_GPIOC
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_gpio_reset(uint32_t gpiox_rst)
+{
+    RCC->IOPRST |= (gpiox_rst);
+    RCC->IOPRST &= (~(gpiox_rst));
+}         
+
+/** 
+* @brief  AHB外设时钟使能
+* @param  periph_clock 指定使能的AHB外设时钟
+*             @arg RCC_PERIPH_CLK_CRC  
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_ahb_clk_enable(uint32_t periph_clock)
+{
+    RCC->AHBEN |= periph_clock;
+    
+    /* RCC外围时钟启用后的延迟 */    
+    __NOP(); __NOP(); __NOP(); 
+}   
+
+/** 
+* @brief  AHB外设时钟禁止
+* @param  periph_clock 指定禁止的AHB外设时钟
+*             @arg RCC_PERIPH_CLK_CRC  
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_ahb_clk_disable(uint32_t periph_clock)            
+{
+    RCC->AHBEN &= (~(periph_clock));
+}
+
+/** 
+* @brief  AHB外设复位
+* @param  periph_rst 指定复位的AHB外设
+*             @arg RCC_PERIPH_RESET_CRC
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_ahb_reset(uint32_t periph_rst)
+{
+    RCC->AHBRST |= (periph_rst);
+    RCC->AHBRST &= (~(periph_rst));
+}       
+
+/** 
+* @brief  APB外设1时钟使能
+* @param  periph_clock 指定使能的APB外设1时钟
+*             @arg RCC_PERIPH_CLK_TIM3   
+*             @arg RCC_PERIPH_CLK_UART2 
+*             @arg RCC_PERIPH_CLK_I2C1   
+*             @arg RCC_PERIPH_CLK_PMU       
+*             @arg RCC_PERIPH_CLK_LPTIM1 
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_apb1_clk_enable(uint32_t periph_clock)
+{
+    RCC->APBEN1 |= periph_clock;
+    
+    /* RCC外围时钟启用后的延迟 */    
+    __NOP(); __NOP(); __NOP(); 
+}
+
+/** 
+* @brief  APB外设1时钟禁止
+* @param  periph_clock 指定禁止的APB外设1时钟
+*             @arg RCC_PERIPH_CLK_TIM3      
+*             @arg RCC_PERIPH_CLK_UART2 
+*             @arg RCC_PERIPH_CLK_I2C1   
+*             @arg RCC_PERIPH_CLK_PMU      
+*             @arg RCC_PERIPH_CLK_LPTIM1 
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_apb1_clk_disable(uint32_t periph_clock)            
+{
+    RCC->APBEN1 &= (~(periph_clock));
+}
+
+/** 
+* @brief  APB外设1复位
+* @param  periph_rst 指定复位的APB外设1
+*             @arg RCC_PERIPH_RESET_TIM3     
+*             @arg RCC_PERIPH_RESET_UART2 
+*             @arg RCC_PERIPH_RESET_I2C1   
+*             @arg RCC_PERIPH_RESET_LPTIM1 
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_apb1_reset(uint32_t periph_rst)
+{
+    RCC->APBRST1 |= (periph_rst);
+    RCC->APBRST1 &= (~(periph_rst));
+}       
+
+/** 
+* @brief  APB外设2时钟使能
+* @param  periph_clock 指定使能的APB外设2时钟
+*             @arg RCC_PERIPH_CLK_COMP
+*             @arg RCC_PERIPH_CLK_TIM1   
+*             @arg RCC_PERIPH_CLK_SPI1   
+*             @arg RCC_PERIPH_CLK_UART1 
+*             @arg RCC_PERIPH_CLK_ADC    
+*             @arg RCC_PERIPH_CLK_DBG
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_apb2_clk_enable(uint32_t periph_clock)
+{
+    RCC->APBEN2 |= periph_clock;
+    
+    /* RCC外围时钟启用后的延迟 */    
+    __NOP(); __NOP(); __NOP(); 
+}
+
+/** 
+* @brief  APB外设2时钟禁止
+* @param  periph_clock 指定禁止的APB外设2时钟
+*             @arg RCC_PERIPH_CLK_COMP
+*             @arg RCC_PERIPH_CLK_TIM1   
+*             @arg RCC_PERIPH_CLK_SPI1   
+*             @arg RCC_PERIPH_CLK_UART1 
+*             @arg RCC_PERIPH_CLK_ADC    
+*             @arg RCC_PERIPH_CLK_DBG
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_apb2_clk_disable(uint32_t periph_clock)            
+{
+    RCC->APBEN2 &= (~(periph_clock));
+}
+
+/** 
+* @brief  APB外设2复位
+* @param  periph_rst 指定复位的APB外设2
+*             @arg RCC_PERIPH_RESET_COMP   
+*             @arg RCC_PERIPH_RESET_TIM1   
+*             @arg RCC_PERIPH_RESET_SPI1   
+*             @arg RCC_PERIPH_RESET_UART1 
+*             @arg RCC_PERIPH_RESET_ADC    
+*             @arg RCC_PERIPH_RESET_DBG  
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_apb2_reset(uint32_t periph_rst)
+{
+    RCC->APBRST2 |= (periph_rst);
+    RCC->APBRST2 &= (~(periph_rst));
+}       
+
+/** 
+* @brief  使能LOCKUP复位
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_lockup_reset_enable(void)
+{
+    RCC->CSR2 |= RCC_CSR2_LOCKUP_RSTEN;
+}
+
+/** 
+* @brief  禁止LOCKUP复位
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_lockup_reset_disable(void)
+{
+    RCC->CSR2 &= (~RCC_CSR2_LOCKUP_RSTEN);
+}
+
+/** 
+* @brief  LPTIM1时钟源选择
+* @param  lptim1clk_select LPTIM1时钟源
+*             @arg RCC_LPTIM1_ASYNC_CLK_SRC_PCLK
+*             @arg RCC_LPTIM1_ASYNC_CLK_SRC_RCL
+*             @arg RCC_LPTIM1_ASYNC_CLK_SRC_MCO
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_set_lptim1clk_source(uint32_t lptim1clk_select)
+{
+    MODIFY_REG(RCC->CLKSEL, RCC_CLKSEL_LPTIM1_SEL, (lptim1clk_select));
+}       
+
+/** 
+* @brief  获取LPTIM1时钟源
+* @retval uint32_t 返回LPTIM1时钟源信息
+*             @arg RCC_LPTIM1_ASYNC_CLK_SRC_PCLK1
+*             @arg RCC_LPTIM1_ASYNC_CLK_SRC_RCL
+*             @arg RCC_LPTIM1_ASYNC_CLK_SRC_MCO
+*/
+__STATIC_INLINE uint32_t std_rcc_get_lptim1clk_source(void)
+{
+    return(RCC->CLKSEL & RCC_CLKSEL_LPTIM1_SEL);
+} 
+
+/** 
+* @brief  COMP1时钟源选择
+* @param  comp1clk_select COMP1时钟源
+*             @arg RCC_COMP1_ASYNC_CLK_SRC_PCLK
+*             @arg RCC_COMP1_ASYNC_CLK_SRC_RCL
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_set_comp1clk_source(uint32_t comp1clk_select)
+{
+    MODIFY_REG(RCC->CLKSEL, RCC_CLKSEL_COMP1_SEL, (comp1clk_select));
+}       
+
+/** 
+* @brief  获取COMP1时钟源
+* @retval uint32_t 返回COMP1时钟源信息
+*             @arg RCC_COMP1_ASYNC_CLK_SRC_PCLK
+*             @arg RCC_COMP1_ASYNC_CLK_SRC_RCL
+*/
+__STATIC_INLINE uint32_t std_rcc_get_comp1clk_source(void)
+{
+    return(RCC->CLKSEL & RCC_CLKSEL_COMP1_SEL);
+} 
+
+/** 
+* @brief  COMP2时钟源选择
+* @param  comp2clk_select COMP2时钟源
+*             @arg RCC_COMP2_ASYNC_CLK_SRC_PCLK
+*             @arg RCC_COMP2_ASYNC_CLK_SRC_RCL
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_set_comp2clk_source(uint32_t comp2clk_select)
+{
+    MODIFY_REG(RCC->CLKSEL, RCC_CLKSEL_COMP2_SEL, (comp2clk_select));
+}       
+
+/** 
+* @brief  获取COMP2时钟源
+* @retval uint32_t 返回COMP2时钟源信息
+*             @arg RCC_COMP2_ASYNC_CLK_SRC_PCLK
+*             @arg RCC_COMP2_ASYNC_CLK_SRC_RCL
+*/
+__STATIC_INLINE uint32_t std_rcc_get_comp2clk_source(void)
+{
+    return(RCC->CLKSEL & RCC_CLKSEL_COMP2_SEL);
+} 
+
+/** 
+* @brief  写RCL校准值
+* @param  cal_value RCL校准值
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_write_rcl_calibration(uint32_t cal_value)
+{
+    RCC->RCLCAL = cal_value;
+}
+
+/** 
+* @brief  读取RCL校准值
+* @retval uint32_t RCL校准值
+*/
+__STATIC_INLINE uint32_t std_rcc_read_rcl_calibration(void)
+{
+    return(RCC->RCLCAL);
+}
+
+/** 
+* @brief  写RCH时钟粗调值
+* @param  cal_value RCH时钟粗调值
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_write_rch_coarse_calibration(uint32_t cal_value)
+{
+    MODIFY_REG(RCC->RCHCAL, RCC_RCHCAL_RCH_CAL_COARSE, cal_value << RCC_RCHCAL_RCH_CAL_COARSE_POS);
+}
+
+/** 
+* @brief  读取RCH时钟粗调值
+* @retval uint32_t RCH时钟粗调值
+*/
+__STATIC_INLINE uint32_t std_rcc_read_rch_coarse_calibration(void)
+{
+    return((RCC->RCHCAL & RCC_RCHCAL_RCH_CAL_COARSE) >> RCC_RCHCAL_RCH_CAL_COARSE_POS);
+}
+
+/** 
+* @brief  写RCH时钟微调值
+* @param  trim_value  RCH时钟微调值
+* @retval 无
+*/
+__STATIC_INLINE void std_rcc_write_rch_fine_calibration(uint32_t trim_value)
+{
+    MODIFY_REG(RCC->RCHCAL, RCC_RCHCAL_RCH_CAL_FINE, trim_value);
+}
+
+/** 
+* @brief  读取RCH时钟微调值
+* @retval uint32_t RCH时钟微调值
+*/
+__STATIC_INLINE uint32_t std_rcc_read_rch_fine_calibration(void)
+{
+    return(RCC->RCHCAL & RCC_RCHCAL_RCH_CAL_FINE);
+}
+
+
+/* 获取时钟频率函数 */
+uint32_t std_rcc_get_sysclkfreq(void);
+uint32_t std_rcc_get_hclkfreq(void);
+uint32_t std_rcc_get_pclkfreq(void); 
+
+
+/** 
+* @} 
+*/
+
+
+#ifdef __cplusplus
+}
+#endif
+
+/**
+* @} 
+*/  
+
+/**
+* @}
+*/
+
+#endif /* CIU32F003_STD_RCC_H */

+ 442 - 0
CIU32F003_LIB/Include/ciu32f003_std_spi(1).h

@@ -0,0 +1,442 @@
+/************************************************************************************************/
+/**
+* @file               ciu32f003_std_spi.h
+* @author             MCU Ecosystem Development Team
+* @brief              SPI STD库驱动头文件。
+*                     提供SPI相关的STD库操作函数声明、数据类型以及常量的定义。
+*
+*
+**************************************************************************************************
+* @attention
+* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
+*
+**************************************************************************************************
+*/
+
+/* 避免头文件重复引用 */
+#ifndef CIU32F003_STD_SPI_H
+#define CIU32F003_STD_SPI_H
+
+/************************************************************************************************/
+/** 
+* @addtogroup CIU32F003_STD_Driver
+* @{
+*/
+
+/**
+* @defgroup SPI SPI
+* @brief 串行外设接口的STD库驱动 
+* @{
+*/
+/************************************************************************************************/
+
+
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/*------------------------------------------includes--------------------------------------------*/
+#include "ciu32f003_std_common.h"
+
+
+/*-----------------------------------------type define------------------------------------------*/
+/************************************************************************************************/
+/**
+* @defgroup SPI_Types SPI Types
+* @brief  SPI数据类型定义
+* @{
+*
+*/
+/************************************************************************************************/
+
+/**
+* @brief  SPI初始化配置结构体定义
+*/
+typedef struct
+{
+    uint32_t mode;                     /**< SPI工作模式
+                                                @arg SPI_MODE_SLAVE
+                                                @arg SPI_MODE_MASTER                            */
+
+    uint32_t baud_rate_prescaler;      /**< SPI速率配置参数                                    
+                                                @arg  SPI_BAUD_PCLKDIV_2          
+                                                @arg  SPI_BAUD_PCLKDIV_4 ...      
+                                                @note 主机输出时钟设置,从机不需要设置          */
+
+    uint32_t clk_polarity;             /**< SPI时钟极性                                
+                                                @arg SPI_POLARITY_LOW                  
+                                                @arg SPI_POLARITY_HIGH                          */
+
+    uint32_t clk_phase;                /**< SPI时钟相位                                
+                                                @arg SPI_PHASE_1EDGE                   
+                                                @arg SPI_PHASE_2EDGE                            */
+    
+    uint32_t bitorder;                 /**< SPI数据大小端
+                                                @arg SPI_FIRSTBIT_MSB
+                                                @arg SPI_FIRSTBIT_LSB                           */
+}std_spi_init_t; 
+
+
+/** 
+* @} 
+*/
+
+
+/*--------------------------------------------define--------------------------------------------*/
+/************************************************************************************************/
+/** 
+* @defgroup SPI_Constants SPI Constants
+* @brief SPI常量定义及宏定义
+* @{
+*/
+/************************************************************************************************/
+/* SPI 工作模式 */
+#define SPI_MODE_SLAVE                  (0x00000000U)                      /**< SPI从机模式     */
+#define SPI_MODE_MASTER                 SPI_CR1_MSTR                       /**< SPI主机模式     */
+
+/* SPI 速率配置参数 */    
+#define SPI_BAUD_PCLKDIV_2              SPI_CR1_BR_PCLK_DIV_2              /**< SPI速率为fPLCK/2   */
+#define SPI_BAUD_PCLKDIV_4              SPI_CR1_BR_PCLK_DIV_4              /**< SPI速率为fPLCK/4   */
+#define SPI_BAUD_PCLKDIV_8              SPI_CR1_BR_PCLK_DIV_8              /**< SPI速率为fPLCK/8   */
+#define SPI_BAUD_PCLKDIV_16             SPI_CR1_BR_PCLK_DIV_16             /**< SPI速率为fPLCK/16  */
+#define SPI_BAUD_PCLKDIV_32             SPI_CR1_BR_PCLK_DIV_32             /**< SPI速率为fPLCK/32  */
+#define SPI_BAUD_PCLKDIV_64             SPI_CR1_BR_PCLK_DIV_64             /**< SPI速率为fPLCK/64  */
+#define SPI_BAUD_PCLKDIV_128            SPI_CR1_BR_PCLK_DIV_128            /**< SPI速率为fPLCK/128 */
+
+/* SPI 时钟极性 */
+#define SPI_POLARITY_LOW                (0x00000000U)                      /**< SPI时钟空闲为低 */
+#define SPI_POLARITY_HIGH               SPI_CR1_CPOL                       /**< SPI时钟空闲为高 */
+
+/* SPI 时钟相位 */
+#define SPI_PHASE_1EDGE                 (0x00000000U)                      /**< SPI数据采样在第一个时钟沿 */
+#define SPI_PHASE_2EDGE                 SPI_CR1_CPHA                       /**< SPI数据采样在第二个时钟沿 */
+
+/* SPI 数据大小端 */
+#define SPI_FIRSTBIT_MSB                (0x00000000U)                      /**< SPI数据收发为高位优先 */
+#define SPI_FIRSTBIT_LSB                SPI_CR1_LSBFIRST                   /**< SPI数据收发为低位优先 */
+
+/* SPI NSS输出状态*/
+#define SPI_NSS_OUTPUT_LOW              (0x00000000U)                      /**< SPI片选信号输出低电平 */
+#define SPI_NSS_OUTPUT_HIGH             SPI_CR2_NSSO                       /**< SPI片选信号输出高电平 */
+
+/* SPI 中断事件 */
+#define SPI_INTERRUPT_TXFE              SPI_CR1_TXFEIE                     /**< SPI发送数据寄存器为空中断使能 */
+#define SPI_INTERRUPT_RXFNE             SPI_CR1_RXFNEIE                    /**< SPI接收数据寄存器非空中断使能 */
+#define SPI_INTERRUPT_ERR               SPI_CR1_ERRIE                      /**< SPI错误中断使能               */
+
+/* SPI 硬件状态信息 */
+#define SPI_FLAG_TXFE                   SPI_ISR_TXFE                       /**< SPI发送数据寄存器空标志   */
+#define SPI_FLAG_RXFNE                  SPI_ISR_RXFNE                      /**< SPI接收数据寄存器非空标志 */
+#define SPI_FLAG_BUSY                   SPI_ISR_BUSY                       /**< SPI总线传输状态标志       */
+#define SPI_FLAG_OVR                    SPI_ISR_OVR                        /**< SPI接收上溢出标志         */
+#define SPI_FLAG_MMF                    SPI_ISR_MMF                        /**< SPI主机模式冲突标志       */
+
+/* SPI 状态清除信息 */
+#define SPI_CLEAR_FLAG_OVR              SPI_ICR_OVRCF                      /**< SPI主机上溢标志清除     */
+#define SPI_CLEAR_FLAG_MMF              SPI_ICR_MMFCF                      /**< SPI主机模式冲突标志清除 */
+
+/** 
+* @} 
+*/
+
+
+/*-------------------------------------------functions------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @defgroup SPI_External_Functions SPI External Functions
+* @brief    SPI对外函数
+* @{
+*
+*/
+/************************************************************************************************/
+/** 
+* @brief  使能SPI
+* @retval 无
+*/
+__STATIC_INLINE void std_spi_enable(void)
+{
+    SPI1->CR1 |= SPI_CR1_SPE;
+}
+
+
+/** 
+* @brief  禁止SPI
+* @retval 无
+*/
+__STATIC_INLINE void std_spi_disable(void)
+{
+    SPI1->CR1 &= (~SPI_CR1_SPE);
+}
+
+
+/** 
+* @brief  设置SPI主从模式
+* @param  mode SPI主从模式
+*             @arg SPI_MODE_SLAVE
+*             @arg SPI_MODE_MASTER   
+* @retval 无
+*/
+__STATIC_INLINE void std_spi_set_mode(uint32_t mode)
+{
+    MODIFY_REG(SPI1->CR1, SPI_CR1_MSTR, mode);
+}
+
+
+/** 
+* @brief  获取SPI主从模式
+* @retval uint32_t SPI主从模式
+*             @arg SPI_MODE_SLAVE
+*             @arg SPI_MODE_MASTER  
+*/
+__STATIC_INLINE uint32_t std_spi_get_mode(void)
+{
+    return (SPI1->CR1 & SPI_CR1_MSTR);
+}
+
+
+/** 
+* @brief  设置SPI波特率
+* @param  baud_rate SPI波特率
+*             @arg  SPI_BAUD_PCLKDIV_2      
+*             @arg  SPI_BAUD_PCLKDIV_4
+*             @arg  ...  
+*             @arg  SPI_BAUD_PCLKDIV_128
+* @note  主机输出时钟设置,从机不需要设置
+* @retval 无
+*/
+__STATIC_INLINE void std_spi_set_baud_rate(uint32_t baud_rate)
+{
+    MODIFY_REG(SPI1->CR1, SPI_CR1_BR, baud_rate);
+}
+
+
+/** 
+* @brief  获取SPI波特率
+* @retval uint32_t  SPI波特率
+*             @arg  SPI_BAUD_PCLKDIV_2
+*             @arg  SPI_BAUD_PCLKDIV_4
+*             @arg  ...  
+*             @arg  SPI_BAUD_PCLKDIV_128
+*/
+__STATIC_INLINE uint32_t std_spi_get_baud_rate(void)
+{
+    return (SPI1->CR1 & SPI_CR1_BR);
+}
+
+
+/** 
+* @brief  设置SPI时钟极性
+* @param  polarity SPI时钟极性
+*             @arg SPI_POLARITY_LOW
+*             @arg SPI_POLARITY_HIGH
+* @retval 无
+*/
+__STATIC_INLINE void std_spi_set_polarity(uint32_t polarity)
+{
+    MODIFY_REG(SPI1->CR1, SPI_CR1_CPOL, polarity);
+}
+
+
+/**
+* @brief  设置SPI时钟相位 
+* @param  phase SPI时钟相位
+*             @arg SPI_PHASE_1EDGE 
+*             @arg SPI_PHASE_2EDGE 
+* @retval 无
+*/
+__STATIC_INLINE void std_spi_set_phase(uint32_t phase)
+{
+    MODIFY_REG(SPI1->CR1, SPI_CR1_CPHA, phase);
+}
+
+
+/**
+* @brief  设置SPI数据大小端
+* @param  first_bit SPI数据大小端
+*             @arg SPI_FIRSTBIT_MSB 
+*             @arg SPI_FIRSTBIT_LSB 
+* @note   仅在禁止SPI(SPE为0)时才可对此位执行写操作
+* @retval 无
+*/
+__STATIC_INLINE void std_spi_set_first_bit(uint32_t first_bit)
+{
+    MODIFY_REG(SPI1->CR1, SPI_CR1_LSBFIRST, first_bit);
+}
+
+
+/**
+* @brief  使能NSS软片选
+* @note   仅在从机模式下设置有效
+* @retval 无
+*/
+__STATIC_INLINE void std_spi_nss_soft_chip_select_enable(void)
+{
+    SPI1->CR1 |= SPI_CR1_SSM;
+}
+
+
+/**
+* @brief  禁止NSS软片选
+* @note   仅在从机模式下设置有效
+* @retval 无
+*/
+__STATIC_INLINE void std_spi_nss_soft_chip_select_disable(void)
+{
+    SPI1->CR1 &= (~SPI_CR1_SSM);
+}
+
+
+/**
+* @brief  使能SPI NSS输出
+* @note   仅在主机模式下设置有效
+* @retval 无
+*/
+__STATIC_INLINE void std_spi_nss_output_enable(void)
+{
+    SPI1->CR1 |= SPI_CR1_NSSOE;
+}
+
+
+/**
+* @brief  禁止SPI NSS输出
+* @retval 无
+*/
+__STATIC_INLINE void std_spi_nss_output_disable(void)
+{
+    SPI1->CR1 &= (~SPI_CR1_NSSOE);
+}
+
+
+/**
+* @brief  使能SPI中断
+* @param  spi_interrupt SPI中断信息
+*             @arg SPI_INTERRUPT_TXFE     
+*             @arg SPI_INTERRUPT_RXFNE    
+*             @arg SPI_INTERRUPT_ERR      
+* @retval 无
+*/
+__STATIC_INLINE void std_spi_interrupt_enable(uint32_t spi_interrupt)
+{
+    SPI1->CR1 |= spi_interrupt;
+}
+
+
+/**
+* @brief  禁止SPI中断
+* @param  spi_interrupt SPI中断信息
+*             @arg SPI_INTERRUPT_TXFE     
+*             @arg SPI_INTERRUPT_RXFNE    
+*             @arg SPI_INTERRUPT_ERR      
+* @retval 无
+*/
+__STATIC_INLINE void std_spi_interrupt_disable(uint32_t spi_interrupt)
+{
+    SPI1->CR1 &= (~spi_interrupt);
+}
+
+
+/**
+* @brief  获取SPI中断使能状态
+* @param  spi_interrupt SPI中断信息
+*             @arg SPI_INTERRUPT_TXFE     
+*             @arg SPI_INTERRUPT_RXFNE    
+*             @arg SPI_INTERRUPT_ERR      
+* @retval uint32_t 中断使能状态
+*             @arg 非0: 使能
+*             @arg 0: 禁止
+*/
+__STATIC_INLINE uint32_t std_spi_get_interrupt_enable(uint32_t spi_interrupt)
+{
+    return (SPI1->CR1 & (spi_interrupt));
+}
+
+
+/**
+* @brief  设置SPI NSS引脚电平
+* @param  nss_output NSS输出电平
+*             @arg SPI_NSS_OUTPUT_LOW   
+*             @arg SPI_NSS_OUTPUT_HIGH  
+* @note   仅在主机模式下且SPE使能的情况下设置有效
+* @retval 无
+*/
+__STATIC_INLINE void std_spi_set_nss_output(uint32_t nss_output)
+{
+    SPI1->CR2 = nss_output;
+}
+
+
+/**
+* @brief  获取SPI状态标志位
+* @param  flag SPI状态标志位
+*             @arg SPI_FLAG_TXFE 
+*             @arg SPI_FLAG_RXFNE
+*             @arg SPI_FLAG_BUSY 
+*             @arg SPI_FLAG_OVR  
+*             @arg SPI_FLAG_MMF  
+* @retval uint32_t SPI标志位状态
+*             @arg 非0: 标志位置位
+*             @arg 0:   标志位清除
+*/
+__STATIC_INLINE uint32_t std_spi_get_flag(uint32_t flag)
+{
+    return (SPI1->ISR & (flag));
+}
+
+
+/**
+* @brief  SPI标志清零
+* @param  flag SPI标志
+*             @arg SPI_CLEAR_FLAG_OVR
+*             @arg SPI_CLEAR_FLAG_MMF
+* @retval 无
+*/
+__STATIC_INLINE void std_spi_clear_flag(uint32_t flag)
+{
+    SPI1->ICR = (flag);
+}
+
+
+/**
+* @brief  SPI读数据
+* @retval uint8_t: 返回读取的SPI数据寄存器读取的数据
+*/
+__STATIC_INLINE uint8_t std_spi_read_data(void)
+{
+    return (SPI1->DR);
+}
+
+/**
+* @brief  SPI写数据
+* @param  send_data: 写入SPI数据寄存器的数据
+* @retval 无
+*/
+__STATIC_INLINE void std_spi_write_data(uint8_t send_data)
+{
+    SPI1->DR = send_data;
+}
+
+
+void std_spi_init(std_spi_init_t *spi_init_param);
+void std_spi_deinit(void);
+void std_spi_struct_init(std_spi_init_t *spi_init_struct);
+
+
+/** 
+* @} 
+*/
+
+#ifdef __cplusplus
+}
+#endif
+
+/** 
+* @} 
+*/
+
+/** 
+* @} 
+*/
+
+#endif /* CIU32F003_STD_SPI_H */

+ 442 - 0
CIU32F003_LIB/Include/ciu32f003_std_spi(2).h

@@ -0,0 +1,442 @@
+/************************************************************************************************/
+/**
+* @file               ciu32f003_std_spi.h
+* @author             MCU Ecosystem Development Team
+* @brief              SPI STD库驱动头文件。
+*                     提供SPI相关的STD库操作函数声明、数据类型以及常量的定义。
+*
+*
+**************************************************************************************************
+* @attention
+* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
+*
+**************************************************************************************************
+*/
+
+/* 避免头文件重复引用 */
+#ifndef CIU32F003_STD_SPI_H
+#define CIU32F003_STD_SPI_H
+
+/************************************************************************************************/
+/** 
+* @addtogroup CIU32F003_STD_Driver
+* @{
+*/
+
+/**
+* @defgroup SPI SPI
+* @brief 串行外设接口的STD库驱动 
+* @{
+*/
+/************************************************************************************************/
+
+
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/*------------------------------------------includes--------------------------------------------*/
+#include "ciu32f003_std_common.h"
+
+
+/*-----------------------------------------type define------------------------------------------*/
+/************************************************************************************************/
+/**
+* @defgroup SPI_Types SPI Types
+* @brief  SPI数据类型定义
+* @{
+*
+*/
+/************************************************************************************************/
+
+/**
+* @brief  SPI初始化配置结构体定义
+*/
+typedef struct
+{
+    uint32_t mode;                     /**< SPI工作模式
+                                                @arg SPI_MODE_SLAVE
+                                                @arg SPI_MODE_MASTER                            */
+
+    uint32_t baud_rate_prescaler;      /**< SPI速率配置参数                                    
+                                                @arg  SPI_BAUD_PCLKDIV_2          
+                                                @arg  SPI_BAUD_PCLKDIV_4 ...      
+                                                @note 主机输出时钟设置,从机不需要设置          */
+
+    uint32_t clk_polarity;             /**< SPI时钟极性                                
+                                                @arg SPI_POLARITY_LOW                  
+                                                @arg SPI_POLARITY_HIGH                          */
+
+    uint32_t clk_phase;                /**< SPI时钟相位                                
+                                                @arg SPI_PHASE_1EDGE                   
+                                                @arg SPI_PHASE_2EDGE                            */
+    
+    uint32_t bitorder;                 /**< SPI数据大小端
+                                                @arg SPI_FIRSTBIT_MSB
+                                                @arg SPI_FIRSTBIT_LSB                           */
+}std_spi_init_t; 
+
+
+/** 
+* @} 
+*/
+
+
+/*--------------------------------------------define--------------------------------------------*/
+/************************************************************************************************/
+/** 
+* @defgroup SPI_Constants SPI Constants
+* @brief SPI常量定义及宏定义
+* @{
+*/
+/************************************************************************************************/
+/* SPI 工作模式 */
+#define SPI_MODE_SLAVE                  (0x00000000U)                      /**< SPI从机模式     */
+#define SPI_MODE_MASTER                 SPI_CR1_MSTR                       /**< SPI主机模式     */
+
+/* SPI 速率配置参数 */    
+#define SPI_BAUD_PCLKDIV_2              SPI_CR1_BR_PCLK_DIV_2              /**< SPI速率为fPLCK/2   */
+#define SPI_BAUD_PCLKDIV_4              SPI_CR1_BR_PCLK_DIV_4              /**< SPI速率为fPLCK/4   */
+#define SPI_BAUD_PCLKDIV_8              SPI_CR1_BR_PCLK_DIV_8              /**< SPI速率为fPLCK/8   */
+#define SPI_BAUD_PCLKDIV_16             SPI_CR1_BR_PCLK_DIV_16             /**< SPI速率为fPLCK/16  */
+#define SPI_BAUD_PCLKDIV_32             SPI_CR1_BR_PCLK_DIV_32             /**< SPI速率为fPLCK/32  */
+#define SPI_BAUD_PCLKDIV_64             SPI_CR1_BR_PCLK_DIV_64             /**< SPI速率为fPLCK/64  */
+#define SPI_BAUD_PCLKDIV_128            SPI_CR1_BR_PCLK_DIV_128            /**< SPI速率为fPLCK/128 */
+
+/* SPI 时钟极性 */
+#define SPI_POLARITY_LOW                (0x00000000U)                      /**< SPI时钟空闲为低 */
+#define SPI_POLARITY_HIGH               SPI_CR1_CPOL                       /**< SPI时钟空闲为高 */
+
+/* SPI 时钟相位 */
+#define SPI_PHASE_1EDGE                 (0x00000000U)                      /**< SPI数据采样在第一个时钟沿 */
+#define SPI_PHASE_2EDGE                 SPI_CR1_CPHA                       /**< SPI数据采样在第二个时钟沿 */
+
+/* SPI 数据大小端 */
+#define SPI_FIRSTBIT_MSB                (0x00000000U)                      /**< SPI数据收发为高位优先 */
+#define SPI_FIRSTBIT_LSB                SPI_CR1_LSBFIRST                   /**< SPI数据收发为低位优先 */
+
+/* SPI NSS输出状态*/
+#define SPI_NSS_OUTPUT_LOW              (0x00000000U)                      /**< SPI片选信号输出低电平 */
+#define SPI_NSS_OUTPUT_HIGH             SPI_CR2_NSSO                       /**< SPI片选信号输出高电平 */
+
+/* SPI 中断事件 */
+#define SPI_INTERRUPT_TXFE              SPI_CR1_TXFEIE                     /**< SPI发送数据寄存器为空中断使能 */
+#define SPI_INTERRUPT_RXFNE             SPI_CR1_RXFNEIE                    /**< SPI接收数据寄存器非空中断使能 */
+#define SPI_INTERRUPT_ERR               SPI_CR1_ERRIE                      /**< SPI错误中断使能               */
+
+/* SPI 硬件状态信息 */
+#define SPI_FLAG_TXFE                   SPI_ISR_TXFE                       /**< SPI发送数据寄存器空标志   */
+#define SPI_FLAG_RXFNE                  SPI_ISR_RXFNE                      /**< SPI接收数据寄存器非空标志 */
+#define SPI_FLAG_BUSY                   SPI_ISR_BUSY                       /**< SPI总线传输状态标志       */
+#define SPI_FLAG_OVR                    SPI_ISR_OVR                        /**< SPI接收上溢出标志         */
+#define SPI_FLAG_MMF                    SPI_ISR_MMF                        /**< SPI主机模式冲突标志       */
+
+/* SPI 状态清除信息 */
+#define SPI_CLEAR_FLAG_OVR              SPI_ICR_OVRCF                      /**< SPI主机上溢标志清除     */
+#define SPI_CLEAR_FLAG_MMF              SPI_ICR_MMFCF                      /**< SPI主机模式冲突标志清除 */
+
+/** 
+* @} 
+*/
+
+
+/*-------------------------------------------functions------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @defgroup SPI_External_Functions SPI External Functions
+* @brief    SPI对外函数
+* @{
+*
+*/
+/************************************************************************************************/
+/** 
+* @brief  使能SPI
+* @retval 无
+*/
+__STATIC_INLINE void std_spi_enable(void)
+{
+    SPI1->CR1 |= SPI_CR1_SPE;
+}
+
+
+/** 
+* @brief  禁止SPI
+* @retval 无
+*/
+__STATIC_INLINE void std_spi_disable(void)
+{
+    SPI1->CR1 &= (~SPI_CR1_SPE);
+}
+
+
+/** 
+* @brief  设置SPI主从模式
+* @param  mode SPI主从模式
+*             @arg SPI_MODE_SLAVE
+*             @arg SPI_MODE_MASTER   
+* @retval 无
+*/
+__STATIC_INLINE void std_spi_set_mode(uint32_t mode)
+{
+    MODIFY_REG(SPI1->CR1, SPI_CR1_MSTR, mode);
+}
+
+
+/** 
+* @brief  获取SPI主从模式
+* @retval uint32_t SPI主从模式
+*             @arg SPI_MODE_SLAVE
+*             @arg SPI_MODE_MASTER  
+*/
+__STATIC_INLINE uint32_t std_spi_get_mode(void)
+{
+    return (SPI1->CR1 & SPI_CR1_MSTR);
+}
+
+
+/** 
+* @brief  设置SPI波特率
+* @param  baud_rate SPI波特率
+*             @arg  SPI_BAUD_PCLKDIV_2      
+*             @arg  SPI_BAUD_PCLKDIV_4
+*             @arg  ...  
+*             @arg  SPI_BAUD_PCLKDIV_128
+* @note  主机输出时钟设置,从机不需要设置
+* @retval 无
+*/
+__STATIC_INLINE void std_spi_set_baud_rate(uint32_t baud_rate)
+{
+    MODIFY_REG(SPI1->CR1, SPI_CR1_BR, baud_rate);
+}
+
+
+/** 
+* @brief  获取SPI波特率
+* @retval uint32_t  SPI波特率
+*             @arg  SPI_BAUD_PCLKDIV_2
+*             @arg  SPI_BAUD_PCLKDIV_4
+*             @arg  ...  
+*             @arg  SPI_BAUD_PCLKDIV_128
+*/
+__STATIC_INLINE uint32_t std_spi_get_baud_rate(void)
+{
+    return (SPI1->CR1 & SPI_CR1_BR);
+}
+
+
+/** 
+* @brief  设置SPI时钟极性
+* @param  polarity SPI时钟极性
+*             @arg SPI_POLARITY_LOW
+*             @arg SPI_POLARITY_HIGH
+* @retval 无
+*/
+__STATIC_INLINE void std_spi_set_polarity(uint32_t polarity)
+{
+    MODIFY_REG(SPI1->CR1, SPI_CR1_CPOL, polarity);
+}
+
+
+/**
+* @brief  设置SPI时钟相位 
+* @param  phase SPI时钟相位
+*             @arg SPI_PHASE_1EDGE 
+*             @arg SPI_PHASE_2EDGE 
+* @retval 无
+*/
+__STATIC_INLINE void std_spi_set_phase(uint32_t phase)
+{
+    MODIFY_REG(SPI1->CR1, SPI_CR1_CPHA, phase);
+}
+
+
+/**
+* @brief  设置SPI数据大小端
+* @param  first_bit SPI数据大小端
+*             @arg SPI_FIRSTBIT_MSB 
+*             @arg SPI_FIRSTBIT_LSB 
+* @note   仅在禁止SPI(SPE为0)时才可对此位执行写操作
+* @retval 无
+*/
+__STATIC_INLINE void std_spi_set_first_bit(uint32_t first_bit)
+{
+    MODIFY_REG(SPI1->CR1, SPI_CR1_LSBFIRST, first_bit);
+}
+
+
+/**
+* @brief  使能NSS软片选
+* @note   仅在从机模式下设置有效
+* @retval 无
+*/
+__STATIC_INLINE void std_spi_nss_soft_chip_select_enable(void)
+{
+    SPI1->CR1 |= SPI_CR1_SSM;
+}
+
+
+/**
+* @brief  禁止NSS软片选
+* @note   仅在从机模式下设置有效
+* @retval 无
+*/
+__STATIC_INLINE void std_spi_nss_soft_chip_select_disable(void)
+{
+    SPI1->CR1 &= (~SPI_CR1_SSM);
+}
+
+
+/**
+* @brief  使能SPI NSS输出
+* @note   仅在主机模式下设置有效
+* @retval 无
+*/
+__STATIC_INLINE void std_spi_nss_output_enable(void)
+{
+    SPI1->CR1 |= SPI_CR1_NSSOE;
+}
+
+
+/**
+* @brief  禁止SPI NSS输出
+* @retval 无
+*/
+__STATIC_INLINE void std_spi_nss_output_disable(void)
+{
+    SPI1->CR1 &= (~SPI_CR1_NSSOE);
+}
+
+
+/**
+* @brief  使能SPI中断
+* @param  spi_interrupt SPI中断信息
+*             @arg SPI_INTERRUPT_TXFE     
+*             @arg SPI_INTERRUPT_RXFNE    
+*             @arg SPI_INTERRUPT_ERR      
+* @retval 无
+*/
+__STATIC_INLINE void std_spi_interrupt_enable(uint32_t spi_interrupt)
+{
+    SPI1->CR1 |= spi_interrupt;
+}
+
+
+/**
+* @brief  禁止SPI中断
+* @param  spi_interrupt SPI中断信息
+*             @arg SPI_INTERRUPT_TXFE     
+*             @arg SPI_INTERRUPT_RXFNE    
+*             @arg SPI_INTERRUPT_ERR      
+* @retval 无
+*/
+__STATIC_INLINE void std_spi_interrupt_disable(uint32_t spi_interrupt)
+{
+    SPI1->CR1 &= (~spi_interrupt);
+}
+
+
+/**
+* @brief  获取SPI中断使能状态
+* @param  spi_interrupt SPI中断信息
+*             @arg SPI_INTERRUPT_TXFE     
+*             @arg SPI_INTERRUPT_RXFNE    
+*             @arg SPI_INTERRUPT_ERR      
+* @retval uint32_t 中断使能状态
+*             @arg 非0: 使能
+*             @arg 0: 禁止
+*/
+__STATIC_INLINE uint32_t std_spi_get_interrupt_enable(uint32_t spi_interrupt)
+{
+    return (SPI1->CR1 & (spi_interrupt));
+}
+
+
+/**
+* @brief  设置SPI NSS引脚电平
+* @param  nss_output NSS输出电平
+*             @arg SPI_NSS_OUTPUT_LOW   
+*             @arg SPI_NSS_OUTPUT_HIGH  
+* @note   仅在主机模式下且SPE使能的情况下设置有效
+* @retval 无
+*/
+__STATIC_INLINE void std_spi_set_nss_output(uint32_t nss_output)
+{
+    SPI1->CR2 = nss_output;
+}
+
+
+/**
+* @brief  获取SPI状态标志位
+* @param  flag SPI状态标志位
+*             @arg SPI_FLAG_TXFE 
+*             @arg SPI_FLAG_RXFNE
+*             @arg SPI_FLAG_BUSY 
+*             @arg SPI_FLAG_OVR  
+*             @arg SPI_FLAG_MMF  
+* @retval uint32_t SPI标志位状态
+*             @arg 非0: 标志位置位
+*             @arg 0:   标志位清除
+*/
+__STATIC_INLINE uint32_t std_spi_get_flag(uint32_t flag)
+{
+    return (SPI1->ISR & (flag));
+}
+
+
+/**
+* @brief  SPI标志清零
+* @param  flag SPI标志
+*             @arg SPI_CLEAR_FLAG_OVR
+*             @arg SPI_CLEAR_FLAG_MMF
+* @retval 无
+*/
+__STATIC_INLINE void std_spi_clear_flag(uint32_t flag)
+{
+    SPI1->ICR = (flag);
+}
+
+
+/**
+* @brief  SPI读数据
+* @retval uint8_t: 返回读取的SPI数据寄存器读取的数据
+*/
+__STATIC_INLINE uint8_t std_spi_read_data(void)
+{
+    return (SPI1->DR);
+}
+
+/**
+* @brief  SPI写数据
+* @param  send_data: 写入SPI数据寄存器的数据
+* @retval 无
+*/
+__STATIC_INLINE void std_spi_write_data(uint8_t send_data)
+{
+    SPI1->DR = send_data;
+}
+
+
+void std_spi_init(std_spi_init_t *spi_init_param);
+void std_spi_deinit(void);
+void std_spi_struct_init(std_spi_init_t *spi_init_struct);
+
+
+/** 
+* @} 
+*/
+
+#ifdef __cplusplus
+}
+#endif
+
+/** 
+* @} 
+*/
+
+/** 
+* @} 
+*/
+
+#endif /* CIU32F003_STD_SPI_H */

+ 442 - 0
CIU32F003_LIB/Include/ciu32f003_std_spi(3).h

@@ -0,0 +1,442 @@
+/************************************************************************************************/
+/**
+* @file               ciu32f003_std_spi.h
+* @author             MCU Ecosystem Development Team
+* @brief              SPI STD库驱动头文件。
+*                     提供SPI相关的STD库操作函数声明、数据类型以及常量的定义。
+*
+*
+**************************************************************************************************
+* @attention
+* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
+*
+**************************************************************************************************
+*/
+
+/* 避免头文件重复引用 */
+#ifndef CIU32F003_STD_SPI_H
+#define CIU32F003_STD_SPI_H
+
+/************************************************************************************************/
+/** 
+* @addtogroup CIU32F003_STD_Driver
+* @{
+*/
+
+/**
+* @defgroup SPI SPI
+* @brief 串行外设接口的STD库驱动 
+* @{
+*/
+/************************************************************************************************/
+
+
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/*------------------------------------------includes--------------------------------------------*/
+#include "ciu32f003_std_common.h"
+
+
+/*-----------------------------------------type define------------------------------------------*/
+/************************************************************************************************/
+/**
+* @defgroup SPI_Types SPI Types
+* @brief  SPI数据类型定义
+* @{
+*
+*/
+/************************************************************************************************/
+
+/**
+* @brief  SPI初始化配置结构体定义
+*/
+typedef struct
+{
+    uint32_t mode;                     /**< SPI工作模式
+                                                @arg SPI_MODE_SLAVE
+                                                @arg SPI_MODE_MASTER                            */
+
+    uint32_t baud_rate_prescaler;      /**< SPI速率配置参数                                    
+                                                @arg  SPI_BAUD_PCLKDIV_2          
+                                                @arg  SPI_BAUD_PCLKDIV_4 ...      
+                                                @note 主机输出时钟设置,从机不需要设置          */
+
+    uint32_t clk_polarity;             /**< SPI时钟极性                                
+                                                @arg SPI_POLARITY_LOW                  
+                                                @arg SPI_POLARITY_HIGH                          */
+
+    uint32_t clk_phase;                /**< SPI时钟相位                                
+                                                @arg SPI_PHASE_1EDGE                   
+                                                @arg SPI_PHASE_2EDGE                            */
+    
+    uint32_t bitorder;                 /**< SPI数据大小端
+                                                @arg SPI_FIRSTBIT_MSB
+                                                @arg SPI_FIRSTBIT_LSB                           */
+}std_spi_init_t; 
+
+
+/** 
+* @} 
+*/
+
+
+/*--------------------------------------------define--------------------------------------------*/
+/************************************************************************************************/
+/** 
+* @defgroup SPI_Constants SPI Constants
+* @brief SPI常量定义及宏定义
+* @{
+*/
+/************************************************************************************************/
+/* SPI 工作模式 */
+#define SPI_MODE_SLAVE                  (0x00000000U)                      /**< SPI从机模式     */
+#define SPI_MODE_MASTER                 SPI_CR1_MSTR                       /**< SPI主机模式     */
+
+/* SPI 速率配置参数 */    
+#define SPI_BAUD_PCLKDIV_2              SPI_CR1_BR_PCLK_DIV_2              /**< SPI速率为fPLCK/2   */
+#define SPI_BAUD_PCLKDIV_4              SPI_CR1_BR_PCLK_DIV_4              /**< SPI速率为fPLCK/4   */
+#define SPI_BAUD_PCLKDIV_8              SPI_CR1_BR_PCLK_DIV_8              /**< SPI速率为fPLCK/8   */
+#define SPI_BAUD_PCLKDIV_16             SPI_CR1_BR_PCLK_DIV_16             /**< SPI速率为fPLCK/16  */
+#define SPI_BAUD_PCLKDIV_32             SPI_CR1_BR_PCLK_DIV_32             /**< SPI速率为fPLCK/32  */
+#define SPI_BAUD_PCLKDIV_64             SPI_CR1_BR_PCLK_DIV_64             /**< SPI速率为fPLCK/64  */
+#define SPI_BAUD_PCLKDIV_128            SPI_CR1_BR_PCLK_DIV_128            /**< SPI速率为fPLCK/128 */
+
+/* SPI 时钟极性 */
+#define SPI_POLARITY_LOW                (0x00000000U)                      /**< SPI时钟空闲为低 */
+#define SPI_POLARITY_HIGH               SPI_CR1_CPOL                       /**< SPI时钟空闲为高 */
+
+/* SPI 时钟相位 */
+#define SPI_PHASE_1EDGE                 (0x00000000U)                      /**< SPI数据采样在第一个时钟沿 */
+#define SPI_PHASE_2EDGE                 SPI_CR1_CPHA                       /**< SPI数据采样在第二个时钟沿 */
+
+/* SPI 数据大小端 */
+#define SPI_FIRSTBIT_MSB                (0x00000000U)                      /**< SPI数据收发为高位优先 */
+#define SPI_FIRSTBIT_LSB                SPI_CR1_LSBFIRST                   /**< SPI数据收发为低位优先 */
+
+/* SPI NSS输出状态*/
+#define SPI_NSS_OUTPUT_LOW              (0x00000000U)                      /**< SPI片选信号输出低电平 */
+#define SPI_NSS_OUTPUT_HIGH             SPI_CR2_NSSO                       /**< SPI片选信号输出高电平 */
+
+/* SPI 中断事件 */
+#define SPI_INTERRUPT_TXFE              SPI_CR1_TXFEIE                     /**< SPI发送数据寄存器为空中断使能 */
+#define SPI_INTERRUPT_RXFNE             SPI_CR1_RXFNEIE                    /**< SPI接收数据寄存器非空中断使能 */
+#define SPI_INTERRUPT_ERR               SPI_CR1_ERRIE                      /**< SPI错误中断使能               */
+
+/* SPI 硬件状态信息 */
+#define SPI_FLAG_TXFE                   SPI_ISR_TXFE                       /**< SPI发送数据寄存器空标志   */
+#define SPI_FLAG_RXFNE                  SPI_ISR_RXFNE                      /**< SPI接收数据寄存器非空标志 */
+#define SPI_FLAG_BUSY                   SPI_ISR_BUSY                       /**< SPI总线传输状态标志       */
+#define SPI_FLAG_OVR                    SPI_ISR_OVR                        /**< SPI接收上溢出标志         */
+#define SPI_FLAG_MMF                    SPI_ISR_MMF                        /**< SPI主机模式冲突标志       */
+
+/* SPI 状态清除信息 */
+#define SPI_CLEAR_FLAG_OVR              SPI_ICR_OVRCF                      /**< SPI主机上溢标志清除     */
+#define SPI_CLEAR_FLAG_MMF              SPI_ICR_MMFCF                      /**< SPI主机模式冲突标志清除 */
+
+/** 
+* @} 
+*/
+
+
+/*-------------------------------------------functions------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @defgroup SPI_External_Functions SPI External Functions
+* @brief    SPI对外函数
+* @{
+*
+*/
+/************************************************************************************************/
+/** 
+* @brief  使能SPI
+* @retval 无
+*/
+__STATIC_INLINE void std_spi_enable(void)
+{
+    SPI1->CR1 |= SPI_CR1_SPE;
+}
+
+
+/** 
+* @brief  禁止SPI
+* @retval 无
+*/
+__STATIC_INLINE void std_spi_disable(void)
+{
+    SPI1->CR1 &= (~SPI_CR1_SPE);
+}
+
+
+/** 
+* @brief  设置SPI主从模式
+* @param  mode SPI主从模式
+*             @arg SPI_MODE_SLAVE
+*             @arg SPI_MODE_MASTER   
+* @retval 无
+*/
+__STATIC_INLINE void std_spi_set_mode(uint32_t mode)
+{
+    MODIFY_REG(SPI1->CR1, SPI_CR1_MSTR, mode);
+}
+
+
+/** 
+* @brief  获取SPI主从模式
+* @retval uint32_t SPI主从模式
+*             @arg SPI_MODE_SLAVE
+*             @arg SPI_MODE_MASTER  
+*/
+__STATIC_INLINE uint32_t std_spi_get_mode(void)
+{
+    return (SPI1->CR1 & SPI_CR1_MSTR);
+}
+
+
+/** 
+* @brief  设置SPI波特率
+* @param  baud_rate SPI波特率
+*             @arg  SPI_BAUD_PCLKDIV_2      
+*             @arg  SPI_BAUD_PCLKDIV_4
+*             @arg  ...  
+*             @arg  SPI_BAUD_PCLKDIV_128
+* @note  主机输出时钟设置,从机不需要设置
+* @retval 无
+*/
+__STATIC_INLINE void std_spi_set_baud_rate(uint32_t baud_rate)
+{
+    MODIFY_REG(SPI1->CR1, SPI_CR1_BR, baud_rate);
+}
+
+
+/** 
+* @brief  获取SPI波特率
+* @retval uint32_t  SPI波特率
+*             @arg  SPI_BAUD_PCLKDIV_2
+*             @arg  SPI_BAUD_PCLKDIV_4
+*             @arg  ...  
+*             @arg  SPI_BAUD_PCLKDIV_128
+*/
+__STATIC_INLINE uint32_t std_spi_get_baud_rate(void)
+{
+    return (SPI1->CR1 & SPI_CR1_BR);
+}
+
+
+/** 
+* @brief  设置SPI时钟极性
+* @param  polarity SPI时钟极性
+*             @arg SPI_POLARITY_LOW
+*             @arg SPI_POLARITY_HIGH
+* @retval 无
+*/
+__STATIC_INLINE void std_spi_set_polarity(uint32_t polarity)
+{
+    MODIFY_REG(SPI1->CR1, SPI_CR1_CPOL, polarity);
+}
+
+
+/**
+* @brief  设置SPI时钟相位 
+* @param  phase SPI时钟相位
+*             @arg SPI_PHASE_1EDGE 
+*             @arg SPI_PHASE_2EDGE 
+* @retval 无
+*/
+__STATIC_INLINE void std_spi_set_phase(uint32_t phase)
+{
+    MODIFY_REG(SPI1->CR1, SPI_CR1_CPHA, phase);
+}
+
+
+/**
+* @brief  设置SPI数据大小端
+* @param  first_bit SPI数据大小端
+*             @arg SPI_FIRSTBIT_MSB 
+*             @arg SPI_FIRSTBIT_LSB 
+* @note   仅在禁止SPI(SPE为0)时才可对此位执行写操作
+* @retval 无
+*/
+__STATIC_INLINE void std_spi_set_first_bit(uint32_t first_bit)
+{
+    MODIFY_REG(SPI1->CR1, SPI_CR1_LSBFIRST, first_bit);
+}
+
+
+/**
+* @brief  使能NSS软片选
+* @note   仅在从机模式下设置有效
+* @retval 无
+*/
+__STATIC_INLINE void std_spi_nss_soft_chip_select_enable(void)
+{
+    SPI1->CR1 |= SPI_CR1_SSM;
+}
+
+
+/**
+* @brief  禁止NSS软片选
+* @note   仅在从机模式下设置有效
+* @retval 无
+*/
+__STATIC_INLINE void std_spi_nss_soft_chip_select_disable(void)
+{
+    SPI1->CR1 &= (~SPI_CR1_SSM);
+}
+
+
+/**
+* @brief  使能SPI NSS输出
+* @note   仅在主机模式下设置有效
+* @retval 无
+*/
+__STATIC_INLINE void std_spi_nss_output_enable(void)
+{
+    SPI1->CR1 |= SPI_CR1_NSSOE;
+}
+
+
+/**
+* @brief  禁止SPI NSS输出
+* @retval 无
+*/
+__STATIC_INLINE void std_spi_nss_output_disable(void)
+{
+    SPI1->CR1 &= (~SPI_CR1_NSSOE);
+}
+
+
+/**
+* @brief  使能SPI中断
+* @param  spi_interrupt SPI中断信息
+*             @arg SPI_INTERRUPT_TXFE     
+*             @arg SPI_INTERRUPT_RXFNE    
+*             @arg SPI_INTERRUPT_ERR      
+* @retval 无
+*/
+__STATIC_INLINE void std_spi_interrupt_enable(uint32_t spi_interrupt)
+{
+    SPI1->CR1 |= spi_interrupt;
+}
+
+
+/**
+* @brief  禁止SPI中断
+* @param  spi_interrupt SPI中断信息
+*             @arg SPI_INTERRUPT_TXFE     
+*             @arg SPI_INTERRUPT_RXFNE    
+*             @arg SPI_INTERRUPT_ERR      
+* @retval 无
+*/
+__STATIC_INLINE void std_spi_interrupt_disable(uint32_t spi_interrupt)
+{
+    SPI1->CR1 &= (~spi_interrupt);
+}
+
+
+/**
+* @brief  获取SPI中断使能状态
+* @param  spi_interrupt SPI中断信息
+*             @arg SPI_INTERRUPT_TXFE     
+*             @arg SPI_INTERRUPT_RXFNE    
+*             @arg SPI_INTERRUPT_ERR      
+* @retval uint32_t 中断使能状态
+*             @arg 非0: 使能
+*             @arg 0: 禁止
+*/
+__STATIC_INLINE uint32_t std_spi_get_interrupt_enable(uint32_t spi_interrupt)
+{
+    return (SPI1->CR1 & (spi_interrupt));
+}
+
+
+/**
+* @brief  设置SPI NSS引脚电平
+* @param  nss_output NSS输出电平
+*             @arg SPI_NSS_OUTPUT_LOW   
+*             @arg SPI_NSS_OUTPUT_HIGH  
+* @note   仅在主机模式下且SPE使能的情况下设置有效
+* @retval 无
+*/
+__STATIC_INLINE void std_spi_set_nss_output(uint32_t nss_output)
+{
+    SPI1->CR2 = nss_output;
+}
+
+
+/**
+* @brief  获取SPI状态标志位
+* @param  flag SPI状态标志位
+*             @arg SPI_FLAG_TXFE 
+*             @arg SPI_FLAG_RXFNE
+*             @arg SPI_FLAG_BUSY 
+*             @arg SPI_FLAG_OVR  
+*             @arg SPI_FLAG_MMF  
+* @retval uint32_t SPI标志位状态
+*             @arg 非0: 标志位置位
+*             @arg 0:   标志位清除
+*/
+__STATIC_INLINE uint32_t std_spi_get_flag(uint32_t flag)
+{
+    return (SPI1->ISR & (flag));
+}
+
+
+/**
+* @brief  SPI标志清零
+* @param  flag SPI标志
+*             @arg SPI_CLEAR_FLAG_OVR
+*             @arg SPI_CLEAR_FLAG_MMF
+* @retval 无
+*/
+__STATIC_INLINE void std_spi_clear_flag(uint32_t flag)
+{
+    SPI1->ICR = (flag);
+}
+
+
+/**
+* @brief  SPI读数据
+* @retval uint8_t: 返回读取的SPI数据寄存器读取的数据
+*/
+__STATIC_INLINE uint8_t std_spi_read_data(void)
+{
+    return (SPI1->DR);
+}
+
+/**
+* @brief  SPI写数据
+* @param  send_data: 写入SPI数据寄存器的数据
+* @retval 无
+*/
+__STATIC_INLINE void std_spi_write_data(uint8_t send_data)
+{
+    SPI1->DR = send_data;
+}
+
+
+void std_spi_init(std_spi_init_t *spi_init_param);
+void std_spi_deinit(void);
+void std_spi_struct_init(std_spi_init_t *spi_init_struct);
+
+
+/** 
+* @} 
+*/
+
+#ifdef __cplusplus
+}
+#endif
+
+/** 
+* @} 
+*/
+
+/** 
+* @} 
+*/
+
+#endif /* CIU32F003_STD_SPI_H */

+ 442 - 0
CIU32F003_LIB/Include/ciu32f003_std_spi.h

@@ -0,0 +1,442 @@
+/************************************************************************************************/
+/**
+* @file               ciu32f003_std_spi.h
+* @author             MCU Ecosystem Development Team
+* @brief              SPI STD库驱动头文件。
+*                     提供SPI相关的STD库操作函数声明、数据类型以及常量的定义。
+*
+*
+**************************************************************************************************
+* @attention
+* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
+*
+**************************************************************************************************
+*/
+
+/* 避免头文件重复引用 */
+#ifndef CIU32F003_STD_SPI_H
+#define CIU32F003_STD_SPI_H
+
+/************************************************************************************************/
+/** 
+* @addtogroup CIU32F003_STD_Driver
+* @{
+*/
+
+/**
+* @defgroup SPI SPI
+* @brief 串行外设接口的STD库驱动 
+* @{
+*/
+/************************************************************************************************/
+
+
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/*------------------------------------------includes--------------------------------------------*/
+#include "ciu32f003_std_common.h"
+
+
+/*-----------------------------------------type define------------------------------------------*/
+/************************************************************************************************/
+/**
+* @defgroup SPI_Types SPI Types
+* @brief  SPI数据类型定义
+* @{
+*
+*/
+/************************************************************************************************/
+
+/**
+* @brief  SPI初始化配置结构体定义
+*/
+typedef struct
+{
+    uint32_t mode;                     /**< SPI工作模式
+                                                @arg SPI_MODE_SLAVE
+                                                @arg SPI_MODE_MASTER                            */
+
+    uint32_t baud_rate_prescaler;      /**< SPI速率配置参数                                    
+                                                @arg  SPI_BAUD_PCLKDIV_2          
+                                                @arg  SPI_BAUD_PCLKDIV_4 ...      
+                                                @note 主机输出时钟设置,从机不需要设置          */
+
+    uint32_t clk_polarity;             /**< SPI时钟极性                                
+                                                @arg SPI_POLARITY_LOW                  
+                                                @arg SPI_POLARITY_HIGH                          */
+
+    uint32_t clk_phase;                /**< SPI时钟相位                                
+                                                @arg SPI_PHASE_1EDGE                   
+                                                @arg SPI_PHASE_2EDGE                            */
+    
+    uint32_t bitorder;                 /**< SPI数据大小端
+                                                @arg SPI_FIRSTBIT_MSB
+                                                @arg SPI_FIRSTBIT_LSB                           */
+}std_spi_init_t; 
+
+
+/** 
+* @} 
+*/
+
+
+/*--------------------------------------------define--------------------------------------------*/
+/************************************************************************************************/
+/** 
+* @defgroup SPI_Constants SPI Constants
+* @brief SPI常量定义及宏定义
+* @{
+*/
+/************************************************************************************************/
+/* SPI 工作模式 */
+#define SPI_MODE_SLAVE                  (0x00000000U)                      /**< SPI从机模式     */
+#define SPI_MODE_MASTER                 SPI_CR1_MSTR                       /**< SPI主机模式     */
+
+/* SPI 速率配置参数 */    
+#define SPI_BAUD_PCLKDIV_2              SPI_CR1_BR_PCLK_DIV_2              /**< SPI速率为fPLCK/2   */
+#define SPI_BAUD_PCLKDIV_4              SPI_CR1_BR_PCLK_DIV_4              /**< SPI速率为fPLCK/4   */
+#define SPI_BAUD_PCLKDIV_8              SPI_CR1_BR_PCLK_DIV_8              /**< SPI速率为fPLCK/8   */
+#define SPI_BAUD_PCLKDIV_16             SPI_CR1_BR_PCLK_DIV_16             /**< SPI速率为fPLCK/16  */
+#define SPI_BAUD_PCLKDIV_32             SPI_CR1_BR_PCLK_DIV_32             /**< SPI速率为fPLCK/32  */
+#define SPI_BAUD_PCLKDIV_64             SPI_CR1_BR_PCLK_DIV_64             /**< SPI速率为fPLCK/64  */
+#define SPI_BAUD_PCLKDIV_128            SPI_CR1_BR_PCLK_DIV_128            /**< SPI速率为fPLCK/128 */
+
+/* SPI 时钟极性 */
+#define SPI_POLARITY_LOW                (0x00000000U)                      /**< SPI时钟空闲为低 */
+#define SPI_POLARITY_HIGH               SPI_CR1_CPOL                       /**< SPI时钟空闲为高 */
+
+/* SPI 时钟相位 */
+#define SPI_PHASE_1EDGE                 (0x00000000U)                      /**< SPI数据采样在第一个时钟沿 */
+#define SPI_PHASE_2EDGE                 SPI_CR1_CPHA                       /**< SPI数据采样在第二个时钟沿 */
+
+/* SPI 数据大小端 */
+#define SPI_FIRSTBIT_MSB                (0x00000000U)                      /**< SPI数据收发为高位优先 */
+#define SPI_FIRSTBIT_LSB                SPI_CR1_LSBFIRST                   /**< SPI数据收发为低位优先 */
+
+/* SPI NSS输出状态*/
+#define SPI_NSS_OUTPUT_LOW              (0x00000000U)                      /**< SPI片选信号输出低电平 */
+#define SPI_NSS_OUTPUT_HIGH             SPI_CR2_NSSO                       /**< SPI片选信号输出高电平 */
+
+/* SPI 中断事件 */
+#define SPI_INTERRUPT_TXFE              SPI_CR1_TXFEIE                     /**< SPI发送数据寄存器为空中断使能 */
+#define SPI_INTERRUPT_RXFNE             SPI_CR1_RXFNEIE                    /**< SPI接收数据寄存器非空中断使能 */
+#define SPI_INTERRUPT_ERR               SPI_CR1_ERRIE                      /**< SPI错误中断使能               */
+
+/* SPI 硬件状态信息 */
+#define SPI_FLAG_TXFE                   SPI_ISR_TXFE                       /**< SPI发送数据寄存器空标志   */
+#define SPI_FLAG_RXFNE                  SPI_ISR_RXFNE                      /**< SPI接收数据寄存器非空标志 */
+#define SPI_FLAG_BUSY                   SPI_ISR_BUSY                       /**< SPI总线传输状态标志       */
+#define SPI_FLAG_OVR                    SPI_ISR_OVR                        /**< SPI接收上溢出标志         */
+#define SPI_FLAG_MMF                    SPI_ISR_MMF                        /**< SPI主机模式冲突标志       */
+
+/* SPI 状态清除信息 */
+#define SPI_CLEAR_FLAG_OVR              SPI_ICR_OVRCF                      /**< SPI主机上溢标志清除     */
+#define SPI_CLEAR_FLAG_MMF              SPI_ICR_MMFCF                      /**< SPI主机模式冲突标志清除 */
+
+/** 
+* @} 
+*/
+
+
+/*-------------------------------------------functions------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @defgroup SPI_External_Functions SPI External Functions
+* @brief    SPI对外函数
+* @{
+*
+*/
+/************************************************************************************************/
+/** 
+* @brief  使能SPI
+* @retval 无
+*/
+__STATIC_INLINE void std_spi_enable(void)
+{
+    SPI1->CR1 |= SPI_CR1_SPE;
+}
+
+
+/** 
+* @brief  禁止SPI
+* @retval 无
+*/
+__STATIC_INLINE void std_spi_disable(void)
+{
+    SPI1->CR1 &= (~SPI_CR1_SPE);
+}
+
+
+/** 
+* @brief  设置SPI主从模式
+* @param  mode SPI主从模式
+*             @arg SPI_MODE_SLAVE
+*             @arg SPI_MODE_MASTER   
+* @retval 无
+*/
+__STATIC_INLINE void std_spi_set_mode(uint32_t mode)
+{
+    MODIFY_REG(SPI1->CR1, SPI_CR1_MSTR, mode);
+}
+
+
+/** 
+* @brief  获取SPI主从模式
+* @retval uint32_t SPI主从模式
+*             @arg SPI_MODE_SLAVE
+*             @arg SPI_MODE_MASTER  
+*/
+__STATIC_INLINE uint32_t std_spi_get_mode(void)
+{
+    return (SPI1->CR1 & SPI_CR1_MSTR);
+}
+
+
+/** 
+* @brief  设置SPI波特率
+* @param  baud_rate SPI波特率
+*             @arg  SPI_BAUD_PCLKDIV_2      
+*             @arg  SPI_BAUD_PCLKDIV_4
+*             @arg  ...  
+*             @arg  SPI_BAUD_PCLKDIV_128
+* @note  主机输出时钟设置,从机不需要设置
+* @retval 无
+*/
+__STATIC_INLINE void std_spi_set_baud_rate(uint32_t baud_rate)
+{
+    MODIFY_REG(SPI1->CR1, SPI_CR1_BR, baud_rate);
+}
+
+
+/** 
+* @brief  获取SPI波特率
+* @retval uint32_t  SPI波特率
+*             @arg  SPI_BAUD_PCLKDIV_2
+*             @arg  SPI_BAUD_PCLKDIV_4
+*             @arg  ...  
+*             @arg  SPI_BAUD_PCLKDIV_128
+*/
+__STATIC_INLINE uint32_t std_spi_get_baud_rate(void)
+{
+    return (SPI1->CR1 & SPI_CR1_BR);
+}
+
+
+/** 
+* @brief  设置SPI时钟极性
+* @param  polarity SPI时钟极性
+*             @arg SPI_POLARITY_LOW
+*             @arg SPI_POLARITY_HIGH
+* @retval 无
+*/
+__STATIC_INLINE void std_spi_set_polarity(uint32_t polarity)
+{
+    MODIFY_REG(SPI1->CR1, SPI_CR1_CPOL, polarity);
+}
+
+
+/**
+* @brief  设置SPI时钟相位 
+* @param  phase SPI时钟相位
+*             @arg SPI_PHASE_1EDGE 
+*             @arg SPI_PHASE_2EDGE 
+* @retval 无
+*/
+__STATIC_INLINE void std_spi_set_phase(uint32_t phase)
+{
+    MODIFY_REG(SPI1->CR1, SPI_CR1_CPHA, phase);
+}
+
+
+/**
+* @brief  设置SPI数据大小端
+* @param  first_bit SPI数据大小端
+*             @arg SPI_FIRSTBIT_MSB 
+*             @arg SPI_FIRSTBIT_LSB 
+* @note   仅在禁止SPI(SPE为0)时才可对此位执行写操作
+* @retval 无
+*/
+__STATIC_INLINE void std_spi_set_first_bit(uint32_t first_bit)
+{
+    MODIFY_REG(SPI1->CR1, SPI_CR1_LSBFIRST, first_bit);
+}
+
+
+/**
+* @brief  使能NSS软片选
+* @note   仅在从机模式下设置有效
+* @retval 无
+*/
+__STATIC_INLINE void std_spi_nss_soft_chip_select_enable(void)
+{
+    SPI1->CR1 |= SPI_CR1_SSM;
+}
+
+
+/**
+* @brief  禁止NSS软片选
+* @note   仅在从机模式下设置有效
+* @retval 无
+*/
+__STATIC_INLINE void std_spi_nss_soft_chip_select_disable(void)
+{
+    SPI1->CR1 &= (~SPI_CR1_SSM);
+}
+
+
+/**
+* @brief  使能SPI NSS输出
+* @note   仅在主机模式下设置有效
+* @retval 无
+*/
+__STATIC_INLINE void std_spi_nss_output_enable(void)
+{
+    SPI1->CR1 |= SPI_CR1_NSSOE;
+}
+
+
+/**
+* @brief  禁止SPI NSS输出
+* @retval 无
+*/
+__STATIC_INLINE void std_spi_nss_output_disable(void)
+{
+    SPI1->CR1 &= (~SPI_CR1_NSSOE);
+}
+
+
+/**
+* @brief  使能SPI中断
+* @param  spi_interrupt SPI中断信息
+*             @arg SPI_INTERRUPT_TXFE     
+*             @arg SPI_INTERRUPT_RXFNE    
+*             @arg SPI_INTERRUPT_ERR      
+* @retval 无
+*/
+__STATIC_INLINE void std_spi_interrupt_enable(uint32_t spi_interrupt)
+{
+    SPI1->CR1 |= spi_interrupt;
+}
+
+
+/**
+* @brief  禁止SPI中断
+* @param  spi_interrupt SPI中断信息
+*             @arg SPI_INTERRUPT_TXFE     
+*             @arg SPI_INTERRUPT_RXFNE    
+*             @arg SPI_INTERRUPT_ERR      
+* @retval 无
+*/
+__STATIC_INLINE void std_spi_interrupt_disable(uint32_t spi_interrupt)
+{
+    SPI1->CR1 &= (~spi_interrupt);
+}
+
+
+/**
+* @brief  获取SPI中断使能状态
+* @param  spi_interrupt SPI中断信息
+*             @arg SPI_INTERRUPT_TXFE     
+*             @arg SPI_INTERRUPT_RXFNE    
+*             @arg SPI_INTERRUPT_ERR      
+* @retval uint32_t 中断使能状态
+*             @arg 非0: 使能
+*             @arg 0: 禁止
+*/
+__STATIC_INLINE uint32_t std_spi_get_interrupt_enable(uint32_t spi_interrupt)
+{
+    return (SPI1->CR1 & (spi_interrupt));
+}
+
+
+/**
+* @brief  设置SPI NSS引脚电平
+* @param  nss_output NSS输出电平
+*             @arg SPI_NSS_OUTPUT_LOW   
+*             @arg SPI_NSS_OUTPUT_HIGH  
+* @note   仅在主机模式下且SPE使能的情况下设置有效
+* @retval 无
+*/
+__STATIC_INLINE void std_spi_set_nss_output(uint32_t nss_output)
+{
+    SPI1->CR2 = nss_output;
+}
+
+
+/**
+* @brief  获取SPI状态标志位
+* @param  flag SPI状态标志位
+*             @arg SPI_FLAG_TXFE 
+*             @arg SPI_FLAG_RXFNE
+*             @arg SPI_FLAG_BUSY 
+*             @arg SPI_FLAG_OVR  
+*             @arg SPI_FLAG_MMF  
+* @retval uint32_t SPI标志位状态
+*             @arg 非0: 标志位置位
+*             @arg 0:   标志位清除
+*/
+__STATIC_INLINE uint32_t std_spi_get_flag(uint32_t flag)
+{
+    return (SPI1->ISR & (flag));
+}
+
+
+/**
+* @brief  SPI标志清零
+* @param  flag SPI标志
+*             @arg SPI_CLEAR_FLAG_OVR
+*             @arg SPI_CLEAR_FLAG_MMF
+* @retval 无
+*/
+__STATIC_INLINE void std_spi_clear_flag(uint32_t flag)
+{
+    SPI1->ICR = (flag);
+}
+
+
+/**
+* @brief  SPI读数据
+* @retval uint8_t: 返回读取的SPI数据寄存器读取的数据
+*/
+__STATIC_INLINE uint8_t std_spi_read_data(void)
+{
+    return (SPI1->DR);
+}
+
+/**
+* @brief  SPI写数据
+* @param  send_data: 写入SPI数据寄存器的数据
+* @retval 无
+*/
+__STATIC_INLINE void std_spi_write_data(uint8_t send_data)
+{
+    SPI1->DR = send_data;
+}
+
+
+void std_spi_init(std_spi_init_t *spi_init_param);
+void std_spi_deinit(void);
+void std_spi_struct_init(std_spi_init_t *spi_init_struct);
+
+
+/** 
+* @} 
+*/
+
+#ifdef __cplusplus
+}
+#endif
+
+/** 
+* @} 
+*/
+
+/** 
+* @} 
+*/
+
+#endif /* CIU32F003_STD_SPI_H */

+ 1822 - 0
CIU32F003_LIB/Include/ciu32f003_std_tim(1).h

@@ -0,0 +1,1822 @@
+/************************************************************************************************/
+/**
+* @file               ciu32f003_std_tim.h          
+* @author             MCU Ecosystem Development Team
+* @brief              TIM STD库驱动头文件。
+*                     提供TIM相关的STD库操作函数声明、数据类型以及常量的定义。 
+* 
+*
+**************************************************************************************************
+* @attention
+* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
+*
+**************************************************************************************************
+*/
+
+/*避免头文件重复引用*/
+#ifndef CIU32F003_STD_TIM_H
+#define CIU32F003_STD_TIM_H
+
+/************************************************************************************************/
+/**
+* @addtogroup CIU32F003_STD_Driver
+* @{
+*/
+
+/**
+* @defgroup TIM TIM
+* @brief    高级控制定时器/通用定时器的STD库驱动
+* @{
+*
+*/
+/************************************************************************************************/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*------------------------------------------includes--------------------------------------------*/
+#include "ciu32f003_std_common.h"
+
+
+/*-----------------------------------------type define------------------------------------------*/
+
+/************************************************************************************************/
+/** 
+* @defgroup TIM_Types TIM Types
+* @brief    TIM数据类型定义
+* @{
+*/
+/************************************************************************************************/
+
+/**
+* @brief  TIM基本参数配置结构体定义
+*/
+typedef struct
+{    
+    uint32_t prescaler;              /**< TIM时钟的预分频参数                               
+                                              @note TIM1预分频参数范围为:0x0000~0xFFFF    
+                                                    TIM3预分频参数范围为:0x0000~0x000F                    */
+                                   
+    uint32_t counter_mode;           /**< 计数器模式选择
+                                              @arg TIM_COUNTER_MODE_UP ...                                 */
+                                   
+    uint32_t period;                 /**< 在下次更新事件时加载到自动重新加载寄存器中的溢出值
+                                          其值必须在0x0000~0xFFFF之间                                      */
+                                   
+    uint32_t clock_div;              /**< TIM时钟分频参数
+                                              @arg TIM_CLOCK_DTS_DIV1 ...                                  */
+                                   
+    uint8_t repeat_counter;         /**< 重复计数器参数定义,每当RCR向下计数达到0时,会产出一个更新事件,
+                                         并从RCR的值(N)开始重新计数,该参数必须在0x0000~0x00FF之间。       */
+                                   
+}std_tim_basic_init_t;
+
+
+/**
+* @brief  TIM输入捕获参数配置结构体定义
+*/
+typedef struct
+{
+    uint32_t  input_capture_pol;         /**< 输入信号的有效边沿选择                           
+                                                  @arg TIM_INPUT_POL_RISING ...                */
+                                
+    uint32_t input_capture_sel;          /**< 输入模式定义
+                                                  @arg TIM_INPUT_CAPTURE_SEL_DIRECTTI ...      */
+                                
+    uint32_t input_capture_prescaler;    /**< 输入捕获预分频定义
+                                                  @arg TIM_INPUT_CAPTURE_PSC_DIV1 ...          */
+                                
+    uint32_t input_capture_filter;       /**< 输入捕获滤波器定义,其值必须在0x0~0x7之间        */
+    
+}std_tim_input_capture_init_t;      
+
+
+/**
+* @brief  TIM输出比较参数配置结构体定义
+*/
+typedef struct
+{
+    uint32_t output_compare_mode;        /**< TIM输出比较模式定义
+                                                  @arg TIM_OUTPUT_MODE_ACTIVE ...                           */
+    
+    uint32_t output_state;               /**< 输出使能定义                                               
+                                                  @arg TIM_OUTPUT_DISABLE ...                               */
+ 
+    uint32_t output_negtive_state;       /**< 互补输出使能定义                                               
+                                                  @arg TIM_OUTPUT_NEGTIVE_DISABLE ...                       */
+                                   
+    uint32_t pulse;                      /**< TIM载入捕获比较寄存器的脉冲值,其值必须在0x0000~0xFFFF之间    */    
+                                   
+    uint32_t output_pol;                 /**< 输出极性定义
+                                                  @arg TIM_OUTPUT_POL_HIGH ...                              */
+                                   
+    uint32_t output_negtive_pol;         /**< 互补输出极性定义
+                                                  @arg TIM_OUTPUT_NEGTIVE_POL_HIGH ...                      */                                                                     
+                                   
+    uint32_t output_idle_state;          /**< TIM空闲状态下输出状态定义
+                                                  @arg  TIM_OUTPUT_IDLE_SET ...
+                                                  @note 该参数仅对支持Break功能的定时器实例有效             */
+                                   
+    uint32_t output_negtive_idle_state;  /**< TIM空闲状态下互补输出状态定义
+                                                  @arg  TIM_OUTPUT_NEGTIVE_IDLE_SET ...
+                                                  @note 该参数仅对支持Break功能的定时器实例有效             */
+    
+}std_tim_output_compare_init_t;
+
+
+/**
+* @brief  TIM断路输入和死区参数配置结构体定义
+*/
+typedef struct
+{
+    uint32_t off_state_run_mode;                        /**< 运行模式下的关闭状态
+                                                                 @arg TIM_OSSR_ENABLE ...            */
+    
+    uint32_t off_state_idle_mode;                       /**< 空闲模式下的关闭状态
+                                                                 @arg TIM_OSSI_ENABLE ...            */
+    
+    uint32_t lock_level;                                /**< LOCK级别
+                                                                 @arg TIM_LOCK_LEVEL1 ...            */  
+    
+    uint32_t dead_time;                                 /**< 死区参数定义,其值必须在0x00~0xFF之间   */
+       
+    uint32_t break_state;                              /**< 断路功能使能控制
+                                                                  @arg TIM_BREAK_ENABLE
+                                                                  @arg TIM_BREAK_DISABLE             */ 
+    
+}std_tim_break_init_t;
+
+
+
+/**
+* @}
+*/
+  
+/*--------------------------------------------define--------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @defgroup TIM_Constants TIM Constants 
+* @brief    TIM常量定义及宏定义
+* @{
+*
+*/
+/************************************************************************************************/
+/* TIM计数模式定义 */
+#define TIM_COUNTER_MODE_UP                (0x00000000U)                      /**< 向上计数                      */
+#define TIM_COUNTER_MODE_DOWN              TIM_CR1_DIR                        /**< 向下计数                      */
+#define TIM_COUNTER_MODE_CENT_MODE1        TIM_CR1_CMS_CENTER_UP              /**< 中心对齐模式1                 */
+#define TIM_COUNTER_MODE_CENT_MODE2        TIM_CR1_CMS_CENTER_DOWN            /**< 中心对齐模式2                 */
+#define TIM_COUNTER_MODE_CENT_MODE3        TIM_CR1_CMS_CENTER_UP_DOWN         /**< 中心对齐模式3                 */
+
+/* TIM更新事件源选择 */
+#define TIM_UPDATE_SOURCE_REGULAR          (0x00000000U)                      /**< 计数上溢或下溢触发                       */
+#define TIM_UPDATE_SOURCE_COUNTER          TIM_CR1_URS                        /**< 计数上溢或下溢、UG置位、从模式控制器触发  */
+
+/* TIM时钟分频 */
+#define TIM_CLOCK_DTS_DIV1                 (0x00000000U)                      /**< tDTS=tTIMx_KCLK          */
+#define TIM_CLOCK_DTS_DIV2                 TIM_CR1_CLK_DIV2                   /**< tDTS=2*tTIMx_KCLK        */
+#define TIM_CLOCK_DTS_DIV4                 TIM_CR1_CLK_DIV4                   /**< tDTS=4*tTIMx_KCLK        */
+
+/* TIM通道定义 */
+#define TIM_CHANNEL_1                      (0x00U)                            /**< 通道1定义            */
+#define TIM_CHANNEL_2                      (0x01U)                            /**< 通道2定义            */
+#define TIM_CHANNEL_3                      (0x02U)                            /**< 通道3定义            */
+#define TIM_CHANNEL_4                      (0x03U)                            /**< 通道4定义            */
+
+/* TIM输入通道极性定义 */
+#define TIM_INPUT_POL_RISING               (0x00000000U)                        /**< 未反向/上升沿触发             */
+#define TIM_INPUT_POL_FALLING              TIM_CCEN_CC1P                        /**< 反向/下降沿触发               */
+#define TIM_INPUT_POL_BOTH                 (TIM_CCEN_CC1P | TIM_CCEN_CC1NP)     /**< 未反向/上升下降均触发         */
+
+/* TIM输入捕获选择 */
+#define TIM_INPUT_CAPTURE_SEL_DIRECTTI         TIM_CCM1_CC1S_DIRECTTI             /**< TIM输入1, 2, 3 or 4,且被映射到IC1, IC2, IC3 or IC4(一一对应) */
+#define TIM_INPUT_CAPTURE_SEL_INDIRECTTI       TIM_CCM1_CC1S_INDIRECTTI           /**< TIM输入1, 2, 3 or 4,且被映射到IC2, IC1, IC4 or IC3(一一对应) */
+#define TIM_INPUT_CAPTURE_SEL_TRC              TIM_CCM1_CC1S_TRC                  /**< TIM输入1, 2, 3 or 4,且被映射到TRC                              */
+
+/* TIM输入捕获预分频参数定义 */
+#define TIM_INPUT_CAPTURE_PSC_DIV1             (0x00000000U)                      /**< 无预分频器,捕获输入上每检测到一个边沿便执行捕获 */
+#define TIM_INPUT_CAPTURE_PSC_DIV2             TIM_CCM1_IC1PSC_DIV2               /**< 每发生2个事件执行一次捕获        */
+#define TIM_INPUT_CAPTURE_PSC_DIV4             TIM_CCM1_IC1PSC_DIV4               /**< 每发生4个事件执行一次捕获        */
+#define TIM_INPUT_CAPTURE_PSC_DIV8             TIM_CCM1_IC1PSC_DIV8               /**< 每发生8个事件执行一次捕获        */
+
+/* TIM输出比较极性定义 */
+#define TIM_OUTPUT_POL_HIGH                (0x00000000U)                      /**< 比较输出极性:高电平为有效电平      */
+#define TIM_OUTPUT_POL_LOW                 TIM_CCEN_CC1P                      /**< 比较输出极性:低电平为有效电平      */
+
+/* TIM输出比较输出使能定义 */
+#define TIM_OUTPUT_DISABLE                 (0x00000000U)                      /**< 比较通道输出禁止                    */
+#define TIM_OUTPUT_ENABLE                  TIM_CCEN_CC1E                      /**< 比较通道输出使能                    */
+
+/* TIM输出比较参数定义*/   
+#define TIM_OUTPUT_MODE_FROZEN                  (0x00000000U)                                /**< 冻结                          */
+#define TIM_OUTPUT_MODE_ACTIVE                  TIM_CCM1_OC1M_ACTIVE                         /**< 通道1设置为匹配时输出有效电平 */
+#define TIM_OUTPUT_MODE_INACTIVE                TIM_CCM1_OC1M_INACTIVE                       /**< 通道1设置为匹配时输出无效电平 */
+#define TIM_OUTPUT_MODE_TOGGLE                  TIM_CCM1_OC1M_TOGGLE                         /**< 翻转                          */
+#define TIM_OUTPUT_MODE_FORCED_INACTIVE         TIM_CCM1_OC1M_FORCED_INACTIVE                /**< 强制变为无效电平              */
+#define TIM_OUTPUT_MODE_FORCED_ACTIVE           TIM_CCM1_OC1M_FORCED_ACTIVE                  /**< 强制变为有效电平              */
+#define TIM_OUTPUT_MODE_PWM1                    TIM_CCM1_OC1M_PWM1                           /**< PWM模式1                      */
+#define TIM_OUTPUT_MODE_PWM2                    TIM_CCM1_OC1M_PWM2                           /**< PWM模式2                      */
+
+/*  TIM时钟源选择 */ 
+#define TIM_CLKSRC_INT                     (0x00000000U)                      /**< TIM时钟源:内部时钟           */
+#define TIM_CLKSRC_MODE1                   TIM_SMC_SM_SEL_EXT_MODE1           /**< TIM时钟源:外部时钟源模式1    */
+
+/* TIM时钟极性定义 */
+#define TIM_CLK_TIX_POL_RISING             (0x00000000U)                      /**< TIx时钟源的极性:上升沿有效   */
+#define TIM_CLK_TIX_POL_FALLING            TIM_CCEN_CC1P                      /**< TIx时钟源的极性:下降沿有效   */
+#define TIM_CLK_TIX_POL_BOTH               (TIM_CCEN_CC1P | TIM_CCEN_CC1NP)   /**< TIx时钟源的极性:双沿有效     */
+
+/* TIM事件源 */
+#define TIM_EVENT_SRC_UPDATE               TIM_EVTG_UG                       /**< 重新初始化计数器并生成一个更新事件      */
+#define TIM_EVENT_SRC_CC1                  TIM_EVTG_CC1G                     /**< 在通道1上生成一个捕获/比较事件          */
+#define TIM_EVENT_SRC_CC2                  TIM_EVTG_CC2G                     /**< 在通道2上生成一个捕获/比较事件          */ 
+#define TIM_EVENT_SRC_CC3                  TIM_EVTG_CC3G                     /**< 在通道3上生成一个捕获/比较事件          */ 
+#define TIM_EVENT_SRC_CC4                  TIM_EVTG_CC4G                     /**< 在通道4上生成一个捕获/比较事件          */ 
+#define TIM_EVENT_SRC_COM                  TIM_EVTG_COMG                     /**< 生成一个换相事件                        */
+#define TIM_EVENT_SRC_TRIG                 TIM_EVTG_TG                       /**< 生成一个触发事件                        */
+#define TIM_EVENT_SRC_BREAK                TIM_EVTG_BG                       /**< 生成一个断路事件                        */
+
+/* TIM中断定义 */
+#define TIM_INTERRUPT_UPDATE               TIM_DIER_UIE                       /**< 更新中断                */
+#define TIM_INTERRUPT_CC1                  TIM_DIER_CC1IE                     /**< 捕获/比较1中断          */
+#define TIM_INTERRUPT_CC2                  TIM_DIER_CC2IE                     /**< 捕获/比较1中断2         */
+#define TIM_INTERRUPT_CC3                  TIM_DIER_CC3IE                     /**< 捕获/比较1中断3         */
+#define TIM_INTERRUPT_CC4                  TIM_DIER_CC4IE                     /**< 捕获/比较1中断4         */
+#define TIM_INTERRUPT_COM                  TIM_DIER_COMIE                     /**< 换相中断                */
+#define TIM_INTERRUPT_TRIG                 TIM_DIER_TIE                       /**< 触发中断                */
+#define TIM_INTERRUPT_BREAK                TIM_DIER_BIE                       /**< 断路中断                */
+
+/* TIM标志定义 */
+#define TIM_FLAG_UPDATE                    TIM_SR_UIF                         /**< 更新中断标志              */
+#define TIM_FLAG_CC1                       TIM_SR_CC1IF                       /**< 捕获/比较1事件标志        */
+#define TIM_FLAG_CC2                       TIM_SR_CC2IF                       /**< 捕获/比较2事件标志        */
+#define TIM_FLAG_CC3                       TIM_SR_CC3IF                       /**< 捕获/比较3事件标志        */
+#define TIM_FLAG_CC4                       TIM_SR_CC4IF                       /**< 捕获/比较4事件标志        */
+#define TIM_FLAG_COM                       TIM_SR_COMIF                       /**< 换相事件标志              */
+#define TIM_FLAG_TRIG                      TIM_SR_TIF                         /**< 触发事件标志              */
+#define TIM_FLAG_BREAK                     TIM_SR_BIF                         /**< 断路事件标志              */
+#define TIM_FLAG_CC1OF                     TIM_SR_CC1OF                       /**< 捕获/比较1重复捕获标志    */
+#define TIM_FLAG_CC2OF                     TIM_SR_CC2OF                       /**< 捕获/比较2重复捕获标志    */
+
+#define TIM_FLAG_ALL                       (0xFFFF)                           /**< TIM事件标志               */
+#define TIM_FLAG_CCX_ALL                   (0x001E)                           /**< 全通道捕获/比较事件标志   */
+
+/* TIM清除OCxREF输出的输入源 */                               
+#define TIM_CLEAR_INPUT_SRC_COMP1          (0x00000000U)                    /**< OCREF_CLR_INPUT连接到COMP1的输出  */
+#define TIM_CLEAR_INPUT_SRC_COMP2          TIM_CFG_OCREF_CLR                /**< OCREF_CLR_INPUT连接到COMP2的输出  */
+
+/* TIM换相事件源 */
+#define TIM_COM_SOFTWARE                  (0x00000000U)                      /**< 如果捕获/比较控制位进行预装载(CCPC=1),仅通过将COMG位置1触发换相事件               */
+#define TIM_COM_TRGI                      TIM_CR2_CCU_SEL                    /**< 如果捕获/比较控制位进行预装载(CCPC=1),可通过将COMG位置1或TRIG的上升沿触发换相事件 */
+
+/* TIM主模式选择(TRIG_OUT)参数定义*/
+#define TIM_TRIG_OUT_RESET                 (0x00000000U)                         /**< TIM1_EVTG寄存器中的UG位用作触发输出(TRIG_OUT)  */
+#define TIM_TRIG_OUT_ENABLE                TIM_CR2_MM_SEL_ENABLE                 /**< 计数器使能信号CEN用作触发输出(TRIG_OUT)        */
+#define TIM_TRIG_OUT_UPDATE                TIM_CR2_MM_SEL_UPDATE                 /**< 选择更新事件作为触发输出(TRIG_OUT)             */
+#define TIM_TRIG_OUT_CC1                   TIM_CR2_MM_SEL_CC1IF                  /**< 捕获或比较匹配,触发输出(TRIG_OUT)             */
+#define TIM_TRIG_OUT_OC1REF                TIM_CR2_MM_SEL_OC1REF                 /**< OC1REF信号用作触发输出(TRIG_OUT)                 */
+#define TIM_TRIG_OUT_OC2REF                TIM_CR2_MM_SEL_OC2REF                 /**< OC2REF信号用作触发输出(TRIG_OUT)                 */
+#define TIM_TRIG_OUT_OC3REF                TIM_CR2_MM_SEL_OC3REF                 /**< OC3REF信号用作触发输出(TRIG_OUT)                 */
+#define TIM_TRIG_OUT_OC4REF                TIM_CR2_MM_SEL_OC4REF                 /**< OC4REF信号用作触发输出(TRIG_OUT)                 */
+
+/* TIM从模式参数定义*/
+#define TIM_SLAVE_MODE_DISABLE             (0x00000000U)                              /**< 禁止从模式          */
+#define TIM_SLAVE_MODE_RESET               TIM_SMC_SM_SEL_RESET                       /**< 复位模式            */
+#define TIM_SLAVE_MODE_GATED               TIM_SMC_SM_SEL_GATED                       /**< 门控模式            */
+#define TIM_SLAVE_MODE_TRIG                TIM_SMC_SM_SEL_TRIG                        /**< 触发模式            */
+
+/* TIM触发选择参数定义*/
+#define TIM_TRIG_SOURCE_ITR0               TIM_SMC_TS_ITR0                              /**< 内部触发0(ITR0)               */
+#define TIM_TRIG_SOURCE_TI1F_ED            TIM_SMC_TS_TI1F_ED                           /**< TI1边沿检测器(TI1F_ED)        */
+#define TIM_TRIG_SOURCE_TI1FP1             TIM_SMC_TS_TI1FP1                            /**< 滤波后的定时器输入1(TI1FP1)   */
+#define TIM_TRIG_SOURCE_TI2FP2             TIM_SMC_TS_TI2FP2                            /**< 滤波后的定时器输入2(TI1FP2)   */
+
+/* TIM触发极性参数定义*/
+#define TIM_TRIG_TIX_POL_RISING            (0x00000000U)                        /**< TIxFPx或TI1F_ED触发极性:高电平或上升沿有效   */
+#define TIM_TRIG_TIX_POL_FALLING           TIM_CCEN_CC1P                        /**< TIxFPx或TI1F_ED触发极性:低电平或下降沿有效   */
+#define TIM_TRIG_TIX_POL_BOTH              (TIM_CCEN_CC1P | TIM_CCEN_CC1NP)     /**< TIxFPx或TI1F_ED触发极性:上升下降均触发       */
+                                                                                       
+/* TIM输出比较互补输出极性定义 */
+#define TIM_OUTPUT_NEGTIVE_POL_HIGH        (0x00000000U)                      /**< 互补输出极性为高电平有效      */
+#define TIM_OUTPUT_NEGTIVE_POL_LOW         TIM_CCEN_CC1NP                     /**< 互补输出极性为低电平有效      */
+
+/* TIM输出比较互补输出使能定义 */
+#define TIM_OUTPUT_NEGTIVE_DISABLE         (0x00000000U)                      /**< 互补输出通道输出禁止          */
+#define TIM_OUTPUT_NEGTIVE_ENABLE          TIM_CCEN_CC1NE                     /**< 互补输出通道输出使能          */
+
+/* TIM空闲状态下输出状态定义 */
+#define TIM_OUTPUT_IDLE_RESET              (0x00000000U)                      /**< 空闲状态为: 当MOEN=0时OCx输出低电平   */
+#define TIM_OUTPUT_IDLE_SET                TIM_CR2_OIS1                       /**< 空闲状态为: 当MOEN=0时OCx输出高电平   */
+
+/* TIM空闲状态下互补输出状态定义 */
+#define TIM_OUTPUT_NEGTIVE_IDLE_RESET      (0x00000000U)                      /**< 互补输出空闲状态为: 当MOEN=0时OCxN输出低电平  */
+#define TIM_OUTPUT_NEGTIVE_IDLE_SET        TIM_CR2_OIS1N                      /**< 互补输出空闲状态为: 当MOEN=0时OCxN输出高电平  */
+
+/* TIM运行模式下关闭状态选择参数定义 */                                         
+#define TIM_OSSR_DISABLE                   (0x00000000U)               /**< 处于无效状态时,OC/OCN输出禁止(不再受定时器控制)     */
+#define TIM_OSSR_ENABLE                    TIM_BDT_OSSR                /**< 处于无效状态时,OC/OCN输出使能(仍然受定时器控制)     */
+                                                                               
+/* TIM空闲模式下关闭状态选择参数定义 */                                         
+#define TIM_OSSI_DISABLE                   (0x00000000U)               /**< 处于无效状态时,OC/OCN输出禁止(不再受定时器控制)     */
+#define TIM_OSSI_ENABLE                    TIM_BDT_OSSI                /**< 处于无效状态时,OC/OCN输出使能(仍然受定时器控制)     */
+
+/* TIM锁级别定义*/
+#define TIM_LOCK_LEVEL_OFF                 (0x00000000U)                      /**< 锁级别0         */
+#define TIM_LOCK_LEVEL1                    TIM_BDT_LOCK_LEVEL1                /**< 锁级别1         */
+#define TIM_LOCK_LEVEL2                    TIM_BDT_LOCK_LEVEL2                /**< 锁级别2         */
+#define TIM_LOCK_LEVEL3                    TIM_BDT_LOCK_LEVEL3                /**< 锁级别3         */
+
+/* TIM断路输入使能*/                                                            
+#define TIM_BREAK_DISABLE                  (0x00000000U)                      /**< 禁止断路输入    */
+#define TIM_BREAK_ENABLE                   TIM_BDT_BKEN                       /**< 使能断路输入    */                                                                              
+                                                                              
+/* TIM断路输入源定义 */                                                       
+#define TIM_BREAK_INPUT_SRC_GPIO           TIM1_AF1_BKINE                      /**< GPIO接到BKIN引脚上          */    
+#define TIM_BREAK_INPUT_SRC_COMP1          TIM1_AF1_BKCMP1E                    /**< COMP1输出接到断路输入       */
+#define TIM_BREAK_INPUT_SRC_COMP2          TIM1_AF1_BKCMP2E                    /**< COMP2输出接到断路输入       */       
+  
+/* TIM断路输入极性定义 */                                                                                                    
+#define TIM_BREAK_INPUT_POL_HIGH           TIM1_AF1_BKINP                      /**< 断路输入源为高电平      */
+#define TIM_BREAK_INPUT_POL_LOW            (0x00000000U)                       /**< 断路输入源为低电平      */ 
+                                                                                                                                                                              
+/* TIM外部时钟输入选择  */                                                                                                                                                    
+#define TIM_TIM3_TI1_GPIO                  TIM_TISEL_TI1_SEL_CH1                      /**< TIM3_TI1连接到GPIO       */
+#define TIM_TIM3_TI1_COMP1                 TIM_TISEL_TI1_SEL_COMP1                    /**< TIM3_TI1连接到COMP1输出  */    
+                                                                                       
+#define TIM_TIM3_TI2_GPIO                  TIM_TISEL_TI2_SEL_CH2                      /**< TIM3_TI2连接到GPIO       */  
+#define TIM_TIM3_TI2_COMP2                 TIM_TISEL_TI2_SEL_COMP2                    /**< TIM3_TI2连接到COMP2输出  */                                                                                                                                                 
+
+
+/**
+* @}
+*/
+
+
+/*-------------------------------------------functions------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @defgroup TIM_External_Functions TIM External Functions
+* @brief    TIM对外函数
+* @{
+*
+*/
+/************************************************************************************************/
+/**
+* @brief  TIM启动计数
+* @param  timx TIM外设
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_enable(TIM_t *timx)
+{
+    timx->CR1 |= TIM_CR1_CEN;    
+}
+
+/**
+* @brief  TIM停止计数
+* @param  timx TIM外设
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_disable(TIM_t *timx)
+{
+    timx->CR1 &= (~TIM_CR1_CEN);
+}
+
+
+/**
+* @brief  设置TIM预分频参数
+* @param  timx TIM外设
+* @param  presc 预分频新值
+* @note   TIM1预分频参数范围为:0x0000~0xFFFF    
+*         TIM3预分频参数范围为:0x0000~0x000F
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_set_psc(TIM_t *timx, uint32_t presc)          
+{
+    timx->PSC = (presc);
+}
+
+
+/**
+* @brief  获取TIM预分频参数
+* @param  timx TIM外设
+* @retval uint32_t TIM预分频值
+*/
+__STATIC_INLINE uint32_t std_tim_get_psc(TIM_t *timx)          
+{
+    return (timx->PSC);    
+}
+
+
+/**
+* @brief  设置TIM计数值
+* @param  timx TIM外设 
+* @param  counter 计数新值
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_set_counter(TIM_t *timx, uint32_t counter)     
+{
+    timx->CNT = (counter);
+}
+
+/**
+* @brief  获取TIM计数值
+* @param  timx TIM外设
+* @retval uint32_t TIM计数值
+*/
+__STATIC_INLINE uint32_t std_tim_get_counter(TIM_t *timx)   
+{
+    return (timx->CNT);
+}
+
+/**
+* @brief  设置TIM ARR值
+* @param  timx TIM外设
+* @param  autoreload ARR值
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_set_autoreload(TIM_t *timx, uint32_t autoreload)
+{
+    timx->ARR = (autoreload); 
+}
+                                                            
+/**
+* @brief  获取TIM ARR值
+* @param  timx TIM外设
+* @retval uint32_t TIM ARR值
+*/
+__STATIC_INLINE uint32_t std_tim_get_autoreload(TIM_t *timx)
+{
+    return (timx->ARR);
+}
+
+
+/**
+* @brief  设置TIM RCR值
+* @param  timx TIM外设
+* @param  rcr TIM RCR值
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_set_repcounter(TIM_t *timx, uint32_t rcr)
+{
+    timx->RCR = (rcr);
+}
+
+
+/**
+* @brief  获取TIM RCR值
+* @param  timx TIM外设
+* @retval uint32_t TIM RCR值
+*/
+__STATIC_INLINE uint32_t std_tim_get_repcounter(TIM_t *timx)
+{
+    return (timx->RCR);
+}
+
+
+/**
+* @brief  设置TIM时钟分频值
+* @param  timx TIM外设
+* @param  clk_div 时钟分频值
+*             @arg TIM_CLOCK_DTS_DIV1:  tDTS=tTIM_KCLK
+*             @arg TIM_CLOCK_DTS_DIV2:  tDTS=2*tTIM_KCLK
+*             @arg TIM_CLOCK_DTS_DIV4:  tDTS=4*tTIM_KCLK
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_set_clock_div(TIM_t *timx, uint32_t clk_div) 
+{
+    MODIFY_REG(timx->CR1, TIM_CR1_CLK_DIV, clk_div);    
+}
+
+/**
+* @brief  获取TIM时钟分频值
+* @param  timx TIM外设
+* @retval uint32_t 时钟分频值
+*             @arg TIM_CLOCK_DIV1: tDTS=tTIM_KCLK
+*             @arg TIM_CLOCK_DIV2: tDTS=2*tTIM_KCLK
+*             @arg TIM_CLOCK_DIV4: tDTS=4*tTIM_KCLK
+*/
+__STATIC_INLINE uint32_t std_tim_get_clock_div(TIM_t *timx)           
+{
+    return (timx->CR1 & TIM_CR1_CLK_DIV);
+}
+
+/**
+* @brief  使能自动重载功能
+* @param  timx TIM外设
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_arrpreload_enable(TIM_t *timx)           
+{
+    timx->CR1 |= TIM_CR1_ARPE;
+}
+
+/**
+* @brief  禁止自动重载功能
+* @param  timx TIM外设
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_arrpreload_disable(TIM_t *timx)           
+{
+    timx->CR1 &= (~TIM_CR1_ARPE);
+}
+
+/**
+* @brief  使能更新事件
+* @param  timx TIM外设
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_updateevent_enable(TIM_t *timx)
+{
+    timx->CR1 |= TIM_CR1_UDIS;
+}
+
+/**
+* @brief  禁止更新事件
+* @param  timx TIM外设
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_updateevent_disable(TIM_t *timx)
+{
+    timx->CR1 &= (~TIM_CR1_UDIS);
+}
+
+/**
+* @brief  设置更新事件源
+* @param  timx TIM外设
+* @param  update_source 更新事件源选择
+*             @arg TIM_UPDATE_SOURCE_REGULAR
+*             @arg TIM_UPDATE_SOURCE_COUNTER
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_set_update_source(TIM_t *timx, uint32_t update_source)
+{
+    MODIFY_REG(timx->CR1, TIM_CR1_URS, update_source);
+}
+
+
+/**
+* @brief  获取更新事件源
+* @param  timx TIM外设
+* @retval uint32_t 更新事件源选择
+*             @arg TIM_UPDATE_SOURCE_REGULAR
+*             @arg TIM_UPDATE_SOURCE_COUNTER
+*/
+__STATIC_INLINE uint32_t std_tim_get_update_source(TIM_t *timx)
+{
+    return (timx->CR1 & TIM_CR1_URS);
+}
+
+
+/**
+* @brief  使能工作模式1
+* @param  timx TIM外设
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_work_mode1_enable(TIM_t *timx)
+{
+    timx->CR1 |= TIM_CR1_MODE;
+}
+
+/**
+* @brief  禁止工作模式1
+* @param  timx TIM外设
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_work_mode1_disable(TIM_t *timx)
+{
+    timx->CR1 &= (~TIM_CR1_MODE);
+}
+
+
+/**
+* @brief  设置计数模式
+* @param  timx TIM外设
+* @param  counter_mode 计数方式
+*             @arg TIM_COUNTER_MODE_UP
+*             @arg TIM_COUNTER_MODE_DOWN
+*             @arg TIM_COUNTER_MODE_CENT_MODE1
+*             @arg TIM_COUNTER_MODE_CENT_MODE2
+*             @arg TIM_COUNTER_MODE_CENT_MODE3
+* @note   由于DIR控制位在中心对齐模式下为只读权限,当从中心对齐模式切换到边沿模式时,避免计数方向修改异常,应先复位一次TIM
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_set_counter_mode(TIM_t *timx, uint32_t counter_mode)
+{
+    MODIFY_REG(timx->CR1, (TIM_CR1_DIR | TIM_CR1_CMS), counter_mode);
+}
+
+/**
+* @brief  获取计数模式
+* @param  timx TIM外设
+* @retval uint32_t 计数方式
+*             @arg TIM_COUNTER_MODE_UP
+*             @arg TIM_COUNTER_MODE_DOWN
+*             @arg TIM_COUNTER_MODE_CENT_MODE1
+*             @arg TIM_COUNTER_MODE_CENT_MODE2
+*             @arg TIM_COUNTER_MODE_CENT_MODE3
+*/
+__STATIC_INLINE uint32_t std_tim_get_counter_mode(TIM_t *timx)
+{
+    if(timx->CR1 & TIM_CR1_CMS)
+    {
+        return (timx->CR1 & TIM_CR1_CMS);
+    }
+    else
+    {
+        return (timx->CR1 & TIM_CR1_DIR);       
+    }
+}
+
+/**
+* @brief  获取TIM计数方向
+* @param  timx TIM外设
+* @retval uint32_t 返回TIM计数方向标志
+*             @arg 非0: 当前计数方向为向下计数
+*             @arg 0:当前计数方向为向上计数
+*/
+__STATIC_INLINE uint32_t std_tim_get_count_dir(TIM_t *timx)  
+{
+    return (timx->CR1 & TIM_CR1_DIR);
+}
+
+
+/**
+* @brief  使能单脉冲模式
+* @param  timx TIM外设
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_onepulse_enable(TIM_t *timx)
+{
+    timx->CR1 |= TIM_CR1_OPM;
+}
+
+/**
+* @brief  禁止单脉冲模式
+* @param  timx TIM外设
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_onepulse_disable(TIM_t *timx)
+{
+    timx->CR1 &= (~TIM_CR1_OPM);
+}
+
+/**
+* @brief  获取单脉冲模式
+* @param  timx TIM外设
+* @retval uint32_t 返回单脉冲计数模式
+*             @arg 非0: 当前配置为单脉冲模式
+*             @arg 0:当前配置为连续计数模式
+*/
+__STATIC_INLINE uint32_t std_tim_get_onepulse_mode(TIM_t *timx)
+{
+    return (timx->CR1 & (TIM_CR1_OPM));
+}
+
+
+/**
+* @brief  设置计数时钟源参数
+* @param  timx TIM外设
+* @param  clock_source 时钟源选择
+*             @arg TIM_CLKSRC_INT:   内部时钟源
+*             @arg TIM_CLKSRC_MODE1: 外部时钟模式1
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_clock_source_config(TIM_t *timx, uint32_t clock_source)
+{
+    MODIFY_REG(timx->SMC, TIM_SMC_SM_SEL, clock_source);
+}
+
+
+/**
+* @brief  生成一个软件事件
+* @param  timx TIM外设
+* @param  event_src 事件源
+*             @arg TIM_EVENT_SRC_UPDATE:更新事件源
+*             @arg TIM_EVENT_SRC_CC1:   捕获比较1事件源
+*             @arg TIM_EVENT_SRC_CC2:   捕获比较2事件源
+*             @arg TIM_EVENT_SRC_CC3:   捕获比较3事件源
+*             @arg TIM_EVENT_SRC_CC4:   捕获比较4事件源
+*             @arg TIM_EVENT_SRC_COM:   换相事件源
+*             @arg TIM_EVENT_SRC_TRIG:  触发事件源
+*             @arg TIM_EVENT_SRC_BREAK: 断路事件源
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_set_sw_trig_event(TIM_t *timx, uint32_t event_src)
+{
+    timx->EVTG = event_src;
+}
+
+
+/** 
+* @brief  TIM中断使能
+* @param  timx TIM外设
+* @param  interrupt TIM中断源
+*             @arg TIM_INTERRUPT_UPDATE:  更新中断
+*             @arg TIM_INTERRUPT_CC1:     捕获/比较1中断
+*             @arg TIM_INTERRUPT_CC2:     捕获/比较2中断
+*             @arg TIM_INTERRUPT_CC3:     捕获/比较3中断
+*             @arg TIM_INTERRUPT_CC4:     捕获/比较4中断
+*             @arg TIM_INTERRUPT_COM:     换相中断
+*             @arg TIM_INTERRUPT_TRIG:    触发中断
+*             @arg TIM_INTERRUPT_BREAK:   断路中断
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_interrupt_enable(TIM_t *timx, uint32_t interrupt)    
+{
+    timx->DIER |= (interrupt);
+}
+
+/** 
+* @brief  TIM中断禁止
+* @param  timx TIM外设
+* @param  interrupt TIM中断源
+*             @arg TIM_INTERRUPT_UPDATE:  更新中断
+*             @arg TIM_INTERRUPT_CC1:     捕获/比较1中断
+*             @arg TIM_INTERRUPT_CC2:     捕获/比较2中断
+*             @arg TIM_INTERRUPT_CC3:     捕获/比较3中断
+*             @arg TIM_INTERRUPT_CC4:     捕获/比较4中断
+*             @arg TIM_INTERRUPT_COM:     换相中断
+*             @arg TIM_INTERRUPT_TRIG:    触发中断
+*             @arg TIM_INTERRUPT_BREAK:   断路中断
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_interrupt_disable(TIM_t *timx, uint32_t interrupt)   
+{
+    timx->DIER &= (~(interrupt));
+}
+
+
+/**
+* @brief  获取TIM中断源的状态
+* @param  timx TIM外设
+* @param  interrupt TIM中断源信息
+*             @arg TIM_INTERRUPT_UPDATE:  更新中断
+*             @arg TIM_INTERRUPT_CC1:     捕获/比较1中断
+*             @arg TIM_INTERRUPT_CC2:     捕获/比较2中断
+*             @arg TIM_INTERRUPT_CC3:     捕获/比较3中断
+*             @arg TIM_INTERRUPT_CC4:     捕获/比较4中断
+*             @arg TIM_INTERRUPT_COM:     换相中断
+*             @arg TIM_INTERRUPT_TRIG:    触发中断
+*             @arg TIM_INTERRUPT_BREAK:   断路中断
+* @retval uint32_t 返回中断请求源的状态 
+*/  
+__STATIC_INLINE uint32_t std_tim_get_interrupt_enable(TIM_t *timx, uint32_t interrupt)   
+{
+    return (timx->DIER & (interrupt));
+}
+
+
+/** 
+* @brief  获取TIM标志状态
+* @param  timx TIM外设
+* @param  flag TIM标志信息
+*             @arg TIM_FLAG_UPDATE:       更新事件标志
+*             @arg TIM_FLAG_CC1:          捕获/比较1事件标志
+*             @arg TIM_FLAG_CC2:          捕获/比较2事件标志
+*             @arg TIM_FLAG_CC3:          捕获/比较3事件标志
+*             @arg TIM_FLAG_CC4:          捕获/比较4事件标志
+*             @arg TIM_FLAG_COM:          换相事件标志
+*             @arg TIM_FLAG_TRIG:         触发事件标志
+*             @arg TIM_FLAG_BREAK:        断路事件标志
+*             @arg TIM_FLAG_CC1OF:        捕获/比较1重复捕获标志
+*             @arg TIM_FLAG_CC2OF:        捕获/比较2重复捕获标志
+*             @arg TIM_FLAG_CCX_ALL:      全通道捕获/比较事件标志
+*             @arg TIM_FLAG_ALL:          TIM事件标志
+* @retval uint32_t 返回标志的状态 
+*             @arg 非0: 当前标志为置起状态 
+*             @arg 0:当前标志为清除状态
+*/
+__STATIC_INLINE uint32_t std_tim_get_flag(TIM_t *timx, uint32_t flag)          
+{
+    return (timx->SR &(flag));
+}
+
+
+/** 
+* @brief  清除TIM标志
+* @param  timx TIM外设
+* @param  flag 清除TIM标志
+*             @arg TIM_FLAG_UPDATE:       更新事件标志
+*             @arg TIM_FLAG_CC1:          捕获/比较1事件标志
+*             @arg TIM_FLAG_CC2:          捕获/比较2事件标志
+*             @arg TIM_FLAG_CC3:          捕获/比较3事件标志
+*             @arg TIM_FLAG_CC4:          捕获/比较4事件标志
+*             @arg TIM_FLAG_COM:          换相事件标志
+*             @arg TIM_FLAG_TRIG:         触发事件标志
+*             @arg TIM_FLAG_BREAK:        断路事件标志
+*             @arg TIM_FLAG_CC1OF:        捕获/比较1重复捕获标志
+*             @arg TIM_FLAG_CC2OF:        捕获/比较2重复触发标志
+*             @arg TIM_FLAG_CCX_ALL:      全通道捕获/比较事件标志
+*             @arg TIM_FLAG_ALL:          TIM事件标志
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_clear_flag(TIM_t *timx, uint32_t flag)
+{
+    timx->SR = (~(flag));
+}
+
+
+/**
+* @brief  使能TIM比较/匹配通道
+* @param  timx TIM外设
+* @param  channel_id 指定TIM通道
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+*             @arg TIM_CHANNEL_3
+*             @arg TIM_CHANNEL_4
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_ccx_channel_enable(TIM_t *timx, uint32_t channel_id)
+{  
+    timx->CCEN |= (TIM_CCEN_CC1E << (channel_id << 2));
+}
+
+
+/**
+* @brief  禁止TIM比较/匹配通道
+* @param  timx TIM外设
+* @param  channel_id 指定TIM通道
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+*             @arg TIM_CHANNEL_3
+*             @arg TIM_CHANNEL_4
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_ccx_channel_disable(TIM_t *timx, uint32_t channel_id)
+{     
+    timx->CCEN &= (~(TIM_CCEN_CC1E << (channel_id << 2)));
+}
+
+
+/**
+* @brief  使能TIM互补输出通道
+* @param  timx TIM外设
+* @param  channel_id 指定TIM通道
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+*             @arg TIM_CHANNEL_3
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_ccxn_channel_enable(TIM_t *timx, uint32_t channel_id)
+{    
+    timx->CCEN |= (TIM_CCEN_CC1NE << (channel_id << 2));
+}
+
+
+/**
+* @brief  禁止TIM互补输出通道
+* @param  timx TIM外设
+* @param  channel_id 指定TIM通道
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+*             @arg TIM_CHANNEL_3
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_ccxn_channel_disable(TIM_t *timx, uint32_t channel_id)
+{ 
+    timx->CCEN &= (~(TIM_CCEN_CC1NE << (channel_id << 2)));
+}
+
+
+/**
+* @brief  配置TIM输入捕获通道极性
+* @param  timx TIM外设
+* @param  channel_id 指定TIM通道
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+* @param  input_capture_pol 输入极性
+*             @arg TIM_INPUT_POL_RISING
+*             @arg TIM_INPUT_POL_FALLING
+*             @arg TIM_INPUT_POL_BOTH
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_set_input_pol(TIM_t *timx, uint32_t channel_id, uint32_t input_capture_pol)
+{ 
+    MODIFY_REG(timx->CCEN, ((TIM_CCEN_CC1P | TIM_CCEN_CC1NP) << (channel_id << 2)), (input_capture_pol << (channel_id << 2)));
+}
+
+/**
+* @brief  获取TIM输入捕获通道极性
+* @param  timx TIM外设
+* @param  channel_id 指定TIM通道
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+* @retval uint32_t 输入极性
+*             @arg TIM_INPUT_POL_RISING
+*             @arg TIM_INPUT_POL_FALLING
+*             @arg TIM_INPUT_POL_BOTH
+*/
+__STATIC_INLINE uint32_t std_tim_get_input_pol(TIM_t *timx, uint32_t channel_id)
+{ 
+    return (((timx->CCEN) >> (channel_id << 2)) & (TIM_CCEN_CC1P | TIM_CCEN_CC1NP));
+}
+
+
+/**
+* @brief  配置TIM通道输出的极性
+* @param  timx TIM外设
+* @param  channel_id 指定TIM通道
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+*             @arg TIM_CHANNEL_3
+*             @arg TIM_CHANNEL_4
+* @param  output_commpare_pol 输出极性
+*             @arg TIM_OUTPUT_POL_HIGH
+*             @arg TIM_OUTPUT_POL_LOW
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_set_output_pol(TIM_t *timx, uint32_t channel_id, uint32_t output_commpare_pol)
+{ 
+    MODIFY_REG(timx->CCEN, (TIM_CCEN_CC1P << (channel_id << 2)), (output_commpare_pol << (channel_id << 2)));
+}
+
+/**
+* @brief  获取TIM通道输出的极性
+* @param  timx TIM外设
+* @param  channel_id 指定TIM通道
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+*             @arg TIM_CHANNEL_3
+*             @arg TIM_CHANNEL_4
+* @retval uint32_t 输出极性
+*             @arg TIM_OUTPUT_POL_HIGH
+*             @arg TIM_OUTPUT_POL_LOW
+*/
+__STATIC_INLINE uint32_t std_tim_get_output_pol(TIM_t *timx, uint32_t channel_id)
+{ 
+    return (((timx->CCEN) >> (channel_id << 2)) & TIM_CCEN_CC1P);
+}
+
+
+/**
+* @brief  配置TIM互补通道的输出极性
+* @param  timx TIM外设
+* @param  channel_id 指定TIM通道
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+*             @arg TIM_CHANNEL_3
+* @param  negtive_output_pol 互补通道的输出极性
+*             @arg TIM_OUTPUT_NEGTIVE_POL_HIGH
+*             @arg TIM_OUTPUT_NEGTIVE_POL_LOW
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_set_negtive_output_pol(TIM_t *timx, uint32_t channel_id, uint32_t negtive_output_pol)
+{ 
+    MODIFY_REG(timx->CCEN, (TIM_CCEN_CC1NP << (channel_id << 2)), (negtive_output_pol << (channel_id << 2)));
+}
+
+/**
+* @brief  获取TIM互补通道的输出极性
+* @param  timx TIM外设
+* @param  channel_id 指定TIM通道
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+*             @arg TIM_CHANNEL_3
+* @retval uint32_t 互补通道的输出极性
+*             @arg TIM_OUTPUT_NEGTIVE_POL_HIGH
+*             @arg TIM_OUTPUT_NEGTIVE_POL_LOW
+*/
+__STATIC_INLINE uint32_t std_tim_get_negtive_output_pol(TIM_t *timx, uint32_t channel_id)
+{ 
+    return (((timx->CCEN) >> (channel_id << 2)) & TIM_CCEN_CC1NP);
+}
+
+
+/**
+* @brief  配置TIM通道的空闲状态
+* @param  timx TIM外设
+* @param  channel_id 指定TIM通道
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+*             @arg TIM_CHANNEL_3
+*             @arg TIM_CHANNEL_4
+* @param  idle_state 通道空闲状态
+*             @arg TIM_OUTPUT_IDLE_RESET
+*             @arg TIM_OUTPUT_IDLE_SET
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_set_output_idlestate(TIM_t *timx, uint32_t channel_id, uint32_t idle_state)
+{ 
+    MODIFY_REG(timx->CR2, (TIM_CR2_OIS1 << (channel_id << 1)), (idle_state << (channel_id << 1)));
+}
+
+/**
+* @brief  获取TIM通道的空闲状态
+* @param  timx TIM外设
+* @param  channel_id 指定TIM通道
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+*             @arg TIM_CHANNEL_3
+*             @arg TIM_CHANNEL_4
+* @retval uint32_t 通道空闲状态
+*             @arg TIM_OUTPUT_IDLE_RESET
+*             @arg TIM_OUTPUT_IDLE_SET
+*/
+__STATIC_INLINE uint32_t std_tim_get_output_idlestate(TIM_t *timx, uint32_t channel_id)
+{ 
+    return (((timx->CR2) >> (channel_id << 1)) & TIM_CR2_OIS1);    
+}
+
+/**
+* @brief  配置TIM互补通道的空闲状态
+* @param  timx TIM外设
+* @param  channel_id 指定TIM通道
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+*             @arg TIM_CHANNEL_3
+* @param  negtive_idlestate 互补通道空闲状态
+*             @arg TIM_OUTPUT_NEGTIVE_IDLE_RESET
+*             @arg TIM_OUTPUT_NEGTIVE_IDLE_SET
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_set_negtive_output_idlestate(TIM_t *timx, uint32_t channel_id, uint32_t negtive_idlestate)
+{ 
+    MODIFY_REG(timx->CR2, (TIM_CR2_OIS1N << (channel_id << 1)), (negtive_idlestate << (channel_id << 1)));
+}
+
+/**
+* @brief  获取TIM互补通道的空闲状态
+* @param  timx TIM外设
+* @param  channel_id 指定TIM通道
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+*             @arg TIM_CHANNEL_3
+* @retval uint32_t 互补通道空闲状态
+*             @arg TIM_OUTPUT_NEGTIVE_IDLE_RESET
+*             @arg TIM_OUTPUT_NEGTIVE_IDLE_SET
+*/
+__STATIC_INLINE uint32_t std_tim_get_negtive_output_idlestate(TIM_t *timx, uint32_t channel_id)
+{ 
+    return (((timx->CR2) >> (channel_id << 1)) & TIM_CR2_OIS1N);        
+}
+
+/**
+* @brief  使能清除OCxREF功能
+* @param  timx TIM外设
+* @param  channel_id 指定TIM通道
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+*             @arg TIM_CHANNEL_3
+*             @arg TIM_CHANNEL_4
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_channel_clear_ocxref_enable(TIM_t *timx, uint32_t channel_id)
+{
+    uint32_t tmp_value = ((channel_id & 0x01) == 0)?0U:8U;
+    uint32_t shift_value = ((channel_id & 0x02) == 0)?0U:4U;    
+    __IO uint32_t *preg = (__IO uint32_t *)((uint32_t)(&timx->CCM1) + shift_value);
+    
+    /* 使能清除OCxREF */ 
+    *preg |= (TIM_CCM1_OC1CE << tmp_value);
+}
+
+/**
+* @brief  禁止清除OCxREF功能
+* @param  timx TIM外设
+* @param  channel_id 指定TIM通道
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+*             @arg TIM_CHANNEL_3
+*             @arg TIM_CHANNEL_4
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_channel_clear_ocxref_disable(TIM_t *timx, uint32_t channel_id)
+{
+    uint32_t tmp_value = ((channel_id & 0x01) == 0)?0U:8U;
+    uint32_t shift_value = ((channel_id & 0x02) == 0)?0U:4U;      
+    __IO uint32_t *preg = (__IO uint32_t *)((uint32_t)(&timx->CCM1) + shift_value);
+    
+    /* 禁止清除OCxREF */ 
+    *preg &= (~(TIM_CCM1_OC1CE << tmp_value));
+}
+
+/**
+* @brief  设置输入捕获预分频值
+* @param  timx TIM外设
+* @param  channel_id 指定TIM通道
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+* @param  icxpsc_num 输入捕获预分频值
+*             @arg TIM_INPUT_CAPTURE_PSC_DIV1
+*             @arg TIM_INPUT_CAPTURE_PSC_DIV2
+*             @arg TIM_INPUT_CAPTURE_PSC_DIV4
+*             @arg TIM_INPUT_CAPTURE_PSC_DIV8
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_set_channel_icxpsc(TIM_t *timx, uint32_t channel_id, uint32_t icxpsc_num)
+{
+    uint32_t tmp_value = ((channel_id & 0x01) == 0)?0U:8U;
+    uint32_t shift_value = ((channel_id & 0x02) == 0)?0U:4U;      
+    __IO uint32_t *preg = (__IO uint32_t *)((uint32_t)(&timx->CCM1) + shift_value);
+    
+    /* 设置输入捕获预分频 */ 
+    MODIFY_REG(*preg, (TIM_CCM1_IC1PSC << tmp_value), (icxpsc_num << tmp_value));
+}
+
+
+/**
+* @brief  获取输入捕获预分频值
+* @param  timx TIM外设
+* @param  channel_id 指定TIM通道
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+* @retval uint32_t 输入捕获预分频值
+*             @arg TIM_INPUT_CAPTURE_PSC_DIV1
+*             @arg TIM_INPUT_CAPTURE_PSC_DIV2
+*             @arg TIM_INPUT_CAPTURE_PSC_DIV4
+*             @arg TIM_INPUT_CAPTURE_PSC_DIV8
+*/
+__STATIC_INLINE uint32_t std_tim_get_channel_icxpsc(TIM_t *timx, uint32_t channel_id)
+{
+    uint32_t tmp_value = ((channel_id & 0x01) == 0)?0U:8U;
+    uint32_t shift_value = ((channel_id & 0x02) == 0)?0U:4U;        
+    __IO uint32_t *preg = (__IO uint32_t *)((uint32_t)(&timx->CCM1) + shift_value);
+    
+    /* 获取输入捕获预分频 */ 
+    return ((*preg >> tmp_value) & TIM_CCM1_IC1PSC);
+    
+}
+
+
+/**
+* @brief  使能TIM通道输出比较的预装载功能
+* @param  timx TIM外设
+* @param  channel_id 指定TIM通道
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+*             @arg TIM_CHANNEL_3
+*             @arg TIM_CHANNEL_4
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_preloadccx_channel_enable(TIM_t *timx, uint32_t channel_id)
+{ 
+    uint32_t tmp_value = ((channel_id & 0x01) == 0)?0U:8U;
+    uint32_t shift_value = ((channel_id & 0x02) == 0)?0U:4U;        
+    __IO uint32_t *preg = (__IO uint32_t *)((uint32_t)(&timx->CCM1) + shift_value);    
+ 
+    /* 使能输出比较预装载功能 */ 
+    *preg |= (TIM_CCM1_OC1PE << tmp_value);
+}
+
+
+/**
+* @brief  禁止TIM通道输出比较的预装载功能
+* @param  timx TIM外设
+* @param  channel_id 指定TIM通道
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+*             @arg TIM_CHANNEL_3
+*             @arg TIM_CHANNEL_4
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_preloadccx_channel_disable(TIM_t *timx, uint32_t channel_id)
+{ 
+    uint32_t tmp_value = ((channel_id & 0x01) == 0)?0U:8U;
+    uint32_t shift_value = ((channel_id & 0x02) == 0)?0U:4U;        
+    __IO uint32_t *preg = (__IO uint32_t *)((uint32_t)(&timx->CCM1) + shift_value);    
+ 
+    /* 使能输出比较预装载功能 */ 
+    *preg &= (~(TIM_CCM1_OC1PE << tmp_value));
+}
+
+
+/**
+* @brief  使能TIM通道快速模式
+* @param  timx TIM外设
+* @param  channel_id 指定TIM通道
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+*             @arg TIM_CHANNEL_3
+*             @arg TIM_CHANNEL_4
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_fastmode_channel_enable(TIM_t *timx, uint32_t channel_id)
+{ 
+    uint32_t tmp_value = ((channel_id & 0x01) == 0)?0U:8U;
+    uint32_t shift_value = ((channel_id & 0x02) == 0)?0U:4U;        
+    __IO uint32_t *preg = (__IO uint32_t *)((uint32_t)(&timx->CCM1) + shift_value);    
+ 
+    /* 使能输出比较预装载功能 */ 
+    *preg |= (TIM_CCM1_OC1FE << tmp_value);
+}
+
+
+/**
+* @brief  禁止TIM通道快速模式
+* @param  timx TIM外设
+* @param  channel_id 指定TIM通道
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+*             @arg TIM_CHANNEL_3
+*             @arg TIM_CHANNEL_4
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_fastmode_channel_disable(TIM_t *timx, uint32_t channel_id)
+{ 
+    uint32_t tmp_value = ((channel_id & 0x01) == 0)?0U:8U;
+    uint32_t shift_value = ((channel_id & 0x02) == 0)?0U:4U;        
+    __IO uint32_t *preg = (__IO uint32_t *)((uint32_t)(&timx->CCM1) + shift_value);    
+ 
+    /* 禁止输出快速模式 */ 
+    *preg &= (~(TIM_CCM1_OC1FE << tmp_value));
+}
+
+
+/**
+* @brief  配置通道输出模式
+* @param  timx TIM外设
+* @param  channel_id 指定TIM通道
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+*             @arg TIM_CHANNEL_3
+*             @arg TIM_CHANNEL_4
+* @param  ocmode 输出模式选择
+*             @arg TIM_OUTPUT_MODE_FROZEN         
+*             @arg TIM_OUTPUT_MODE_ACTIVE         
+*             @arg TIM_OUTPUT_MODE_INACTIVE       
+*             @arg TIM_OUTPUT_MODE_TOGGLE         
+*             @arg TIM_OUTPUT_MODE_FORCED_INACTIVE
+*             @arg TIM_OUTPUT_MODE_FORCED_ACTIVE  
+*             @arg TIM_OUTPUT_MODE_PWM1           
+*             @arg TIM_OUTPUT_MODE_PWM2                   
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_set_ocmode(TIM_t *timx, uint32_t channel_id, uint32_t ocmode)
+{
+    uint32_t tmp_value = ((channel_id & 0x01) == 0)?0U:8U;
+    uint32_t shift_value = ((channel_id & 0x02) == 0)?0U:4U;        
+    __IO uint32_t *preg = (__IO uint32_t *)((uint32_t)(&timx->CCM1) + shift_value);
+    
+    MODIFY_REG(*preg, ((TIM_CCM1_OC1M  | TIM_CCM1_CC1S) << tmp_value), (ocmode << tmp_value));
+}
+
+
+/**
+* @brief  获取通道输出模式
+* @param  timx TIM外设
+* @param  channel_id 指定TIM通道
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+*             @arg TIM_CHANNEL_3
+*             @arg TIM_CHANNEL_4
+* @note   该函数执行后,会将通道设置为输出模式
+* @retval uint32_t 输出模式选择
+*             @arg TIM_OUTPUT_MODE_FROZEN         
+*             @arg TIM_OUTPUT_MODE_ACTIVE         
+*             @arg TIM_OUTPUT_MODE_INACTIVE       
+*             @arg TIM_OUTPUT_MODE_TOGGLE         
+*             @arg TIM_OUTPUT_MODE_FORCED_INACTIVE
+*             @arg TIM_OUTPUT_MODE_FORCED_ACTIVE  
+*             @arg TIM_OUTPUT_MODE_PWM1           
+*             @arg TIM_OUTPUT_MODE_PWM2               
+*/
+__STATIC_INLINE uint32_t std_tim_get_ocmode(TIM_t *timx, uint32_t channel_id)
+{
+    uint32_t tmp_value = ((channel_id & 0x01) == 0)?0U:8U;
+    uint32_t shift_value = ((channel_id & 0x02) == 0)?0U:4U;    
+    __IO uint32_t *preg = (__IO uint32_t *)((uint32_t)(&timx->CCM1) + shift_value);
+
+    return ((*preg >> tmp_value) & TIM_CCM1_OC1M);
+}
+
+/**
+* @brief  设置捕获/比较寄存器的值
+* @param  timx TIM外设
+* @param  ccx_value 捕获比较寄存器的值
+* @param  channel_id TIM 通道配置
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+*             @arg TIM_CHANNEL_3
+*             @arg TIM_CHANNEL_4
+* @retval std_status_t 返回API执行结果
+*/
+__STATIC_INLINE void std_tim_set_ccx_value(TIM_t *timx, uint32_t channel_id, uint32_t ccx_value)
+{    
+    if ((timx->CR1 & TIM_CR1_MODE) != TIM_CR1_MODE)
+    {
+        __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)(&timx->CC1) + (channel_id << 2));
+        MODIFY_REG(*pReg, TIM_CC1_CC1, ccx_value);    
+    }
+    else
+    {
+        uint32_t tmp_value = ((channel_id & 0x02) == 0)?0U:8U;   
+        uint32_t shift_value = ((channel_id & 0x02) == 0)?0U:2U;          
+        __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)(&timx->CC1) + ((channel_id - shift_value) << 2));
+        MODIFY_REG(*pReg, (TIM3_CC1_CC1_MODE1 << tmp_value), (ccx_value << tmp_value));
+    }
+}
+
+
+/**
+* @brief  获取捕获/比较寄存器的值
+* @param  timx TIM外设
+* @param  channel_id TIM 通道配置
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+*             @arg TIM_CHANNEL_3
+*             @arg TIM_CHANNEL_4
+* @retval uint32_t 捕获比较寄存器的值
+*/
+__STATIC_INLINE uint32_t std_tim_get_ccx_value(TIM_t *timx, uint32_t channel_id)
+{
+    if ((timx->CR1 & TIM_CR1_MODE) != TIM_CR1_MODE)
+    {
+        __IO uint32_t *preg = (__IO uint32_t *)((uint32_t)(&timx->CC1) + (channel_id << 2));
+        return (*preg & TIM_CC1_CC1);
+    }
+    else
+    {
+        uint32_t tmp_value = ((channel_id & 0x02) == 0)?0U:8U;  
+        uint32_t shift_value = ((channel_id & 0x02) == 0)?0U:2U;     
+        __IO uint32_t *preg = (__IO uint32_t *)((uint32_t)(&timx->CC1) + ((channel_id - shift_value) << 2));
+        
+        return ((*preg >> tmp_value) & TIM3_CC1_CC1_MODE1);
+    }
+}
+
+
+/**
+* @brief  设置通道为输入模式
+* @param  timx TIM外设
+* @param  channel_id TIM 通道配置
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+* @param  icmode 输入模式选择
+*             @arg TIM_INPUT_CAPTURE_SEL_DIRECTTI
+*             @arg TIM_INPUT_CAPTURE_SEL_INDIRECTTI
+*             @arg TIM_INPUT_CAPTURE_SEL_TRC
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_set_icmode(TIM_t *timx, uint32_t channel_id, uint32_t icmode)
+{
+    uint32_t tmp_value = ((channel_id & 0x01) == 0)?0U:8U;
+    uint32_t shift_value = ((channel_id & 0x02) == 0)?0U:4U;        
+    __IO uint32_t *preg = (__IO uint32_t *)((uint32_t)(&timx->CCM1) + shift_value);
+    
+    MODIFY_REG(*preg, (TIM_CCM1_CC1S << tmp_value), (icmode << tmp_value));
+}
+
+/**
+* @brief  获取通道的输入状态
+* @param  timx TIM外设
+* @param  channel_id TIM 通道配置
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+* @retval uint32_t 输入模式选择
+*             @arg TIM_INPUT_CAPTURE_SEL_DIRECTTI
+*             @arg TIM_INPUT_CAPTURE_SEL_INDIRECTTI
+*             @arg TIM_INPUT_CAPTURE_SEL_TRC
+*/
+__STATIC_INLINE uint32_t std_tim_get_icmode(TIM_t *timx, uint32_t channel_id)
+{
+    uint32_t tmp_value = ((channel_id & 0x01) == 0)?0U:8U;
+    uint32_t shift_value = ((channel_id & 0x02) == 0)?0U:4U;        
+    __IO uint32_t *preg = (__IO uint32_t *)((uint32_t)(&timx->CCM1) + shift_value);
+    
+    return ((*preg >> tmp_value) & TIM_CCM1_CC1S);
+}
+
+/**
+* @brief  设置输入通道的滤波参数
+* @param  timx TIM外设
+* @param  channel_id TIM 通道配置
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+* @param  icfilter 输入滤波参数,其值的范围为:0x00~0x0F
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_set_icfilter(TIM_t *timx, uint32_t channel_id, uint32_t icfilter)
+{
+    uint32_t tmp_value = ((channel_id & 0x01) == 0)?0U:8U;
+    uint32_t shift_value = ((channel_id & 0x02) == 0)?0U:4U;        
+    __IO uint32_t *preg = (__IO uint32_t *)((uint32_t)(&timx->CCM1) + shift_value);
+    
+    MODIFY_REG(*preg, (TIM_CCM1_IC1F << tmp_value), ((icfilter << tmp_value) << 4U));
+}
+
+/**
+* @brief  获取输入通道的滤波参数
+* @param  timx TIM外设
+* @param  channel_id TIM 通道配置
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+* @retval uint32_t 输入滤波参数,其值的范围为:0x00~0x0F
+*/
+__STATIC_INLINE uint32_t std_tim_get_icfilter(TIM_t *timx, uint32_t channel_id)
+{
+    uint32_t tmp_value = ((channel_id & 0x01) == 0)?0U:8U;
+    uint32_t shift_value = ((channel_id & 0x02) == 0)?0U:4U;        
+    __IO uint32_t *preg = (__IO uint32_t *)((uint32_t)(&timx->CCM1) + shift_value);
+    
+    return (((*preg >> tmp_value) & TIM_CCM1_IC1F) >> 4U);
+}
+
+
+/**
+* @brief  设置主模式(TRIG_OUT)输出参数
+* @param  timx TIM外设
+* @param  trigout_mode 主模式输出参数定义
+*             @arg TIM_TRIG_OUT_RESET
+*             @arg TIM_TRIG_OUT_ENABLE
+*             @arg TIM_TRIG_OUT_UPDATE
+*             @arg TIM_TRIG_OUT_CC1      
+*             @arg TIM_TRIG_OUT_OC1REF   
+*             @arg TIM_TRIG_OUT_OC2REF   
+*             @arg TIM_TRIG_OUT_OC3REF   
+*             @arg TIM_TRIG_OUT_OC4REF
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_trigout_mode_config(TIM_t *timx, uint32_t trigout_mode)
+{
+    MODIFY_REG(timx->CR2, TIM_CR2_MM_SEL, trigout_mode);
+}
+
+
+/**
+* @brief  设置从模式参数
+* @param  timx TIM外设
+* @param  slave_mode 从模式参数定义
+*             @arg TIM_SLAVE_MODE_DISABLE 
+*             @arg TIM_SLAVE_MODE_RESET   
+*             @arg TIM_SLAVE_MODE_GATED   
+*             @arg TIM_SLAVE_MODE_TRIG    
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_slave_mode_config(TIM_t *timx, uint32_t slave_mode)
+{
+    MODIFY_REG(timx->SMC, TIM_SMC_SM_SEL, slave_mode);
+}
+
+/**
+* @brief  设置触发输入源
+* @param  timx TIM外设
+* @param  trig_source 触发输入源定义
+*             @arg TIM_TRIG_SOURCE_ITR0    
+*             @arg TIM_TRIG_SOURCE_TI1F_ED
+*             @arg TIM_TRIG_SOURCE_TI1FP1 
+*             @arg TIM_TRIG_SOURCE_TI2FP2  
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_trig_source_config(TIM_t *timx, uint32_t trig_source)
+{
+    MODIFY_REG(timx->SMC, TIM_SMC_TS, trig_source);
+}
+
+
+/**
+* @brief  使能主/从模式
+* @param  timx TIM外设
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_master_mode_enable(TIM_t *timx)
+{
+    timx->SMC |= TIM_SMC_MS_MOD;
+}
+
+
+/**
+* @brief  禁止主/从模式
+* @param  timx TIM外设
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_master_mode_disable(TIM_t *timx)
+{
+    timx->SMC &= (~TIM_SMC_MS_MOD);
+}
+
+
+/**
+* @brief  配置TIM OCREF CLEAR输入源
+* @param  timx TIM外设
+* @param  ocrefclr_source OCREF CLR源选择
+*             @arg TIM_CLEAR_INPUT_SRC_COMP1: OCREF CLR连接到COMP1
+*             @arg TIM_CLEAR_INPUT_SRC_COMP2: OCREF CLR连接到COMP2
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_ocrefclr_source_config(TIM_t *timx, uint32_t ocrefclr_source)
+{
+    MODIFY_REG(timx->CFG, TIM_CFG_OCREF_CLR, ocrefclr_source);
+}
+
+
+/**
+* @brief  使能输入捕获/输出比较换相预装载
+* @param  timx TIM外设
+* @note   该函数仅对互补通道有效
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_ccreload_enable(TIM_t *timx)
+{
+    timx->CR2 |= TIM_CR2_CC_PRECR;
+}
+
+/**
+* @brief  禁止输入捕获/输出比较换相预装载
+* @param  timx TIM外设
+* @note   该函数仅对互补通道有效
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_ccreload_disable(TIM_t *timx)
+{
+    timx->CR2 &= (~TIM_CR2_CC_PRECR);
+}
+
+
+/**
+* @brief  配置换相控制更新源选择
+* @param  timx TIM外设
+* @param  ccupdate_source 换相更新源
+*             @arg TIM_COM_SOFTWARE
+*             @arg TIM_COM_TRGI
+* @note   该函数仅对互补通道有效
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_cc_set_update_source(TIM_t *timx, uint32_t ccupdate_source)
+{
+    MODIFY_REG(timx->CR2, TIM_CR2_CCU_SEL, ccupdate_source);
+}
+
+
+
+/**
+* @brief  使能TI1的XOR功能
+* @param  timx TIM外设
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_ti1xor_enable(TIM_t *timx)
+{
+    timx->CR2 |= TIM_CR2_TI1_XOR_SEL;
+}
+
+
+/**
+* @brief  禁止TI1的XOR功能
+* @param  timx TIM外设
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_ti1xor_disable(TIM_t *timx)
+{
+    timx->CR2 &= (~TIM_CR2_TI1_XOR_SEL);
+}
+
+
+/**
+* @brief  配置TIM输入通道重映射功能
+* @param  timx TIM外设
+* @param  ti_sel 通道输入源选择参数
+*             @arg TIM_TIM3_TI1_GPIO:           TIM3 TI1连接到GPIO
+*             @arg TIM_TIM3_TI1_COMP1:          TIM3 TI1连接到COMP1输出
+*             @arg TIM_TIM3_TI2_GPIO:           TIM3 TI2连接到GPIO
+*             @arg TIM_TIM3_TI2_COMP2:          TIM3 TI2连接到COMP2输出
+* @param  channel_id TIM通道
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_set_channel_remap(TIM_t *timx, uint32_t ti_sel, uint32_t channel_id)
+{
+    MODIFY_REG(timx->TISEL, (TIM_TISEL_TI1_SEL << (channel_id << 3)), ti_sel);
+}
+
+
+
+/**
+* @brief  TIM输出使能
+* @param  timx TIM外设
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_moen_enable(TIM_t *timx)            
+{
+    timx->BDT |= (TIM_BDT_MOEN);
+}
+
+/**
+* @brief  TIM输出禁止
+* @param  timx TIM外设
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_moen_disable(TIM_t *timx)        
+{
+    timx->BDT &= (~TIM_BDT_MOEN);
+}
+
+/**
+* @brief  TIM自动输出使能
+* @param  timx TIM外设
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_aoen_enable(TIM_t *timx)            
+{
+    timx->BDT |= (TIM_BDT_AOEN);
+}
+
+/**
+* @brief  TIM自动输出禁止
+* @param  timx TIM外设
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_aoen_disable(TIM_t *timx)        
+{
+    timx->BDT &= (~TIM_BDT_AOEN);
+}
+
+
+/** 
+* @brief  使能OSSR功能
+* @param  timx TIM外设
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_ossr_enable(TIM_t *timx)                
+{
+    timx->BDT |= TIM_BDT_OSSR;
+}
+
+/** 
+* @brief  禁止OSSR功能
+* @param  timx TIM外设
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_ossr_disable(TIM_t *timx)                
+{
+    timx->BDT &= (~TIM_BDT_OSSR);
+}
+
+/** 
+* @brief  使能OSSI功能
+* @param  timx TIM外设
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_ossi_enable(TIM_t *timx)                
+{
+    timx->BDT |= TIM_BDT_OSSI;
+}
+
+/** 
+* @brief  禁止OSSI功能
+* @param  timx TIM外设
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_ossi_disable(TIM_t *timx)                
+{
+    timx->BDT &= (~TIM_BDT_OSSI);
+}
+
+
+/** 
+* @brief  使能TIM断路
+* @param  timx TIM外设
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_bken_enable(TIM_t *timx)                
+{
+    timx->BDT |= TIM_BDT_BKEN;
+}
+
+/** 
+* @brief  禁止TIM断路
+* @param  timx TIM外设
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_bken_disable(TIM_t *timx)                
+{
+    timx->BDT &= (~TIM_BDT_BKEN);
+}
+
+
+/** 
+* @brief  使能断路源
+* @param  timx TIM外设
+* @param  brk_source 断路输入源定义
+*             @arg TIM_BREAK_INPUT_SRC_GPIO
+*             @arg TIM_BREAK_INPUT_SRC_COMP1
+*             @arg TIM_BREAK_INPUT_SRC_COMP2
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_brk_source_enable(TIM_t *timx, uint32_t brk_source)
+{
+    timx->AF1 |= brk_source;
+}
+
+
+/** 
+* @brief  配置断路的极性
+* @param  timx TIM外设
+* @param  brk_source 断路输入源定义
+*             @arg TIM_BREAK_INPUT_SRC_GPIO
+*             @arg TIM_BREAK_INPUT_SRC_COMP1
+*             @arg TIM_BREAK_INPUT_SRC_COMP2
+* @param  brk_pol 断路输入极性定义
+*             @arg TIM_BREAK_INPUT_POL_HIGH
+*             @arg TIM_BREAK_INPUT_POL_LOW
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_set_brk_pol(TIM_t *timx, uint32_t brk_source, uint32_t brk_pol)
+{   
+    MODIFY_REG(timx->AF1, (TIM1_AF1_BKINP << (brk_source >> 1U)), (brk_pol << (brk_source >> 1U)));
+}
+
+
+/**
+* @brief  配置TIM死区时间
+* @param  timx TIM外设
+* @param  deadtime 死区时间,该值的范围:0x00~0xFF
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_set_deadtime(TIM_t *timx, uint32_t deadtime)
+{
+    MODIFY_REG(timx->BDT, TIM_BDT_DTG, deadtime);
+}
+
+
+/**
+* @brief  获取TIM死区时间
+* @param  timx TIM外设
+* @retval uint32_t 死区时间,其值范围为:0x00~0xFF
+*/
+__STATIC_INLINE uint32_t std_tim_get_deadtime(TIM_t *timx)
+{
+    return (timx->BDT & TIM_BDT_DTG);
+}
+
+
+/**
+* @brief  配置TIM的锁定级别
+* @param  timx TIM外设
+* @param  locklevel LOCK锁定级别
+*             @arg TIM_LOCK_LEVEL_OFF
+*             @arg TIM_LOCK_LEVEL1
+*             @arg TIM_LOCK_LEVEL2
+*             @arg TIM_LOCK_LEVEL3
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_set_locklevel(TIM_t *timx, uint32_t locklevel)
+{
+    MODIFY_REG(timx->BDT, TIM_BDT_LOCK, locklevel);
+}
+
+
+/**
+* @brief  获取TIM锁定级别
+* @param  timx TIM外设
+* @retval uint32_t LOCK锁定级别
+*             @arg TIM_LOCK_LEVEL_OFF
+*             @arg TIM_LOCK_LEVEL1
+*             @arg TIM_LOCK_LEVEL2
+*             @arg TIM_LOCK_LEVEL3
+*/
+__STATIC_INLINE uint32_t std_tim_get_locklevel(TIM_t *timx)
+{
+    return (timx->BDT & TIM_BDT_LOCK);
+}
+
+
+/** 
+* @brief  使能LOCKUP锁定功能
+* @param  timx TIM外设
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_lockup_lock_enable(TIM_t *timx)
+{
+    timx->AF1 |= TIM1_AF1_LOCKUP_LOCK;
+}
+
+
+
+
+/* 基础计数功能初始化/去初始化 */
+void std_tim_deinit(TIM_t *timx);
+void std_tim_init(TIM_t *timx, std_tim_basic_init_t *tim_init_param);
+void std_tim_struct_init(std_tim_basic_init_t *tim_init_struct);
+
+/* 输入捕获初始化 */
+void std_tim_input_capture_init(TIM_t *timx, std_tim_input_capture_init_t *input_config, uint32_t channel_id);
+void std_tim_input_capture_struct_init(std_tim_input_capture_init_t *input_init_struct);
+
+/* 输出模式初始化及参数配置函数 */
+void std_tim_output_compare_init(TIM_t *timx, std_tim_output_compare_init_t *output_config, uint32_t channel_id);
+void std_tim_output_compare_struct_init(std_tim_output_compare_init_t *output_init_struct);
+
+/* 断路功能初始化 */
+void std_tim_bdt_init(TIM_t* timx, std_tim_break_init_t *bdt_init_param);
+void std_tim_bdt_struct_init(std_tim_break_init_t *bdt_init_struct);
+
+
+/**
+* @}
+*/
+
+#ifdef __cplusplus
+}
+#endif
+/**
+* @}
+*/
+
+/**
+* @}
+*/
+#endif /* CIU32F003_STD_TIM_H */
+

+ 1822 - 0
CIU32F003_LIB/Include/ciu32f003_std_tim(2).h

@@ -0,0 +1,1822 @@
+/************************************************************************************************/
+/**
+* @file               ciu32f003_std_tim.h          
+* @author             MCU Ecosystem Development Team
+* @brief              TIM STD库驱动头文件。
+*                     提供TIM相关的STD库操作函数声明、数据类型以及常量的定义。 
+* 
+*
+**************************************************************************************************
+* @attention
+* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
+*
+**************************************************************************************************
+*/
+
+/*避免头文件重复引用*/
+#ifndef CIU32F003_STD_TIM_H
+#define CIU32F003_STD_TIM_H
+
+/************************************************************************************************/
+/**
+* @addtogroup CIU32F003_STD_Driver
+* @{
+*/
+
+/**
+* @defgroup TIM TIM
+* @brief    高级控制定时器/通用定时器的STD库驱动
+* @{
+*
+*/
+/************************************************************************************************/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*------------------------------------------includes--------------------------------------------*/
+#include "ciu32f003_std_common.h"
+
+
+/*-----------------------------------------type define------------------------------------------*/
+
+/************************************************************************************************/
+/** 
+* @defgroup TIM_Types TIM Types
+* @brief    TIM数据类型定义
+* @{
+*/
+/************************************************************************************************/
+
+/**
+* @brief  TIM基本参数配置结构体定义
+*/
+typedef struct
+{    
+    uint32_t prescaler;              /**< TIM时钟的预分频参数                               
+                                              @note TIM1预分频参数范围为:0x0000~0xFFFF    
+                                                    TIM3预分频参数范围为:0x0000~0x000F                    */
+                                   
+    uint32_t counter_mode;           /**< 计数器模式选择
+                                              @arg TIM_COUNTER_MODE_UP ...                                 */
+                                   
+    uint32_t period;                 /**< 在下次更新事件时加载到自动重新加载寄存器中的溢出值
+                                          其值必须在0x0000~0xFFFF之间                                      */
+                                   
+    uint32_t clock_div;              /**< TIM时钟分频参数
+                                              @arg TIM_CLOCK_DTS_DIV1 ...                                  */
+                                   
+    uint8_t repeat_counter;         /**< 重复计数器参数定义,每当RCR向下计数达到0时,会产出一个更新事件,
+                                         并从RCR的值(N)开始重新计数,该参数必须在0x0000~0x00FF之间。       */
+                                   
+}std_tim_basic_init_t;
+
+
+/**
+* @brief  TIM输入捕获参数配置结构体定义
+*/
+typedef struct
+{
+    uint32_t  input_capture_pol;         /**< 输入信号的有效边沿选择                           
+                                                  @arg TIM_INPUT_POL_RISING ...                */
+                                
+    uint32_t input_capture_sel;          /**< 输入模式定义
+                                                  @arg TIM_INPUT_CAPTURE_SEL_DIRECTTI ...      */
+                                
+    uint32_t input_capture_prescaler;    /**< 输入捕获预分频定义
+                                                  @arg TIM_INPUT_CAPTURE_PSC_DIV1 ...          */
+                                
+    uint32_t input_capture_filter;       /**< 输入捕获滤波器定义,其值必须在0x0~0x7之间        */
+    
+}std_tim_input_capture_init_t;      
+
+
+/**
+* @brief  TIM输出比较参数配置结构体定义
+*/
+typedef struct
+{
+    uint32_t output_compare_mode;        /**< TIM输出比较模式定义
+                                                  @arg TIM_OUTPUT_MODE_ACTIVE ...                           */
+    
+    uint32_t output_state;               /**< 输出使能定义                                               
+                                                  @arg TIM_OUTPUT_DISABLE ...                               */
+ 
+    uint32_t output_negtive_state;       /**< 互补输出使能定义                                               
+                                                  @arg TIM_OUTPUT_NEGTIVE_DISABLE ...                       */
+                                   
+    uint32_t pulse;                      /**< TIM载入捕获比较寄存器的脉冲值,其值必须在0x0000~0xFFFF之间    */    
+                                   
+    uint32_t output_pol;                 /**< 输出极性定义
+                                                  @arg TIM_OUTPUT_POL_HIGH ...                              */
+                                   
+    uint32_t output_negtive_pol;         /**< 互补输出极性定义
+                                                  @arg TIM_OUTPUT_NEGTIVE_POL_HIGH ...                      */                                                                     
+                                   
+    uint32_t output_idle_state;          /**< TIM空闲状态下输出状态定义
+                                                  @arg  TIM_OUTPUT_IDLE_SET ...
+                                                  @note 该参数仅对支持Break功能的定时器实例有效             */
+                                   
+    uint32_t output_negtive_idle_state;  /**< TIM空闲状态下互补输出状态定义
+                                                  @arg  TIM_OUTPUT_NEGTIVE_IDLE_SET ...
+                                                  @note 该参数仅对支持Break功能的定时器实例有效             */
+    
+}std_tim_output_compare_init_t;
+
+
+/**
+* @brief  TIM断路输入和死区参数配置结构体定义
+*/
+typedef struct
+{
+    uint32_t off_state_run_mode;                        /**< 运行模式下的关闭状态
+                                                                 @arg TIM_OSSR_ENABLE ...            */
+    
+    uint32_t off_state_idle_mode;                       /**< 空闲模式下的关闭状态
+                                                                 @arg TIM_OSSI_ENABLE ...            */
+    
+    uint32_t lock_level;                                /**< LOCK级别
+                                                                 @arg TIM_LOCK_LEVEL1 ...            */  
+    
+    uint32_t dead_time;                                 /**< 死区参数定义,其值必须在0x00~0xFF之间   */
+       
+    uint32_t break_state;                              /**< 断路功能使能控制
+                                                                  @arg TIM_BREAK_ENABLE
+                                                                  @arg TIM_BREAK_DISABLE             */ 
+    
+}std_tim_break_init_t;
+
+
+
+/**
+* @}
+*/
+  
+/*--------------------------------------------define--------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @defgroup TIM_Constants TIM Constants 
+* @brief    TIM常量定义及宏定义
+* @{
+*
+*/
+/************************************************************************************************/
+/* TIM计数模式定义 */
+#define TIM_COUNTER_MODE_UP                (0x00000000U)                      /**< 向上计数                      */
+#define TIM_COUNTER_MODE_DOWN              TIM_CR1_DIR                        /**< 向下计数                      */
+#define TIM_COUNTER_MODE_CENT_MODE1        TIM_CR1_CMS_CENTER_UP              /**< 中心对齐模式1                 */
+#define TIM_COUNTER_MODE_CENT_MODE2        TIM_CR1_CMS_CENTER_DOWN            /**< 中心对齐模式2                 */
+#define TIM_COUNTER_MODE_CENT_MODE3        TIM_CR1_CMS_CENTER_UP_DOWN         /**< 中心对齐模式3                 */
+
+/* TIM更新事件源选择 */
+#define TIM_UPDATE_SOURCE_REGULAR          (0x00000000U)                      /**< 计数上溢或下溢触发                       */
+#define TIM_UPDATE_SOURCE_COUNTER          TIM_CR1_URS                        /**< 计数上溢或下溢、UG置位、从模式控制器触发  */
+
+/* TIM时钟分频 */
+#define TIM_CLOCK_DTS_DIV1                 (0x00000000U)                      /**< tDTS=tTIMx_KCLK          */
+#define TIM_CLOCK_DTS_DIV2                 TIM_CR1_CLK_DIV2                   /**< tDTS=2*tTIMx_KCLK        */
+#define TIM_CLOCK_DTS_DIV4                 TIM_CR1_CLK_DIV4                   /**< tDTS=4*tTIMx_KCLK        */
+
+/* TIM通道定义 */
+#define TIM_CHANNEL_1                      (0x00U)                            /**< 通道1定义            */
+#define TIM_CHANNEL_2                      (0x01U)                            /**< 通道2定义            */
+#define TIM_CHANNEL_3                      (0x02U)                            /**< 通道3定义            */
+#define TIM_CHANNEL_4                      (0x03U)                            /**< 通道4定义            */
+
+/* TIM输入通道极性定义 */
+#define TIM_INPUT_POL_RISING               (0x00000000U)                        /**< 未反向/上升沿触发             */
+#define TIM_INPUT_POL_FALLING              TIM_CCEN_CC1P                        /**< 反向/下降沿触发               */
+#define TIM_INPUT_POL_BOTH                 (TIM_CCEN_CC1P | TIM_CCEN_CC1NP)     /**< 未反向/上升下降均触发         */
+
+/* TIM输入捕获选择 */
+#define TIM_INPUT_CAPTURE_SEL_DIRECTTI         TIM_CCM1_CC1S_DIRECTTI             /**< TIM输入1, 2, 3 or 4,且被映射到IC1, IC2, IC3 or IC4(一一对应) */
+#define TIM_INPUT_CAPTURE_SEL_INDIRECTTI       TIM_CCM1_CC1S_INDIRECTTI           /**< TIM输入1, 2, 3 or 4,且被映射到IC2, IC1, IC4 or IC3(一一对应) */
+#define TIM_INPUT_CAPTURE_SEL_TRC              TIM_CCM1_CC1S_TRC                  /**< TIM输入1, 2, 3 or 4,且被映射到TRC                              */
+
+/* TIM输入捕获预分频参数定义 */
+#define TIM_INPUT_CAPTURE_PSC_DIV1             (0x00000000U)                      /**< 无预分频器,捕获输入上每检测到一个边沿便执行捕获 */
+#define TIM_INPUT_CAPTURE_PSC_DIV2             TIM_CCM1_IC1PSC_DIV2               /**< 每发生2个事件执行一次捕获        */
+#define TIM_INPUT_CAPTURE_PSC_DIV4             TIM_CCM1_IC1PSC_DIV4               /**< 每发生4个事件执行一次捕获        */
+#define TIM_INPUT_CAPTURE_PSC_DIV8             TIM_CCM1_IC1PSC_DIV8               /**< 每发生8个事件执行一次捕获        */
+
+/* TIM输出比较极性定义 */
+#define TIM_OUTPUT_POL_HIGH                (0x00000000U)                      /**< 比较输出极性:高电平为有效电平      */
+#define TIM_OUTPUT_POL_LOW                 TIM_CCEN_CC1P                      /**< 比较输出极性:低电平为有效电平      */
+
+/* TIM输出比较输出使能定义 */
+#define TIM_OUTPUT_DISABLE                 (0x00000000U)                      /**< 比较通道输出禁止                    */
+#define TIM_OUTPUT_ENABLE                  TIM_CCEN_CC1E                      /**< 比较通道输出使能                    */
+
+/* TIM输出比较参数定义*/   
+#define TIM_OUTPUT_MODE_FROZEN                  (0x00000000U)                                /**< 冻结                          */
+#define TIM_OUTPUT_MODE_ACTIVE                  TIM_CCM1_OC1M_ACTIVE                         /**< 通道1设置为匹配时输出有效电平 */
+#define TIM_OUTPUT_MODE_INACTIVE                TIM_CCM1_OC1M_INACTIVE                       /**< 通道1设置为匹配时输出无效电平 */
+#define TIM_OUTPUT_MODE_TOGGLE                  TIM_CCM1_OC1M_TOGGLE                         /**< 翻转                          */
+#define TIM_OUTPUT_MODE_FORCED_INACTIVE         TIM_CCM1_OC1M_FORCED_INACTIVE                /**< 强制变为无效电平              */
+#define TIM_OUTPUT_MODE_FORCED_ACTIVE           TIM_CCM1_OC1M_FORCED_ACTIVE                  /**< 强制变为有效电平              */
+#define TIM_OUTPUT_MODE_PWM1                    TIM_CCM1_OC1M_PWM1                           /**< PWM模式1                      */
+#define TIM_OUTPUT_MODE_PWM2                    TIM_CCM1_OC1M_PWM2                           /**< PWM模式2                      */
+
+/*  TIM时钟源选择 */ 
+#define TIM_CLKSRC_INT                     (0x00000000U)                      /**< TIM时钟源:内部时钟           */
+#define TIM_CLKSRC_MODE1                   TIM_SMC_SM_SEL_EXT_MODE1           /**< TIM时钟源:外部时钟源模式1    */
+
+/* TIM时钟极性定义 */
+#define TIM_CLK_TIX_POL_RISING             (0x00000000U)                      /**< TIx时钟源的极性:上升沿有效   */
+#define TIM_CLK_TIX_POL_FALLING            TIM_CCEN_CC1P                      /**< TIx时钟源的极性:下降沿有效   */
+#define TIM_CLK_TIX_POL_BOTH               (TIM_CCEN_CC1P | TIM_CCEN_CC1NP)   /**< TIx时钟源的极性:双沿有效     */
+
+/* TIM事件源 */
+#define TIM_EVENT_SRC_UPDATE               TIM_EVTG_UG                       /**< 重新初始化计数器并生成一个更新事件      */
+#define TIM_EVENT_SRC_CC1                  TIM_EVTG_CC1G                     /**< 在通道1上生成一个捕获/比较事件          */
+#define TIM_EVENT_SRC_CC2                  TIM_EVTG_CC2G                     /**< 在通道2上生成一个捕获/比较事件          */ 
+#define TIM_EVENT_SRC_CC3                  TIM_EVTG_CC3G                     /**< 在通道3上生成一个捕获/比较事件          */ 
+#define TIM_EVENT_SRC_CC4                  TIM_EVTG_CC4G                     /**< 在通道4上生成一个捕获/比较事件          */ 
+#define TIM_EVENT_SRC_COM                  TIM_EVTG_COMG                     /**< 生成一个换相事件                        */
+#define TIM_EVENT_SRC_TRIG                 TIM_EVTG_TG                       /**< 生成一个触发事件                        */
+#define TIM_EVENT_SRC_BREAK                TIM_EVTG_BG                       /**< 生成一个断路事件                        */
+
+/* TIM中断定义 */
+#define TIM_INTERRUPT_UPDATE               TIM_DIER_UIE                       /**< 更新中断                */
+#define TIM_INTERRUPT_CC1                  TIM_DIER_CC1IE                     /**< 捕获/比较1中断          */
+#define TIM_INTERRUPT_CC2                  TIM_DIER_CC2IE                     /**< 捕获/比较1中断2         */
+#define TIM_INTERRUPT_CC3                  TIM_DIER_CC3IE                     /**< 捕获/比较1中断3         */
+#define TIM_INTERRUPT_CC4                  TIM_DIER_CC4IE                     /**< 捕获/比较1中断4         */
+#define TIM_INTERRUPT_COM                  TIM_DIER_COMIE                     /**< 换相中断                */
+#define TIM_INTERRUPT_TRIG                 TIM_DIER_TIE                       /**< 触发中断                */
+#define TIM_INTERRUPT_BREAK                TIM_DIER_BIE                       /**< 断路中断                */
+
+/* TIM标志定义 */
+#define TIM_FLAG_UPDATE                    TIM_SR_UIF                         /**< 更新中断标志              */
+#define TIM_FLAG_CC1                       TIM_SR_CC1IF                       /**< 捕获/比较1事件标志        */
+#define TIM_FLAG_CC2                       TIM_SR_CC2IF                       /**< 捕获/比较2事件标志        */
+#define TIM_FLAG_CC3                       TIM_SR_CC3IF                       /**< 捕获/比较3事件标志        */
+#define TIM_FLAG_CC4                       TIM_SR_CC4IF                       /**< 捕获/比较4事件标志        */
+#define TIM_FLAG_COM                       TIM_SR_COMIF                       /**< 换相事件标志              */
+#define TIM_FLAG_TRIG                      TIM_SR_TIF                         /**< 触发事件标志              */
+#define TIM_FLAG_BREAK                     TIM_SR_BIF                         /**< 断路事件标志              */
+#define TIM_FLAG_CC1OF                     TIM_SR_CC1OF                       /**< 捕获/比较1重复捕获标志    */
+#define TIM_FLAG_CC2OF                     TIM_SR_CC2OF                       /**< 捕获/比较2重复捕获标志    */
+
+#define TIM_FLAG_ALL                       (0xFFFF)                           /**< TIM事件标志               */
+#define TIM_FLAG_CCX_ALL                   (0x001E)                           /**< 全通道捕获/比较事件标志   */
+
+/* TIM清除OCxREF输出的输入源 */                               
+#define TIM_CLEAR_INPUT_SRC_COMP1          (0x00000000U)                    /**< OCREF_CLR_INPUT连接到COMP1的输出  */
+#define TIM_CLEAR_INPUT_SRC_COMP2          TIM_CFG_OCREF_CLR                /**< OCREF_CLR_INPUT连接到COMP2的输出  */
+
+/* TIM换相事件源 */
+#define TIM_COM_SOFTWARE                  (0x00000000U)                      /**< 如果捕获/比较控制位进行预装载(CCPC=1),仅通过将COMG位置1触发换相事件               */
+#define TIM_COM_TRGI                      TIM_CR2_CCU_SEL                    /**< 如果捕获/比较控制位进行预装载(CCPC=1),可通过将COMG位置1或TRIG的上升沿触发换相事件 */
+
+/* TIM主模式选择(TRIG_OUT)参数定义*/
+#define TIM_TRIG_OUT_RESET                 (0x00000000U)                         /**< TIM1_EVTG寄存器中的UG位用作触发输出(TRIG_OUT)  */
+#define TIM_TRIG_OUT_ENABLE                TIM_CR2_MM_SEL_ENABLE                 /**< 计数器使能信号CEN用作触发输出(TRIG_OUT)        */
+#define TIM_TRIG_OUT_UPDATE                TIM_CR2_MM_SEL_UPDATE                 /**< 选择更新事件作为触发输出(TRIG_OUT)             */
+#define TIM_TRIG_OUT_CC1                   TIM_CR2_MM_SEL_CC1IF                  /**< 捕获或比较匹配,触发输出(TRIG_OUT)             */
+#define TIM_TRIG_OUT_OC1REF                TIM_CR2_MM_SEL_OC1REF                 /**< OC1REF信号用作触发输出(TRIG_OUT)                 */
+#define TIM_TRIG_OUT_OC2REF                TIM_CR2_MM_SEL_OC2REF                 /**< OC2REF信号用作触发输出(TRIG_OUT)                 */
+#define TIM_TRIG_OUT_OC3REF                TIM_CR2_MM_SEL_OC3REF                 /**< OC3REF信号用作触发输出(TRIG_OUT)                 */
+#define TIM_TRIG_OUT_OC4REF                TIM_CR2_MM_SEL_OC4REF                 /**< OC4REF信号用作触发输出(TRIG_OUT)                 */
+
+/* TIM从模式参数定义*/
+#define TIM_SLAVE_MODE_DISABLE             (0x00000000U)                              /**< 禁止从模式          */
+#define TIM_SLAVE_MODE_RESET               TIM_SMC_SM_SEL_RESET                       /**< 复位模式            */
+#define TIM_SLAVE_MODE_GATED               TIM_SMC_SM_SEL_GATED                       /**< 门控模式            */
+#define TIM_SLAVE_MODE_TRIG                TIM_SMC_SM_SEL_TRIG                        /**< 触发模式            */
+
+/* TIM触发选择参数定义*/
+#define TIM_TRIG_SOURCE_ITR0               TIM_SMC_TS_ITR0                              /**< 内部触发0(ITR0)               */
+#define TIM_TRIG_SOURCE_TI1F_ED            TIM_SMC_TS_TI1F_ED                           /**< TI1边沿检测器(TI1F_ED)        */
+#define TIM_TRIG_SOURCE_TI1FP1             TIM_SMC_TS_TI1FP1                            /**< 滤波后的定时器输入1(TI1FP1)   */
+#define TIM_TRIG_SOURCE_TI2FP2             TIM_SMC_TS_TI2FP2                            /**< 滤波后的定时器输入2(TI1FP2)   */
+
+/* TIM触发极性参数定义*/
+#define TIM_TRIG_TIX_POL_RISING            (0x00000000U)                        /**< TIxFPx或TI1F_ED触发极性:高电平或上升沿有效   */
+#define TIM_TRIG_TIX_POL_FALLING           TIM_CCEN_CC1P                        /**< TIxFPx或TI1F_ED触发极性:低电平或下降沿有效   */
+#define TIM_TRIG_TIX_POL_BOTH              (TIM_CCEN_CC1P | TIM_CCEN_CC1NP)     /**< TIxFPx或TI1F_ED触发极性:上升下降均触发       */
+                                                                                       
+/* TIM输出比较互补输出极性定义 */
+#define TIM_OUTPUT_NEGTIVE_POL_HIGH        (0x00000000U)                      /**< 互补输出极性为高电平有效      */
+#define TIM_OUTPUT_NEGTIVE_POL_LOW         TIM_CCEN_CC1NP                     /**< 互补输出极性为低电平有效      */
+
+/* TIM输出比较互补输出使能定义 */
+#define TIM_OUTPUT_NEGTIVE_DISABLE         (0x00000000U)                      /**< 互补输出通道输出禁止          */
+#define TIM_OUTPUT_NEGTIVE_ENABLE          TIM_CCEN_CC1NE                     /**< 互补输出通道输出使能          */
+
+/* TIM空闲状态下输出状态定义 */
+#define TIM_OUTPUT_IDLE_RESET              (0x00000000U)                      /**< 空闲状态为: 当MOEN=0时OCx输出低电平   */
+#define TIM_OUTPUT_IDLE_SET                TIM_CR2_OIS1                       /**< 空闲状态为: 当MOEN=0时OCx输出高电平   */
+
+/* TIM空闲状态下互补输出状态定义 */
+#define TIM_OUTPUT_NEGTIVE_IDLE_RESET      (0x00000000U)                      /**< 互补输出空闲状态为: 当MOEN=0时OCxN输出低电平  */
+#define TIM_OUTPUT_NEGTIVE_IDLE_SET        TIM_CR2_OIS1N                      /**< 互补输出空闲状态为: 当MOEN=0时OCxN输出高电平  */
+
+/* TIM运行模式下关闭状态选择参数定义 */                                         
+#define TIM_OSSR_DISABLE                   (0x00000000U)               /**< 处于无效状态时,OC/OCN输出禁止(不再受定时器控制)     */
+#define TIM_OSSR_ENABLE                    TIM_BDT_OSSR                /**< 处于无效状态时,OC/OCN输出使能(仍然受定时器控制)     */
+                                                                               
+/* TIM空闲模式下关闭状态选择参数定义 */                                         
+#define TIM_OSSI_DISABLE                   (0x00000000U)               /**< 处于无效状态时,OC/OCN输出禁止(不再受定时器控制)     */
+#define TIM_OSSI_ENABLE                    TIM_BDT_OSSI                /**< 处于无效状态时,OC/OCN输出使能(仍然受定时器控制)     */
+
+/* TIM锁级别定义*/
+#define TIM_LOCK_LEVEL_OFF                 (0x00000000U)                      /**< 锁级别0         */
+#define TIM_LOCK_LEVEL1                    TIM_BDT_LOCK_LEVEL1                /**< 锁级别1         */
+#define TIM_LOCK_LEVEL2                    TIM_BDT_LOCK_LEVEL2                /**< 锁级别2         */
+#define TIM_LOCK_LEVEL3                    TIM_BDT_LOCK_LEVEL3                /**< 锁级别3         */
+
+/* TIM断路输入使能*/                                                            
+#define TIM_BREAK_DISABLE                  (0x00000000U)                      /**< 禁止断路输入    */
+#define TIM_BREAK_ENABLE                   TIM_BDT_BKEN                       /**< 使能断路输入    */                                                                              
+                                                                              
+/* TIM断路输入源定义 */                                                       
+#define TIM_BREAK_INPUT_SRC_GPIO           TIM1_AF1_BKINE                      /**< GPIO接到BKIN引脚上          */    
+#define TIM_BREAK_INPUT_SRC_COMP1          TIM1_AF1_BKCMP1E                    /**< COMP1输出接到断路输入       */
+#define TIM_BREAK_INPUT_SRC_COMP2          TIM1_AF1_BKCMP2E                    /**< COMP2输出接到断路输入       */       
+  
+/* TIM断路输入极性定义 */                                                                                                    
+#define TIM_BREAK_INPUT_POL_HIGH           TIM1_AF1_BKINP                      /**< 断路输入源为高电平      */
+#define TIM_BREAK_INPUT_POL_LOW            (0x00000000U)                       /**< 断路输入源为低电平      */ 
+                                                                                                                                                                              
+/* TIM外部时钟输入选择  */                                                                                                                                                    
+#define TIM_TIM3_TI1_GPIO                  TIM_TISEL_TI1_SEL_CH1                      /**< TIM3_TI1连接到GPIO       */
+#define TIM_TIM3_TI1_COMP1                 TIM_TISEL_TI1_SEL_COMP1                    /**< TIM3_TI1连接到COMP1输出  */    
+                                                                                       
+#define TIM_TIM3_TI2_GPIO                  TIM_TISEL_TI2_SEL_CH2                      /**< TIM3_TI2连接到GPIO       */  
+#define TIM_TIM3_TI2_COMP2                 TIM_TISEL_TI2_SEL_COMP2                    /**< TIM3_TI2连接到COMP2输出  */                                                                                                                                                 
+
+
+/**
+* @}
+*/
+
+
+/*-------------------------------------------functions------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @defgroup TIM_External_Functions TIM External Functions
+* @brief    TIM对外函数
+* @{
+*
+*/
+/************************************************************************************************/
+/**
+* @brief  TIM启动计数
+* @param  timx TIM外设
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_enable(TIM_t *timx)
+{
+    timx->CR1 |= TIM_CR1_CEN;    
+}
+
+/**
+* @brief  TIM停止计数
+* @param  timx TIM外设
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_disable(TIM_t *timx)
+{
+    timx->CR1 &= (~TIM_CR1_CEN);
+}
+
+
+/**
+* @brief  设置TIM预分频参数
+* @param  timx TIM外设
+* @param  presc 预分频新值
+* @note   TIM1预分频参数范围为:0x0000~0xFFFF    
+*         TIM3预分频参数范围为:0x0000~0x000F
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_set_psc(TIM_t *timx, uint32_t presc)          
+{
+    timx->PSC = (presc);
+}
+
+
+/**
+* @brief  获取TIM预分频参数
+* @param  timx TIM外设
+* @retval uint32_t TIM预分频值
+*/
+__STATIC_INLINE uint32_t std_tim_get_psc(TIM_t *timx)          
+{
+    return (timx->PSC);    
+}
+
+
+/**
+* @brief  设置TIM计数值
+* @param  timx TIM外设 
+* @param  counter 计数新值
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_set_counter(TIM_t *timx, uint32_t counter)     
+{
+    timx->CNT = (counter);
+}
+
+/**
+* @brief  获取TIM计数值
+* @param  timx TIM外设
+* @retval uint32_t TIM计数值
+*/
+__STATIC_INLINE uint32_t std_tim_get_counter(TIM_t *timx)   
+{
+    return (timx->CNT);
+}
+
+/**
+* @brief  设置TIM ARR值
+* @param  timx TIM外设
+* @param  autoreload ARR值
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_set_autoreload(TIM_t *timx, uint32_t autoreload)
+{
+    timx->ARR = (autoreload); 
+}
+                                                            
+/**
+* @brief  获取TIM ARR值
+* @param  timx TIM外设
+* @retval uint32_t TIM ARR值
+*/
+__STATIC_INLINE uint32_t std_tim_get_autoreload(TIM_t *timx)
+{
+    return (timx->ARR);
+}
+
+
+/**
+* @brief  设置TIM RCR值
+* @param  timx TIM外设
+* @param  rcr TIM RCR值
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_set_repcounter(TIM_t *timx, uint32_t rcr)
+{
+    timx->RCR = (rcr);
+}
+
+
+/**
+* @brief  获取TIM RCR值
+* @param  timx TIM外设
+* @retval uint32_t TIM RCR值
+*/
+__STATIC_INLINE uint32_t std_tim_get_repcounter(TIM_t *timx)
+{
+    return (timx->RCR);
+}
+
+
+/**
+* @brief  设置TIM时钟分频值
+* @param  timx TIM外设
+* @param  clk_div 时钟分频值
+*             @arg TIM_CLOCK_DTS_DIV1:  tDTS=tTIM_KCLK
+*             @arg TIM_CLOCK_DTS_DIV2:  tDTS=2*tTIM_KCLK
+*             @arg TIM_CLOCK_DTS_DIV4:  tDTS=4*tTIM_KCLK
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_set_clock_div(TIM_t *timx, uint32_t clk_div) 
+{
+    MODIFY_REG(timx->CR1, TIM_CR1_CLK_DIV, clk_div);    
+}
+
+/**
+* @brief  获取TIM时钟分频值
+* @param  timx TIM外设
+* @retval uint32_t 时钟分频值
+*             @arg TIM_CLOCK_DIV1: tDTS=tTIM_KCLK
+*             @arg TIM_CLOCK_DIV2: tDTS=2*tTIM_KCLK
+*             @arg TIM_CLOCK_DIV4: tDTS=4*tTIM_KCLK
+*/
+__STATIC_INLINE uint32_t std_tim_get_clock_div(TIM_t *timx)           
+{
+    return (timx->CR1 & TIM_CR1_CLK_DIV);
+}
+
+/**
+* @brief  使能自动重载功能
+* @param  timx TIM外设
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_arrpreload_enable(TIM_t *timx)           
+{
+    timx->CR1 |= TIM_CR1_ARPE;
+}
+
+/**
+* @brief  禁止自动重载功能
+* @param  timx TIM外设
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_arrpreload_disable(TIM_t *timx)           
+{
+    timx->CR1 &= (~TIM_CR1_ARPE);
+}
+
+/**
+* @brief  使能更新事件
+* @param  timx TIM外设
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_updateevent_enable(TIM_t *timx)
+{
+    timx->CR1 |= TIM_CR1_UDIS;
+}
+
+/**
+* @brief  禁止更新事件
+* @param  timx TIM外设
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_updateevent_disable(TIM_t *timx)
+{
+    timx->CR1 &= (~TIM_CR1_UDIS);
+}
+
+/**
+* @brief  设置更新事件源
+* @param  timx TIM外设
+* @param  update_source 更新事件源选择
+*             @arg TIM_UPDATE_SOURCE_REGULAR
+*             @arg TIM_UPDATE_SOURCE_COUNTER
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_set_update_source(TIM_t *timx, uint32_t update_source)
+{
+    MODIFY_REG(timx->CR1, TIM_CR1_URS, update_source);
+}
+
+
+/**
+* @brief  获取更新事件源
+* @param  timx TIM外设
+* @retval uint32_t 更新事件源选择
+*             @arg TIM_UPDATE_SOURCE_REGULAR
+*             @arg TIM_UPDATE_SOURCE_COUNTER
+*/
+__STATIC_INLINE uint32_t std_tim_get_update_source(TIM_t *timx)
+{
+    return (timx->CR1 & TIM_CR1_URS);
+}
+
+
+/**
+* @brief  使能工作模式1
+* @param  timx TIM外设
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_work_mode1_enable(TIM_t *timx)
+{
+    timx->CR1 |= TIM_CR1_MODE;
+}
+
+/**
+* @brief  禁止工作模式1
+* @param  timx TIM外设
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_work_mode1_disable(TIM_t *timx)
+{
+    timx->CR1 &= (~TIM_CR1_MODE);
+}
+
+
+/**
+* @brief  设置计数模式
+* @param  timx TIM外设
+* @param  counter_mode 计数方式
+*             @arg TIM_COUNTER_MODE_UP
+*             @arg TIM_COUNTER_MODE_DOWN
+*             @arg TIM_COUNTER_MODE_CENT_MODE1
+*             @arg TIM_COUNTER_MODE_CENT_MODE2
+*             @arg TIM_COUNTER_MODE_CENT_MODE3
+* @note   由于DIR控制位在中心对齐模式下为只读权限,当从中心对齐模式切换到边沿模式时,避免计数方向修改异常,应先复位一次TIM
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_set_counter_mode(TIM_t *timx, uint32_t counter_mode)
+{
+    MODIFY_REG(timx->CR1, (TIM_CR1_DIR | TIM_CR1_CMS), counter_mode);
+}
+
+/**
+* @brief  获取计数模式
+* @param  timx TIM外设
+* @retval uint32_t 计数方式
+*             @arg TIM_COUNTER_MODE_UP
+*             @arg TIM_COUNTER_MODE_DOWN
+*             @arg TIM_COUNTER_MODE_CENT_MODE1
+*             @arg TIM_COUNTER_MODE_CENT_MODE2
+*             @arg TIM_COUNTER_MODE_CENT_MODE3
+*/
+__STATIC_INLINE uint32_t std_tim_get_counter_mode(TIM_t *timx)
+{
+    if(timx->CR1 & TIM_CR1_CMS)
+    {
+        return (timx->CR1 & TIM_CR1_CMS);
+    }
+    else
+    {
+        return (timx->CR1 & TIM_CR1_DIR);       
+    }
+}
+
+/**
+* @brief  获取TIM计数方向
+* @param  timx TIM外设
+* @retval uint32_t 返回TIM计数方向标志
+*             @arg 非0: 当前计数方向为向下计数
+*             @arg 0:当前计数方向为向上计数
+*/
+__STATIC_INLINE uint32_t std_tim_get_count_dir(TIM_t *timx)  
+{
+    return (timx->CR1 & TIM_CR1_DIR);
+}
+
+
+/**
+* @brief  使能单脉冲模式
+* @param  timx TIM外设
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_onepulse_enable(TIM_t *timx)
+{
+    timx->CR1 |= TIM_CR1_OPM;
+}
+
+/**
+* @brief  禁止单脉冲模式
+* @param  timx TIM外设
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_onepulse_disable(TIM_t *timx)
+{
+    timx->CR1 &= (~TIM_CR1_OPM);
+}
+
+/**
+* @brief  获取单脉冲模式
+* @param  timx TIM外设
+* @retval uint32_t 返回单脉冲计数模式
+*             @arg 非0: 当前配置为单脉冲模式
+*             @arg 0:当前配置为连续计数模式
+*/
+__STATIC_INLINE uint32_t std_tim_get_onepulse_mode(TIM_t *timx)
+{
+    return (timx->CR1 & (TIM_CR1_OPM));
+}
+
+
+/**
+* @brief  设置计数时钟源参数
+* @param  timx TIM外设
+* @param  clock_source 时钟源选择
+*             @arg TIM_CLKSRC_INT:   内部时钟源
+*             @arg TIM_CLKSRC_MODE1: 外部时钟模式1
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_clock_source_config(TIM_t *timx, uint32_t clock_source)
+{
+    MODIFY_REG(timx->SMC, TIM_SMC_SM_SEL, clock_source);
+}
+
+
+/**
+* @brief  生成一个软件事件
+* @param  timx TIM外设
+* @param  event_src 事件源
+*             @arg TIM_EVENT_SRC_UPDATE:更新事件源
+*             @arg TIM_EVENT_SRC_CC1:   捕获比较1事件源
+*             @arg TIM_EVENT_SRC_CC2:   捕获比较2事件源
+*             @arg TIM_EVENT_SRC_CC3:   捕获比较3事件源
+*             @arg TIM_EVENT_SRC_CC4:   捕获比较4事件源
+*             @arg TIM_EVENT_SRC_COM:   换相事件源
+*             @arg TIM_EVENT_SRC_TRIG:  触发事件源
+*             @arg TIM_EVENT_SRC_BREAK: 断路事件源
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_set_sw_trig_event(TIM_t *timx, uint32_t event_src)
+{
+    timx->EVTG = event_src;
+}
+
+
+/** 
+* @brief  TIM中断使能
+* @param  timx TIM外设
+* @param  interrupt TIM中断源
+*             @arg TIM_INTERRUPT_UPDATE:  更新中断
+*             @arg TIM_INTERRUPT_CC1:     捕获/比较1中断
+*             @arg TIM_INTERRUPT_CC2:     捕获/比较2中断
+*             @arg TIM_INTERRUPT_CC3:     捕获/比较3中断
+*             @arg TIM_INTERRUPT_CC4:     捕获/比较4中断
+*             @arg TIM_INTERRUPT_COM:     换相中断
+*             @arg TIM_INTERRUPT_TRIG:    触发中断
+*             @arg TIM_INTERRUPT_BREAK:   断路中断
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_interrupt_enable(TIM_t *timx, uint32_t interrupt)    
+{
+    timx->DIER |= (interrupt);
+}
+
+/** 
+* @brief  TIM中断禁止
+* @param  timx TIM外设
+* @param  interrupt TIM中断源
+*             @arg TIM_INTERRUPT_UPDATE:  更新中断
+*             @arg TIM_INTERRUPT_CC1:     捕获/比较1中断
+*             @arg TIM_INTERRUPT_CC2:     捕获/比较2中断
+*             @arg TIM_INTERRUPT_CC3:     捕获/比较3中断
+*             @arg TIM_INTERRUPT_CC4:     捕获/比较4中断
+*             @arg TIM_INTERRUPT_COM:     换相中断
+*             @arg TIM_INTERRUPT_TRIG:    触发中断
+*             @arg TIM_INTERRUPT_BREAK:   断路中断
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_interrupt_disable(TIM_t *timx, uint32_t interrupt)   
+{
+    timx->DIER &= (~(interrupt));
+}
+
+
+/**
+* @brief  获取TIM中断源的状态
+* @param  timx TIM外设
+* @param  interrupt TIM中断源信息
+*             @arg TIM_INTERRUPT_UPDATE:  更新中断
+*             @arg TIM_INTERRUPT_CC1:     捕获/比较1中断
+*             @arg TIM_INTERRUPT_CC2:     捕获/比较2中断
+*             @arg TIM_INTERRUPT_CC3:     捕获/比较3中断
+*             @arg TIM_INTERRUPT_CC4:     捕获/比较4中断
+*             @arg TIM_INTERRUPT_COM:     换相中断
+*             @arg TIM_INTERRUPT_TRIG:    触发中断
+*             @arg TIM_INTERRUPT_BREAK:   断路中断
+* @retval uint32_t 返回中断请求源的状态 
+*/  
+__STATIC_INLINE uint32_t std_tim_get_interrupt_enable(TIM_t *timx, uint32_t interrupt)   
+{
+    return (timx->DIER & (interrupt));
+}
+
+
+/** 
+* @brief  获取TIM标志状态
+* @param  timx TIM外设
+* @param  flag TIM标志信息
+*             @arg TIM_FLAG_UPDATE:       更新事件标志
+*             @arg TIM_FLAG_CC1:          捕获/比较1事件标志
+*             @arg TIM_FLAG_CC2:          捕获/比较2事件标志
+*             @arg TIM_FLAG_CC3:          捕获/比较3事件标志
+*             @arg TIM_FLAG_CC4:          捕获/比较4事件标志
+*             @arg TIM_FLAG_COM:          换相事件标志
+*             @arg TIM_FLAG_TRIG:         触发事件标志
+*             @arg TIM_FLAG_BREAK:        断路事件标志
+*             @arg TIM_FLAG_CC1OF:        捕获/比较1重复捕获标志
+*             @arg TIM_FLAG_CC2OF:        捕获/比较2重复捕获标志
+*             @arg TIM_FLAG_CCX_ALL:      全通道捕获/比较事件标志
+*             @arg TIM_FLAG_ALL:          TIM事件标志
+* @retval uint32_t 返回标志的状态 
+*             @arg 非0: 当前标志为置起状态 
+*             @arg 0:当前标志为清除状态
+*/
+__STATIC_INLINE uint32_t std_tim_get_flag(TIM_t *timx, uint32_t flag)          
+{
+    return (timx->SR &(flag));
+}
+
+
+/** 
+* @brief  清除TIM标志
+* @param  timx TIM外设
+* @param  flag 清除TIM标志
+*             @arg TIM_FLAG_UPDATE:       更新事件标志
+*             @arg TIM_FLAG_CC1:          捕获/比较1事件标志
+*             @arg TIM_FLAG_CC2:          捕获/比较2事件标志
+*             @arg TIM_FLAG_CC3:          捕获/比较3事件标志
+*             @arg TIM_FLAG_CC4:          捕获/比较4事件标志
+*             @arg TIM_FLAG_COM:          换相事件标志
+*             @arg TIM_FLAG_TRIG:         触发事件标志
+*             @arg TIM_FLAG_BREAK:        断路事件标志
+*             @arg TIM_FLAG_CC1OF:        捕获/比较1重复捕获标志
+*             @arg TIM_FLAG_CC2OF:        捕获/比较2重复触发标志
+*             @arg TIM_FLAG_CCX_ALL:      全通道捕获/比较事件标志
+*             @arg TIM_FLAG_ALL:          TIM事件标志
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_clear_flag(TIM_t *timx, uint32_t flag)
+{
+    timx->SR = (~(flag));
+}
+
+
+/**
+* @brief  使能TIM比较/匹配通道
+* @param  timx TIM外设
+* @param  channel_id 指定TIM通道
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+*             @arg TIM_CHANNEL_3
+*             @arg TIM_CHANNEL_4
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_ccx_channel_enable(TIM_t *timx, uint32_t channel_id)
+{  
+    timx->CCEN |= (TIM_CCEN_CC1E << (channel_id << 2));
+}
+
+
+/**
+* @brief  禁止TIM比较/匹配通道
+* @param  timx TIM外设
+* @param  channel_id 指定TIM通道
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+*             @arg TIM_CHANNEL_3
+*             @arg TIM_CHANNEL_4
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_ccx_channel_disable(TIM_t *timx, uint32_t channel_id)
+{     
+    timx->CCEN &= (~(TIM_CCEN_CC1E << (channel_id << 2)));
+}
+
+
+/**
+* @brief  使能TIM互补输出通道
+* @param  timx TIM外设
+* @param  channel_id 指定TIM通道
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+*             @arg TIM_CHANNEL_3
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_ccxn_channel_enable(TIM_t *timx, uint32_t channel_id)
+{    
+    timx->CCEN |= (TIM_CCEN_CC1NE << (channel_id << 2));
+}
+
+
+/**
+* @brief  禁止TIM互补输出通道
+* @param  timx TIM外设
+* @param  channel_id 指定TIM通道
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+*             @arg TIM_CHANNEL_3
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_ccxn_channel_disable(TIM_t *timx, uint32_t channel_id)
+{ 
+    timx->CCEN &= (~(TIM_CCEN_CC1NE << (channel_id << 2)));
+}
+
+
+/**
+* @brief  配置TIM输入捕获通道极性
+* @param  timx TIM外设
+* @param  channel_id 指定TIM通道
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+* @param  input_capture_pol 输入极性
+*             @arg TIM_INPUT_POL_RISING
+*             @arg TIM_INPUT_POL_FALLING
+*             @arg TIM_INPUT_POL_BOTH
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_set_input_pol(TIM_t *timx, uint32_t channel_id, uint32_t input_capture_pol)
+{ 
+    MODIFY_REG(timx->CCEN, ((TIM_CCEN_CC1P | TIM_CCEN_CC1NP) << (channel_id << 2)), (input_capture_pol << (channel_id << 2)));
+}
+
+/**
+* @brief  获取TIM输入捕获通道极性
+* @param  timx TIM外设
+* @param  channel_id 指定TIM通道
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+* @retval uint32_t 输入极性
+*             @arg TIM_INPUT_POL_RISING
+*             @arg TIM_INPUT_POL_FALLING
+*             @arg TIM_INPUT_POL_BOTH
+*/
+__STATIC_INLINE uint32_t std_tim_get_input_pol(TIM_t *timx, uint32_t channel_id)
+{ 
+    return (((timx->CCEN) >> (channel_id << 2)) & (TIM_CCEN_CC1P | TIM_CCEN_CC1NP));
+}
+
+
+/**
+* @brief  配置TIM通道输出的极性
+* @param  timx TIM外设
+* @param  channel_id 指定TIM通道
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+*             @arg TIM_CHANNEL_3
+*             @arg TIM_CHANNEL_4
+* @param  output_commpare_pol 输出极性
+*             @arg TIM_OUTPUT_POL_HIGH
+*             @arg TIM_OUTPUT_POL_LOW
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_set_output_pol(TIM_t *timx, uint32_t channel_id, uint32_t output_commpare_pol)
+{ 
+    MODIFY_REG(timx->CCEN, (TIM_CCEN_CC1P << (channel_id << 2)), (output_commpare_pol << (channel_id << 2)));
+}
+
+/**
+* @brief  获取TIM通道输出的极性
+* @param  timx TIM外设
+* @param  channel_id 指定TIM通道
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+*             @arg TIM_CHANNEL_3
+*             @arg TIM_CHANNEL_4
+* @retval uint32_t 输出极性
+*             @arg TIM_OUTPUT_POL_HIGH
+*             @arg TIM_OUTPUT_POL_LOW
+*/
+__STATIC_INLINE uint32_t std_tim_get_output_pol(TIM_t *timx, uint32_t channel_id)
+{ 
+    return (((timx->CCEN) >> (channel_id << 2)) & TIM_CCEN_CC1P);
+}
+
+
+/**
+* @brief  配置TIM互补通道的输出极性
+* @param  timx TIM外设
+* @param  channel_id 指定TIM通道
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+*             @arg TIM_CHANNEL_3
+* @param  negtive_output_pol 互补通道的输出极性
+*             @arg TIM_OUTPUT_NEGTIVE_POL_HIGH
+*             @arg TIM_OUTPUT_NEGTIVE_POL_LOW
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_set_negtive_output_pol(TIM_t *timx, uint32_t channel_id, uint32_t negtive_output_pol)
+{ 
+    MODIFY_REG(timx->CCEN, (TIM_CCEN_CC1NP << (channel_id << 2)), (negtive_output_pol << (channel_id << 2)));
+}
+
+/**
+* @brief  获取TIM互补通道的输出极性
+* @param  timx TIM外设
+* @param  channel_id 指定TIM通道
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+*             @arg TIM_CHANNEL_3
+* @retval uint32_t 互补通道的输出极性
+*             @arg TIM_OUTPUT_NEGTIVE_POL_HIGH
+*             @arg TIM_OUTPUT_NEGTIVE_POL_LOW
+*/
+__STATIC_INLINE uint32_t std_tim_get_negtive_output_pol(TIM_t *timx, uint32_t channel_id)
+{ 
+    return (((timx->CCEN) >> (channel_id << 2)) & TIM_CCEN_CC1NP);
+}
+
+
+/**
+* @brief  配置TIM通道的空闲状态
+* @param  timx TIM外设
+* @param  channel_id 指定TIM通道
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+*             @arg TIM_CHANNEL_3
+*             @arg TIM_CHANNEL_4
+* @param  idle_state 通道空闲状态
+*             @arg TIM_OUTPUT_IDLE_RESET
+*             @arg TIM_OUTPUT_IDLE_SET
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_set_output_idlestate(TIM_t *timx, uint32_t channel_id, uint32_t idle_state)
+{ 
+    MODIFY_REG(timx->CR2, (TIM_CR2_OIS1 << (channel_id << 1)), (idle_state << (channel_id << 1)));
+}
+
+/**
+* @brief  获取TIM通道的空闲状态
+* @param  timx TIM外设
+* @param  channel_id 指定TIM通道
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+*             @arg TIM_CHANNEL_3
+*             @arg TIM_CHANNEL_4
+* @retval uint32_t 通道空闲状态
+*             @arg TIM_OUTPUT_IDLE_RESET
+*             @arg TIM_OUTPUT_IDLE_SET
+*/
+__STATIC_INLINE uint32_t std_tim_get_output_idlestate(TIM_t *timx, uint32_t channel_id)
+{ 
+    return (((timx->CR2) >> (channel_id << 1)) & TIM_CR2_OIS1);    
+}
+
+/**
+* @brief  配置TIM互补通道的空闲状态
+* @param  timx TIM外设
+* @param  channel_id 指定TIM通道
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+*             @arg TIM_CHANNEL_3
+* @param  negtive_idlestate 互补通道空闲状态
+*             @arg TIM_OUTPUT_NEGTIVE_IDLE_RESET
+*             @arg TIM_OUTPUT_NEGTIVE_IDLE_SET
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_set_negtive_output_idlestate(TIM_t *timx, uint32_t channel_id, uint32_t negtive_idlestate)
+{ 
+    MODIFY_REG(timx->CR2, (TIM_CR2_OIS1N << (channel_id << 1)), (negtive_idlestate << (channel_id << 1)));
+}
+
+/**
+* @brief  获取TIM互补通道的空闲状态
+* @param  timx TIM外设
+* @param  channel_id 指定TIM通道
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+*             @arg TIM_CHANNEL_3
+* @retval uint32_t 互补通道空闲状态
+*             @arg TIM_OUTPUT_NEGTIVE_IDLE_RESET
+*             @arg TIM_OUTPUT_NEGTIVE_IDLE_SET
+*/
+__STATIC_INLINE uint32_t std_tim_get_negtive_output_idlestate(TIM_t *timx, uint32_t channel_id)
+{ 
+    return (((timx->CR2) >> (channel_id << 1)) & TIM_CR2_OIS1N);        
+}
+
+/**
+* @brief  使能清除OCxREF功能
+* @param  timx TIM外设
+* @param  channel_id 指定TIM通道
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+*             @arg TIM_CHANNEL_3
+*             @arg TIM_CHANNEL_4
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_channel_clear_ocxref_enable(TIM_t *timx, uint32_t channel_id)
+{
+    uint32_t tmp_value = ((channel_id & 0x01) == 0)?0U:8U;
+    uint32_t shift_value = ((channel_id & 0x02) == 0)?0U:4U;    
+    __IO uint32_t *preg = (__IO uint32_t *)((uint32_t)(&timx->CCM1) + shift_value);
+    
+    /* 使能清除OCxREF */ 
+    *preg |= (TIM_CCM1_OC1CE << tmp_value);
+}
+
+/**
+* @brief  禁止清除OCxREF功能
+* @param  timx TIM外设
+* @param  channel_id 指定TIM通道
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+*             @arg TIM_CHANNEL_3
+*             @arg TIM_CHANNEL_4
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_channel_clear_ocxref_disable(TIM_t *timx, uint32_t channel_id)
+{
+    uint32_t tmp_value = ((channel_id & 0x01) == 0)?0U:8U;
+    uint32_t shift_value = ((channel_id & 0x02) == 0)?0U:4U;      
+    __IO uint32_t *preg = (__IO uint32_t *)((uint32_t)(&timx->CCM1) + shift_value);
+    
+    /* 禁止清除OCxREF */ 
+    *preg &= (~(TIM_CCM1_OC1CE << tmp_value));
+}
+
+/**
+* @brief  设置输入捕获预分频值
+* @param  timx TIM外设
+* @param  channel_id 指定TIM通道
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+* @param  icxpsc_num 输入捕获预分频值
+*             @arg TIM_INPUT_CAPTURE_PSC_DIV1
+*             @arg TIM_INPUT_CAPTURE_PSC_DIV2
+*             @arg TIM_INPUT_CAPTURE_PSC_DIV4
+*             @arg TIM_INPUT_CAPTURE_PSC_DIV8
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_set_channel_icxpsc(TIM_t *timx, uint32_t channel_id, uint32_t icxpsc_num)
+{
+    uint32_t tmp_value = ((channel_id & 0x01) == 0)?0U:8U;
+    uint32_t shift_value = ((channel_id & 0x02) == 0)?0U:4U;      
+    __IO uint32_t *preg = (__IO uint32_t *)((uint32_t)(&timx->CCM1) + shift_value);
+    
+    /* 设置输入捕获预分频 */ 
+    MODIFY_REG(*preg, (TIM_CCM1_IC1PSC << tmp_value), (icxpsc_num << tmp_value));
+}
+
+
+/**
+* @brief  获取输入捕获预分频值
+* @param  timx TIM外设
+* @param  channel_id 指定TIM通道
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+* @retval uint32_t 输入捕获预分频值
+*             @arg TIM_INPUT_CAPTURE_PSC_DIV1
+*             @arg TIM_INPUT_CAPTURE_PSC_DIV2
+*             @arg TIM_INPUT_CAPTURE_PSC_DIV4
+*             @arg TIM_INPUT_CAPTURE_PSC_DIV8
+*/
+__STATIC_INLINE uint32_t std_tim_get_channel_icxpsc(TIM_t *timx, uint32_t channel_id)
+{
+    uint32_t tmp_value = ((channel_id & 0x01) == 0)?0U:8U;
+    uint32_t shift_value = ((channel_id & 0x02) == 0)?0U:4U;        
+    __IO uint32_t *preg = (__IO uint32_t *)((uint32_t)(&timx->CCM1) + shift_value);
+    
+    /* 获取输入捕获预分频 */ 
+    return ((*preg >> tmp_value) & TIM_CCM1_IC1PSC);
+    
+}
+
+
+/**
+* @brief  使能TIM通道输出比较的预装载功能
+* @param  timx TIM外设
+* @param  channel_id 指定TIM通道
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+*             @arg TIM_CHANNEL_3
+*             @arg TIM_CHANNEL_4
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_preloadccx_channel_enable(TIM_t *timx, uint32_t channel_id)
+{ 
+    uint32_t tmp_value = ((channel_id & 0x01) == 0)?0U:8U;
+    uint32_t shift_value = ((channel_id & 0x02) == 0)?0U:4U;        
+    __IO uint32_t *preg = (__IO uint32_t *)((uint32_t)(&timx->CCM1) + shift_value);    
+ 
+    /* 使能输出比较预装载功能 */ 
+    *preg |= (TIM_CCM1_OC1PE << tmp_value);
+}
+
+
+/**
+* @brief  禁止TIM通道输出比较的预装载功能
+* @param  timx TIM外设
+* @param  channel_id 指定TIM通道
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+*             @arg TIM_CHANNEL_3
+*             @arg TIM_CHANNEL_4
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_preloadccx_channel_disable(TIM_t *timx, uint32_t channel_id)
+{ 
+    uint32_t tmp_value = ((channel_id & 0x01) == 0)?0U:8U;
+    uint32_t shift_value = ((channel_id & 0x02) == 0)?0U:4U;        
+    __IO uint32_t *preg = (__IO uint32_t *)((uint32_t)(&timx->CCM1) + shift_value);    
+ 
+    /* 使能输出比较预装载功能 */ 
+    *preg &= (~(TIM_CCM1_OC1PE << tmp_value));
+}
+
+
+/**
+* @brief  使能TIM通道快速模式
+* @param  timx TIM外设
+* @param  channel_id 指定TIM通道
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+*             @arg TIM_CHANNEL_3
+*             @arg TIM_CHANNEL_4
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_fastmode_channel_enable(TIM_t *timx, uint32_t channel_id)
+{ 
+    uint32_t tmp_value = ((channel_id & 0x01) == 0)?0U:8U;
+    uint32_t shift_value = ((channel_id & 0x02) == 0)?0U:4U;        
+    __IO uint32_t *preg = (__IO uint32_t *)((uint32_t)(&timx->CCM1) + shift_value);    
+ 
+    /* 使能输出比较预装载功能 */ 
+    *preg |= (TIM_CCM1_OC1FE << tmp_value);
+}
+
+
+/**
+* @brief  禁止TIM通道快速模式
+* @param  timx TIM外设
+* @param  channel_id 指定TIM通道
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+*             @arg TIM_CHANNEL_3
+*             @arg TIM_CHANNEL_4
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_fastmode_channel_disable(TIM_t *timx, uint32_t channel_id)
+{ 
+    uint32_t tmp_value = ((channel_id & 0x01) == 0)?0U:8U;
+    uint32_t shift_value = ((channel_id & 0x02) == 0)?0U:4U;        
+    __IO uint32_t *preg = (__IO uint32_t *)((uint32_t)(&timx->CCM1) + shift_value);    
+ 
+    /* 禁止输出快速模式 */ 
+    *preg &= (~(TIM_CCM1_OC1FE << tmp_value));
+}
+
+
+/**
+* @brief  配置通道输出模式
+* @param  timx TIM外设
+* @param  channel_id 指定TIM通道
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+*             @arg TIM_CHANNEL_3
+*             @arg TIM_CHANNEL_4
+* @param  ocmode 输出模式选择
+*             @arg TIM_OUTPUT_MODE_FROZEN         
+*             @arg TIM_OUTPUT_MODE_ACTIVE         
+*             @arg TIM_OUTPUT_MODE_INACTIVE       
+*             @arg TIM_OUTPUT_MODE_TOGGLE         
+*             @arg TIM_OUTPUT_MODE_FORCED_INACTIVE
+*             @arg TIM_OUTPUT_MODE_FORCED_ACTIVE  
+*             @arg TIM_OUTPUT_MODE_PWM1           
+*             @arg TIM_OUTPUT_MODE_PWM2                   
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_set_ocmode(TIM_t *timx, uint32_t channel_id, uint32_t ocmode)
+{
+    uint32_t tmp_value = ((channel_id & 0x01) == 0)?0U:8U;
+    uint32_t shift_value = ((channel_id & 0x02) == 0)?0U:4U;        
+    __IO uint32_t *preg = (__IO uint32_t *)((uint32_t)(&timx->CCM1) + shift_value);
+    
+    MODIFY_REG(*preg, ((TIM_CCM1_OC1M  | TIM_CCM1_CC1S) << tmp_value), (ocmode << tmp_value));
+}
+
+
+/**
+* @brief  获取通道输出模式
+* @param  timx TIM外设
+* @param  channel_id 指定TIM通道
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+*             @arg TIM_CHANNEL_3
+*             @arg TIM_CHANNEL_4
+* @note   该函数执行后,会将通道设置为输出模式
+* @retval uint32_t 输出模式选择
+*             @arg TIM_OUTPUT_MODE_FROZEN         
+*             @arg TIM_OUTPUT_MODE_ACTIVE         
+*             @arg TIM_OUTPUT_MODE_INACTIVE       
+*             @arg TIM_OUTPUT_MODE_TOGGLE         
+*             @arg TIM_OUTPUT_MODE_FORCED_INACTIVE
+*             @arg TIM_OUTPUT_MODE_FORCED_ACTIVE  
+*             @arg TIM_OUTPUT_MODE_PWM1           
+*             @arg TIM_OUTPUT_MODE_PWM2               
+*/
+__STATIC_INLINE uint32_t std_tim_get_ocmode(TIM_t *timx, uint32_t channel_id)
+{
+    uint32_t tmp_value = ((channel_id & 0x01) == 0)?0U:8U;
+    uint32_t shift_value = ((channel_id & 0x02) == 0)?0U:4U;    
+    __IO uint32_t *preg = (__IO uint32_t *)((uint32_t)(&timx->CCM1) + shift_value);
+
+    return ((*preg >> tmp_value) & TIM_CCM1_OC1M);
+}
+
+/**
+* @brief  设置捕获/比较寄存器的值
+* @param  timx TIM外设
+* @param  ccx_value 捕获比较寄存器的值
+* @param  channel_id TIM 通道配置
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+*             @arg TIM_CHANNEL_3
+*             @arg TIM_CHANNEL_4
+* @retval std_status_t 返回API执行结果
+*/
+__STATIC_INLINE void std_tim_set_ccx_value(TIM_t *timx, uint32_t channel_id, uint32_t ccx_value)
+{    
+    if ((timx->CR1 & TIM_CR1_MODE) != TIM_CR1_MODE)
+    {
+        __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)(&timx->CC1) + (channel_id << 2));
+        MODIFY_REG(*pReg, TIM_CC1_CC1, ccx_value);    
+    }
+    else
+    {
+        uint32_t tmp_value = ((channel_id & 0x02) == 0)?0U:8U;   
+        uint32_t shift_value = ((channel_id & 0x02) == 0)?0U:2U;          
+        __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)(&timx->CC1) + ((channel_id - shift_value) << 2));
+        MODIFY_REG(*pReg, (TIM3_CC1_CC1_MODE1 << tmp_value), (ccx_value << tmp_value));
+    }
+}
+
+
+/**
+* @brief  获取捕获/比较寄存器的值
+* @param  timx TIM外设
+* @param  channel_id TIM 通道配置
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+*             @arg TIM_CHANNEL_3
+*             @arg TIM_CHANNEL_4
+* @retval uint32_t 捕获比较寄存器的值
+*/
+__STATIC_INLINE uint32_t std_tim_get_ccx_value(TIM_t *timx, uint32_t channel_id)
+{
+    if ((timx->CR1 & TIM_CR1_MODE) != TIM_CR1_MODE)
+    {
+        __IO uint32_t *preg = (__IO uint32_t *)((uint32_t)(&timx->CC1) + (channel_id << 2));
+        return (*preg & TIM_CC1_CC1);
+    }
+    else
+    {
+        uint32_t tmp_value = ((channel_id & 0x02) == 0)?0U:8U;  
+        uint32_t shift_value = ((channel_id & 0x02) == 0)?0U:2U;     
+        __IO uint32_t *preg = (__IO uint32_t *)((uint32_t)(&timx->CC1) + ((channel_id - shift_value) << 2));
+        
+        return ((*preg >> tmp_value) & TIM3_CC1_CC1_MODE1);
+    }
+}
+
+
+/**
+* @brief  设置通道为输入模式
+* @param  timx TIM外设
+* @param  channel_id TIM 通道配置
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+* @param  icmode 输入模式选择
+*             @arg TIM_INPUT_CAPTURE_SEL_DIRECTTI
+*             @arg TIM_INPUT_CAPTURE_SEL_INDIRECTTI
+*             @arg TIM_INPUT_CAPTURE_SEL_TRC
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_set_icmode(TIM_t *timx, uint32_t channel_id, uint32_t icmode)
+{
+    uint32_t tmp_value = ((channel_id & 0x01) == 0)?0U:8U;
+    uint32_t shift_value = ((channel_id & 0x02) == 0)?0U:4U;        
+    __IO uint32_t *preg = (__IO uint32_t *)((uint32_t)(&timx->CCM1) + shift_value);
+    
+    MODIFY_REG(*preg, (TIM_CCM1_CC1S << tmp_value), (icmode << tmp_value));
+}
+
+/**
+* @brief  获取通道的输入状态
+* @param  timx TIM外设
+* @param  channel_id TIM 通道配置
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+* @retval uint32_t 输入模式选择
+*             @arg TIM_INPUT_CAPTURE_SEL_DIRECTTI
+*             @arg TIM_INPUT_CAPTURE_SEL_INDIRECTTI
+*             @arg TIM_INPUT_CAPTURE_SEL_TRC
+*/
+__STATIC_INLINE uint32_t std_tim_get_icmode(TIM_t *timx, uint32_t channel_id)
+{
+    uint32_t tmp_value = ((channel_id & 0x01) == 0)?0U:8U;
+    uint32_t shift_value = ((channel_id & 0x02) == 0)?0U:4U;        
+    __IO uint32_t *preg = (__IO uint32_t *)((uint32_t)(&timx->CCM1) + shift_value);
+    
+    return ((*preg >> tmp_value) & TIM_CCM1_CC1S);
+}
+
+/**
+* @brief  设置输入通道的滤波参数
+* @param  timx TIM外设
+* @param  channel_id TIM 通道配置
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+* @param  icfilter 输入滤波参数,其值的范围为:0x00~0x0F
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_set_icfilter(TIM_t *timx, uint32_t channel_id, uint32_t icfilter)
+{
+    uint32_t tmp_value = ((channel_id & 0x01) == 0)?0U:8U;
+    uint32_t shift_value = ((channel_id & 0x02) == 0)?0U:4U;        
+    __IO uint32_t *preg = (__IO uint32_t *)((uint32_t)(&timx->CCM1) + shift_value);
+    
+    MODIFY_REG(*preg, (TIM_CCM1_IC1F << tmp_value), ((icfilter << tmp_value) << 4U));
+}
+
+/**
+* @brief  获取输入通道的滤波参数
+* @param  timx TIM外设
+* @param  channel_id TIM 通道配置
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+* @retval uint32_t 输入滤波参数,其值的范围为:0x00~0x0F
+*/
+__STATIC_INLINE uint32_t std_tim_get_icfilter(TIM_t *timx, uint32_t channel_id)
+{
+    uint32_t tmp_value = ((channel_id & 0x01) == 0)?0U:8U;
+    uint32_t shift_value = ((channel_id & 0x02) == 0)?0U:4U;        
+    __IO uint32_t *preg = (__IO uint32_t *)((uint32_t)(&timx->CCM1) + shift_value);
+    
+    return (((*preg >> tmp_value) & TIM_CCM1_IC1F) >> 4U);
+}
+
+
+/**
+* @brief  设置主模式(TRIG_OUT)输出参数
+* @param  timx TIM外设
+* @param  trigout_mode 主模式输出参数定义
+*             @arg TIM_TRIG_OUT_RESET
+*             @arg TIM_TRIG_OUT_ENABLE
+*             @arg TIM_TRIG_OUT_UPDATE
+*             @arg TIM_TRIG_OUT_CC1      
+*             @arg TIM_TRIG_OUT_OC1REF   
+*             @arg TIM_TRIG_OUT_OC2REF   
+*             @arg TIM_TRIG_OUT_OC3REF   
+*             @arg TIM_TRIG_OUT_OC4REF
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_trigout_mode_config(TIM_t *timx, uint32_t trigout_mode)
+{
+    MODIFY_REG(timx->CR2, TIM_CR2_MM_SEL, trigout_mode);
+}
+
+
+/**
+* @brief  设置从模式参数
+* @param  timx TIM外设
+* @param  slave_mode 从模式参数定义
+*             @arg TIM_SLAVE_MODE_DISABLE 
+*             @arg TIM_SLAVE_MODE_RESET   
+*             @arg TIM_SLAVE_MODE_GATED   
+*             @arg TIM_SLAVE_MODE_TRIG    
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_slave_mode_config(TIM_t *timx, uint32_t slave_mode)
+{
+    MODIFY_REG(timx->SMC, TIM_SMC_SM_SEL, slave_mode);
+}
+
+/**
+* @brief  设置触发输入源
+* @param  timx TIM外设
+* @param  trig_source 触发输入源定义
+*             @arg TIM_TRIG_SOURCE_ITR0    
+*             @arg TIM_TRIG_SOURCE_TI1F_ED
+*             @arg TIM_TRIG_SOURCE_TI1FP1 
+*             @arg TIM_TRIG_SOURCE_TI2FP2  
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_trig_source_config(TIM_t *timx, uint32_t trig_source)
+{
+    MODIFY_REG(timx->SMC, TIM_SMC_TS, trig_source);
+}
+
+
+/**
+* @brief  使能主/从模式
+* @param  timx TIM外设
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_master_mode_enable(TIM_t *timx)
+{
+    timx->SMC |= TIM_SMC_MS_MOD;
+}
+
+
+/**
+* @brief  禁止主/从模式
+* @param  timx TIM外设
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_master_mode_disable(TIM_t *timx)
+{
+    timx->SMC &= (~TIM_SMC_MS_MOD);
+}
+
+
+/**
+* @brief  配置TIM OCREF CLEAR输入源
+* @param  timx TIM外设
+* @param  ocrefclr_source OCREF CLR源选择
+*             @arg TIM_CLEAR_INPUT_SRC_COMP1: OCREF CLR连接到COMP1
+*             @arg TIM_CLEAR_INPUT_SRC_COMP2: OCREF CLR连接到COMP2
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_ocrefclr_source_config(TIM_t *timx, uint32_t ocrefclr_source)
+{
+    MODIFY_REG(timx->CFG, TIM_CFG_OCREF_CLR, ocrefclr_source);
+}
+
+
+/**
+* @brief  使能输入捕获/输出比较换相预装载
+* @param  timx TIM外设
+* @note   该函数仅对互补通道有效
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_ccreload_enable(TIM_t *timx)
+{
+    timx->CR2 |= TIM_CR2_CC_PRECR;
+}
+
+/**
+* @brief  禁止输入捕获/输出比较换相预装载
+* @param  timx TIM外设
+* @note   该函数仅对互补通道有效
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_ccreload_disable(TIM_t *timx)
+{
+    timx->CR2 &= (~TIM_CR2_CC_PRECR);
+}
+
+
+/**
+* @brief  配置换相控制更新源选择
+* @param  timx TIM外设
+* @param  ccupdate_source 换相更新源
+*             @arg TIM_COM_SOFTWARE
+*             @arg TIM_COM_TRGI
+* @note   该函数仅对互补通道有效
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_cc_set_update_source(TIM_t *timx, uint32_t ccupdate_source)
+{
+    MODIFY_REG(timx->CR2, TIM_CR2_CCU_SEL, ccupdate_source);
+}
+
+
+
+/**
+* @brief  使能TI1的XOR功能
+* @param  timx TIM外设
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_ti1xor_enable(TIM_t *timx)
+{
+    timx->CR2 |= TIM_CR2_TI1_XOR_SEL;
+}
+
+
+/**
+* @brief  禁止TI1的XOR功能
+* @param  timx TIM外设
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_ti1xor_disable(TIM_t *timx)
+{
+    timx->CR2 &= (~TIM_CR2_TI1_XOR_SEL);
+}
+
+
+/**
+* @brief  配置TIM输入通道重映射功能
+* @param  timx TIM外设
+* @param  ti_sel 通道输入源选择参数
+*             @arg TIM_TIM3_TI1_GPIO:           TIM3 TI1连接到GPIO
+*             @arg TIM_TIM3_TI1_COMP1:          TIM3 TI1连接到COMP1输出
+*             @arg TIM_TIM3_TI2_GPIO:           TIM3 TI2连接到GPIO
+*             @arg TIM_TIM3_TI2_COMP2:          TIM3 TI2连接到COMP2输出
+* @param  channel_id TIM通道
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_set_channel_remap(TIM_t *timx, uint32_t ti_sel, uint32_t channel_id)
+{
+    MODIFY_REG(timx->TISEL, (TIM_TISEL_TI1_SEL << (channel_id << 3)), ti_sel);
+}
+
+
+
+/**
+* @brief  TIM输出使能
+* @param  timx TIM外设
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_moen_enable(TIM_t *timx)            
+{
+    timx->BDT |= (TIM_BDT_MOEN);
+}
+
+/**
+* @brief  TIM输出禁止
+* @param  timx TIM外设
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_moen_disable(TIM_t *timx)        
+{
+    timx->BDT &= (~TIM_BDT_MOEN);
+}
+
+/**
+* @brief  TIM自动输出使能
+* @param  timx TIM外设
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_aoen_enable(TIM_t *timx)            
+{
+    timx->BDT |= (TIM_BDT_AOEN);
+}
+
+/**
+* @brief  TIM自动输出禁止
+* @param  timx TIM外设
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_aoen_disable(TIM_t *timx)        
+{
+    timx->BDT &= (~TIM_BDT_AOEN);
+}
+
+
+/** 
+* @brief  使能OSSR功能
+* @param  timx TIM外设
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_ossr_enable(TIM_t *timx)                
+{
+    timx->BDT |= TIM_BDT_OSSR;
+}
+
+/** 
+* @brief  禁止OSSR功能
+* @param  timx TIM外设
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_ossr_disable(TIM_t *timx)                
+{
+    timx->BDT &= (~TIM_BDT_OSSR);
+}
+
+/** 
+* @brief  使能OSSI功能
+* @param  timx TIM外设
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_ossi_enable(TIM_t *timx)                
+{
+    timx->BDT |= TIM_BDT_OSSI;
+}
+
+/** 
+* @brief  禁止OSSI功能
+* @param  timx TIM外设
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_ossi_disable(TIM_t *timx)                
+{
+    timx->BDT &= (~TIM_BDT_OSSI);
+}
+
+
+/** 
+* @brief  使能TIM断路
+* @param  timx TIM外设
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_bken_enable(TIM_t *timx)                
+{
+    timx->BDT |= TIM_BDT_BKEN;
+}
+
+/** 
+* @brief  禁止TIM断路
+* @param  timx TIM外设
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_bken_disable(TIM_t *timx)                
+{
+    timx->BDT &= (~TIM_BDT_BKEN);
+}
+
+
+/** 
+* @brief  使能断路源
+* @param  timx TIM外设
+* @param  brk_source 断路输入源定义
+*             @arg TIM_BREAK_INPUT_SRC_GPIO
+*             @arg TIM_BREAK_INPUT_SRC_COMP1
+*             @arg TIM_BREAK_INPUT_SRC_COMP2
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_brk_source_enable(TIM_t *timx, uint32_t brk_source)
+{
+    timx->AF1 |= brk_source;
+}
+
+
+/** 
+* @brief  配置断路的极性
+* @param  timx TIM外设
+* @param  brk_source 断路输入源定义
+*             @arg TIM_BREAK_INPUT_SRC_GPIO
+*             @arg TIM_BREAK_INPUT_SRC_COMP1
+*             @arg TIM_BREAK_INPUT_SRC_COMP2
+* @param  brk_pol 断路输入极性定义
+*             @arg TIM_BREAK_INPUT_POL_HIGH
+*             @arg TIM_BREAK_INPUT_POL_LOW
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_set_brk_pol(TIM_t *timx, uint32_t brk_source, uint32_t brk_pol)
+{   
+    MODIFY_REG(timx->AF1, (TIM1_AF1_BKINP << (brk_source >> 1U)), (brk_pol << (brk_source >> 1U)));
+}
+
+
+/**
+* @brief  配置TIM死区时间
+* @param  timx TIM外设
+* @param  deadtime 死区时间,该值的范围:0x00~0xFF
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_set_deadtime(TIM_t *timx, uint32_t deadtime)
+{
+    MODIFY_REG(timx->BDT, TIM_BDT_DTG, deadtime);
+}
+
+
+/**
+* @brief  获取TIM死区时间
+* @param  timx TIM外设
+* @retval uint32_t 死区时间,其值范围为:0x00~0xFF
+*/
+__STATIC_INLINE uint32_t std_tim_get_deadtime(TIM_t *timx)
+{
+    return (timx->BDT & TIM_BDT_DTG);
+}
+
+
+/**
+* @brief  配置TIM的锁定级别
+* @param  timx TIM外设
+* @param  locklevel LOCK锁定级别
+*             @arg TIM_LOCK_LEVEL_OFF
+*             @arg TIM_LOCK_LEVEL1
+*             @arg TIM_LOCK_LEVEL2
+*             @arg TIM_LOCK_LEVEL3
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_set_locklevel(TIM_t *timx, uint32_t locklevel)
+{
+    MODIFY_REG(timx->BDT, TIM_BDT_LOCK, locklevel);
+}
+
+
+/**
+* @brief  获取TIM锁定级别
+* @param  timx TIM外设
+* @retval uint32_t LOCK锁定级别
+*             @arg TIM_LOCK_LEVEL_OFF
+*             @arg TIM_LOCK_LEVEL1
+*             @arg TIM_LOCK_LEVEL2
+*             @arg TIM_LOCK_LEVEL3
+*/
+__STATIC_INLINE uint32_t std_tim_get_locklevel(TIM_t *timx)
+{
+    return (timx->BDT & TIM_BDT_LOCK);
+}
+
+
+/** 
+* @brief  使能LOCKUP锁定功能
+* @param  timx TIM外设
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_lockup_lock_enable(TIM_t *timx)
+{
+    timx->AF1 |= TIM1_AF1_LOCKUP_LOCK;
+}
+
+
+
+
+/* 基础计数功能初始化/去初始化 */
+void std_tim_deinit(TIM_t *timx);
+void std_tim_init(TIM_t *timx, std_tim_basic_init_t *tim_init_param);
+void std_tim_struct_init(std_tim_basic_init_t *tim_init_struct);
+
+/* 输入捕获初始化 */
+void std_tim_input_capture_init(TIM_t *timx, std_tim_input_capture_init_t *input_config, uint32_t channel_id);
+void std_tim_input_capture_struct_init(std_tim_input_capture_init_t *input_init_struct);
+
+/* 输出模式初始化及参数配置函数 */
+void std_tim_output_compare_init(TIM_t *timx, std_tim_output_compare_init_t *output_config, uint32_t channel_id);
+void std_tim_output_compare_struct_init(std_tim_output_compare_init_t *output_init_struct);
+
+/* 断路功能初始化 */
+void std_tim_bdt_init(TIM_t* timx, std_tim_break_init_t *bdt_init_param);
+void std_tim_bdt_struct_init(std_tim_break_init_t *bdt_init_struct);
+
+
+/**
+* @}
+*/
+
+#ifdef __cplusplus
+}
+#endif
+/**
+* @}
+*/
+
+/**
+* @}
+*/
+#endif /* CIU32F003_STD_TIM_H */
+

+ 1822 - 0
CIU32F003_LIB/Include/ciu32f003_std_tim(3).h

@@ -0,0 +1,1822 @@
+/************************************************************************************************/
+/**
+* @file               ciu32f003_std_tim.h          
+* @author             MCU Ecosystem Development Team
+* @brief              TIM STD库驱动头文件。
+*                     提供TIM相关的STD库操作函数声明、数据类型以及常量的定义。 
+* 
+*
+**************************************************************************************************
+* @attention
+* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
+*
+**************************************************************************************************
+*/
+
+/*避免头文件重复引用*/
+#ifndef CIU32F003_STD_TIM_H
+#define CIU32F003_STD_TIM_H
+
+/************************************************************************************************/
+/**
+* @addtogroup CIU32F003_STD_Driver
+* @{
+*/
+
+/**
+* @defgroup TIM TIM
+* @brief    高级控制定时器/通用定时器的STD库驱动
+* @{
+*
+*/
+/************************************************************************************************/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*------------------------------------------includes--------------------------------------------*/
+#include "ciu32f003_std_common.h"
+
+
+/*-----------------------------------------type define------------------------------------------*/
+
+/************************************************************************************************/
+/** 
+* @defgroup TIM_Types TIM Types
+* @brief    TIM数据类型定义
+* @{
+*/
+/************************************************************************************************/
+
+/**
+* @brief  TIM基本参数配置结构体定义
+*/
+typedef struct
+{    
+    uint32_t prescaler;              /**< TIM时钟的预分频参数                               
+                                              @note TIM1预分频参数范围为:0x0000~0xFFFF    
+                                                    TIM3预分频参数范围为:0x0000~0x000F                    */
+                                   
+    uint32_t counter_mode;           /**< 计数器模式选择
+                                              @arg TIM_COUNTER_MODE_UP ...                                 */
+                                   
+    uint32_t period;                 /**< 在下次更新事件时加载到自动重新加载寄存器中的溢出值
+                                          其值必须在0x0000~0xFFFF之间                                      */
+                                   
+    uint32_t clock_div;              /**< TIM时钟分频参数
+                                              @arg TIM_CLOCK_DTS_DIV1 ...                                  */
+                                   
+    uint8_t repeat_counter;         /**< 重复计数器参数定义,每当RCR向下计数达到0时,会产出一个更新事件,
+                                         并从RCR的值(N)开始重新计数,该参数必须在0x0000~0x00FF之间。       */
+                                   
+}std_tim_basic_init_t;
+
+
+/**
+* @brief  TIM输入捕获参数配置结构体定义
+*/
+typedef struct
+{
+    uint32_t  input_capture_pol;         /**< 输入信号的有效边沿选择                           
+                                                  @arg TIM_INPUT_POL_RISING ...                */
+                                
+    uint32_t input_capture_sel;          /**< 输入模式定义
+                                                  @arg TIM_INPUT_CAPTURE_SEL_DIRECTTI ...      */
+                                
+    uint32_t input_capture_prescaler;    /**< 输入捕获预分频定义
+                                                  @arg TIM_INPUT_CAPTURE_PSC_DIV1 ...          */
+                                
+    uint32_t input_capture_filter;       /**< 输入捕获滤波器定义,其值必须在0x0~0x7之间        */
+    
+}std_tim_input_capture_init_t;      
+
+
+/**
+* @brief  TIM输出比较参数配置结构体定义
+*/
+typedef struct
+{
+    uint32_t output_compare_mode;        /**< TIM输出比较模式定义
+                                                  @arg TIM_OUTPUT_MODE_ACTIVE ...                           */
+    
+    uint32_t output_state;               /**< 输出使能定义                                               
+                                                  @arg TIM_OUTPUT_DISABLE ...                               */
+ 
+    uint32_t output_negtive_state;       /**< 互补输出使能定义                                               
+                                                  @arg TIM_OUTPUT_NEGTIVE_DISABLE ...                       */
+                                   
+    uint32_t pulse;                      /**< TIM载入捕获比较寄存器的脉冲值,其值必须在0x0000~0xFFFF之间    */    
+                                   
+    uint32_t output_pol;                 /**< 输出极性定义
+                                                  @arg TIM_OUTPUT_POL_HIGH ...                              */
+                                   
+    uint32_t output_negtive_pol;         /**< 互补输出极性定义
+                                                  @arg TIM_OUTPUT_NEGTIVE_POL_HIGH ...                      */                                                                     
+                                   
+    uint32_t output_idle_state;          /**< TIM空闲状态下输出状态定义
+                                                  @arg  TIM_OUTPUT_IDLE_SET ...
+                                                  @note 该参数仅对支持Break功能的定时器实例有效             */
+                                   
+    uint32_t output_negtive_idle_state;  /**< TIM空闲状态下互补输出状态定义
+                                                  @arg  TIM_OUTPUT_NEGTIVE_IDLE_SET ...
+                                                  @note 该参数仅对支持Break功能的定时器实例有效             */
+    
+}std_tim_output_compare_init_t;
+
+
+/**
+* @brief  TIM断路输入和死区参数配置结构体定义
+*/
+typedef struct
+{
+    uint32_t off_state_run_mode;                        /**< 运行模式下的关闭状态
+                                                                 @arg TIM_OSSR_ENABLE ...            */
+    
+    uint32_t off_state_idle_mode;                       /**< 空闲模式下的关闭状态
+                                                                 @arg TIM_OSSI_ENABLE ...            */
+    
+    uint32_t lock_level;                                /**< LOCK级别
+                                                                 @arg TIM_LOCK_LEVEL1 ...            */  
+    
+    uint32_t dead_time;                                 /**< 死区参数定义,其值必须在0x00~0xFF之间   */
+       
+    uint32_t break_state;                              /**< 断路功能使能控制
+                                                                  @arg TIM_BREAK_ENABLE
+                                                                  @arg TIM_BREAK_DISABLE             */ 
+    
+}std_tim_break_init_t;
+
+
+
+/**
+* @}
+*/
+  
+/*--------------------------------------------define--------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @defgroup TIM_Constants TIM Constants 
+* @brief    TIM常量定义及宏定义
+* @{
+*
+*/
+/************************************************************************************************/
+/* TIM计数模式定义 */
+#define TIM_COUNTER_MODE_UP                (0x00000000U)                      /**< 向上计数                      */
+#define TIM_COUNTER_MODE_DOWN              TIM_CR1_DIR                        /**< 向下计数                      */
+#define TIM_COUNTER_MODE_CENT_MODE1        TIM_CR1_CMS_CENTER_UP              /**< 中心对齐模式1                 */
+#define TIM_COUNTER_MODE_CENT_MODE2        TIM_CR1_CMS_CENTER_DOWN            /**< 中心对齐模式2                 */
+#define TIM_COUNTER_MODE_CENT_MODE3        TIM_CR1_CMS_CENTER_UP_DOWN         /**< 中心对齐模式3                 */
+
+/* TIM更新事件源选择 */
+#define TIM_UPDATE_SOURCE_REGULAR          (0x00000000U)                      /**< 计数上溢或下溢触发                       */
+#define TIM_UPDATE_SOURCE_COUNTER          TIM_CR1_URS                        /**< 计数上溢或下溢、UG置位、从模式控制器触发  */
+
+/* TIM时钟分频 */
+#define TIM_CLOCK_DTS_DIV1                 (0x00000000U)                      /**< tDTS=tTIMx_KCLK          */
+#define TIM_CLOCK_DTS_DIV2                 TIM_CR1_CLK_DIV2                   /**< tDTS=2*tTIMx_KCLK        */
+#define TIM_CLOCK_DTS_DIV4                 TIM_CR1_CLK_DIV4                   /**< tDTS=4*tTIMx_KCLK        */
+
+/* TIM通道定义 */
+#define TIM_CHANNEL_1                      (0x00U)                            /**< 通道1定义            */
+#define TIM_CHANNEL_2                      (0x01U)                            /**< 通道2定义            */
+#define TIM_CHANNEL_3                      (0x02U)                            /**< 通道3定义            */
+#define TIM_CHANNEL_4                      (0x03U)                            /**< 通道4定义            */
+
+/* TIM输入通道极性定义 */
+#define TIM_INPUT_POL_RISING               (0x00000000U)                        /**< 未反向/上升沿触发             */
+#define TIM_INPUT_POL_FALLING              TIM_CCEN_CC1P                        /**< 反向/下降沿触发               */
+#define TIM_INPUT_POL_BOTH                 (TIM_CCEN_CC1P | TIM_CCEN_CC1NP)     /**< 未反向/上升下降均触发         */
+
+/* TIM输入捕获选择 */
+#define TIM_INPUT_CAPTURE_SEL_DIRECTTI         TIM_CCM1_CC1S_DIRECTTI             /**< TIM输入1, 2, 3 or 4,且被映射到IC1, IC2, IC3 or IC4(一一对应) */
+#define TIM_INPUT_CAPTURE_SEL_INDIRECTTI       TIM_CCM1_CC1S_INDIRECTTI           /**< TIM输入1, 2, 3 or 4,且被映射到IC2, IC1, IC4 or IC3(一一对应) */
+#define TIM_INPUT_CAPTURE_SEL_TRC              TIM_CCM1_CC1S_TRC                  /**< TIM输入1, 2, 3 or 4,且被映射到TRC                              */
+
+/* TIM输入捕获预分频参数定义 */
+#define TIM_INPUT_CAPTURE_PSC_DIV1             (0x00000000U)                      /**< 无预分频器,捕获输入上每检测到一个边沿便执行捕获 */
+#define TIM_INPUT_CAPTURE_PSC_DIV2             TIM_CCM1_IC1PSC_DIV2               /**< 每发生2个事件执行一次捕获        */
+#define TIM_INPUT_CAPTURE_PSC_DIV4             TIM_CCM1_IC1PSC_DIV4               /**< 每发生4个事件执行一次捕获        */
+#define TIM_INPUT_CAPTURE_PSC_DIV8             TIM_CCM1_IC1PSC_DIV8               /**< 每发生8个事件执行一次捕获        */
+
+/* TIM输出比较极性定义 */
+#define TIM_OUTPUT_POL_HIGH                (0x00000000U)                      /**< 比较输出极性:高电平为有效电平      */
+#define TIM_OUTPUT_POL_LOW                 TIM_CCEN_CC1P                      /**< 比较输出极性:低电平为有效电平      */
+
+/* TIM输出比较输出使能定义 */
+#define TIM_OUTPUT_DISABLE                 (0x00000000U)                      /**< 比较通道输出禁止                    */
+#define TIM_OUTPUT_ENABLE                  TIM_CCEN_CC1E                      /**< 比较通道输出使能                    */
+
+/* TIM输出比较参数定义*/   
+#define TIM_OUTPUT_MODE_FROZEN                  (0x00000000U)                                /**< 冻结                          */
+#define TIM_OUTPUT_MODE_ACTIVE                  TIM_CCM1_OC1M_ACTIVE                         /**< 通道1设置为匹配时输出有效电平 */
+#define TIM_OUTPUT_MODE_INACTIVE                TIM_CCM1_OC1M_INACTIVE                       /**< 通道1设置为匹配时输出无效电平 */
+#define TIM_OUTPUT_MODE_TOGGLE                  TIM_CCM1_OC1M_TOGGLE                         /**< 翻转                          */
+#define TIM_OUTPUT_MODE_FORCED_INACTIVE         TIM_CCM1_OC1M_FORCED_INACTIVE                /**< 强制变为无效电平              */
+#define TIM_OUTPUT_MODE_FORCED_ACTIVE           TIM_CCM1_OC1M_FORCED_ACTIVE                  /**< 强制变为有效电平              */
+#define TIM_OUTPUT_MODE_PWM1                    TIM_CCM1_OC1M_PWM1                           /**< PWM模式1                      */
+#define TIM_OUTPUT_MODE_PWM2                    TIM_CCM1_OC1M_PWM2                           /**< PWM模式2                      */
+
+/*  TIM时钟源选择 */ 
+#define TIM_CLKSRC_INT                     (0x00000000U)                      /**< TIM时钟源:内部时钟           */
+#define TIM_CLKSRC_MODE1                   TIM_SMC_SM_SEL_EXT_MODE1           /**< TIM时钟源:外部时钟源模式1    */
+
+/* TIM时钟极性定义 */
+#define TIM_CLK_TIX_POL_RISING             (0x00000000U)                      /**< TIx时钟源的极性:上升沿有效   */
+#define TIM_CLK_TIX_POL_FALLING            TIM_CCEN_CC1P                      /**< TIx时钟源的极性:下降沿有效   */
+#define TIM_CLK_TIX_POL_BOTH               (TIM_CCEN_CC1P | TIM_CCEN_CC1NP)   /**< TIx时钟源的极性:双沿有效     */
+
+/* TIM事件源 */
+#define TIM_EVENT_SRC_UPDATE               TIM_EVTG_UG                       /**< 重新初始化计数器并生成一个更新事件      */
+#define TIM_EVENT_SRC_CC1                  TIM_EVTG_CC1G                     /**< 在通道1上生成一个捕获/比较事件          */
+#define TIM_EVENT_SRC_CC2                  TIM_EVTG_CC2G                     /**< 在通道2上生成一个捕获/比较事件          */ 
+#define TIM_EVENT_SRC_CC3                  TIM_EVTG_CC3G                     /**< 在通道3上生成一个捕获/比较事件          */ 
+#define TIM_EVENT_SRC_CC4                  TIM_EVTG_CC4G                     /**< 在通道4上生成一个捕获/比较事件          */ 
+#define TIM_EVENT_SRC_COM                  TIM_EVTG_COMG                     /**< 生成一个换相事件                        */
+#define TIM_EVENT_SRC_TRIG                 TIM_EVTG_TG                       /**< 生成一个触发事件                        */
+#define TIM_EVENT_SRC_BREAK                TIM_EVTG_BG                       /**< 生成一个断路事件                        */
+
+/* TIM中断定义 */
+#define TIM_INTERRUPT_UPDATE               TIM_DIER_UIE                       /**< 更新中断                */
+#define TIM_INTERRUPT_CC1                  TIM_DIER_CC1IE                     /**< 捕获/比较1中断          */
+#define TIM_INTERRUPT_CC2                  TIM_DIER_CC2IE                     /**< 捕获/比较1中断2         */
+#define TIM_INTERRUPT_CC3                  TIM_DIER_CC3IE                     /**< 捕获/比较1中断3         */
+#define TIM_INTERRUPT_CC4                  TIM_DIER_CC4IE                     /**< 捕获/比较1中断4         */
+#define TIM_INTERRUPT_COM                  TIM_DIER_COMIE                     /**< 换相中断                */
+#define TIM_INTERRUPT_TRIG                 TIM_DIER_TIE                       /**< 触发中断                */
+#define TIM_INTERRUPT_BREAK                TIM_DIER_BIE                       /**< 断路中断                */
+
+/* TIM标志定义 */
+#define TIM_FLAG_UPDATE                    TIM_SR_UIF                         /**< 更新中断标志              */
+#define TIM_FLAG_CC1                       TIM_SR_CC1IF                       /**< 捕获/比较1事件标志        */
+#define TIM_FLAG_CC2                       TIM_SR_CC2IF                       /**< 捕获/比较2事件标志        */
+#define TIM_FLAG_CC3                       TIM_SR_CC3IF                       /**< 捕获/比较3事件标志        */
+#define TIM_FLAG_CC4                       TIM_SR_CC4IF                       /**< 捕获/比较4事件标志        */
+#define TIM_FLAG_COM                       TIM_SR_COMIF                       /**< 换相事件标志              */
+#define TIM_FLAG_TRIG                      TIM_SR_TIF                         /**< 触发事件标志              */
+#define TIM_FLAG_BREAK                     TIM_SR_BIF                         /**< 断路事件标志              */
+#define TIM_FLAG_CC1OF                     TIM_SR_CC1OF                       /**< 捕获/比较1重复捕获标志    */
+#define TIM_FLAG_CC2OF                     TIM_SR_CC2OF                       /**< 捕获/比较2重复捕获标志    */
+
+#define TIM_FLAG_ALL                       (0xFFFF)                           /**< TIM事件标志               */
+#define TIM_FLAG_CCX_ALL                   (0x001E)                           /**< 全通道捕获/比较事件标志   */
+
+/* TIM清除OCxREF输出的输入源 */                               
+#define TIM_CLEAR_INPUT_SRC_COMP1          (0x00000000U)                    /**< OCREF_CLR_INPUT连接到COMP1的输出  */
+#define TIM_CLEAR_INPUT_SRC_COMP2          TIM_CFG_OCREF_CLR                /**< OCREF_CLR_INPUT连接到COMP2的输出  */
+
+/* TIM换相事件源 */
+#define TIM_COM_SOFTWARE                  (0x00000000U)                      /**< 如果捕获/比较控制位进行预装载(CCPC=1),仅通过将COMG位置1触发换相事件               */
+#define TIM_COM_TRGI                      TIM_CR2_CCU_SEL                    /**< 如果捕获/比较控制位进行预装载(CCPC=1),可通过将COMG位置1或TRIG的上升沿触发换相事件 */
+
+/* TIM主模式选择(TRIG_OUT)参数定义*/
+#define TIM_TRIG_OUT_RESET                 (0x00000000U)                         /**< TIM1_EVTG寄存器中的UG位用作触发输出(TRIG_OUT)  */
+#define TIM_TRIG_OUT_ENABLE                TIM_CR2_MM_SEL_ENABLE                 /**< 计数器使能信号CEN用作触发输出(TRIG_OUT)        */
+#define TIM_TRIG_OUT_UPDATE                TIM_CR2_MM_SEL_UPDATE                 /**< 选择更新事件作为触发输出(TRIG_OUT)             */
+#define TIM_TRIG_OUT_CC1                   TIM_CR2_MM_SEL_CC1IF                  /**< 捕获或比较匹配,触发输出(TRIG_OUT)             */
+#define TIM_TRIG_OUT_OC1REF                TIM_CR2_MM_SEL_OC1REF                 /**< OC1REF信号用作触发输出(TRIG_OUT)                 */
+#define TIM_TRIG_OUT_OC2REF                TIM_CR2_MM_SEL_OC2REF                 /**< OC2REF信号用作触发输出(TRIG_OUT)                 */
+#define TIM_TRIG_OUT_OC3REF                TIM_CR2_MM_SEL_OC3REF                 /**< OC3REF信号用作触发输出(TRIG_OUT)                 */
+#define TIM_TRIG_OUT_OC4REF                TIM_CR2_MM_SEL_OC4REF                 /**< OC4REF信号用作触发输出(TRIG_OUT)                 */
+
+/* TIM从模式参数定义*/
+#define TIM_SLAVE_MODE_DISABLE             (0x00000000U)                              /**< 禁止从模式          */
+#define TIM_SLAVE_MODE_RESET               TIM_SMC_SM_SEL_RESET                       /**< 复位模式            */
+#define TIM_SLAVE_MODE_GATED               TIM_SMC_SM_SEL_GATED                       /**< 门控模式            */
+#define TIM_SLAVE_MODE_TRIG                TIM_SMC_SM_SEL_TRIG                        /**< 触发模式            */
+
+/* TIM触发选择参数定义*/
+#define TIM_TRIG_SOURCE_ITR0               TIM_SMC_TS_ITR0                              /**< 内部触发0(ITR0)               */
+#define TIM_TRIG_SOURCE_TI1F_ED            TIM_SMC_TS_TI1F_ED                           /**< TI1边沿检测器(TI1F_ED)        */
+#define TIM_TRIG_SOURCE_TI1FP1             TIM_SMC_TS_TI1FP1                            /**< 滤波后的定时器输入1(TI1FP1)   */
+#define TIM_TRIG_SOURCE_TI2FP2             TIM_SMC_TS_TI2FP2                            /**< 滤波后的定时器输入2(TI1FP2)   */
+
+/* TIM触发极性参数定义*/
+#define TIM_TRIG_TIX_POL_RISING            (0x00000000U)                        /**< TIxFPx或TI1F_ED触发极性:高电平或上升沿有效   */
+#define TIM_TRIG_TIX_POL_FALLING           TIM_CCEN_CC1P                        /**< TIxFPx或TI1F_ED触发极性:低电平或下降沿有效   */
+#define TIM_TRIG_TIX_POL_BOTH              (TIM_CCEN_CC1P | TIM_CCEN_CC1NP)     /**< TIxFPx或TI1F_ED触发极性:上升下降均触发       */
+                                                                                       
+/* TIM输出比较互补输出极性定义 */
+#define TIM_OUTPUT_NEGTIVE_POL_HIGH        (0x00000000U)                      /**< 互补输出极性为高电平有效      */
+#define TIM_OUTPUT_NEGTIVE_POL_LOW         TIM_CCEN_CC1NP                     /**< 互补输出极性为低电平有效      */
+
+/* TIM输出比较互补输出使能定义 */
+#define TIM_OUTPUT_NEGTIVE_DISABLE         (0x00000000U)                      /**< 互补输出通道输出禁止          */
+#define TIM_OUTPUT_NEGTIVE_ENABLE          TIM_CCEN_CC1NE                     /**< 互补输出通道输出使能          */
+
+/* TIM空闲状态下输出状态定义 */
+#define TIM_OUTPUT_IDLE_RESET              (0x00000000U)                      /**< 空闲状态为: 当MOEN=0时OCx输出低电平   */
+#define TIM_OUTPUT_IDLE_SET                TIM_CR2_OIS1                       /**< 空闲状态为: 当MOEN=0时OCx输出高电平   */
+
+/* TIM空闲状态下互补输出状态定义 */
+#define TIM_OUTPUT_NEGTIVE_IDLE_RESET      (0x00000000U)                      /**< 互补输出空闲状态为: 当MOEN=0时OCxN输出低电平  */
+#define TIM_OUTPUT_NEGTIVE_IDLE_SET        TIM_CR2_OIS1N                      /**< 互补输出空闲状态为: 当MOEN=0时OCxN输出高电平  */
+
+/* TIM运行模式下关闭状态选择参数定义 */                                         
+#define TIM_OSSR_DISABLE                   (0x00000000U)               /**< 处于无效状态时,OC/OCN输出禁止(不再受定时器控制)     */
+#define TIM_OSSR_ENABLE                    TIM_BDT_OSSR                /**< 处于无效状态时,OC/OCN输出使能(仍然受定时器控制)     */
+                                                                               
+/* TIM空闲模式下关闭状态选择参数定义 */                                         
+#define TIM_OSSI_DISABLE                   (0x00000000U)               /**< 处于无效状态时,OC/OCN输出禁止(不再受定时器控制)     */
+#define TIM_OSSI_ENABLE                    TIM_BDT_OSSI                /**< 处于无效状态时,OC/OCN输出使能(仍然受定时器控制)     */
+
+/* TIM锁级别定义*/
+#define TIM_LOCK_LEVEL_OFF                 (0x00000000U)                      /**< 锁级别0         */
+#define TIM_LOCK_LEVEL1                    TIM_BDT_LOCK_LEVEL1                /**< 锁级别1         */
+#define TIM_LOCK_LEVEL2                    TIM_BDT_LOCK_LEVEL2                /**< 锁级别2         */
+#define TIM_LOCK_LEVEL3                    TIM_BDT_LOCK_LEVEL3                /**< 锁级别3         */
+
+/* TIM断路输入使能*/                                                            
+#define TIM_BREAK_DISABLE                  (0x00000000U)                      /**< 禁止断路输入    */
+#define TIM_BREAK_ENABLE                   TIM_BDT_BKEN                       /**< 使能断路输入    */                                                                              
+                                                                              
+/* TIM断路输入源定义 */                                                       
+#define TIM_BREAK_INPUT_SRC_GPIO           TIM1_AF1_BKINE                      /**< GPIO接到BKIN引脚上          */    
+#define TIM_BREAK_INPUT_SRC_COMP1          TIM1_AF1_BKCMP1E                    /**< COMP1输出接到断路输入       */
+#define TIM_BREAK_INPUT_SRC_COMP2          TIM1_AF1_BKCMP2E                    /**< COMP2输出接到断路输入       */       
+  
+/* TIM断路输入极性定义 */                                                                                                    
+#define TIM_BREAK_INPUT_POL_HIGH           TIM1_AF1_BKINP                      /**< 断路输入源为高电平      */
+#define TIM_BREAK_INPUT_POL_LOW            (0x00000000U)                       /**< 断路输入源为低电平      */ 
+                                                                                                                                                                              
+/* TIM外部时钟输入选择  */                                                                                                                                                    
+#define TIM_TIM3_TI1_GPIO                  TIM_TISEL_TI1_SEL_CH1                      /**< TIM3_TI1连接到GPIO       */
+#define TIM_TIM3_TI1_COMP1                 TIM_TISEL_TI1_SEL_COMP1                    /**< TIM3_TI1连接到COMP1输出  */    
+                                                                                       
+#define TIM_TIM3_TI2_GPIO                  TIM_TISEL_TI2_SEL_CH2                      /**< TIM3_TI2连接到GPIO       */  
+#define TIM_TIM3_TI2_COMP2                 TIM_TISEL_TI2_SEL_COMP2                    /**< TIM3_TI2连接到COMP2输出  */                                                                                                                                                 
+
+
+/**
+* @}
+*/
+
+
+/*-------------------------------------------functions------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @defgroup TIM_External_Functions TIM External Functions
+* @brief    TIM对外函数
+* @{
+*
+*/
+/************************************************************************************************/
+/**
+* @brief  TIM启动计数
+* @param  timx TIM外设
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_enable(TIM_t *timx)
+{
+    timx->CR1 |= TIM_CR1_CEN;    
+}
+
+/**
+* @brief  TIM停止计数
+* @param  timx TIM外设
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_disable(TIM_t *timx)
+{
+    timx->CR1 &= (~TIM_CR1_CEN);
+}
+
+
+/**
+* @brief  设置TIM预分频参数
+* @param  timx TIM外设
+* @param  presc 预分频新值
+* @note   TIM1预分频参数范围为:0x0000~0xFFFF    
+*         TIM3预分频参数范围为:0x0000~0x000F
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_set_psc(TIM_t *timx, uint32_t presc)          
+{
+    timx->PSC = (presc);
+}
+
+
+/**
+* @brief  获取TIM预分频参数
+* @param  timx TIM外设
+* @retval uint32_t TIM预分频值
+*/
+__STATIC_INLINE uint32_t std_tim_get_psc(TIM_t *timx)          
+{
+    return (timx->PSC);    
+}
+
+
+/**
+* @brief  设置TIM计数值
+* @param  timx TIM外设 
+* @param  counter 计数新值
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_set_counter(TIM_t *timx, uint32_t counter)     
+{
+    timx->CNT = (counter);
+}
+
+/**
+* @brief  获取TIM计数值
+* @param  timx TIM外设
+* @retval uint32_t TIM计数值
+*/
+__STATIC_INLINE uint32_t std_tim_get_counter(TIM_t *timx)   
+{
+    return (timx->CNT);
+}
+
+/**
+* @brief  设置TIM ARR值
+* @param  timx TIM外设
+* @param  autoreload ARR值
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_set_autoreload(TIM_t *timx, uint32_t autoreload)
+{
+    timx->ARR = (autoreload); 
+}
+                                                            
+/**
+* @brief  获取TIM ARR值
+* @param  timx TIM外设
+* @retval uint32_t TIM ARR值
+*/
+__STATIC_INLINE uint32_t std_tim_get_autoreload(TIM_t *timx)
+{
+    return (timx->ARR);
+}
+
+
+/**
+* @brief  设置TIM RCR值
+* @param  timx TIM外设
+* @param  rcr TIM RCR值
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_set_repcounter(TIM_t *timx, uint32_t rcr)
+{
+    timx->RCR = (rcr);
+}
+
+
+/**
+* @brief  获取TIM RCR值
+* @param  timx TIM外设
+* @retval uint32_t TIM RCR值
+*/
+__STATIC_INLINE uint32_t std_tim_get_repcounter(TIM_t *timx)
+{
+    return (timx->RCR);
+}
+
+
+/**
+* @brief  设置TIM时钟分频值
+* @param  timx TIM外设
+* @param  clk_div 时钟分频值
+*             @arg TIM_CLOCK_DTS_DIV1:  tDTS=tTIM_KCLK
+*             @arg TIM_CLOCK_DTS_DIV2:  tDTS=2*tTIM_KCLK
+*             @arg TIM_CLOCK_DTS_DIV4:  tDTS=4*tTIM_KCLK
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_set_clock_div(TIM_t *timx, uint32_t clk_div) 
+{
+    MODIFY_REG(timx->CR1, TIM_CR1_CLK_DIV, clk_div);    
+}
+
+/**
+* @brief  获取TIM时钟分频值
+* @param  timx TIM外设
+* @retval uint32_t 时钟分频值
+*             @arg TIM_CLOCK_DIV1: tDTS=tTIM_KCLK
+*             @arg TIM_CLOCK_DIV2: tDTS=2*tTIM_KCLK
+*             @arg TIM_CLOCK_DIV4: tDTS=4*tTIM_KCLK
+*/
+__STATIC_INLINE uint32_t std_tim_get_clock_div(TIM_t *timx)           
+{
+    return (timx->CR1 & TIM_CR1_CLK_DIV);
+}
+
+/**
+* @brief  使能自动重载功能
+* @param  timx TIM外设
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_arrpreload_enable(TIM_t *timx)           
+{
+    timx->CR1 |= TIM_CR1_ARPE;
+}
+
+/**
+* @brief  禁止自动重载功能
+* @param  timx TIM外设
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_arrpreload_disable(TIM_t *timx)           
+{
+    timx->CR1 &= (~TIM_CR1_ARPE);
+}
+
+/**
+* @brief  使能更新事件
+* @param  timx TIM外设
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_updateevent_enable(TIM_t *timx)
+{
+    timx->CR1 |= TIM_CR1_UDIS;
+}
+
+/**
+* @brief  禁止更新事件
+* @param  timx TIM外设
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_updateevent_disable(TIM_t *timx)
+{
+    timx->CR1 &= (~TIM_CR1_UDIS);
+}
+
+/**
+* @brief  设置更新事件源
+* @param  timx TIM外设
+* @param  update_source 更新事件源选择
+*             @arg TIM_UPDATE_SOURCE_REGULAR
+*             @arg TIM_UPDATE_SOURCE_COUNTER
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_set_update_source(TIM_t *timx, uint32_t update_source)
+{
+    MODIFY_REG(timx->CR1, TIM_CR1_URS, update_source);
+}
+
+
+/**
+* @brief  获取更新事件源
+* @param  timx TIM外设
+* @retval uint32_t 更新事件源选择
+*             @arg TIM_UPDATE_SOURCE_REGULAR
+*             @arg TIM_UPDATE_SOURCE_COUNTER
+*/
+__STATIC_INLINE uint32_t std_tim_get_update_source(TIM_t *timx)
+{
+    return (timx->CR1 & TIM_CR1_URS);
+}
+
+
+/**
+* @brief  使能工作模式1
+* @param  timx TIM外设
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_work_mode1_enable(TIM_t *timx)
+{
+    timx->CR1 |= TIM_CR1_MODE;
+}
+
+/**
+* @brief  禁止工作模式1
+* @param  timx TIM外设
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_work_mode1_disable(TIM_t *timx)
+{
+    timx->CR1 &= (~TIM_CR1_MODE);
+}
+
+
+/**
+* @brief  设置计数模式
+* @param  timx TIM外设
+* @param  counter_mode 计数方式
+*             @arg TIM_COUNTER_MODE_UP
+*             @arg TIM_COUNTER_MODE_DOWN
+*             @arg TIM_COUNTER_MODE_CENT_MODE1
+*             @arg TIM_COUNTER_MODE_CENT_MODE2
+*             @arg TIM_COUNTER_MODE_CENT_MODE3
+* @note   由于DIR控制位在中心对齐模式下为只读权限,当从中心对齐模式切换到边沿模式时,避免计数方向修改异常,应先复位一次TIM
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_set_counter_mode(TIM_t *timx, uint32_t counter_mode)
+{
+    MODIFY_REG(timx->CR1, (TIM_CR1_DIR | TIM_CR1_CMS), counter_mode);
+}
+
+/**
+* @brief  获取计数模式
+* @param  timx TIM外设
+* @retval uint32_t 计数方式
+*             @arg TIM_COUNTER_MODE_UP
+*             @arg TIM_COUNTER_MODE_DOWN
+*             @arg TIM_COUNTER_MODE_CENT_MODE1
+*             @arg TIM_COUNTER_MODE_CENT_MODE2
+*             @arg TIM_COUNTER_MODE_CENT_MODE3
+*/
+__STATIC_INLINE uint32_t std_tim_get_counter_mode(TIM_t *timx)
+{
+    if(timx->CR1 & TIM_CR1_CMS)
+    {
+        return (timx->CR1 & TIM_CR1_CMS);
+    }
+    else
+    {
+        return (timx->CR1 & TIM_CR1_DIR);       
+    }
+}
+
+/**
+* @brief  获取TIM计数方向
+* @param  timx TIM外设
+* @retval uint32_t 返回TIM计数方向标志
+*             @arg 非0: 当前计数方向为向下计数
+*             @arg 0:当前计数方向为向上计数
+*/
+__STATIC_INLINE uint32_t std_tim_get_count_dir(TIM_t *timx)  
+{
+    return (timx->CR1 & TIM_CR1_DIR);
+}
+
+
+/**
+* @brief  使能单脉冲模式
+* @param  timx TIM外设
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_onepulse_enable(TIM_t *timx)
+{
+    timx->CR1 |= TIM_CR1_OPM;
+}
+
+/**
+* @brief  禁止单脉冲模式
+* @param  timx TIM外设
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_onepulse_disable(TIM_t *timx)
+{
+    timx->CR1 &= (~TIM_CR1_OPM);
+}
+
+/**
+* @brief  获取单脉冲模式
+* @param  timx TIM外设
+* @retval uint32_t 返回单脉冲计数模式
+*             @arg 非0: 当前配置为单脉冲模式
+*             @arg 0:当前配置为连续计数模式
+*/
+__STATIC_INLINE uint32_t std_tim_get_onepulse_mode(TIM_t *timx)
+{
+    return (timx->CR1 & (TIM_CR1_OPM));
+}
+
+
+/**
+* @brief  设置计数时钟源参数
+* @param  timx TIM外设
+* @param  clock_source 时钟源选择
+*             @arg TIM_CLKSRC_INT:   内部时钟源
+*             @arg TIM_CLKSRC_MODE1: 外部时钟模式1
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_clock_source_config(TIM_t *timx, uint32_t clock_source)
+{
+    MODIFY_REG(timx->SMC, TIM_SMC_SM_SEL, clock_source);
+}
+
+
+/**
+* @brief  生成一个软件事件
+* @param  timx TIM外设
+* @param  event_src 事件源
+*             @arg TIM_EVENT_SRC_UPDATE:更新事件源
+*             @arg TIM_EVENT_SRC_CC1:   捕获比较1事件源
+*             @arg TIM_EVENT_SRC_CC2:   捕获比较2事件源
+*             @arg TIM_EVENT_SRC_CC3:   捕获比较3事件源
+*             @arg TIM_EVENT_SRC_CC4:   捕获比较4事件源
+*             @arg TIM_EVENT_SRC_COM:   换相事件源
+*             @arg TIM_EVENT_SRC_TRIG:  触发事件源
+*             @arg TIM_EVENT_SRC_BREAK: 断路事件源
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_set_sw_trig_event(TIM_t *timx, uint32_t event_src)
+{
+    timx->EVTG = event_src;
+}
+
+
+/** 
+* @brief  TIM中断使能
+* @param  timx TIM外设
+* @param  interrupt TIM中断源
+*             @arg TIM_INTERRUPT_UPDATE:  更新中断
+*             @arg TIM_INTERRUPT_CC1:     捕获/比较1中断
+*             @arg TIM_INTERRUPT_CC2:     捕获/比较2中断
+*             @arg TIM_INTERRUPT_CC3:     捕获/比较3中断
+*             @arg TIM_INTERRUPT_CC4:     捕获/比较4中断
+*             @arg TIM_INTERRUPT_COM:     换相中断
+*             @arg TIM_INTERRUPT_TRIG:    触发中断
+*             @arg TIM_INTERRUPT_BREAK:   断路中断
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_interrupt_enable(TIM_t *timx, uint32_t interrupt)    
+{
+    timx->DIER |= (interrupt);
+}
+
+/** 
+* @brief  TIM中断禁止
+* @param  timx TIM外设
+* @param  interrupt TIM中断源
+*             @arg TIM_INTERRUPT_UPDATE:  更新中断
+*             @arg TIM_INTERRUPT_CC1:     捕获/比较1中断
+*             @arg TIM_INTERRUPT_CC2:     捕获/比较2中断
+*             @arg TIM_INTERRUPT_CC3:     捕获/比较3中断
+*             @arg TIM_INTERRUPT_CC4:     捕获/比较4中断
+*             @arg TIM_INTERRUPT_COM:     换相中断
+*             @arg TIM_INTERRUPT_TRIG:    触发中断
+*             @arg TIM_INTERRUPT_BREAK:   断路中断
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_interrupt_disable(TIM_t *timx, uint32_t interrupt)   
+{
+    timx->DIER &= (~(interrupt));
+}
+
+
+/**
+* @brief  获取TIM中断源的状态
+* @param  timx TIM外设
+* @param  interrupt TIM中断源信息
+*             @arg TIM_INTERRUPT_UPDATE:  更新中断
+*             @arg TIM_INTERRUPT_CC1:     捕获/比较1中断
+*             @arg TIM_INTERRUPT_CC2:     捕获/比较2中断
+*             @arg TIM_INTERRUPT_CC3:     捕获/比较3中断
+*             @arg TIM_INTERRUPT_CC4:     捕获/比较4中断
+*             @arg TIM_INTERRUPT_COM:     换相中断
+*             @arg TIM_INTERRUPT_TRIG:    触发中断
+*             @arg TIM_INTERRUPT_BREAK:   断路中断
+* @retval uint32_t 返回中断请求源的状态 
+*/  
+__STATIC_INLINE uint32_t std_tim_get_interrupt_enable(TIM_t *timx, uint32_t interrupt)   
+{
+    return (timx->DIER & (interrupt));
+}
+
+
+/** 
+* @brief  获取TIM标志状态
+* @param  timx TIM外设
+* @param  flag TIM标志信息
+*             @arg TIM_FLAG_UPDATE:       更新事件标志
+*             @arg TIM_FLAG_CC1:          捕获/比较1事件标志
+*             @arg TIM_FLAG_CC2:          捕获/比较2事件标志
+*             @arg TIM_FLAG_CC3:          捕获/比较3事件标志
+*             @arg TIM_FLAG_CC4:          捕获/比较4事件标志
+*             @arg TIM_FLAG_COM:          换相事件标志
+*             @arg TIM_FLAG_TRIG:         触发事件标志
+*             @arg TIM_FLAG_BREAK:        断路事件标志
+*             @arg TIM_FLAG_CC1OF:        捕获/比较1重复捕获标志
+*             @arg TIM_FLAG_CC2OF:        捕获/比较2重复捕获标志
+*             @arg TIM_FLAG_CCX_ALL:      全通道捕获/比较事件标志
+*             @arg TIM_FLAG_ALL:          TIM事件标志
+* @retval uint32_t 返回标志的状态 
+*             @arg 非0: 当前标志为置起状态 
+*             @arg 0:当前标志为清除状态
+*/
+__STATIC_INLINE uint32_t std_tim_get_flag(TIM_t *timx, uint32_t flag)          
+{
+    return (timx->SR &(flag));
+}
+
+
+/** 
+* @brief  清除TIM标志
+* @param  timx TIM外设
+* @param  flag 清除TIM标志
+*             @arg TIM_FLAG_UPDATE:       更新事件标志
+*             @arg TIM_FLAG_CC1:          捕获/比较1事件标志
+*             @arg TIM_FLAG_CC2:          捕获/比较2事件标志
+*             @arg TIM_FLAG_CC3:          捕获/比较3事件标志
+*             @arg TIM_FLAG_CC4:          捕获/比较4事件标志
+*             @arg TIM_FLAG_COM:          换相事件标志
+*             @arg TIM_FLAG_TRIG:         触发事件标志
+*             @arg TIM_FLAG_BREAK:        断路事件标志
+*             @arg TIM_FLAG_CC1OF:        捕获/比较1重复捕获标志
+*             @arg TIM_FLAG_CC2OF:        捕获/比较2重复触发标志
+*             @arg TIM_FLAG_CCX_ALL:      全通道捕获/比较事件标志
+*             @arg TIM_FLAG_ALL:          TIM事件标志
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_clear_flag(TIM_t *timx, uint32_t flag)
+{
+    timx->SR = (~(flag));
+}
+
+
+/**
+* @brief  使能TIM比较/匹配通道
+* @param  timx TIM外设
+* @param  channel_id 指定TIM通道
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+*             @arg TIM_CHANNEL_3
+*             @arg TIM_CHANNEL_4
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_ccx_channel_enable(TIM_t *timx, uint32_t channel_id)
+{  
+    timx->CCEN |= (TIM_CCEN_CC1E << (channel_id << 2));
+}
+
+
+/**
+* @brief  禁止TIM比较/匹配通道
+* @param  timx TIM外设
+* @param  channel_id 指定TIM通道
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+*             @arg TIM_CHANNEL_3
+*             @arg TIM_CHANNEL_4
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_ccx_channel_disable(TIM_t *timx, uint32_t channel_id)
+{     
+    timx->CCEN &= (~(TIM_CCEN_CC1E << (channel_id << 2)));
+}
+
+
+/**
+* @brief  使能TIM互补输出通道
+* @param  timx TIM外设
+* @param  channel_id 指定TIM通道
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+*             @arg TIM_CHANNEL_3
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_ccxn_channel_enable(TIM_t *timx, uint32_t channel_id)
+{    
+    timx->CCEN |= (TIM_CCEN_CC1NE << (channel_id << 2));
+}
+
+
+/**
+* @brief  禁止TIM互补输出通道
+* @param  timx TIM外设
+* @param  channel_id 指定TIM通道
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+*             @arg TIM_CHANNEL_3
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_ccxn_channel_disable(TIM_t *timx, uint32_t channel_id)
+{ 
+    timx->CCEN &= (~(TIM_CCEN_CC1NE << (channel_id << 2)));
+}
+
+
+/**
+* @brief  配置TIM输入捕获通道极性
+* @param  timx TIM外设
+* @param  channel_id 指定TIM通道
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+* @param  input_capture_pol 输入极性
+*             @arg TIM_INPUT_POL_RISING
+*             @arg TIM_INPUT_POL_FALLING
+*             @arg TIM_INPUT_POL_BOTH
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_set_input_pol(TIM_t *timx, uint32_t channel_id, uint32_t input_capture_pol)
+{ 
+    MODIFY_REG(timx->CCEN, ((TIM_CCEN_CC1P | TIM_CCEN_CC1NP) << (channel_id << 2)), (input_capture_pol << (channel_id << 2)));
+}
+
+/**
+* @brief  获取TIM输入捕获通道极性
+* @param  timx TIM外设
+* @param  channel_id 指定TIM通道
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+* @retval uint32_t 输入极性
+*             @arg TIM_INPUT_POL_RISING
+*             @arg TIM_INPUT_POL_FALLING
+*             @arg TIM_INPUT_POL_BOTH
+*/
+__STATIC_INLINE uint32_t std_tim_get_input_pol(TIM_t *timx, uint32_t channel_id)
+{ 
+    return (((timx->CCEN) >> (channel_id << 2)) & (TIM_CCEN_CC1P | TIM_CCEN_CC1NP));
+}
+
+
+/**
+* @brief  配置TIM通道输出的极性
+* @param  timx TIM外设
+* @param  channel_id 指定TIM通道
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+*             @arg TIM_CHANNEL_3
+*             @arg TIM_CHANNEL_4
+* @param  output_commpare_pol 输出极性
+*             @arg TIM_OUTPUT_POL_HIGH
+*             @arg TIM_OUTPUT_POL_LOW
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_set_output_pol(TIM_t *timx, uint32_t channel_id, uint32_t output_commpare_pol)
+{ 
+    MODIFY_REG(timx->CCEN, (TIM_CCEN_CC1P << (channel_id << 2)), (output_commpare_pol << (channel_id << 2)));
+}
+
+/**
+* @brief  获取TIM通道输出的极性
+* @param  timx TIM外设
+* @param  channel_id 指定TIM通道
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+*             @arg TIM_CHANNEL_3
+*             @arg TIM_CHANNEL_4
+* @retval uint32_t 输出极性
+*             @arg TIM_OUTPUT_POL_HIGH
+*             @arg TIM_OUTPUT_POL_LOW
+*/
+__STATIC_INLINE uint32_t std_tim_get_output_pol(TIM_t *timx, uint32_t channel_id)
+{ 
+    return (((timx->CCEN) >> (channel_id << 2)) & TIM_CCEN_CC1P);
+}
+
+
+/**
+* @brief  配置TIM互补通道的输出极性
+* @param  timx TIM外设
+* @param  channel_id 指定TIM通道
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+*             @arg TIM_CHANNEL_3
+* @param  negtive_output_pol 互补通道的输出极性
+*             @arg TIM_OUTPUT_NEGTIVE_POL_HIGH
+*             @arg TIM_OUTPUT_NEGTIVE_POL_LOW
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_set_negtive_output_pol(TIM_t *timx, uint32_t channel_id, uint32_t negtive_output_pol)
+{ 
+    MODIFY_REG(timx->CCEN, (TIM_CCEN_CC1NP << (channel_id << 2)), (negtive_output_pol << (channel_id << 2)));
+}
+
+/**
+* @brief  获取TIM互补通道的输出极性
+* @param  timx TIM外设
+* @param  channel_id 指定TIM通道
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+*             @arg TIM_CHANNEL_3
+* @retval uint32_t 互补通道的输出极性
+*             @arg TIM_OUTPUT_NEGTIVE_POL_HIGH
+*             @arg TIM_OUTPUT_NEGTIVE_POL_LOW
+*/
+__STATIC_INLINE uint32_t std_tim_get_negtive_output_pol(TIM_t *timx, uint32_t channel_id)
+{ 
+    return (((timx->CCEN) >> (channel_id << 2)) & TIM_CCEN_CC1NP);
+}
+
+
+/**
+* @brief  配置TIM通道的空闲状态
+* @param  timx TIM外设
+* @param  channel_id 指定TIM通道
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+*             @arg TIM_CHANNEL_3
+*             @arg TIM_CHANNEL_4
+* @param  idle_state 通道空闲状态
+*             @arg TIM_OUTPUT_IDLE_RESET
+*             @arg TIM_OUTPUT_IDLE_SET
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_set_output_idlestate(TIM_t *timx, uint32_t channel_id, uint32_t idle_state)
+{ 
+    MODIFY_REG(timx->CR2, (TIM_CR2_OIS1 << (channel_id << 1)), (idle_state << (channel_id << 1)));
+}
+
+/**
+* @brief  获取TIM通道的空闲状态
+* @param  timx TIM外设
+* @param  channel_id 指定TIM通道
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+*             @arg TIM_CHANNEL_3
+*             @arg TIM_CHANNEL_4
+* @retval uint32_t 通道空闲状态
+*             @arg TIM_OUTPUT_IDLE_RESET
+*             @arg TIM_OUTPUT_IDLE_SET
+*/
+__STATIC_INLINE uint32_t std_tim_get_output_idlestate(TIM_t *timx, uint32_t channel_id)
+{ 
+    return (((timx->CR2) >> (channel_id << 1)) & TIM_CR2_OIS1);    
+}
+
+/**
+* @brief  配置TIM互补通道的空闲状态
+* @param  timx TIM外设
+* @param  channel_id 指定TIM通道
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+*             @arg TIM_CHANNEL_3
+* @param  negtive_idlestate 互补通道空闲状态
+*             @arg TIM_OUTPUT_NEGTIVE_IDLE_RESET
+*             @arg TIM_OUTPUT_NEGTIVE_IDLE_SET
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_set_negtive_output_idlestate(TIM_t *timx, uint32_t channel_id, uint32_t negtive_idlestate)
+{ 
+    MODIFY_REG(timx->CR2, (TIM_CR2_OIS1N << (channel_id << 1)), (negtive_idlestate << (channel_id << 1)));
+}
+
+/**
+* @brief  获取TIM互补通道的空闲状态
+* @param  timx TIM外设
+* @param  channel_id 指定TIM通道
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+*             @arg TIM_CHANNEL_3
+* @retval uint32_t 互补通道空闲状态
+*             @arg TIM_OUTPUT_NEGTIVE_IDLE_RESET
+*             @arg TIM_OUTPUT_NEGTIVE_IDLE_SET
+*/
+__STATIC_INLINE uint32_t std_tim_get_negtive_output_idlestate(TIM_t *timx, uint32_t channel_id)
+{ 
+    return (((timx->CR2) >> (channel_id << 1)) & TIM_CR2_OIS1N);        
+}
+
+/**
+* @brief  使能清除OCxREF功能
+* @param  timx TIM外设
+* @param  channel_id 指定TIM通道
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+*             @arg TIM_CHANNEL_3
+*             @arg TIM_CHANNEL_4
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_channel_clear_ocxref_enable(TIM_t *timx, uint32_t channel_id)
+{
+    uint32_t tmp_value = ((channel_id & 0x01) == 0)?0U:8U;
+    uint32_t shift_value = ((channel_id & 0x02) == 0)?0U:4U;    
+    __IO uint32_t *preg = (__IO uint32_t *)((uint32_t)(&timx->CCM1) + shift_value);
+    
+    /* 使能清除OCxREF */ 
+    *preg |= (TIM_CCM1_OC1CE << tmp_value);
+}
+
+/**
+* @brief  禁止清除OCxREF功能
+* @param  timx TIM外设
+* @param  channel_id 指定TIM通道
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+*             @arg TIM_CHANNEL_3
+*             @arg TIM_CHANNEL_4
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_channel_clear_ocxref_disable(TIM_t *timx, uint32_t channel_id)
+{
+    uint32_t tmp_value = ((channel_id & 0x01) == 0)?0U:8U;
+    uint32_t shift_value = ((channel_id & 0x02) == 0)?0U:4U;      
+    __IO uint32_t *preg = (__IO uint32_t *)((uint32_t)(&timx->CCM1) + shift_value);
+    
+    /* 禁止清除OCxREF */ 
+    *preg &= (~(TIM_CCM1_OC1CE << tmp_value));
+}
+
+/**
+* @brief  设置输入捕获预分频值
+* @param  timx TIM外设
+* @param  channel_id 指定TIM通道
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+* @param  icxpsc_num 输入捕获预分频值
+*             @arg TIM_INPUT_CAPTURE_PSC_DIV1
+*             @arg TIM_INPUT_CAPTURE_PSC_DIV2
+*             @arg TIM_INPUT_CAPTURE_PSC_DIV4
+*             @arg TIM_INPUT_CAPTURE_PSC_DIV8
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_set_channel_icxpsc(TIM_t *timx, uint32_t channel_id, uint32_t icxpsc_num)
+{
+    uint32_t tmp_value = ((channel_id & 0x01) == 0)?0U:8U;
+    uint32_t shift_value = ((channel_id & 0x02) == 0)?0U:4U;      
+    __IO uint32_t *preg = (__IO uint32_t *)((uint32_t)(&timx->CCM1) + shift_value);
+    
+    /* 设置输入捕获预分频 */ 
+    MODIFY_REG(*preg, (TIM_CCM1_IC1PSC << tmp_value), (icxpsc_num << tmp_value));
+}
+
+
+/**
+* @brief  获取输入捕获预分频值
+* @param  timx TIM外设
+* @param  channel_id 指定TIM通道
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+* @retval uint32_t 输入捕获预分频值
+*             @arg TIM_INPUT_CAPTURE_PSC_DIV1
+*             @arg TIM_INPUT_CAPTURE_PSC_DIV2
+*             @arg TIM_INPUT_CAPTURE_PSC_DIV4
+*             @arg TIM_INPUT_CAPTURE_PSC_DIV8
+*/
+__STATIC_INLINE uint32_t std_tim_get_channel_icxpsc(TIM_t *timx, uint32_t channel_id)
+{
+    uint32_t tmp_value = ((channel_id & 0x01) == 0)?0U:8U;
+    uint32_t shift_value = ((channel_id & 0x02) == 0)?0U:4U;        
+    __IO uint32_t *preg = (__IO uint32_t *)((uint32_t)(&timx->CCM1) + shift_value);
+    
+    /* 获取输入捕获预分频 */ 
+    return ((*preg >> tmp_value) & TIM_CCM1_IC1PSC);
+    
+}
+
+
+/**
+* @brief  使能TIM通道输出比较的预装载功能
+* @param  timx TIM外设
+* @param  channel_id 指定TIM通道
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+*             @arg TIM_CHANNEL_3
+*             @arg TIM_CHANNEL_4
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_preloadccx_channel_enable(TIM_t *timx, uint32_t channel_id)
+{ 
+    uint32_t tmp_value = ((channel_id & 0x01) == 0)?0U:8U;
+    uint32_t shift_value = ((channel_id & 0x02) == 0)?0U:4U;        
+    __IO uint32_t *preg = (__IO uint32_t *)((uint32_t)(&timx->CCM1) + shift_value);    
+ 
+    /* 使能输出比较预装载功能 */ 
+    *preg |= (TIM_CCM1_OC1PE << tmp_value);
+}
+
+
+/**
+* @brief  禁止TIM通道输出比较的预装载功能
+* @param  timx TIM外设
+* @param  channel_id 指定TIM通道
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+*             @arg TIM_CHANNEL_3
+*             @arg TIM_CHANNEL_4
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_preloadccx_channel_disable(TIM_t *timx, uint32_t channel_id)
+{ 
+    uint32_t tmp_value = ((channel_id & 0x01) == 0)?0U:8U;
+    uint32_t shift_value = ((channel_id & 0x02) == 0)?0U:4U;        
+    __IO uint32_t *preg = (__IO uint32_t *)((uint32_t)(&timx->CCM1) + shift_value);    
+ 
+    /* 使能输出比较预装载功能 */ 
+    *preg &= (~(TIM_CCM1_OC1PE << tmp_value));
+}
+
+
+/**
+* @brief  使能TIM通道快速模式
+* @param  timx TIM外设
+* @param  channel_id 指定TIM通道
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+*             @arg TIM_CHANNEL_3
+*             @arg TIM_CHANNEL_4
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_fastmode_channel_enable(TIM_t *timx, uint32_t channel_id)
+{ 
+    uint32_t tmp_value = ((channel_id & 0x01) == 0)?0U:8U;
+    uint32_t shift_value = ((channel_id & 0x02) == 0)?0U:4U;        
+    __IO uint32_t *preg = (__IO uint32_t *)((uint32_t)(&timx->CCM1) + shift_value);    
+ 
+    /* 使能输出比较预装载功能 */ 
+    *preg |= (TIM_CCM1_OC1FE << tmp_value);
+}
+
+
+/**
+* @brief  禁止TIM通道快速模式
+* @param  timx TIM外设
+* @param  channel_id 指定TIM通道
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+*             @arg TIM_CHANNEL_3
+*             @arg TIM_CHANNEL_4
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_fastmode_channel_disable(TIM_t *timx, uint32_t channel_id)
+{ 
+    uint32_t tmp_value = ((channel_id & 0x01) == 0)?0U:8U;
+    uint32_t shift_value = ((channel_id & 0x02) == 0)?0U:4U;        
+    __IO uint32_t *preg = (__IO uint32_t *)((uint32_t)(&timx->CCM1) + shift_value);    
+ 
+    /* 禁止输出快速模式 */ 
+    *preg &= (~(TIM_CCM1_OC1FE << tmp_value));
+}
+
+
+/**
+* @brief  配置通道输出模式
+* @param  timx TIM外设
+* @param  channel_id 指定TIM通道
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+*             @arg TIM_CHANNEL_3
+*             @arg TIM_CHANNEL_4
+* @param  ocmode 输出模式选择
+*             @arg TIM_OUTPUT_MODE_FROZEN         
+*             @arg TIM_OUTPUT_MODE_ACTIVE         
+*             @arg TIM_OUTPUT_MODE_INACTIVE       
+*             @arg TIM_OUTPUT_MODE_TOGGLE         
+*             @arg TIM_OUTPUT_MODE_FORCED_INACTIVE
+*             @arg TIM_OUTPUT_MODE_FORCED_ACTIVE  
+*             @arg TIM_OUTPUT_MODE_PWM1           
+*             @arg TIM_OUTPUT_MODE_PWM2                   
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_set_ocmode(TIM_t *timx, uint32_t channel_id, uint32_t ocmode)
+{
+    uint32_t tmp_value = ((channel_id & 0x01) == 0)?0U:8U;
+    uint32_t shift_value = ((channel_id & 0x02) == 0)?0U:4U;        
+    __IO uint32_t *preg = (__IO uint32_t *)((uint32_t)(&timx->CCM1) + shift_value);
+    
+    MODIFY_REG(*preg, ((TIM_CCM1_OC1M  | TIM_CCM1_CC1S) << tmp_value), (ocmode << tmp_value));
+}
+
+
+/**
+* @brief  获取通道输出模式
+* @param  timx TIM外设
+* @param  channel_id 指定TIM通道
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+*             @arg TIM_CHANNEL_3
+*             @arg TIM_CHANNEL_4
+* @note   该函数执行后,会将通道设置为输出模式
+* @retval uint32_t 输出模式选择
+*             @arg TIM_OUTPUT_MODE_FROZEN         
+*             @arg TIM_OUTPUT_MODE_ACTIVE         
+*             @arg TIM_OUTPUT_MODE_INACTIVE       
+*             @arg TIM_OUTPUT_MODE_TOGGLE         
+*             @arg TIM_OUTPUT_MODE_FORCED_INACTIVE
+*             @arg TIM_OUTPUT_MODE_FORCED_ACTIVE  
+*             @arg TIM_OUTPUT_MODE_PWM1           
+*             @arg TIM_OUTPUT_MODE_PWM2               
+*/
+__STATIC_INLINE uint32_t std_tim_get_ocmode(TIM_t *timx, uint32_t channel_id)
+{
+    uint32_t tmp_value = ((channel_id & 0x01) == 0)?0U:8U;
+    uint32_t shift_value = ((channel_id & 0x02) == 0)?0U:4U;    
+    __IO uint32_t *preg = (__IO uint32_t *)((uint32_t)(&timx->CCM1) + shift_value);
+
+    return ((*preg >> tmp_value) & TIM_CCM1_OC1M);
+}
+
+/**
+* @brief  设置捕获/比较寄存器的值
+* @param  timx TIM外设
+* @param  ccx_value 捕获比较寄存器的值
+* @param  channel_id TIM 通道配置
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+*             @arg TIM_CHANNEL_3
+*             @arg TIM_CHANNEL_4
+* @retval std_status_t 返回API执行结果
+*/
+__STATIC_INLINE void std_tim_set_ccx_value(TIM_t *timx, uint32_t channel_id, uint32_t ccx_value)
+{    
+    if ((timx->CR1 & TIM_CR1_MODE) != TIM_CR1_MODE)
+    {
+        __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)(&timx->CC1) + (channel_id << 2));
+        MODIFY_REG(*pReg, TIM_CC1_CC1, ccx_value);    
+    }
+    else
+    {
+        uint32_t tmp_value = ((channel_id & 0x02) == 0)?0U:8U;   
+        uint32_t shift_value = ((channel_id & 0x02) == 0)?0U:2U;          
+        __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)(&timx->CC1) + ((channel_id - shift_value) << 2));
+        MODIFY_REG(*pReg, (TIM3_CC1_CC1_MODE1 << tmp_value), (ccx_value << tmp_value));
+    }
+}
+
+
+/**
+* @brief  获取捕获/比较寄存器的值
+* @param  timx TIM外设
+* @param  channel_id TIM 通道配置
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+*             @arg TIM_CHANNEL_3
+*             @arg TIM_CHANNEL_4
+* @retval uint32_t 捕获比较寄存器的值
+*/
+__STATIC_INLINE uint32_t std_tim_get_ccx_value(TIM_t *timx, uint32_t channel_id)
+{
+    if ((timx->CR1 & TIM_CR1_MODE) != TIM_CR1_MODE)
+    {
+        __IO uint32_t *preg = (__IO uint32_t *)((uint32_t)(&timx->CC1) + (channel_id << 2));
+        return (*preg & TIM_CC1_CC1);
+    }
+    else
+    {
+        uint32_t tmp_value = ((channel_id & 0x02) == 0)?0U:8U;  
+        uint32_t shift_value = ((channel_id & 0x02) == 0)?0U:2U;     
+        __IO uint32_t *preg = (__IO uint32_t *)((uint32_t)(&timx->CC1) + ((channel_id - shift_value) << 2));
+        
+        return ((*preg >> tmp_value) & TIM3_CC1_CC1_MODE1);
+    }
+}
+
+
+/**
+* @brief  设置通道为输入模式
+* @param  timx TIM外设
+* @param  channel_id TIM 通道配置
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+* @param  icmode 输入模式选择
+*             @arg TIM_INPUT_CAPTURE_SEL_DIRECTTI
+*             @arg TIM_INPUT_CAPTURE_SEL_INDIRECTTI
+*             @arg TIM_INPUT_CAPTURE_SEL_TRC
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_set_icmode(TIM_t *timx, uint32_t channel_id, uint32_t icmode)
+{
+    uint32_t tmp_value = ((channel_id & 0x01) == 0)?0U:8U;
+    uint32_t shift_value = ((channel_id & 0x02) == 0)?0U:4U;        
+    __IO uint32_t *preg = (__IO uint32_t *)((uint32_t)(&timx->CCM1) + shift_value);
+    
+    MODIFY_REG(*preg, (TIM_CCM1_CC1S << tmp_value), (icmode << tmp_value));
+}
+
+/**
+* @brief  获取通道的输入状态
+* @param  timx TIM外设
+* @param  channel_id TIM 通道配置
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+* @retval uint32_t 输入模式选择
+*             @arg TIM_INPUT_CAPTURE_SEL_DIRECTTI
+*             @arg TIM_INPUT_CAPTURE_SEL_INDIRECTTI
+*             @arg TIM_INPUT_CAPTURE_SEL_TRC
+*/
+__STATIC_INLINE uint32_t std_tim_get_icmode(TIM_t *timx, uint32_t channel_id)
+{
+    uint32_t tmp_value = ((channel_id & 0x01) == 0)?0U:8U;
+    uint32_t shift_value = ((channel_id & 0x02) == 0)?0U:4U;        
+    __IO uint32_t *preg = (__IO uint32_t *)((uint32_t)(&timx->CCM1) + shift_value);
+    
+    return ((*preg >> tmp_value) & TIM_CCM1_CC1S);
+}
+
+/**
+* @brief  设置输入通道的滤波参数
+* @param  timx TIM外设
+* @param  channel_id TIM 通道配置
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+* @param  icfilter 输入滤波参数,其值的范围为:0x00~0x0F
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_set_icfilter(TIM_t *timx, uint32_t channel_id, uint32_t icfilter)
+{
+    uint32_t tmp_value = ((channel_id & 0x01) == 0)?0U:8U;
+    uint32_t shift_value = ((channel_id & 0x02) == 0)?0U:4U;        
+    __IO uint32_t *preg = (__IO uint32_t *)((uint32_t)(&timx->CCM1) + shift_value);
+    
+    MODIFY_REG(*preg, (TIM_CCM1_IC1F << tmp_value), ((icfilter << tmp_value) << 4U));
+}
+
+/**
+* @brief  获取输入通道的滤波参数
+* @param  timx TIM外设
+* @param  channel_id TIM 通道配置
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+* @retval uint32_t 输入滤波参数,其值的范围为:0x00~0x0F
+*/
+__STATIC_INLINE uint32_t std_tim_get_icfilter(TIM_t *timx, uint32_t channel_id)
+{
+    uint32_t tmp_value = ((channel_id & 0x01) == 0)?0U:8U;
+    uint32_t shift_value = ((channel_id & 0x02) == 0)?0U:4U;        
+    __IO uint32_t *preg = (__IO uint32_t *)((uint32_t)(&timx->CCM1) + shift_value);
+    
+    return (((*preg >> tmp_value) & TIM_CCM1_IC1F) >> 4U);
+}
+
+
+/**
+* @brief  设置主模式(TRIG_OUT)输出参数
+* @param  timx TIM外设
+* @param  trigout_mode 主模式输出参数定义
+*             @arg TIM_TRIG_OUT_RESET
+*             @arg TIM_TRIG_OUT_ENABLE
+*             @arg TIM_TRIG_OUT_UPDATE
+*             @arg TIM_TRIG_OUT_CC1      
+*             @arg TIM_TRIG_OUT_OC1REF   
+*             @arg TIM_TRIG_OUT_OC2REF   
+*             @arg TIM_TRIG_OUT_OC3REF   
+*             @arg TIM_TRIG_OUT_OC4REF
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_trigout_mode_config(TIM_t *timx, uint32_t trigout_mode)
+{
+    MODIFY_REG(timx->CR2, TIM_CR2_MM_SEL, trigout_mode);
+}
+
+
+/**
+* @brief  设置从模式参数
+* @param  timx TIM外设
+* @param  slave_mode 从模式参数定义
+*             @arg TIM_SLAVE_MODE_DISABLE 
+*             @arg TIM_SLAVE_MODE_RESET   
+*             @arg TIM_SLAVE_MODE_GATED   
+*             @arg TIM_SLAVE_MODE_TRIG    
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_slave_mode_config(TIM_t *timx, uint32_t slave_mode)
+{
+    MODIFY_REG(timx->SMC, TIM_SMC_SM_SEL, slave_mode);
+}
+
+/**
+* @brief  设置触发输入源
+* @param  timx TIM外设
+* @param  trig_source 触发输入源定义
+*             @arg TIM_TRIG_SOURCE_ITR0    
+*             @arg TIM_TRIG_SOURCE_TI1F_ED
+*             @arg TIM_TRIG_SOURCE_TI1FP1 
+*             @arg TIM_TRIG_SOURCE_TI2FP2  
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_trig_source_config(TIM_t *timx, uint32_t trig_source)
+{
+    MODIFY_REG(timx->SMC, TIM_SMC_TS, trig_source);
+}
+
+
+/**
+* @brief  使能主/从模式
+* @param  timx TIM外设
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_master_mode_enable(TIM_t *timx)
+{
+    timx->SMC |= TIM_SMC_MS_MOD;
+}
+
+
+/**
+* @brief  禁止主/从模式
+* @param  timx TIM外设
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_master_mode_disable(TIM_t *timx)
+{
+    timx->SMC &= (~TIM_SMC_MS_MOD);
+}
+
+
+/**
+* @brief  配置TIM OCREF CLEAR输入源
+* @param  timx TIM外设
+* @param  ocrefclr_source OCREF CLR源选择
+*             @arg TIM_CLEAR_INPUT_SRC_COMP1: OCREF CLR连接到COMP1
+*             @arg TIM_CLEAR_INPUT_SRC_COMP2: OCREF CLR连接到COMP2
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_ocrefclr_source_config(TIM_t *timx, uint32_t ocrefclr_source)
+{
+    MODIFY_REG(timx->CFG, TIM_CFG_OCREF_CLR, ocrefclr_source);
+}
+
+
+/**
+* @brief  使能输入捕获/输出比较换相预装载
+* @param  timx TIM外设
+* @note   该函数仅对互补通道有效
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_ccreload_enable(TIM_t *timx)
+{
+    timx->CR2 |= TIM_CR2_CC_PRECR;
+}
+
+/**
+* @brief  禁止输入捕获/输出比较换相预装载
+* @param  timx TIM外设
+* @note   该函数仅对互补通道有效
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_ccreload_disable(TIM_t *timx)
+{
+    timx->CR2 &= (~TIM_CR2_CC_PRECR);
+}
+
+
+/**
+* @brief  配置换相控制更新源选择
+* @param  timx TIM外设
+* @param  ccupdate_source 换相更新源
+*             @arg TIM_COM_SOFTWARE
+*             @arg TIM_COM_TRGI
+* @note   该函数仅对互补通道有效
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_cc_set_update_source(TIM_t *timx, uint32_t ccupdate_source)
+{
+    MODIFY_REG(timx->CR2, TIM_CR2_CCU_SEL, ccupdate_source);
+}
+
+
+
+/**
+* @brief  使能TI1的XOR功能
+* @param  timx TIM外设
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_ti1xor_enable(TIM_t *timx)
+{
+    timx->CR2 |= TIM_CR2_TI1_XOR_SEL;
+}
+
+
+/**
+* @brief  禁止TI1的XOR功能
+* @param  timx TIM外设
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_ti1xor_disable(TIM_t *timx)
+{
+    timx->CR2 &= (~TIM_CR2_TI1_XOR_SEL);
+}
+
+
+/**
+* @brief  配置TIM输入通道重映射功能
+* @param  timx TIM外设
+* @param  ti_sel 通道输入源选择参数
+*             @arg TIM_TIM3_TI1_GPIO:           TIM3 TI1连接到GPIO
+*             @arg TIM_TIM3_TI1_COMP1:          TIM3 TI1连接到COMP1输出
+*             @arg TIM_TIM3_TI2_GPIO:           TIM3 TI2连接到GPIO
+*             @arg TIM_TIM3_TI2_COMP2:          TIM3 TI2连接到COMP2输出
+* @param  channel_id TIM通道
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_set_channel_remap(TIM_t *timx, uint32_t ti_sel, uint32_t channel_id)
+{
+    MODIFY_REG(timx->TISEL, (TIM_TISEL_TI1_SEL << (channel_id << 3)), ti_sel);
+}
+
+
+
+/**
+* @brief  TIM输出使能
+* @param  timx TIM外设
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_moen_enable(TIM_t *timx)            
+{
+    timx->BDT |= (TIM_BDT_MOEN);
+}
+
+/**
+* @brief  TIM输出禁止
+* @param  timx TIM外设
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_moen_disable(TIM_t *timx)        
+{
+    timx->BDT &= (~TIM_BDT_MOEN);
+}
+
+/**
+* @brief  TIM自动输出使能
+* @param  timx TIM外设
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_aoen_enable(TIM_t *timx)            
+{
+    timx->BDT |= (TIM_BDT_AOEN);
+}
+
+/**
+* @brief  TIM自动输出禁止
+* @param  timx TIM外设
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_aoen_disable(TIM_t *timx)        
+{
+    timx->BDT &= (~TIM_BDT_AOEN);
+}
+
+
+/** 
+* @brief  使能OSSR功能
+* @param  timx TIM外设
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_ossr_enable(TIM_t *timx)                
+{
+    timx->BDT |= TIM_BDT_OSSR;
+}
+
+/** 
+* @brief  禁止OSSR功能
+* @param  timx TIM外设
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_ossr_disable(TIM_t *timx)                
+{
+    timx->BDT &= (~TIM_BDT_OSSR);
+}
+
+/** 
+* @brief  使能OSSI功能
+* @param  timx TIM外设
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_ossi_enable(TIM_t *timx)                
+{
+    timx->BDT |= TIM_BDT_OSSI;
+}
+
+/** 
+* @brief  禁止OSSI功能
+* @param  timx TIM外设
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_ossi_disable(TIM_t *timx)                
+{
+    timx->BDT &= (~TIM_BDT_OSSI);
+}
+
+
+/** 
+* @brief  使能TIM断路
+* @param  timx TIM外设
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_bken_enable(TIM_t *timx)                
+{
+    timx->BDT |= TIM_BDT_BKEN;
+}
+
+/** 
+* @brief  禁止TIM断路
+* @param  timx TIM外设
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_bken_disable(TIM_t *timx)                
+{
+    timx->BDT &= (~TIM_BDT_BKEN);
+}
+
+
+/** 
+* @brief  使能断路源
+* @param  timx TIM外设
+* @param  brk_source 断路输入源定义
+*             @arg TIM_BREAK_INPUT_SRC_GPIO
+*             @arg TIM_BREAK_INPUT_SRC_COMP1
+*             @arg TIM_BREAK_INPUT_SRC_COMP2
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_brk_source_enable(TIM_t *timx, uint32_t brk_source)
+{
+    timx->AF1 |= brk_source;
+}
+
+
+/** 
+* @brief  配置断路的极性
+* @param  timx TIM外设
+* @param  brk_source 断路输入源定义
+*             @arg TIM_BREAK_INPUT_SRC_GPIO
+*             @arg TIM_BREAK_INPUT_SRC_COMP1
+*             @arg TIM_BREAK_INPUT_SRC_COMP2
+* @param  brk_pol 断路输入极性定义
+*             @arg TIM_BREAK_INPUT_POL_HIGH
+*             @arg TIM_BREAK_INPUT_POL_LOW
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_set_brk_pol(TIM_t *timx, uint32_t brk_source, uint32_t brk_pol)
+{   
+    MODIFY_REG(timx->AF1, (TIM1_AF1_BKINP << (brk_source >> 1U)), (brk_pol << (brk_source >> 1U)));
+}
+
+
+/**
+* @brief  配置TIM死区时间
+* @param  timx TIM外设
+* @param  deadtime 死区时间,该值的范围:0x00~0xFF
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_set_deadtime(TIM_t *timx, uint32_t deadtime)
+{
+    MODIFY_REG(timx->BDT, TIM_BDT_DTG, deadtime);
+}
+
+
+/**
+* @brief  获取TIM死区时间
+* @param  timx TIM外设
+* @retval uint32_t 死区时间,其值范围为:0x00~0xFF
+*/
+__STATIC_INLINE uint32_t std_tim_get_deadtime(TIM_t *timx)
+{
+    return (timx->BDT & TIM_BDT_DTG);
+}
+
+
+/**
+* @brief  配置TIM的锁定级别
+* @param  timx TIM外设
+* @param  locklevel LOCK锁定级别
+*             @arg TIM_LOCK_LEVEL_OFF
+*             @arg TIM_LOCK_LEVEL1
+*             @arg TIM_LOCK_LEVEL2
+*             @arg TIM_LOCK_LEVEL3
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_set_locklevel(TIM_t *timx, uint32_t locklevel)
+{
+    MODIFY_REG(timx->BDT, TIM_BDT_LOCK, locklevel);
+}
+
+
+/**
+* @brief  获取TIM锁定级别
+* @param  timx TIM外设
+* @retval uint32_t LOCK锁定级别
+*             @arg TIM_LOCK_LEVEL_OFF
+*             @arg TIM_LOCK_LEVEL1
+*             @arg TIM_LOCK_LEVEL2
+*             @arg TIM_LOCK_LEVEL3
+*/
+__STATIC_INLINE uint32_t std_tim_get_locklevel(TIM_t *timx)
+{
+    return (timx->BDT & TIM_BDT_LOCK);
+}
+
+
+/** 
+* @brief  使能LOCKUP锁定功能
+* @param  timx TIM外设
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_lockup_lock_enable(TIM_t *timx)
+{
+    timx->AF1 |= TIM1_AF1_LOCKUP_LOCK;
+}
+
+
+
+
+/* 基础计数功能初始化/去初始化 */
+void std_tim_deinit(TIM_t *timx);
+void std_tim_init(TIM_t *timx, std_tim_basic_init_t *tim_init_param);
+void std_tim_struct_init(std_tim_basic_init_t *tim_init_struct);
+
+/* 输入捕获初始化 */
+void std_tim_input_capture_init(TIM_t *timx, std_tim_input_capture_init_t *input_config, uint32_t channel_id);
+void std_tim_input_capture_struct_init(std_tim_input_capture_init_t *input_init_struct);
+
+/* 输出模式初始化及参数配置函数 */
+void std_tim_output_compare_init(TIM_t *timx, std_tim_output_compare_init_t *output_config, uint32_t channel_id);
+void std_tim_output_compare_struct_init(std_tim_output_compare_init_t *output_init_struct);
+
+/* 断路功能初始化 */
+void std_tim_bdt_init(TIM_t* timx, std_tim_break_init_t *bdt_init_param);
+void std_tim_bdt_struct_init(std_tim_break_init_t *bdt_init_struct);
+
+
+/**
+* @}
+*/
+
+#ifdef __cplusplus
+}
+#endif
+/**
+* @}
+*/
+
+/**
+* @}
+*/
+#endif /* CIU32F003_STD_TIM_H */
+

+ 1822 - 0
CIU32F003_LIB/Include/ciu32f003_std_tim.h

@@ -0,0 +1,1822 @@
+/************************************************************************************************/
+/**
+* @file               ciu32f003_std_tim.h          
+* @author             MCU Ecosystem Development Team
+* @brief              TIM STD库驱动头文件。
+*                     提供TIM相关的STD库操作函数声明、数据类型以及常量的定义。 
+* 
+*
+**************************************************************************************************
+* @attention
+* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
+*
+**************************************************************************************************
+*/
+
+/*避免头文件重复引用*/
+#ifndef CIU32F003_STD_TIM_H
+#define CIU32F003_STD_TIM_H
+
+/************************************************************************************************/
+/**
+* @addtogroup CIU32F003_STD_Driver
+* @{
+*/
+
+/**
+* @defgroup TIM TIM
+* @brief    高级控制定时器/通用定时器的STD库驱动
+* @{
+*
+*/
+/************************************************************************************************/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*------------------------------------------includes--------------------------------------------*/
+#include "ciu32f003_std_common.h"
+
+
+/*-----------------------------------------type define------------------------------------------*/
+
+/************************************************************************************************/
+/** 
+* @defgroup TIM_Types TIM Types
+* @brief    TIM数据类型定义
+* @{
+*/
+/************************************************************************************************/
+
+/**
+* @brief  TIM基本参数配置结构体定义
+*/
+typedef struct
+{    
+    uint32_t prescaler;              /**< TIM时钟的预分频参数                               
+                                              @note TIM1预分频参数范围为:0x0000~0xFFFF    
+                                                    TIM3预分频参数范围为:0x0000~0x000F                    */
+                                   
+    uint32_t counter_mode;           /**< 计数器模式选择
+                                              @arg TIM_COUNTER_MODE_UP ...                                 */
+                                   
+    uint32_t period;                 /**< 在下次更新事件时加载到自动重新加载寄存器中的溢出值
+                                          其值必须在0x0000~0xFFFF之间                                      */
+                                   
+    uint32_t clock_div;              /**< TIM时钟分频参数
+                                              @arg TIM_CLOCK_DTS_DIV1 ...                                  */
+                                   
+    uint8_t repeat_counter;         /**< 重复计数器参数定义,每当RCR向下计数达到0时,会产出一个更新事件,
+                                         并从RCR的值(N)开始重新计数,该参数必须在0x0000~0x00FF之间。       */
+                                   
+}std_tim_basic_init_t;
+
+
+/**
+* @brief  TIM输入捕获参数配置结构体定义
+*/
+typedef struct
+{
+    uint32_t  input_capture_pol;         /**< 输入信号的有效边沿选择                           
+                                                  @arg TIM_INPUT_POL_RISING ...                */
+                                
+    uint32_t input_capture_sel;          /**< 输入模式定义
+                                                  @arg TIM_INPUT_CAPTURE_SEL_DIRECTTI ...      */
+                                
+    uint32_t input_capture_prescaler;    /**< 输入捕获预分频定义
+                                                  @arg TIM_INPUT_CAPTURE_PSC_DIV1 ...          */
+                                
+    uint32_t input_capture_filter;       /**< 输入捕获滤波器定义,其值必须在0x0~0x7之间        */
+    
+}std_tim_input_capture_init_t;      
+
+
+/**
+* @brief  TIM输出比较参数配置结构体定义
+*/
+typedef struct
+{
+    uint32_t output_compare_mode;        /**< TIM输出比较模式定义
+                                                  @arg TIM_OUTPUT_MODE_ACTIVE ...                           */
+    
+    uint32_t output_state;               /**< 输出使能定义                                               
+                                                  @arg TIM_OUTPUT_DISABLE ...                               */
+ 
+    uint32_t output_negtive_state;       /**< 互补输出使能定义                                               
+                                                  @arg TIM_OUTPUT_NEGTIVE_DISABLE ...                       */
+                                   
+    uint32_t pulse;                      /**< TIM载入捕获比较寄存器的脉冲值,其值必须在0x0000~0xFFFF之间    */    
+                                   
+    uint32_t output_pol;                 /**< 输出极性定义
+                                                  @arg TIM_OUTPUT_POL_HIGH ...                              */
+                                   
+    uint32_t output_negtive_pol;         /**< 互补输出极性定义
+                                                  @arg TIM_OUTPUT_NEGTIVE_POL_HIGH ...                      */                                                                     
+                                   
+    uint32_t output_idle_state;          /**< TIM空闲状态下输出状态定义
+                                                  @arg  TIM_OUTPUT_IDLE_SET ...
+                                                  @note 该参数仅对支持Break功能的定时器实例有效             */
+                                   
+    uint32_t output_negtive_idle_state;  /**< TIM空闲状态下互补输出状态定义
+                                                  @arg  TIM_OUTPUT_NEGTIVE_IDLE_SET ...
+                                                  @note 该参数仅对支持Break功能的定时器实例有效             */
+    
+}std_tim_output_compare_init_t;
+
+
+/**
+* @brief  TIM断路输入和死区参数配置结构体定义
+*/
+typedef struct
+{
+    uint32_t off_state_run_mode;                        /**< 运行模式下的关闭状态
+                                                                 @arg TIM_OSSR_ENABLE ...            */
+    
+    uint32_t off_state_idle_mode;                       /**< 空闲模式下的关闭状态
+                                                                 @arg TIM_OSSI_ENABLE ...            */
+    
+    uint32_t lock_level;                                /**< LOCK级别
+                                                                 @arg TIM_LOCK_LEVEL1 ...            */  
+    
+    uint32_t dead_time;                                 /**< 死区参数定义,其值必须在0x00~0xFF之间   */
+       
+    uint32_t break_state;                              /**< 断路功能使能控制
+                                                                  @arg TIM_BREAK_ENABLE
+                                                                  @arg TIM_BREAK_DISABLE             */ 
+    
+}std_tim_break_init_t;
+
+
+
+/**
+* @}
+*/
+  
+/*--------------------------------------------define--------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @defgroup TIM_Constants TIM Constants 
+* @brief    TIM常量定义及宏定义
+* @{
+*
+*/
+/************************************************************************************************/
+/* TIM计数模式定义 */
+#define TIM_COUNTER_MODE_UP                (0x00000000U)                      /**< 向上计数                      */
+#define TIM_COUNTER_MODE_DOWN              TIM_CR1_DIR                        /**< 向下计数                      */
+#define TIM_COUNTER_MODE_CENT_MODE1        TIM_CR1_CMS_CENTER_UP              /**< 中心对齐模式1                 */
+#define TIM_COUNTER_MODE_CENT_MODE2        TIM_CR1_CMS_CENTER_DOWN            /**< 中心对齐模式2                 */
+#define TIM_COUNTER_MODE_CENT_MODE3        TIM_CR1_CMS_CENTER_UP_DOWN         /**< 中心对齐模式3                 */
+
+/* TIM更新事件源选择 */
+#define TIM_UPDATE_SOURCE_REGULAR          (0x00000000U)                      /**< 计数上溢或下溢触发                       */
+#define TIM_UPDATE_SOURCE_COUNTER          TIM_CR1_URS                        /**< 计数上溢或下溢、UG置位、从模式控制器触发  */
+
+/* TIM时钟分频 */
+#define TIM_CLOCK_DTS_DIV1                 (0x00000000U)                      /**< tDTS=tTIMx_KCLK          */
+#define TIM_CLOCK_DTS_DIV2                 TIM_CR1_CLK_DIV2                   /**< tDTS=2*tTIMx_KCLK        */
+#define TIM_CLOCK_DTS_DIV4                 TIM_CR1_CLK_DIV4                   /**< tDTS=4*tTIMx_KCLK        */
+
+/* TIM通道定义 */
+#define TIM_CHANNEL_1                      (0x00U)                            /**< 通道1定义            */
+#define TIM_CHANNEL_2                      (0x01U)                            /**< 通道2定义            */
+#define TIM_CHANNEL_3                      (0x02U)                            /**< 通道3定义            */
+#define TIM_CHANNEL_4                      (0x03U)                            /**< 通道4定义            */
+
+/* TIM输入通道极性定义 */
+#define TIM_INPUT_POL_RISING               (0x00000000U)                        /**< 未反向/上升沿触发             */
+#define TIM_INPUT_POL_FALLING              TIM_CCEN_CC1P                        /**< 反向/下降沿触发               */
+#define TIM_INPUT_POL_BOTH                 (TIM_CCEN_CC1P | TIM_CCEN_CC1NP)     /**< 未反向/上升下降均触发         */
+
+/* TIM输入捕获选择 */
+#define TIM_INPUT_CAPTURE_SEL_DIRECTTI         TIM_CCM1_CC1S_DIRECTTI             /**< TIM输入1, 2, 3 or 4,且被映射到IC1, IC2, IC3 or IC4(一一对应) */
+#define TIM_INPUT_CAPTURE_SEL_INDIRECTTI       TIM_CCM1_CC1S_INDIRECTTI           /**< TIM输入1, 2, 3 or 4,且被映射到IC2, IC1, IC4 or IC3(一一对应) */
+#define TIM_INPUT_CAPTURE_SEL_TRC              TIM_CCM1_CC1S_TRC                  /**< TIM输入1, 2, 3 or 4,且被映射到TRC                              */
+
+/* TIM输入捕获预分频参数定义 */
+#define TIM_INPUT_CAPTURE_PSC_DIV1             (0x00000000U)                      /**< 无预分频器,捕获输入上每检测到一个边沿便执行捕获 */
+#define TIM_INPUT_CAPTURE_PSC_DIV2             TIM_CCM1_IC1PSC_DIV2               /**< 每发生2个事件执行一次捕获        */
+#define TIM_INPUT_CAPTURE_PSC_DIV4             TIM_CCM1_IC1PSC_DIV4               /**< 每发生4个事件执行一次捕获        */
+#define TIM_INPUT_CAPTURE_PSC_DIV8             TIM_CCM1_IC1PSC_DIV8               /**< 每发生8个事件执行一次捕获        */
+
+/* TIM输出比较极性定义 */
+#define TIM_OUTPUT_POL_HIGH                (0x00000000U)                      /**< 比较输出极性:高电平为有效电平      */
+#define TIM_OUTPUT_POL_LOW                 TIM_CCEN_CC1P                      /**< 比较输出极性:低电平为有效电平      */
+
+/* TIM输出比较输出使能定义 */
+#define TIM_OUTPUT_DISABLE                 (0x00000000U)                      /**< 比较通道输出禁止                    */
+#define TIM_OUTPUT_ENABLE                  TIM_CCEN_CC1E                      /**< 比较通道输出使能                    */
+
+/* TIM输出比较参数定义*/   
+#define TIM_OUTPUT_MODE_FROZEN                  (0x00000000U)                                /**< 冻结                          */
+#define TIM_OUTPUT_MODE_ACTIVE                  TIM_CCM1_OC1M_ACTIVE                         /**< 通道1设置为匹配时输出有效电平 */
+#define TIM_OUTPUT_MODE_INACTIVE                TIM_CCM1_OC1M_INACTIVE                       /**< 通道1设置为匹配时输出无效电平 */
+#define TIM_OUTPUT_MODE_TOGGLE                  TIM_CCM1_OC1M_TOGGLE                         /**< 翻转                          */
+#define TIM_OUTPUT_MODE_FORCED_INACTIVE         TIM_CCM1_OC1M_FORCED_INACTIVE                /**< 强制变为无效电平              */
+#define TIM_OUTPUT_MODE_FORCED_ACTIVE           TIM_CCM1_OC1M_FORCED_ACTIVE                  /**< 强制变为有效电平              */
+#define TIM_OUTPUT_MODE_PWM1                    TIM_CCM1_OC1M_PWM1                           /**< PWM模式1                      */
+#define TIM_OUTPUT_MODE_PWM2                    TIM_CCM1_OC1M_PWM2                           /**< PWM模式2                      */
+
+/*  TIM时钟源选择 */ 
+#define TIM_CLKSRC_INT                     (0x00000000U)                      /**< TIM时钟源:内部时钟           */
+#define TIM_CLKSRC_MODE1                   TIM_SMC_SM_SEL_EXT_MODE1           /**< TIM时钟源:外部时钟源模式1    */
+
+/* TIM时钟极性定义 */
+#define TIM_CLK_TIX_POL_RISING             (0x00000000U)                      /**< TIx时钟源的极性:上升沿有效   */
+#define TIM_CLK_TIX_POL_FALLING            TIM_CCEN_CC1P                      /**< TIx时钟源的极性:下降沿有效   */
+#define TIM_CLK_TIX_POL_BOTH               (TIM_CCEN_CC1P | TIM_CCEN_CC1NP)   /**< TIx时钟源的极性:双沿有效     */
+
+/* TIM事件源 */
+#define TIM_EVENT_SRC_UPDATE               TIM_EVTG_UG                       /**< 重新初始化计数器并生成一个更新事件      */
+#define TIM_EVENT_SRC_CC1                  TIM_EVTG_CC1G                     /**< 在通道1上生成一个捕获/比较事件          */
+#define TIM_EVENT_SRC_CC2                  TIM_EVTG_CC2G                     /**< 在通道2上生成一个捕获/比较事件          */ 
+#define TIM_EVENT_SRC_CC3                  TIM_EVTG_CC3G                     /**< 在通道3上生成一个捕获/比较事件          */ 
+#define TIM_EVENT_SRC_CC4                  TIM_EVTG_CC4G                     /**< 在通道4上生成一个捕获/比较事件          */ 
+#define TIM_EVENT_SRC_COM                  TIM_EVTG_COMG                     /**< 生成一个换相事件                        */
+#define TIM_EVENT_SRC_TRIG                 TIM_EVTG_TG                       /**< 生成一个触发事件                        */
+#define TIM_EVENT_SRC_BREAK                TIM_EVTG_BG                       /**< 生成一个断路事件                        */
+
+/* TIM中断定义 */
+#define TIM_INTERRUPT_UPDATE               TIM_DIER_UIE                       /**< 更新中断                */
+#define TIM_INTERRUPT_CC1                  TIM_DIER_CC1IE                     /**< 捕获/比较1中断          */
+#define TIM_INTERRUPT_CC2                  TIM_DIER_CC2IE                     /**< 捕获/比较1中断2         */
+#define TIM_INTERRUPT_CC3                  TIM_DIER_CC3IE                     /**< 捕获/比较1中断3         */
+#define TIM_INTERRUPT_CC4                  TIM_DIER_CC4IE                     /**< 捕获/比较1中断4         */
+#define TIM_INTERRUPT_COM                  TIM_DIER_COMIE                     /**< 换相中断                */
+#define TIM_INTERRUPT_TRIG                 TIM_DIER_TIE                       /**< 触发中断                */
+#define TIM_INTERRUPT_BREAK                TIM_DIER_BIE                       /**< 断路中断                */
+
+/* TIM标志定义 */
+#define TIM_FLAG_UPDATE                    TIM_SR_UIF                         /**< 更新中断标志              */
+#define TIM_FLAG_CC1                       TIM_SR_CC1IF                       /**< 捕获/比较1事件标志        */
+#define TIM_FLAG_CC2                       TIM_SR_CC2IF                       /**< 捕获/比较2事件标志        */
+#define TIM_FLAG_CC3                       TIM_SR_CC3IF                       /**< 捕获/比较3事件标志        */
+#define TIM_FLAG_CC4                       TIM_SR_CC4IF                       /**< 捕获/比较4事件标志        */
+#define TIM_FLAG_COM                       TIM_SR_COMIF                       /**< 换相事件标志              */
+#define TIM_FLAG_TRIG                      TIM_SR_TIF                         /**< 触发事件标志              */
+#define TIM_FLAG_BREAK                     TIM_SR_BIF                         /**< 断路事件标志              */
+#define TIM_FLAG_CC1OF                     TIM_SR_CC1OF                       /**< 捕获/比较1重复捕获标志    */
+#define TIM_FLAG_CC2OF                     TIM_SR_CC2OF                       /**< 捕获/比较2重复捕获标志    */
+
+#define TIM_FLAG_ALL                       (0xFFFF)                           /**< TIM事件标志               */
+#define TIM_FLAG_CCX_ALL                   (0x001E)                           /**< 全通道捕获/比较事件标志   */
+
+/* TIM清除OCxREF输出的输入源 */                               
+#define TIM_CLEAR_INPUT_SRC_COMP1          (0x00000000U)                    /**< OCREF_CLR_INPUT连接到COMP1的输出  */
+#define TIM_CLEAR_INPUT_SRC_COMP2          TIM_CFG_OCREF_CLR                /**< OCREF_CLR_INPUT连接到COMP2的输出  */
+
+/* TIM换相事件源 */
+#define TIM_COM_SOFTWARE                  (0x00000000U)                      /**< 如果捕获/比较控制位进行预装载(CCPC=1),仅通过将COMG位置1触发换相事件               */
+#define TIM_COM_TRGI                      TIM_CR2_CCU_SEL                    /**< 如果捕获/比较控制位进行预装载(CCPC=1),可通过将COMG位置1或TRIG的上升沿触发换相事件 */
+
+/* TIM主模式选择(TRIG_OUT)参数定义*/
+#define TIM_TRIG_OUT_RESET                 (0x00000000U)                         /**< TIM1_EVTG寄存器中的UG位用作触发输出(TRIG_OUT)  */
+#define TIM_TRIG_OUT_ENABLE                TIM_CR2_MM_SEL_ENABLE                 /**< 计数器使能信号CEN用作触发输出(TRIG_OUT)        */
+#define TIM_TRIG_OUT_UPDATE                TIM_CR2_MM_SEL_UPDATE                 /**< 选择更新事件作为触发输出(TRIG_OUT)             */
+#define TIM_TRIG_OUT_CC1                   TIM_CR2_MM_SEL_CC1IF                  /**< 捕获或比较匹配,触发输出(TRIG_OUT)             */
+#define TIM_TRIG_OUT_OC1REF                TIM_CR2_MM_SEL_OC1REF                 /**< OC1REF信号用作触发输出(TRIG_OUT)                 */
+#define TIM_TRIG_OUT_OC2REF                TIM_CR2_MM_SEL_OC2REF                 /**< OC2REF信号用作触发输出(TRIG_OUT)                 */
+#define TIM_TRIG_OUT_OC3REF                TIM_CR2_MM_SEL_OC3REF                 /**< OC3REF信号用作触发输出(TRIG_OUT)                 */
+#define TIM_TRIG_OUT_OC4REF                TIM_CR2_MM_SEL_OC4REF                 /**< OC4REF信号用作触发输出(TRIG_OUT)                 */
+
+/* TIM从模式参数定义*/
+#define TIM_SLAVE_MODE_DISABLE             (0x00000000U)                              /**< 禁止从模式          */
+#define TIM_SLAVE_MODE_RESET               TIM_SMC_SM_SEL_RESET                       /**< 复位模式            */
+#define TIM_SLAVE_MODE_GATED               TIM_SMC_SM_SEL_GATED                       /**< 门控模式            */
+#define TIM_SLAVE_MODE_TRIG                TIM_SMC_SM_SEL_TRIG                        /**< 触发模式            */
+
+/* TIM触发选择参数定义*/
+#define TIM_TRIG_SOURCE_ITR0               TIM_SMC_TS_ITR0                              /**< 内部触发0(ITR0)               */
+#define TIM_TRIG_SOURCE_TI1F_ED            TIM_SMC_TS_TI1F_ED                           /**< TI1边沿检测器(TI1F_ED)        */
+#define TIM_TRIG_SOURCE_TI1FP1             TIM_SMC_TS_TI1FP1                            /**< 滤波后的定时器输入1(TI1FP1)   */
+#define TIM_TRIG_SOURCE_TI2FP2             TIM_SMC_TS_TI2FP2                            /**< 滤波后的定时器输入2(TI1FP2)   */
+
+/* TIM触发极性参数定义*/
+#define TIM_TRIG_TIX_POL_RISING            (0x00000000U)                        /**< TIxFPx或TI1F_ED触发极性:高电平或上升沿有效   */
+#define TIM_TRIG_TIX_POL_FALLING           TIM_CCEN_CC1P                        /**< TIxFPx或TI1F_ED触发极性:低电平或下降沿有效   */
+#define TIM_TRIG_TIX_POL_BOTH              (TIM_CCEN_CC1P | TIM_CCEN_CC1NP)     /**< TIxFPx或TI1F_ED触发极性:上升下降均触发       */
+                                                                                       
+/* TIM输出比较互补输出极性定义 */
+#define TIM_OUTPUT_NEGTIVE_POL_HIGH        (0x00000000U)                      /**< 互补输出极性为高电平有效      */
+#define TIM_OUTPUT_NEGTIVE_POL_LOW         TIM_CCEN_CC1NP                     /**< 互补输出极性为低电平有效      */
+
+/* TIM输出比较互补输出使能定义 */
+#define TIM_OUTPUT_NEGTIVE_DISABLE         (0x00000000U)                      /**< 互补输出通道输出禁止          */
+#define TIM_OUTPUT_NEGTIVE_ENABLE          TIM_CCEN_CC1NE                     /**< 互补输出通道输出使能          */
+
+/* TIM空闲状态下输出状态定义 */
+#define TIM_OUTPUT_IDLE_RESET              (0x00000000U)                      /**< 空闲状态为: 当MOEN=0时OCx输出低电平   */
+#define TIM_OUTPUT_IDLE_SET                TIM_CR2_OIS1                       /**< 空闲状态为: 当MOEN=0时OCx输出高电平   */
+
+/* TIM空闲状态下互补输出状态定义 */
+#define TIM_OUTPUT_NEGTIVE_IDLE_RESET      (0x00000000U)                      /**< 互补输出空闲状态为: 当MOEN=0时OCxN输出低电平  */
+#define TIM_OUTPUT_NEGTIVE_IDLE_SET        TIM_CR2_OIS1N                      /**< 互补输出空闲状态为: 当MOEN=0时OCxN输出高电平  */
+
+/* TIM运行模式下关闭状态选择参数定义 */                                         
+#define TIM_OSSR_DISABLE                   (0x00000000U)               /**< 处于无效状态时,OC/OCN输出禁止(不再受定时器控制)     */
+#define TIM_OSSR_ENABLE                    TIM_BDT_OSSR                /**< 处于无效状态时,OC/OCN输出使能(仍然受定时器控制)     */
+                                                                               
+/* TIM空闲模式下关闭状态选择参数定义 */                                         
+#define TIM_OSSI_DISABLE                   (0x00000000U)               /**< 处于无效状态时,OC/OCN输出禁止(不再受定时器控制)     */
+#define TIM_OSSI_ENABLE                    TIM_BDT_OSSI                /**< 处于无效状态时,OC/OCN输出使能(仍然受定时器控制)     */
+
+/* TIM锁级别定义*/
+#define TIM_LOCK_LEVEL_OFF                 (0x00000000U)                      /**< 锁级别0         */
+#define TIM_LOCK_LEVEL1                    TIM_BDT_LOCK_LEVEL1                /**< 锁级别1         */
+#define TIM_LOCK_LEVEL2                    TIM_BDT_LOCK_LEVEL2                /**< 锁级别2         */
+#define TIM_LOCK_LEVEL3                    TIM_BDT_LOCK_LEVEL3                /**< 锁级别3         */
+
+/* TIM断路输入使能*/                                                            
+#define TIM_BREAK_DISABLE                  (0x00000000U)                      /**< 禁止断路输入    */
+#define TIM_BREAK_ENABLE                   TIM_BDT_BKEN                       /**< 使能断路输入    */                                                                              
+                                                                              
+/* TIM断路输入源定义 */                                                       
+#define TIM_BREAK_INPUT_SRC_GPIO           TIM1_AF1_BKINE                      /**< GPIO接到BKIN引脚上          */    
+#define TIM_BREAK_INPUT_SRC_COMP1          TIM1_AF1_BKCMP1E                    /**< COMP1输出接到断路输入       */
+#define TIM_BREAK_INPUT_SRC_COMP2          TIM1_AF1_BKCMP2E                    /**< COMP2输出接到断路输入       */       
+  
+/* TIM断路输入极性定义 */                                                                                                    
+#define TIM_BREAK_INPUT_POL_HIGH           TIM1_AF1_BKINP                      /**< 断路输入源为高电平      */
+#define TIM_BREAK_INPUT_POL_LOW            (0x00000000U)                       /**< 断路输入源为低电平      */ 
+                                                                                                                                                                              
+/* TIM外部时钟输入选择  */                                                                                                                                                    
+#define TIM_TIM3_TI1_GPIO                  TIM_TISEL_TI1_SEL_CH1                      /**< TIM3_TI1连接到GPIO       */
+#define TIM_TIM3_TI1_COMP1                 TIM_TISEL_TI1_SEL_COMP1                    /**< TIM3_TI1连接到COMP1输出  */    
+                                                                                       
+#define TIM_TIM3_TI2_GPIO                  TIM_TISEL_TI2_SEL_CH2                      /**< TIM3_TI2连接到GPIO       */  
+#define TIM_TIM3_TI2_COMP2                 TIM_TISEL_TI2_SEL_COMP2                    /**< TIM3_TI2连接到COMP2输出  */                                                                                                                                                 
+
+
+/**
+* @}
+*/
+
+
+/*-------------------------------------------functions------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @defgroup TIM_External_Functions TIM External Functions
+* @brief    TIM对外函数
+* @{
+*
+*/
+/************************************************************************************************/
+/**
+* @brief  TIM启动计数
+* @param  timx TIM外设
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_enable(TIM_t *timx)
+{
+    timx->CR1 |= TIM_CR1_CEN;    
+}
+
+/**
+* @brief  TIM停止计数
+* @param  timx TIM外设
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_disable(TIM_t *timx)
+{
+    timx->CR1 &= (~TIM_CR1_CEN);
+}
+
+
+/**
+* @brief  设置TIM预分频参数
+* @param  timx TIM外设
+* @param  presc 预分频新值
+* @note   TIM1预分频参数范围为:0x0000~0xFFFF    
+*         TIM3预分频参数范围为:0x0000~0x000F
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_set_psc(TIM_t *timx, uint32_t presc)          
+{
+    timx->PSC = (presc);
+}
+
+
+/**
+* @brief  获取TIM预分频参数
+* @param  timx TIM外设
+* @retval uint32_t TIM预分频值
+*/
+__STATIC_INLINE uint32_t std_tim_get_psc(TIM_t *timx)          
+{
+    return (timx->PSC);    
+}
+
+
+/**
+* @brief  设置TIM计数值
+* @param  timx TIM外设 
+* @param  counter 计数新值
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_set_counter(TIM_t *timx, uint32_t counter)     
+{
+    timx->CNT = (counter);
+}
+
+/**
+* @brief  获取TIM计数值
+* @param  timx TIM外设
+* @retval uint32_t TIM计数值
+*/
+__STATIC_INLINE uint32_t std_tim_get_counter(TIM_t *timx)   
+{
+    return (timx->CNT);
+}
+
+/**
+* @brief  设置TIM ARR值
+* @param  timx TIM外设
+* @param  autoreload ARR值
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_set_autoreload(TIM_t *timx, uint32_t autoreload)
+{
+    timx->ARR = (autoreload); 
+}
+                                                            
+/**
+* @brief  获取TIM ARR值
+* @param  timx TIM外设
+* @retval uint32_t TIM ARR值
+*/
+__STATIC_INLINE uint32_t std_tim_get_autoreload(TIM_t *timx)
+{
+    return (timx->ARR);
+}
+
+
+/**
+* @brief  设置TIM RCR值
+* @param  timx TIM外设
+* @param  rcr TIM RCR值
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_set_repcounter(TIM_t *timx, uint32_t rcr)
+{
+    timx->RCR = (rcr);
+}
+
+
+/**
+* @brief  获取TIM RCR值
+* @param  timx TIM外设
+* @retval uint32_t TIM RCR值
+*/
+__STATIC_INLINE uint32_t std_tim_get_repcounter(TIM_t *timx)
+{
+    return (timx->RCR);
+}
+
+
+/**
+* @brief  设置TIM时钟分频值
+* @param  timx TIM外设
+* @param  clk_div 时钟分频值
+*             @arg TIM_CLOCK_DTS_DIV1:  tDTS=tTIM_KCLK
+*             @arg TIM_CLOCK_DTS_DIV2:  tDTS=2*tTIM_KCLK
+*             @arg TIM_CLOCK_DTS_DIV4:  tDTS=4*tTIM_KCLK
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_set_clock_div(TIM_t *timx, uint32_t clk_div) 
+{
+    MODIFY_REG(timx->CR1, TIM_CR1_CLK_DIV, clk_div);    
+}
+
+/**
+* @brief  获取TIM时钟分频值
+* @param  timx TIM外设
+* @retval uint32_t 时钟分频值
+*             @arg TIM_CLOCK_DIV1: tDTS=tTIM_KCLK
+*             @arg TIM_CLOCK_DIV2: tDTS=2*tTIM_KCLK
+*             @arg TIM_CLOCK_DIV4: tDTS=4*tTIM_KCLK
+*/
+__STATIC_INLINE uint32_t std_tim_get_clock_div(TIM_t *timx)           
+{
+    return (timx->CR1 & TIM_CR1_CLK_DIV);
+}
+
+/**
+* @brief  使能自动重载功能
+* @param  timx TIM外设
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_arrpreload_enable(TIM_t *timx)           
+{
+    timx->CR1 |= TIM_CR1_ARPE;
+}
+
+/**
+* @brief  禁止自动重载功能
+* @param  timx TIM外设
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_arrpreload_disable(TIM_t *timx)           
+{
+    timx->CR1 &= (~TIM_CR1_ARPE);
+}
+
+/**
+* @brief  使能更新事件
+* @param  timx TIM外设
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_updateevent_enable(TIM_t *timx)
+{
+    timx->CR1 |= TIM_CR1_UDIS;
+}
+
+/**
+* @brief  禁止更新事件
+* @param  timx TIM外设
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_updateevent_disable(TIM_t *timx)
+{
+    timx->CR1 &= (~TIM_CR1_UDIS);
+}
+
+/**
+* @brief  设置更新事件源
+* @param  timx TIM外设
+* @param  update_source 更新事件源选择
+*             @arg TIM_UPDATE_SOURCE_REGULAR
+*             @arg TIM_UPDATE_SOURCE_COUNTER
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_set_update_source(TIM_t *timx, uint32_t update_source)
+{
+    MODIFY_REG(timx->CR1, TIM_CR1_URS, update_source);
+}
+
+
+/**
+* @brief  获取更新事件源
+* @param  timx TIM外设
+* @retval uint32_t 更新事件源选择
+*             @arg TIM_UPDATE_SOURCE_REGULAR
+*             @arg TIM_UPDATE_SOURCE_COUNTER
+*/
+__STATIC_INLINE uint32_t std_tim_get_update_source(TIM_t *timx)
+{
+    return (timx->CR1 & TIM_CR1_URS);
+}
+
+
+/**
+* @brief  使能工作模式1
+* @param  timx TIM外设
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_work_mode1_enable(TIM_t *timx)
+{
+    timx->CR1 |= TIM_CR1_MODE;
+}
+
+/**
+* @brief  禁止工作模式1
+* @param  timx TIM外设
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_work_mode1_disable(TIM_t *timx)
+{
+    timx->CR1 &= (~TIM_CR1_MODE);
+}
+
+
+/**
+* @brief  设置计数模式
+* @param  timx TIM外设
+* @param  counter_mode 计数方式
+*             @arg TIM_COUNTER_MODE_UP
+*             @arg TIM_COUNTER_MODE_DOWN
+*             @arg TIM_COUNTER_MODE_CENT_MODE1
+*             @arg TIM_COUNTER_MODE_CENT_MODE2
+*             @arg TIM_COUNTER_MODE_CENT_MODE3
+* @note   由于DIR控制位在中心对齐模式下为只读权限,当从中心对齐模式切换到边沿模式时,避免计数方向修改异常,应先复位一次TIM
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_set_counter_mode(TIM_t *timx, uint32_t counter_mode)
+{
+    MODIFY_REG(timx->CR1, (TIM_CR1_DIR | TIM_CR1_CMS), counter_mode);
+}
+
+/**
+* @brief  获取计数模式
+* @param  timx TIM外设
+* @retval uint32_t 计数方式
+*             @arg TIM_COUNTER_MODE_UP
+*             @arg TIM_COUNTER_MODE_DOWN
+*             @arg TIM_COUNTER_MODE_CENT_MODE1
+*             @arg TIM_COUNTER_MODE_CENT_MODE2
+*             @arg TIM_COUNTER_MODE_CENT_MODE3
+*/
+__STATIC_INLINE uint32_t std_tim_get_counter_mode(TIM_t *timx)
+{
+    if(timx->CR1 & TIM_CR1_CMS)
+    {
+        return (timx->CR1 & TIM_CR1_CMS);
+    }
+    else
+    {
+        return (timx->CR1 & TIM_CR1_DIR);       
+    }
+}
+
+/**
+* @brief  获取TIM计数方向
+* @param  timx TIM外设
+* @retval uint32_t 返回TIM计数方向标志
+*             @arg 非0: 当前计数方向为向下计数
+*             @arg 0:当前计数方向为向上计数
+*/
+__STATIC_INLINE uint32_t std_tim_get_count_dir(TIM_t *timx)  
+{
+    return (timx->CR1 & TIM_CR1_DIR);
+}
+
+
+/**
+* @brief  使能单脉冲模式
+* @param  timx TIM外设
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_onepulse_enable(TIM_t *timx)
+{
+    timx->CR1 |= TIM_CR1_OPM;
+}
+
+/**
+* @brief  禁止单脉冲模式
+* @param  timx TIM外设
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_onepulse_disable(TIM_t *timx)
+{
+    timx->CR1 &= (~TIM_CR1_OPM);
+}
+
+/**
+* @brief  获取单脉冲模式
+* @param  timx TIM外设
+* @retval uint32_t 返回单脉冲计数模式
+*             @arg 非0: 当前配置为单脉冲模式
+*             @arg 0:当前配置为连续计数模式
+*/
+__STATIC_INLINE uint32_t std_tim_get_onepulse_mode(TIM_t *timx)
+{
+    return (timx->CR1 & (TIM_CR1_OPM));
+}
+
+
+/**
+* @brief  设置计数时钟源参数
+* @param  timx TIM外设
+* @param  clock_source 时钟源选择
+*             @arg TIM_CLKSRC_INT:   内部时钟源
+*             @arg TIM_CLKSRC_MODE1: 外部时钟模式1
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_clock_source_config(TIM_t *timx, uint32_t clock_source)
+{
+    MODIFY_REG(timx->SMC, TIM_SMC_SM_SEL, clock_source);
+}
+
+
+/**
+* @brief  生成一个软件事件
+* @param  timx TIM外设
+* @param  event_src 事件源
+*             @arg TIM_EVENT_SRC_UPDATE:更新事件源
+*             @arg TIM_EVENT_SRC_CC1:   捕获比较1事件源
+*             @arg TIM_EVENT_SRC_CC2:   捕获比较2事件源
+*             @arg TIM_EVENT_SRC_CC3:   捕获比较3事件源
+*             @arg TIM_EVENT_SRC_CC4:   捕获比较4事件源
+*             @arg TIM_EVENT_SRC_COM:   换相事件源
+*             @arg TIM_EVENT_SRC_TRIG:  触发事件源
+*             @arg TIM_EVENT_SRC_BREAK: 断路事件源
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_set_sw_trig_event(TIM_t *timx, uint32_t event_src)
+{
+    timx->EVTG = event_src;
+}
+
+
+/** 
+* @brief  TIM中断使能
+* @param  timx TIM外设
+* @param  interrupt TIM中断源
+*             @arg TIM_INTERRUPT_UPDATE:  更新中断
+*             @arg TIM_INTERRUPT_CC1:     捕获/比较1中断
+*             @arg TIM_INTERRUPT_CC2:     捕获/比较2中断
+*             @arg TIM_INTERRUPT_CC3:     捕获/比较3中断
+*             @arg TIM_INTERRUPT_CC4:     捕获/比较4中断
+*             @arg TIM_INTERRUPT_COM:     换相中断
+*             @arg TIM_INTERRUPT_TRIG:    触发中断
+*             @arg TIM_INTERRUPT_BREAK:   断路中断
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_interrupt_enable(TIM_t *timx, uint32_t interrupt)    
+{
+    timx->DIER |= (interrupt);
+}
+
+/** 
+* @brief  TIM中断禁止
+* @param  timx TIM外设
+* @param  interrupt TIM中断源
+*             @arg TIM_INTERRUPT_UPDATE:  更新中断
+*             @arg TIM_INTERRUPT_CC1:     捕获/比较1中断
+*             @arg TIM_INTERRUPT_CC2:     捕获/比较2中断
+*             @arg TIM_INTERRUPT_CC3:     捕获/比较3中断
+*             @arg TIM_INTERRUPT_CC4:     捕获/比较4中断
+*             @arg TIM_INTERRUPT_COM:     换相中断
+*             @arg TIM_INTERRUPT_TRIG:    触发中断
+*             @arg TIM_INTERRUPT_BREAK:   断路中断
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_interrupt_disable(TIM_t *timx, uint32_t interrupt)   
+{
+    timx->DIER &= (~(interrupt));
+}
+
+
+/**
+* @brief  获取TIM中断源的状态
+* @param  timx TIM外设
+* @param  interrupt TIM中断源信息
+*             @arg TIM_INTERRUPT_UPDATE:  更新中断
+*             @arg TIM_INTERRUPT_CC1:     捕获/比较1中断
+*             @arg TIM_INTERRUPT_CC2:     捕获/比较2中断
+*             @arg TIM_INTERRUPT_CC3:     捕获/比较3中断
+*             @arg TIM_INTERRUPT_CC4:     捕获/比较4中断
+*             @arg TIM_INTERRUPT_COM:     换相中断
+*             @arg TIM_INTERRUPT_TRIG:    触发中断
+*             @arg TIM_INTERRUPT_BREAK:   断路中断
+* @retval uint32_t 返回中断请求源的状态 
+*/  
+__STATIC_INLINE uint32_t std_tim_get_interrupt_enable(TIM_t *timx, uint32_t interrupt)   
+{
+    return (timx->DIER & (interrupt));
+}
+
+
+/** 
+* @brief  获取TIM标志状态
+* @param  timx TIM外设
+* @param  flag TIM标志信息
+*             @arg TIM_FLAG_UPDATE:       更新事件标志
+*             @arg TIM_FLAG_CC1:          捕获/比较1事件标志
+*             @arg TIM_FLAG_CC2:          捕获/比较2事件标志
+*             @arg TIM_FLAG_CC3:          捕获/比较3事件标志
+*             @arg TIM_FLAG_CC4:          捕获/比较4事件标志
+*             @arg TIM_FLAG_COM:          换相事件标志
+*             @arg TIM_FLAG_TRIG:         触发事件标志
+*             @arg TIM_FLAG_BREAK:        断路事件标志
+*             @arg TIM_FLAG_CC1OF:        捕获/比较1重复捕获标志
+*             @arg TIM_FLAG_CC2OF:        捕获/比较2重复捕获标志
+*             @arg TIM_FLAG_CCX_ALL:      全通道捕获/比较事件标志
+*             @arg TIM_FLAG_ALL:          TIM事件标志
+* @retval uint32_t 返回标志的状态 
+*             @arg 非0: 当前标志为置起状态 
+*             @arg 0:当前标志为清除状态
+*/
+__STATIC_INLINE uint32_t std_tim_get_flag(TIM_t *timx, uint32_t flag)          
+{
+    return (timx->SR &(flag));
+}
+
+
+/** 
+* @brief  清除TIM标志
+* @param  timx TIM外设
+* @param  flag 清除TIM标志
+*             @arg TIM_FLAG_UPDATE:       更新事件标志
+*             @arg TIM_FLAG_CC1:          捕获/比较1事件标志
+*             @arg TIM_FLAG_CC2:          捕获/比较2事件标志
+*             @arg TIM_FLAG_CC3:          捕获/比较3事件标志
+*             @arg TIM_FLAG_CC4:          捕获/比较4事件标志
+*             @arg TIM_FLAG_COM:          换相事件标志
+*             @arg TIM_FLAG_TRIG:         触发事件标志
+*             @arg TIM_FLAG_BREAK:        断路事件标志
+*             @arg TIM_FLAG_CC1OF:        捕获/比较1重复捕获标志
+*             @arg TIM_FLAG_CC2OF:        捕获/比较2重复触发标志
+*             @arg TIM_FLAG_CCX_ALL:      全通道捕获/比较事件标志
+*             @arg TIM_FLAG_ALL:          TIM事件标志
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_clear_flag(TIM_t *timx, uint32_t flag)
+{
+    timx->SR = (~(flag));
+}
+
+
+/**
+* @brief  使能TIM比较/匹配通道
+* @param  timx TIM外设
+* @param  channel_id 指定TIM通道
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+*             @arg TIM_CHANNEL_3
+*             @arg TIM_CHANNEL_4
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_ccx_channel_enable(TIM_t *timx, uint32_t channel_id)
+{  
+    timx->CCEN |= (TIM_CCEN_CC1E << (channel_id << 2));
+}
+
+
+/**
+* @brief  禁止TIM比较/匹配通道
+* @param  timx TIM外设
+* @param  channel_id 指定TIM通道
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+*             @arg TIM_CHANNEL_3
+*             @arg TIM_CHANNEL_4
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_ccx_channel_disable(TIM_t *timx, uint32_t channel_id)
+{     
+    timx->CCEN &= (~(TIM_CCEN_CC1E << (channel_id << 2)));
+}
+
+
+/**
+* @brief  使能TIM互补输出通道
+* @param  timx TIM外设
+* @param  channel_id 指定TIM通道
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+*             @arg TIM_CHANNEL_3
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_ccxn_channel_enable(TIM_t *timx, uint32_t channel_id)
+{    
+    timx->CCEN |= (TIM_CCEN_CC1NE << (channel_id << 2));
+}
+
+
+/**
+* @brief  禁止TIM互补输出通道
+* @param  timx TIM外设
+* @param  channel_id 指定TIM通道
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+*             @arg TIM_CHANNEL_3
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_ccxn_channel_disable(TIM_t *timx, uint32_t channel_id)
+{ 
+    timx->CCEN &= (~(TIM_CCEN_CC1NE << (channel_id << 2)));
+}
+
+
+/**
+* @brief  配置TIM输入捕获通道极性
+* @param  timx TIM外设
+* @param  channel_id 指定TIM通道
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+* @param  input_capture_pol 输入极性
+*             @arg TIM_INPUT_POL_RISING
+*             @arg TIM_INPUT_POL_FALLING
+*             @arg TIM_INPUT_POL_BOTH
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_set_input_pol(TIM_t *timx, uint32_t channel_id, uint32_t input_capture_pol)
+{ 
+    MODIFY_REG(timx->CCEN, ((TIM_CCEN_CC1P | TIM_CCEN_CC1NP) << (channel_id << 2)), (input_capture_pol << (channel_id << 2)));
+}
+
+/**
+* @brief  获取TIM输入捕获通道极性
+* @param  timx TIM外设
+* @param  channel_id 指定TIM通道
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+* @retval uint32_t 输入极性
+*             @arg TIM_INPUT_POL_RISING
+*             @arg TIM_INPUT_POL_FALLING
+*             @arg TIM_INPUT_POL_BOTH
+*/
+__STATIC_INLINE uint32_t std_tim_get_input_pol(TIM_t *timx, uint32_t channel_id)
+{ 
+    return (((timx->CCEN) >> (channel_id << 2)) & (TIM_CCEN_CC1P | TIM_CCEN_CC1NP));
+}
+
+
+/**
+* @brief  配置TIM通道输出的极性
+* @param  timx TIM外设
+* @param  channel_id 指定TIM通道
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+*             @arg TIM_CHANNEL_3
+*             @arg TIM_CHANNEL_4
+* @param  output_commpare_pol 输出极性
+*             @arg TIM_OUTPUT_POL_HIGH
+*             @arg TIM_OUTPUT_POL_LOW
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_set_output_pol(TIM_t *timx, uint32_t channel_id, uint32_t output_commpare_pol)
+{ 
+    MODIFY_REG(timx->CCEN, (TIM_CCEN_CC1P << (channel_id << 2)), (output_commpare_pol << (channel_id << 2)));
+}
+
+/**
+* @brief  获取TIM通道输出的极性
+* @param  timx TIM外设
+* @param  channel_id 指定TIM通道
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+*             @arg TIM_CHANNEL_3
+*             @arg TIM_CHANNEL_4
+* @retval uint32_t 输出极性
+*             @arg TIM_OUTPUT_POL_HIGH
+*             @arg TIM_OUTPUT_POL_LOW
+*/
+__STATIC_INLINE uint32_t std_tim_get_output_pol(TIM_t *timx, uint32_t channel_id)
+{ 
+    return (((timx->CCEN) >> (channel_id << 2)) & TIM_CCEN_CC1P);
+}
+
+
+/**
+* @brief  配置TIM互补通道的输出极性
+* @param  timx TIM外设
+* @param  channel_id 指定TIM通道
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+*             @arg TIM_CHANNEL_3
+* @param  negtive_output_pol 互补通道的输出极性
+*             @arg TIM_OUTPUT_NEGTIVE_POL_HIGH
+*             @arg TIM_OUTPUT_NEGTIVE_POL_LOW
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_set_negtive_output_pol(TIM_t *timx, uint32_t channel_id, uint32_t negtive_output_pol)
+{ 
+    MODIFY_REG(timx->CCEN, (TIM_CCEN_CC1NP << (channel_id << 2)), (negtive_output_pol << (channel_id << 2)));
+}
+
+/**
+* @brief  获取TIM互补通道的输出极性
+* @param  timx TIM外设
+* @param  channel_id 指定TIM通道
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+*             @arg TIM_CHANNEL_3
+* @retval uint32_t 互补通道的输出极性
+*             @arg TIM_OUTPUT_NEGTIVE_POL_HIGH
+*             @arg TIM_OUTPUT_NEGTIVE_POL_LOW
+*/
+__STATIC_INLINE uint32_t std_tim_get_negtive_output_pol(TIM_t *timx, uint32_t channel_id)
+{ 
+    return (((timx->CCEN) >> (channel_id << 2)) & TIM_CCEN_CC1NP);
+}
+
+
+/**
+* @brief  配置TIM通道的空闲状态
+* @param  timx TIM外设
+* @param  channel_id 指定TIM通道
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+*             @arg TIM_CHANNEL_3
+*             @arg TIM_CHANNEL_4
+* @param  idle_state 通道空闲状态
+*             @arg TIM_OUTPUT_IDLE_RESET
+*             @arg TIM_OUTPUT_IDLE_SET
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_set_output_idlestate(TIM_t *timx, uint32_t channel_id, uint32_t idle_state)
+{ 
+    MODIFY_REG(timx->CR2, (TIM_CR2_OIS1 << (channel_id << 1)), (idle_state << (channel_id << 1)));
+}
+
+/**
+* @brief  获取TIM通道的空闲状态
+* @param  timx TIM外设
+* @param  channel_id 指定TIM通道
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+*             @arg TIM_CHANNEL_3
+*             @arg TIM_CHANNEL_4
+* @retval uint32_t 通道空闲状态
+*             @arg TIM_OUTPUT_IDLE_RESET
+*             @arg TIM_OUTPUT_IDLE_SET
+*/
+__STATIC_INLINE uint32_t std_tim_get_output_idlestate(TIM_t *timx, uint32_t channel_id)
+{ 
+    return (((timx->CR2) >> (channel_id << 1)) & TIM_CR2_OIS1);    
+}
+
+/**
+* @brief  配置TIM互补通道的空闲状态
+* @param  timx TIM外设
+* @param  channel_id 指定TIM通道
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+*             @arg TIM_CHANNEL_3
+* @param  negtive_idlestate 互补通道空闲状态
+*             @arg TIM_OUTPUT_NEGTIVE_IDLE_RESET
+*             @arg TIM_OUTPUT_NEGTIVE_IDLE_SET
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_set_negtive_output_idlestate(TIM_t *timx, uint32_t channel_id, uint32_t negtive_idlestate)
+{ 
+    MODIFY_REG(timx->CR2, (TIM_CR2_OIS1N << (channel_id << 1)), (negtive_idlestate << (channel_id << 1)));
+}
+
+/**
+* @brief  获取TIM互补通道的空闲状态
+* @param  timx TIM外设
+* @param  channel_id 指定TIM通道
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+*             @arg TIM_CHANNEL_3
+* @retval uint32_t 互补通道空闲状态
+*             @arg TIM_OUTPUT_NEGTIVE_IDLE_RESET
+*             @arg TIM_OUTPUT_NEGTIVE_IDLE_SET
+*/
+__STATIC_INLINE uint32_t std_tim_get_negtive_output_idlestate(TIM_t *timx, uint32_t channel_id)
+{ 
+    return (((timx->CR2) >> (channel_id << 1)) & TIM_CR2_OIS1N);        
+}
+
+/**
+* @brief  使能清除OCxREF功能
+* @param  timx TIM外设
+* @param  channel_id 指定TIM通道
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+*             @arg TIM_CHANNEL_3
+*             @arg TIM_CHANNEL_4
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_channel_clear_ocxref_enable(TIM_t *timx, uint32_t channel_id)
+{
+    uint32_t tmp_value = ((channel_id & 0x01) == 0)?0U:8U;
+    uint32_t shift_value = ((channel_id & 0x02) == 0)?0U:4U;    
+    __IO uint32_t *preg = (__IO uint32_t *)((uint32_t)(&timx->CCM1) + shift_value);
+    
+    /* 使能清除OCxREF */ 
+    *preg |= (TIM_CCM1_OC1CE << tmp_value);
+}
+
+/**
+* @brief  禁止清除OCxREF功能
+* @param  timx TIM外设
+* @param  channel_id 指定TIM通道
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+*             @arg TIM_CHANNEL_3
+*             @arg TIM_CHANNEL_4
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_channel_clear_ocxref_disable(TIM_t *timx, uint32_t channel_id)
+{
+    uint32_t tmp_value = ((channel_id & 0x01) == 0)?0U:8U;
+    uint32_t shift_value = ((channel_id & 0x02) == 0)?0U:4U;      
+    __IO uint32_t *preg = (__IO uint32_t *)((uint32_t)(&timx->CCM1) + shift_value);
+    
+    /* 禁止清除OCxREF */ 
+    *preg &= (~(TIM_CCM1_OC1CE << tmp_value));
+}
+
+/**
+* @brief  设置输入捕获预分频值
+* @param  timx TIM外设
+* @param  channel_id 指定TIM通道
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+* @param  icxpsc_num 输入捕获预分频值
+*             @arg TIM_INPUT_CAPTURE_PSC_DIV1
+*             @arg TIM_INPUT_CAPTURE_PSC_DIV2
+*             @arg TIM_INPUT_CAPTURE_PSC_DIV4
+*             @arg TIM_INPUT_CAPTURE_PSC_DIV8
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_set_channel_icxpsc(TIM_t *timx, uint32_t channel_id, uint32_t icxpsc_num)
+{
+    uint32_t tmp_value = ((channel_id & 0x01) == 0)?0U:8U;
+    uint32_t shift_value = ((channel_id & 0x02) == 0)?0U:4U;      
+    __IO uint32_t *preg = (__IO uint32_t *)((uint32_t)(&timx->CCM1) + shift_value);
+    
+    /* 设置输入捕获预分频 */ 
+    MODIFY_REG(*preg, (TIM_CCM1_IC1PSC << tmp_value), (icxpsc_num << tmp_value));
+}
+
+
+/**
+* @brief  获取输入捕获预分频值
+* @param  timx TIM外设
+* @param  channel_id 指定TIM通道
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+* @retval uint32_t 输入捕获预分频值
+*             @arg TIM_INPUT_CAPTURE_PSC_DIV1
+*             @arg TIM_INPUT_CAPTURE_PSC_DIV2
+*             @arg TIM_INPUT_CAPTURE_PSC_DIV4
+*             @arg TIM_INPUT_CAPTURE_PSC_DIV8
+*/
+__STATIC_INLINE uint32_t std_tim_get_channel_icxpsc(TIM_t *timx, uint32_t channel_id)
+{
+    uint32_t tmp_value = ((channel_id & 0x01) == 0)?0U:8U;
+    uint32_t shift_value = ((channel_id & 0x02) == 0)?0U:4U;        
+    __IO uint32_t *preg = (__IO uint32_t *)((uint32_t)(&timx->CCM1) + shift_value);
+    
+    /* 获取输入捕获预分频 */ 
+    return ((*preg >> tmp_value) & TIM_CCM1_IC1PSC);
+    
+}
+
+
+/**
+* @brief  使能TIM通道输出比较的预装载功能
+* @param  timx TIM外设
+* @param  channel_id 指定TIM通道
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+*             @arg TIM_CHANNEL_3
+*             @arg TIM_CHANNEL_4
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_preloadccx_channel_enable(TIM_t *timx, uint32_t channel_id)
+{ 
+    uint32_t tmp_value = ((channel_id & 0x01) == 0)?0U:8U;
+    uint32_t shift_value = ((channel_id & 0x02) == 0)?0U:4U;        
+    __IO uint32_t *preg = (__IO uint32_t *)((uint32_t)(&timx->CCM1) + shift_value);    
+ 
+    /* 使能输出比较预装载功能 */ 
+    *preg |= (TIM_CCM1_OC1PE << tmp_value);
+}
+
+
+/**
+* @brief  禁止TIM通道输出比较的预装载功能
+* @param  timx TIM外设
+* @param  channel_id 指定TIM通道
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+*             @arg TIM_CHANNEL_3
+*             @arg TIM_CHANNEL_4
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_preloadccx_channel_disable(TIM_t *timx, uint32_t channel_id)
+{ 
+    uint32_t tmp_value = ((channel_id & 0x01) == 0)?0U:8U;
+    uint32_t shift_value = ((channel_id & 0x02) == 0)?0U:4U;        
+    __IO uint32_t *preg = (__IO uint32_t *)((uint32_t)(&timx->CCM1) + shift_value);    
+ 
+    /* 使能输出比较预装载功能 */ 
+    *preg &= (~(TIM_CCM1_OC1PE << tmp_value));
+}
+
+
+/**
+* @brief  使能TIM通道快速模式
+* @param  timx TIM外设
+* @param  channel_id 指定TIM通道
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+*             @arg TIM_CHANNEL_3
+*             @arg TIM_CHANNEL_4
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_fastmode_channel_enable(TIM_t *timx, uint32_t channel_id)
+{ 
+    uint32_t tmp_value = ((channel_id & 0x01) == 0)?0U:8U;
+    uint32_t shift_value = ((channel_id & 0x02) == 0)?0U:4U;        
+    __IO uint32_t *preg = (__IO uint32_t *)((uint32_t)(&timx->CCM1) + shift_value);    
+ 
+    /* 使能输出比较预装载功能 */ 
+    *preg |= (TIM_CCM1_OC1FE << tmp_value);
+}
+
+
+/**
+* @brief  禁止TIM通道快速模式
+* @param  timx TIM外设
+* @param  channel_id 指定TIM通道
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+*             @arg TIM_CHANNEL_3
+*             @arg TIM_CHANNEL_4
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_fastmode_channel_disable(TIM_t *timx, uint32_t channel_id)
+{ 
+    uint32_t tmp_value = ((channel_id & 0x01) == 0)?0U:8U;
+    uint32_t shift_value = ((channel_id & 0x02) == 0)?0U:4U;        
+    __IO uint32_t *preg = (__IO uint32_t *)((uint32_t)(&timx->CCM1) + shift_value);    
+ 
+    /* 禁止输出快速模式 */ 
+    *preg &= (~(TIM_CCM1_OC1FE << tmp_value));
+}
+
+
+/**
+* @brief  配置通道输出模式
+* @param  timx TIM外设
+* @param  channel_id 指定TIM通道
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+*             @arg TIM_CHANNEL_3
+*             @arg TIM_CHANNEL_4
+* @param  ocmode 输出模式选择
+*             @arg TIM_OUTPUT_MODE_FROZEN         
+*             @arg TIM_OUTPUT_MODE_ACTIVE         
+*             @arg TIM_OUTPUT_MODE_INACTIVE       
+*             @arg TIM_OUTPUT_MODE_TOGGLE         
+*             @arg TIM_OUTPUT_MODE_FORCED_INACTIVE
+*             @arg TIM_OUTPUT_MODE_FORCED_ACTIVE  
+*             @arg TIM_OUTPUT_MODE_PWM1           
+*             @arg TIM_OUTPUT_MODE_PWM2                   
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_set_ocmode(TIM_t *timx, uint32_t channel_id, uint32_t ocmode)
+{
+    uint32_t tmp_value = ((channel_id & 0x01) == 0)?0U:8U;
+    uint32_t shift_value = ((channel_id & 0x02) == 0)?0U:4U;        
+    __IO uint32_t *preg = (__IO uint32_t *)((uint32_t)(&timx->CCM1) + shift_value);
+    
+    MODIFY_REG(*preg, ((TIM_CCM1_OC1M  | TIM_CCM1_CC1S) << tmp_value), (ocmode << tmp_value));
+}
+
+
+/**
+* @brief  获取通道输出模式
+* @param  timx TIM外设
+* @param  channel_id 指定TIM通道
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+*             @arg TIM_CHANNEL_3
+*             @arg TIM_CHANNEL_4
+* @note   该函数执行后,会将通道设置为输出模式
+* @retval uint32_t 输出模式选择
+*             @arg TIM_OUTPUT_MODE_FROZEN         
+*             @arg TIM_OUTPUT_MODE_ACTIVE         
+*             @arg TIM_OUTPUT_MODE_INACTIVE       
+*             @arg TIM_OUTPUT_MODE_TOGGLE         
+*             @arg TIM_OUTPUT_MODE_FORCED_INACTIVE
+*             @arg TIM_OUTPUT_MODE_FORCED_ACTIVE  
+*             @arg TIM_OUTPUT_MODE_PWM1           
+*             @arg TIM_OUTPUT_MODE_PWM2               
+*/
+__STATIC_INLINE uint32_t std_tim_get_ocmode(TIM_t *timx, uint32_t channel_id)
+{
+    uint32_t tmp_value = ((channel_id & 0x01) == 0)?0U:8U;
+    uint32_t shift_value = ((channel_id & 0x02) == 0)?0U:4U;    
+    __IO uint32_t *preg = (__IO uint32_t *)((uint32_t)(&timx->CCM1) + shift_value);
+
+    return ((*preg >> tmp_value) & TIM_CCM1_OC1M);
+}
+
+/**
+* @brief  设置捕获/比较寄存器的值
+* @param  timx TIM外设
+* @param  ccx_value 捕获比较寄存器的值
+* @param  channel_id TIM 通道配置
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+*             @arg TIM_CHANNEL_3
+*             @arg TIM_CHANNEL_4
+* @retval std_status_t 返回API执行结果
+*/
+__STATIC_INLINE void std_tim_set_ccx_value(TIM_t *timx, uint32_t channel_id, uint32_t ccx_value)
+{    
+    if ((timx->CR1 & TIM_CR1_MODE) != TIM_CR1_MODE)
+    {
+        __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)(&timx->CC1) + (channel_id << 2));
+        MODIFY_REG(*pReg, TIM_CC1_CC1, ccx_value);    
+    }
+    else
+    {
+        uint32_t tmp_value = ((channel_id & 0x02) == 0)?0U:8U;   
+        uint32_t shift_value = ((channel_id & 0x02) == 0)?0U:2U;          
+        __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)(&timx->CC1) + ((channel_id - shift_value) << 2));
+        MODIFY_REG(*pReg, (TIM3_CC1_CC1_MODE1 << tmp_value), (ccx_value << tmp_value));
+    }
+}
+
+
+/**
+* @brief  获取捕获/比较寄存器的值
+* @param  timx TIM外设
+* @param  channel_id TIM 通道配置
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+*             @arg TIM_CHANNEL_3
+*             @arg TIM_CHANNEL_4
+* @retval uint32_t 捕获比较寄存器的值
+*/
+__STATIC_INLINE uint32_t std_tim_get_ccx_value(TIM_t *timx, uint32_t channel_id)
+{
+    if ((timx->CR1 & TIM_CR1_MODE) != TIM_CR1_MODE)
+    {
+        __IO uint32_t *preg = (__IO uint32_t *)((uint32_t)(&timx->CC1) + (channel_id << 2));
+        return (*preg & TIM_CC1_CC1);
+    }
+    else
+    {
+        uint32_t tmp_value = ((channel_id & 0x02) == 0)?0U:8U;  
+        uint32_t shift_value = ((channel_id & 0x02) == 0)?0U:2U;     
+        __IO uint32_t *preg = (__IO uint32_t *)((uint32_t)(&timx->CC1) + ((channel_id - shift_value) << 2));
+        
+        return ((*preg >> tmp_value) & TIM3_CC1_CC1_MODE1);
+    }
+}
+
+
+/**
+* @brief  设置通道为输入模式
+* @param  timx TIM外设
+* @param  channel_id TIM 通道配置
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+* @param  icmode 输入模式选择
+*             @arg TIM_INPUT_CAPTURE_SEL_DIRECTTI
+*             @arg TIM_INPUT_CAPTURE_SEL_INDIRECTTI
+*             @arg TIM_INPUT_CAPTURE_SEL_TRC
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_set_icmode(TIM_t *timx, uint32_t channel_id, uint32_t icmode)
+{
+    uint32_t tmp_value = ((channel_id & 0x01) == 0)?0U:8U;
+    uint32_t shift_value = ((channel_id & 0x02) == 0)?0U:4U;        
+    __IO uint32_t *preg = (__IO uint32_t *)((uint32_t)(&timx->CCM1) + shift_value);
+    
+    MODIFY_REG(*preg, (TIM_CCM1_CC1S << tmp_value), (icmode << tmp_value));
+}
+
+/**
+* @brief  获取通道的输入状态
+* @param  timx TIM外设
+* @param  channel_id TIM 通道配置
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+* @retval uint32_t 输入模式选择
+*             @arg TIM_INPUT_CAPTURE_SEL_DIRECTTI
+*             @arg TIM_INPUT_CAPTURE_SEL_INDIRECTTI
+*             @arg TIM_INPUT_CAPTURE_SEL_TRC
+*/
+__STATIC_INLINE uint32_t std_tim_get_icmode(TIM_t *timx, uint32_t channel_id)
+{
+    uint32_t tmp_value = ((channel_id & 0x01) == 0)?0U:8U;
+    uint32_t shift_value = ((channel_id & 0x02) == 0)?0U:4U;        
+    __IO uint32_t *preg = (__IO uint32_t *)((uint32_t)(&timx->CCM1) + shift_value);
+    
+    return ((*preg >> tmp_value) & TIM_CCM1_CC1S);
+}
+
+/**
+* @brief  设置输入通道的滤波参数
+* @param  timx TIM外设
+* @param  channel_id TIM 通道配置
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+* @param  icfilter 输入滤波参数,其值的范围为:0x00~0x0F
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_set_icfilter(TIM_t *timx, uint32_t channel_id, uint32_t icfilter)
+{
+    uint32_t tmp_value = ((channel_id & 0x01) == 0)?0U:8U;
+    uint32_t shift_value = ((channel_id & 0x02) == 0)?0U:4U;        
+    __IO uint32_t *preg = (__IO uint32_t *)((uint32_t)(&timx->CCM1) + shift_value);
+    
+    MODIFY_REG(*preg, (TIM_CCM1_IC1F << tmp_value), ((icfilter << tmp_value) << 4U));
+}
+
+/**
+* @brief  获取输入通道的滤波参数
+* @param  timx TIM外设
+* @param  channel_id TIM 通道配置
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+* @retval uint32_t 输入滤波参数,其值的范围为:0x00~0x0F
+*/
+__STATIC_INLINE uint32_t std_tim_get_icfilter(TIM_t *timx, uint32_t channel_id)
+{
+    uint32_t tmp_value = ((channel_id & 0x01) == 0)?0U:8U;
+    uint32_t shift_value = ((channel_id & 0x02) == 0)?0U:4U;        
+    __IO uint32_t *preg = (__IO uint32_t *)((uint32_t)(&timx->CCM1) + shift_value);
+    
+    return (((*preg >> tmp_value) & TIM_CCM1_IC1F) >> 4U);
+}
+
+
+/**
+* @brief  设置主模式(TRIG_OUT)输出参数
+* @param  timx TIM外设
+* @param  trigout_mode 主模式输出参数定义
+*             @arg TIM_TRIG_OUT_RESET
+*             @arg TIM_TRIG_OUT_ENABLE
+*             @arg TIM_TRIG_OUT_UPDATE
+*             @arg TIM_TRIG_OUT_CC1      
+*             @arg TIM_TRIG_OUT_OC1REF   
+*             @arg TIM_TRIG_OUT_OC2REF   
+*             @arg TIM_TRIG_OUT_OC3REF   
+*             @arg TIM_TRIG_OUT_OC4REF
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_trigout_mode_config(TIM_t *timx, uint32_t trigout_mode)
+{
+    MODIFY_REG(timx->CR2, TIM_CR2_MM_SEL, trigout_mode);
+}
+
+
+/**
+* @brief  设置从模式参数
+* @param  timx TIM外设
+* @param  slave_mode 从模式参数定义
+*             @arg TIM_SLAVE_MODE_DISABLE 
+*             @arg TIM_SLAVE_MODE_RESET   
+*             @arg TIM_SLAVE_MODE_GATED   
+*             @arg TIM_SLAVE_MODE_TRIG    
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_slave_mode_config(TIM_t *timx, uint32_t slave_mode)
+{
+    MODIFY_REG(timx->SMC, TIM_SMC_SM_SEL, slave_mode);
+}
+
+/**
+* @brief  设置触发输入源
+* @param  timx TIM外设
+* @param  trig_source 触发输入源定义
+*             @arg TIM_TRIG_SOURCE_ITR0    
+*             @arg TIM_TRIG_SOURCE_TI1F_ED
+*             @arg TIM_TRIG_SOURCE_TI1FP1 
+*             @arg TIM_TRIG_SOURCE_TI2FP2  
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_trig_source_config(TIM_t *timx, uint32_t trig_source)
+{
+    MODIFY_REG(timx->SMC, TIM_SMC_TS, trig_source);
+}
+
+
+/**
+* @brief  使能主/从模式
+* @param  timx TIM外设
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_master_mode_enable(TIM_t *timx)
+{
+    timx->SMC |= TIM_SMC_MS_MOD;
+}
+
+
+/**
+* @brief  禁止主/从模式
+* @param  timx TIM外设
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_master_mode_disable(TIM_t *timx)
+{
+    timx->SMC &= (~TIM_SMC_MS_MOD);
+}
+
+
+/**
+* @brief  配置TIM OCREF CLEAR输入源
+* @param  timx TIM外设
+* @param  ocrefclr_source OCREF CLR源选择
+*             @arg TIM_CLEAR_INPUT_SRC_COMP1: OCREF CLR连接到COMP1
+*             @arg TIM_CLEAR_INPUT_SRC_COMP2: OCREF CLR连接到COMP2
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_ocrefclr_source_config(TIM_t *timx, uint32_t ocrefclr_source)
+{
+    MODIFY_REG(timx->CFG, TIM_CFG_OCREF_CLR, ocrefclr_source);
+}
+
+
+/**
+* @brief  使能输入捕获/输出比较换相预装载
+* @param  timx TIM外设
+* @note   该函数仅对互补通道有效
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_ccreload_enable(TIM_t *timx)
+{
+    timx->CR2 |= TIM_CR2_CC_PRECR;
+}
+
+/**
+* @brief  禁止输入捕获/输出比较换相预装载
+* @param  timx TIM外设
+* @note   该函数仅对互补通道有效
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_ccreload_disable(TIM_t *timx)
+{
+    timx->CR2 &= (~TIM_CR2_CC_PRECR);
+}
+
+
+/**
+* @brief  配置换相控制更新源选择
+* @param  timx TIM外设
+* @param  ccupdate_source 换相更新源
+*             @arg TIM_COM_SOFTWARE
+*             @arg TIM_COM_TRGI
+* @note   该函数仅对互补通道有效
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_cc_set_update_source(TIM_t *timx, uint32_t ccupdate_source)
+{
+    MODIFY_REG(timx->CR2, TIM_CR2_CCU_SEL, ccupdate_source);
+}
+
+
+
+/**
+* @brief  使能TI1的XOR功能
+* @param  timx TIM外设
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_ti1xor_enable(TIM_t *timx)
+{
+    timx->CR2 |= TIM_CR2_TI1_XOR_SEL;
+}
+
+
+/**
+* @brief  禁止TI1的XOR功能
+* @param  timx TIM外设
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_ti1xor_disable(TIM_t *timx)
+{
+    timx->CR2 &= (~TIM_CR2_TI1_XOR_SEL);
+}
+
+
+/**
+* @brief  配置TIM输入通道重映射功能
+* @param  timx TIM外设
+* @param  ti_sel 通道输入源选择参数
+*             @arg TIM_TIM3_TI1_GPIO:           TIM3 TI1连接到GPIO
+*             @arg TIM_TIM3_TI1_COMP1:          TIM3 TI1连接到COMP1输出
+*             @arg TIM_TIM3_TI2_GPIO:           TIM3 TI2连接到GPIO
+*             @arg TIM_TIM3_TI2_COMP2:          TIM3 TI2连接到COMP2输出
+* @param  channel_id TIM通道
+*             @arg TIM_CHANNEL_1
+*             @arg TIM_CHANNEL_2
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_set_channel_remap(TIM_t *timx, uint32_t ti_sel, uint32_t channel_id)
+{
+    MODIFY_REG(timx->TISEL, (TIM_TISEL_TI1_SEL << (channel_id << 3)), ti_sel);
+}
+
+
+
+/**
+* @brief  TIM输出使能
+* @param  timx TIM外设
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_moen_enable(TIM_t *timx)            
+{
+    timx->BDT |= (TIM_BDT_MOEN);
+}
+
+/**
+* @brief  TIM输出禁止
+* @param  timx TIM外设
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_moen_disable(TIM_t *timx)        
+{
+    timx->BDT &= (~TIM_BDT_MOEN);
+}
+
+/**
+* @brief  TIM自动输出使能
+* @param  timx TIM外设
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_aoen_enable(TIM_t *timx)            
+{
+    timx->BDT |= (TIM_BDT_AOEN);
+}
+
+/**
+* @brief  TIM自动输出禁止
+* @param  timx TIM外设
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_aoen_disable(TIM_t *timx)        
+{
+    timx->BDT &= (~TIM_BDT_AOEN);
+}
+
+
+/** 
+* @brief  使能OSSR功能
+* @param  timx TIM外设
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_ossr_enable(TIM_t *timx)                
+{
+    timx->BDT |= TIM_BDT_OSSR;
+}
+
+/** 
+* @brief  禁止OSSR功能
+* @param  timx TIM外设
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_ossr_disable(TIM_t *timx)                
+{
+    timx->BDT &= (~TIM_BDT_OSSR);
+}
+
+/** 
+* @brief  使能OSSI功能
+* @param  timx TIM外设
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_ossi_enable(TIM_t *timx)                
+{
+    timx->BDT |= TIM_BDT_OSSI;
+}
+
+/** 
+* @brief  禁止OSSI功能
+* @param  timx TIM外设
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_ossi_disable(TIM_t *timx)                
+{
+    timx->BDT &= (~TIM_BDT_OSSI);
+}
+
+
+/** 
+* @brief  使能TIM断路
+* @param  timx TIM外设
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_bken_enable(TIM_t *timx)                
+{
+    timx->BDT |= TIM_BDT_BKEN;
+}
+
+/** 
+* @brief  禁止TIM断路
+* @param  timx TIM外设
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_bken_disable(TIM_t *timx)                
+{
+    timx->BDT &= (~TIM_BDT_BKEN);
+}
+
+
+/** 
+* @brief  使能断路源
+* @param  timx TIM外设
+* @param  brk_source 断路输入源定义
+*             @arg TIM_BREAK_INPUT_SRC_GPIO
+*             @arg TIM_BREAK_INPUT_SRC_COMP1
+*             @arg TIM_BREAK_INPUT_SRC_COMP2
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_brk_source_enable(TIM_t *timx, uint32_t brk_source)
+{
+    timx->AF1 |= brk_source;
+}
+
+
+/** 
+* @brief  配置断路的极性
+* @param  timx TIM外设
+* @param  brk_source 断路输入源定义
+*             @arg TIM_BREAK_INPUT_SRC_GPIO
+*             @arg TIM_BREAK_INPUT_SRC_COMP1
+*             @arg TIM_BREAK_INPUT_SRC_COMP2
+* @param  brk_pol 断路输入极性定义
+*             @arg TIM_BREAK_INPUT_POL_HIGH
+*             @arg TIM_BREAK_INPUT_POL_LOW
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_set_brk_pol(TIM_t *timx, uint32_t brk_source, uint32_t brk_pol)
+{   
+    MODIFY_REG(timx->AF1, (TIM1_AF1_BKINP << (brk_source >> 1U)), (brk_pol << (brk_source >> 1U)));
+}
+
+
+/**
+* @brief  配置TIM死区时间
+* @param  timx TIM外设
+* @param  deadtime 死区时间,该值的范围:0x00~0xFF
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_set_deadtime(TIM_t *timx, uint32_t deadtime)
+{
+    MODIFY_REG(timx->BDT, TIM_BDT_DTG, deadtime);
+}
+
+
+/**
+* @brief  获取TIM死区时间
+* @param  timx TIM外设
+* @retval uint32_t 死区时间,其值范围为:0x00~0xFF
+*/
+__STATIC_INLINE uint32_t std_tim_get_deadtime(TIM_t *timx)
+{
+    return (timx->BDT & TIM_BDT_DTG);
+}
+
+
+/**
+* @brief  配置TIM的锁定级别
+* @param  timx TIM外设
+* @param  locklevel LOCK锁定级别
+*             @arg TIM_LOCK_LEVEL_OFF
+*             @arg TIM_LOCK_LEVEL1
+*             @arg TIM_LOCK_LEVEL2
+*             @arg TIM_LOCK_LEVEL3
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_set_locklevel(TIM_t *timx, uint32_t locklevel)
+{
+    MODIFY_REG(timx->BDT, TIM_BDT_LOCK, locklevel);
+}
+
+
+/**
+* @brief  获取TIM锁定级别
+* @param  timx TIM外设
+* @retval uint32_t LOCK锁定级别
+*             @arg TIM_LOCK_LEVEL_OFF
+*             @arg TIM_LOCK_LEVEL1
+*             @arg TIM_LOCK_LEVEL2
+*             @arg TIM_LOCK_LEVEL3
+*/
+__STATIC_INLINE uint32_t std_tim_get_locklevel(TIM_t *timx)
+{
+    return (timx->BDT & TIM_BDT_LOCK);
+}
+
+
+/** 
+* @brief  使能LOCKUP锁定功能
+* @param  timx TIM外设
+* @retval 无
+*/
+__STATIC_INLINE void std_tim_lockup_lock_enable(TIM_t *timx)
+{
+    timx->AF1 |= TIM1_AF1_LOCKUP_LOCK;
+}
+
+
+
+
+/* 基础计数功能初始化/去初始化 */
+void std_tim_deinit(TIM_t *timx);
+void std_tim_init(TIM_t *timx, std_tim_basic_init_t *tim_init_param);
+void std_tim_struct_init(std_tim_basic_init_t *tim_init_struct);
+
+/* 输入捕获初始化 */
+void std_tim_input_capture_init(TIM_t *timx, std_tim_input_capture_init_t *input_config, uint32_t channel_id);
+void std_tim_input_capture_struct_init(std_tim_input_capture_init_t *input_init_struct);
+
+/* 输出模式初始化及参数配置函数 */
+void std_tim_output_compare_init(TIM_t *timx, std_tim_output_compare_init_t *output_config, uint32_t channel_id);
+void std_tim_output_compare_struct_init(std_tim_output_compare_init_t *output_init_struct);
+
+/* 断路功能初始化 */
+void std_tim_bdt_init(TIM_t* timx, std_tim_break_init_t *bdt_init_param);
+void std_tim_bdt_struct_init(std_tim_break_init_t *bdt_init_struct);
+
+
+/**
+* @}
+*/
+
+#ifdef __cplusplus
+}
+#endif
+/**
+* @}
+*/
+
+/**
+* @}
+*/
+#endif /* CIU32F003_STD_TIM_H */
+

+ 664 - 0
CIU32F003_LIB/Include/ciu32f003_std_uart(1).h

@@ -0,0 +1,664 @@
+/************************************************************************************************/
+/**
+* @file               ciu32f003_std_uart.h
+* @author             MCU Ecosystem Development Team
+* @brief              UART STD库驱动头文件。
+*                     提供UART相关的STD库操作函数声明、数据类型以及常量的定义。                         
+*                     
+*
+**************************************************************************************************
+* @attention
+* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
+*
+**************************************************************************************************
+*/
+
+/* 避免头文件重复引用 */
+#ifndef CIU32F003_STD_UART_H
+#define CIU32F003_STD_UART_H
+
+/************************************************************************************************/
+/** 
+* @addtogroup CIU32F003_STD_Driver
+* @{
+*/
+
+/**
+* @defgroup UART UART
+* @brief 通用异步收发器的STD库驱动
+* @{
+*/
+/************************************************************************************************/
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/*------------------------------------includes--------------------------------------------------*/
+#include "ciu32f003_std_common.h"
+
+/*------------------------------------type define-----------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @defgroup UART_Types UART Types 
+* @brief  UART数据类型定义
+* @{
+*
+*/
+/************************************************************************************************/
+
+/**
+* @brief  UART初始化配置结构体定义
+*/
+typedef struct
+{
+    uint32_t direction;                                      /**< UART 传输模式(传输方向)
+                                                                      @arg UART_DIRECTION_SEND ...                     */
+    uint32_t baudrate;                                       /**< UART 波特率                                          */
+    
+    uint32_t wordlength;                                     /**< UART 数据帧字长
+                                                                      @arg UART_WORDLENGTH_8BITS ...                   */
+    uint32_t stopbits;                                       /**< UART 数据帧停止位长度
+                                                                      @arg UART_STOPBITS_1 ...                         */
+    uint32_t parity;                                         /**< UART 数据帧奇偶校验
+                                                                      @arg UART_PARITY_NONE ...                        */
+}std_uart_init_t;
+
+/**
+* @}
+*/
+
+/*--------------------------------------------define--------------------------------------------*/
+/************************************************************************************************/
+/**
+* @defgroup UART_Constants UART Constants
+* @brief    UART常量定义及宏定义
+* @{
+*
+*/
+/************************************************************************************************/
+
+/* UART 数据帧长度 */
+#define  UART_WORDLENGTH_8BITS                 UART_CR1_WL8BITS                     /**< 8-bits 字长 */
+#define  UART_WORDLENGTH_9BITS                 UART_CR1_WL9BITS                     /**< 9-bits 字长 */
+
+/* UART 数据帧奇偶校验 */
+#define  UART_PARITY_NONE                      (0x00000000U)                         /**< 无校验 */
+#define  UART_PARITY_EVEN                       UART_CR1_PEN                         /**< 偶校验 */
+#define  UART_PARITY_ODD                       (UART_CR1_PEN | UART_CR1_PTS)         /**< 奇校验 */
+
+/* UART传输模式 */
+#define  UART_DIRECTION_NONE                   (0x00000000U)                         /**< 未使能发送器和接收器          */
+#define  UART_DIRECTION_SEND                   UART_CR1_TE                           /**< 单接收模式(仅使能接收器)      */
+#define  UART_DIRECTION_RECEIVE                UART_CR1_RE                           /**< 单发送模式(仅使能发送器)      */
+#define  UART_DIRECTION_SEND_RECEIVE           (UART_CR1_TE |UART_CR1_RE)            /**< 发送/接收(使能发送器和接收器) */
+
+/* UART 数据帧大小端 */
+#define  UART_DATA_ORDER_LSBFIRST              (0x00000000U)                         /**< 低有效位优先 */
+#define  UART_DATA_ORDER_MSBFIRST              UART_CR2_MSBFIRST                     /**< 高有效位优先 */
+
+/* UART 数据帧停止位 */
+#define  UART_STOPBITS_1                       UART_CR2_STOPBIT_1                    /**< 1bit停止位    */
+#define  UART_STOPBITS_2                       UART_CR2_STOPBIT_2                    /**< 2bits停止位   */
+
+/* UART 数据帧采样策略 */
+#define  UART_SAMPLE_THREE_BIT                 (0x00000000U)                         /**< Three-bit采样,支持噪声检测 */
+#define  UART_SAMPLE_ONE_BIT                   UART_CR3_OBS                          /**< One-bit采样,不支持噪声检测 */
+
+/*UART中断使能位 */
+#define  UART_CR1_INTERRUPT_RXNE               UART_CR1_RXNEIE                       /**< UART 接收数据寄存器非空中断使能                   */
+#define  UART_CR1_INTERRUPT_TC                 UART_CR1_TCIE                         /**< UART 发送完成中断使能                             */
+#define  UART_CR1_INTERRUPT_TXE                UART_CR1_TXEIE                        /**< UART 发送数据寄存器空中断使能                     */
+#define  UART_CR1_INTERRUPT_PE                 UART_CR1_PEIE                         /**< UART 奇偶校验错误中断使能                         */
+
+/* UART中断标志清除位 */
+#define  UART_CLEAR_PE                         UART_ICR_PECF                         /**< 奇偶校验错误标志清除 */
+#define  UART_CLEAR_FE                         UART_ICR_FECF                         /**< 帧错误标志清除       */
+#define  UART_CLEAR_NOISE                      UART_ICR_NOISECF                      /**< 噪声错误标志清除     */
+#define  UART_CLEAR_ORE                        UART_ICR_ORECF                        /**< 接收溢出错误标志清除 */
+#define  UART_CLEAR_TC                         UART_ICR_TCCF                         /**< 发送完成标志清除     */
+
+/* UART 状态标志 */
+#define  UART_FLAG_RECEIVE_BUSY                UART_ISR_BUSY                         /**< UART 接收忙(接收管脚上有数据传输)          */
+#define  UART_FLAG_TXE                         UART_ISR_TXE                          /**< UART 发送数据寄存器空标志                  */
+#define  UART_FLAG_TC                          UART_ISR_TC                           /**< UART 发送完成标志                          */
+#define  UART_FLAG_RXNE                        UART_ISR_RXNE                         /**< UART 接收数据寄存器非空标志                */
+#define  UART_FLAG_ORE                         UART_ISR_ORE                          /**< UART 接收溢出错误标志                      */
+#define  UART_FLAG_NOISE                       UART_ISR_NOISE                        /**< UART 噪声错误标志                          */
+#define  UART_FLAG_FE                          UART_ISR_FE                           /**< UART 帧错误标志                            */
+#define  UART_FLAG_PE                          UART_ISR_PE                           /**< UART 奇偶校验错误标志                      */
+#define  UART_FLAG_ERR                         (UART_FLAG_ORE | UART_FLAG_NOISE \
+                                                              | UART_FLAG_FE)        /**< UART 错误标志(上溢错误、噪声错误、帧错误)*/       
+
+/**
+* @}
+*/
+
+/*-------------------------------------------functions------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @defgroup UART_External_Functions UART External Functions
+* @brief    UART对外函数
+* @{
+*
+*/
+/************************************************************************************************/
+
+/** 
+* @brief  使能UART
+* @param  uartx UART外设 
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_enable(UART_t *uartx)
+{
+    uartx->CR1 |= (UART_CR1_UE);    
+}
+
+/** 
+* @brief  禁止UART
+* @param  uartx UART外设
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_disable(UART_t *uartx)
+{
+    uartx->CR1 &= (~UART_CR1_UE);
+}
+
+/** 
+* @brief  设置UART字符长度
+* @param  uartx UART外设
+* @param  word_length UART 字符长度
+*             @arg UART_WORDLENGTH_8BITS
+*             @arg UART_WORDLENGTH_9BITS 
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_set_word_length(UART_t *uartx, uint32_t word_length)
+{
+    MODIFY_REG(uartx->CR1, UART_CR1_WL, word_length);
+}
+
+/** 
+* @brief  获取UART字符长度
+* @param  uartx UART外设
+* @retval uint32_t UART 字符长度
+*             @arg UART_WORDLENGTH_8BITS
+*             @arg UART_WORDLENGTH_9BITS 
+*/
+__STATIC_INLINE uint32_t std_uart_get_word_length(UART_t *uartx)
+{
+    return (uartx->CR1 & UART_CR1_WL);
+}
+
+/** 
+* @brief  设置UART奇偶校验
+* @param  uartx UART外设
+* @param  parity UART奇偶校验项
+*             @arg UART_PARITY_NONE
+*             @arg UART_PARITY_EVEN
+*             @arg UART_PARITY_ODD 
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_set_parity(UART_t *uartx,uint32_t parity)
+{
+    MODIFY_REG(uartx->CR1,(UART_CR1_PTS | UART_CR1_PEN), parity);
+} 
+
+/** 
+* @brief  获取UART奇偶校验
+* @param  uartx UART外设
+* @retval uint32_t UART奇偶校验项
+*             @arg UART_PARITY_NONE
+*             @arg UART_PARITY_EVEN
+*             @arg UART_PARITY_ODD 
+*/
+__STATIC_INLINE uint32_t std_uart_get_parity(UART_t *uartx )
+{
+    return(uartx->CR1 & (UART_CR1_PTS | UART_CR1_PEN));
+} 
+
+/** 
+* @brief  设置UART停止位
+* @param  uartx UART外设
+* @param  stopbits UART停止位位数 
+*             @arg UART_STOPBITS_1     
+*             @arg UART_STOPBITS_2    
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_set_stopbits(UART_t *uartx, uint32_t stopbits)
+{
+    MODIFY_REG(uartx->CR2, UART_CR2_STOPBIT, stopbits);
+}
+
+/** 
+* @brief  获取UART停止位
+* @param  uartx UART外设
+* @retval uint32_t UART停止位位数 
+*             @arg UART_STOPBITS_1    
+*             @arg UART_STOPBITS_2    
+*/
+__STATIC_INLINE uint32_t std_uart_get_stopbits(UART_t *uartx)
+{
+    return(uartx->CR2 & UART_CR2_STOPBIT);
+}
+
+/** 
+* @brief  设置UART字符大小端
+* @param  uartx UART外设
+* @param  data_order UART 字符帧格式大小端
+*             @arg UART_DATA_ORDER_LSBFIRST
+*             @arg UART_DATA_ORDER_MSBFIRST
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_set_data_order(UART_t *uartx, uint32_t data_order)
+{
+    MODIFY_REG(uartx->CR2, UART_CR2_MSBFIRST, data_order);
+}
+
+/** 
+* @brief  获取UART字符大小端
+* @param  uartx UART外设
+* @retval uint32_t UART 字符帧格式大小端
+*             @arg UART_DATA_ORDER_LSBFIRST
+*             @arg UART_DATA_ORDER_MSBFIRST
+*/
+__STATIC_INLINE uint32_t std_uart_get_data_order(UART_t *uartx)
+{
+    return(uartx->CR2 & UART_CR2_MSBFIRST);
+}
+
+/** 
+* @brief  设置UART采样策略
+* @param  uartx UART外设
+* @param  sample_method UART采样策略
+*             @arg UART_SAMPLE_THREE_BIT
+*             @arg UART_SAMPLE_ONE_BIT
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_set_sample_method(UART_t *uartx,uint32_t sample_method)
+{
+    MODIFY_REG(uartx->CR3,UART_CR3_OBS, sample_method);
+}
+
+/** 
+* @brief  获取UART采样策略
+* @param  uartx UART外设
+* @retval uint32_t UART采样策略
+*             @arg UART_SAMPLE_THREE_BIT
+*             @arg UART_SAMPLE_ONE_BIT
+*/
+__STATIC_INLINE uint32_t std_uart_get_sample_method(UART_t *uartx)
+{
+    return (uartx->CR3 & UART_CR3_OBS);
+}
+
+/** 
+* @brief  设置UART传输方向
+* @param  uartx UART外设
+* @param  direction UART传输方向
+*             @arg UART_DIRECTION_NONE
+*             @arg UART_DIRECTION_SEND                                                                                        
+*             @arg UART_DIRECTION_RECEIVE                                                      
+*             @arg UART_DIRECTION_SEND_RECEIVE                                                                                                               
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_set_transfer_direction(UART_t *uartx, uint32_t direction)
+{
+    MODIFY_REG(uartx->CR1, UART_CR1_TE|UART_CR1_RE, direction);
+}
+
+/** 
+* @brief  获取 UART 传输方向控制
+* @param  uartx UART外设
+* @retval uint32_t 传输方向
+*             @arg UART_DIRECTION_NONE  
+*             @arg UART_DIRECTION_SEND                                                                                        
+*             @arg UART_DIRECTION_RECEIVE                                                      
+*             @arg UART_DIRECTION_SEND_RECEIVE                                                                                                               
+*/
+__STATIC_INLINE uint32_t std_uart_get_transfer_direction(UART_t *uartx)
+{
+    return(uartx->CR1 & (UART_CR1_TE|UART_CR1_RE));
+}
+
+/** 
+* @brief  使能UART引脚交换
+* @param  uartx UART外设
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_pin_swap_enable(UART_t *uartx)
+{
+    uartx->CR2 |= (UART_CR2_SWAP);
+} 
+
+/** 
+* @brief  禁止UART引脚交换
+* @param  uartx UART外设
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_pin_swap_disable(UART_t *uartx)
+{
+    uartx->CR2 &= (~UART_CR2_SWAP);
+} 
+
+/** 
+* @brief  使能UART RX引脚电平反向
+* @param  uartx UART外设
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_rx_level_invert_enable(UART_t *uartx)
+{
+    uartx->CR2 |= (UART_CR2_RXIVC);
+} 
+
+/** 
+* @brief  禁止UART RX引脚电平反向
+* @param  uartx UART外设
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_rx_level_invert_disable(UART_t *uartx)
+{
+    uartx->CR2 &= (~UART_CR2_RXIVC);
+} 
+
+/** 
+* @brief  使能UART TX引脚电平反向
+* @param  uartx UART外设
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_tx_level_invert_enable(UART_t *uartx)
+{
+    uartx->CR2 |= (UART_CR2_TXIVC);
+} 
+
+/** 
+* @brief  禁止UART TX引脚电平反向
+* @param  uartx UART外设
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_tx_level_invert_disable(UART_t *uartx)
+{
+    uartx->CR2 &= (~UART_CR2_TXIVC);
+} 
+
+/** 
+* @brief  使能UART数据极性反向
+* @param  uartx UART外设
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_data_invert_enable(UART_t *uartx)
+{
+    uartx->CR2 |= (UART_CR2_DATAIVC);
+} 
+
+/** 
+* @brief  禁止UART数据极性反向
+* @param  uartx UART外设
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_data_invert_disable(UART_t *uartx)
+{
+    uartx->CR2 &= (~UART_CR2_DATAIVC);
+}
+
+/** 
+* @brief  使能UART单线半双工模式
+* @param  uartx UART外设
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_half_duplex_enable(UART_t *uartx)
+{
+    uartx->CR3 |= (UART_CR3_HDEN);
+} 
+
+/** 
+* @brief  禁止UART单线半双工模式
+* @param  uartx UART外设
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_half_duplex_disable(UART_t *uartx)
+{
+    uartx->CR3 &= (~UART_CR3_HDEN);
+}
+
+/** 
+* @brief  禁止UART上溢检测
+* @param  uartx UART外设
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_overrun_disable(UART_t *uartx)
+{
+    uartx->CR3 |= (UART_CR3_ORED);
+}
+
+/** 
+* @brief  使能UART上溢检测
+* @param  uartx UART外设
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_overrun_enable(UART_t *uartx)
+{
+    uartx->CR3 &= (~UART_CR3_ORED);
+}
+
+/** 
+* @brief  使能UART CR1寄存器中控制的中断
+* @param  uartx UART外设
+* @param  interrupt UART中断源选择     
+*             @arg UART_CR1_INTERRUPT_RXNE                             
+*             @arg UART_CR1_INTERRUPT_TC                    
+*             @arg UART_CR1_INTERRUPT_TXE                    
+*             @arg UART_CR1_INTERRUPT_PE                                     
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_cr1_interrupt_enable(UART_t *uartx, uint32_t interrupt)
+{
+    uartx->CR1 |= (interrupt);
+}
+
+/** 
+* @brief  禁止UART CR1寄存器中控制的中断
+* @param  uartx UART外设
+* @param  interrupt UART中断源选择
+*             @arg UART_CR1_INTERRUPT_RXNE                                 
+*             @arg UART_CR1_INTERRUPT_TC                    
+*             @arg UART_CR1_INTERRUPT_TXE                    
+*             @arg UART_CR1_INTERRUPT_PE                                     
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_cr1_interrupt_disable(UART_t *uartx, uint32_t interrupt)
+{
+    uartx->CR1 &= (~interrupt);
+}
+
+/** 
+* @brief  获取UART CR1寄存器中控制的中断使能
+* @param  uartx UART外设
+* @param  interrupt UART中断源选择
+*             @arg UART_CR1_INTERRUPT_RXNE                                
+*             @arg UART_CR1_INTERRUPT_TC                    
+*             @arg UART_CR1_INTERRUPT_TXE                    
+*             @arg UART_CR1_INTERRUPT_PE                                     
+* @retval uint32_t 返回选择的UART中断源使能状态
+*             @arg 非0:  表示选择中断源使能
+*             @arg 0:    表示选择中断源未使能
+*/
+__STATIC_INLINE uint32_t std_uart_get_cr1_interrupt_enable(UART_t *uartx, uint32_t interrupt)
+{
+    return (uartx->CR1 & interrupt);
+}
+
+/** 
+* @brief  使能UART CR3寄存器中控制的 ERR 中断
+* @param  uartx UART外设                                            
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_cr3_interrupt_err_enable(UART_t *uartx)
+{
+    uartx->CR3 |= (UART_CR3_EIE);
+}
+
+/** 
+* @brief  禁止UART CR3寄存器中控制的 ERR 中断
+* @param  uartx UART外设                                         
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_cr3_interrupt_err_disable(UART_t *uartx)
+{
+    uartx->CR3 &= (~UART_CR3_EIE);
+}
+
+/** 
+* @brief  获取UART CR3寄存器中中断ERR 中断
+* @param  uartx UART外设
+* @retval uint32_t 返回选择的UART中断源使能状态
+*             @arg 非0:  表示选择中断源EIE 使能
+*             @arg 0:    表示选择中断源EIE 未使能
+*/
+__STATIC_INLINE uint32_t std_uart_get_cr3_interrupt_err_enable(UART_t *uartx)
+{
+     return (uartx->CR3 & UART_CR3_EIE);
+}
+
+/** 
+* @brief  获取UART标志
+* @param  uartx UART外设
+* @param  flag UART标志
+*             @arg UART_FLAG_RECEIVE_BUSY     
+*             @arg UART_FLAG_TXE              
+*             @arg UART_FLAG_TC               
+*             @arg UART_FLAG_RXNE             
+*             @arg UART_FLAG_ORE
+*             @arg UART_FLAG_NOISE              
+*             @arg UART_FLAG_FE               
+*             @arg UART_FLAG_PE               
+* @retval uint32_t UART标志置起状态
+*             @arg 非0:  状态置起
+*             @arg 0:    状态未置起
+*/
+__STATIC_INLINE uint32_t std_uart_get_flag(UART_t *uartx,uint32_t flag)
+{
+    return (uartx->ISR & flag);
+}
+
+/** 
+* @brief  清除UART标志 
+* @param  uartx UART外设
+* @param  clear_flag UART标志信息
+*             @arg UART_CLEAR_PE     
+*             @arg UART_CLEAR_FE              
+*             @arg UART_CLEAR_NOISE               
+*             @arg UART_CLEAR_ORE             
+*             @arg UART_CLEAR_TC                           
+* @retval 无      
+*/
+__STATIC_INLINE void std_uart_clear_flag(UART_t *uartx, uint32_t clear_flag)
+{
+    uartx->ICR = (clear_flag);
+}
+
+/** 
+* @brief  使能UART接收器
+* @param  uartx UART外设
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_rx_enable(UART_t *uartx)
+{
+    uartx->CR1 |= (UART_CR1_RE);
+} 
+
+/** 
+* @brief  禁止UART接收器
+* @param  uartx UART外设
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_rx_disable(UART_t *uartx)
+{
+    uartx->CR1 &= (~UART_CR1_RE);
+} 
+
+/** 
+* @brief  使能UART发送器
+* @param  uartx UART外设
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_tx_enable(UART_t *uartx)
+{
+    uartx->CR1 |= (UART_CR1_TE);
+} 
+
+/** 
+* @brief  禁止UART发送器
+* @param  uartx UART外设
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_tx_disable(UART_t *uartx)
+{
+    uartx->CR1 &= (~UART_CR1_TE);
+} 
+
+/** 
+* @brief  获取UART接收数据
+* @param  uartx UART外设
+* @retval uint32_t UART接收到的数据
+*/
+__STATIC_INLINE uint32_t std_uart_rx_read_data(UART_t *uartx)
+{
+    return (uartx->RDR);
+}
+
+/** 
+* @brief  写入UART发送数据
+* @param  uartx UART外设
+* @param  data_value 发送数据
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_tx_write_data(UART_t *uartx, uint32_t data_value)
+{
+    uartx->TDR = data_value;
+}
+
+/** 
+* @brief  写入UART 波特率分频寄存器
+* @param  uartx UART外设
+* @param  brr_value 波特率分频值范围: 0x10 ~ 0xFFFF
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_set_brr_value(UART_t *uartx, uint32_t brr_value)
+{
+    uartx->BRR = brr_value;
+}
+
+/** 
+* @brief  获取UART波特率分频配置
+* @param  uartx UART外设
+* @retval uint32_t UART波特率分频的配置值
+*/
+__STATIC_INLINE uint32_t std_uart_get_brr_value(UART_t *uartx)
+{
+    return (uartx->BRR);
+}
+
+void std_uart_init(UART_t *uartx,std_uart_init_t *UART_init_param);
+void std_uart_deinit(UART_t *uartx);
+void std_uart_struct_init(std_uart_init_t *UART_init_struct);
+
+/**
+* @}
+*/
+
+
+#ifdef __cplusplus
+}
+#endif
+
+/**
+* @} 
+*/  
+
+/**
+* @}
+*/
+
+#endif /* CIU32F003_STD_UART_H */

+ 664 - 0
CIU32F003_LIB/Include/ciu32f003_std_uart(2).h

@@ -0,0 +1,664 @@
+/************************************************************************************************/
+/**
+* @file               ciu32f003_std_uart.h
+* @author             MCU Ecosystem Development Team
+* @brief              UART STD库驱动头文件。
+*                     提供UART相关的STD库操作函数声明、数据类型以及常量的定义。                         
+*                     
+*
+**************************************************************************************************
+* @attention
+* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
+*
+**************************************************************************************************
+*/
+
+/* 避免头文件重复引用 */
+#ifndef CIU32F003_STD_UART_H
+#define CIU32F003_STD_UART_H
+
+/************************************************************************************************/
+/** 
+* @addtogroup CIU32F003_STD_Driver
+* @{
+*/
+
+/**
+* @defgroup UART UART
+* @brief 通用异步收发器的STD库驱动
+* @{
+*/
+/************************************************************************************************/
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/*------------------------------------includes--------------------------------------------------*/
+#include "ciu32f003_std_common.h"
+
+/*------------------------------------type define-----------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @defgroup UART_Types UART Types 
+* @brief  UART数据类型定义
+* @{
+*
+*/
+/************************************************************************************************/
+
+/**
+* @brief  UART初始化配置结构体定义
+*/
+typedef struct
+{
+    uint32_t direction;                                      /**< UART 传输模式(传输方向)
+                                                                      @arg UART_DIRECTION_SEND ...                     */
+    uint32_t baudrate;                                       /**< UART 波特率                                          */
+    
+    uint32_t wordlength;                                     /**< UART 数据帧字长
+                                                                      @arg UART_WORDLENGTH_8BITS ...                   */
+    uint32_t stopbits;                                       /**< UART 数据帧停止位长度
+                                                                      @arg UART_STOPBITS_1 ...                         */
+    uint32_t parity;                                         /**< UART 数据帧奇偶校验
+                                                                      @arg UART_PARITY_NONE ...                        */
+}std_uart_init_t;
+
+/**
+* @}
+*/
+
+/*--------------------------------------------define--------------------------------------------*/
+/************************************************************************************************/
+/**
+* @defgroup UART_Constants UART Constants
+* @brief    UART常量定义及宏定义
+* @{
+*
+*/
+/************************************************************************************************/
+
+/* UART 数据帧长度 */
+#define  UART_WORDLENGTH_8BITS                 UART_CR1_WL8BITS                     /**< 8-bits 字长 */
+#define  UART_WORDLENGTH_9BITS                 UART_CR1_WL9BITS                     /**< 9-bits 字长 */
+
+/* UART 数据帧奇偶校验 */
+#define  UART_PARITY_NONE                      (0x00000000U)                         /**< 无校验 */
+#define  UART_PARITY_EVEN                       UART_CR1_PEN                         /**< 偶校验 */
+#define  UART_PARITY_ODD                       (UART_CR1_PEN | UART_CR1_PTS)         /**< 奇校验 */
+
+/* UART传输模式 */
+#define  UART_DIRECTION_NONE                   (0x00000000U)                         /**< 未使能发送器和接收器          */
+#define  UART_DIRECTION_SEND                   UART_CR1_TE                           /**< 单接收模式(仅使能接收器)      */
+#define  UART_DIRECTION_RECEIVE                UART_CR1_RE                           /**< 单发送模式(仅使能发送器)      */
+#define  UART_DIRECTION_SEND_RECEIVE           (UART_CR1_TE |UART_CR1_RE)            /**< 发送/接收(使能发送器和接收器) */
+
+/* UART 数据帧大小端 */
+#define  UART_DATA_ORDER_LSBFIRST              (0x00000000U)                         /**< 低有效位优先 */
+#define  UART_DATA_ORDER_MSBFIRST              UART_CR2_MSBFIRST                     /**< 高有效位优先 */
+
+/* UART 数据帧停止位 */
+#define  UART_STOPBITS_1                       UART_CR2_STOPBIT_1                    /**< 1bit停止位    */
+#define  UART_STOPBITS_2                       UART_CR2_STOPBIT_2                    /**< 2bits停止位   */
+
+/* UART 数据帧采样策略 */
+#define  UART_SAMPLE_THREE_BIT                 (0x00000000U)                         /**< Three-bit采样,支持噪声检测 */
+#define  UART_SAMPLE_ONE_BIT                   UART_CR3_OBS                          /**< One-bit采样,不支持噪声检测 */
+
+/*UART中断使能位 */
+#define  UART_CR1_INTERRUPT_RXNE               UART_CR1_RXNEIE                       /**< UART 接收数据寄存器非空中断使能                   */
+#define  UART_CR1_INTERRUPT_TC                 UART_CR1_TCIE                         /**< UART 发送完成中断使能                             */
+#define  UART_CR1_INTERRUPT_TXE                UART_CR1_TXEIE                        /**< UART 发送数据寄存器空中断使能                     */
+#define  UART_CR1_INTERRUPT_PE                 UART_CR1_PEIE                         /**< UART 奇偶校验错误中断使能                         */
+
+/* UART中断标志清除位 */
+#define  UART_CLEAR_PE                         UART_ICR_PECF                         /**< 奇偶校验错误标志清除 */
+#define  UART_CLEAR_FE                         UART_ICR_FECF                         /**< 帧错误标志清除       */
+#define  UART_CLEAR_NOISE                      UART_ICR_NOISECF                      /**< 噪声错误标志清除     */
+#define  UART_CLEAR_ORE                        UART_ICR_ORECF                        /**< 接收溢出错误标志清除 */
+#define  UART_CLEAR_TC                         UART_ICR_TCCF                         /**< 发送完成标志清除     */
+
+/* UART 状态标志 */
+#define  UART_FLAG_RECEIVE_BUSY                UART_ISR_BUSY                         /**< UART 接收忙(接收管脚上有数据传输)          */
+#define  UART_FLAG_TXE                         UART_ISR_TXE                          /**< UART 发送数据寄存器空标志                  */
+#define  UART_FLAG_TC                          UART_ISR_TC                           /**< UART 发送完成标志                          */
+#define  UART_FLAG_RXNE                        UART_ISR_RXNE                         /**< UART 接收数据寄存器非空标志                */
+#define  UART_FLAG_ORE                         UART_ISR_ORE                          /**< UART 接收溢出错误标志                      */
+#define  UART_FLAG_NOISE                       UART_ISR_NOISE                        /**< UART 噪声错误标志                          */
+#define  UART_FLAG_FE                          UART_ISR_FE                           /**< UART 帧错误标志                            */
+#define  UART_FLAG_PE                          UART_ISR_PE                           /**< UART 奇偶校验错误标志                      */
+#define  UART_FLAG_ERR                         (UART_FLAG_ORE | UART_FLAG_NOISE \
+                                                              | UART_FLAG_FE)        /**< UART 错误标志(上溢错误、噪声错误、帧错误)*/       
+
+/**
+* @}
+*/
+
+/*-------------------------------------------functions------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @defgroup UART_External_Functions UART External Functions
+* @brief    UART对外函数
+* @{
+*
+*/
+/************************************************************************************************/
+
+/** 
+* @brief  使能UART
+* @param  uartx UART外设 
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_enable(UART_t *uartx)
+{
+    uartx->CR1 |= (UART_CR1_UE);    
+}
+
+/** 
+* @brief  禁止UART
+* @param  uartx UART外设
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_disable(UART_t *uartx)
+{
+    uartx->CR1 &= (~UART_CR1_UE);
+}
+
+/** 
+* @brief  设置UART字符长度
+* @param  uartx UART外设
+* @param  word_length UART 字符长度
+*             @arg UART_WORDLENGTH_8BITS
+*             @arg UART_WORDLENGTH_9BITS 
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_set_word_length(UART_t *uartx, uint32_t word_length)
+{
+    MODIFY_REG(uartx->CR1, UART_CR1_WL, word_length);
+}
+
+/** 
+* @brief  获取UART字符长度
+* @param  uartx UART外设
+* @retval uint32_t UART 字符长度
+*             @arg UART_WORDLENGTH_8BITS
+*             @arg UART_WORDLENGTH_9BITS 
+*/
+__STATIC_INLINE uint32_t std_uart_get_word_length(UART_t *uartx)
+{
+    return (uartx->CR1 & UART_CR1_WL);
+}
+
+/** 
+* @brief  设置UART奇偶校验
+* @param  uartx UART外设
+* @param  parity UART奇偶校验项
+*             @arg UART_PARITY_NONE
+*             @arg UART_PARITY_EVEN
+*             @arg UART_PARITY_ODD 
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_set_parity(UART_t *uartx,uint32_t parity)
+{
+    MODIFY_REG(uartx->CR1,(UART_CR1_PTS | UART_CR1_PEN), parity);
+} 
+
+/** 
+* @brief  获取UART奇偶校验
+* @param  uartx UART外设
+* @retval uint32_t UART奇偶校验项
+*             @arg UART_PARITY_NONE
+*             @arg UART_PARITY_EVEN
+*             @arg UART_PARITY_ODD 
+*/
+__STATIC_INLINE uint32_t std_uart_get_parity(UART_t *uartx )
+{
+    return(uartx->CR1 & (UART_CR1_PTS | UART_CR1_PEN));
+} 
+
+/** 
+* @brief  设置UART停止位
+* @param  uartx UART外设
+* @param  stopbits UART停止位位数 
+*             @arg UART_STOPBITS_1     
+*             @arg UART_STOPBITS_2    
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_set_stopbits(UART_t *uartx, uint32_t stopbits)
+{
+    MODIFY_REG(uartx->CR2, UART_CR2_STOPBIT, stopbits);
+}
+
+/** 
+* @brief  获取UART停止位
+* @param  uartx UART外设
+* @retval uint32_t UART停止位位数 
+*             @arg UART_STOPBITS_1    
+*             @arg UART_STOPBITS_2    
+*/
+__STATIC_INLINE uint32_t std_uart_get_stopbits(UART_t *uartx)
+{
+    return(uartx->CR2 & UART_CR2_STOPBIT);
+}
+
+/** 
+* @brief  设置UART字符大小端
+* @param  uartx UART外设
+* @param  data_order UART 字符帧格式大小端
+*             @arg UART_DATA_ORDER_LSBFIRST
+*             @arg UART_DATA_ORDER_MSBFIRST
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_set_data_order(UART_t *uartx, uint32_t data_order)
+{
+    MODIFY_REG(uartx->CR2, UART_CR2_MSBFIRST, data_order);
+}
+
+/** 
+* @brief  获取UART字符大小端
+* @param  uartx UART外设
+* @retval uint32_t UART 字符帧格式大小端
+*             @arg UART_DATA_ORDER_LSBFIRST
+*             @arg UART_DATA_ORDER_MSBFIRST
+*/
+__STATIC_INLINE uint32_t std_uart_get_data_order(UART_t *uartx)
+{
+    return(uartx->CR2 & UART_CR2_MSBFIRST);
+}
+
+/** 
+* @brief  设置UART采样策略
+* @param  uartx UART外设
+* @param  sample_method UART采样策略
+*             @arg UART_SAMPLE_THREE_BIT
+*             @arg UART_SAMPLE_ONE_BIT
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_set_sample_method(UART_t *uartx,uint32_t sample_method)
+{
+    MODIFY_REG(uartx->CR3,UART_CR3_OBS, sample_method);
+}
+
+/** 
+* @brief  获取UART采样策略
+* @param  uartx UART外设
+* @retval uint32_t UART采样策略
+*             @arg UART_SAMPLE_THREE_BIT
+*             @arg UART_SAMPLE_ONE_BIT
+*/
+__STATIC_INLINE uint32_t std_uart_get_sample_method(UART_t *uartx)
+{
+    return (uartx->CR3 & UART_CR3_OBS);
+}
+
+/** 
+* @brief  设置UART传输方向
+* @param  uartx UART外设
+* @param  direction UART传输方向
+*             @arg UART_DIRECTION_NONE
+*             @arg UART_DIRECTION_SEND                                                                                        
+*             @arg UART_DIRECTION_RECEIVE                                                      
+*             @arg UART_DIRECTION_SEND_RECEIVE                                                                                                               
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_set_transfer_direction(UART_t *uartx, uint32_t direction)
+{
+    MODIFY_REG(uartx->CR1, UART_CR1_TE|UART_CR1_RE, direction);
+}
+
+/** 
+* @brief  获取 UART 传输方向控制
+* @param  uartx UART外设
+* @retval uint32_t 传输方向
+*             @arg UART_DIRECTION_NONE  
+*             @arg UART_DIRECTION_SEND                                                                                        
+*             @arg UART_DIRECTION_RECEIVE                                                      
+*             @arg UART_DIRECTION_SEND_RECEIVE                                                                                                               
+*/
+__STATIC_INLINE uint32_t std_uart_get_transfer_direction(UART_t *uartx)
+{
+    return(uartx->CR1 & (UART_CR1_TE|UART_CR1_RE));
+}
+
+/** 
+* @brief  使能UART引脚交换
+* @param  uartx UART外设
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_pin_swap_enable(UART_t *uartx)
+{
+    uartx->CR2 |= (UART_CR2_SWAP);
+} 
+
+/** 
+* @brief  禁止UART引脚交换
+* @param  uartx UART外设
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_pin_swap_disable(UART_t *uartx)
+{
+    uartx->CR2 &= (~UART_CR2_SWAP);
+} 
+
+/** 
+* @brief  使能UART RX引脚电平反向
+* @param  uartx UART外设
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_rx_level_invert_enable(UART_t *uartx)
+{
+    uartx->CR2 |= (UART_CR2_RXIVC);
+} 
+
+/** 
+* @brief  禁止UART RX引脚电平反向
+* @param  uartx UART外设
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_rx_level_invert_disable(UART_t *uartx)
+{
+    uartx->CR2 &= (~UART_CR2_RXIVC);
+} 
+
+/** 
+* @brief  使能UART TX引脚电平反向
+* @param  uartx UART外设
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_tx_level_invert_enable(UART_t *uartx)
+{
+    uartx->CR2 |= (UART_CR2_TXIVC);
+} 
+
+/** 
+* @brief  禁止UART TX引脚电平反向
+* @param  uartx UART外设
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_tx_level_invert_disable(UART_t *uartx)
+{
+    uartx->CR2 &= (~UART_CR2_TXIVC);
+} 
+
+/** 
+* @brief  使能UART数据极性反向
+* @param  uartx UART外设
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_data_invert_enable(UART_t *uartx)
+{
+    uartx->CR2 |= (UART_CR2_DATAIVC);
+} 
+
+/** 
+* @brief  禁止UART数据极性反向
+* @param  uartx UART外设
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_data_invert_disable(UART_t *uartx)
+{
+    uartx->CR2 &= (~UART_CR2_DATAIVC);
+}
+
+/** 
+* @brief  使能UART单线半双工模式
+* @param  uartx UART外设
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_half_duplex_enable(UART_t *uartx)
+{
+    uartx->CR3 |= (UART_CR3_HDEN);
+} 
+
+/** 
+* @brief  禁止UART单线半双工模式
+* @param  uartx UART外设
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_half_duplex_disable(UART_t *uartx)
+{
+    uartx->CR3 &= (~UART_CR3_HDEN);
+}
+
+/** 
+* @brief  禁止UART上溢检测
+* @param  uartx UART外设
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_overrun_disable(UART_t *uartx)
+{
+    uartx->CR3 |= (UART_CR3_ORED);
+}
+
+/** 
+* @brief  使能UART上溢检测
+* @param  uartx UART外设
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_overrun_enable(UART_t *uartx)
+{
+    uartx->CR3 &= (~UART_CR3_ORED);
+}
+
+/** 
+* @brief  使能UART CR1寄存器中控制的中断
+* @param  uartx UART外设
+* @param  interrupt UART中断源选择     
+*             @arg UART_CR1_INTERRUPT_RXNE                             
+*             @arg UART_CR1_INTERRUPT_TC                    
+*             @arg UART_CR1_INTERRUPT_TXE                    
+*             @arg UART_CR1_INTERRUPT_PE                                     
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_cr1_interrupt_enable(UART_t *uartx, uint32_t interrupt)
+{
+    uartx->CR1 |= (interrupt);
+}
+
+/** 
+* @brief  禁止UART CR1寄存器中控制的中断
+* @param  uartx UART外设
+* @param  interrupt UART中断源选择
+*             @arg UART_CR1_INTERRUPT_RXNE                                 
+*             @arg UART_CR1_INTERRUPT_TC                    
+*             @arg UART_CR1_INTERRUPT_TXE                    
+*             @arg UART_CR1_INTERRUPT_PE                                     
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_cr1_interrupt_disable(UART_t *uartx, uint32_t interrupt)
+{
+    uartx->CR1 &= (~interrupt);
+}
+
+/** 
+* @brief  获取UART CR1寄存器中控制的中断使能
+* @param  uartx UART外设
+* @param  interrupt UART中断源选择
+*             @arg UART_CR1_INTERRUPT_RXNE                                
+*             @arg UART_CR1_INTERRUPT_TC                    
+*             @arg UART_CR1_INTERRUPT_TXE                    
+*             @arg UART_CR1_INTERRUPT_PE                                     
+* @retval uint32_t 返回选择的UART中断源使能状态
+*             @arg 非0:  表示选择中断源使能
+*             @arg 0:    表示选择中断源未使能
+*/
+__STATIC_INLINE uint32_t std_uart_get_cr1_interrupt_enable(UART_t *uartx, uint32_t interrupt)
+{
+    return (uartx->CR1 & interrupt);
+}
+
+/** 
+* @brief  使能UART CR3寄存器中控制的 ERR 中断
+* @param  uartx UART外设                                            
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_cr3_interrupt_err_enable(UART_t *uartx)
+{
+    uartx->CR3 |= (UART_CR3_EIE);
+}
+
+/** 
+* @brief  禁止UART CR3寄存器中控制的 ERR 中断
+* @param  uartx UART外设                                         
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_cr3_interrupt_err_disable(UART_t *uartx)
+{
+    uartx->CR3 &= (~UART_CR3_EIE);
+}
+
+/** 
+* @brief  获取UART CR3寄存器中中断ERR 中断
+* @param  uartx UART外设
+* @retval uint32_t 返回选择的UART中断源使能状态
+*             @arg 非0:  表示选择中断源EIE 使能
+*             @arg 0:    表示选择中断源EIE 未使能
+*/
+__STATIC_INLINE uint32_t std_uart_get_cr3_interrupt_err_enable(UART_t *uartx)
+{
+     return (uartx->CR3 & UART_CR3_EIE);
+}
+
+/** 
+* @brief  获取UART标志
+* @param  uartx UART外设
+* @param  flag UART标志
+*             @arg UART_FLAG_RECEIVE_BUSY     
+*             @arg UART_FLAG_TXE              
+*             @arg UART_FLAG_TC               
+*             @arg UART_FLAG_RXNE             
+*             @arg UART_FLAG_ORE
+*             @arg UART_FLAG_NOISE              
+*             @arg UART_FLAG_FE               
+*             @arg UART_FLAG_PE               
+* @retval uint32_t UART标志置起状态
+*             @arg 非0:  状态置起
+*             @arg 0:    状态未置起
+*/
+__STATIC_INLINE uint32_t std_uart_get_flag(UART_t *uartx,uint32_t flag)
+{
+    return (uartx->ISR & flag);
+}
+
+/** 
+* @brief  清除UART标志 
+* @param  uartx UART外设
+* @param  clear_flag UART标志信息
+*             @arg UART_CLEAR_PE     
+*             @arg UART_CLEAR_FE              
+*             @arg UART_CLEAR_NOISE               
+*             @arg UART_CLEAR_ORE             
+*             @arg UART_CLEAR_TC                           
+* @retval 无      
+*/
+__STATIC_INLINE void std_uart_clear_flag(UART_t *uartx, uint32_t clear_flag)
+{
+    uartx->ICR = (clear_flag);
+}
+
+/** 
+* @brief  使能UART接收器
+* @param  uartx UART外设
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_rx_enable(UART_t *uartx)
+{
+    uartx->CR1 |= (UART_CR1_RE);
+} 
+
+/** 
+* @brief  禁止UART接收器
+* @param  uartx UART外设
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_rx_disable(UART_t *uartx)
+{
+    uartx->CR1 &= (~UART_CR1_RE);
+} 
+
+/** 
+* @brief  使能UART发送器
+* @param  uartx UART外设
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_tx_enable(UART_t *uartx)
+{
+    uartx->CR1 |= (UART_CR1_TE);
+} 
+
+/** 
+* @brief  禁止UART发送器
+* @param  uartx UART外设
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_tx_disable(UART_t *uartx)
+{
+    uartx->CR1 &= (~UART_CR1_TE);
+} 
+
+/** 
+* @brief  获取UART接收数据
+* @param  uartx UART外设
+* @retval uint32_t UART接收到的数据
+*/
+__STATIC_INLINE uint32_t std_uart_rx_read_data(UART_t *uartx)
+{
+    return (uartx->RDR);
+}
+
+/** 
+* @brief  写入UART发送数据
+* @param  uartx UART外设
+* @param  data_value 发送数据
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_tx_write_data(UART_t *uartx, uint32_t data_value)
+{
+    uartx->TDR = data_value;
+}
+
+/** 
+* @brief  写入UART 波特率分频寄存器
+* @param  uartx UART外设
+* @param  brr_value 波特率分频值范围: 0x10 ~ 0xFFFF
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_set_brr_value(UART_t *uartx, uint32_t brr_value)
+{
+    uartx->BRR = brr_value;
+}
+
+/** 
+* @brief  获取UART波特率分频配置
+* @param  uartx UART外设
+* @retval uint32_t UART波特率分频的配置值
+*/
+__STATIC_INLINE uint32_t std_uart_get_brr_value(UART_t *uartx)
+{
+    return (uartx->BRR);
+}
+
+void std_uart_init(UART_t *uartx,std_uart_init_t *UART_init_param);
+void std_uart_deinit(UART_t *uartx);
+void std_uart_struct_init(std_uart_init_t *UART_init_struct);
+
+/**
+* @}
+*/
+
+
+#ifdef __cplusplus
+}
+#endif
+
+/**
+* @} 
+*/  
+
+/**
+* @}
+*/
+
+#endif /* CIU32F003_STD_UART_H */

+ 664 - 0
CIU32F003_LIB/Include/ciu32f003_std_uart(3).h

@@ -0,0 +1,664 @@
+/************************************************************************************************/
+/**
+* @file               ciu32f003_std_uart.h
+* @author             MCU Ecosystem Development Team
+* @brief              UART STD库驱动头文件。
+*                     提供UART相关的STD库操作函数声明、数据类型以及常量的定义。                         
+*                     
+*
+**************************************************************************************************
+* @attention
+* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
+*
+**************************************************************************************************
+*/
+
+/* 避免头文件重复引用 */
+#ifndef CIU32F003_STD_UART_H
+#define CIU32F003_STD_UART_H
+
+/************************************************************************************************/
+/** 
+* @addtogroup CIU32F003_STD_Driver
+* @{
+*/
+
+/**
+* @defgroup UART UART
+* @brief 通用异步收发器的STD库驱动
+* @{
+*/
+/************************************************************************************************/
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/*------------------------------------includes--------------------------------------------------*/
+#include "ciu32f003_std_common.h"
+
+/*------------------------------------type define-----------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @defgroup UART_Types UART Types 
+* @brief  UART数据类型定义
+* @{
+*
+*/
+/************************************************************************************************/
+
+/**
+* @brief  UART初始化配置结构体定义
+*/
+typedef struct
+{
+    uint32_t direction;                                      /**< UART 传输模式(传输方向)
+                                                                      @arg UART_DIRECTION_SEND ...                     */
+    uint32_t baudrate;                                       /**< UART 波特率                                          */
+    
+    uint32_t wordlength;                                     /**< UART 数据帧字长
+                                                                      @arg UART_WORDLENGTH_8BITS ...                   */
+    uint32_t stopbits;                                       /**< UART 数据帧停止位长度
+                                                                      @arg UART_STOPBITS_1 ...                         */
+    uint32_t parity;                                         /**< UART 数据帧奇偶校验
+                                                                      @arg UART_PARITY_NONE ...                        */
+}std_uart_init_t;
+
+/**
+* @}
+*/
+
+/*--------------------------------------------define--------------------------------------------*/
+/************************************************************************************************/
+/**
+* @defgroup UART_Constants UART Constants
+* @brief    UART常量定义及宏定义
+* @{
+*
+*/
+/************************************************************************************************/
+
+/* UART 数据帧长度 */
+#define  UART_WORDLENGTH_8BITS                 UART_CR1_WL8BITS                     /**< 8-bits 字长 */
+#define  UART_WORDLENGTH_9BITS                 UART_CR1_WL9BITS                     /**< 9-bits 字长 */
+
+/* UART 数据帧奇偶校验 */
+#define  UART_PARITY_NONE                      (0x00000000U)                         /**< 无校验 */
+#define  UART_PARITY_EVEN                       UART_CR1_PEN                         /**< 偶校验 */
+#define  UART_PARITY_ODD                       (UART_CR1_PEN | UART_CR1_PTS)         /**< 奇校验 */
+
+/* UART传输模式 */
+#define  UART_DIRECTION_NONE                   (0x00000000U)                         /**< 未使能发送器和接收器          */
+#define  UART_DIRECTION_SEND                   UART_CR1_TE                           /**< 单接收模式(仅使能接收器)      */
+#define  UART_DIRECTION_RECEIVE                UART_CR1_RE                           /**< 单发送模式(仅使能发送器)      */
+#define  UART_DIRECTION_SEND_RECEIVE           (UART_CR1_TE |UART_CR1_RE)            /**< 发送/接收(使能发送器和接收器) */
+
+/* UART 数据帧大小端 */
+#define  UART_DATA_ORDER_LSBFIRST              (0x00000000U)                         /**< 低有效位优先 */
+#define  UART_DATA_ORDER_MSBFIRST              UART_CR2_MSBFIRST                     /**< 高有效位优先 */
+
+/* UART 数据帧停止位 */
+#define  UART_STOPBITS_1                       UART_CR2_STOPBIT_1                    /**< 1bit停止位    */
+#define  UART_STOPBITS_2                       UART_CR2_STOPBIT_2                    /**< 2bits停止位   */
+
+/* UART 数据帧采样策略 */
+#define  UART_SAMPLE_THREE_BIT                 (0x00000000U)                         /**< Three-bit采样,支持噪声检测 */
+#define  UART_SAMPLE_ONE_BIT                   UART_CR3_OBS                          /**< One-bit采样,不支持噪声检测 */
+
+/*UART中断使能位 */
+#define  UART_CR1_INTERRUPT_RXNE               UART_CR1_RXNEIE                       /**< UART 接收数据寄存器非空中断使能                   */
+#define  UART_CR1_INTERRUPT_TC                 UART_CR1_TCIE                         /**< UART 发送完成中断使能                             */
+#define  UART_CR1_INTERRUPT_TXE                UART_CR1_TXEIE                        /**< UART 发送数据寄存器空中断使能                     */
+#define  UART_CR1_INTERRUPT_PE                 UART_CR1_PEIE                         /**< UART 奇偶校验错误中断使能                         */
+
+/* UART中断标志清除位 */
+#define  UART_CLEAR_PE                         UART_ICR_PECF                         /**< 奇偶校验错误标志清除 */
+#define  UART_CLEAR_FE                         UART_ICR_FECF                         /**< 帧错误标志清除       */
+#define  UART_CLEAR_NOISE                      UART_ICR_NOISECF                      /**< 噪声错误标志清除     */
+#define  UART_CLEAR_ORE                        UART_ICR_ORECF                        /**< 接收溢出错误标志清除 */
+#define  UART_CLEAR_TC                         UART_ICR_TCCF                         /**< 发送完成标志清除     */
+
+/* UART 状态标志 */
+#define  UART_FLAG_RECEIVE_BUSY                UART_ISR_BUSY                         /**< UART 接收忙(接收管脚上有数据传输)          */
+#define  UART_FLAG_TXE                         UART_ISR_TXE                          /**< UART 发送数据寄存器空标志                  */
+#define  UART_FLAG_TC                          UART_ISR_TC                           /**< UART 发送完成标志                          */
+#define  UART_FLAG_RXNE                        UART_ISR_RXNE                         /**< UART 接收数据寄存器非空标志                */
+#define  UART_FLAG_ORE                         UART_ISR_ORE                          /**< UART 接收溢出错误标志                      */
+#define  UART_FLAG_NOISE                       UART_ISR_NOISE                        /**< UART 噪声错误标志                          */
+#define  UART_FLAG_FE                          UART_ISR_FE                           /**< UART 帧错误标志                            */
+#define  UART_FLAG_PE                          UART_ISR_PE                           /**< UART 奇偶校验错误标志                      */
+#define  UART_FLAG_ERR                         (UART_FLAG_ORE | UART_FLAG_NOISE \
+                                                              | UART_FLAG_FE)        /**< UART 错误标志(上溢错误、噪声错误、帧错误)*/       
+
+/**
+* @}
+*/
+
+/*-------------------------------------------functions------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @defgroup UART_External_Functions UART External Functions
+* @brief    UART对外函数
+* @{
+*
+*/
+/************************************************************************************************/
+
+/** 
+* @brief  使能UART
+* @param  uartx UART外设 
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_enable(UART_t *uartx)
+{
+    uartx->CR1 |= (UART_CR1_UE);    
+}
+
+/** 
+* @brief  禁止UART
+* @param  uartx UART外设
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_disable(UART_t *uartx)
+{
+    uartx->CR1 &= (~UART_CR1_UE);
+}
+
+/** 
+* @brief  设置UART字符长度
+* @param  uartx UART外设
+* @param  word_length UART 字符长度
+*             @arg UART_WORDLENGTH_8BITS
+*             @arg UART_WORDLENGTH_9BITS 
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_set_word_length(UART_t *uartx, uint32_t word_length)
+{
+    MODIFY_REG(uartx->CR1, UART_CR1_WL, word_length);
+}
+
+/** 
+* @brief  获取UART字符长度
+* @param  uartx UART外设
+* @retval uint32_t UART 字符长度
+*             @arg UART_WORDLENGTH_8BITS
+*             @arg UART_WORDLENGTH_9BITS 
+*/
+__STATIC_INLINE uint32_t std_uart_get_word_length(UART_t *uartx)
+{
+    return (uartx->CR1 & UART_CR1_WL);
+}
+
+/** 
+* @brief  设置UART奇偶校验
+* @param  uartx UART外设
+* @param  parity UART奇偶校验项
+*             @arg UART_PARITY_NONE
+*             @arg UART_PARITY_EVEN
+*             @arg UART_PARITY_ODD 
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_set_parity(UART_t *uartx,uint32_t parity)
+{
+    MODIFY_REG(uartx->CR1,(UART_CR1_PTS | UART_CR1_PEN), parity);
+} 
+
+/** 
+* @brief  获取UART奇偶校验
+* @param  uartx UART外设
+* @retval uint32_t UART奇偶校验项
+*             @arg UART_PARITY_NONE
+*             @arg UART_PARITY_EVEN
+*             @arg UART_PARITY_ODD 
+*/
+__STATIC_INLINE uint32_t std_uart_get_parity(UART_t *uartx )
+{
+    return(uartx->CR1 & (UART_CR1_PTS | UART_CR1_PEN));
+} 
+
+/** 
+* @brief  设置UART停止位
+* @param  uartx UART外设
+* @param  stopbits UART停止位位数 
+*             @arg UART_STOPBITS_1     
+*             @arg UART_STOPBITS_2    
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_set_stopbits(UART_t *uartx, uint32_t stopbits)
+{
+    MODIFY_REG(uartx->CR2, UART_CR2_STOPBIT, stopbits);
+}
+
+/** 
+* @brief  获取UART停止位
+* @param  uartx UART外设
+* @retval uint32_t UART停止位位数 
+*             @arg UART_STOPBITS_1    
+*             @arg UART_STOPBITS_2    
+*/
+__STATIC_INLINE uint32_t std_uart_get_stopbits(UART_t *uartx)
+{
+    return(uartx->CR2 & UART_CR2_STOPBIT);
+}
+
+/** 
+* @brief  设置UART字符大小端
+* @param  uartx UART外设
+* @param  data_order UART 字符帧格式大小端
+*             @arg UART_DATA_ORDER_LSBFIRST
+*             @arg UART_DATA_ORDER_MSBFIRST
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_set_data_order(UART_t *uartx, uint32_t data_order)
+{
+    MODIFY_REG(uartx->CR2, UART_CR2_MSBFIRST, data_order);
+}
+
+/** 
+* @brief  获取UART字符大小端
+* @param  uartx UART外设
+* @retval uint32_t UART 字符帧格式大小端
+*             @arg UART_DATA_ORDER_LSBFIRST
+*             @arg UART_DATA_ORDER_MSBFIRST
+*/
+__STATIC_INLINE uint32_t std_uart_get_data_order(UART_t *uartx)
+{
+    return(uartx->CR2 & UART_CR2_MSBFIRST);
+}
+
+/** 
+* @brief  设置UART采样策略
+* @param  uartx UART外设
+* @param  sample_method UART采样策略
+*             @arg UART_SAMPLE_THREE_BIT
+*             @arg UART_SAMPLE_ONE_BIT
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_set_sample_method(UART_t *uartx,uint32_t sample_method)
+{
+    MODIFY_REG(uartx->CR3,UART_CR3_OBS, sample_method);
+}
+
+/** 
+* @brief  获取UART采样策略
+* @param  uartx UART外设
+* @retval uint32_t UART采样策略
+*             @arg UART_SAMPLE_THREE_BIT
+*             @arg UART_SAMPLE_ONE_BIT
+*/
+__STATIC_INLINE uint32_t std_uart_get_sample_method(UART_t *uartx)
+{
+    return (uartx->CR3 & UART_CR3_OBS);
+}
+
+/** 
+* @brief  设置UART传输方向
+* @param  uartx UART外设
+* @param  direction UART传输方向
+*             @arg UART_DIRECTION_NONE
+*             @arg UART_DIRECTION_SEND                                                                                        
+*             @arg UART_DIRECTION_RECEIVE                                                      
+*             @arg UART_DIRECTION_SEND_RECEIVE                                                                                                               
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_set_transfer_direction(UART_t *uartx, uint32_t direction)
+{
+    MODIFY_REG(uartx->CR1, UART_CR1_TE|UART_CR1_RE, direction);
+}
+
+/** 
+* @brief  获取 UART 传输方向控制
+* @param  uartx UART外设
+* @retval uint32_t 传输方向
+*             @arg UART_DIRECTION_NONE  
+*             @arg UART_DIRECTION_SEND                                                                                        
+*             @arg UART_DIRECTION_RECEIVE                                                      
+*             @arg UART_DIRECTION_SEND_RECEIVE                                                                                                               
+*/
+__STATIC_INLINE uint32_t std_uart_get_transfer_direction(UART_t *uartx)
+{
+    return(uartx->CR1 & (UART_CR1_TE|UART_CR1_RE));
+}
+
+/** 
+* @brief  使能UART引脚交换
+* @param  uartx UART外设
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_pin_swap_enable(UART_t *uartx)
+{
+    uartx->CR2 |= (UART_CR2_SWAP);
+} 
+
+/** 
+* @brief  禁止UART引脚交换
+* @param  uartx UART外设
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_pin_swap_disable(UART_t *uartx)
+{
+    uartx->CR2 &= (~UART_CR2_SWAP);
+} 
+
+/** 
+* @brief  使能UART RX引脚电平反向
+* @param  uartx UART外设
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_rx_level_invert_enable(UART_t *uartx)
+{
+    uartx->CR2 |= (UART_CR2_RXIVC);
+} 
+
+/** 
+* @brief  禁止UART RX引脚电平反向
+* @param  uartx UART外设
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_rx_level_invert_disable(UART_t *uartx)
+{
+    uartx->CR2 &= (~UART_CR2_RXIVC);
+} 
+
+/** 
+* @brief  使能UART TX引脚电平反向
+* @param  uartx UART外设
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_tx_level_invert_enable(UART_t *uartx)
+{
+    uartx->CR2 |= (UART_CR2_TXIVC);
+} 
+
+/** 
+* @brief  禁止UART TX引脚电平反向
+* @param  uartx UART外设
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_tx_level_invert_disable(UART_t *uartx)
+{
+    uartx->CR2 &= (~UART_CR2_TXIVC);
+} 
+
+/** 
+* @brief  使能UART数据极性反向
+* @param  uartx UART外设
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_data_invert_enable(UART_t *uartx)
+{
+    uartx->CR2 |= (UART_CR2_DATAIVC);
+} 
+
+/** 
+* @brief  禁止UART数据极性反向
+* @param  uartx UART外设
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_data_invert_disable(UART_t *uartx)
+{
+    uartx->CR2 &= (~UART_CR2_DATAIVC);
+}
+
+/** 
+* @brief  使能UART单线半双工模式
+* @param  uartx UART外设
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_half_duplex_enable(UART_t *uartx)
+{
+    uartx->CR3 |= (UART_CR3_HDEN);
+} 
+
+/** 
+* @brief  禁止UART单线半双工模式
+* @param  uartx UART外设
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_half_duplex_disable(UART_t *uartx)
+{
+    uartx->CR3 &= (~UART_CR3_HDEN);
+}
+
+/** 
+* @brief  禁止UART上溢检测
+* @param  uartx UART外设
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_overrun_disable(UART_t *uartx)
+{
+    uartx->CR3 |= (UART_CR3_ORED);
+}
+
+/** 
+* @brief  使能UART上溢检测
+* @param  uartx UART外设
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_overrun_enable(UART_t *uartx)
+{
+    uartx->CR3 &= (~UART_CR3_ORED);
+}
+
+/** 
+* @brief  使能UART CR1寄存器中控制的中断
+* @param  uartx UART外设
+* @param  interrupt UART中断源选择     
+*             @arg UART_CR1_INTERRUPT_RXNE                             
+*             @arg UART_CR1_INTERRUPT_TC                    
+*             @arg UART_CR1_INTERRUPT_TXE                    
+*             @arg UART_CR1_INTERRUPT_PE                                     
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_cr1_interrupt_enable(UART_t *uartx, uint32_t interrupt)
+{
+    uartx->CR1 |= (interrupt);
+}
+
+/** 
+* @brief  禁止UART CR1寄存器中控制的中断
+* @param  uartx UART外设
+* @param  interrupt UART中断源选择
+*             @arg UART_CR1_INTERRUPT_RXNE                                 
+*             @arg UART_CR1_INTERRUPT_TC                    
+*             @arg UART_CR1_INTERRUPT_TXE                    
+*             @arg UART_CR1_INTERRUPT_PE                                     
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_cr1_interrupt_disable(UART_t *uartx, uint32_t interrupt)
+{
+    uartx->CR1 &= (~interrupt);
+}
+
+/** 
+* @brief  获取UART CR1寄存器中控制的中断使能
+* @param  uartx UART外设
+* @param  interrupt UART中断源选择
+*             @arg UART_CR1_INTERRUPT_RXNE                                
+*             @arg UART_CR1_INTERRUPT_TC                    
+*             @arg UART_CR1_INTERRUPT_TXE                    
+*             @arg UART_CR1_INTERRUPT_PE                                     
+* @retval uint32_t 返回选择的UART中断源使能状态
+*             @arg 非0:  表示选择中断源使能
+*             @arg 0:    表示选择中断源未使能
+*/
+__STATIC_INLINE uint32_t std_uart_get_cr1_interrupt_enable(UART_t *uartx, uint32_t interrupt)
+{
+    return (uartx->CR1 & interrupt);
+}
+
+/** 
+* @brief  使能UART CR3寄存器中控制的 ERR 中断
+* @param  uartx UART外设                                            
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_cr3_interrupt_err_enable(UART_t *uartx)
+{
+    uartx->CR3 |= (UART_CR3_EIE);
+}
+
+/** 
+* @brief  禁止UART CR3寄存器中控制的 ERR 中断
+* @param  uartx UART外设                                         
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_cr3_interrupt_err_disable(UART_t *uartx)
+{
+    uartx->CR3 &= (~UART_CR3_EIE);
+}
+
+/** 
+* @brief  获取UART CR3寄存器中中断ERR 中断
+* @param  uartx UART外设
+* @retval uint32_t 返回选择的UART中断源使能状态
+*             @arg 非0:  表示选择中断源EIE 使能
+*             @arg 0:    表示选择中断源EIE 未使能
+*/
+__STATIC_INLINE uint32_t std_uart_get_cr3_interrupt_err_enable(UART_t *uartx)
+{
+     return (uartx->CR3 & UART_CR3_EIE);
+}
+
+/** 
+* @brief  获取UART标志
+* @param  uartx UART外设
+* @param  flag UART标志
+*             @arg UART_FLAG_RECEIVE_BUSY     
+*             @arg UART_FLAG_TXE              
+*             @arg UART_FLAG_TC               
+*             @arg UART_FLAG_RXNE             
+*             @arg UART_FLAG_ORE
+*             @arg UART_FLAG_NOISE              
+*             @arg UART_FLAG_FE               
+*             @arg UART_FLAG_PE               
+* @retval uint32_t UART标志置起状态
+*             @arg 非0:  状态置起
+*             @arg 0:    状态未置起
+*/
+__STATIC_INLINE uint32_t std_uart_get_flag(UART_t *uartx,uint32_t flag)
+{
+    return (uartx->ISR & flag);
+}
+
+/** 
+* @brief  清除UART标志 
+* @param  uartx UART外设
+* @param  clear_flag UART标志信息
+*             @arg UART_CLEAR_PE     
+*             @arg UART_CLEAR_FE              
+*             @arg UART_CLEAR_NOISE               
+*             @arg UART_CLEAR_ORE             
+*             @arg UART_CLEAR_TC                           
+* @retval 无      
+*/
+__STATIC_INLINE void std_uart_clear_flag(UART_t *uartx, uint32_t clear_flag)
+{
+    uartx->ICR = (clear_flag);
+}
+
+/** 
+* @brief  使能UART接收器
+* @param  uartx UART外设
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_rx_enable(UART_t *uartx)
+{
+    uartx->CR1 |= (UART_CR1_RE);
+} 
+
+/** 
+* @brief  禁止UART接收器
+* @param  uartx UART外设
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_rx_disable(UART_t *uartx)
+{
+    uartx->CR1 &= (~UART_CR1_RE);
+} 
+
+/** 
+* @brief  使能UART发送器
+* @param  uartx UART外设
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_tx_enable(UART_t *uartx)
+{
+    uartx->CR1 |= (UART_CR1_TE);
+} 
+
+/** 
+* @brief  禁止UART发送器
+* @param  uartx UART外设
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_tx_disable(UART_t *uartx)
+{
+    uartx->CR1 &= (~UART_CR1_TE);
+} 
+
+/** 
+* @brief  获取UART接收数据
+* @param  uartx UART外设
+* @retval uint32_t UART接收到的数据
+*/
+__STATIC_INLINE uint32_t std_uart_rx_read_data(UART_t *uartx)
+{
+    return (uartx->RDR);
+}
+
+/** 
+* @brief  写入UART发送数据
+* @param  uartx UART外设
+* @param  data_value 发送数据
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_tx_write_data(UART_t *uartx, uint32_t data_value)
+{
+    uartx->TDR = data_value;
+}
+
+/** 
+* @brief  写入UART 波特率分频寄存器
+* @param  uartx UART外设
+* @param  brr_value 波特率分频值范围: 0x10 ~ 0xFFFF
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_set_brr_value(UART_t *uartx, uint32_t brr_value)
+{
+    uartx->BRR = brr_value;
+}
+
+/** 
+* @brief  获取UART波特率分频配置
+* @param  uartx UART外设
+* @retval uint32_t UART波特率分频的配置值
+*/
+__STATIC_INLINE uint32_t std_uart_get_brr_value(UART_t *uartx)
+{
+    return (uartx->BRR);
+}
+
+void std_uart_init(UART_t *uartx,std_uart_init_t *UART_init_param);
+void std_uart_deinit(UART_t *uartx);
+void std_uart_struct_init(std_uart_init_t *UART_init_struct);
+
+/**
+* @}
+*/
+
+
+#ifdef __cplusplus
+}
+#endif
+
+/**
+* @} 
+*/  
+
+/**
+* @}
+*/
+
+#endif /* CIU32F003_STD_UART_H */

+ 664 - 0
CIU32F003_LIB/Include/ciu32f003_std_uart.h

@@ -0,0 +1,664 @@
+/************************************************************************************************/
+/**
+* @file               ciu32f003_std_uart.h
+* @author             MCU Ecosystem Development Team
+* @brief              UART STD库驱动头文件。
+*                     提供UART相关的STD库操作函数声明、数据类型以及常量的定义。                         
+*                     
+*
+**************************************************************************************************
+* @attention
+* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
+*
+**************************************************************************************************
+*/
+
+/* 避免头文件重复引用 */
+#ifndef CIU32F003_STD_UART_H
+#define CIU32F003_STD_UART_H
+
+/************************************************************************************************/
+/** 
+* @addtogroup CIU32F003_STD_Driver
+* @{
+*/
+
+/**
+* @defgroup UART UART
+* @brief 通用异步收发器的STD库驱动
+* @{
+*/
+/************************************************************************************************/
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/*------------------------------------includes--------------------------------------------------*/
+#include "ciu32f003_std_common.h"
+
+/*------------------------------------type define-----------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @defgroup UART_Types UART Types 
+* @brief  UART数据类型定义
+* @{
+*
+*/
+/************************************************************************************************/
+
+/**
+* @brief  UART初始化配置结构体定义
+*/
+typedef struct
+{
+    uint32_t direction;                                      /**< UART 传输模式(传输方向)
+                                                                      @arg UART_DIRECTION_SEND ...                     */
+    uint32_t baudrate;                                       /**< UART 波特率                                          */
+    
+    uint32_t wordlength;                                     /**< UART 数据帧字长
+                                                                      @arg UART_WORDLENGTH_8BITS ...                   */
+    uint32_t stopbits;                                       /**< UART 数据帧停止位长度
+                                                                      @arg UART_STOPBITS_1 ...                         */
+    uint32_t parity;                                         /**< UART 数据帧奇偶校验
+                                                                      @arg UART_PARITY_NONE ...                        */
+}std_uart_init_t;
+
+/**
+* @}
+*/
+
+/*--------------------------------------------define--------------------------------------------*/
+/************************************************************************************************/
+/**
+* @defgroup UART_Constants UART Constants
+* @brief    UART常量定义及宏定义
+* @{
+*
+*/
+/************************************************************************************************/
+
+/* UART 数据帧长度 */
+#define  UART_WORDLENGTH_8BITS                 UART_CR1_WL8BITS                     /**< 8-bits 字长 */
+#define  UART_WORDLENGTH_9BITS                 UART_CR1_WL9BITS                     /**< 9-bits 字长 */
+
+/* UART 数据帧奇偶校验 */
+#define  UART_PARITY_NONE                      (0x00000000U)                         /**< 无校验 */
+#define  UART_PARITY_EVEN                       UART_CR1_PEN                         /**< 偶校验 */
+#define  UART_PARITY_ODD                       (UART_CR1_PEN | UART_CR1_PTS)         /**< 奇校验 */
+
+/* UART传输模式 */
+#define  UART_DIRECTION_NONE                   (0x00000000U)                         /**< 未使能发送器和接收器          */
+#define  UART_DIRECTION_SEND                   UART_CR1_TE                           /**< 单接收模式(仅使能接收器)      */
+#define  UART_DIRECTION_RECEIVE                UART_CR1_RE                           /**< 单发送模式(仅使能发送器)      */
+#define  UART_DIRECTION_SEND_RECEIVE           (UART_CR1_TE |UART_CR1_RE)            /**< 发送/接收(使能发送器和接收器) */
+
+/* UART 数据帧大小端 */
+#define  UART_DATA_ORDER_LSBFIRST              (0x00000000U)                         /**< 低有效位优先 */
+#define  UART_DATA_ORDER_MSBFIRST              UART_CR2_MSBFIRST                     /**< 高有效位优先 */
+
+/* UART 数据帧停止位 */
+#define  UART_STOPBITS_1                       UART_CR2_STOPBIT_1                    /**< 1bit停止位    */
+#define  UART_STOPBITS_2                       UART_CR2_STOPBIT_2                    /**< 2bits停止位   */
+
+/* UART 数据帧采样策略 */
+#define  UART_SAMPLE_THREE_BIT                 (0x00000000U)                         /**< Three-bit采样,支持噪声检测 */
+#define  UART_SAMPLE_ONE_BIT                   UART_CR3_OBS                          /**< One-bit采样,不支持噪声检测 */
+
+/*UART中断使能位 */
+#define  UART_CR1_INTERRUPT_RXNE               UART_CR1_RXNEIE                       /**< UART 接收数据寄存器非空中断使能                   */
+#define  UART_CR1_INTERRUPT_TC                 UART_CR1_TCIE                         /**< UART 发送完成中断使能                             */
+#define  UART_CR1_INTERRUPT_TXE                UART_CR1_TXEIE                        /**< UART 发送数据寄存器空中断使能                     */
+#define  UART_CR1_INTERRUPT_PE                 UART_CR1_PEIE                         /**< UART 奇偶校验错误中断使能                         */
+
+/* UART中断标志清除位 */
+#define  UART_CLEAR_PE                         UART_ICR_PECF                         /**< 奇偶校验错误标志清除 */
+#define  UART_CLEAR_FE                         UART_ICR_FECF                         /**< 帧错误标志清除       */
+#define  UART_CLEAR_NOISE                      UART_ICR_NOISECF                      /**< 噪声错误标志清除     */
+#define  UART_CLEAR_ORE                        UART_ICR_ORECF                        /**< 接收溢出错误标志清除 */
+#define  UART_CLEAR_TC                         UART_ICR_TCCF                         /**< 发送完成标志清除     */
+
+/* UART 状态标志 */
+#define  UART_FLAG_RECEIVE_BUSY                UART_ISR_BUSY                         /**< UART 接收忙(接收管脚上有数据传输)          */
+#define  UART_FLAG_TXE                         UART_ISR_TXE                          /**< UART 发送数据寄存器空标志                  */
+#define  UART_FLAG_TC                          UART_ISR_TC                           /**< UART 发送完成标志                          */
+#define  UART_FLAG_RXNE                        UART_ISR_RXNE                         /**< UART 接收数据寄存器非空标志                */
+#define  UART_FLAG_ORE                         UART_ISR_ORE                          /**< UART 接收溢出错误标志                      */
+#define  UART_FLAG_NOISE                       UART_ISR_NOISE                        /**< UART 噪声错误标志                          */
+#define  UART_FLAG_FE                          UART_ISR_FE                           /**< UART 帧错误标志                            */
+#define  UART_FLAG_PE                          UART_ISR_PE                           /**< UART 奇偶校验错误标志                      */
+#define  UART_FLAG_ERR                         (UART_FLAG_ORE | UART_FLAG_NOISE \
+                                                              | UART_FLAG_FE)        /**< UART 错误标志(上溢错误、噪声错误、帧错误)*/       
+
+/**
+* @}
+*/
+
+/*-------------------------------------------functions------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @defgroup UART_External_Functions UART External Functions
+* @brief    UART对外函数
+* @{
+*
+*/
+/************************************************************************************************/
+
+/** 
+* @brief  使能UART
+* @param  uartx UART外设 
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_enable(UART_t *uartx)
+{
+    uartx->CR1 |= (UART_CR1_UE);    
+}
+
+/** 
+* @brief  禁止UART
+* @param  uartx UART外设
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_disable(UART_t *uartx)
+{
+    uartx->CR1 &= (~UART_CR1_UE);
+}
+
+/** 
+* @brief  设置UART字符长度
+* @param  uartx UART外设
+* @param  word_length UART 字符长度
+*             @arg UART_WORDLENGTH_8BITS
+*             @arg UART_WORDLENGTH_9BITS 
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_set_word_length(UART_t *uartx, uint32_t word_length)
+{
+    MODIFY_REG(uartx->CR1, UART_CR1_WL, word_length);
+}
+
+/** 
+* @brief  获取UART字符长度
+* @param  uartx UART外设
+* @retval uint32_t UART 字符长度
+*             @arg UART_WORDLENGTH_8BITS
+*             @arg UART_WORDLENGTH_9BITS 
+*/
+__STATIC_INLINE uint32_t std_uart_get_word_length(UART_t *uartx)
+{
+    return (uartx->CR1 & UART_CR1_WL);
+}
+
+/** 
+* @brief  设置UART奇偶校验
+* @param  uartx UART外设
+* @param  parity UART奇偶校验项
+*             @arg UART_PARITY_NONE
+*             @arg UART_PARITY_EVEN
+*             @arg UART_PARITY_ODD 
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_set_parity(UART_t *uartx,uint32_t parity)
+{
+    MODIFY_REG(uartx->CR1,(UART_CR1_PTS | UART_CR1_PEN), parity);
+} 
+
+/** 
+* @brief  获取UART奇偶校验
+* @param  uartx UART外设
+* @retval uint32_t UART奇偶校验项
+*             @arg UART_PARITY_NONE
+*             @arg UART_PARITY_EVEN
+*             @arg UART_PARITY_ODD 
+*/
+__STATIC_INLINE uint32_t std_uart_get_parity(UART_t *uartx )
+{
+    return(uartx->CR1 & (UART_CR1_PTS | UART_CR1_PEN));
+} 
+
+/** 
+* @brief  设置UART停止位
+* @param  uartx UART外设
+* @param  stopbits UART停止位位数 
+*             @arg UART_STOPBITS_1     
+*             @arg UART_STOPBITS_2    
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_set_stopbits(UART_t *uartx, uint32_t stopbits)
+{
+    MODIFY_REG(uartx->CR2, UART_CR2_STOPBIT, stopbits);
+}
+
+/** 
+* @brief  获取UART停止位
+* @param  uartx UART外设
+* @retval uint32_t UART停止位位数 
+*             @arg UART_STOPBITS_1    
+*             @arg UART_STOPBITS_2    
+*/
+__STATIC_INLINE uint32_t std_uart_get_stopbits(UART_t *uartx)
+{
+    return(uartx->CR2 & UART_CR2_STOPBIT);
+}
+
+/** 
+* @brief  设置UART字符大小端
+* @param  uartx UART外设
+* @param  data_order UART 字符帧格式大小端
+*             @arg UART_DATA_ORDER_LSBFIRST
+*             @arg UART_DATA_ORDER_MSBFIRST
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_set_data_order(UART_t *uartx, uint32_t data_order)
+{
+    MODIFY_REG(uartx->CR2, UART_CR2_MSBFIRST, data_order);
+}
+
+/** 
+* @brief  获取UART字符大小端
+* @param  uartx UART外设
+* @retval uint32_t UART 字符帧格式大小端
+*             @arg UART_DATA_ORDER_LSBFIRST
+*             @arg UART_DATA_ORDER_MSBFIRST
+*/
+__STATIC_INLINE uint32_t std_uart_get_data_order(UART_t *uartx)
+{
+    return(uartx->CR2 & UART_CR2_MSBFIRST);
+}
+
+/** 
+* @brief  设置UART采样策略
+* @param  uartx UART外设
+* @param  sample_method UART采样策略
+*             @arg UART_SAMPLE_THREE_BIT
+*             @arg UART_SAMPLE_ONE_BIT
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_set_sample_method(UART_t *uartx,uint32_t sample_method)
+{
+    MODIFY_REG(uartx->CR3,UART_CR3_OBS, sample_method);
+}
+
+/** 
+* @brief  获取UART采样策略
+* @param  uartx UART外设
+* @retval uint32_t UART采样策略
+*             @arg UART_SAMPLE_THREE_BIT
+*             @arg UART_SAMPLE_ONE_BIT
+*/
+__STATIC_INLINE uint32_t std_uart_get_sample_method(UART_t *uartx)
+{
+    return (uartx->CR3 & UART_CR3_OBS);
+}
+
+/** 
+* @brief  设置UART传输方向
+* @param  uartx UART外设
+* @param  direction UART传输方向
+*             @arg UART_DIRECTION_NONE
+*             @arg UART_DIRECTION_SEND                                                                                        
+*             @arg UART_DIRECTION_RECEIVE                                                      
+*             @arg UART_DIRECTION_SEND_RECEIVE                                                                                                               
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_set_transfer_direction(UART_t *uartx, uint32_t direction)
+{
+    MODIFY_REG(uartx->CR1, UART_CR1_TE|UART_CR1_RE, direction);
+}
+
+/** 
+* @brief  获取 UART 传输方向控制
+* @param  uartx UART外设
+* @retval uint32_t 传输方向
+*             @arg UART_DIRECTION_NONE  
+*             @arg UART_DIRECTION_SEND                                                                                        
+*             @arg UART_DIRECTION_RECEIVE                                                      
+*             @arg UART_DIRECTION_SEND_RECEIVE                                                                                                               
+*/
+__STATIC_INLINE uint32_t std_uart_get_transfer_direction(UART_t *uartx)
+{
+    return(uartx->CR1 & (UART_CR1_TE|UART_CR1_RE));
+}
+
+/** 
+* @brief  使能UART引脚交换
+* @param  uartx UART外设
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_pin_swap_enable(UART_t *uartx)
+{
+    uartx->CR2 |= (UART_CR2_SWAP);
+} 
+
+/** 
+* @brief  禁止UART引脚交换
+* @param  uartx UART外设
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_pin_swap_disable(UART_t *uartx)
+{
+    uartx->CR2 &= (~UART_CR2_SWAP);
+} 
+
+/** 
+* @brief  使能UART RX引脚电平反向
+* @param  uartx UART外设
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_rx_level_invert_enable(UART_t *uartx)
+{
+    uartx->CR2 |= (UART_CR2_RXIVC);
+} 
+
+/** 
+* @brief  禁止UART RX引脚电平反向
+* @param  uartx UART外设
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_rx_level_invert_disable(UART_t *uartx)
+{
+    uartx->CR2 &= (~UART_CR2_RXIVC);
+} 
+
+/** 
+* @brief  使能UART TX引脚电平反向
+* @param  uartx UART外设
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_tx_level_invert_enable(UART_t *uartx)
+{
+    uartx->CR2 |= (UART_CR2_TXIVC);
+} 
+
+/** 
+* @brief  禁止UART TX引脚电平反向
+* @param  uartx UART外设
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_tx_level_invert_disable(UART_t *uartx)
+{
+    uartx->CR2 &= (~UART_CR2_TXIVC);
+} 
+
+/** 
+* @brief  使能UART数据极性反向
+* @param  uartx UART外设
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_data_invert_enable(UART_t *uartx)
+{
+    uartx->CR2 |= (UART_CR2_DATAIVC);
+} 
+
+/** 
+* @brief  禁止UART数据极性反向
+* @param  uartx UART外设
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_data_invert_disable(UART_t *uartx)
+{
+    uartx->CR2 &= (~UART_CR2_DATAIVC);
+}
+
+/** 
+* @brief  使能UART单线半双工模式
+* @param  uartx UART外设
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_half_duplex_enable(UART_t *uartx)
+{
+    uartx->CR3 |= (UART_CR3_HDEN);
+} 
+
+/** 
+* @brief  禁止UART单线半双工模式
+* @param  uartx UART外设
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_half_duplex_disable(UART_t *uartx)
+{
+    uartx->CR3 &= (~UART_CR3_HDEN);
+}
+
+/** 
+* @brief  禁止UART上溢检测
+* @param  uartx UART外设
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_overrun_disable(UART_t *uartx)
+{
+    uartx->CR3 |= (UART_CR3_ORED);
+}
+
+/** 
+* @brief  使能UART上溢检测
+* @param  uartx UART外设
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_overrun_enable(UART_t *uartx)
+{
+    uartx->CR3 &= (~UART_CR3_ORED);
+}
+
+/** 
+* @brief  使能UART CR1寄存器中控制的中断
+* @param  uartx UART外设
+* @param  interrupt UART中断源选择     
+*             @arg UART_CR1_INTERRUPT_RXNE                             
+*             @arg UART_CR1_INTERRUPT_TC                    
+*             @arg UART_CR1_INTERRUPT_TXE                    
+*             @arg UART_CR1_INTERRUPT_PE                                     
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_cr1_interrupt_enable(UART_t *uartx, uint32_t interrupt)
+{
+    uartx->CR1 |= (interrupt);
+}
+
+/** 
+* @brief  禁止UART CR1寄存器中控制的中断
+* @param  uartx UART外设
+* @param  interrupt UART中断源选择
+*             @arg UART_CR1_INTERRUPT_RXNE                                 
+*             @arg UART_CR1_INTERRUPT_TC                    
+*             @arg UART_CR1_INTERRUPT_TXE                    
+*             @arg UART_CR1_INTERRUPT_PE                                     
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_cr1_interrupt_disable(UART_t *uartx, uint32_t interrupt)
+{
+    uartx->CR1 &= (~interrupt);
+}
+
+/** 
+* @brief  获取UART CR1寄存器中控制的中断使能
+* @param  uartx UART外设
+* @param  interrupt UART中断源选择
+*             @arg UART_CR1_INTERRUPT_RXNE                                
+*             @arg UART_CR1_INTERRUPT_TC                    
+*             @arg UART_CR1_INTERRUPT_TXE                    
+*             @arg UART_CR1_INTERRUPT_PE                                     
+* @retval uint32_t 返回选择的UART中断源使能状态
+*             @arg 非0:  表示选择中断源使能
+*             @arg 0:    表示选择中断源未使能
+*/
+__STATIC_INLINE uint32_t std_uart_get_cr1_interrupt_enable(UART_t *uartx, uint32_t interrupt)
+{
+    return (uartx->CR1 & interrupt);
+}
+
+/** 
+* @brief  使能UART CR3寄存器中控制的 ERR 中断
+* @param  uartx UART外设                                            
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_cr3_interrupt_err_enable(UART_t *uartx)
+{
+    uartx->CR3 |= (UART_CR3_EIE);
+}
+
+/** 
+* @brief  禁止UART CR3寄存器中控制的 ERR 中断
+* @param  uartx UART外设                                         
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_cr3_interrupt_err_disable(UART_t *uartx)
+{
+    uartx->CR3 &= (~UART_CR3_EIE);
+}
+
+/** 
+* @brief  获取UART CR3寄存器中中断ERR 中断
+* @param  uartx UART外设
+* @retval uint32_t 返回选择的UART中断源使能状态
+*             @arg 非0:  表示选择中断源EIE 使能
+*             @arg 0:    表示选择中断源EIE 未使能
+*/
+__STATIC_INLINE uint32_t std_uart_get_cr3_interrupt_err_enable(UART_t *uartx)
+{
+     return (uartx->CR3 & UART_CR3_EIE);
+}
+
+/** 
+* @brief  获取UART标志
+* @param  uartx UART外设
+* @param  flag UART标志
+*             @arg UART_FLAG_RECEIVE_BUSY     
+*             @arg UART_FLAG_TXE              
+*             @arg UART_FLAG_TC               
+*             @arg UART_FLAG_RXNE             
+*             @arg UART_FLAG_ORE
+*             @arg UART_FLAG_NOISE              
+*             @arg UART_FLAG_FE               
+*             @arg UART_FLAG_PE               
+* @retval uint32_t UART标志置起状态
+*             @arg 非0:  状态置起
+*             @arg 0:    状态未置起
+*/
+__STATIC_INLINE uint32_t std_uart_get_flag(UART_t *uartx,uint32_t flag)
+{
+    return (uartx->ISR & flag);
+}
+
+/** 
+* @brief  清除UART标志 
+* @param  uartx UART外设
+* @param  clear_flag UART标志信息
+*             @arg UART_CLEAR_PE     
+*             @arg UART_CLEAR_FE              
+*             @arg UART_CLEAR_NOISE               
+*             @arg UART_CLEAR_ORE             
+*             @arg UART_CLEAR_TC                           
+* @retval 无      
+*/
+__STATIC_INLINE void std_uart_clear_flag(UART_t *uartx, uint32_t clear_flag)
+{
+    uartx->ICR = (clear_flag);
+}
+
+/** 
+* @brief  使能UART接收器
+* @param  uartx UART外设
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_rx_enable(UART_t *uartx)
+{
+    uartx->CR1 |= (UART_CR1_RE);
+} 
+
+/** 
+* @brief  禁止UART接收器
+* @param  uartx UART外设
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_rx_disable(UART_t *uartx)
+{
+    uartx->CR1 &= (~UART_CR1_RE);
+} 
+
+/** 
+* @brief  使能UART发送器
+* @param  uartx UART外设
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_tx_enable(UART_t *uartx)
+{
+    uartx->CR1 |= (UART_CR1_TE);
+} 
+
+/** 
+* @brief  禁止UART发送器
+* @param  uartx UART外设
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_tx_disable(UART_t *uartx)
+{
+    uartx->CR1 &= (~UART_CR1_TE);
+} 
+
+/** 
+* @brief  获取UART接收数据
+* @param  uartx UART外设
+* @retval uint32_t UART接收到的数据
+*/
+__STATIC_INLINE uint32_t std_uart_rx_read_data(UART_t *uartx)
+{
+    return (uartx->RDR);
+}
+
+/** 
+* @brief  写入UART发送数据
+* @param  uartx UART外设
+* @param  data_value 发送数据
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_tx_write_data(UART_t *uartx, uint32_t data_value)
+{
+    uartx->TDR = data_value;
+}
+
+/** 
+* @brief  写入UART 波特率分频寄存器
+* @param  uartx UART外设
+* @param  brr_value 波特率分频值范围: 0x10 ~ 0xFFFF
+* @retval 无
+*/
+__STATIC_INLINE void std_uart_set_brr_value(UART_t *uartx, uint32_t brr_value)
+{
+    uartx->BRR = brr_value;
+}
+
+/** 
+* @brief  获取UART波特率分频配置
+* @param  uartx UART外设
+* @retval uint32_t UART波特率分频的配置值
+*/
+__STATIC_INLINE uint32_t std_uart_get_brr_value(UART_t *uartx)
+{
+    return (uartx->BRR);
+}
+
+void std_uart_init(UART_t *uartx,std_uart_init_t *UART_init_param);
+void std_uart_deinit(UART_t *uartx);
+void std_uart_struct_init(std_uart_init_t *UART_init_struct);
+
+/**
+* @}
+*/
+
+
+#ifdef __cplusplus
+}
+#endif
+
+/**
+* @} 
+*/  
+
+/**
+* @}
+*/
+
+#endif /* CIU32F003_STD_UART_H */

+ 140 - 0
CIU32F003_LIB/Source/ciu32f003_std(1).c

@@ -0,0 +1,140 @@
+/************************************************************************************************/
+/**
+* @file               ciu32f003_std.c
+* @author             MCU Ecosystem Development Team
+* @brief              STD库基础功能驱动。
+*                     实现STD库的计时等功能API。
+*
+*
+**************************************************************************************************
+* @attention
+* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
+*
+**************************************************************************************************
+*/
+
+/************************************************************************************************/
+/**
+* @addtogroup CIU32F003_STD_Driver
+* @{
+*/
+
+/**
+* @addtogroup STD 
+* @{
+*
+*/
+/************************************************************************************************/  
+
+/*------------------------------------------includes--------------------------------------------*/
+#include "ciu32f003_std.h"
+
+
+
+
+/*-------------------------------------------functions------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @addtogroup STD_External_Functions 
+* @{
+*
+*/
+/************************************************************************************************/
+
+/**
+* @brief  Systick初始化
+* @note   该函数为weak函数,用户可选择其他定时器重新定义实现该函数
+* @retval 无
+*/
+__weak void std_delay_init(void)
+{
+    SysTick->CTRL |= SysTick_CTRL_CLKSOURCE_Msk;
+    SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
+}
+
+/**
+* @brief  us级延时函数(阻塞模式)
+* @param  count 计数周期
+* @note   延时函数最大值受限于SysTick重载值寄存器的最大值0xFFFFFF(16777216)
+* @note   该函数为weak函数,用户可选择其他定时器重新定义实现该函数
+* @retval 无
+*/
+__weak void std_delayus(uint32_t count)
+{
+    count = STD_DELAY_US * count;
+    count = count > 16777216 ? 16777216 : count;
+    SysTick->LOAD = count - 1;
+    SysTick->VAL = 0;
+    while(!((SysTick->CTRL >> 16) & 0x1));
+}
+
+/**
+* @brief  ms级延时函数(阻塞模式)
+* @param  count 计数周期
+* @note   该函数为weak函数,用户可选择其他定时器重新定义实现该函数
+* @retval 无
+*/
+__weak void std_delayms(uint32_t count)
+{
+    while(count--)
+    {
+        std_delayus(1000);
+    }
+}
+
+/**
+* @brief  us级延时函数(非阻塞模式)
+* @param  count 计数周期
+* @note   延时函数最大值受限于SysTick重载值寄存器的最大值0xFFFFFF(16777216)
+* @note   该函数为weak函数,用户可选择其他定时器重新定义实现该函数
+* @retval 无
+*/
+__weak void std_delayus_start(uint32_t count)
+{
+    count = STD_DELAY_US * count;
+    count = count > 16777216 ? 16777216 : count;
+    SysTick->LOAD = count - 1;
+    SysTick->VAL = 0;
+}
+
+/**
+* @brief  ms级延时函数(非阻塞模式)
+* @param  count 计数周期
+* @note   延时函数最大值受限于SysTick重载值寄存器的最大值0xFFFFFF(16777216)
+* @note   该函数为weak函数,用户可选择其他定时器重新定义实现该函数
+* @retval 无
+*/
+__weak void std_delayms_start(uint32_t count)
+{
+    std_delayus_start(1000 * count);
+}
+
+
+/**
+* @brief  获取计数结束状态(非阻塞模式)
+* @note   该函数为weak函数,用户可选择其他定时器重新定义实现该函数
+* @note   该函数与std_delayus_start和std_delayms_start函数组合使用,用于判断计数结束状态
+* @retval bool 返回逻辑表达式的判断结果
+*             @arg true: 表示计数已结束
+*             @arg false:表示计数正在进行中
+*/
+__weak bool std_delay_end(void)
+{
+    return (((SysTick->CTRL >> 16) & 0x1) == 0x1);
+}
+
+
+
+/** 
+* @} 
+*/
+
+
+/** 
+* @} 
+*/
+
+/** 
+* @} 
+*/

+ 140 - 0
CIU32F003_LIB/Source/ciu32f003_std(2).c

@@ -0,0 +1,140 @@
+/************************************************************************************************/
+/**
+* @file               ciu32f003_std.c
+* @author             MCU Ecosystem Development Team
+* @brief              STD库基础功能驱动。
+*                     实现STD库的计时等功能API。
+*
+*
+**************************************************************************************************
+* @attention
+* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
+*
+**************************************************************************************************
+*/
+
+/************************************************************************************************/
+/**
+* @addtogroup CIU32F003_STD_Driver
+* @{
+*/
+
+/**
+* @addtogroup STD 
+* @{
+*
+*/
+/************************************************************************************************/  
+
+/*------------------------------------------includes--------------------------------------------*/
+#include "ciu32f003_std.h"
+
+
+
+
+/*-------------------------------------------functions------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @addtogroup STD_External_Functions 
+* @{
+*
+*/
+/************************************************************************************************/
+
+/**
+* @brief  Systick初始化
+* @note   该函数为weak函数,用户可选择其他定时器重新定义实现该函数
+* @retval 无
+*/
+__weak void std_delay_init(void)
+{
+    SysTick->CTRL |= SysTick_CTRL_CLKSOURCE_Msk;
+    SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
+}
+
+/**
+* @brief  us级延时函数(阻塞模式)
+* @param  count 计数周期
+* @note   延时函数最大值受限于SysTick重载值寄存器的最大值0xFFFFFF(16777216)
+* @note   该函数为weak函数,用户可选择其他定时器重新定义实现该函数
+* @retval 无
+*/
+__weak void std_delayus(uint32_t count)
+{
+    count = STD_DELAY_US * count;
+    count = count > 16777216 ? 16777216 : count;
+    SysTick->LOAD = count - 1;
+    SysTick->VAL = 0;
+    while(!((SysTick->CTRL >> 16) & 0x1));
+}
+
+/**
+* @brief  ms级延时函数(阻塞模式)
+* @param  count 计数周期
+* @note   该函数为weak函数,用户可选择其他定时器重新定义实现该函数
+* @retval 无
+*/
+__weak void std_delayms(uint32_t count)
+{
+    while(count--)
+    {
+        std_delayus(1000);
+    }
+}
+
+/**
+* @brief  us级延时函数(非阻塞模式)
+* @param  count 计数周期
+* @note   延时函数最大值受限于SysTick重载值寄存器的最大值0xFFFFFF(16777216)
+* @note   该函数为weak函数,用户可选择其他定时器重新定义实现该函数
+* @retval 无
+*/
+__weak void std_delayus_start(uint32_t count)
+{
+    count = STD_DELAY_US * count;
+    count = count > 16777216 ? 16777216 : count;
+    SysTick->LOAD = count - 1;
+    SysTick->VAL = 0;
+}
+
+/**
+* @brief  ms级延时函数(非阻塞模式)
+* @param  count 计数周期
+* @note   延时函数最大值受限于SysTick重载值寄存器的最大值0xFFFFFF(16777216)
+* @note   该函数为weak函数,用户可选择其他定时器重新定义实现该函数
+* @retval 无
+*/
+__weak void std_delayms_start(uint32_t count)
+{
+    std_delayus_start(1000 * count);
+}
+
+
+/**
+* @brief  获取计数结束状态(非阻塞模式)
+* @note   该函数为weak函数,用户可选择其他定时器重新定义实现该函数
+* @note   该函数与std_delayus_start和std_delayms_start函数组合使用,用于判断计数结束状态
+* @retval bool 返回逻辑表达式的判断结果
+*             @arg true: 表示计数已结束
+*             @arg false:表示计数正在进行中
+*/
+__weak bool std_delay_end(void)
+{
+    return (((SysTick->CTRL >> 16) & 0x1) == 0x1);
+}
+
+
+
+/** 
+* @} 
+*/
+
+
+/** 
+* @} 
+*/
+
+/** 
+* @} 
+*/

+ 140 - 0
CIU32F003_LIB/Source/ciu32f003_std(3).c

@@ -0,0 +1,140 @@
+/************************************************************************************************/
+/**
+* @file               ciu32f003_std.c
+* @author             MCU Ecosystem Development Team
+* @brief              STD库基础功能驱动。
+*                     实现STD库的计时等功能API。
+*
+*
+**************************************************************************************************
+* @attention
+* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
+*
+**************************************************************************************************
+*/
+
+/************************************************************************************************/
+/**
+* @addtogroup CIU32F003_STD_Driver
+* @{
+*/
+
+/**
+* @addtogroup STD 
+* @{
+*
+*/
+/************************************************************************************************/  
+
+/*------------------------------------------includes--------------------------------------------*/
+#include "ciu32f003_std.h"
+
+
+
+
+/*-------------------------------------------functions------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @addtogroup STD_External_Functions 
+* @{
+*
+*/
+/************************************************************************************************/
+
+/**
+* @brief  Systick初始化
+* @note   该函数为weak函数,用户可选择其他定时器重新定义实现该函数
+* @retval 无
+*/
+__weak void std_delay_init(void)
+{
+    SysTick->CTRL |= SysTick_CTRL_CLKSOURCE_Msk;
+    SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
+}
+
+/**
+* @brief  us级延时函数(阻塞模式)
+* @param  count 计数周期
+* @note   延时函数最大值受限于SysTick重载值寄存器的最大值0xFFFFFF(16777216)
+* @note   该函数为weak函数,用户可选择其他定时器重新定义实现该函数
+* @retval 无
+*/
+__weak void std_delayus(uint32_t count)
+{
+    count = STD_DELAY_US * count;
+    count = count > 16777216 ? 16777216 : count;
+    SysTick->LOAD = count - 1;
+    SysTick->VAL = 0;
+    while(!((SysTick->CTRL >> 16) & 0x1));
+}
+
+/**
+* @brief  ms级延时函数(阻塞模式)
+* @param  count 计数周期
+* @note   该函数为weak函数,用户可选择其他定时器重新定义实现该函数
+* @retval 无
+*/
+__weak void std_delayms(uint32_t count)
+{
+    while(count--)
+    {
+        std_delayus(1000);
+    }
+}
+
+/**
+* @brief  us级延时函数(非阻塞模式)
+* @param  count 计数周期
+* @note   延时函数最大值受限于SysTick重载值寄存器的最大值0xFFFFFF(16777216)
+* @note   该函数为weak函数,用户可选择其他定时器重新定义实现该函数
+* @retval 无
+*/
+__weak void std_delayus_start(uint32_t count)
+{
+    count = STD_DELAY_US * count;
+    count = count > 16777216 ? 16777216 : count;
+    SysTick->LOAD = count - 1;
+    SysTick->VAL = 0;
+}
+
+/**
+* @brief  ms级延时函数(非阻塞模式)
+* @param  count 计数周期
+* @note   延时函数最大值受限于SysTick重载值寄存器的最大值0xFFFFFF(16777216)
+* @note   该函数为weak函数,用户可选择其他定时器重新定义实现该函数
+* @retval 无
+*/
+__weak void std_delayms_start(uint32_t count)
+{
+    std_delayus_start(1000 * count);
+}
+
+
+/**
+* @brief  获取计数结束状态(非阻塞模式)
+* @note   该函数为weak函数,用户可选择其他定时器重新定义实现该函数
+* @note   该函数与std_delayus_start和std_delayms_start函数组合使用,用于判断计数结束状态
+* @retval bool 返回逻辑表达式的判断结果
+*             @arg true: 表示计数已结束
+*             @arg false:表示计数正在进行中
+*/
+__weak bool std_delay_end(void)
+{
+    return (((SysTick->CTRL >> 16) & 0x1) == 0x1);
+}
+
+
+
+/** 
+* @} 
+*/
+
+
+/** 
+* @} 
+*/
+
+/** 
+* @} 
+*/

+ 140 - 0
CIU32F003_LIB/Source/ciu32f003_std.c

@@ -0,0 +1,140 @@
+/************************************************************************************************/
+/**
+* @file               ciu32f003_std.c
+* @author             MCU Ecosystem Development Team
+* @brief              STD库基础功能驱动。
+*                     实现STD库的计时等功能API。
+*
+*
+**************************************************************************************************
+* @attention
+* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
+*
+**************************************************************************************************
+*/
+
+/************************************************************************************************/
+/**
+* @addtogroup CIU32F003_STD_Driver
+* @{
+*/
+
+/**
+* @addtogroup STD 
+* @{
+*
+*/
+/************************************************************************************************/  
+
+/*------------------------------------------includes--------------------------------------------*/
+#include "ciu32f003_std.h"
+
+
+
+
+/*-------------------------------------------functions------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @addtogroup STD_External_Functions 
+* @{
+*
+*/
+/************************************************************************************************/
+
+/**
+* @brief  Systick初始化
+* @note   该函数为weak函数,用户可选择其他定时器重新定义实现该函数
+* @retval 无
+*/
+__weak void std_delay_init(void)
+{
+    SysTick->CTRL |= SysTick_CTRL_CLKSOURCE_Msk;
+    SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
+}
+
+/**
+* @brief  us级延时函数(阻塞模式)
+* @param  count 计数周期
+* @note   延时函数最大值受限于SysTick重载值寄存器的最大值0xFFFFFF(16777216)
+* @note   该函数为weak函数,用户可选择其他定时器重新定义实现该函数
+* @retval 无
+*/
+__weak void std_delayus(uint32_t count)
+{
+    count = STD_DELAY_US * count;
+    count = count > 16777216 ? 16777216 : count;
+    SysTick->LOAD = count - 1;
+    SysTick->VAL = 0;
+    while(!((SysTick->CTRL >> 16) & 0x1));
+}
+
+/**
+* @brief  ms级延时函数(阻塞模式)
+* @param  count 计数周期
+* @note   该函数为weak函数,用户可选择其他定时器重新定义实现该函数
+* @retval 无
+*/
+__weak void std_delayms(uint32_t count)
+{
+    while(count--)
+    {
+        std_delayus(1000);
+    }
+}
+
+/**
+* @brief  us级延时函数(非阻塞模式)
+* @param  count 计数周期
+* @note   延时函数最大值受限于SysTick重载值寄存器的最大值0xFFFFFF(16777216)
+* @note   该函数为weak函数,用户可选择其他定时器重新定义实现该函数
+* @retval 无
+*/
+__weak void std_delayus_start(uint32_t count)
+{
+    count = STD_DELAY_US * count;
+    count = count > 16777216 ? 16777216 : count;
+    SysTick->LOAD = count - 1;
+    SysTick->VAL = 0;
+}
+
+/**
+* @brief  ms级延时函数(非阻塞模式)
+* @param  count 计数周期
+* @note   延时函数最大值受限于SysTick重载值寄存器的最大值0xFFFFFF(16777216)
+* @note   该函数为weak函数,用户可选择其他定时器重新定义实现该函数
+* @retval 无
+*/
+__weak void std_delayms_start(uint32_t count)
+{
+    std_delayus_start(1000 * count);
+}
+
+
+/**
+* @brief  获取计数结束状态(非阻塞模式)
+* @note   该函数为weak函数,用户可选择其他定时器重新定义实现该函数
+* @note   该函数与std_delayus_start和std_delayms_start函数组合使用,用于判断计数结束状态
+* @retval bool 返回逻辑表达式的判断结果
+*             @arg true: 表示计数已结束
+*             @arg false:表示计数正在进行中
+*/
+__weak bool std_delay_end(void)
+{
+    return (((SysTick->CTRL >> 16) & 0x1) == 0x1);
+}
+
+
+
+/** 
+* @} 
+*/
+
+
+/** 
+* @} 
+*/
+
+/** 
+* @} 
+*/

+ 69 - 0
CIU32F003_LIB/Source/ciu32f003_std_adc(1).c

@@ -0,0 +1,69 @@
+/************************************************************************************************/
+/**
+* @file               ciu32f003_std_adc.c
+* @author             MCU Ecosystem Development Team
+* @brief              ADC STD库驱动。
+*                     实现ADC初始化配置等功能API。
+*
+*
+**************************************************************************************************
+* @attention
+* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
+*
+**************************************************************************************************
+*/
+
+/************************************************************************************************/
+/**
+* @addtogroup CIU32F003_STD_Driver
+* @{
+*/
+
+/**
+* @addtogroup ADC 
+* @{
+*
+*/
+/************************************************************************************************/
+
+
+/*-------------------------------------------includes-------------------------------------------*/
+#include "ciu32f003_std.h"
+
+#ifdef STD_ADC_PERIPHERAL_USED
+
+/*-------------------------------------------functions------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @addtogroup ADC_External_Functions 
+* @{
+*
+*/
+/************************************************************************************************/
+
+/** 
+* @brief  ADC去初始化
+* @note   执行去初始化前应停止转换
+* @retval 无
+*/
+void std_adc_deinit(void)
+{
+    /* 复位ADC外设 */
+    std_rcc_apb2_reset(RCC_PERIPH_RESET_ADC);
+}
+
+
+/** 
+* @} 
+*/
+
+#endif /* STD_ADC_PERIPHERAL_USED */
+
+/** 
+* @} 
+*/
+
+/** 
+* @} 
+*/

+ 69 - 0
CIU32F003_LIB/Source/ciu32f003_std_adc(2).c

@@ -0,0 +1,69 @@
+/************************************************************************************************/
+/**
+* @file               ciu32f003_std_adc.c
+* @author             MCU Ecosystem Development Team
+* @brief              ADC STD库驱动。
+*                     实现ADC初始化配置等功能API。
+*
+*
+**************************************************************************************************
+* @attention
+* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
+*
+**************************************************************************************************
+*/
+
+/************************************************************************************************/
+/**
+* @addtogroup CIU32F003_STD_Driver
+* @{
+*/
+
+/**
+* @addtogroup ADC 
+* @{
+*
+*/
+/************************************************************************************************/
+
+
+/*-------------------------------------------includes-------------------------------------------*/
+#include "ciu32f003_std.h"
+
+#ifdef STD_ADC_PERIPHERAL_USED
+
+/*-------------------------------------------functions------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @addtogroup ADC_External_Functions 
+* @{
+*
+*/
+/************************************************************************************************/
+
+/** 
+* @brief  ADC去初始化
+* @note   执行去初始化前应停止转换
+* @retval 无
+*/
+void std_adc_deinit(void)
+{
+    /* 复位ADC外设 */
+    std_rcc_apb2_reset(RCC_PERIPH_RESET_ADC);
+}
+
+
+/** 
+* @} 
+*/
+
+#endif /* STD_ADC_PERIPHERAL_USED */
+
+/** 
+* @} 
+*/
+
+/** 
+* @} 
+*/

+ 69 - 0
CIU32F003_LIB/Source/ciu32f003_std_adc(3).c

@@ -0,0 +1,69 @@
+/************************************************************************************************/
+/**
+* @file               ciu32f003_std_adc.c
+* @author             MCU Ecosystem Development Team
+* @brief              ADC STD库驱动。
+*                     实现ADC初始化配置等功能API。
+*
+*
+**************************************************************************************************
+* @attention
+* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
+*
+**************************************************************************************************
+*/
+
+/************************************************************************************************/
+/**
+* @addtogroup CIU32F003_STD_Driver
+* @{
+*/
+
+/**
+* @addtogroup ADC 
+* @{
+*
+*/
+/************************************************************************************************/
+
+
+/*-------------------------------------------includes-------------------------------------------*/
+#include "ciu32f003_std.h"
+
+#ifdef STD_ADC_PERIPHERAL_USED
+
+/*-------------------------------------------functions------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @addtogroup ADC_External_Functions 
+* @{
+*
+*/
+/************************************************************************************************/
+
+/** 
+* @brief  ADC去初始化
+* @note   执行去初始化前应停止转换
+* @retval 无
+*/
+void std_adc_deinit(void)
+{
+    /* 复位ADC外设 */
+    std_rcc_apb2_reset(RCC_PERIPH_RESET_ADC);
+}
+
+
+/** 
+* @} 
+*/
+
+#endif /* STD_ADC_PERIPHERAL_USED */
+
+/** 
+* @} 
+*/
+
+/** 
+* @} 
+*/

+ 69 - 0
CIU32F003_LIB/Source/ciu32f003_std_adc.c

@@ -0,0 +1,69 @@
+/************************************************************************************************/
+/**
+* @file               ciu32f003_std_adc.c
+* @author             MCU Ecosystem Development Team
+* @brief              ADC STD库驱动。
+*                     实现ADC初始化配置等功能API。
+*
+*
+**************************************************************************************************
+* @attention
+* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
+*
+**************************************************************************************************
+*/
+
+/************************************************************************************************/
+/**
+* @addtogroup CIU32F003_STD_Driver
+* @{
+*/
+
+/**
+* @addtogroup ADC 
+* @{
+*
+*/
+/************************************************************************************************/
+
+
+/*-------------------------------------------includes-------------------------------------------*/
+#include "ciu32f003_std.h"
+
+#ifdef STD_ADC_PERIPHERAL_USED
+
+/*-------------------------------------------functions------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @addtogroup ADC_External_Functions 
+* @{
+*
+*/
+/************************************************************************************************/
+
+/** 
+* @brief  ADC去初始化
+* @note   执行去初始化前应停止转换
+* @retval 无
+*/
+void std_adc_deinit(void)
+{
+    /* 复位ADC外设 */
+    std_rcc_apb2_reset(RCC_PERIPH_RESET_ADC);
+}
+
+
+/** 
+* @} 
+*/
+
+#endif /* STD_ADC_PERIPHERAL_USED */
+
+/** 
+* @} 
+*/
+
+/** 
+* @} 
+*/

+ 72 - 0
CIU32F003_LIB/Source/ciu32f003_std_comp(1).c

@@ -0,0 +1,72 @@
+/************************************************************************************************/
+/**
+* @file               ciu32f003_std_comp.c
+* @author             MCU Ecosystem Development Team
+* @brief              COMP STD库驱动。
+*                     实现COMP初始化配置等功能API。
+*
+*
+**************************************************************************************************
+* @attention
+* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
+*
+**************************************************************************************************
+*/
+
+/************************************************************************************************/
+/**
+* @addtogroup CIU32F003_STD_Driver
+* @{
+*/
+
+/**
+* @addtogroup COMP 
+* @{
+*
+*/
+/************************************************************************************************/
+
+/*------------------------------------------includes--------------------------------------------*/
+#include "ciu32f003_std.h"
+
+#ifdef STD_COMP_PERIPHERAL_USED
+/*------------------------------------------functions-------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @addtogroup COMP_External_Functions 
+* @{
+*
+*/
+/************************************************************************************************/
+/** 
+* @brief  COMP去初始化
+* @param  compx COMP外设
+* @retval 无
+*/
+void std_comp_deinit(COMP_t *compx)
+{
+    /* 复位COMP外设 */
+    compx->CSR = 0x00000000U;
+    
+    /*当COMP1和COMP2都复位时,复位CR寄存器*/
+    if((COMP1->CSR == 0) && (COMP2->CSR == 0))
+    {
+        COMP_COMMON->CR = 0x00000000U;
+    }
+    
+}
+
+/** 
+* @} 
+*/
+
+#endif /* STD_COMP_PERIPHERAL_USED */
+
+/** 
+* @} 
+*/
+
+/** 
+* @} 
+*/

+ 72 - 0
CIU32F003_LIB/Source/ciu32f003_std_comp(2).c

@@ -0,0 +1,72 @@
+/************************************************************************************************/
+/**
+* @file               ciu32f003_std_comp.c
+* @author             MCU Ecosystem Development Team
+* @brief              COMP STD库驱动。
+*                     实现COMP初始化配置等功能API。
+*
+*
+**************************************************************************************************
+* @attention
+* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
+*
+**************************************************************************************************
+*/
+
+/************************************************************************************************/
+/**
+* @addtogroup CIU32F003_STD_Driver
+* @{
+*/
+
+/**
+* @addtogroup COMP 
+* @{
+*
+*/
+/************************************************************************************************/
+
+/*------------------------------------------includes--------------------------------------------*/
+#include "ciu32f003_std.h"
+
+#ifdef STD_COMP_PERIPHERAL_USED
+/*------------------------------------------functions-------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @addtogroup COMP_External_Functions 
+* @{
+*
+*/
+/************************************************************************************************/
+/** 
+* @brief  COMP去初始化
+* @param  compx COMP外设
+* @retval 无
+*/
+void std_comp_deinit(COMP_t *compx)
+{
+    /* 复位COMP外设 */
+    compx->CSR = 0x00000000U;
+    
+    /*当COMP1和COMP2都复位时,复位CR寄存器*/
+    if((COMP1->CSR == 0) && (COMP2->CSR == 0))
+    {
+        COMP_COMMON->CR = 0x00000000U;
+    }
+    
+}
+
+/** 
+* @} 
+*/
+
+#endif /* STD_COMP_PERIPHERAL_USED */
+
+/** 
+* @} 
+*/
+
+/** 
+* @} 
+*/

+ 72 - 0
CIU32F003_LIB/Source/ciu32f003_std_comp(3).c

@@ -0,0 +1,72 @@
+/************************************************************************************************/
+/**
+* @file               ciu32f003_std_comp.c
+* @author             MCU Ecosystem Development Team
+* @brief              COMP STD库驱动。
+*                     实现COMP初始化配置等功能API。
+*
+*
+**************************************************************************************************
+* @attention
+* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
+*
+**************************************************************************************************
+*/
+
+/************************************************************************************************/
+/**
+* @addtogroup CIU32F003_STD_Driver
+* @{
+*/
+
+/**
+* @addtogroup COMP 
+* @{
+*
+*/
+/************************************************************************************************/
+
+/*------------------------------------------includes--------------------------------------------*/
+#include "ciu32f003_std.h"
+
+#ifdef STD_COMP_PERIPHERAL_USED
+/*------------------------------------------functions-------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @addtogroup COMP_External_Functions 
+* @{
+*
+*/
+/************************************************************************************************/
+/** 
+* @brief  COMP去初始化
+* @param  compx COMP外设
+* @retval 无
+*/
+void std_comp_deinit(COMP_t *compx)
+{
+    /* 复位COMP外设 */
+    compx->CSR = 0x00000000U;
+    
+    /*当COMP1和COMP2都复位时,复位CR寄存器*/
+    if((COMP1->CSR == 0) && (COMP2->CSR == 0))
+    {
+        COMP_COMMON->CR = 0x00000000U;
+    }
+    
+}
+
+/** 
+* @} 
+*/
+
+#endif /* STD_COMP_PERIPHERAL_USED */
+
+/** 
+* @} 
+*/
+
+/** 
+* @} 
+*/

+ 72 - 0
CIU32F003_LIB/Source/ciu32f003_std_comp.c

@@ -0,0 +1,72 @@
+/************************************************************************************************/
+/**
+* @file               ciu32f003_std_comp.c
+* @author             MCU Ecosystem Development Team
+* @brief              COMP STD库驱动。
+*                     实现COMP初始化配置等功能API。
+*
+*
+**************************************************************************************************
+* @attention
+* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
+*
+**************************************************************************************************
+*/
+
+/************************************************************************************************/
+/**
+* @addtogroup CIU32F003_STD_Driver
+* @{
+*/
+
+/**
+* @addtogroup COMP 
+* @{
+*
+*/
+/************************************************************************************************/
+
+/*------------------------------------------includes--------------------------------------------*/
+#include "ciu32f003_std.h"
+
+#ifdef STD_COMP_PERIPHERAL_USED
+/*------------------------------------------functions-------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @addtogroup COMP_External_Functions 
+* @{
+*
+*/
+/************************************************************************************************/
+/** 
+* @brief  COMP去初始化
+* @param  compx COMP外设
+* @retval 无
+*/
+void std_comp_deinit(COMP_t *compx)
+{
+    /* 复位COMP外设 */
+    compx->CSR = 0x00000000U;
+    
+    /*当COMP1和COMP2都复位时,复位CR寄存器*/
+    if((COMP1->CSR == 0) && (COMP2->CSR == 0))
+    {
+        COMP_COMMON->CR = 0x00000000U;
+    }
+    
+}
+
+/** 
+* @} 
+*/
+
+#endif /* STD_COMP_PERIPHERAL_USED */
+
+/** 
+* @} 
+*/
+
+/** 
+* @} 
+*/

+ 95 - 0
CIU32F003_LIB/Source/ciu32f003_std_crc(1).c

@@ -0,0 +1,95 @@
+/************************************************************************************************/
+/**
+* @file               ciu32f003_std_crc.c
+* @author             MCU Ecosystem Development Team
+* @brief              CRC STD库驱动。
+*                     实现CRC初始化配置等功能API。
+*                           
+*
+**************************************************************************************************
+* @attention
+* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
+*
+**************************************************************************************************
+*/
+
+/************************************************************************************************/
+/**
+* @addtogroup CIU32F003_STD_Driver
+* @{
+*/
+
+/**
+* @addtogroup CRC
+* @{
+*
+*/
+/************************************************************************************************/
+
+
+/*------------------------------------------includes--------------------------------------------*/
+#include "ciu32f003_std.h"
+
+#ifdef STD_CRC_PERIPHERAL_USED
+
+/*-------------------------------------------functions------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @addtogroup CRC_External_Functions 
+* @{
+*
+*/
+/************************************************************************************************/
+/**
+* @brief  CRC去初始化
+* @retval 无
+*/
+void std_crc_deinit(void)
+{
+    /* 复位CRC */
+    std_rcc_ahb_reset(RCC_PERIPH_RESET_CRC); 
+}
+
+
+/**
+* @brief  将CRC初始值反转后写入寄存器
+* @param  poly_sel   多项式选择
+* @param  init_value 自定义初始值
+* @retval 无
+*/
+void std_crc_set_init_value_invert(uint32_t poly_sel, uint32_t init_value)
+{
+    uint32_t index, temp; 
+    uint32_t result = 0;
+    
+    /* 初始值按位翻转 */
+    for (index = 0U; index < 4; index++)
+    {
+        temp = (init_value >> (8U * index));
+        temp = (((temp & 0x55) << 1) | ((temp & 0xaa) >> 1));
+        temp = (((temp & 0x33) << 2) | ((temp & 0xcc) >> 2));
+        temp = (((temp & 0x0f) << 4) | ((temp & 0xf0) >> 4));
+        result |= (temp << (8U * (3 - index)));
+    }
+
+    if (poly_sel == CRC_POLY_16) 
+    {
+        result >>= 16;
+    }
+    CRC->RDR = result;
+}
+
+/**
+* @}
+*/
+
+#endif /* STD_CRC_PERIPHERAL_USED */
+
+/** 
+* @} 
+*/
+
+/** 
+* @} 
+*/

+ 95 - 0
CIU32F003_LIB/Source/ciu32f003_std_crc(2).c

@@ -0,0 +1,95 @@
+/************************************************************************************************/
+/**
+* @file               ciu32f003_std_crc.c
+* @author             MCU Ecosystem Development Team
+* @brief              CRC STD库驱动。
+*                     实现CRC初始化配置等功能API。
+*                           
+*
+**************************************************************************************************
+* @attention
+* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
+*
+**************************************************************************************************
+*/
+
+/************************************************************************************************/
+/**
+* @addtogroup CIU32F003_STD_Driver
+* @{
+*/
+
+/**
+* @addtogroup CRC
+* @{
+*
+*/
+/************************************************************************************************/
+
+
+/*------------------------------------------includes--------------------------------------------*/
+#include "ciu32f003_std.h"
+
+#ifdef STD_CRC_PERIPHERAL_USED
+
+/*-------------------------------------------functions------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @addtogroup CRC_External_Functions 
+* @{
+*
+*/
+/************************************************************************************************/
+/**
+* @brief  CRC去初始化
+* @retval 无
+*/
+void std_crc_deinit(void)
+{
+    /* 复位CRC */
+    std_rcc_ahb_reset(RCC_PERIPH_RESET_CRC); 
+}
+
+
+/**
+* @brief  将CRC初始值反转后写入寄存器
+* @param  poly_sel   多项式选择
+* @param  init_value 自定义初始值
+* @retval 无
+*/
+void std_crc_set_init_value_invert(uint32_t poly_sel, uint32_t init_value)
+{
+    uint32_t index, temp; 
+    uint32_t result = 0;
+    
+    /* 初始值按位翻转 */
+    for (index = 0U; index < 4; index++)
+    {
+        temp = (init_value >> (8U * index));
+        temp = (((temp & 0x55) << 1) | ((temp & 0xaa) >> 1));
+        temp = (((temp & 0x33) << 2) | ((temp & 0xcc) >> 2));
+        temp = (((temp & 0x0f) << 4) | ((temp & 0xf0) >> 4));
+        result |= (temp << (8U * (3 - index)));
+    }
+
+    if (poly_sel == CRC_POLY_16) 
+    {
+        result >>= 16;
+    }
+    CRC->RDR = result;
+}
+
+/**
+* @}
+*/
+
+#endif /* STD_CRC_PERIPHERAL_USED */
+
+/** 
+* @} 
+*/
+
+/** 
+* @} 
+*/

+ 95 - 0
CIU32F003_LIB/Source/ciu32f003_std_crc(3).c

@@ -0,0 +1,95 @@
+/************************************************************************************************/
+/**
+* @file               ciu32f003_std_crc.c
+* @author             MCU Ecosystem Development Team
+* @brief              CRC STD库驱动。
+*                     实现CRC初始化配置等功能API。
+*                           
+*
+**************************************************************************************************
+* @attention
+* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
+*
+**************************************************************************************************
+*/
+
+/************************************************************************************************/
+/**
+* @addtogroup CIU32F003_STD_Driver
+* @{
+*/
+
+/**
+* @addtogroup CRC
+* @{
+*
+*/
+/************************************************************************************************/
+
+
+/*------------------------------------------includes--------------------------------------------*/
+#include "ciu32f003_std.h"
+
+#ifdef STD_CRC_PERIPHERAL_USED
+
+/*-------------------------------------------functions------------------------------------------*/
+
+/************************************************************************************************/
+/**
+* @addtogroup CRC_External_Functions 
+* @{
+*
+*/
+/************************************************************************************************/
+/**
+* @brief  CRC去初始化
+* @retval 无
+*/
+void std_crc_deinit(void)
+{
+    /* 复位CRC */
+    std_rcc_ahb_reset(RCC_PERIPH_RESET_CRC); 
+}
+
+
+/**
+* @brief  将CRC初始值反转后写入寄存器
+* @param  poly_sel   多项式选择
+* @param  init_value 自定义初始值
+* @retval 无
+*/
+void std_crc_set_init_value_invert(uint32_t poly_sel, uint32_t init_value)
+{
+    uint32_t index, temp; 
+    uint32_t result = 0;
+    
+    /* 初始值按位翻转 */
+    for (index = 0U; index < 4; index++)
+    {
+        temp = (init_value >> (8U * index));
+        temp = (((temp & 0x55) << 1) | ((temp & 0xaa) >> 1));
+        temp = (((temp & 0x33) << 2) | ((temp & 0xcc) >> 2));
+        temp = (((temp & 0x0f) << 4) | ((temp & 0xf0) >> 4));
+        result |= (temp << (8U * (3 - index)));
+    }
+
+    if (poly_sel == CRC_POLY_16) 
+    {
+        result >>= 16;
+    }
+    CRC->RDR = result;
+}
+
+/**
+* @}
+*/
+
+#endif /* STD_CRC_PERIPHERAL_USED */
+
+/** 
+* @} 
+*/
+
+/** 
+* @} 
+*/

Some files were not shown because too many files changed in this diff