Browse Source

新增新版底层驱动模板

阿衰0110 1 year ago
parent
commit
93ed7bde74

+ 34 - 51
README.md

@@ -12,54 +12,37 @@ module_Template:模块模板
 
 project_Template:工程模板
 
-system_Template:外设模板
-
-单片机裸机项目开发模板(学习为主):[mcu_development_module: 单片机开发模块,内含消息队列,类线程间同步方法(信号量、互斥锁、事件集),软件定时器,非阻塞延时,数据转换等。 (gitee.com)](https://gitee.com/woshiashuai/mcu_development_module)
-
-模块模板有以下内容:
-
-1. ADXL345三轴传感器
-2. ASR_CI1122语音识别
-3. BY9301语音播报模块
-4. DHT11温湿度模块
-5. DS18B20温度传感器
-6. DS1302时钟模块
-7. FIFO缓冲区1
-8. FIFO缓冲区2
-9. MEMS数字气体传感器(单个)
-10. MEMS数字气体传感器(多个)
-11. MLX90614红外测温
-12. MPU6050三轴传感器
-13. MultiButton按键驱动
-14. OLED屏幕0.96
-15. OneNET
-16. PM2.5检测模块
-17. RC522-RFID模块
-18. SG90舵机
-19. SIM900A短信模块
-20. SR04超声波
-21. USART&TIM
-22. WIFIGetAPI
-23. 单向链表
-25. 智能健康检测模块
-25. 读AB相霍尔编码
-26. HX711称重模块
-
-外设模板有以下内容:
-
-1. ADC.c.h
-2. CAN.c.h
-3. DELAY.c.h
-4. EXTI.c.h
-5. FLASH.c.h
-6. GPIO.c.h
-7. IIC.c.h
-8. IICs.c.h
-9. NVIC.c.h
-10. Pvd.c.h
-11. RCC.c.h
-12. SPI.c.h
-13. TIM.c.h
-14. USART.c.h
-15. WDOG.c.h
-16. PWM.c.h
+system_Template:旧版底层驱动模板
+
+**system_driver_new:新版底层驱动模板**
+
+单片机可复用、可通用组件(学习为主):[mcu_reuse_development_module: 单片机可复用、可通用开发组件,内含:xymodem,bootloader,MODBUS主从机管理(支持RTU和ASCII),内存管理(小内存管理算法),串口管理,消息队列,环形缓冲区,类线程间同步方法(信号量、互斥锁、事件集),软件定时器,命令交互客户端(类命令行),软件非阻塞延时,数据转换,IO输入输出操作等。 (gitee.com)](https://gitee.com/ashuai0110/mcu_reuse_development_module)
+
+| 模块模板                 | 旧版底层驱动模板 | 新版底层驱动模板 |
+| ------------------------ | ---------------- | ---------------- |
+| ADXL345三轴传感器        | ADC              | adc              |
+| ASR_CI1122语音识别       | CAN              | adc_dma          |
+| BY9301语音播报模块       | DELAY            | dac              |
+| DHT11温湿度模块          | EXTI             | flash            |
+| DS18B20温度传感器        | FLASH            | gpio             |
+| DS1302时钟模块           | GPIO             | iwdg             |
+| FIFO缓冲区1              | IIC              | nvic             |
+| FIFO缓冲区2              | IICs             | rcc              |
+| MEMS数字气体传感器(单个) | NVIC             | tim              |
+| MEMS数字气体传感器(多个) | Pvd              | usart            |
+| MLX90614红外测温         | RCC              |                  |
+| MPU6050三轴传感器        | SPI              |                  |
+| MultiButton按键驱动      | TIM              |                  |
+| OLED屏幕0.96             | USART            |                  |
+| OneNET                   | WDOG             |                  |
+| PM2.5检测模块            | PWM              |                  |
+| RC522-RFID模块           |                  |                  |
+| SG90舵机                 |                  |                  |
+| SIM900A短信模块          |                  |                  |
+| SR04超声波               |                  |                  |
+| USART&TIM                |                  |                  |
+| WIFIGetAPI               |                  |                  |
+| 单向链表                 |                  |                  |
+| 智能健康检测模块         |                  |                  |
+| 读AB相霍尔编码           |                  |                  |
+| HX711称重模块            |                  |                  |

+ 235 - 0
system_driver_new/adc.c

@@ -0,0 +1,235 @@
+/* 包含头文件-----------------------------------------------------------------*/
+#include "adc.h"
+
+/* 私有宏定义-----------------------------------------------------------------*/
+/* ADC1/2输入通道的引脚定义
+ADC_IN0 PA0
+ADC_IN1 PA1
+ADC_IN2 PA2
+ADC_IN3 PA3
+ADC_IN4 PA4
+ADC_IN5 PA5
+ADC_IN6 PA6
+ADC_IN7 PA7
+ADC_IN8 PB0
+ADC_IN9 PB1
+*/
+
+/* 私有类型定义---------------------------------------------------------------*/
+
+/* 私有变量-------------------------------------------------------------------*/
+
+/* 全局变量-------------------------------------------------------------------*/
+
+/* 私有函数原型---------------------------------------------------------------*/
+
+
+/**
+  * @brief  ADC1初始化
+  * @note   io初始化部分需用户自行修改
+  * @param  None
+  * @retval None
+  */
+void adc1_config(void)
+{
+    ADC_InitTypeDef ADC_InitStructure;
+    GPIO_InitTypeDef GPIO_InitStructure;
+    
+    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); /* 打开ADC时钟 */
+    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE); /* 打开GPIO时钟 */
+
+    /* ADC输入引脚的GPIO配置 */
+    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; /* 设置引脚号 */
+    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; /* 设置引脚模式 模拟输入 */
+    GPIO_Init(GPIOA, &GPIO_InitStructure); /* 初始化GPIO */
+    
+//    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; /* 设置引脚号 */
+//    GPIO_Init(GPIOB, &GPIO_InitStructure); /* 初始化GPIO */
+    
+    ADC_DeInit(ADC1);
+    
+    ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; /* ADC模式 只用到ADC1时为单模式 */
+    ADC_InitStructure.ADC_ScanConvMode = DISABLE; /* 扫描模式 是否从头到尾扫描ADC规则组内所有通道 */
+    ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; /* 连续转换模式 转换完组内最后一个通道时是否重头再来 */
+    ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; /* 外部触发模式 软件触发 */
+    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; /* 转换结果对齐方式 右对齐 */
+    ADC_InitStructure.ADC_NbrOfChannel = 1; /* 规则组内需转换的通道数目 */
+    ADC_Init(ADC1, &ADC_InitStructure); /* 初始化ADC */
+    
+    ADC_Cmd(ADC1, ENABLE); /* 开启ADC */
+    
+    ADC_ResetCalibration(ADC1); // 初始化ADC校准寄存器  
+    while(ADC_GetResetCalibrationStatus(ADC1)); // 等待校准寄存器初始化完成
+    
+    ADC_StartCalibration(ADC1); // ADC开始校准
+    while(ADC_GetCalibrationStatus(ADC1)); // 等待校准完成
+}
+
+/**
+  * @brief  ADC2初始化
+  * @note   io初始化部分需用户自行修改
+  * @param  None
+  * @retval None
+  */
+void adc2_config(void)
+{
+    ADC_InitTypeDef ADC_InitStructure;
+    GPIO_InitTypeDef GPIO_InitStructure;
+    
+    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC2, ENABLE); /* 打开ADC时钟 */
+    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE); /* 打开GPIO时钟 */
+
+    /* ADC输入引脚的GPIO配置 */
+    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; /* 设置引脚号 */
+    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; /* 设置引脚模式 */
+    GPIO_Init(GPIOA, &GPIO_InitStructure); /* 初始化GPIO */
+    
+//    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; /* 设置引脚号 */
+//    GPIO_Init(GPIOB, &GPIO_InitStructure); /* 初始化GPIO */
+    
+    ADC_DeInit(ADC2);
+    
+    ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; /* ADC模式 只用到ADC1时为单模式 */
+    ADC_InitStructure.ADC_ScanConvMode = DISABLE; /* 扫描模式 是否从头到尾扫描ADC规则组内所有通道 */
+    ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; /* 连续转换模式 转换完组内最后一个通道时是否重头再来 */
+    ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; /* 外部触发模式 软件触发 */
+    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; /* 转换结果对齐方式 右对齐 */
+    ADC_InitStructure.ADC_NbrOfChannel = 1; /* 规则组内需转换的通道数目 */
+    ADC_Init(ADC2, &ADC_InitStructure); /* 初始化ADC */
+    
+    ADC_Cmd(ADC2, ENABLE); /* 开启ADC */
+    
+    ADC_ResetCalibration(ADC2); // 初始化ADC校准寄存器  
+    while(ADC_GetResetCalibrationStatus(ADC2)); // 等待校准寄存器初始化完成
+    
+    ADC_StartCalibration(ADC2); // ADC开始校准
+    while(ADC_GetCalibrationStatus(ADC2)); // 等待校准完成
+}
+
+/**
+  * @brief  读取ADC1输入通道转换结果
+  * @param  chx     : adc输入通道 @ref adc_input_chx
+  *   @arg  ADC_IN0 : 输入通道0 PA0
+  *   @arg  ADC_IN1 : 输入通道1 PA1
+  *   @arg  ADC_IN2 : 输入通道2 PA2
+  *   @arg  ADC_IN3 : 输入通道3 PA3
+  *   @arg  ADC_IN4 : 输入通道4 PA4
+  *   @arg  ADC_IN5 : 输入通道5 PA5
+  *   @arg  ADC_IN6 : 输入通道6 PA6
+  *   @arg  ADC_IN7 : 输入通道7 PA7
+  *   @arg  ADC_IN8 : 输入通道8 PB0
+  *   @arg  ADC_IN9 : 输入通道9 PB1
+  * @retval 返回转换结果
+  */
+uint16_t adc1_get_conv_val(uint8_t chx)
+{
+    uint16_t val;
+    
+    /* 设置规则组通道 转换顺序和采样时间 */
+    ADC_RegularChannelConfig(ADC1, chx, 1, ADC_SampleTime_55Cycles5);
+    
+    ADC_SoftwareStartConvCmd(ADC1, ENABLE); /* 使能软件启动转换 */
+    while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)); /* 等待转换完成 */
+    val = ADC_GetConversionValue(ADC1); /* 获取转换结果 */
+    
+    return val;
+}
+
+/**
+  * @brief  读取ADC2输入通道转换结果
+  * @param  chx     : adc输入通道 @ref adc_input_chx
+  *   @arg  ADC_IN0 : 输入通道0 PA0
+  *   @arg  ADC_IN1 : 输入通道1 PA1
+  *   @arg  ADC_IN2 : 输入通道2 PA2
+  *   @arg  ADC_IN3 : 输入通道3 PA3
+  *   @arg  ADC_IN4 : 输入通道4 PA4
+  *   @arg  ADC_IN5 : 输入通道5 PA5
+  *   @arg  ADC_IN6 : 输入通道6 PA6
+  *   @arg  ADC_IN7 : 输入通道7 PA7
+  *   @arg  ADC_IN8 : 输入通道8 PB0
+  *   @arg  ADC_IN9 : 输入通道9 PB1
+  * @retval 返回转换结果
+  */
+uint16_t adc2_get_conv_val(uint8_t chx)
+{
+    uint16_t val;
+    
+    /* 设置规则组通道 转换顺序和采样时间 */
+    ADC_RegularChannelConfig(ADC2, chx, 1, ADC_SampleTime_55Cycles5);
+    
+    ADC_SoftwareStartConvCmd(ADC2, ENABLE); /* 使能软件启动转换 */
+    while(!ADC_GetFlagStatus(ADC2, ADC_FLAG_EOC)); /* 等待转换完成 */
+    val = ADC_GetConversionValue(ADC2); /* 获取转换结果 */
+    
+    return val;
+}
+
+/**
+  * @brief  读取ADC1输入通道转换结果的平均值
+  * @param  chx     : adc输入通道 @ref adc_input_chx
+  *   @arg  ADC_IN0 : 输入通道0 PA0
+  *   @arg  ADC_IN1 : 输入通道1 PA1
+  *   @arg  ADC_IN2 : 输入通道2 PA2
+  *   @arg  ADC_IN3 : 输入通道3 PA3
+  *   @arg  ADC_IN4 : 输入通道4 PA4
+  *   @arg  ADC_IN5 : 输入通道5 PA5
+  *   @arg  ADC_IN6 : 输入通道6 PA6
+  *   @arg  ADC_IN7 : 输入通道7 PA7
+  *   @arg  ADC_IN8 : 输入通道8 PB0
+  *   @arg  ADC_IN9 : 输入通道9 PB1
+  * @param  num     : 多少次转换结果求平均
+  * @retval 返回转换结果的平均值
+  */
+uint16_t adc1_get_average_val(uint8_t chx, uint16_t num)
+{
+    uint16_t tmp = num;
+    uint32_t val = 0;
+    
+    /* 设置规则组通道 转换顺序和采样时间 */
+    ADC_RegularChannelConfig(ADC1, chx, 1, ADC_SampleTime_55Cycles5);
+    
+    while(tmp--)
+    {
+        ADC_SoftwareStartConvCmd(ADC1, ENABLE); /* 使能软件启动转换 */
+        while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)); /* 等待转换完成 */
+        val += ADC_GetConversionValue(ADC1); /* 获取转换结果 */
+    }
+    val = val / num;
+    
+    return val;
+}
+
+/**
+  * @brief  读取ADC2输入通道转换结果的平均值
+  * @param  chx     : adc输入通道 @ref adc_input_chx
+  *   @arg  ADC_IN0 : 输入通道0 PA0
+  *   @arg  ADC_IN1 : 输入通道1 PA1
+  *   @arg  ADC_IN2 : 输入通道2 PA2
+  *   @arg  ADC_IN3 : 输入通道3 PA3
+  *   @arg  ADC_IN4 : 输入通道4 PA4
+  *   @arg  ADC_IN5 : 输入通道5 PA5
+  *   @arg  ADC_IN6 : 输入通道6 PA6
+  *   @arg  ADC_IN7 : 输入通道7 PA7
+  *   @arg  ADC_IN8 : 输入通道8 PB0
+  *   @arg  ADC_IN9 : 输入通道9 PB1
+  * @param  num     : 多少次转换结果求平均
+  * @retval 返回转换结果的平均值
+  */
+uint16_t adc2_get_average_val(uint8_t chx, uint16_t num)
+{
+    uint16_t tmp = num;
+    uint32_t val = 0;
+    
+    /* 设置规则组通道 转换顺序和采样时间 */
+    ADC_RegularChannelConfig(ADC2, chx, 1, ADC_SampleTime_55Cycles5);
+    
+    while(tmp--)
+    {
+        ADC_SoftwareStartConvCmd(ADC2, ENABLE); /* 使能软件启动转换 */
+        while(!ADC_GetFlagStatus(ADC2, ADC_FLAG_EOC)); /* 等待转换完成 */
+        val += ADC_GetConversionValue(ADC2); /* 获取转换结果 */
+    }
+    val = val / num;
+    
+    return val;
+}

+ 47 - 0
system_driver_new/adc.h

@@ -0,0 +1,47 @@
+#ifndef __ADC_AS_H
+#define __ADC_AS_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* 包含头文件-----------------------------------------------------------------*/
+#include "stm32f10x.h"
+
+/* 宏定义---------------------------------------------------------------------*/
+
+#define ADC_VREF                    (3300) /* 正参考电压mv */
+#define ADC_ACCURACY                ((1ul << 12u) - 1) /* 分辨率 */
+#define ADC_CAL_MV(val)             ((val) * ADC_VREF / ADC_ACCURACY) /* ADC结果计算为mv */
+
+/* adc_input_chx */
+#define ADC_IN0                     (0u) /* PA0 */
+#define ADC_IN1                     (1u) /* PA1 */
+#define ADC_IN2                     (2u) /* PA2 */
+#define ADC_IN3                     (3u) /* PA3 */
+#define ADC_IN4                     (4u) /* PA4 */
+#define ADC_IN5                     (5u) /* PA5 */
+#define ADC_IN6                     (6u) /* PA6 */
+#define ADC_IN7                     (7u) /* PA7 */
+#define ADC_IN8                     (8u) /* PB0 */
+#define ADC_IN9                     (9u) /* PB1 */
+
+/* 类型定义-------------------------------------------------------------------*/
+
+/* 全局变量-------------------------------------------------------------------*/
+
+/* 函数原型-------------------------------------------------------------------*/
+void adc1_config(void);
+void adc2_config(void);
+
+uint16_t adc1_get_conv_val(uint8_t chx);
+uint16_t adc2_get_conv_val(uint8_t chx);
+
+uint16_t adc1_get_average_val(uint8_t chx, uint16_t num);
+uint16_t adc2_get_average_val(uint8_t chx, uint16_t num);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* adc.h */

+ 116 - 0
system_driver_new/adc_dma.c

@@ -0,0 +1,116 @@
+/* 包含头文件-----------------------------------------------------------------*/
+#include "adc_dma.h"
+
+/* 私有宏定义-----------------------------------------------------------------*/
+/* ADC1输入通道的引脚定义
+ADC_IN0 PA0
+ADC_IN1 PA1
+ADC_IN2 PA2
+ADC_IN3 PA3
+ADC_IN4 PA4
+ADC_IN5 PA5
+ADC_IN6 PA6
+ADC_IN7 PA7
+ADC_IN8 PB0
+ADC_IN9 PB1
+*/
+#define ADC1_DMA1_CH                (DMA1_Channel1) /* 使用DMA1的通道 */
+#define ADC1_INPUT_CH_NUM           (1u) /* 开启转换的通道数目 */
+
+/* 私有类型定义---------------------------------------------------------------*/
+
+/* 私有变量-------------------------------------------------------------------*/
+static volatile uint16_t adcConvValBuf[10];
+
+/* 全局变量-------------------------------------------------------------------*/
+
+/* 私有函数原型---------------------------------------------------------------*/
+
+
+/**
+  * @brief  ADC1 DMA初始化
+  * @note   io初始化部分需用户自行修改
+  * @param  None
+  * @retval None
+  */
+void adc1_dma_config(void)
+{
+    ADC_InitTypeDef ADC_InitStructure;
+    GPIO_InitTypeDef GPIO_InitStructure;
+    DMA_InitTypeDef DMA_InitStructure;
+    
+    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); /* 打开DMA时钟 */
+    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); /* 打开ADC时钟 */
+    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); /* 打开GPIO时钟 */
+
+    /* ADC输入引脚的GPIO配置 */
+    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; /* 设置引脚号 */
+    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; /* 设置引脚模式 模拟输入 */
+    GPIO_Init(GPIOA, &GPIO_InitStructure); /* 初始化GPIO */
+    
+//    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; /* 设置引脚号 */
+//    GPIO_Init(GPIOB, &GPIO_InitStructure); /* 初始化GPIO */
+    
+    DMA_DeInit(ADC1_DMA1_CH);
+    
+    DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&ADC1->DR; /* 外设基地址 */
+    DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&adcConvValBuf[0]; /* 内存基地址 */
+    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; /* 数据方向 外设作为数据源 */
+    DMA_InitStructure.DMA_BufferSize = ADC1_INPUT_CH_NUM; /* 数据数量 有几个ADC通道需要转换就是几 */
+    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; /* 外设基地址不递增 */
+    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; /* 内存基地址递增 */
+    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; /* 外设数据大小为半字 2byte */
+    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; /* 内存数据大小为半字 2byte */
+    DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; /* 传输模式 循环传输 */
+    DMA_InitStructure.DMA_Priority = DMA_Priority_High; /* DMA优先级 高 */
+    DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; /* 内存到内存禁用 */
+    DMA_Init(ADC1_DMA1_CH, &DMA_InitStructure); /* 初始化DMA */
+    
+    DMA_Cmd(ADC1_DMA1_CH , ENABLE); /* 开启DMA */
+    
+    ADC_DeInit(ADC1);
+    
+    ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; /* ADC模式 只用到ADC1时为单模式 */
+    ADC_InitStructure.ADC_ScanConvMode = ENABLE; /* 扫描模式 是否从头到尾扫描ADC规则组内所有通道 */
+    ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; /* 连续转换模式 转换完组内最后一个通道时是否重头再来 */
+    ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; /* 外部触发模式 软件触发 */
+    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; /* 转换结果对齐方式 右对齐 */
+    ADC_InitStructure.ADC_NbrOfChannel = ADC1_INPUT_CH_NUM; /* 规则组内需转换的通道数目 */
+    ADC_Init(ADC1, &ADC_InitStructure); /* 初始化ADC */
+    
+    ADC_DMACmd(ADC1, ENABLE); /* 开启ADC的DMA */
+    
+    ADC_Cmd(ADC1, ENABLE); /* 开启ADC */
+    
+    ADC_ResetCalibration(ADC1); // 初始化ADC校准寄存器  
+    while(ADC_GetResetCalibrationStatus(ADC1)); // 等待校准寄存器初始化完成
+    
+    ADC_StartCalibration(ADC1); // ADC开始校准
+    while(ADC_GetCalibrationStatus(ADC1)); // 等待校准完成
+    
+    adc1_dma_start();
+}
+
+/**
+  * @brief  启动ADC1的DMA转换
+  * @param  None
+  * @retval None
+  */
+void adc1_dma_start(void)
+{
+    /* 设置规则组通道 转换顺序和采样时间 需要转换几个就写几个 */
+    ADC_RegularChannelConfig(ADC1, ADC_IN1, 1, ADC_SampleTime_28Cycles5);
+//    ADC_RegularChannelConfig(ADC1, ADC_IN2, 2, ADC_SampleTime_55Cycles5);
+    
+    ADC_SoftwareStartConvCmd(ADC1, ENABLE); /* 使能软件启动转换 */
+}
+
+/**
+  * @brief  读取ADC1输入通道DMA转换结果
+  * @param  index : 根据规则组顺序 例如组中第一个是PA1则索引0是PA1的ADC值,第二个是PA5则索引1是PA5的ADC值
+  * @retval 返回转换结果
+  */
+uint16_t adc1_dma_get_conv_val(uint8_t index)
+{
+    return adcConvValBuf[index];
+}

+ 44 - 0
system_driver_new/adc_dma.h

@@ -0,0 +1,44 @@
+#ifndef __ADC_DMA_AS_H
+#define __ADC_DMA_AS_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* 包含头文件-----------------------------------------------------------------*/
+#include "stm32f10x.h"
+
+/* 宏定义---------------------------------------------------------------------*/
+
+#define ADC_VREF                    (3300u) /* 正参考电压mv */
+#define ADC_ACCURACY                ((1ul << 12u) - 1u) /* 分辨率 */
+#define ADC_CAL_MV(val)             ((val) * ADC_VREF / ADC_ACCURACY) /* ADC结果计算为mv */
+
+/* adc_input_chx */
+#define ADC_IN0                     (0u) /* PA0 */
+#define ADC_IN1                     (1u) /* PA1 */
+#define ADC_IN2                     (2u) /* PA2 */
+#define ADC_IN3                     (3u) /* PA3 */
+#define ADC_IN4                     (4u) /* PA4 */
+#define ADC_IN5                     (5u) /* PA5 */
+#define ADC_IN6                     (6u) /* PA6 */
+#define ADC_IN7                     (7u) /* PA7 */
+#define ADC_IN8                     (8u) /* PB0 */
+#define ADC_IN9                     (9u) /* PB1 */
+
+/* 类型定义-------------------------------------------------------------------*/
+
+/* 全局变量-------------------------------------------------------------------*/
+
+/* 函数原型-------------------------------------------------------------------*/
+void adc1_dma_config(void);
+
+void adc1_dma_start(void);
+
+uint16_t adc1_dma_get_conv_val(uint8_t chx);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* adc_dma.h */

+ 96 - 0
system_driver_new/dac.c

@@ -0,0 +1,96 @@
+/* 包含头文件-----------------------------------------------------------------*/
+#include "dac.h"
+
+/* 私有宏定义-----------------------------------------------------------------*/
+
+/* 私有类型定义---------------------------------------------------------------*/
+
+/* 私有变量-------------------------------------------------------------------*/
+
+/* 全局变量-------------------------------------------------------------------*/
+
+/* 私有函数原型---------------------------------------------------------------*/
+
+
+/**
+  * @brief  DAC通道1初始化
+  * @note   PA4引脚输出
+  * @param  None
+  * @retval None
+  */
+void dac_ch1_config(void)
+{
+    DAC_InitTypeDef  DAC_InitStructure;
+    GPIO_InitTypeDef GPIO_InitStructure;
+    
+    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); /* 开启GPIO外设相关时钟 */
+    RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE); /* 开启DAC时钟 */
+    
+    /* DAC输出引脚的GPIO配置 */
+    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; /* 设置引脚号 */
+    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; /* 设置引脚模式 模拟输入 */
+    GPIO_Init(GPIOA, &GPIO_InitStructure); /* 初始化GPIO */
+    
+    DAC_InitStructure.DAC_Trigger = DAC_Trigger_Software; /* 软件触发 */
+    DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None; /* 不使用波形发生 */
+    DAC_InitStructure.DAC_LFSRUnmask_TriangleAmplitude = DAC_LFSRUnmask_Bit0; /* LFSR掩码0 */
+    DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Disable; /* 失能输出缓冲 */
+    DAC_Init(DAC_Channel_1, &DAC_InitStructure); /* 初始化DAC通道1 */
+    
+    DAC_Cmd(DAC_Channel_1, ENABLE); /* 开启DAC通道1 */
+    /* 默认12bit右对齐输出0 */
+    DAC_SetChannel1Data(DAC_Align_12b_R ,0);
+    DAC_SoftwareTriggerCmd(DAC_Channel_1, ENABLE);
+}
+
+/**
+  * @brief  DAC通道2初始化
+  * @note   PA5引脚输出
+  * @param  None
+  * @retval None
+  */
+void dac_ch2_config(void)
+{
+    DAC_InitTypeDef  DAC_InitStructure;
+    GPIO_InitTypeDef GPIO_InitStructure;
+    
+    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); /* 开启GPIO外设相关时钟 */
+    RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE); /* 开启DAC时钟 */
+    
+    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; /* 设置引脚号 */
+    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; /* 设置引脚模式 */
+    GPIO_Init(GPIOA, &GPIO_InitStructure); /* 初始化GPIO */
+    
+    DAC_InitStructure.DAC_Trigger = DAC_Trigger_Software; /* 软件触发 */
+    DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None; /* 不使用波形发生 */
+    DAC_InitStructure.DAC_LFSRUnmask_TriangleAmplitude = DAC_LFSRUnmask_Bit0; /* LFSR掩码0 */
+    DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Disable; /* 失能输出缓冲 */
+    DAC_Init(DAC_Channel_2, &DAC_InitStructure); /* 初始化DAC通道1 */
+    
+    DAC_Cmd(DAC_Channel_2, ENABLE); /* 开启DAC通道1 */
+    /* 默认12bit右对齐输出0 */
+    DAC_SetChannel2Data(DAC_Align_12b_R ,0);
+    DAC_SoftwareTriggerCmd(DAC_Channel_2, ENABLE);
+}
+
+/**
+  * @brief  DAC输出
+  * @param  dacChx         : DAC输出通道 @ref dac_output_chx
+  *   @arg  DAC_OUTPUT_CH1 : DAC输出通道1-PA4
+  *   @arg  DAC_OUTPUT_CH2 : DAC输出通道2-PA5
+  * @param  value          : DAC输出值
+  * @retval None
+  */
+void dac_output(uint8_t dacChx, uint16_t value)
+{
+    if(DAC_OUTPUT_CH1 == dacChx)
+    {
+        DAC_SetChannel1Data(DAC_Align_12b_R ,value);
+        DAC_SoftwareTriggerCmd(DAC_Channel_1, ENABLE);
+    }
+    else if(DAC_OUTPUT_CH2 == dacChx)
+    {
+        DAC_SetChannel2Data(DAC_Align_12b_R ,value);
+        DAC_SoftwareTriggerCmd(DAC_Channel_2, ENABLE);
+    }
+}

+ 35 - 0
system_driver_new/dac.h

@@ -0,0 +1,35 @@
+#ifndef __DAC_AS_H
+#define __DAC_AS_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* 包含头文件-----------------------------------------------------------------*/
+#include "stm32f10x.h"
+
+/* 宏定义---------------------------------------------------------------------*/
+
+#define DAC_VREF                    (3300) /* 正参考电压 mv */
+#define DAC_ACCURACY                ((1ul << 12u) - 1) /* 分辨率 */
+#define DAC_CAL_VAL(mv)             ((mv) * ADC_ACCURACY / ADC_VREF) /* mv计算为DAC输出值 */
+
+/* dac_output_chx */
+#define DAC_OUTPUT_CH1              (0u)
+#define DAC_OUTPUT_CH2              (1u)
+
+/* 类型定义-------------------------------------------------------------------*/
+
+/* 全局变量-------------------------------------------------------------------*/
+
+/* 函数原型-------------------------------------------------------------------*/
+void dac_ch1_config(void);
+void dac_ch2_config(void);
+
+void dac_output(uint8_t dacChx, uint16_t value);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* dac.h */

+ 105 - 0
system_driver_new/flash.c

@@ -0,0 +1,105 @@
+/* 包含头文件-----------------------------------------------------------------*/
+#include "flash.h"
+#include <string.h>
+
+/* 私有宏定义-----------------------------------------------------------------*/
+#define FLASH_PAGE_SIZE             (1024u) /* FLASH页大小 */
+#define FLASH_PROGRAM_SIZE          (4u) /* FLASH单次写入大小 */
+
+/* 使能全局中断 */
+#define ENABLE_GIE()                do { \
+                                    __asm volatile ("cpsie i"); \
+                                    }while(0)
+/* 关闭全局中断 */
+#define DISABLE_GIE()               do { \
+                                    __asm volatile ("cpsid i"); \
+                                    }while(0)
+
+/* 私有类型定义---------------------------------------------------------------*/
+
+/* 私有变量-------------------------------------------------------------------*/
+
+/* 全局变量-------------------------------------------------------------------*/
+
+/* 私有函数原型---------------------------------------------------------------*/
+
+
+/**
+  * @brief  擦除flash
+  * @param  startAddr : 起始地址
+  * @param  bytes     : 擦除总字节数量
+  * @retval 0:擦除成功  1:擦除失败
+  */
+uint8_t flash_erase(uint32_t startAddr, uint32_t bytes)
+{
+    uint8_t pageNum = (bytes % FLASH_PAGE_SIZE == 0) ? (bytes / FLASH_PAGE_SIZE) : (bytes / FLASH_PAGE_SIZE + 1);
+    
+    DISABLE_GIE();
+    FLASH_Unlock();
+    while(pageNum--)
+    {
+        if(FLASH_COMPLETE != FLASH_ErasePage(startAddr))
+        {
+            FLASH_Lock();
+            ENABLE_GIE();
+
+            return 1;
+        }
+        startAddr += FLASH_PAGE_SIZE;
+    }
+    FLASH_Lock();
+    ENABLE_GIE();
+
+    return 0;
+}
+
+/**
+  * @brief  读flash
+  * @param  startAddr : 起始地址
+  * @param  pBuf      : 数据存储区
+  * @param  len       : 读取数量byte
+  * @retval 0:读取成功
+  */
+uint8_t flash_read(uint32_t startAddr, void *pBuf, uint32_t len)
+{
+    DISABLE_GIE();
+    memcpy(pBuf, (void *)startAddr, len);
+    ENABLE_GIE();
+    
+    return 0;
+}
+
+/**
+  * @brief  写flash
+  * @param  startAddr : 起始地址
+  * @param  pBuf      : 数据缓冲区
+  * @param  len       : 写入数量byte
+  * @retval 0:写入成功  1:写入失败
+  */
+uint8_t flash_write(uint32_t startAddr, void *pBuf, uint32_t len)
+{
+    uint32_t *dataTmp;
+    
+    dataTmp = (uint32_t *)pBuf; /* 类型转换为4字节类型 */
+    /* 将写入数量除以单次写入大小计算写入次数并且不满4字节的写入也计入1次写入 */
+    len = (len % FLASH_PROGRAM_SIZE == 0) ? (len / FLASH_PROGRAM_SIZE) : (len / FLASH_PROGRAM_SIZE + 1);
+
+    DISABLE_GIE();
+    FLASH_Unlock();
+    while(len--)
+    {
+        if(FLASH_COMPLETE != FLASH_ProgramWord(startAddr, *dataTmp))
+        {
+            FLASH_Lock();
+            ENABLE_GIE();
+
+            return 1;
+        }
+        startAddr += 4;
+        dataTmp++;
+    }
+    FLASH_Lock();
+    ENABLE_GIE();
+
+    return 0;
+}

+ 27 - 0
system_driver_new/flash.h

@@ -0,0 +1,27 @@
+#ifndef __FLASH_AS_H
+#define __FLASH_AS_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* 包含头文件-----------------------------------------------------------------*/
+#include "stm32f10x.h"
+
+/* 宏定义---------------------------------------------------------------------*/
+
+/* 类型定义-------------------------------------------------------------------*/
+
+/* 全局变量-------------------------------------------------------------------*/
+
+/* 函数原型-------------------------------------------------------------------*/
+uint8_t flash_erase(uint32_t startAddr, uint32_t bytes);
+uint8_t flash_read(uint32_t startAddr, void *pBuf, uint32_t len);
+uint8_t flash_write(uint32_t startAddr, void *pBuf, uint32_t len);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* flash.h */

+ 132 - 0
system_driver_new/gpio.c

@@ -0,0 +1,132 @@
+/* 包含头文件-----------------------------------------------------------------*/
+#include "gpio.h"
+
+/* 私有宏定义-----------------------------------------------------------------*/
+/* GPIO使用到的时钟 */
+#define GPIO_USED_CLK                       (RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC)
+/* GPIO基础操作API */
+#define GPIO_TOGGLE(port, pin)              ((port)->BSRR = (((port)->ODR & (pin)) << 16) | (~(port)->ODR & (pin)))
+#define GPIO_SET(port, pin)                 ((port)->BSRR = (uint32_t)(pin))
+#define GPIO_RESET(port, pin)               ((port)->BSRR = (uint32_t)(pin) << 16)
+#define GPIO_READ(port, pin)                (((port)->IDR & (pin)) != 0)
+/* 用户实现的GPIO端口和引脚宏定义 */
+/* LED_RUN 0点亮 1熄灭 */
+#define LED_RUN_GPIO_PORT                   (GPIOA)
+#define LED_RUN_GPIO_PIN                    (GPIO_Pin_11)
+/* TEST_IN */
+#define TEST_IN_GPIO_PORT                   (GPIOA)
+#define TEST_IN_GPIO_PIN                    (GPIO_Pin_2)
+/* BT_RST */
+#define BT_RST_GPIO_PORT                    (GPIOC)
+#define BT_RST_GPIO_PIN                     (GPIO_Pin_15)
+/* BT_PWR */
+#define BT_PWR_GPIO_PORT                    (GPIOB)
+#define BT_PWR_GPIO_PIN                     (GPIO_Pin_5)
+
+/* 私有类型定义---------------------------------------------------------------*/
+
+/* 私有变量-------------------------------------------------------------------*/
+
+/* 全局变量-------------------------------------------------------------------*/
+
+/* 私有函数原型---------------------------------------------------------------*/
+
+/**
+  * @brief  GPIO初始化
+  * @param  None
+  * @retval None
+  */
+void gpio_config(void)
+{
+    GPIO_InitTypeDef GPIO_InitStructure;
+    
+    RCC_APB2PeriphClockCmd(GPIO_USED_CLK, ENABLE); /* 开启GPIO时钟 */
+    
+    GPIO_InitStructure.GPIO_Pin = LED_RUN_GPIO_PIN; /* 设置引脚号 */
+    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; /* 设置引脚模式 */
+    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; /* 设置引脚速度 */
+    GPIO_Init(LED_RUN_GPIO_PORT, &GPIO_InitStructure); /* 初始化GPIO */
+    
+    GPIO_InitStructure.GPIO_Pin = BT_RST_GPIO_PIN;
+    GPIO_Init(BT_RST_GPIO_PORT, &GPIO_InitStructure);
+    
+    GPIO_InitStructure.GPIO_Pin = BT_PWR_GPIO_PIN;
+    GPIO_Init(BT_PWR_GPIO_PORT, &GPIO_InitStructure);
+    
+    GPIO_InitStructure.GPIO_Pin = TEST_IN_GPIO_PIN;
+    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
+    GPIO_Init(TEST_IN_GPIO_PORT, &GPIO_InitStructure);
+
+    /* gpio default state */
+    gpio_set(LED_RUN);
+    gpio_reset(BT_RST);
+    gpio_set(BT_PWR);
+}
+
+/**
+  * @brief  IO置高
+  * @param  gpiox : gpio枚举名称 @ref gpiox_enum_t
+  * @retval None
+  */
+void gpio_set(uint8_t gpiox)
+{
+    switch(gpiox)
+    {
+        case LED_RUN: GPIO_SET(LED_RUN_GPIO_PORT, LED_RUN_GPIO_PIN); break;
+        case TEST_IN: GPIO_SET(TEST_IN_GPIO_PORT, TEST_IN_GPIO_PIN); break;
+        case BT_RST: GPIO_SET(BT_RST_GPIO_PORT, BT_RST_GPIO_PIN); break;
+        case BT_PWR: GPIO_SET(BT_PWR_GPIO_PORT, BT_PWR_GPIO_PIN); break;
+    }
+}
+
+/**
+  * @brief  IO置低
+  * @param  gpiox : gpio枚举名称 @ref gpiox_enum_t
+  * @retval None
+  */
+void gpio_reset(uint8_t gpiox)
+{
+    switch(gpiox)
+    {
+        case LED_RUN: GPIO_RESET(LED_RUN_GPIO_PORT, LED_RUN_GPIO_PIN); break;
+        case TEST_IN: GPIO_RESET(TEST_IN_GPIO_PORT, TEST_IN_GPIO_PIN); break;
+        case BT_RST: GPIO_RESET(BT_RST_GPIO_PORT, BT_RST_GPIO_PIN); break;
+        case BT_PWR: GPIO_RESET(BT_PWR_GPIO_PORT, BT_PWR_GPIO_PIN); break;
+    }
+}
+
+/**
+  * @brief  IO翻转
+  * @param  gpiox : gpio枚举名称 @ref gpiox_enum_t
+  * @retval None
+  */
+void gpio_toggle(uint8_t gpiox)
+{
+    switch(gpiox)
+    {
+        case LED_RUN: GPIO_TOGGLE(LED_RUN_GPIO_PORT, LED_RUN_GPIO_PIN); break;
+        case TEST_IN: GPIO_TOGGLE(TEST_IN_GPIO_PORT, TEST_IN_GPIO_PIN); break;
+        case BT_RST: GPIO_TOGGLE(BT_RST_GPIO_PORT, BT_RST_GPIO_PIN); break;
+        case BT_PWR: GPIO_TOGGLE(BT_PWR_GPIO_PORT, BT_PWR_GPIO_PIN); break;
+    }
+}
+
+/**
+  * @brief  IO读取
+  * @param  gpiox : gpio枚举名称 @ref gpiox_enum_t
+  * @retval 0:low level  1:high level
+  */
+uint8_t gpio_read(uint8_t gpiox)
+{
+    uint8_t temp = 0;
+    
+    switch(gpiox)
+    {
+        case LED_RUN: temp = GPIO_READ(LED_RUN_GPIO_PORT, LED_RUN_GPIO_PIN); break;
+        case TEST_IN: temp = GPIO_READ(TEST_IN_GPIO_PORT, TEST_IN_GPIO_PIN); break;
+        case BT_RST: temp = GPIO_READ(BT_RST_GPIO_PORT, BT_RST_GPIO_PIN); break;
+        case BT_PWR: temp = GPIO_READ(BT_PWR_GPIO_PORT, BT_PWR_GPIO_PIN); break;
+    }
+    
+    return temp;
+}

+ 39 - 0
system_driver_new/gpio.h

@@ -0,0 +1,39 @@
+#ifndef __GPIO_AS_H
+#define __GPIO_AS_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* 包含头文件-----------------------------------------------------------------*/
+#include "stm32f10x.h"
+
+/* 宏定义---------------------------------------------------------------------*/
+/*
+PA15,PB3,PB4,PB5是JTAG引脚,作为通用IO时需调用引脚重映射函数失能JTAG
+GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
+PC13,PC14,PC15非必要不使用
+*/
+
+/* 类型定义-------------------------------------------------------------------*/
+typedef enum {
+    LED_RUN,
+    TEST_IN,
+    BT_RST,
+    BT_PWR
+} gpiox_enum_t;
+
+/* 全局变量-------------------------------------------------------------------*/
+
+/* 函数原型-------------------------------------------------------------------*/
+void gpio_config(void);
+void gpio_set(uint8_t gpiox);
+void gpio_reset(uint8_t gpiox);
+void gpio_toggle(uint8_t gpiox);
+uint8_t gpio_read(uint8_t gpiox);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* gpio.h */

+ 32 - 0
system_driver_new/iwdg.c

@@ -0,0 +1,32 @@
+/* 包含头文件-----------------------------------------------------------------*/
+#include "iwdg.h"
+
+/* 私有宏定义-----------------------------------------------------------------*/
+
+/* 私有类型定义---------------------------------------------------------------*/
+
+/* 私有变量-------------------------------------------------------------------*/
+
+/* 全局变量-------------------------------------------------------------------*/
+
+/* 私有函数原型---------------------------------------------------------------*/
+
+/**
+  * @brief  独立看门狗初始化
+  * @note   40k / 16 / 2500 = 1s
+  * @param  None
+  * @retval None
+  */
+void iwdg_config(void)
+{
+    /* 使能 预分频寄存器PR和重装载寄存器RLR可写 */
+    IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
+    /* 设置预分频器值 */
+    IWDG_SetPrescaler(IWDG_Prescaler_16);
+    /* 设置重装载寄存器值 */
+    IWDG_SetReload(0xfff);
+    /* 把重装载寄存器的值放到计数器中 */
+    IWDG_ReloadCounter();
+    /* 使能 IWDG */
+    IWDG_Enable();
+}

+ 28 - 0
system_driver_new/iwdg.h

@@ -0,0 +1,28 @@
+#ifndef __IWDG_AS_H
+#define __IWDG_AS_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* 包含头文件-----------------------------------------------------------------*/
+#include "stm32f10x.h"
+
+/* 宏定义---------------------------------------------------------------------*/
+/* 重置独立看门狗 */
+#define IWDG_RELOAD                     do{ \
+                                            IWDG_ReloadCounter(); \
+                                        }while(0)
+
+/* 类型定义-------------------------------------------------------------------*/
+
+/* 全局变量-------------------------------------------------------------------*/
+
+/* 函数原型-------------------------------------------------------------------*/
+void iwdg_config(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* iwdg.h */

+ 233 - 0
system_driver_new/nvic.c

@@ -0,0 +1,233 @@
+/* 包含头文件-----------------------------------------------------------------*/
+#include "nvic.h"
+
+/* 私有宏定义-----------------------------------------------------------------*/
+/* 中断优先级配置开关(缺少的自行补充) 0:关闭 1:开启 */
+#define NVIC_TIM1_UP_EN                 (0u) /* 定时器1溢出更新中断 */
+#define NVIC_TIM1_CC_EN                 (0u) /* 定时器1比较中断 */
+#define NVIC_TIM2_EN                    (0u) /* 定时器2全局中断 */
+#define NVIC_TIM3_EN                    (0u) /* 定时器3全局中断 */
+#define NVIC_TIM4_EN                    (0u) /* 定时器4全局中断 */
+
+#define NVIC_USART1_EN                  (0u) /* 串口1全局中断 */
+#define NVIC_USART2_EN                  (0u) /* 串口2全局中断 */
+#define NVIC_USART3_EN                  (0u) /* 串口3全局中断 */
+#define NVIC_UART4_EN                   (0u) /* 串口4全局中断 */
+#define NVIC_UART5_EN                   (0u) /* 串口5全局中断 */
+
+#define NVIC_DMA1_CH1_EN                (0u) /* DMA1通道1全局中断 */
+#define NVIC_DMA1_CH2_EN                (0u) /* DMA1通道2全局中断 */
+#define NVIC_DMA1_CH3_EN                (0u) /* DMA1通道3全局中断 */
+#define NVIC_DMA1_CH4_EN                (0u) /* DMA1通道4全局中断 */
+#define NVIC_DMA1_CH5_EN                (0u) /* DMA1通道5全局中断 */
+#define NVIC_DMA1_CH6_EN                (0u) /* DMA1通道6全局中断 */
+#define NVIC_DMA1_CH7_EN                (0u) /* DMA1通道7全局中断 */
+
+#define NVIC_EXTI0_EN                   (0u) /* 外部中断0 */
+#define NVIC_EXTI1_EN                   (0u) /* 外部中断1 */
+#define NVIC_EXTI2_EN                   (0u) /* 外部中断2 */
+#define NVIC_EXTI3_EN                   (0u) /* 外部中断3 */
+#define NVIC_EXTI4_EN                   (0u) /* 外部中断4 */
+
+/* 私有类型定义---------------------------------------------------------------*/
+
+/* 私有变量-------------------------------------------------------------------*/
+
+/* 全局变量-------------------------------------------------------------------*/
+
+/* 私有函数原型---------------------------------------------------------------*/
+
+/*=====================================================================================
+  NVIC_PriorityGroup  | NVIC_IRQChannelPreemptionPriority | NVIC_IRQChannelSubPriority 
+=======================================================================================
+ NVIC_PriorityGroup_0 |            0    (0 bits)          |        0~15 (4 bits)       
+---------------------------------------------------------------------------------------
+ NVIC_PriorityGroup_1 |            0~1  (1 bits)          |        0~7  (3 bits)       
+---------------------------------------------------------------------------------------
+ NVIC_PriorityGroup_2 |            0~3  (2 bits)          |        0~3  (2 bits)       
+---------------------------------------------------------------------------------------
+ NVIC_PriorityGroup_3 |            0~7  (3 bits)          |        0~1  (1 bits)       
+---------------------------------------------------------------------------------------
+ NVIC_PriorityGroup_4 |            0~15 (4 bits)          |        0    (0 bits)       
+=====================================================================================*/
+
+/**
+  * @brief  NVIC初始化
+  * @note   未涉及部分用户自行修改
+  * @param  None
+  * @retval None
+  */
+void nvic_config(void)
+{
+    NVIC_InitTypeDef NVIC_InitStructure;
+    
+    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4); /* 设置中断优先级组 */
+    
+#if (NVIC_TIM1_UP_EN)
+    NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn; /* 中断通道标志 */
+    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; /* 抢占优先级 */
+    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; /* 子优先级 */
+    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; /* 中断通道使能 */
+    NVIC_Init(&NVIC_InitStructure); /* 中断优先级初始化 */
+#endif
+#if (NVIC_TIM1_CC_EN)
+    NVIC_InitStructure.NVIC_IRQChannel = TIM1_CC_IRQn;
+    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
+    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
+    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
+    NVIC_Init(&NVIC_InitStructure);
+#endif
+#if (NVIC_TIM2_EN)
+    NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
+    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
+    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
+    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
+    NVIC_Init(&NVIC_InitStructure);
+#endif
+#if (NVIC_TIM3_EN)
+    NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
+    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
+    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
+    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
+    NVIC_Init(&NVIC_InitStructure);
+#endif
+#if (NVIC_TIM4_EN)
+    NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;
+    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 4;
+    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
+    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
+    NVIC_Init(&NVIC_InitStructure);
+#endif
+
+#if (NVIC_USART1_EN)
+    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
+    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
+    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
+    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
+    NVIC_Init(&NVIC_InitStructure);
+#endif
+#if (NVIC_USART2_EN)
+    NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
+    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
+    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
+    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
+    NVIC_Init(&NVIC_InitStructure);
+#endif
+#if (NVIC_USART3_EN)
+    NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
+    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
+    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
+    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
+    NVIC_Init(&NVIC_InitStructure);
+#endif
+#if (NVIC_UART4_EN)
+    NVIC_InitStructure.NVIC_IRQChannel = UART4_IRQn;
+    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 4;
+    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
+    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
+    NVIC_Init(&NVIC_InitStructure);
+#endif
+#if (NVIC_UART5_EN)
+    NVIC_InitStructure.NVIC_IRQChannel = UART5_IRQn;
+    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 5;
+    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
+    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
+    NVIC_Init(&NVIC_InitStructure);
+#endif
+
+#if (NVIC_DMA1_CH1_EN)
+    NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel1_IRQn;
+    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
+    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
+    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
+    NVIC_Init(&NVIC_InitStructure);
+#endif
+#if (NVIC_DMA1_CH2_EN)
+    NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel2_IRQn;
+    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
+    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
+    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
+    NVIC_Init(&NVIC_InitStructure);
+#endif
+#if (NVIC_DMA1_CH3_EN)
+    NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel3_IRQn;
+    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
+    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
+    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
+    NVIC_Init(&NVIC_InitStructure);
+#endif
+#if (NVIC_DMA1_CH4_EN)
+    NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel4_IRQn;
+    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 4;
+    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
+    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
+    NVIC_Init(&NVIC_InitStructure);
+#endif
+#if (NVIC_DMA1_CH5_EN)
+    NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel5_IRQn;
+    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 5;
+    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
+    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
+    NVIC_Init(&NVIC_InitStructure);
+#endif
+#if (NVIC_DMA1_CH6_EN)
+    NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel6_IRQn;
+    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 6;
+    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
+    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
+    NVIC_Init(&NVIC_InitStructure);
+#endif
+#if (NVIC_DMA1_CH7_EN)
+    NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel7_IRQn;
+    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 7;
+    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
+    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
+    NVIC_Init(&NVIC_InitStructure);
+#endif
+
+#if (NVIC_EXTI0_EN)
+    NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
+    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
+    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
+    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
+    NVIC_Init(&NVIC_InitStructure);
+#endif
+#if (NVIC_EXTI1_EN)
+    NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;
+    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
+    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
+    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
+    NVIC_Init(&NVIC_InitStructure);
+#endif
+#if (NVIC_EXTI2_EN)
+    NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn;
+    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
+    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
+    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
+    NVIC_Init(&NVIC_InitStructure);
+#endif
+#if (NVIC_EXTI3_EN)
+    NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn;
+    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 4;
+    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
+    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
+    NVIC_Init(&NVIC_InitStructure);
+#endif
+#if (NVIC_EXTI4_EN)
+    NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn;
+    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 5;
+    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
+    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
+    NVIC_Init(&NVIC_InitStructure);
+#endif
+}
+
+/**
+  * @brief  重启单片机
+  * @param  None
+  * @retval None
+  */
+void nvic_mcu_reboot(void)
+{
+    NVIC_SystemReset();
+}

+ 26 - 0
system_driver_new/nvic.h

@@ -0,0 +1,26 @@
+#ifndef __NVIC_AS_H
+#define __NVIC_AS_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* 包含头文件-----------------------------------------------------------------*/
+#include "stm32f10x.h"
+
+/* 宏定义---------------------------------------------------------------------*/
+
+/* 类型定义-------------------------------------------------------------------*/
+
+/* 全局变量-------------------------------------------------------------------*/
+
+/* 函数原型-------------------------------------------------------------------*/
+void nvic_config(void);
+
+void nvic_mcu_reboot(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* nvic.h */

+ 176 - 0
system_driver_new/rcc.c

@@ -0,0 +1,176 @@
+/* 包含头文件-----------------------------------------------------------------*/
+#include "rcc.h"
+
+/* 私有宏定义-----------------------------------------------------------------*/
+#define RCC_CLOCK_SOURCE                (0u) /* 0:内部时钟HSI  1:外部时钟HSE */
+#define RCC_SYSTICK_EN                  (1u) /* 0:不开启 1:开启 */
+#define RCC_ADC_CLOCK_EN                (0u) /* 0:不开启 1:开启 */
+
+/* 私有类型定义---------------------------------------------------------------*/
+
+/* 私有变量-------------------------------------------------------------------*/
+static uint16_t delayMsCnt, delayUsCnt;
+
+/* 全局变量-------------------------------------------------------------------*/
+
+/* 私有函数原型---------------------------------------------------------------*/
+
+
+/* 注释掉位于stm32f10x_it.c文件中的SysTick_Handler函数
+   在别的地方复现此函数  滴答定时器中断函数
+void SysTick_Handler(void)
+{
+    // user handle write here
+}
+*/
+
+/**
+  * @brief  系统时钟初始化
+  * @note   外部晶振8MHz
+  * @param  sysclk : 时钟频率MHz(4的倍数)(HSI 8~64)(HSE 8~64和72)
+  * @retval 0:时钟初始化成功 1:非法参数
+  */
+uint8_t rcc_system_clock_config(uint8_t sysclk)
+{
+#if (RCC_CLOCK_SOURCE)
+    if(64 < sysclk && 72 != sysclk) { return 1; }
+    if(0 != (sysclk % 4) || 8 > sysclk || 72 < sysclk) { return 1; }
+#else
+    if(0 != (sysclk % 4) || 8 > sysclk || 64 < sysclk) { return 1; }
+#endif
+    
+    RCC_DeInit();
+
+#if (RCC_CLOCK_SOURCE)
+    RCC_HSEConfig(RCC_HSE_ON); /* 打开外部高速时钟HSE */
+    while(RESET == RCC_GetFlagStatus(RCC_FLAG_HSERDY)); /* 等待时钟稳定 */
+#else
+    RCC_HSICmd(ENABLE); /* 打开内部高速时钟HSI */
+    while(RESET == RCC_GetFlagStatus(RCC_FLAG_HSIRDY)); /* 等待时钟稳定 */
+#endif
+    
+    RCC_HCLKConfig(RCC_SYSCLK_Div1); /* AHB clock(HCLK) = SYSCLK/1 (max:72MHz) */
+    
+    RCC_PCLK1Config(RCC_HCLK_Div2); /* APB1 clock(PCLK1) = HCLK/2 (max:36MHz) */
+    
+    RCC_PCLK2Config(RCC_HCLK_Div1); /* APB2 clock(PCLK2) = HCLK/1 (max:72MHz) */
+
+    /* SYSCLK <= 24MHz  0等待周期 */
+    if(24 >= sysclk)
+    {
+        FLASH_SetLatency(FLASH_Latency_0);
+    } /* 24MHz < SYSCLK <= 48MHz  1等待周期 */
+    else if(48 >= sysclk)
+    {
+        FLASH_SetLatency(FLASH_Latency_1);
+    } /* 48MHz < SYSCLK <= 72MHz  2等待周期 */
+    else
+    {
+        FLASH_SetLatency(FLASH_Latency_2);
+    }
+    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); /* 使能FLASH预取缓冲区 */
+    
+#if (RCC_CLOCK_SOURCE)
+    /* SYSCLK <= 64MHz  PLLCLK = (8MHz/2)*(SYSCLK/4) */
+    if(64 >= sysclk)
+    {
+        RCC_PLLConfig(RCC_PLLSource_HSE_Div2, (sysclk / 4 - 2) * RCC_PLLMul_3);
+    } /* SYSCLK == 72MHz  PLLCLK = 8MHz*9 */
+    else
+    {
+        RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
+    }
+#else
+    RCC_PLLConfig(RCC_PLLSource_HSI_Div2, (sysclk / 4 - 2) * RCC_PLLMul_3); /* PLLCLK = (8MHz/2)*(SYSCLK/4) */
+#endif
+    RCC_PLLCmd(ENABLE); /* 使能PLL */
+    while(RESET == RCC_GetFlagStatus(RCC_FLAG_PLLRDY)); /* 等待PLL稳定 */
+    
+    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); /* 选择PLLCLK作为SYSCLK时钟源 */
+    while(0x08 != RCC_GetSYSCLKSource()); /* 等待SYSCLK时钟源切换完成 */
+
+#if (RCC_SYSTICK_EN)
+    SysTick_Config(sysclk * 1000); /* systick初始化周期1ms */
+#endif
+    
+#if (RCC_ADC_CLOCK_EN)
+    /* 设置ADC时钟分频系数 */
+    if(28 >= sysclk)
+    {
+        RCC_ADCCLKConfig(RCC_PCLK2_Div2);
+    }
+    else if(56 >= sysclk)
+    {
+        RCC_ADCCLKConfig(RCC_PCLK2_Div4);
+    }
+    else
+    {
+        RCC_ADCCLKConfig(RCC_PCLK2_Div6);
+    }
+#endif
+    
+    /* 根据主频计算延时因子 */
+    if(24 >= sysclk)
+    {
+        delayMsCnt = sysclk * 123;
+        delayUsCnt = sysclk / 8;
+        if(!delayUsCnt) { delayUsCnt = 1; }
+    }
+    else if(48 >= sysclk)
+    {
+        delayMsCnt = sysclk * 111;
+        delayUsCnt = sysclk / 9;
+    }
+    else
+    {
+        delayMsCnt = sysclk * 100;
+        delayUsCnt = sysclk / 10;
+    }
+    
+    return 0;
+}
+
+/**
+  * @brief  输出各时钟频率信息
+  * @param  None
+  * @retval None
+  */
+void rcc_system_clock_debug(void)
+{
+    RCC_ClocksTypeDef clock;
+    
+    RCC_GetClocksFreq(&clock);
+    
+    /*
+    printf("SYSCLK:%dHz, HCLK:%dHz, PCLK1:%dHz, PCLK2:%dHz\r\n", clock.SYSCLK_Frequency, clock.HCLK_Frequency, clock.PCLK1_Frequency, clock.PCLK2_Frequency);
+    */
+}
+
+/**
+  * @brief  ms延时(粗略)
+  * @param  ms : 延时时间ms
+  * @retval None
+  */
+void rcc_delay_ms(uint32_t ms)
+{
+    volatile uint32_t cnt = 0;
+    volatile uint32_t msCnt = ms;
+    
+    while(msCnt--)
+    {
+        cnt = delayMsCnt;
+        while(cnt--);
+    }
+}
+
+/**
+  * @brief  us延时(粗略)
+  * @param  us : 延时时间us
+  * @retval None
+  */
+void rcc_delay_us(uint32_t us)
+{
+    volatile uint32_t usCnt = us * delayUsCnt;
+    
+    while(usCnt--);
+}

+ 29 - 0
system_driver_new/rcc.h

@@ -0,0 +1,29 @@
+#ifndef __RCC_AS_H
+#define __RCC_AS_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* 包含头文件-----------------------------------------------------------------*/
+#include "stm32f10x.h"
+
+/* 宏定义---------------------------------------------------------------------*/
+
+/* 类型定义-------------------------------------------------------------------*/
+
+/* 全局变量-------------------------------------------------------------------*/
+
+/* 函数原型-------------------------------------------------------------------*/
+uint8_t rcc_system_clock_config(uint8_t sysclk);
+
+void rcc_system_clock_debug(void);
+
+void rcc_delay_ms(uint32_t ms);
+void rcc_delay_us(uint32_t us);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* rcc.h */

+ 128 - 0
system_driver_new/tim.c

@@ -0,0 +1,128 @@
+/* 包含头文件-----------------------------------------------------------------*/
+#include "tim.h"
+
+/* 私有宏定义-----------------------------------------------------------------*/
+
+/* 私有类型定义---------------------------------------------------------------*/
+
+/* 私有变量-------------------------------------------------------------------*/
+
+/* 全局变量-------------------------------------------------------------------*/
+
+/* 私有函数原型---------------------------------------------------------------*/
+
+
+/* 在别的地方复现此函数  TIM1中断函数
+void TIM1_UP_IRQHandler(void)
+{
+    if(TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET) 
+    {
+        // user handle write
+        TIM_ClearITPendingBit(TIM1, TIM_FLAG_Update);
+    }
+}
+*/
+/* 在别的地方复现此函数  TIM2中断函数
+void TIM2_IRQHandler(void)
+{
+    if(TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) 
+    {
+        // user handle write
+        TIM_ClearITPendingBit(TIM2, TIM_FLAG_Update);
+    }
+}
+*/
+/* 在别的地方复现此函数  TIM3中断函数
+void TIM3_IRQHandler(void)
+{
+    if(TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) 
+    {
+        // user handle write
+        TIM_ClearITPendingBit(TIM3, TIM_FLAG_Update);
+    }
+}
+*/
+
+/**
+  * @brief  TIM1初始化
+  * @note   定时器计数+1的频率Hz = 定时器时钟频率 / 时钟分频系数 / (时钟预分频数 + 1)
+  *         定时器溢出周期s = (自动重装载值 + 1) / 定时器计数+1的频率
+  * @param  arr : 自动重装载值 0~0xFFFF
+  * @param  psc : 时钟预分频数 0~0xFFFF
+  * @retval None
+  */
+void tim1_config(uint16_t arr, uint16_t psc)
+{
+    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
+    
+    RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); /* 开启定时器时钟 */
+    
+    TIM_DeInit(TIM1);
+    
+    TIM_TimeBaseStructure.TIM_Period = arr; /* 自动重装载值 */
+    TIM_TimeBaseStructure.TIM_Prescaler = psc; /* 时钟预分频数 */
+    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; /* 时钟分频系数 1分频 */
+    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; /* 计数模式 向上计数 */
+    TIM_TimeBaseStructure.TIM_RepetitionCounter = 0; /* 重复计数器值 0 */
+    TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); /* 初始化定时器 */
+
+    TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE); /* 开启定时器溢出更新中断 */
+
+    TIM_Cmd(TIM1, ENABLE); /* 开启定时器 */
+}
+
+/**
+  * @brief  TIM2初始化
+  * @note   定时器计数+1的频率Hz = 定时器时钟频率 / 时钟分频系数 / (时钟预分频数 + 1)
+  *         定时器溢出周期s = (自动重装载值 + 1) / 定时器计数+1的频率
+  * @param  arr : 自动重装载值 0~0xFFFF
+  * @param  psc : 时钟预分频数 0~0xFFFF
+  * @retval None
+  */
+void tim2_config(uint16_t arr, uint16_t psc)
+{
+    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
+    
+    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); /* 开启定时器时钟 */
+    
+    TIM_DeInit(TIM2);
+    
+    TIM_TimeBaseStructure.TIM_Period = arr; /* 自动重装载值 */
+    TIM_TimeBaseStructure.TIM_Prescaler = psc; /* 时钟预分频数 */
+    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; /* 时钟分频系数 1分频 */
+    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; /* 计数模式 向上计数 */
+    TIM_TimeBaseStructure.TIM_RepetitionCounter = 0; /* 重复计数器值 0 */
+    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); /* 初始化定时器 */
+
+    TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); /* 开启定时器溢出更新中断 */
+
+    TIM_Cmd(TIM2, ENABLE); /* 开启定时器 */
+}
+
+/**
+  * @brief  TIM3初始化
+  * @note   定时器计数+1的频率Hz = 定时器时钟频率 / 时钟分频系数 / (时钟预分频数 + 1)
+  *         定时器溢出周期s = (自动重装载值 + 1) / 定时器计数+1的频率
+  * @param  arr : 自动重装载值 0~0xFFFF
+  * @param  psc : 时钟预分频数 0~0xFFFF
+  * @retval None
+  */
+void tim3_config(uint16_t arr, uint16_t psc)
+{
+    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
+    
+    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); /* 开启定时器时钟 */
+    
+    TIM_DeInit(TIM3);
+    
+    TIM_TimeBaseStructure.TIM_Period = arr; /* 自动重装载值 */
+    TIM_TimeBaseStructure.TIM_Prescaler = psc; /* 时钟预分频数 */
+    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; /* 时钟分频系数 1分频 */
+    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; /* 计数模式 向上计数 */
+    TIM_TimeBaseStructure.TIM_RepetitionCounter = 0; /* 重复计数器值 0 */
+    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); /* 初始化定时器 */
+
+    TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE); /* 开启定时器溢出更新中断 */
+
+    TIM_Cmd(TIM3, ENABLE); /* 开启定时器 */
+}

+ 26 - 0
system_driver_new/tim.h

@@ -0,0 +1,26 @@
+#ifndef __TIM_AS_H
+#define __TIM_AS_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* 包含头文件-----------------------------------------------------------------*/
+#include "stm32f10x.h"
+
+/* 宏定义---------------------------------------------------------------------*/
+
+/* 类型定义-------------------------------------------------------------------*/
+
+/* 全局变量-------------------------------------------------------------------*/
+
+/* 函数原型-------------------------------------------------------------------*/
+void tim1_config(uint16_t arr, uint16_t psc);
+void tim2_config(uint16_t arr, uint16_t psc);
+void tim3_config(uint16_t arr, uint16_t psc);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* tim.h */

+ 220 - 0
system_driver_new/usart.c

@@ -0,0 +1,220 @@
+/* 包含头文件-----------------------------------------------------------------*/
+#include "usart.h"
+
+/* 私有宏定义-----------------------------------------------------------------*/
+/* 串口收发引脚重映射功能开关 0:关闭 1:开启 */
+#define USART1_REMAP_EN             (0u) /* 默认引脚PA9PA10 重映射引脚PB6PB7 */
+#define USART2_REMAP_EN             (0u) /* 默认引脚PA2PA3 重映射引脚PD5PD6 */
+/* 串口3特殊 取值为 0:关闭 1:开启部分重映射 2:开启完全重映射 */
+#define USART3_REMAP_EN             (0u) /* 默认引脚PB10PB11 部分重映射引脚PC10PC11 完全重映射引脚PD8PD9 */
+
+/* 私有类型定义---------------------------------------------------------------*/
+
+/* 私有变量-------------------------------------------------------------------*/
+
+/* 全局变量-------------------------------------------------------------------*/
+
+/* 私有函数原型---------------------------------------------------------------*/
+
+
+/* 在别的地方复现此函数  串口1中断函数
+void USART1_IRQHandler(void)
+{
+    if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
+    {
+        // user handle write
+        USART_ClearITPendingBit(USART1, USART_IT_RXNE);
+    }
+}
+*/
+/* 在别的地方复现此函数  串口2中断函数
+void USART2_IRQHandler(void)
+{
+    if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
+    {
+        // user handle write
+        USART_ClearITPendingBit(USART2, USART_IT_RXNE);
+    }
+}
+*/
+/* 在别的地方复现此函数  串口3中断函数
+void USART3_IRQHandler(void)
+{
+    if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)
+    {
+        // user handle write
+        USART_ClearITPendingBit(USART3, USART_IT_RXNE);
+    }
+}
+*/
+
+/**
+  * @brief  USART1初始化
+  * @param  baud : 串口波特率
+  * @retval None
+  */
+void usart1_config(uint32_t baud)
+{
+    GPIO_InitTypeDef GPIO_InitStructure;
+    USART_InitTypeDef USART_InitStructure;
+
+    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); /* 打开串口时钟 */
+#if (USART1_REMAP_EN)
+    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE); /* 打开GPIO时钟 */
+    GPIO_PinRemapConfig(GPIO_Remap_USART1, ENABLE); /* 开启重映射 */
+    
+    /* USART Tx的GPIO配置 */
+    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; /* 设置引脚号 */
+    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; /* 设置引脚模式 复用推挽 */
+    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; /* 设置引脚速度 */
+    GPIO_Init(GPIOB, &GPIO_InitStructure); /* 初始化GPIO */
+    /* USART Rx的GPIO配置 */
+    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; /* 设置引脚号 */
+    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; /* 设置引脚模式 浮空输入 */
+    GPIO_Init(GPIOB, &GPIO_InitStructure); /* 初始化GPIO */
+#else
+    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); /* 打开GPIO时钟 */
+    
+    /* USART Tx的GPIO配置 */
+    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; /* 设置引脚号 */
+    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; /* 设置引脚模式 复用推挽 */
+    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; /* 设置引脚速度 */
+    GPIO_Init(GPIOA, &GPIO_InitStructure); /* 初始化GPIO */
+    /* USART Rx的GPIO配置 */
+    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; /* 设置引脚号 */
+    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; /* 设置引脚模式 浮空输入 */
+    GPIO_Init(GPIOA, &GPIO_InitStructure); /* 初始化GPIO */
+#endif
+
+    USART_DeInit(USART1);
+
+    USART_InitStructure.USART_BaudRate = baud; /* 波特率 */
+    USART_InitStructure.USART_WordLength = USART_WordLength_8b; /* 数据长度 8bit */
+    USART_InitStructure.USART_StopBits = USART_StopBits_1; /* 停止位 1bit */
+    USART_InitStructure.USART_Parity = USART_Parity_No; /* 校验位 无 */
+    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; /* 硬件流控 无 */
+    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; /* 工作模式 接收和发送 */
+    USART_Init(USART1, &USART_InitStructure); /* 初始化串口 */
+
+    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); /* 使能接收中断 */
+
+    USART_Cmd(USART1, ENABLE); /* 开启串口 */
+}
+
+/**
+  * @brief  USART2初始化
+  * @param  baud : 串口波特率
+  * @retval None
+  */
+void usart2_config(uint32_t baud)
+{
+    GPIO_InitTypeDef GPIO_InitStructure;
+    USART_InitTypeDef USART_InitStructure;
+
+    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); /* 打开串口时钟 */
+#if (USART2_REMAP_EN)
+    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_AFIO, ENABLE); /* 打开GPIO时钟 */
+    GPIO_PinRemapConfig(GPIO_Remap_USART2, ENABLE); /* 开启重映射 */
+    
+    /* USART Tx的GPIO配置 */
+    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; /* 设置引脚号 */
+    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; /* 设置引脚模式 复用推挽 */
+    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; /* 设置引脚速度 */
+    GPIO_Init(GPIOB, &GPIO_InitStructure); /* 初始化GPIO */
+    /* USART Rx的GPIO配置 */
+    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; /* 设置引脚号 */
+    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; /* 设置引脚模式 浮空输入 */
+    GPIO_Init(GPIOD, &GPIO_InitStructure); /* 初始化GPIO */
+#else
+    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); /* 打开GPIO时钟 */
+    
+    /* USART Tx的GPIO配置 */
+    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; /* 设置引脚号 */
+    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; /* 设置引脚模式 复用推挽 */
+    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; /* 设置引脚速度 */
+    GPIO_Init(GPIOA, &GPIO_InitStructure); /* 初始化GPIO */
+    /* USART Rx的GPIO配置 */
+    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; /* 设置引脚号 */
+    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; /* 设置引脚模式 浮空输入 */
+    GPIO_Init(GPIOA, &GPIO_InitStructure); /* 初始化GPIO */
+#endif
+
+    USART_DeInit(USART2);
+
+    USART_InitStructure.USART_BaudRate = baud; /* 波特率 */
+    USART_InitStructure.USART_WordLength = USART_WordLength_8b; /* 数据长度 8bit */
+    USART_InitStructure.USART_StopBits = USART_StopBits_1; /* 停止位 1bit */
+    USART_InitStructure.USART_Parity = USART_Parity_No; /* 校验位 无 */
+    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; /* 硬件流控 无 */
+    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; /* 工作模式 接收和发送 */
+    USART_Init(USART2, &USART_InitStructure); /* 初始化串口 */
+
+    USART_ITConfig(USART2, USART_IT_RXNE, ENABLE); /* 使能接收中断 */
+
+    USART_Cmd(USART2, ENABLE); /* 开启串口 */
+}
+
+/**
+  * @brief  USART3初始化
+  * @param  baud : 串口波特率
+  * @retval None
+  */
+void usart3_config(uint32_t baud)
+{
+    GPIO_InitTypeDef GPIO_InitStructure;
+    USART_InitTypeDef USART_InitStructure;
+
+    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE); /* 打开串口时钟 */
+#if (1 == USART3_REMAP_EN)
+    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO, ENABLE); /* 打开GPIO时钟 */
+    GPIO_PinRemapConfig(GPIO_PartialRemap_USART3, ENABLE); /* 开启部分重映射 */
+    
+    /* USART Tx的GPIO配置 */
+    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; /* 设置引脚号 */
+    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; /* 设置引脚模式 复用推挽 */
+    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; /* 设置引脚速度 */
+    GPIO_Init(GPIOC, &GPIO_InitStructure); /* 初始化GPIO */
+    /* USART Rx的GPIO配置 */
+    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; /* 设置引脚号 */
+    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; /* 设置引脚模式 浮空输入 */
+    GPIO_Init(GPIOC, &GPIO_InitStructure); /* 初始化GPIO */
+#elif (2 == USART3_REMAP_EN)
+    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_AFIO, ENABLE); /* 打开GPIO时钟 */
+    GPIO_PinRemapConfig(GPIO_FullRemap_USART3, ENABLE); /* 开启完全重映射 */
+    /* USART Tx的GPIO配置 */
+    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; /* 设置引脚号 */
+    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; /* 设置引脚模式 复用推挽 */
+    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; /* 设置引脚速度 */
+    GPIO_Init(GPIOD, &GPIO_InitStructure); /* 初始化GPIO */
+    /* USART Rx的GPIO配置 */
+    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; /* 设置引脚号 */
+    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; /* 设置引脚模式 浮空输入 */
+    GPIO_Init(GPIOD, &GPIO_InitStructure); /* 初始化GPIO */
+#else
+    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); /* 打开GPIO时钟 */
+    
+    /* USART Tx的GPIO配置 */
+    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; /* 设置引脚号 */
+    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; /* 设置引脚模式 复用推挽 */
+    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; /* 设置引脚速度 */
+    GPIO_Init(GPIOB, &GPIO_InitStructure); /* 初始化GPIO */
+    /* USART Rx的GPIO配置 */
+    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; /* 设置引脚号 */
+    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; /* 设置引脚模式 浮空输入 */
+    GPIO_Init(GPIOB, &GPIO_InitStructure); /* 初始化GPIO */
+#endif
+
+    USART_DeInit(USART3);
+
+    USART_InitStructure.USART_BaudRate = baud; /* 波特率 */
+    USART_InitStructure.USART_WordLength = USART_WordLength_8b; /* 数据长度 8bit */
+    USART_InitStructure.USART_StopBits = USART_StopBits_1; /* 停止位 1bit */
+    USART_InitStructure.USART_Parity = USART_Parity_No; /* 校验位 无 */
+    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; /* 硬件流控 无 */
+    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; /* 工作模式 接收和发送 */
+    USART_Init(USART3, &USART_InitStructure); /* 初始化串口 */
+
+    USART_ITConfig(USART3, USART_IT_RXNE, ENABLE); /* 使能接收中断 */
+
+    USART_Cmd(USART3, ENABLE); /* 开启串口 */
+}

+ 26 - 0
system_driver_new/usart.h

@@ -0,0 +1,26 @@
+#ifndef __USART_AS_H
+#define __USART_AS_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* 包含头文件-----------------------------------------------------------------*/
+#include "stm32f10x.h"
+
+/* 宏定义---------------------------------------------------------------------*/
+
+/* 类型定义-------------------------------------------------------------------*/
+
+/* 全局变量-------------------------------------------------------------------*/
+
+/* 函数原型-------------------------------------------------------------------*/
+void usart1_config(uint32_t baud);
+void usart2_config(uint32_t baud);
+void usart3_config(uint32_t baud);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* usart.h */