编码转换: GBK -> UTF-8,所有.c/.h源文件中文注释统一UTF-8编码

This commit is contained in:
wangfq
2026-07-20 09:07:46 +08:00
parent b1637a13be
commit 8157ce41bd
62 changed files with 1969 additions and 1969 deletions
+43 -43
View File
@@ -3,7 +3,7 @@
* Author : WCH * Author : WCH
* Version : V1.10 * Version : V1.10
* Date : 2018/12/14 * Date : 2018/12/14
* Description : oad相关配置定义 * Description : oad相关配置定义
********************************************************************************* *********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for * Attention: This software (modified or not) and binary are used for
@@ -19,18 +19,18 @@
* ------------------------------------------------------------------------------------------------ * ------------------------------------------------------------------------------------------------
*/ */
/* 整个用户code区分成四块,依次为4K,44K,16K,128K 后三块分别叫做imageAAPP),imageBIAP),LIB */ /* 整个用户code区分成四块,依次为4K,44K,16K,128K 后三块分别叫做imageAAPP),imageBIAP),LIB */
/* FLASH定义 */ /* FLASH定义 */
#define FLASH_BLOCK_SIZE EEPROM_BLOCK_SIZE #define FLASH_BLOCK_SIZE EEPROM_BLOCK_SIZE
/* imageA定义 */ /* imageA定义 */
#define IMAGE_A_FLAG 0x01 #define IMAGE_A_FLAG 0x01
#define IMAGE_A_START_ADD 0x1000 #define IMAGE_A_START_ADD 0x1000
#define IMAGE_A_SIZE 44 * 1024 #define IMAGE_A_SIZE 44 * 1024
/* imageB定义 */ /* imageB定义 */
#define IMAGE_B_FLAG 0x02 #define IMAGE_B_FLAG 0x02
#define IMAGE_B_START_ADD (IMAGE_A_START_ADD + IMAGE_A_SIZE) #define IMAGE_B_START_ADD (IMAGE_A_START_ADD + IMAGE_A_SIZE)
#define IMAGE_B_SIZE 16 * 1024 #define IMAGE_B_SIZE 16 * 1024
@@ -39,72 +39,72 @@
#define jumpApp ((void (*)(void))((uint32_t *)IMAGE_A_START_ADD)) #define jumpApp ((void (*)(void))((uint32_t *)IMAGE_A_START_ADD))
/* IAP定义 */ /* IAP定义 */
/* 以下为IAP下载命令定义 */ /* 以下为IAP下载命令定义 */
#define CMD_IAP_PROM 0x80 // IAP编程命令 #define CMD_IAP_PROM 0x80 // IAP编程命令
#define CMD_IAP_ERASE 0x81 // IAP擦除命令 #define CMD_IAP_ERASE 0x81 // IAP擦除命令
#define CMD_IAP_VERIFY 0x82 // IAP校验命令 #define CMD_IAP_VERIFY 0x82 // IAP校验命令
#define CMD_IAP_END 0x83 // IAP结束标志 #define CMD_IAP_END 0x83 // IAP结束标志
#define CMD_IAP_INFO 0x84 // IAP获取设备信息 #define CMD_IAP_INFO 0x84 // IAP获取设备信息
/* 数据帧长度定义 */ /* 数据帧长度定义 */
#define IAP_LEN 247 #define IAP_LEN 247
/* 存放在DataFlash地址,不能占用蓝牙的位置 */ /* 存放在DataFlash地址,不能占用蓝牙的位置 */
#define OTA_DATAFLASH_ADD 0x00077000 - FLASH_ROM_MAX_SIZE #define OTA_DATAFLASH_ADD 0x00077000 - FLASH_ROM_MAX_SIZE
/* 存放在DataFlash里的OTA信息 */ /* 存放在DataFlash里的OTA信息 */
typedef struct typedef struct
{ {
unsigned char ImageFlag; //记录的当前的image标志 unsigned char ImageFlag; //记录的当前的image标志
unsigned char Revd[3]; unsigned char Revd[3];
} OTADataFlashInfo_t; } OTADataFlashInfo_t;
/* OTA IAP通讯协议定义 */ /* OTA IAP通讯协议定义 */
/* 地址使用4倍偏移 */ /* 地址使用4倍偏移 */
typedef union typedef union
{ {
struct struct
{ {
unsigned char cmd; /* 命令码 0x81 */ unsigned char cmd; /* 命令码 0x81 */
unsigned char len; /* 后续数据长度 */ unsigned char len; /* 后续数据长度 */
unsigned char addr[2]; /* 擦除地址 */ unsigned char addr[2]; /* 擦除地址 */
unsigned char block_num[2]; /* 擦除块数 */ unsigned char block_num[2]; /* 擦除块数 */
} erase; /* 擦除命令 */ } erase; /* 擦除命令 */
struct struct
{ {
unsigned char cmd; /* 命令码 0x83 */ unsigned char cmd; /* 命令码 0x83 */
unsigned char len; /* 后续数据长度 */ unsigned char len; /* 后续数据长度 */
unsigned char status[2]; /* 两字节状态,保留 */ unsigned char status[2]; /* 两字节状态,保留 */
} end; /* 结束命令 */ } end; /* 结束命令 */
struct struct
{ {
unsigned char cmd; /* 命令码 0x82 */ unsigned char cmd; /* 命令码 0x82 */
unsigned char len; /* 后续数据长度 */ unsigned char len; /* 后续数据长度 */
unsigned char addr[2]; /* 校验地址 */ unsigned char addr[2]; /* 校验地址 */
unsigned char buf[IAP_LEN - 4]; /* 校验数据 */ unsigned char buf[IAP_LEN - 4]; /* 校验数据 */
} verify; /* 校验命令 */ } verify; /* 校验命令 */
struct struct
{ {
unsigned char cmd; /* 命令码 0x80 */ unsigned char cmd; /* 命令码 0x80 */
unsigned char len; /* 后续数据长度 */ unsigned char len; /* 后续数据长度 */
unsigned char addr[2]; /* 地址 */ unsigned char addr[2]; /* 地址 */
unsigned char buf[IAP_LEN - 4]; /* 后续数据 */ unsigned char buf[IAP_LEN - 4]; /* 后续数据 */
} program; /* 编程命令 */ } program; /* 编程命令 */
struct struct
{ {
unsigned char cmd; /* 命令码 0x84 */ unsigned char cmd; /* 命令码 0x84 */
unsigned char len; /* 后续数据长度 */ unsigned char len; /* 后续数据长度 */
unsigned char buf[IAP_LEN - 2]; /* 后续数据 */ unsigned char buf[IAP_LEN - 2]; /* 后续数据 */
} info; /* 编程命令 */ } info; /* 编程命令 */
struct struct
{ {
unsigned char buf[IAP_LEN]; /* 接收数据包*/ unsigned char buf[IAP_LEN]; /* 接收数据包*/
} other; } other;
} OTA_IAP_CMD_t; } OTA_IAP_CMD_t;
/* 记录当前的Image */ /* 记录当前的Image */
extern unsigned char CurrImageFlag; extern unsigned char CurrImageFlag;
#endif #endif
@@ -28,7 +28,7 @@ extern "C" {
// Simple BLE Peripheral Task Events // Simple BLE Peripheral Task Events
#define SBP_START_DEVICE_EVT 0x0001 #define SBP_START_DEVICE_EVT 0x0001
#define SBP_PERIODIC_EVT 0x0002 #define SBP_PERIODIC_EVT 0x0002
#define OTA_FLASH_ERASE_EVT 0x0004 //OTA Flash²Á³ýÈÎÎñ #define OTA_FLASH_ERASE_EVT 0x0004 //OTA Flash擦除任务
/********************************************************************* /*********************************************************************
* MACROS * MACROS
+46 -46
View File
@@ -3,7 +3,7 @@
* Author : WCH * Author : WCH
* Version : V1.0 * Version : V1.0
* Date : 2018/12/10 * Date : 2018/12/10
* Description : 外设从机应用程序,初始化广播连接参数,然后广播,直至连接主机后,通过自定义服务传输数据 * Description : 外设从机应用程序,初始化广播连接参数,然后广播,直至连接主机后,通过自定义服务传输数据
********************************************************************************* *********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for * Attention: This software (modified or not) and binary are used for
@@ -128,26 +128,26 @@ static uint8_t advertData[] = {
static uint8_t attDeviceName[GAP_DEVICE_NAME_LEN] = "OTAOTA_OTAOTA_OTA"; static uint8_t attDeviceName[GAP_DEVICE_NAME_LEN] = "OTAOTA_OTAOTA_OTA";
// OTA IAP VARIABLES // OTA IAP VARIABLES
/* OTA通讯的帧 */ /* OTA通讯的帧 */
OTA_IAP_CMD_t iap_rec_data; OTA_IAP_CMD_t iap_rec_data;
/* OTA解析结果 */ /* OTA解析结果 */
uint32_t OpParaDataLen = 0; uint32_t OpParaDataLen = 0;
uint32_t OpAdd = 0; uint32_t OpAdd = 0;
/* flash的数据临时存储 */ /* flash的数据临时存储 */
__attribute__((aligned(8))) uint8_t block_buf[16]; __attribute__((aligned(8))) uint8_t block_buf[16];
/* Image跳转函数地址定义 */ /* Image跳转函数地址定义 */
typedef int (*pImageTaskFn)(void); typedef int (*pImageTaskFn)(void);
pImageTaskFn user_image_tasks; pImageTaskFn user_image_tasks;
/* Flash 擦除过程 */ /* Flash 擦除过程 */
uint32_t EraseAdd = 0; //擦除地址 uint32_t EraseAdd = 0; //擦除地址
uint32_t EraseBlockNum = 0; //需要擦除的块数 uint32_t EraseBlockNum = 0; //需要擦除的块数
uint32_t EraseBlockCnt = 0; //擦除的块计数 uint32_t EraseBlockCnt = 0; //擦除的块计数
/* FLASH 校验过程 */ /* FLASH 校验过程 */
uint8_t VerifyStatus = 0; uint8_t VerifyStatus = 0;
/********************************************************************* /*********************************************************************
@@ -312,7 +312,7 @@ uint16_t Peripheral_ProcessEvent(uint8_t task_id, uint16_t events)
PRINT("ERASE:%08x num:%d\r\n", (int)(EraseAdd + EraseBlockCnt * FLASH_BLOCK_SIZE), (int)EraseBlockCnt); PRINT("ERASE:%08x num:%d\r\n", (int)(EraseAdd + EraseBlockCnt * FLASH_BLOCK_SIZE), (int)EraseBlockCnt);
status = FLASH_ROM_ERASE(EraseAdd + EraseBlockCnt * FLASH_BLOCK_SIZE, FLASH_BLOCK_SIZE); status = FLASH_ROM_ERASE(EraseAdd + EraseBlockCnt * FLASH_BLOCK_SIZE, FLASH_BLOCK_SIZE);
/* 擦除失败 */ /* 擦除失败 */
if(status != SUCCESS) if(status != SUCCESS)
{ {
OTA_IAP_SendCMDDealSta(status); OTA_IAP_SendCMDDealSta(status);
@@ -321,7 +321,7 @@ uint16_t Peripheral_ProcessEvent(uint8_t task_id, uint16_t events)
EraseBlockCnt++; EraseBlockCnt++;
/* 擦除结束 */ /* 擦除结束 */
if(EraseBlockCnt >= EraseBlockNum) if(EraseBlockCnt >= EraseBlockNum)
{ {
PRINT("ERASE Complete\r\n"); PRINT("ERASE Complete\r\n");
@@ -438,10 +438,10 @@ static void performPeriodicTask(void)
/********************************************************************* /*********************************************************************
* @fn OTA_IAP_SendData * @fn OTA_IAP_SendData
* *
* @brief OTA IAP发送数据,使用时限制20字节以内 * @brief OTA IAP发送数据,使用时限制20字节以内
* *
* @param p_send_data - 发送数据的指针 * @param p_send_data - 发送数据的指针
* @param send_len - 发送数据的长度 * @param send_len - 发送数据的长度
* *
* @return none * @return none
*/ */
@@ -453,9 +453,9 @@ void OTA_IAP_SendData(uint8_t *p_send_data, uint8_t send_len)
/********************************************************************* /*********************************************************************
* @fn OTA_IAP_SendCMDDealSta * @fn OTA_IAP_SendCMDDealSta
* *
* @brief OTA IAP执行的状态返回 * @brief OTA IAP执行的状态返回
* *
* @param deal_status - 返回的状态 * @param deal_status - 返回的状态
* *
* @return none * @return none
*/ */
@@ -471,7 +471,7 @@ void OTA_IAP_SendCMDDealSta(uint8_t deal_status)
/********************************************************************* /*********************************************************************
* @fn OTA_IAP_CMDErrDeal * @fn OTA_IAP_CMDErrDeal
* *
* @brief OTA IAP异常命令码处理 * @brief OTA IAP异常命令码处理
* *
* @return none * @return none
*/ */
@@ -483,9 +483,9 @@ void OTA_IAP_CMDErrDeal(void)
/********************************************************************* /*********************************************************************
* @fn SwitchImageFlag * @fn SwitchImageFlag
* *
* @brief 切换dataflash里的ImageFlag * @brief 切换dataflash里的ImageFlag
* *
* @param new_flag - 切换的ImageFlag * @param new_flag - 切换的ImageFlag
* *
* @return none * @return none
*/ */
@@ -494,23 +494,23 @@ void SwitchImageFlag(uint8_t new_flag)
uint16_t i; uint16_t i;
uint32_t ver_flag; uint32_t ver_flag;
/* 读取第一块 */ /* 读取第一块 */
EEPROM_READ(OTA_DATAFLASH_ADD, (uint32_t *)&block_buf[0], 4); EEPROM_READ(OTA_DATAFLASH_ADD, (uint32_t *)&block_buf[0], 4);
/* 擦除第一块 */ /* 擦除第一块 */
EEPROM_ERASE(OTA_DATAFLASH_ADD, EEPROM_PAGE_SIZE); EEPROM_ERASE(OTA_DATAFLASH_ADD, EEPROM_PAGE_SIZE);
/* 更新Image信息 */ /* 更新Image信息 */
block_buf[0] = new_flag; block_buf[0] = new_flag;
/* 编程DataFlash */ /* 编程DataFlash */
EEPROM_WRITE(OTA_DATAFLASH_ADD, (uint32_t *)&block_buf[0], 4); EEPROM_WRITE(OTA_DATAFLASH_ADD, (uint32_t *)&block_buf[0], 4);
} }
/********************************************************************* /*********************************************************************
* @fn DisableAllIRQ * @fn DisableAllIRQ
* *
* @brief 关闭所有的中断 * @brief 关闭所有的中断
* *
* @return none * @return none
*/ */
@@ -522,7 +522,7 @@ void DisableAllIRQ(void)
/********************************************************************* /*********************************************************************
* @fn Rec_OTA_IAP_DataDeal * @fn Rec_OTA_IAP_DataDeal
* *
* @brief 接收到OTA数据包处理 * @brief 接收到OTA数据包处理
* *
* @return none * @return none
*/ */
@@ -530,7 +530,7 @@ void Rec_OTA_IAP_DataDeal(void)
{ {
switch(iap_rec_data.other.buf[0]) switch(iap_rec_data.other.buf[0])
{ {
/* 编程 */ /* 编程 */
case CMD_IAP_PROM: case CMD_IAP_PROM:
{ {
uint32_t i; uint32_t i;
@@ -543,12 +543,12 @@ void Rec_OTA_IAP_DataDeal(void)
PRINT("IAP_PROM: %08x len:%d \r\n", (int)OpAdd, (int)OpParaDataLen); PRINT("IAP_PROM: %08x len:%d \r\n", (int)OpAdd, (int)OpParaDataLen);
/* 当前是ImageA,直接编程 */ /* 当前是ImageA,直接编程 */
status = FLASH_ROM_WRITE(OpAdd, iap_rec_data.program.buf, (uint16_t)OpParaDataLen); status = FLASH_ROM_WRITE(OpAdd, iap_rec_data.program.buf, (uint16_t)OpParaDataLen);
OTA_IAP_SendCMDDealSta(status); OTA_IAP_SendCMDDealSta(status);
break; break;
} }
/* 擦除 -- 蓝牙擦除由主机控制 */ /* 擦除 -- 蓝牙擦除由主机控制 */
case CMD_IAP_ERASE: case CMD_IAP_ERASE:
{ {
OpAdd = (uint32_t)(iap_rec_data.erase.addr[0]); OpAdd = (uint32_t)(iap_rec_data.erase.addr[0]);
@@ -560,7 +560,7 @@ void Rec_OTA_IAP_DataDeal(void)
EraseAdd = OpAdd; EraseAdd = OpAdd;
EraseBlockCnt = 0; EraseBlockCnt = 0;
/* 检验就放在擦除里清0 */ /* 检验就放在擦除里清0 */
VerifyStatus = 0; VerifyStatus = 0;
PRINT("IAP_ERASE start:%08x num:%d\r\n", (int)OpAdd, (int)EraseBlockNum); PRINT("IAP_ERASE start:%08x num:%d\r\n", (int)OpAdd, (int)EraseBlockNum);
@@ -571,15 +571,15 @@ void Rec_OTA_IAP_DataDeal(void)
} }
else else
{ {
/* 修改DataFlash,切换至ImageB */ /* 修改DataFlash,切换至ImageB */
SwitchImageFlag(IMAGE_B_FLAG); SwitchImageFlag(IMAGE_B_FLAG);
/* 启动擦除 */ /* 启动擦除 */
tmos_set_event(Peripheral_TaskID, OTA_FLASH_ERASE_EVT); tmos_set_event(Peripheral_TaskID, OTA_FLASH_ERASE_EVT);
} }
break; break;
} }
/* 校验 */ /* 校验 */
case CMD_IAP_VERIFY: case CMD_IAP_VERIFY:
{ {
uint32_t i; uint32_t i;
@@ -598,22 +598,22 @@ void Rec_OTA_IAP_DataDeal(void)
OTA_IAP_SendCMDDealSta(VerifyStatus); OTA_IAP_SendCMDDealSta(VerifyStatus);
break; break;
} }
/* 编程结束 */ /* 编程结束 */
case CMD_IAP_END: case CMD_IAP_END:
{ {
PRINT("IAP_END \r\n"); PRINT("IAP_END \r\n");
/* 关闭当前所有使用中断,或者方便一点直接全部关闭 */ /* 关闭当前所有使用中断,或者方便一点直接全部关闭 */
DisableAllIRQ(); DisableAllIRQ();
/* 修改DataFlash,切换至ImageA */ /* 修改DataFlash,切换至ImageA */
SwitchImageFlag(IMAGE_A_FLAG); SwitchImageFlag(IMAGE_A_FLAG);
/* 等待打印完成 ,跳转ImageB*/ /* 等待打印完成 ,跳转ImageB*/
mDelaymS(10); mDelaymS(10);
jumpApp(); jumpApp();
/* 不会执行到这 */ /* 不会执行到这 */
SYS_ResetExecute(); SYS_ResetExecute();
break; break;
@@ -639,9 +639,9 @@ void Rec_OTA_IAP_DataDeal(void)
send_buf[7] = CHIP_ID&0xFF; send_buf[7] = CHIP_ID&0xFF;
send_buf[8] = (CHIP_ID>>8)&0xFF; send_buf[8] = (CHIP_ID>>8)&0xFF;
/* 有需要再增加 */ /* 有需要再增加 */
/* 发送信息 */ /* 发送信息 */
OTA_IAP_SendData(send_buf, 20); OTA_IAP_SendData(send_buf, 20);
break; break;
@@ -658,9 +658,9 @@ void Rec_OTA_IAP_DataDeal(void)
/********************************************************************* /*********************************************************************
* @fn OTA_IAPReadDataComplete * @fn OTA_IAPReadDataComplete
* *
* @brief OTA 数据读取完成处理 * @brief OTA 数据读取完成处理
* *
* @param index - OTA 通道序号 * @param index - OTA 通道序号
* *
* @return none * @return none
*/ */
@@ -672,11 +672,11 @@ void OTA_IAPReadDataComplete(unsigned char index)
/********************************************************************* /*********************************************************************
* @fn OTA_IAPWriteData * @fn OTA_IAPWriteData
* *
* @brief OTA 通道数据接收完成处理 * @brief OTA 通道数据接收完成处理
* *
* @param index - OTA 通道序号 * @param index - OTA 通道序号
* @param p_data - 写入的数据 * @param p_data - 写入的数据
* @param w_len - 写入的长度 * @param w_len - 写入的长度
* *
* @return none * @return none
*/ */
@@ -3,7 +3,7 @@
* Author : WCH * Author : WCH
* Version : V1.1 * Version : V1.1
* Date : 2019/11/05 * Date : 2019/11/05
* Description : 升级从机应用主函数及任务系统初始化 * Description : 升级从机应用主函数及任务系统初始化
********************************************************************************* *********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for * Attention: This software (modified or not) and binary are used for
@@ -11,14 +11,14 @@
*******************************************************************************/ *******************************************************************************/
/******************************************************************************/ /******************************************************************************/
/* 头文件包含 */ /* 头文件包含 */
#include "CONFIG.h" #include "CONFIG.h"
#include "HAL.h" #include "HAL.h"
#include "Peripheral.h" #include "Peripheral.h"
#include "OTA.h" #include "OTA.h"
#include "OTAprofile.h" #include "OTAprofile.h"
/* 记录当前的Image */ /* 记录当前的Image */
unsigned char CurrImageFlag = 0xff; unsigned char CurrImageFlag = 0xff;
/********************************************************************* /*********************************************************************
@@ -30,11 +30,11 @@ __attribute__((aligned(4))) uint32_t MEM_BUF[BLE_MEMHEAP_SIZE / 4];
const uint8_t MacAddr[6] = {0x84, 0xC2, 0xE4, 0x03, 0x02, 0x02}; const uint8_t MacAddr[6] = {0x84, 0xC2, 0xE4, 0x03, 0x02, 0x02};
#endif #endif
/* 注意:关于程序升级后flash的操作必须先执行,不开启任何中断,防止操作中断和失败 */ /* 注意:关于程序升级后flash的操作必须先执行,不开启任何中断,防止操作中断和失败 */
/********************************************************************* /*********************************************************************
* @fn ReadImageFlag * @fn ReadImageFlag
* *
* @brief 读取当前的程序的Image标志,DataFlash如果为空,就默认是ImageA,如果为ImageA,则跳转ImageA * @brief 读取当前的程序的Image标志,DataFlash如果为空,就默认是ImageA,如果为ImageA,则跳转ImageA
* *
* @return none * @return none
*/ */
@@ -45,7 +45,7 @@ void ReadImageFlag(void)
EEPROM_READ(OTA_DATAFLASH_ADD, &p_image_flash, 4); EEPROM_READ(OTA_DATAFLASH_ADD, &p_image_flash, 4);
CurrImageFlag = p_image_flash.ImageFlag; CurrImageFlag = p_image_flash.ImageFlag;
/* 程序第一次执行,或者没有更新过,以后更新后在擦除DataFlash */ /* 程序第一次执行,或者没有更新过,以后更新后在擦除DataFlash */
if((CurrImageFlag != IMAGE_B_FLAG) && (CurrImageFlag != IMAGE_A_FLAG) && (CurrImageFlag != IMAGE_OTA_FLAG)) if((CurrImageFlag != IMAGE_B_FLAG) && (CurrImageFlag != IMAGE_A_FLAG) && (CurrImageFlag != IMAGE_OTA_FLAG))
{ {
CurrImageFlag = IMAGE_A_FLAG; CurrImageFlag = IMAGE_A_FLAG;
@@ -64,7 +64,7 @@ void ReadImageFlag(void)
/********************************************************************* /*********************************************************************
* @fn Main_Circulation * @fn Main_Circulation
* *
* @brief 主循环 * @brief 主循环
* *
* @return none * @return none
*/ */
@@ -81,7 +81,7 @@ void Main_Circulation()
/********************************************************************* /*********************************************************************
* @fn main * @fn main
* *
* @brief 主函数 * @brief 主函数
* *
* @return none * @return none
*/ */
@@ -100,18 +100,18 @@ int main(void)
// GPIOA_ModeCfg(bTXD1, GPIO_ModeOut_PP_5mA); // GPIOA_ModeCfg(bTXD1, GPIO_ModeOut_PP_5mA);
// UART1_DefInit(); // UART1_DefInit();
#endif #endif
/* 配置串口0:先配置IO口模式,再配置串口 */ /* 配置串口0:先配置IO口模式,再配置串口 */
GPIOPinRemap(ENABLE, RB_PIN_UART0); GPIOPinRemap(ENABLE, RB_PIN_UART0);
GPIOA_SetBits(GPIO_Pin_14); GPIOA_SetBits(GPIO_Pin_14);
GPIOA_ModeCfg(GPIO_Pin_15, GPIO_ModeIN_PU); // RXD-配置上拉输入 GPIOA_ModeCfg(GPIO_Pin_15, GPIO_ModeIN_PU); // RXD-配置上拉输入
GPIOA_ModeCfg(GPIO_Pin_14, GPIO_ModeOut_PP_5mA); // TXD-配置推挽输出,注意先让IO口输出高电平 GPIOA_ModeCfg(GPIO_Pin_14, GPIO_ModeOut_PP_5mA); // TXD-配置推挽输出,注意先让IO口输出高电平
UART0_DefInit(); UART0_DefInit();
PRINT("%s\n", VER_LIB); PRINT("%s\n", VER_LIB);
ReadImageFlag(); ReadImageFlag();
if((R8_RESET_STATUS & RB_RESET_FLAG) == RST_FLAG_SW) if((R8_RESET_STATUS & RB_RESET_FLAG) == RST_FLAG_SW)
{ {
// 软复位不跳APP // 软复位不跳APP
} }
else else
{ {
@@ -3,7 +3,7 @@
* Author : WCH * Author : WCH
* Version : V1.0 * Version : V1.0
* Date : 2018/12/10 * Date : 2018/12/10
* Description : OTA升级蓝牙通讯接口 * Description : OTA升级蓝牙通讯接口
********************************************************************************* *********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for * Attention: This software (modified or not) and binary are used for
@@ -137,11 +137,11 @@ gattServiceCBs_t OTAProfileCBs = {
/********************************************************************* /*********************************************************************
* @fn OTAProfile_AddService * @fn OTAProfile_AddService
* *
* @brief OTA Profile初始化 * @brief OTA Profile初始化
* *
* @param services - 服务控制字 * @param services - 服务控制字
* *
* @return 初始化的状态 * @return 初始化的状态
*/ */
bStatus_t OTAProfile_AddService(uint32_t services) bStatus_t OTAProfile_AddService(uint32_t services)
{ {
@@ -162,11 +162,11 @@ bStatus_t OTAProfile_AddService(uint32_t services)
/********************************************************************* /*********************************************************************
* @fn OTAProfile_RegisterAppCBs * @fn OTAProfile_RegisterAppCBs
* *
* @brief OTA Profile读写回调函数注册 * @brief OTA Profile读写回调函数注册
* *
* @param appCallbacks - 函数结构体指针 * @param appCallbacks - 函数结构体指针
* *
* @return 函数执行状态 * @return 函数执行状态
*/ */
bStatus_t OTAProfile_RegisterAppCBs(OTAProfileCBs_t *appCallbacks) bStatus_t OTAProfile_RegisterAppCBs(OTAProfileCBs_t *appCallbacks)
{ {
@@ -308,19 +308,19 @@ static bStatus_t OTAProfile_WriteAttrCB(uint16_t connHandle, gattAttribute_t *pA
/********************************************************************* /*********************************************************************
* @fn OTAProfile_SendData * @fn OTAProfile_SendData
* *
* @brief OTA Profile通道发送数据 * @brief OTA Profile通道发送数据
* *
* @param paramID - OTA通道选择 * @param paramID - OTA通道选择
* @param p_data - 数据指针 * @param p_data - 数据指针
* @param send_len - 发送数据长度 * @param send_len - 发送数据长度
* *
* @return 函数执行状态 * @return 函数执行状态
*/ */
bStatus_t OTAProfile_SendData(unsigned char paramID, unsigned char *p_data, unsigned char send_len) bStatus_t OTAProfile_SendData(unsigned char paramID, unsigned char *p_data, unsigned char send_len)
{ {
bStatus_t status = SUCCESS; bStatus_t status = SUCCESS;
/* 数据长度超出范围 */ /* 数据长度超出范围 */
if(send_len > 20) if(send_len > 20)
return 0xfe; return 0xfe;
@@ -25,13 +25,13 @@ extern "C" {
* CONSTANTS * CONSTANTS
*/ */
// OTA Profile通道Index定义 // OTA Profile通道Index定义
#define OTAPROFILE_CHAR 0 #define OTAPROFILE_CHAR 0
// OTA 服务的UUID定义 // OTA 服务的UUID定义
#define OTAPROFILE_SERV_UUID 0xFEE0 #define OTAPROFILE_SERV_UUID 0xFEE0
// OTA 通讯通道UUID定义 // OTA 通讯通道UUID定义
#define OTAPROFILE_CHAR_UUID 0xFEE1 #define OTAPROFILE_CHAR_UUID 0xFEE1
// Simple Keys Profile Services bit fields // Simple Keys Profile Services bit fields
@@ -49,7 +49,7 @@ extern "C" {
* Profile Callbacks * Profile Callbacks
*/ */
// 读写操作函数回调 // 读写操作函数回调
typedef void (*OTAProfileRead_t)(unsigned char paramID); typedef void (*OTAProfileRead_t)(unsigned char paramID);
typedef void (*OTAProfileWrite_t)(unsigned char paramID, unsigned char *p_data, unsigned char w_len); typedef void (*OTAProfileWrite_t)(unsigned char paramID, unsigned char *p_data, unsigned char w_len);
@@ -64,31 +64,31 @@ typedef struct
*/ */
/** /**
* @brief OTA Profile初始化 * @brief OTA Profile初始化
* *
* @param services - 服务控制字 * @param services - 服务控制字
* *
* @return 初始化的状态 * @return 初始化的状态
*/ */
bStatus_t OTAProfile_AddService(uint32_t services); bStatus_t OTAProfile_AddService(uint32_t services);
/** /**
* @brief OTA Profile读写回调函数注册 * @brief OTA Profile读写回调函数注册
* *
* @param appCallbacks - 函数结构体指针 * @param appCallbacks - 函数结构体指针
* *
* @return 函数执行状态 * @return 函数执行状态
*/ */
bStatus_t OTAProfile_RegisterAppCBs(OTAProfileCBs_t *appCallbacks); bStatus_t OTAProfile_RegisterAppCBs(OTAProfileCBs_t *appCallbacks);
/** /**
* @brief OTA Profile通道发送数据 * @brief OTA Profile通道发送数据
* *
* @param paramID - OTA通道选择 * @param paramID - OTA通道选择
* @param p_data - 数据指针 * @param p_data - 数据指针
* @param send_len - 发送数据长度 * @param send_len - 发送数据长度
* *
* @return 函数执行状态 * @return 函数执行状态
*/ */
bStatus_t OTAProfile_SendData(unsigned char paramID, unsigned char *p_data, unsigned char send_len); bStatus_t OTAProfile_SendData(unsigned char paramID, unsigned char *p_data, unsigned char send_len);
@@ -3,7 +3,7 @@
* Author : WCH * Author : WCH
* Version : V1.1 * Version : V1.1
* Date : 2020/08/06 * Date : 2020/08/06
* Description : 跳转指令 * Description : 跳转指令
********************************************************************************* *********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for * Attention: This software (modified or not) and binary are used for
@@ -12,12 +12,12 @@
/******************************************************************************/ /******************************************************************************/
// 如需修改跳转地址,直接修改启动文件 startup_CH59x.s 中跳转指令 “j” 之后的地址 // 如需修改跳转地址,直接修改启动文件 startup_CH59x.s 中跳转指令 “j” 之后的地址
/********************************************************************* /*********************************************************************
* @fn main * @fn main
* *
* @brief 主函数 * @brief 主函数
* *
* @return none * @return none
*/ */
+21 -21
View File
@@ -11,7 +11,7 @@
#include "CH59x_common.h" #include "CH59x_common.h"
uint8_t g_flag_notify_temp = 0; //临时通知notify flag, 0 disable, 1 enable uint8_t g_flag_notify_temp = 0; //临时通知notify flag, 0 disable, 1 enable
BLE_Notify_Buf g_notify_buftemp = {0,0, ""}; BLE_Notify_Buf g_notify_buftemp = {0,0, ""};
BLE_Notify_Buf g_ble_rcv_buf = {0,0, ""}; BLE_Notify_Buf g_ble_rcv_buf = {0,0, ""};
@@ -70,8 +70,8 @@ void clear_buf_dbn_ble_all(Buf_DBN_BLE * buf)
} }
// 0: 包检测异常 // 0: 包检测异常
//检测包是否完整,Magic Byte, Header Byte, CK Byte, 校验字节(异或校验,以及和校验) //检测包是否完整,Magic Byte, Header Byte, CK Byte, 校验字节(异或校验,以及和校验)
uint8_t check_pkg(uint8_t * pkg, uint8_t len) uint8_t check_pkg(uint8_t * pkg, uint8_t len)
{ {
if(len < 6) //min length of ble pkg is 6 if(len < 6) //min length of ble pkg is 6
@@ -84,7 +84,7 @@ uint8_t check_pkg(uint8_t * pkg, uint8_t len)
} }
uint8_t _dxor = 0; uint8_t _dxor = 0;
uint8_t _dsum = 0; uint8_t _dsum = 0;
uint8_t _cklen = _len + 3; //不计算 校验字节 uint8_t _cklen = _len + 3; //不计算 校验字节
uint8_t i = 0; uint8_t i = 0;
for(i = 1; i < _cklen; i++) for(i = 1; i < _cklen; i++)
{ {
@@ -200,7 +200,7 @@ uint8_t set_response_to_notify(Buf_DBN_BLE *response_ori, BLE_Notify_Buf * notif
} }
if(response_ori->pkg_amount <= 1) if(response_ori->pkg_amount <= 1)
{ {
//没有分包的情况 //没有分包的情况
notify_dst->buf[0] = response_ori->magic; notify_dst->buf[0] = response_ori->magic;
if(response_ori->magic == MAGIC_BYTE_DBN_TRANSPARENT) if(response_ori->magic == MAGIC_BYTE_DBN_TRANSPARENT)
{ {
@@ -436,7 +436,7 @@ static void unpack_pkg_set_cjq_param(uint8_t *pkg, uint8_t len)
tmp[i++] = g_loop_cng_unit.sensitvity; tmp[i++] = g_loop_cng_unit.sensitvity;
tmp[i++] = g_loop_cng_unit.delay_time; tmp[i++] = g_loop_cng_unit.delay_time;
tmp[i++] = g_loop_cng_unit.output_mode; tmp[i++] = g_loop_cng_unit.output_mode;
tmp[i++] = g_loop_cng_unit.direction_mode; //默认 0 tmp[i++] = g_loop_cng_unit.direction_mode; //默认 0
tmp[i++] = g_loop_cng_unit.loopFreq_Level; tmp[i++] = g_loop_cng_unit.loopFreq_Level;
tmp[i++] = g_loop_cng_unit.loopSafe_Timeout; tmp[i++] = g_loop_cng_unit.loopSafe_Timeout;
tmp[i++] = g_loop_cng_unit.exist_mode; tmp[i++] = g_loop_cng_unit.exist_mode;
@@ -470,7 +470,7 @@ void usart_packet_processing_acs_loop(uint8_t flag)
g_freq_tmp = (float)(g_sys_freq )/((float)(_loop_capvd)/((float)(loop1_LPCNT))); // ?? ??????? g_freq_tmp = (float)(g_sys_freq )/((float)(_loop_capvd)/((float)(loop1_LPCNT))); // ?? ???????
// why + 360? balance value ,补偿,经验值,可以根据示波器比较再进行调整 // why + 360? balance value ,补偿,经验值,可以根据示波器比较再进行调整
_current_freq = (uint32_t)(g_freq_tmp) + 360 ;// * 32); _current_freq = (uint32_t)(g_freq_tmp) + 360 ;// * 32);
// if(flag) // if(flag)
{ {
@@ -483,7 +483,7 @@ void usart_packet_processing_acs_loop(uint8_t flag)
// { // {
// if(_current_freq - _last_freq > 30) // if(_current_freq - _last_freq > 30)
// { // {
// //稳定显示,过滤低数值的变动 // //稳定显示,过滤低数值的变动
// g_loop_acs_info.frequent = _current_freq; // g_loop_acs_info.frequent = _current_freq;
// _last_freq = _current_freq; // _last_freq = _current_freq;
// } // }
@@ -492,7 +492,7 @@ void usart_packet_processing_acs_loop(uint8_t flag)
// { // {
// if(_last_freq - _current_freq > 30) // if(_last_freq - _current_freq > 30)
// { // {
// // 稳定显示,过滤低数值的变动 // // 稳定显示,过滤低数值的变动
// g_loop_acs_info.frequent = _current_freq; // g_loop_acs_info.frequent = _current_freq;
// _last_freq = _current_freq; // _last_freq = _current_freq;
// } // }
@@ -531,7 +531,7 @@ void report_sens_acs(void)
if(g_dbn_ble_state_acs_enable.enable) if(g_dbn_ble_state_acs_enable.enable)
{ {
// 上报线圈动态数据 // 上报线圈动态数据
// switch(g_dbn_ble_state_acs_enable.sens_type) // switch(g_dbn_ble_state_acs_enable.sens_type)
@@ -539,7 +539,7 @@ void report_sens_acs(void)
// //case SENS_LOOP_DYNAMIC: // //case SENS_LOOP_DYNAMIC:
// default: // default:
// { // {
// 线圈动态信息 // 线圈动态信息
if(g_loop_acs_info.flag_event) if(g_loop_acs_info.flag_event)
{ {
// if(g_loop_acs_info.report_counter >= 3) // if(g_loop_acs_info.report_counter >= 3)
@@ -637,7 +637,7 @@ void manage_dbn_ble_default(uint8_t *pkg, uint8_t len)
// PRINT("\nGet_Cjq_param\n"); // PRINT("\nGet_Cjq_param\n");
} break; } break;
// case CMD_DBN_LOOP_SAMPLE_PARAM:{ // case CMD_DBN_LOOP_SAMPLE_PARAM:{
// // 获取/设置 地感采样参数 // // 获取/设置 地感采样参数
//// PRINT("SAMPLE_CNG: %02X\n", pkg[4]); //// PRINT("SAMPLE_CNG: %02X\n", pkg[4]);
// if(pkg[4] == 0){ // if(pkg[4] == 0){
// // get param // // get param
@@ -664,13 +664,13 @@ void manage_dbn_ble_default(uint8_t *pkg, uint8_t len)
// //
// set_response_buf(&g_buf_ble_response, MAGIC_BYTE_DBN_DEFAULT, _cmd, tmp_ble_buf, i); // set_response_buf(&g_buf_ble_response, MAGIC_BYTE_DBN_DEFAULT, _cmd, tmp_ble_buf, i);
// //
// //TODO: 不整个设备复位,复位除了蓝牙的部分,即蓝牙正常,其他部分重新初始化 // //TODO: 不整个设备复位,复位除了蓝牙的部分,即蓝牙正常,其他部分重新初始化
// para_store_init(); // para_store_init();
// } // }
// //
// } break; // } break;
// case CMD_DBN_LOOP_BALANCE_PARAM: { // case CMD_DBN_LOOP_BALANCE_PARAM: {
// // 获取/设置 漂移补偿参数 // // 获取/设置 漂移补偿参数
//// PRINT("Balance_CNG: %02X\n", pkg[4]); //// PRINT("Balance_CNG: %02X\n", pkg[4]);
// if(pkg[4] == 0){ // if(pkg[4] == 0){
// // get param // // get param
@@ -698,14 +698,14 @@ void manage_dbn_ble_default(uint8_t *pkg, uint8_t len)
// //
// set_response_buf(&g_buf_ble_response, MAGIC_BYTE_DBN_DEFAULT, _cmd, tmp_ble_buf, i); // set_response_buf(&g_buf_ble_response, MAGIC_BYTE_DBN_DEFAULT, _cmd, tmp_ble_buf, i);
// //
// //TODO: 不整个设备复位,复位除了蓝牙的部分,即蓝牙正常,其他部分重新初始化 // //TODO: 不整个设备复位,复位除了蓝牙的部分,即蓝牙正常,其他部分重新初始化
// para_store_init(); // para_store_init();
// //
// } // }
// //
// } break; // } break;
// case CMD_DBN_LOOP_RELEASE_PLANB: { // case CMD_DBN_LOOP_RELEASE_PLANB: {
// // 获取/设置 释放去抖动算法参数 // // 获取/设置 释放去抖动算法参数
//// PRINT("Release2_CNG: %02X\n", pkg[4]); //// PRINT("Release2_CNG: %02X\n", pkg[4]);
// if(pkg[4] == 0){ // if(pkg[4] == 0){
// // get param // // get param
@@ -733,7 +733,7 @@ void manage_dbn_ble_default(uint8_t *pkg, uint8_t len)
// //
// set_response_buf(&g_buf_ble_response, MAGIC_BYTE_DBN_DEFAULT, _cmd, tmp_ble_buf, i); // set_response_buf(&g_buf_ble_response, MAGIC_BYTE_DBN_DEFAULT, _cmd, tmp_ble_buf, i);
// //
// //TODO: 不整个设备复位,复位除了蓝牙的部分,即蓝牙正常,其他部分重新初始化 // //TODO: 不整个设备复位,复位除了蓝牙的部分,即蓝牙正常,其他部分重新初始化
// para_store_init(); // para_store_init();
// } // }
// } break; // } break;
@@ -773,23 +773,23 @@ void manage_dbn_ble_default(uint8_t *pkg, uint8_t len)
write_cfg_to_store(Addr_Loop_Sens_List_Offset, &tmp_ble_buf[1], (i - 1)); write_cfg_to_store(Addr_Loop_Sens_List_Offset, &tmp_ble_buf[1], (i - 1));
DelayMs(10); DelayMs(10);
//TODO: 不整个设备复位,复位除了蓝牙的部分,即蓝牙正常,其他部分重新初始化 //TODO: 不整个设备复位,复位除了蓝牙的部分,即蓝牙正常,其他部分重新初始化
para_store_init(); para_store_init();
} }
} break; } break;
case CMD_DBN_SET_CJQ_FACTORY: { case CMD_DBN_SET_CJQ_FACTORY: {
// 出厂初始化 // 出厂初始化
tmp_ble_buf[0] = 0; tmp_ble_buf[0] = 0;
set_response_buf(&g_buf_ble_response, MAGIC_BYTE_DBN_DEFAULT, _cmd, tmp_ble_buf, 1); set_response_buf(&g_buf_ble_response, MAGIC_BYTE_DBN_DEFAULT, _cmd, tmp_ble_buf, 1);
set_factory_param(); set_factory_param();
factory_dev(); factory_dev();
DelayMs(10); DelayMs(10);
//TODO: 不整个设备复位,复位除了蓝牙的部分,即蓝牙正常,其他部分重新初始化 //TODO: 不整个设备复位,复位除了蓝牙的部分,即蓝牙正常,其他部分重新初始化
para_store_init(); para_store_init();
} break; } break;
case CMD_SENS_ACS_ENABLE: { case CMD_SENS_ACS_ENABLE: {
// 线圈动态 // 线圈动态
g_dbn_ble_state_acs_enable.enable = pkg[5]; g_dbn_ble_state_acs_enable.enable = pkg[5];
if(g_dbn_ble_state_acs_enable.enable){ if(g_dbn_ble_state_acs_enable.enable){
@@ -3,8 +3,8 @@
* *
* Created on: Aug 27, 2024 * Created on: Aug 27, 2024
* Author: Thinkpad * Author: Thinkpad
* 2026-07-18: 算法移植 DLD154V4B, 移除 FltHistoryManager / SecondOrderState / * 2026-07-18: 算法移植 DLD154V4B, 移除 FltHistoryManager / SecondOrderState /
* StageRangeConfig 等旧算法结构 * StageRangeConfig 等旧算法结构
*/ */
#ifndef INCLUDE_CMCNG_H_ #ifndef INCLUDE_CMCNG_H_
@@ -20,9 +20,9 @@
#define HARDWARE_VER_MAIN 4 #define HARDWARE_VER_MAIN 4
#define HARDWARE_VER_SUB 1 #define HARDWARE_VER_SUB 1
/* 功能模式位 (direction_mode 高4位, 协议保留; 新算法不再消费) */ /* 功能模式位 (direction_mode 高4位, 协议保留; 新算法不再消费) */
#define FUNCTION_A 0x01 // 二次判断 (已废弃) #define FUNCTION_A 0x01 // 二次判断 (已废弃)
#define FUNCTION_B 0x02 // 二次判断增强条件判断 (已废弃) #define FUNCTION_B 0x02 // 二次判断增强条件判断 (已废弃)
#define FUNCTION_C 0x04 // #define FUNCTION_C 0x04 //
#define FUNCTION_D 0x08 // #define FUNCTION_D 0x08 //
@@ -38,9 +38,9 @@ extern uint8_t g_loop_power_up_state;
extern uint8_t g_function_mode; extern uint8_t g_function_mode;
/* 新算法状态 (DLD154V4B 移植) */ /* 新算法状态 (DLD154V4B 移植) */
extern uint8_t g_loop_stable; // 稳定期结束标志 (0=收敛中, 1=稳定) extern uint8_t g_loop_stable; // 稳定期结束标志 (0=收敛中, 1=稳定)
extern uint8_t g_env_activity; // 环境活跃度 (BLE condition 字段来源) extern uint8_t g_env_activity; // 环境活跃度 (BLE condition 字段来源)
uint32_t mstick(void); uint32_t mstick(void);
@@ -19,7 +19,7 @@
* * Len = len(CMD) + len(Data) * * Len = len(CMD) + len(Data)
*/ */
#define MAGIC_BYTE_DBN_DEFAULT 0x8F #define MAGIC_BYTE_DBN_DEFAULT 0x8F
#define MAGIC_BYTE_DBN_TRANSPARENT 0x7F // 用于 显示屏协议、地感协议、探头协议等 #define MAGIC_BYTE_DBN_TRANSPARENT 0x7F // 用于 显示屏协议、地感协议、探头协议等
#define CMD_DBN_GET_DEV_INFO 0x10 #define CMD_DBN_GET_DEV_INFO 0x10
@@ -32,9 +32,9 @@
#define CMD_DBN_SET_NOTIFY 0x20 #define CMD_DBN_SET_NOTIFY 0x20
#define CMD_DBN_SET_NOTIFY_LOOP 0x21 #define CMD_DBN_SET_NOTIFY_LOOP 0x21
#define CMD_DBN_SET_SUB_CODE 0x22 //使能 子功能 #define CMD_DBN_SET_SUB_CODE 0x22 //使能 子功能
#define CMD_DBN_SET_CJQ_PARAM 0x23 // 设置 车检器参数 #define CMD_DBN_SET_CJQ_PARAM 0x23 // 设置 车检器参数
#define CMD_DBN_GET_CJQ_PARAM 0x24 // 读取 车检器参数 #define CMD_DBN_GET_CJQ_PARAM 0x24 // 读取 车检器参数
#define CMD_DBN_DEV_RESET 0x6D #define CMD_DBN_DEV_RESET 0x6D
@@ -45,17 +45,17 @@
#define CMD_DBN_SET_CJQ_FACTORY 0x92 #define CMD_DBN_SET_CJQ_FACTORY 0x92
#define CMD_SUB_SENS_REPORT 0xC0 //设备主动上报传感信息 #define CMD_SUB_SENS_REPORT 0xC0 //设备主动上报传感信息
// #define CMD_REQUIRE_DEV_MAC_ADDR 0xC1 // #define CMD_REQUIRE_DEV_MAC_ADDR 0xC1
// #define CMD_CHANGE_DEV_ADDR_BY_MAC 0xC2 // #define CMD_CHANGE_DEV_ADDR_BY_MAC 0xC2
// #define CMD_SET_LED 0xC3 // #define CMD_SET_LED 0xC3
// #define CMD_SET_RELAY 0xC4 // #define CMD_SET_RELAY 0xC4
#define CMD_SENS_ACS_ENABLE 0xC5 // 设备主动上报 使能 #define CMD_SENS_ACS_ENABLE 0xC5 // 设备主动上报 使能
#define MAX_BLE_DAT_RESPONSE_LEN (BLE_BUFF_MAX_LEN - 4) // 14 //返回 的所有字节数不能超过20个字节,除去 magic、header和ckb校验字节,剩下数据的字节数为14 #define MAX_BLE_DAT_RESPONSE_LEN (BLE_BUFF_MAX_LEN - 4) // 14 //返回 的所有字节数不能超过20个字节,除去 magic、header和ckb校验字节,剩下数据的字节数为14
#define MAX_BLE_Notify_Buf_LEN BLE_BUFF_MAX_LEN //24 #define MAX_BLE_Notify_Buf_LEN BLE_BUFF_MAX_LEN //24
#define MAX_BLE_BUF_LEN BLE_BUFF_MAX_LEN //128 #define MAX_BLE_BUF_LEN BLE_BUFF_MAX_LEN //128
#define MAX_BLE_TMP_BUF_LEN BLE_BUFF_MAX_LEN #define MAX_BLE_TMP_BUF_LEN BLE_BUFF_MAX_LEN
@@ -39,20 +39,20 @@
typedef struct _Loop_Sample_CNG_ typedef struct _Loop_Sample_CNG_
{ {
uint8_t flag; uint8_t flag;
uint16_t max_amplitude; // 最大幅值 uint16_t max_amplitude; // 最大幅值
}Loop_Sample_Cng; }Loop_Sample_Cng;
typedef struct _Loop_Balance_Ori_CNG_ typedef struct _Loop_Balance_Ori_CNG_
{ {
uint8_t flag; uint8_t flag;
uint16_t max_cnt ; // 最大补偿次数 uint16_t max_cnt ; // 最大补偿次数
}Loop_Balance_Ori_Cng; // 漂移补偿 }Loop_Balance_Ori_Cng; // 漂移补偿
typedef struct _Loop_Release_Ori_PlanB_ typedef struct _Loop_Release_Ori_PlanB_
{ {
uint8_t flag_weight; uint8_t flag_weight;
uint16_t max_amplitude; //最大幅值 uint16_t max_amplitude; //最大幅值
uint8_t timeout; // 单位:分钟 uint8_t timeout; // 单位:分钟
}Loop_Release_Ori_PlanB; }Loop_Release_Ori_PlanB;
typedef struct _Loop_Release_Change_Rate_ typedef struct _Loop_Release_Change_Rate_
@@ -77,13 +77,13 @@ extern Loop_Balance_PlanB g_loop_balance_planB;
typedef struct typedef struct
{ {
uint8_t sensitvity; // 高四位表示灵敏度的数量,低四位表示当前灵敏度的序号(从0开始) uint8_t sensitvity; // 高四位表示灵敏度的数量,低四位表示当前灵敏度的序号(从0开始)
uint8_t delay_time; uint8_t delay_time;
uint8_t output_mode; uint8_t output_mode;
uint8_t direction_mode; // 方向判别模式,0 触发模式, 非0 表示方向判别模式 uint8_t direction_mode; // 方向判别模式,0 触发模式, 非0 表示方向判别模式
uint8_t loopFreq_Level; // 高低频 uint8_t loopFreq_Level; // 高低频
uint8_t loopSafe_Timeout; // 线圈安全模式, 0表示关闭,非0表示开启,以10秒为单位 uint8_t loopSafe_Timeout; // 线圈安全模式, 0表示关闭,非0表示开启,以10秒为单位
uint8_t exist_mode; // 0 永久存在,非0,表示有限存在的时间,单位为10秒 uint8_t exist_mode; // 0 永久存在,非0,表示有限存在的时间,单位为10秒
}Loop_Cng_Unit; }Loop_Cng_Unit;
extern Loop_Cng_Unit g_loop_cng_unit; extern Loop_Cng_Unit g_loop_cng_unit;
@@ -105,7 +105,7 @@ extern Loop_Sens_List g_loop_sens_list;
typedef struct _DBN_BLE_STATE_ typedef struct _DBN_BLE_STATE_
{ {
uint8_t flag; // if need to report uint8_t flag; // if need to report
uint8_t enable; // 是否使能 uint8_t enable; // 是否使能
uint8_t send_flag; uint8_t send_flag;
uint8_t obj_amount; uint8_t obj_amount;
uint8_t cmd; uint8_t cmd;
@@ -126,18 +126,18 @@ extern DBN_BLE_State g_dbn_ble_state_acs_enable;
typedef enum typedef enum
{ {
SENS_NONE = 0, SENS_NONE = 0,
SENS_SUB_INFO = 1, // 传感器设备信息 SENS_SUB_INFO = 1, // 传感器设备信息
SENS_OBJ_DYNAMIC = 2, // 动态目标类型 SENS_OBJ_DYNAMIC = 2, // 动态目标类型
SENS_SOUTPUT_STATUS = 3, // 当前开关量输出的状态 SENS_SOUTPUT_STATUS = 3, // 当前开关量输出的状态
SENS_DETAIL_CNG = 4, // 详细配置 SENS_DETAIL_CNG = 4, // 详细配置
SENS_LOOP_DYNAMIC = 5, // 线圈动态信息 SENS_LOOP_DYNAMIC = 5, // 线圈动态信息
SENS_OBJ_BackGround = 6, // SENS_OBJ_BackGround = 6, //
SENS_OBJ_INSIDE = 7, // SENS_OBJ_INSIDE = 7, //
SENS_LOOP_TREND, SENS_LOOP_TREND,
SENS_OBJ_DYNAMIC_SIMPLE, SENS_OBJ_DYNAMIC_SIMPLE,
SENS_OBJ_STATIC_XuJing, //10, 0x0A SENS_OBJ_STATIC_XuJing, //10, 0x0A
SENS_DOBULE_LOOP_ESTIMATE //0x0B, 线圈环境评估 SENS_DOBULE_LOOP_ESTIMATE //0x0B, 线圈环境评估
} SUB_SENS_TYPE; // 传感数据类型 } SUB_SENS_TYPE; // 传感数据类型
@@ -174,7 +174,7 @@ extern Loop_ACS_Info g_loop_acs_info;
#define HOLD_TIME 5*1200 #define HOLD_TIME 5*1200
#define LC_HOLD_TIME 4*1200 //时间4分钟 #define LC_HOLD_TIME 4*1200 //时间4分钟
#define IN_DELAY 10 #define IN_DELAY 10
#define OUT_DELAY 39 #define OUT_DELAY 39
#define PLUSE_DELAY 10 #define PLUSE_DELAY 10
+11 -11
View File
@@ -3,8 +3,8 @@
* Author : WCH * Author : WCH
* Version : V1.0 * Version : V1.0
* Date : 2018/12/10 * Date : 2018/12/10
* Description : 外设从机多连接应用程序,初始化广播连接参数,然后广播,连接主机后, * Description : 外设从机多连接应用程序,初始化广播连接参数,然后广播,连接主机后,
* 请求更新连接参数,通过自定义服务传输数据 * 请求更新连接参数,通过自定义服务传输数据
********************************************************************************* *********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for * Attention: This software (modified or not) and binary are used for
@@ -742,19 +742,19 @@ static void simpleProfileChangeCB(uint8_t paramID, uint8_t *pValue, uint16_t len
} }
} }
/* OTA 升级标志 */ /* OTA 升级标志 */
#define IMAGE_OTA_FLAG 0x03 #define IMAGE_OTA_FLAG 0x03
/* 存放在DataFlash地址,不能占用蓝牙的位置 */ /* 存放在DataFlash地址,不能占用蓝牙的位置 */
#define OTA_DATAFLASH_ADD 0x00077000 - FLASH_ROM_MAX_SIZE #define OTA_DATAFLASH_ADD 0x00077000 - FLASH_ROM_MAX_SIZE
/* flash的数据临时存储 */ /* flash的数据临时存储 */
__attribute__((aligned(8))) uint8_t block_buf[16]; __attribute__((aligned(8))) uint8_t block_buf[16];
/********************************************************************* /*********************************************************************
* @fn Jump_OTA * @fn Jump_OTA
* *
* @brief 跳转OTA升级 * @brief 跳转OTA升级
* *
* @return none * @return none
*/ */
@@ -763,19 +763,19 @@ void Jump_OTA(void)
uint16_t i; uint16_t i;
uint32_t ver_flag; uint32_t ver_flag;
/* 读取第一块 */ /* 读取第一块 */
EEPROM_READ(OTA_DATAFLASH_ADD, (uint32_t *)&block_buf[0], 4); EEPROM_READ(OTA_DATAFLASH_ADD, (uint32_t *)&block_buf[0], 4);
/* 擦除第一块 */ /* 擦除第一块 */
EEPROM_ERASE(OTA_DATAFLASH_ADD, EEPROM_PAGE_SIZE); EEPROM_ERASE(OTA_DATAFLASH_ADD, EEPROM_PAGE_SIZE);
/* 更新Image信息 */ /* 更新Image信息 */
block_buf[0] = IMAGE_OTA_FLAG; block_buf[0] = IMAGE_OTA_FLAG;
/* 编程DataFlash */ /* 编程DataFlash */
EEPROM_WRITE(OTA_DATAFLASH_ADD, (uint32_t *)&block_buf[0], 4); EEPROM_WRITE(OTA_DATAFLASH_ADD, (uint32_t *)&block_buf[0], 4);
/* 软复位 */ /* 软复位 */
SYS_ResetExecute(); SYS_ResetExecute();
} }
+147 -147
View File
@@ -3,15 +3,15 @@
* Author : WCH / wangfq * Author : WCH / wangfq
* Version : V2.0 (algorithm ported from DLD154V4B) * Version : V2.0 (algorithm ported from DLD154V4B)
* Date : 2026/07/18 * Date : 2026/07/18
* Description : DLD110SV4 单线圈蓝牙车检器 主函数 * Description : DLD110SV4 单线圈蓝牙车检器 主函数
* *
* 算法说明 (移植自 DLD154V4B TaskLoop V2.0, M1H 精简系): * 算法说明 (移植自 DLD154V4B TaskLoop V2.0, M1H 精简系):
* - 自适应测量窗: LPCNT = MEASUREMENT_BASE / Xn, 测量窗时长与线圈频率无关 * - 自适应测量窗: LPCNT = MEASUREMENT_BASE / Xn, 测量窗时长与线圈频率无关
* - 一阶 IIR (79/256) + 斜率限幅 5% (拒绝 EMI 瞬态尖峰) * - 一阶 IIR (79/256) + 斜率限幅 5% (拒绝 EMI 瞬态尖峰)
* - 稳定期 128 窗快速收敛 (绕过滤波, 小窗口 100) * - 稳定期 128 窗快速收敛 (绕过滤波, 小窗口 100)
* - 基线跟踪 窗口 500 + 冻结保护 (超时 + 稳定性双条件强制更新) * - 基线跟踪 窗口 500 + 冻结保护 (超时 + 稳定性双条件强制更新)
* - 进入确认 3 次; 离开: 平坦性三条件判定 (专利 CN200910309382) * - 进入确认 3 次; 离开: 平坦性三条件判定 (专利 CN200910309382)
* - 有限存在超时 / 安全复位: 全复位重建基线 * - 有限存在超时 / 安全复位: 全复位重建基线
********************************************************************************* *********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for * Attention: This software (modified or not) and binary are used for
@@ -19,7 +19,7 @@
*******************************************************************************/ *******************************************************************************/
/******************************************************************************/ /******************************************************************************/
/* 头文件包含 */ /* 头文件包含 */
#include "CONFIG.h" #include "CONFIG.h"
#include "HAL.h" #include "HAL.h"
#include "gattprofile.h" #include "gattprofile.h"
@@ -30,7 +30,7 @@
#include "dbn_ble_srv.h" #include "dbn_ble_srv.h"
uint8_t g_flag_bt_state = 0; // 0 蓝牙没有连接,1 有蓝牙连接 uint8_t g_flag_bt_state = 0; // 0 蓝牙没有连接,1 有蓝牙连接
uint8_t g_flag_output = 0; uint8_t g_flag_output = 0;
uint32_t g_xn_counter = 0; uint32_t g_xn_counter = 0;
uint8_t g_function_mode = 0; uint8_t g_function_mode = 0;
@@ -51,27 +51,27 @@ uint8_t g_function_mode = 0;
#define KEY_SA2 (GPIOA_ReadPortPin(GPIO_Pin_15)) #define KEY_SA2 (GPIOA_ReadPortPin(GPIO_Pin_15))
const uint8_t MAX_Store_Size = 80; const uint8_t MAX_Store_Size = 80;
uint8_t g_loop_power_up_state = 0; // 开机启动时线圈是否连接 uint8_t g_loop_power_up_state = 0; // 开机启动时线圈是否连接
__IO uint32_t TimingDelayInc; __IO uint32_t TimingDelayInc;
/*=========================================================================== /*===========================================================================
* 算法参数 -- 移植自 DLD154V4B (M4 优化版), 适配 CH591R @60MHz * 算法参数 -- 移植自 DLD154V4B (M4 优化版), 适配 CH591R @60MHz
* *
* 测量窗: MEASUREMENT_BASE 个系统时钟 tick, 与线圈频率无关 * 测量窗: MEASUREMENT_BASE 个系统时钟 tick, 与线圈频率无关
* 524288(2^19) / 60MHz ~= 8.74ms, 即 vd1_task 有效采样周期 ~8.74ms * 524288(2^19) / 60MHz ~= 8.74ms, 即 vd1_task 有效采样周期 ~8.74ms
* (DLD154V4B 为 131072 @120MHz + 10ms 任务轮询, 时间尺度基本一致) * (DLD154V4B 为 131072 @120MHz + 10ms 任务轮询, 时间尺度基本一致)
*===========================================================================*/ *===========================================================================*/
#define MEASUREMENT_BASE 524288L // 2^19, 自适应测量窗目标值 (Value ~= 524288) #define MEASUREMENT_BASE 524288L // 2^19, 自适应测量窗目标值 (Value ~= 524288)
#define ALFA_CAP1 79 // IIR a=79/256~=0.31 (@8.74ms -> tau~=24ms) #define ALFA_CAP1 79 // IIR a=79/256~=0.31 (@8.74ms -> tau~=24ms)
#define MAX_SLOPE_RATE 5 // 斜率限幅: 单次最大变化 5% (拒绝 EMI 尖峰) #define MAX_SLOPE_RATE 5 // 斜率限幅: 单次最大变化 5% (拒绝 EMI 尖峰)
#define ENTRY_CONFIRM 3 // 进入确认: 连续 N 次低于阈值才判有车 #define ENTRY_CONFIRM 3 // 进入确认: 连续 N 次低于阈值才判有车
#define FREEZE_TIMEOUT 1000 // 基线冻结超时: ~8.7s, 持续偏高且稳定后强制更新 #define FREEZE_TIMEOUT 1000 // 基线冻结超时: ~8.7s, 持续偏高且稳定后强制更新
#define FREEZE_STABILITY_RATE 2 // 冻结稳定性窗口: 参考值 +-2% #define FREEZE_STABILITY_RATE 2 // 冻结稳定性窗口: 参考值 +-2%
#define USE_FLATNESS_EXIT 1 // 1=平坦性三条件离开, 0=简单滞回防抖 #define USE_FLATNESS_EXIT 1 // 1=平坦性三条件离开, 0=简单滞回防抖
#define WINDOW_ORIGIN 500 // 基线跟踪窗口 (500 窗 ~= 4.4s) #define WINDOW_ORIGIN 500 // 基线跟踪窗口 (500 窗 ~= 4.4s)
#define STABLE_SAMPLES 128 // 稳定期样本数 (~1.1s) #define STABLE_SAMPLES 128 // 稳定期样本数 (~1.1s)
#define VARIATION_EVENT_TH 40 // BLE variation 事件阈值 (幅值基准 2^19, 对应旧代码的 5) #define VARIATION_EVENT_TH 40 // BLE variation 事件阈值 (幅值基准 2^19, 对应旧代码的 5)
#define ENV_ACT_TH 30 // 环境活跃度: CAPVD 相邻差绝对值阈值 (待现场验证) #define ENV_ACT_TH 30 // 环境活跃度: CAPVD 相邻差绝对值阈值 (待现场验证)
uint32_t mstick(void){ uint32_t mstick(void){
return TimingDelayInc; return TimingDelayInc;
@@ -93,7 +93,7 @@ const uint8_t MacAddr[6] = {0x84, 0xC2, 0xE4, 0x03, 0x02, 0x02};
uint8_t MACAddr[6] = {0x84, 0xC2, 0xE4, 0x03, 0x02, 0x02}; uint8_t MACAddr[6] = {0x84, 0xC2, 0xE4, 0x03, 0x02, 0x02};
#endif #endif
uint8_t g_dev_number[6] = ""; // 设备编号 产品编号 uint8_t g_dev_number[6] = ""; // 设备编号 产品编号
char g_flag_debug = 1; char g_flag_debug = 1;
@@ -109,27 +109,27 @@ uint8_t TM1cnt = 0;
uint16_t g_hold_time = 0; uint16_t g_hold_time = 0;
/*=========================================================================== /*===========================================================================
* 捕获 & 测量 * 捕获 & 测量
*===========================================================================*/ *===========================================================================*/
uint16_t loop1_Xn; // 相邻下降沿周期 (TMR0 直接给出) uint16_t loop1_Xn; // 相邻下降沿周期 (TMR0 直接给出)
uint32_t loop1_dlt_ORG; // 当前灵敏度阈值 uint32_t loop1_dlt_ORG; // 当前灵敏度阈值
uint32_t loop1_Origin; // 基线 (无车参考值) uint32_t loop1_Origin; // 基线 (无车参考值)
uint16_t loop1_LPCNT; // 每个测量窗累加的 Xn 个数 uint16_t loop1_LPCNT; // 每个测量窗累加的 Xn 个数
uint16_t loop1_CapCnt; // 当前窗口已累加次数 uint16_t loop1_CapCnt; // 当前窗口已累加次数
uint32_t loop1_CapSum; // 当前窗口累加和 uint32_t loop1_CapSum; // 当前窗口累加和
uint32_t loop1_CAPVD; // IIR 滤波后的测量值 uint32_t loop1_CAPVD; // IIR 滤波后的测量值
uint32_t loop1_Value; // 一个测量窗的原始 Sigma-Xn uint32_t loop1_Value; // 一个测量窗的原始 Sigma-Xn
uint32_t loop1_ORG_SUM; // 基线跟踪累加和 uint32_t loop1_ORG_SUM; // 基线跟踪累加和
uint16_t loop1_ORG_CNT; // 基线跟踪计数 uint16_t loop1_ORG_CNT; // 基线跟踪计数
/*=========================================================================== /*===========================================================================
* 计数器 * 计数器
*===========================================================================*/ *===========================================================================*/
uint8_t loop1_INCNT; uint8_t loop1_INCNT;
uint8_t loop1_OUTCNT; uint8_t loop1_OUTCNT;
/*=========================================================================== /*===========================================================================
* 标志位 * 标志位
*===========================================================================*/ *===========================================================================*/
uint8_t loop1_INI_LOOP; uint8_t loop1_INI_LOOP;
uint8_t loop1_CAP_OK; uint8_t loop1_CAP_OK;
@@ -144,48 +144,48 @@ uint8_t loop1_FLAG_PLUSE;
uint8_t loop1_FLAG_PLUSE_IN_F = 0; uint8_t loop1_FLAG_PLUSE_IN_F = 0;
uint8_t loop1_FLAG_PLUSE_IN = 0; uint8_t loop1_FLAG_PLUSE_IN = 0;
uint8_t loop1_FLAG_CUT; uint8_t loop1_FLAG_CUT;
uint8_t loop1_FLAG_HOLD_TIMEOUT; // 有限存在超时 uint8_t loop1_FLAG_HOLD_TIMEOUT; // 有限存在超时
/*=========================================================================== /*===========================================================================
* 安全复位 * 安全复位
*===========================================================================*/ *===========================================================================*/
uint8_t loop1_LC_HOLD = 0; uint8_t loop1_LC_HOLD = 0;
uint8_t loop1_LC_Reset = 0; uint8_t loop1_LC_Reset = 0;
uint32_t LC_Hold_CNT = 0; uint32_t LC_Hold_CNT = 0;
/*=========================================================================== /*===========================================================================
* 新算法状态 (DLD154V4B 移植) * 新算法状态 (DLD154V4B 移植)
*===========================================================================*/ *===========================================================================*/
uint8_t g_loop_stable = 0; // 线圈数值已稳定 (0=稳定期中, 1=稳定) uint8_t g_loop_stable = 0; // 线圈数值已稳定 (0=稳定期中, 1=稳定)
uint16_t loop1_stable_cnt = 0; // 稳定期样本计数 uint16_t loop1_stable_cnt = 0; // 稳定期样本计数
uint8_t loop1_entry_cnt = 0; // 进入确认计数 uint8_t loop1_entry_cnt = 0; // 进入确认计数
uint8_t loop1_cnt_release = 0; // 简单离开防抖计数 (USE_FLATNESS_EXIT=0) uint8_t loop1_cnt_release = 0; // 简单离开防抖计数 (USE_FLATNESS_EXIT=0)
uint16_t loop1_freeze_cnt = 0; // 基线冻结持续计数 uint16_t loop1_freeze_cnt = 0; // 基线冻结持续计数
uint32_t loop1_freeze_ref = 0; // 冻结稳定性参考值 uint32_t loop1_freeze_ref = 0; // 冻结稳定性参考值
#if USE_FLATNESS_EXIT #if USE_FLATNESS_EXIT
uint8_t g_exit_state = 0; // 0=追踪坡面, 1=等待平坦 uint8_t g_exit_state = 0; // 0=追踪坡面, 1=等待平坦
uint16_t g_max_slope = 0; // 第一上升坡面最大 |f'| uint16_t g_max_slope = 0; // 第一上升坡面最大 |f'|
uint16_t g_max_slope_rate = 0; // 第一上升坡面最大 |f''| uint16_t g_max_slope_rate = 0; // 第一上升坡面最大 |f''|
uint16_t g_delta2 = 0; // 一阶平坦阈值 uint16_t g_delta2 = 0; // 一阶平坦阈值
uint16_t g_delta3 = 0; // 二阶平坦阈值 uint16_t g_delta3 = 0; // 二阶平坦阈值
int32_t g_prev_capvd = 0; // 上一帧 CAPVD (差分用) int32_t g_prev_capvd = 0; // 上一帧 CAPVD (差分用)
int32_t g_prev_first_deriv = 0; // 上一帧一阶导数 int32_t g_prev_first_deriv = 0; // 上一帧一阶导数
uint8_t g_slope_flat_cnt = 0; // 斜率趋零连续计数 uint8_t g_slope_flat_cnt = 0; // 斜率趋零连续计数
uint8_t g_flat_ok_cnt = 0; // 平坦条件满足连续计数 uint8_t g_flat_ok_cnt = 0; // 平坦条件满足连续计数
#endif #endif
/* 环境活跃度 (供 BLE condition 字段上报, 替代旧 flt_mgr.cnt_not_idle) */ /* 环境活跃度 (供 BLE condition 字段上报, 替代旧 flt_mgr.cnt_not_idle) */
uint8_t g_env_activity = 0; uint8_t g_env_activity = 0;
uint32_t g_env_prev_capvd = 0; uint32_t g_env_prev_capvd = 0;
/*=========================================================================== /*===========================================================================
* 出厂灵敏度默认表 (写入 g_loop_sens_list, 运行时以 g_loop_sens_list 为准) * 出厂灵敏度默认表 (写入 g_loop_sens_list, 运行时以 g_loop_sens_list 为准)
* 进入阈值 = Origin * sens_in / 65536; 离开阈值 = Origin * sens_out / 65536 * 进入阈值 = Origin * sens_in / 65536; 离开阈值 = Origin * sens_out / 65536
*===========================================================================*/ *===========================================================================*/
const uint16_t SensTable[MAX_LOOP_SENS_AMOUNT] = { 108, 54, 28}; const uint16_t SensTable[MAX_LOOP_SENS_AMOUNT] = { 108, 54, 28};
const uint16_t SensTable1[MAX_LOOP_SENS_AMOUNT] = {81, 32, 16}; const uint16_t SensTable1[MAX_LOOP_SENS_AMOUNT] = {81, 32, 16};
uint16_t g_loop_out_delay = 10; // 离开延时, 50ms 为单位, 由 delay_time 配置 uint16_t g_loop_out_delay = 10; // 离开延时, 50ms 为单位, 由 delay_time 配置
DBN_BLE_State g_dbn_ble_state_acs_enable = {0}; DBN_BLE_State g_dbn_ble_state_acs_enable = {0};
Loop_ACS_Info g_loop_acs_info = {0,}; Loop_ACS_Info g_loop_acs_info = {0,};
@@ -193,7 +193,7 @@ Loop_ACS_Info g_loop_acs_info = {0,};
float g_freq_tmp = 0.0; float g_freq_tmp = 0.0;
/* 用于APP判断文件有效性 */ /* 用于APP判断文件有效性 */
const uint32_t Address = 0xFFFFFFFF; const uint32_t Address = 0xFFFFFFFF;
__attribute__((aligned(4))) uint32_t Image_Flag __attribute__((section(".ImageFlag"))) = (uint32_t)&Address; __attribute__((aligned(4))) uint32_t Image_Flag __attribute__((section(".ImageFlag"))) = (uint32_t)&Address;
@@ -263,7 +263,7 @@ void poll_sens_key(void)
static uint8_t _last_sens = 3; static uint8_t _last_sens = 3;
#if DEBUG #if DEBUG
g_freq_sens = 2; // 默认最高灵敏度 g_freq_sens = 2; // 默认最高灵敏度
#else #else
if(KEY_SA1){ if(KEY_SA1){
if(KEY_SA2){ if(KEY_SA2){
@@ -285,7 +285,7 @@ void poll_sens_key(void)
} }
if(_last_sens != g_freq_sens){ if(_last_sens != g_freq_sens){
/* 灵敏度阈值每周期由 g_loop_sens_list 实时计算, 无需重载 */ /* 灵敏度阈值每周期由 g_loop_sens_list 实时计算, 无需重载 */
_last_sens = g_freq_sens; _last_sens = g_freq_sens;
} }
@@ -309,7 +309,7 @@ void para_store_init(void)
poll_sens_key(); poll_sens_key();
g_loop_out_delay = g_loop_cng_unit.delay_time * 2; // 定时器以 50ms 为单位, 延时以100ms为单位 g_loop_out_delay = g_loop_cng_unit.delay_time * 2; // 定时器以 50ms 为单位, 延时以100ms为单位
g_hold_time = g_loop_cng_unit.exist_mode * 30 * 20; //50ms/per, 30s g_hold_time = g_loop_cng_unit.exist_mode * 30 * 20; //50ms/per, 30s
g_safe_max_cnt = g_loop_cng_unit.loopSafe_Timeout * 10 * (1000 / 50); g_safe_max_cnt = g_loop_cng_unit.loopSafe_Timeout * 10 * (1000 / 50);
g_freq_level = g_loop_cng_unit.loopFreq_Level - 1; g_freq_level = g_loop_cng_unit.loopFreq_Level - 1;
@@ -322,23 +322,23 @@ void para_store_init(void)
switch(g_freq_level) switch(g_freq_level)
{ {
case 0: { case 0: {
// 高频 // 高频
FLEVEL_H_LOW; FLEVEL_L_LOW; FLEVEL_H_LOW; FLEVEL_L_LOW;
} break; } break;
case 1: { case 1: {
// 中高 // 中高
FLEVEL_H_LOW; FLEVEL_L_HIGH; FLEVEL_H_LOW; FLEVEL_L_HIGH;
} break; } break;
case 2: { case 2: {
// 中低 // 中低
FLEVEL_H_HIGH; FLEVEL_L_LOW; FLEVEL_H_HIGH; FLEVEL_L_LOW;
} break; } break;
case 3: { case 3: {
// 低频 // 低频
FLEVEL_H_HIGH; FLEVEL_L_HIGH; FLEVEL_H_HIGH; FLEVEL_L_HIGH;
} break; } break;
default:{ default:{
// 默认低频 // 默认低频
g_freq_level = 3; g_freq_level = 3;
FLEVEL_H_HIGH; FLEVEL_L_HIGH; FLEVEL_H_HIGH; FLEVEL_L_HIGH;
} break; } break;
@@ -360,7 +360,7 @@ void para_store_init(void)
void tm_init(void){ void tm_init(void){
// Cap 捕获 // Cap 捕获
GPIOA_ResetBits(GPIO_Pin_9); GPIOA_ResetBits(GPIO_Pin_9);
GPIOA_ModeCfg(GPIO_Pin_9, GPIO_ModeIN_Floating); GPIOA_ModeCfg(GPIO_Pin_9, GPIO_ModeIN_Floating);
@@ -372,29 +372,29 @@ void tm_init(void){
// TMR1 // TMR1
TMR1_TimerInit(FREQ_SYS / 200); // 设置定时时间 5ms TMR1_TimerInit(FREQ_SYS / 200); // 设置定时时间 5ms
TMR1_ITCfg(ENABLE, TMR0_3_IT_CYC_END); // 开启中断 TMR1_ITCfg(ENABLE, TMR0_3_IT_CYC_END); // 开启中断
PFIC_EnableIRQ(TMR1_IRQn); PFIC_EnableIRQ(TMR1_IRQn);
} }
void gpio_uart_init(void) void gpio_uart_init(void)
{ {
/* 配置串口0:先配置IO口模式,再配置串口 */ /* 配置串口0:先配置IO口模式,再配置串口 */
#ifdef DEBUG #ifdef DEBUG
GPIOPinRemap(ENABLE, RB_PIN_UART0); GPIOPinRemap(ENABLE, RB_PIN_UART0);
GPIOA_SetBits(GPIO_Pin_14); GPIOA_SetBits(GPIO_Pin_14);
GPIOA_ModeCfg(GPIO_Pin_14, GPIO_ModeOut_PP_5mA); // TXD-配置推挽输出,注意先让IO口输出高电平 GPIOA_ModeCfg(GPIO_Pin_14, GPIO_ModeOut_PP_5mA); // TXD-配置推挽输出,注意先让IO口输出高电平
UART0_BaudRateCfg(230400); //115200 UART0_BaudRateCfg(230400); //115200
R8_UART0_FCR = (2 << 6) | RB_FCR_TX_FIFO_CLR | RB_FCR_RX_FIFO_CLR | RB_FCR_FIFO_EN; // FIFO打开,触发点4字节 R8_UART0_FCR = (2 << 6) | RB_FCR_TX_FIFO_CLR | RB_FCR_RX_FIFO_CLR | RB_FCR_FIFO_EN; // FIFO打开,触发点4字节
R8_UART0_LCR = RB_LCR_WORD_SZ; R8_UART0_LCR = RB_LCR_WORD_SZ;
R8_UART0_IER = RB_IER_TXD_EN; R8_UART0_IER = RB_IER_TXD_EN;
R8_UART0_DIV = 1; R8_UART0_DIV = 1;
GPIOA_ModeCfg(GPIO_Pin_15, GPIO_ModeIN_PU); // 拨动开关,调节灵敏度 GPIOA_ModeCfg(GPIO_Pin_15, GPIO_ModeIN_PU); // 拨动开关,调节灵敏度
#else #else
GPIOA_ModeCfg(GPIO_Pin_15|GPIO_Pin_14, GPIO_ModeIN_PU); // 拨动开关,调节灵敏度 GPIOA_ModeCfg(GPIO_Pin_15|GPIO_Pin_14, GPIO_ModeIN_PU); // 拨动开关,调节灵敏度
#endif #endif
@@ -413,7 +413,7 @@ void gpio_uart_init(void)
/*=========================================================================== /*===========================================================================
* 一阶 IIR 低通滤波器 (对齐 M1H 公式) * 一阶 IIR 低通滤波器 (对齐 M1H 公式)
* CAPVD_new = a * new_value + (1-a) * CAPVD_old, a = Flt_Reg/256 * CAPVD_new = a * new_value + (1-a) * CAPVD_old, a = Flt_Reg/256
*===========================================================================*/ *===========================================================================*/
uint32_t get_flt_value(uint32_t new_value, uint32_t last_Value) { uint32_t get_flt_value(uint32_t new_value, uint32_t last_Value) {
@@ -432,8 +432,8 @@ uint32_t get_flt_value(uint32_t new_value, uint32_t last_Value) {
/*=========================================================================== /*===========================================================================
* 滑动平均基线更新 * 滑动平均基线更新
* 注意: window 必须是 uint16_t (WINDOW_ORIGIN=500 > 255, uint8_t 会静默截断) * 注意: window 必须是 uint16_t (WINDOW_ORIGIN=500 > 255, uint8_t 会静默截断)
*===========================================================================*/ *===========================================================================*/
void update_moving_average(uint32_t* p_sum, uint16_t* p_cnt, uint32_t* p_origin, uint32_t new_value, uint16_t window) { void update_moving_average(uint32_t* p_sum, uint16_t* p_cnt, uint32_t* p_origin, uint32_t new_value, uint16_t window) {
if (!p_sum || !p_cnt || !p_origin || window == 0) { if (!p_sum || !p_cnt || !p_origin || window == 0) {
@@ -452,8 +452,8 @@ void update_moving_average(uint32_t* p_sum, uint16_t* p_cnt, uint32_t* p_origin,
/*=========================================================================== /*===========================================================================
* 初始化所有检测状态 (上电 / 有限存在超时 / 线圈重连 时调用) * 初始化所有检测状态 (上电 / 有限存在超时 / 线圈重连 时调用)
* 注意: 不复位 g_loop_power_up_state / g_loop_cut_amount (BLE 上报用) * 注意: 不复位 g_loop_power_up_state / g_loop_cut_amount (BLE 上报用)
*===========================================================================*/ *===========================================================================*/
void INIT_VD(void) void INIT_VD(void)
{ {
@@ -493,7 +493,7 @@ void INIT_VD(void)
loop1_LC_Reset = 0; loop1_LC_Reset = 0;
LC_Hold_CNT = 0; LC_Hold_CNT = 0;
/* 新算法状态 */ /* 新算法状态 */
g_loop_stable = 0; g_loop_stable = 0;
loop1_stable_cnt = 0; loop1_stable_cnt = 0;
loop1_entry_cnt = 0; loop1_entry_cnt = 0;
@@ -519,7 +519,7 @@ void INIT_VD(void)
/*=========================================================================== /*===========================================================================
* 车辆离开 / 释放 公共处理 * 车辆离开 / 释放 公共处理
*===========================================================================*/ *===========================================================================*/
static void loop_release_common(void) static void loop_release_common(void)
{ {
@@ -539,19 +539,19 @@ static void loop_release_common(void)
/*=========================================================================== /*===========================================================================
* vd1_task -- 核心检测算法 (移植 DLD154V4B, 每次 CAP_OK 调用, ~8.74ms) * vd1_task -- 核心检测算法 (移植 DLD154V4B, 每次 CAP_OK 调用, ~8.74ms)
* *
* 流程: * 流程:
* 1. IIR 滤波 + 斜率限幅 * 1. IIR 滤波 + 斜率限幅
* 2. 稳定期: 小窗口快速收敛基线 * 2. 稳定期: 小窗口快速收敛基线
* 3. 无车: 基线跟踪 (冻结保护) + 进入确认 * 3. 无车: 基线跟踪 (冻结保护) + 进入确认
* 4. 有车: 平坦性三条件离开判定 (带滞回) * 4. 有车: 平坦性三条件离开判定 (带滞回)
*===========================================================================*/ *===========================================================================*/
void vd1_task(void){ void vd1_task(void){
if (loop1_Origin == 0) return; if (loop1_Origin == 0) return;
/*--- 1. IIR 滤波 + 斜率限幅 ---*/ /*--- 1. IIR 滤波 + 斜率限幅 ---*/
if (loop1_CAPVD == 0) { if (loop1_CAPVD == 0) {
loop1_CAPVD = loop1_Value; loop1_CAPVD = loop1_Value;
} else { } else {
@@ -565,7 +565,7 @@ void vd1_task(void){
loop1_CAPVD = get_flt_value(clamped_value, loop1_CAPVD); loop1_CAPVD = get_flt_value(clamped_value, loop1_CAPVD);
} }
/*--- 2. 稳定期: 绕过 IIR/斜率限幅, 小窗口快速收敛 ---*/ /*--- 2. 稳定期: 绕过 IIR/斜率限幅, 小窗口快速收敛 ---*/
if (!g_loop_stable) { if (!g_loop_stable) {
loop1_CAPVD = loop1_Value; loop1_CAPVD = loop1_Value;
update_moving_average(&loop1_ORG_SUM, &loop1_ORG_CNT, &loop1_Origin, loop1_CAPVD, 100); update_moving_average(&loop1_ORG_SUM, &loop1_ORG_CNT, &loop1_Origin, loop1_CAPVD, 100);
@@ -577,7 +577,7 @@ void vd1_task(void){
return; return;
} }
/*--- 3. BLE 上报状态刷新 (flag_change 置位期间冻结, 保持事件时刻的值) ---*/ /*--- 3. BLE 上报状态刷新 (flag_change 置位期间冻结, 保持事件时刻的值) ---*/
if (g_loop_acs_info.flag_change == 0) { if (g_loop_acs_info.flag_change == 0) {
int32_t _var = (int32_t)loop1_Origin - (int32_t)loop1_CAPVD; int32_t _var = (int32_t)loop1_Origin - (int32_t)loop1_CAPVD;
g_loop_acs_info.loop_capvd = loop1_CAPVD; g_loop_acs_info.loop_capvd = loop1_CAPVD;
@@ -587,7 +587,7 @@ void vd1_task(void){
} }
} }
/*--- 4. 环境活跃度 (BLE condition 字段, 0~15) ---*/ /*--- 4. 环境活跃度 (BLE condition 字段, 0~15) ---*/
{ {
int32_t d = (int32_t)loop1_CAPVD - (int32_t)g_env_prev_capvd; int32_t d = (int32_t)loop1_CAPVD - (int32_t)g_env_prev_capvd;
if (d < 0) d = -d; if (d < 0) d = -d;
@@ -601,7 +601,7 @@ void vd1_task(void){
if (!loop1_VD_FLAG) { if (!loop1_VD_FLAG) {
/*================================================================ /*================================================================
* 无车状态: 基线跟踪 (冻结保护) + 进入确认 * 无车状态: 基线跟踪 (冻结保护) + 进入确认
*================================================================*/ *================================================================*/
loop1_dlt_ORG = ((uint32_t)loop1_Origin * g_loop_sens_list.sens[g_freq_sens].sens_in) >> 16; loop1_dlt_ORG = ((uint32_t)loop1_Origin * g_loop_sens_list.sens[g_freq_sens].sens_in) >> 16;
{ {
@@ -610,7 +610,7 @@ void vd1_task(void){
loop1_freeze_cnt = 0; loop1_freeze_cnt = 0;
update_moving_average(&loop1_ORG_SUM, &loop1_ORG_CNT, &loop1_Origin, loop1_CAPVD, WINDOW_ORIGIN); update_moving_average(&loop1_ORG_SUM, &loop1_ORG_CNT, &loop1_Origin, loop1_CAPVD, WINDOW_ORIGIN);
} else { } else {
/*--- CAPVD 异常偏高: 暂停跟踪, 冻结超时 + 稳定性双条件 ---*/ /*--- CAPVD 异常偏高: 暂停跟踪, 冻结超时 + 稳定性双条件 ---*/
if (loop1_freeze_cnt == 0) { if (loop1_freeze_cnt == 0) {
loop1_freeze_ref = loop1_CAPVD; loop1_freeze_ref = loop1_CAPVD;
} else { } else {
@@ -623,7 +623,7 @@ void vd1_task(void){
} }
loop1_freeze_cnt++; loop1_freeze_cnt++;
if (loop1_freeze_cnt >= FREEZE_TIMEOUT) { if (loop1_freeze_cnt >= FREEZE_TIMEOUT) {
loop1_Origin = loop1_CAPVD; /* 确认稳定的新常态 */ loop1_Origin = loop1_CAPVD; /* 确认稳定的新常态 */
loop1_freeze_cnt = 0; loop1_freeze_cnt = 0;
loop1_freeze_ref = 0; loop1_freeze_ref = 0;
} }
@@ -632,7 +632,7 @@ void vd1_task(void){
} }
} }
/*--- 进入确认: 连续 ENTRY_CONFIRM 次低于阈值才判有车 ---*/ /*--- 进入确认: 连续 ENTRY_CONFIRM 次低于阈值才判有车 ---*/
if (loop1_CAPVD < (loop1_Origin - loop1_dlt_ORG)) { if (loop1_CAPVD < (loop1_Origin - loop1_dlt_ORG)) {
loop1_entry_cnt++; loop1_entry_cnt++;
if (loop1_entry_cnt >= ENTRY_CONFIRM) { if (loop1_entry_cnt >= ENTRY_CONFIRM) {
@@ -643,11 +643,11 @@ void vd1_task(void){
loop1_VD_FLAG = 1; loop1_VD_FLAG = 1;
loop1_FLAG_IN = 1; loop1_FLAG_IN = 1;
if (g_loop_cng_unit.exist_mode) { /* 有限存在 */ if (g_loop_cng_unit.exist_mode) { /* 有限存在 */
loop1_VD_HOLD = 1; loop1_VD_HOLD = 1;
Hold_CNT = 0; Hold_CNT = 0;
} }
if (g_loop_cng_unit.loopSafe_Timeout) { /* 线圈安全模式: 启动安全复位计时 */ if (g_loop_cng_unit.loopSafe_Timeout) { /* 线圈安全模式: 启动安全复位计时 */
loop1_LC_HOLD = 1; loop1_LC_HOLD = 1;
LC_Hold_CNT = 0; LC_Hold_CNT = 0;
} else { } else {
@@ -665,7 +665,7 @@ void vd1_task(void){
g_loop_acs_info.car_state = 1; g_loop_acs_info.car_state = 1;
#if USE_FLATNESS_EXIT #if USE_FLATNESS_EXIT
/* 重置平坦性状态 (专利 CN200910309382) */ /* 重置平坦性状态 (专利 CN200910309382) */
g_exit_state = 0; g_exit_state = 0;
g_max_slope = 0; g_max_slope = 0;
g_max_slope_rate = 0; g_max_slope_rate = 0;
@@ -684,8 +684,8 @@ void vd1_task(void){
else { else {
#if USE_FLATNESS_EXIT #if USE_FLATNESS_EXIT
/*================================================================ /*================================================================
* 有车状态: 平坦性三条件判定离开 (专利 CN200910309382) * 有车状态: 平坦性三条件判定离开 (专利 CN200910309382)
* 幅值阈值按新测量基准 2^19 缩放 (DLD154V4B: 100/5/2 @2^17) * 幅值阈值按新测量基准 2^19 缩放 (DLD154V4B: 100/5/2 @2^17)
*================================================================*/ *================================================================*/
#define K1 8 #define K1 8
#define K2 8 #define K2 8
@@ -702,7 +702,7 @@ void vd1_task(void){
abs_sd = (second_deriv >= 0) ? second_deriv : -second_deriv; abs_sd = (second_deriv >= 0) ? second_deriv : -second_deriv;
if (g_exit_state == 0) { if (g_exit_state == 0) {
/*--- 阶段0: 追踪第一上升坡面, 自适应计算平坦阈值 ---*/ /*--- 阶段0: 追踪第一上升坡面, 自适应计算平坦阈值 ---*/
if (abs_fd > (int32_t)g_max_slope) g_max_slope = (uint16_t)abs_fd; if (abs_fd > (int32_t)g_max_slope) g_max_slope = (uint16_t)abs_fd;
if (abs_sd > (int32_t)g_max_slope_rate) g_max_slope_rate = (uint16_t)abs_sd; if (abs_sd > (int32_t)g_max_slope_rate) g_max_slope_rate = (uint16_t)abs_sd;
if (abs_fd < SLOPE_FLAT_THRESH) { if (abs_fd < SLOPE_FLAT_THRESH) {
@@ -719,7 +719,7 @@ void vd1_task(void){
g_slope_flat_cnt = 0; g_slope_flat_cnt = 0;
} }
} else { } else {
/*--- 阶段1: 幅值回归 + 一阶平坦 + 二阶平坦 三条件确认离开 ---*/ /*--- 阶段1: 幅值回归 + 一阶平坦 + 二阶平坦 三条件确认离开 ---*/
int32_t dev = (int32_t)loop1_CAPVD - (int32_t)loop1_Origin; int32_t dev = (int32_t)loop1_CAPVD - (int32_t)loop1_Origin;
int32_t cond1 = (dev >= 0) ? dev : -dev; int32_t cond1 = (dev >= 0) ? dev : -dev;
loop1_dlt_ORG = ((uint32_t)loop1_Origin * g_loop_sens_list.sens[g_freq_sens].sens_out) >> 16; loop1_dlt_ORG = ((uint32_t)loop1_Origin * g_loop_sens_list.sens[g_freq_sens].sens_out) >> 16;
@@ -739,7 +739,7 @@ void vd1_task(void){
g_prev_first_deriv = first_deriv; g_prev_first_deriv = first_deriv;
#else #else
/*================================================================ /*================================================================
* 有车状态: 简单滞回 + 防抖离开 * 有车状态: 简单滞回 + 防抖离开
*================================================================*/ *================================================================*/
loop1_dlt_ORG = ((uint32_t)loop1_Origin * g_loop_sens_list.sens[g_freq_sens].sens_out) >> 16; loop1_dlt_ORG = ((uint32_t)loop1_Origin * g_loop_sens_list.sens[g_freq_sens].sens_out) >> 16;
@@ -758,33 +758,33 @@ void vd1_task(void){
/*=========================================================================== /*===========================================================================
* cjq_srv -- 车检器主循环服务 * cjq_srv -- 车检器主循环服务
* - 有限存在超时 / 线圈断开重连: 全复位重建基线 * - 有限存在超时 / 线圈断开重连: 全复位重建基线
* (线圈仍被占用时, 新基线落在占用值上, 继电器保持释放 -- 对齐 M1H 行为) * (线圈仍被占用时, 新基线落在占用值上, 继电器保持释放 -- 对齐 M1H 行为)
* - CAP_OK 到达时执行核心检测算法 * - CAP_OK 到达时执行核心检测算法
*===========================================================================*/ *===========================================================================*/
void cjq_srv(void){ void cjq_srv(void){
if(loop1_LOOP_OK){ if(loop1_LOOP_OK){
if(loop1_FLAG_HOLD_TIMEOUT){ if(loop1_FLAG_HOLD_TIMEOUT){
/* 有限存在超时: 全复位, 重新经历稳定期重建基线 */ /* 有限存在超时: 全复位, 重新经历稳定期重建基线 */
INIT_VD(); INIT_VD();
return; return;
} }
if(loop1_FLAG_CUT){ if(loop1_FLAG_CUT){
/* 线圈断开后重连: 全复位, 重新自适应测量窗并重建基线 */ /* 线圈断开后重连: 全复位, 重新自适应测量窗并重建基线 */
g_loop_cut_last = 0; g_loop_cut_last = 0;
INIT_VD(); INIT_VD();
return; return;
} }
if(!loop1_LOOP_OK0){ if(!loop1_LOOP_OK0){
DelayMs(200); /* 线圈重新起振后等待 200ms 再消费数据 */ DelayMs(200); /* 线圈重新起振后等待 200ms 再消费数据 */
loop1_LOOP_OK0 = 1; loop1_LOOP_OK0 = 1;
} }
if(loop1_CAP_OK){ if(loop1_CAP_OK){
loop1_CAP_OK = 0; loop1_CAP_OK = 0;
if(!g_loop_power_up_state){ if(!g_loop_power_up_state){
g_loop_power_up_state = 1; // 表示连接了线圈 g_loop_power_up_state = 1; // 表示连接了线圈
} }
vd1_task(); vd1_task();
poll_sens_key(); poll_sens_key();
@@ -799,7 +799,7 @@ void cjq_srv(void){
loop1_FLAG_PLUSE_IN_F = 0; loop1_FLAG_PLUSE_IN_F = 0;
loop1_FLAG_PLUSE_IN = 0; loop1_FLAG_PLUSE_IN = 0;
// 线圈断开: 继电器释放, 车辆状态清零 // 线圈断开: 继电器释放, 车辆状态清零
RLY1_OFF; RLY2_OFF; RLY1_OFF; RLY2_OFF;
g_loop_acs_info.relay1_state = 0; g_loop_acs_info.relay1_state = 0;
g_loop_acs_info.relay2_state = 0; g_loop_acs_info.relay2_state = 0;
@@ -824,7 +824,7 @@ void cjq_srv(void){
/********************************************************************* /*********************************************************************
* @fn Main_Circulation * @fn Main_Circulation
* *
* @brief 主循环 * @brief 主循环
* *
* @return none * @return none
*/ */
@@ -843,7 +843,7 @@ void Main_Circulation()
cjq_srv(); cjq_srv();
if(g_flag_bt_state == 0){ if(g_flag_bt_state == 0){
// 如果蓝牙断开,主动上报需要禁用 // 如果蓝牙断开,主动上报需要禁用
if(g_dbn_ble_state_acs_enable.enable){ if(g_dbn_ble_state_acs_enable.enable){
g_dbn_ble_state_acs_enable.enable = 0; g_dbn_ble_state_acs_enable.enable = 0;
} }
@@ -867,7 +867,7 @@ void Main_Circulation()
/********************************************************************* /*********************************************************************
* @fn main * @fn main
* *
* @brief 主函数 * @brief 主函数
* *
* @return none * @return none
*/ */
@@ -907,15 +907,15 @@ int main(void)
/* @fn TMR0_IRQHandler /* @fn TMR0_IRQHandler
* *
* @brief TMR0 输入捕获中断 -- 线圈频率测量 * @brief TMR0 输入捕获中断 -- 线圈频率测量
* FallEdge_To_FallEdge 模式, CAPGetData 直接给出相邻下降沿周期 Xn * FallEdge_To_FallEdge 模式, CAPGetData 直接给出相邻下降沿周期 Xn
* 累加 LPCNT 次 -> 一个测量窗 Value (~= MEASUREMENT_BASE) * 累加 LPCNT 次 -> 一个测量窗 Value (~= MEASUREMENT_BASE)
* *
* @return none * @return none
*/ */
__INTERRUPT __INTERRUPT
__HIGH_CODE __HIGH_CODE
void TMR0_IRQHandler(void) // TMR0 捕获中断 void TMR0_IRQHandler(void) // TMR0 捕获中断
{ {
if(TMR0_GetITFlag(TMR0_3_IT_DATA_ACT)){ if(TMR0_GetITFlag(TMR0_3_IT_DATA_ACT)){
loop1_Xn = (uint16_t)TMR0_CAPGetData(); loop1_Xn = (uint16_t)TMR0_CAPGetData();
@@ -936,12 +936,12 @@ void TMR0_IRQHandler(void) // TMR0
loop1_CapCnt++; loop1_CapCnt++;
if(loop1_INI_LOOP){ if(loop1_INI_LOOP){
/*--- 初始化阶段 ---*/ /*--- 初始化阶段 ---*/
if(loop1_LPCNT == 0){ if(loop1_LPCNT == 0){
if(loop1_CapCnt > 200){ /* 上电/换频后等待振荡稳定 */ if(loop1_CapCnt > 200){ /* 上电/换频后等待振荡稳定 */
uint32_t lpcnt = (uint32_t)MEASUREMENT_BASE / loop1_Xn; uint32_t lpcnt = (uint32_t)MEASUREMENT_BASE / loop1_Xn;
if(lpcnt == 0 || lpcnt > 65535){ if(lpcnt == 0 || lpcnt > 65535){
lpcnt = 100; /* 异常 Xn 保护 */ lpcnt = 100; /* 异常 Xn 保护 */
} }
loop1_LPCNT = (uint16_t)lpcnt; loop1_LPCNT = (uint16_t)lpcnt;
@@ -953,7 +953,7 @@ void TMR0_IRQHandler(void) // TMR0
} }
} }
else{ else{
/* 第一个测量窗: 直接作为基线 Origin */ /* 第一个测量窗: 直接作为基线 Origin */
loop1_CapSum += loop1_Xn; loop1_CapSum += loop1_Xn;
if(loop1_CapCnt >= loop1_LPCNT){ if(loop1_CapCnt >= loop1_LPCNT){
loop1_CAPVD = loop1_CapSum; loop1_CAPVD = loop1_CapSum;
@@ -969,7 +969,7 @@ void TMR0_IRQHandler(void) // TMR0
} }
}// end if loop1_INI_LOOP }// end if loop1_INI_LOOP
else { else {
/*--- 正常运行: 累加到测量窗 ---*/ /*--- 正常运行: 累加到测量窗 ---*/
loop1_CapSum += loop1_Xn; loop1_CapSum += loop1_Xn;
if(loop1_CapCnt >= loop1_LPCNT){ if(loop1_CapCnt >= loop1_LPCNT){
@@ -990,7 +990,7 @@ void TMR0_IRQHandler(void) // TMR0
/********************************************************************* /*********************************************************************
* @fn TMR1_IRQHandler * @fn TMR1_IRQHandler
* *
* @brief TMR1 定时中断 5ms/per -- 时序状态机 / 继电器输出 / LED * @brief TMR1 定时中断 5ms/per -- 时序状态机 / 继电器输出 / LED
* *
* @return none * @return none
*/ */
@@ -1020,7 +1020,7 @@ void TMR1_IRQHandler(void)
TimingDelayInc++; TimingDelayInc++;
u32CountWdt++; u32CountWdt++;
/*--- LED: 稳定期 200ms 快闪; 线圈断开 150ms 快闪 ---*/ /*--- LED: 稳定期 200ms 快闪; 线圈断开 150ms 快闪 ---*/
if(loop1_FLAG_CUT == 0) if(loop1_FLAG_CUT == 0)
{ {
if(!g_loop_stable) if(!g_loop_stable)
@@ -1047,12 +1047,12 @@ void TMR1_IRQHandler(void)
if(TM1cnt >= 10) //about=50ms if(TM1cnt >= 10) //about=50ms
{ {
TM1cnt = 0; TM1cnt = 0;
if(loop1_FLAG_IN) // 线圈1 从无车到有车 if(loop1_FLAG_IN) // 线圈1 从无车到有车
{ {
loop1_FLAG_OUT = 0; loop1_FLAG_OUT = 0;
loop1_OUTCNT = 0; loop1_OUTCNT = 0;
loop1_FLAG_IN = 0; loop1_FLAG_IN = 0;
if(g_loop_cng_unit.output_mode == 1) // 进入脉冲 if(g_loop_cng_unit.output_mode == 1) // 进入脉冲
{ {
loop1_FLAG_PLUSE_IN_F = 1; loop1_FLAG_PLUSE_IN_F = 1;
} }
@@ -1082,7 +1082,7 @@ void TMR1_IRQHandler(void)
} }
if(loop1_FLAG_OUT) // 从有车到无车的标志 if(loop1_FLAG_OUT) // 从有车到无车的标志
{ {
loop1_OUTCNT++; loop1_OUTCNT++;
if(loop1_OUTCNT > g_loop_out_delay) if(loop1_OUTCNT > g_loop_out_delay)
@@ -1108,13 +1108,13 @@ void TMR1_IRQHandler(void)
if(loop1_VD_HOLD) if(loop1_VD_HOLD)
{ {
Hold_CNT++; Hold_CNT++;
if(Hold_CNT > g_hold_time) // 超过有限存在时间 if(Hold_CNT > g_hold_time) // 超过有限存在时间
{ {
loop1_VD_HOLD = 0; loop1_VD_HOLD = 0;
Hold_CNT = 0; Hold_CNT = 0;
if(loop1_VD_FLAG) if(loop1_VD_FLAG)
{ {
/* 有限存在超时: 释放继电器, 主循环全复位重建基线 */ /* 有限存在超时: 释放继电器, 主循环全复位重建基线 */
loop1_FLAG_HOLD_TIMEOUT = 1; loop1_FLAG_HOLD_TIMEOUT = 1;
RLY1_OFF; RLY2_OFF; RLY1_OFF; RLY2_OFF;
g_loop_acs_info.relay1_state = 0; g_loop_acs_info.relay1_state = 0;
@@ -1128,7 +1128,7 @@ void TMR1_IRQHandler(void)
LC_Hold_CNT++; LC_Hold_CNT++;
if(LC_Hold_CNT > g_safe_max_cnt) if(LC_Hold_CNT > g_safe_max_cnt)
{ {
/* 安全复位: 重新初始化测量, 重建基线 (对齐 M1H) */ /* 安全复位: 重新初始化测量, 重建基线 (对齐 M1H) */
loop1_LC_Reset = 1; loop1_LC_Reset = 1;
loop1_INI_LOOP = 1; loop1_INI_LOOP = 1;
loop1_LOOP_OK0 = 0; loop1_LOOP_OK0 = 0;
@@ -1148,7 +1148,7 @@ void TMR1_IRQHandler(void)
} }
} }
/*--- 线圈载波检测 & 继电器输出刷新 (每 5ms) ---*/ /*--- 线圈载波检测 & 继电器输出刷新 (每 5ms) ---*/
if(loop1_RF_FLAG) if(loop1_RF_FLAG)
{ {
loop1_LOOP_OK = 1; loop1_LOOP_OK = 1;
@@ -1157,10 +1157,10 @@ void TMR1_IRQHandler(void)
if(loop1_LC_Reset == 0) if(loop1_LC_Reset == 0)
{ {
switch(g_loop_cng_unit.output_mode) switch(g_loop_cng_unit.output_mode)
{ // 输出方式 { // 输出方式
case 0: // 存在输出 case 0: // 存在输出
{ {
if(loop1_VD_FLAG | loop1_FLAG_OUT)// 输出存在信号 if(loop1_VD_FLAG | loop1_FLAG_OUT)// 输出存在信号
{ {
RLY1_ON; RLY1_ON;
g_loop_acs_info.relay1_state = 1; g_loop_acs_info.relay1_state = 1;
@@ -1175,9 +1175,9 @@ void TMR1_IRQHandler(void)
g_loop_acs_info.relay2_state = 0; g_loop_acs_info.relay2_state = 0;
} }
} break; } break;
case 1: // 进入脉冲 case 1: // 进入脉冲
{ {
if(loop1_VD_FLAG) // 继电器2存在信号 if(loop1_VD_FLAG) // 继电器2存在信号
{ {
RLY2_ON; RLY2_ON;
g_loop_acs_info.relay2_state = 1; g_loop_acs_info.relay2_state = 1;
@@ -1199,9 +1199,9 @@ void TMR1_IRQHandler(void)
g_loop_acs_info.relay1_state = 0; g_loop_acs_info.relay1_state = 0;
} }
} break; } break;
case 2: // 离开脉冲 case 2: // 离开脉冲
{ {
if(loop1_VD_FLAG) // 继电器2存在信号 if(loop1_VD_FLAG) // 继电器2存在信号
{ {
RLY2_ON; RLY2_ON;
g_loop_acs_info.relay2_state = 1; g_loop_acs_info.relay2_state = 1;
@@ -1212,7 +1212,7 @@ void TMR1_IRQHandler(void)
g_loop_acs_info.relay2_state = 0; g_loop_acs_info.relay2_state = 0;
} }
if(loop1_FLAG_PLUSE) // 输出离开脉冲 if(loop1_FLAG_PLUSE) // 输出离开脉冲
{ {
RLY1_ON; RLY1_ON;
g_loop_acs_info.relay1_state = 1; g_loop_acs_info.relay1_state = 1;
@@ -1224,7 +1224,7 @@ void TMR1_IRQHandler(void)
} }
} break; } break;
default: { default: {
if(loop1_VD_FLAG) // 继电器2存在信号 if(loop1_VD_FLAG) // 继电器2存在信号
{ {
RLY2_ON; RLY2_ON;
g_loop_acs_info.relay2_state = 1; g_loop_acs_info.relay2_state = 1;
@@ -1246,7 +1246,7 @@ void TMR1_IRQHandler(void)
TMR1_ClearITFlag(TMR0_3_IT_CYC_END); // 清除中断标志 TMR1_ClearITFlag(TMR0_3_IT_CYC_END); // 清除中断标志
} }
} }
@@ -3,7 +3,7 @@
* Author : WCH * Author : WCH
* Version : V1.0 * Version : V1.0
* Date : 2018/12/10 * Date : 2018/12/10
* Description : É豸ÐÅÏ¢·þÎñ * Description : 设备信息服务
********************************************************************************* *********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for * Attention: This software (modified or not) and binary are used for
@@ -3,7 +3,7 @@
* Author : WCH * Author : WCH
* Version : V1.0 * Version : V1.0
* Date : 2018/12/10 * Date : 2018/12/10
* Description : 自定义包含五种不同属性的服务,包含可读、可写、通知、可读可写、安全可读 * Description : 自定义包含五种不同属性的服务,包含可读、可写、通知、可读可写、安全可读
********************************************************************************* *********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for * Attention: This software (modified or not) and binary are used for
+6 -6
View File
@@ -11,14 +11,14 @@
*******************************************************************************/ *******************************************************************************/
/******************************************************************************/ /******************************************************************************/
/* 头文件包含 */ /* 头文件包含 */
#include "HAL.h" #include "HAL.h"
/************************************************************************************************** /**************************************************************************************************
* GLOBAL VARIABLES * GLOBAL VARIABLES
**************************************************************************************************/ **************************************************************************************************/
static uint8_t halKeySavedKeys; /* 保留按键最后的状态,用于查询是否有键值变化 */ static uint8_t halKeySavedKeys; /* 保留按键最后的状态,用于查询是否有键值变化 */
/************************************************************************************************** /**************************************************************************************************
* FUNCTIONS - Local * FUNCTIONS - Local
@@ -76,19 +76,19 @@ uint8_t HalKeyRead(void)
uint8_t keys = 0; uint8_t keys = 0;
if(HAL_PUSH_BUTTON1()) if(HAL_PUSH_BUTTON1())
{ //读按键1 { //读按键1
keys |= HAL_KEY_SW_1; keys |= HAL_KEY_SW_1;
} }
if(HAL_PUSH_BUTTON2()) if(HAL_PUSH_BUTTON2())
{ //读按键1 { //读按键1
keys |= HAL_KEY_SW_2; keys |= HAL_KEY_SW_2;
} }
if(HAL_PUSH_BUTTON3()) if(HAL_PUSH_BUTTON3())
{ //读按键1 { //读按键1
keys |= HAL_KEY_SW_3; keys |= HAL_KEY_SW_3;
} }
if(HAL_PUSH_BUTTON4()) if(HAL_PUSH_BUTTON4())
{ //读按键1 { //读按键1
keys |= HAL_KEY_SW_4; keys |= HAL_KEY_SW_4;
} }
return keys; return keys;
+1 -1
View File
@@ -11,7 +11,7 @@
*******************************************************************************/ *******************************************************************************/
/******************************************************************************/ /******************************************************************************/
/* Í·Îļþ°üº¬ */ /* 头文件包含 */
#include "HAL.h" #include "HAL.h"
/* LED control structure */ /* LED control structure */
+20 -20
View File
@@ -3,7 +3,7 @@
* Author : WCH * Author : WCH
* Version : V1.2 * Version : V1.2
* Date : 2022/01/18 * Date : 2022/01/18
* Description : 硬件任务处理函数及BLE和硬件初始化 * Description : 硬件任务处理函数及BLE和硬件初始化
********************************************************************************* *********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for * Attention: This software (modified or not) and binary are used for
@@ -11,7 +11,7 @@
*******************************************************************************/ *******************************************************************************/
/******************************************************************************/ /******************************************************************************/
/* 头文件包含 */ /* 头文件包含 */
#include "HAL.h" #include "HAL.h"
tmosTaskID halTaskID; tmosTaskID halTaskID;
@@ -19,7 +19,7 @@ uint32_t g_LLE_IRQLibHandlerLocation;
/******************************************************************************* /*******************************************************************************
* @fn Lib_Calibration_LSI * @fn Lib_Calibration_LSI
* *
* @brief 内部32k校准 * @brief 内部32k校准
* *
* @param None. * @param None.
* *
@@ -96,7 +96,7 @@ uint32_t Lib_Write_Flash(uint32_t addr, uint32_t num, uint32_t *pBuf)
/******************************************************************************* /*******************************************************************************
* @fn CH59x_BLEInit * @fn CH59x_BLEInit
* *
* @brief BLE 库初始化 * @brief BLE 库初始化
* *
* @param None. * @param None.
* *
@@ -112,7 +112,7 @@ void CH59x_BLEInit(void)
// while(1); // while(1);
} }
SysTick_Config(SysTick_LOAD_RELOAD_Msk);// 配置SysTick并打开中断 SysTick_Config(SysTick_LOAD_RELOAD_Msk);// 配置SysTick并打开中断
PFIC_DisableIRQ(SysTick_IRQn); PFIC_DisableIRQ(SysTick_IRQn);
g_LLE_IRQLibHandlerLocation = (uint32_t)LLE_IRQLibHandler; g_LLE_IRQLibHandlerLocation = (uint32_t)LLE_IRQLibHandler;
@@ -139,13 +139,13 @@ void CH59x_BLEInit(void)
cfg.ConnectNumber = (PERIPHERAL_MAX_CONNECTION & 3) | (CENTRAL_MAX_CONNECTION << 2); cfg.ConnectNumber = (PERIPHERAL_MAX_CONNECTION & 3) | (CENTRAL_MAX_CONNECTION << 2);
cfg.srandCB = SYS_GetSysTickCnt; cfg.srandCB = SYS_GetSysTickCnt;
#if(defined TEM_SAMPLE) && (TEM_SAMPLE == TRUE) #if(defined TEM_SAMPLE) && (TEM_SAMPLE == TRUE)
cfg.tsCB = HAL_GetInterTempValue; // 根据温度变化校准RF和内部RC( 大于7摄氏度 ) cfg.tsCB = HAL_GetInterTempValue; // 根据温度变化校准RF和内部RC( 大于7摄氏度 )
#if(CLK_OSC32K) #if(CLK_OSC32K)
cfg.rcCB = Lib_Calibration_LSI; // 内部32K时钟校准 cfg.rcCB = Lib_Calibration_LSI; // 内部32K时钟校准
#endif #endif
#endif #endif
#if(defined(HAL_SLEEP)) && (HAL_SLEEP == TRUE) #if(defined(HAL_SLEEP)) && (HAL_SLEEP == TRUE)
cfg.idleCB = CH59x_LowPower; // 启用睡眠 cfg.idleCB = CH59x_LowPower; // 启用睡眠
#endif #endif
#if(defined(BLE_MAC)) && (BLE_MAC == TRUE) #if(defined(BLE_MAC)) && (BLE_MAC == TRUE)
for(i = 0; i < 6; i++) for(i = 0; i < 6; i++)
@@ -158,7 +158,7 @@ void CH59x_BLEInit(void)
GetMACAddress(MacAddr); GetMACAddress(MacAddr);
for(i = 0; i < 6; i++) for(i = 0; i < 6; i++)
{ {
cfg.MacAddr[i] = MacAddr[i]; // 使用芯片mac地址 cfg.MacAddr[i] = MacAddr[i]; // 使用芯片mac地址
} }
} }
#endif #endif
@@ -177,7 +177,7 @@ void CH59x_BLEInit(void)
/******************************************************************************* /*******************************************************************************
* @fn HAL_ProcessEvent * @fn HAL_ProcessEvent
* *
* @brief 硬件层事务处理 * @brief 硬件层事务处理
* *
* @param task_id - The TMOS assigned task ID. * @param task_id - The TMOS assigned task ID.
* @param events - events to process. This is a bit map and can * @param events - events to process. This is a bit map and can
@@ -190,7 +190,7 @@ tmosEvents HAL_ProcessEvent(tmosTaskID task_id, tmosEvents events)
uint8_t *msgPtr; uint8_t *msgPtr;
if(events & SYS_EVENT_MSG) if(events & SYS_EVENT_MSG)
{ // 处理HAL层消息,调用tmos_msg_receive读取消息,处理完成后删除消息。 { // 处理HAL层消息,调用tmos_msg_receive读取消息,处理完成后删除消息。
msgPtr = tmos_msg_receive(task_id); msgPtr = tmos_msg_receive(task_id);
if(msgPtr) if(msgPtr)
{ {
@@ -217,14 +217,14 @@ tmosEvents HAL_ProcessEvent(tmosTaskID task_id, tmosEvents events)
if(events & HAL_REG_INIT_EVENT) if(events & HAL_REG_INIT_EVENT)
{ {
uint8_t x32Kpw; uint8_t x32Kpw;
#if(defined BLE_CALIBRATION_ENABLE) && (BLE_CALIBRATION_ENABLE == TRUE) // 校准任务,单次校准耗时小于10ms #if(defined BLE_CALIBRATION_ENABLE) && (BLE_CALIBRATION_ENABLE == TRUE) // 校准任务,单次校准耗时小于10ms
BLE_RegInit(); // 校准RF BLE_RegInit(); // 校准RF
#if(CLK_OSC32K) #if(CLK_OSC32K)
Lib_Calibration_LSI(); // 校准内部RC Lib_Calibration_LSI(); // 校准内部RC
#else #else
x32Kpw = (R8_XT32K_TUNE & 0xfc) | 0x01; x32Kpw = (R8_XT32K_TUNE & 0xfc) | 0x01;
sys_safe_access_enable(); sys_safe_access_enable();
R8_XT32K_TUNE = x32Kpw; // LSE驱动电流降低到额定电流 R8_XT32K_TUNE = x32Kpw; // LSE驱动电流降低到额定电流
sys_safe_access_disable(); sys_safe_access_disable();
#endif #endif
tmos_start_task(halTaskID, HAL_REG_INIT_EVENT, MS1_TO_SYSTEM_TIME(BLE_CALIBRATION_PERIOD)); tmos_start_task(halTaskID, HAL_REG_INIT_EVENT, MS1_TO_SYSTEM_TIME(BLE_CALIBRATION_PERIOD));
@@ -243,7 +243,7 @@ tmosEvents HAL_ProcessEvent(tmosTaskID task_id, tmosEvents events)
/******************************************************************************* /*******************************************************************************
* @fn HAL_Init * @fn HAL_Init
* *
* @brief 硬件初始化 * @brief 硬件初始化
* *
* @param None. * @param None.
* *
@@ -263,17 +263,17 @@ void HAL_Init()
HAL_KeyInit(); HAL_KeyInit();
#endif #endif
#if(defined BLE_CALIBRATION_ENABLE) && (BLE_CALIBRATION_ENABLE == TRUE) #if(defined BLE_CALIBRATION_ENABLE) && (BLE_CALIBRATION_ENABLE == TRUE)
tmos_start_task(halTaskID, HAL_REG_INIT_EVENT, 800); // 添加校准任务,500ms启动,单次校准耗时小于10ms tmos_start_task(halTaskID, HAL_REG_INIT_EVENT, 800); // 添加校准任务,500ms启动,单次校准耗时小于10ms
#endif #endif
// tmos_start_task( halTaskID, HAL_TEST_EVENT, 1600 ); // 添加一个测试任务 // tmos_start_task( halTaskID, HAL_TEST_EVENT, 1600 ); // 添加一个测试任务
} }
/******************************************************************************* /*******************************************************************************
* @fn HAL_GetInterTempValue * @fn HAL_GetInterTempValue
* *
* @brief 获取内部温感采样值,如果使用了ADC中断采样,需在此函数中暂时屏蔽中断. * @brief 获取内部温感采样值,如果使用了ADC中断采样,需在此函数中暂时屏蔽中断.
* *
* @return 内部温感采样值. * @return 内部温感采样值.
*/ */
uint16_t HAL_GetInterTempValue(void) uint16_t HAL_GetInterTempValue(void)
{ {
+8 -8
View File
@@ -3,7 +3,7 @@
* Author : WCH * Author : WCH
* Version : V1.2 * Version : V1.2
* Date : 2022/01/18 * Date : 2022/01/18
* Description : RTC配置及其初始化 * Description : RTC配置及其初始化
********************************************************************************* *********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for * Attention: This software (modified or not) and binary are used for
@@ -11,7 +11,7 @@
*******************************************************************************/ *******************************************************************************/
/******************************************************************************/ /******************************************************************************/
/* 头文件包含 */ /* 头文件包含 */
#include "HAL.h" #include "HAL.h"
/********************************************************************* /*********************************************************************
@@ -29,9 +29,9 @@ volatile uint32_t RTCTigFlag;
/******************************************************************************* /*******************************************************************************
* @fn RTC_SetTignTime * @fn RTC_SetTignTime
* *
* @brief 配置RTC触发时间 * @brief 配置RTC触发时间
* *
* @param time - 触发时间. * @param time - 触发时间.
* *
* @return None. * @return None.
*/ */
@@ -46,7 +46,7 @@ void RTC_SetTignTime(uint32_t time)
/******************************************************************************* /*******************************************************************************
* @fn RTC_IRQHandler * @fn RTC_IRQHandler
* *
* @brief RTC中断处理 * @brief RTC中断处理
* *
* @param None. * @param None.
* *
@@ -63,7 +63,7 @@ void RTC_IRQHandler(void)
/******************************************************************************* /*******************************************************************************
* @fn SYS_GetClockValue * @fn SYS_GetClockValue
* *
* @brief 获取RTC当前计数值 * @brief 获取RTC当前计数值
* *
* @param None. * @param None.
* *
@@ -84,7 +84,7 @@ static uint32_t SYS_GetClockValue(void)
/******************************************************************************* /*******************************************************************************
* @fn HAL_Time0Init * @fn HAL_Time0Init
* *
* @brief 系统定时器初始化 * @brief 系统定时器初始化
* *
* @param None. * @param None.
* *
@@ -110,7 +110,7 @@ void HAL_TimeInit(void)
R8_CK32K_CONFIG |= RB_CLK_OSC32K_XT | RB_CLK_XT32K_PON; R8_CK32K_CONFIG |= RB_CLK_OSC32K_XT | RB_CLK_XT32K_PON;
sys_safe_access_disable(); sys_safe_access_disable();
#endif #endif
RTC_InitTime(2020, 1, 1, 0, 0, 0); //RTC时钟初始化当前时间 RTC_InitTime(2020, 1, 1, 0, 0, 0); //RTC时钟初始化当前时间
tmos_memset( &conf, 0, sizeof(bleClockConfig_t) ); tmos_memset( &conf, 0, sizeof(bleClockConfig_t) );
conf.ClockAccuracy = CLK_OSC32K ? 1000 : 50; conf.ClockAccuracy = CLK_OSC32K ? 1000 : 50;
+37 -37
View File
@@ -3,7 +3,7 @@
* Author : WCH * Author : WCH
* Version : V1.2 * Version : V1.2
* Date : 2022/01/18 * Date : 2022/01/18
* Description : 配置说明及默认值,建议在工程配置里的预处理中修改当前值 * Description : 配置说明及默认值,建议在工程配置里的预处理中修改当前值
********************************************************************************* *********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for * Attention: This software (modified or not) and binary are used for
@@ -27,53 +27,53 @@
#include "CH59x_common.h" #include "CH59x_common.h"
/********************************************************************* /*********************************************************************
【MAC】 【MAC】
BLE_MAC - 是否自定义蓝牙Mac地址 ( 默认:FALSE - 使用芯片Mac地址 ),需要在main.c修改Mac地址定义 BLE_MAC - 是否自定义蓝牙Mac地址 ( 默认:FALSE - 使用芯片Mac地址 ),需要在main.c修改Mac地址定义
【DCDC】 【DCDC】
DCDC_ENABLE - 是否使能DCDC ( 默认:FALSE ) DCDC_ENABLE - 是否使能DCDC ( 默认:FALSE )
【SLEEP】 【SLEEP】
HAL_SLEEP - 是否开启睡眠功能 ( 默认:FALSE ) HAL_SLEEP - 是否开启睡眠功能 ( 默认:FALSE )
SLEEP_RTC_MIN_TIME - 非空闲模式下睡眠的最小时间(单位:一个RTC周期) SLEEP_RTC_MIN_TIME - 非空闲模式下睡眠的最小时间(单位:一个RTC周期)
SLEEP_RTC_MAX_TIME - 非空闲模式下睡眠的最大时间(单位:一个RTC周期) SLEEP_RTC_MAX_TIME - 非空闲模式下睡眠的最大时间(单位:一个RTC周期)
WAKE_UP_RTC_MAX_TIME - 等待32M晶振稳定时间(单位:一个RTC周期) WAKE_UP_RTC_MAX_TIME - 等待32M晶振稳定时间(单位:一个RTC周期)
根据不同睡眠类型取值可分为: 睡眠模式/下电模式 - 45 (默认) 根据不同睡眠类型取值可分为: 睡眠模式/下电模式 - 45 (默认)
暂停模式 - 45 暂停模式 - 45
空闲模式 - 5 空闲模式 - 5
【TEMPERATION】 【TEMPERATION】
TEM_SAMPLE - 是否打开根据温度变化校准的功能,单次校准耗时小于10ms( 默认:TRUE ) TEM_SAMPLE - 是否打开根据温度变化校准的功能,单次校准耗时小于10ms( 默认:TRUE )
【CALIBRATION】 【CALIBRATION】
BLE_CALIBRATION_ENABLE - 是否打开定时校准的功能,单次校准耗时小于10ms( 默认:TRUE ) BLE_CALIBRATION_ENABLE - 是否打开定时校准的功能,单次校准耗时小于10ms( 默认:TRUE )
BLE_CALIBRATION_PERIOD - 定时校准的周期,单位ms( 默认:120000 ) BLE_CALIBRATION_PERIOD - 定时校准的周期,单位ms( 默认:120000 )
【SNV】 【SNV】
BLE_SNV - 是否开启SNV功能,用于储存绑定信息( 默认:TRUE ) BLE_SNV - 是否开启SNV功能,用于储存绑定信息( 默认:TRUE )
BLE_SNV_ADDR - SNV信息保存地址,使用data flash最后512字节( 默认:0x77E00 ) BLE_SNV_ADDR - SNV信息保存地址,使用data flash最后512字节( 默认:0x77E00 )
BLE_SNV_BLOCK - SNV信息保存块大小( 默认:256 ) BLE_SNV_BLOCK - SNV信息保存块大小( 默认:256 )
BLE_SNV_NUM - SNV信息保存数量( 默认:1 ) BLE_SNV_NUM - SNV信息保存数量( 默认:1 )
【RTC】 【RTC】
CLK_OSC32K - RTC时钟选择,如包含主机角色必须使用外部32K( 0 外部(32768Hz),默认:1:内部(32000Hz)2:内部(32768Hz) ) CLK_OSC32K - RTC时钟选择,如包含主机角色必须使用外部32K( 0 外部(32768Hz),默认:1:内部(32000Hz)2:内部(32768Hz) )
【MEMORY】 【MEMORY】
BLE_MEMHEAP_SIZE - 蓝牙协议栈使用的RAM大小,不小于6K ( 默认:(1024*6) ) BLE_MEMHEAP_SIZE - 蓝牙协议栈使用的RAM大小,不小于6K ( 默认:(1024*6) )
【DATA】 【DATA】
BLE_BUFF_MAX_LEN - 单个连接最大包长度( 默认:27 (ATT_MTU=23),取值范围[27~516] ) BLE_BUFF_MAX_LEN - 单个连接最大包长度( 默认:27 (ATT_MTU=23),取值范围[27~516] )
BLE_BUFF_NUM - 控制器缓存的包数量( 默认:5 ) BLE_BUFF_NUM - 控制器缓存的包数量( 默认:5 )
BLE_TX_NUM_EVENT - 单个连接事件最多可以发多少个数据包( 默认:1 ) BLE_TX_NUM_EVENT - 单个连接事件最多可以发多少个数据包( 默认:1 )
BLE_TX_POWER - 发射功率( 默认:LL_TX_POWEER_0_DBM (0dBm) ) BLE_TX_POWER - 发射功率( 默认:LL_TX_POWEER_0_DBM (0dBm) )
【MULTICONN】 【MULTICONN】
PERIPHERAL_MAX_CONNECTION - 最多可同时做多少从机角色( 默认:1 ) PERIPHERAL_MAX_CONNECTION - 最多可同时做多少从机角色( 默认:1 )
CENTRAL_MAX_CONNECTION - 最多可同时做多少主机角色( 默认:3 ) CENTRAL_MAX_CONNECTION - 最多可同时做多少主机角色( 默认:3 )
**********************************************************************/ **********************************************************************/
/********************************************************************* /*********************************************************************
* 默认配置值 * 默认配置值
*/ */
#ifndef BLE_MAC #ifndef BLE_MAC
#define BLE_MAC FALSE #define BLE_MAC FALSE
@@ -121,7 +121,7 @@
#define BLE_SNV_NUM 1 #define BLE_SNV_NUM 1
#endif #endif
#ifndef CLK_OSC32K #ifndef CLK_OSC32K
#define CLK_OSC32K 1 // 该项请勿在此修改,必须在工程配置里的预处理中修改,如包含主机角色必须使用外部32K #define CLK_OSC32K 1 // 该项请勿在此修改,必须在工程配置里的预处理中修改,如包含主机角色必须使用外部32K
#endif #endif
#ifndef BLE_MEMHEAP_SIZE #ifndef BLE_MEMHEAP_SIZE
#define BLE_MEMHEAP_SIZE (1024*6) #define BLE_MEMHEAP_SIZE (1024*6)
+6 -6
View File
@@ -40,12 +40,12 @@ extern tmosTaskID halTaskID;
*/ */
/** /**
* @brief 硬件初始化 * @brief 硬件初始化
*/ */
extern void HAL_Init(void); extern void HAL_Init(void);
/** /**
* @brief 硬件层事务处理 * @brief 硬件层事务处理
* *
* @param task_id - The TMOS assigned task ID. * @param task_id - The TMOS assigned task ID.
* @param events - events to process. This is a bit map and can * @param events - events to process. This is a bit map and can
@@ -54,19 +54,19 @@ extern void HAL_Init(void);
extern tmosEvents HAL_ProcessEvent(tmosTaskID task_id, tmosEvents events); extern tmosEvents HAL_ProcessEvent(tmosTaskID task_id, tmosEvents events);
/** /**
* @brief BLE 库初始化 * @brief BLE 库初始化
*/ */
extern void CH59x_BLEInit(void); extern void CH59x_BLEInit(void);
/** /**
* @brief 获取内部温感采样值,如果使用了ADC中断采样,需在此函数中暂时屏蔽中断. * @brief 获取内部温感采样值,如果使用了ADC中断采样,需在此函数中暂时屏蔽中断.
* *
* @return 内部温感采样值. * @return 内部温感采样值.
*/ */
extern uint16_t HAL_GetInterTempValue(void); extern uint16_t HAL_GetInterTempValue(void);
/** /**
* @brief 内部32k校准 * @brief 内部32k校准
*/ */
extern void Lib_Calibration_LSI(void); extern void Lib_Calibration_LSI(void);
+2 -2
View File
@@ -29,7 +29,7 @@ extern "C" {
#define HAL_KEY_SW_3 0x04 // key3 #define HAL_KEY_SW_3 0x04 // key3
#define HAL_KEY_SW_4 0x08 // key4 #define HAL_KEY_SW_4 0x08 // key4
/* °´¼ü¶¨Òå */ /* 按键定义 */
/* 1 - KEY */ /* 1 - KEY */
#define KEY1_BV BV(22) #define KEY1_BV BV(22)
@@ -52,7 +52,7 @@ extern "C" {
#define KEY3_IN () #define KEY3_IN ()
#define KEY4_IN () #define KEY4_IN ()
#define HAL_PUSH_BUTTON1() (KEY1_IN) //Ìí¼Ó×Ô¶¨Òå°´¼ü #define HAL_PUSH_BUTTON1() (KEY1_IN) //添加自定义按键
#define HAL_PUSH_BUTTON2() (KEY2_IN) #define HAL_PUSH_BUTTON2() (KEY2_IN)
#define HAL_PUSH_BUTTON3() (0) #define HAL_PUSH_BUTTON3() (0)
#define HAL_PUSH_BUTTON4() (0) #define HAL_PUSH_BUTTON4() (0)
+1 -1
View File
@@ -46,7 +46,7 @@ extern "C" {
* TYPEDEFS * TYPEDEFS
*/ */
/* 连接一个LED用于监控演示程序的进度,低电平LED亮 */ /* 连接一个LED用于监控演示程序的进度,低电平LED亮 */
/* 1 - LED */ /* 1 - LED */
#define LED1_BV BV(15) #define LED1_BV BV(15)
+2 -2
View File
@@ -47,9 +47,9 @@ extern volatile uint32_t RTCTigFlag;
void HAL_TimeInit(void); void HAL_TimeInit(void);
/** /**
* @brief ÅäÖÃRTC´¥·¢Ê±¼ä * @brief 配置RTC触发时间
* *
* @param time - ´¥·¢Ê±¼ä. * @param time - 触发时间.
*/ */
extern void RTC_SetTignTime(uint32_t time); extern void RTC_SetTignTime(uint32_t time);
+3 -3
View File
@@ -27,14 +27,14 @@ extern "C" {
*/ */
/** /**
* @brief 配置睡眠唤醒的方式 - RTC唤醒,触发模式 * @brief 配置睡眠唤醒的方式 - RTC唤醒,触发模式
*/ */
extern void HAL_SleepInit(void); extern void HAL_SleepInit(void);
/** /**
* @brief 启动睡眠 * @brief 启动睡眠
* *
* @param time - 唤醒的时间点(RTC绝对值) * @param time - 唤醒的时间点(RTC绝对值)
* *
* @return state. * @return state.
*/ */
+4 -4
View File
@@ -187,7 +187,7 @@ extern const uint8_t VER_LIB[]; // LIB version
#define ABS(n) (((n) < 0) ? -(n) : (n)) #define ABS(n) (((n) < 0) ? -(n) : (n))
#endif #endif
/* TxPower define(Accuracy:¡À2dBm) */ /* TxPower define(Accuracy:±2dBm) */
#define LL_TX_POWEER_MINUS_20_DBM 0x01 #define LL_TX_POWEER_MINUS_20_DBM 0x01
#define LL_TX_POWEER_MINUS_15_DBM 0x03 #define LL_TX_POWEER_MINUS_15_DBM 0x03
#define LL_TX_POWEER_MINUS_10_DBM 0x05 #define LL_TX_POWEER_MINUS_10_DBM 0x05
@@ -773,7 +773,7 @@ extern const uint8_t VER_LIB[]; // LIB version
#define TGAP_AUTH_TASK_ID 24 //!< Task ID override for Task Authentication control (for stack internal use only) #define TGAP_AUTH_TASK_ID 24 //!< Task ID override for Task Authentication control (for stack internal use only)
// v5.x // v5.x
#define TGAP_ADV_TX_POWER 25 //!< Indicates the maximum power level Range: -127 ¡Ü N ¡Ü +126 Units: dBm.Default 127(Host has no preference). #define TGAP_ADV_TX_POWER 25 //!< Indicates the maximum power level Range: -127 N +126 Units: dBm.Default 127(Host has no preference).
#define TGAP_ADV_PRIMARY_PHY 26 //!< resv. #define TGAP_ADV_PRIMARY_PHY 26 //!< resv.
#define TGAP_ADV_SECONDARY_PHY 27 //!< LE 1M/LE 2M. Default GAP_PHY_VAL_LE_1M. #define TGAP_ADV_SECONDARY_PHY 27 //!< LE 1M/LE 2M. Default GAP_PHY_VAL_LE_1M.
#define TGAP_ADV_SECONDARY_MAX_SKIP 28 //!< Maximum advertising events the Controller can skip before sending the AUX_ADV_IND packets on the secondary advertising channel. Default 0. #define TGAP_ADV_SECONDARY_MAX_SKIP 28 //!< Maximum advertising events the Controller can skip before sending the AUX_ADV_IND packets on the secondary advertising channel. Default 0.
@@ -1110,7 +1110,7 @@ extern const uint8_t VER_LIB[]; // LIB version
#define SMP_PAIRING_FAILED_UNSPECIFIED 0x08 //!< Pairing failed due to an unspecified reason #define SMP_PAIRING_FAILED_UNSPECIFIED 0x08 //!< Pairing failed due to an unspecified reason
#define SMP_PAIRING_FAILED_REPEATED_ATTEMPTS 0x09 //!< Pairing or authentication procedure is disallowed because too little time has elapsed since the last pairing request or security request. #define SMP_PAIRING_FAILED_REPEATED_ATTEMPTS 0x09 //!< Pairing or authentication procedure is disallowed because too little time has elapsed since the last pairing request or security request.
#define SMP_PAIRING_FAILED_INVALID_PARAMERERS 0x0A //!< The Invalid Parameters error code indicates that the command length is invalid or that a parameter is outside of the specified range. #define SMP_PAIRING_FAILED_INVALID_PARAMERERS 0x0A //!< The Invalid Parameters error code indicates that the command length is invalid or that a parameter is outside of the specified range.
#define SMP_PAIRING_FAILED_DHKEY_CHECK_FAILED 0x0B //!< Indicates to the remote device that the DHKey Check value received doesn¡¯t match the one calculated by the local device. #define SMP_PAIRING_FAILED_DHKEY_CHECK_FAILED 0x0B //!< Indicates to the remote device that the DHKey Check value received doesnt match the one calculated by the local device.
#define SMP_PAIRING_FAILED_NUMERIC_COMPARISON 0x0C //!< Indicates that the confirm values in the numeric comparison protocol do not match. #define SMP_PAIRING_FAILED_NUMERIC_COMPARISON 0x0C //!< Indicates that the confirm values in the numeric comparison protocol do not match.
#define SMP_PAIRING_FAILED_KEY_REJECTED 0x0F //!< Indicates that the device chose not to accept a distributed key. #define SMP_PAIRING_FAILED_KEY_REJECTED 0x0F //!< Indicates that the device chose not to accept a distributed key.
@@ -2849,7 +2849,7 @@ extern void LLE_IRQLibHandler( void );
* @return access address * @return access address
* the Access Address meets the following requirements: * the Access Address meets the following requirements:
* It shall have no more than six consecutive zeros or ones. * It shall have no more than six consecutive zeros or ones.
* It shall not be t he advertising channel packets¡¯ Access Address. * It shall not be t he advertising channel packets Access Address.
* It shall not be a sequence that differ s from the advertising channel packets' Access Address by only one bit. * It shall not be a sequence that differ s from the advertising channel packets' Access Address by only one bit.
* It shall not have all four octets equal. * It shall not have all four octets equal.
* It shall have no more than 24 transitions. * It shall have no more than 24 transitions.
+6 -6
View File
@@ -199,7 +199,7 @@ extern const uint8_t VER_LIB[]; // LIB version
#define ABS(n) (((n) < 0) ? -(n) : (n)) #define ABS(n) (((n) < 0) ? -(n) : (n))
#endif #endif
/* TxPower define(Accuracy:¡À2dBm) */ /* TxPower define(Accuracy:±2dBm) */
#define LL_TX_POWEER_MINUS_20_DBM 0x01 #define LL_TX_POWEER_MINUS_20_DBM 0x01
#define LL_TX_POWEER_MINUS_15_DBM 0x03 #define LL_TX_POWEER_MINUS_15_DBM 0x03
#define LL_TX_POWEER_MINUS_10_DBM 0x05 #define LL_TX_POWEER_MINUS_10_DBM 0x05
@@ -785,7 +785,7 @@ extern const uint8_t VER_LIB[]; // LIB version
#define TGAP_AUTH_TASK_ID 24 //!< Task ID override for Task Authentication control (for stack internal use only) #define TGAP_AUTH_TASK_ID 24 //!< Task ID override for Task Authentication control (for stack internal use only)
// v5.x // v5.x
#define TGAP_ADV_TX_POWER 25 //!< Indicates the maximum power level Range: -127 ¡Ü N ¡Ü +126 Units: dBm.Default 127(Host has no preference). #define TGAP_ADV_TX_POWER 25 //!< Indicates the maximum power level Range: -127 N +126 Units: dBm.Default 127(Host has no preference).
#define TGAP_ADV_PRIMARY_PHY 26 //!< resv. #define TGAP_ADV_PRIMARY_PHY 26 //!< resv.
#define TGAP_ADV_SECONDARY_PHY 27 //!< LE 1M/LE 2M. Default GAP_PHY_VAL_LE_1M. #define TGAP_ADV_SECONDARY_PHY 27 //!< LE 1M/LE 2M. Default GAP_PHY_VAL_LE_1M.
#define TGAP_ADV_SECONDARY_MAX_SKIP 28 //!< Maximum advertising events the Controller can skip before sending the AUX_ADV_IND packets on the secondary advertising channel. Default 0. #define TGAP_ADV_SECONDARY_MAX_SKIP 28 //!< Maximum advertising events the Controller can skip before sending the AUX_ADV_IND packets on the secondary advertising channel. Default 0.
@@ -1122,7 +1122,7 @@ extern const uint8_t VER_LIB[]; // LIB version
#define SMP_PAIRING_FAILED_UNSPECIFIED 0x08 //!< Pairing failed due to an unspecified reason #define SMP_PAIRING_FAILED_UNSPECIFIED 0x08 //!< Pairing failed due to an unspecified reason
#define SMP_PAIRING_FAILED_REPEATED_ATTEMPTS 0x09 //!< Pairing or authentication procedure is disallowed because too little time has elapsed since the last pairing request or security request. #define SMP_PAIRING_FAILED_REPEATED_ATTEMPTS 0x09 //!< Pairing or authentication procedure is disallowed because too little time has elapsed since the last pairing request or security request.
#define SMP_PAIRING_FAILED_INVALID_PARAMERERS 0x0A //!< The Invalid Parameters error code indicates that the command length is invalid or that a parameter is outside of the specified range. #define SMP_PAIRING_FAILED_INVALID_PARAMERERS 0x0A //!< The Invalid Parameters error code indicates that the command length is invalid or that a parameter is outside of the specified range.
#define SMP_PAIRING_FAILED_DHKEY_CHECK_FAILED 0x0B //!< Indicates to the remote device that the DHKey Check value received doesn¡¯t match the one calculated by the local device. #define SMP_PAIRING_FAILED_DHKEY_CHECK_FAILED 0x0B //!< Indicates to the remote device that the DHKey Check value received doesnt match the one calculated by the local device.
#define SMP_PAIRING_FAILED_NUMERIC_COMPARISON 0x0C //!< Indicates that the confirm values in the numeric comparison protocol do not match. #define SMP_PAIRING_FAILED_NUMERIC_COMPARISON 0x0C //!< Indicates that the confirm values in the numeric comparison protocol do not match.
#define SMP_PAIRING_FAILED_KEY_REJECTED 0x0F //!< Indicates that the device chose not to accept a distributed key. #define SMP_PAIRING_FAILED_KEY_REJECTED 0x0F //!< Indicates that the device chose not to accept a distributed key.
@@ -2877,7 +2877,7 @@ typedef struct tag_rf_config
* @return access address * @return access address
* the Access Address meets the following requirements: * the Access Address meets the following requirements:
* It shall have no more than six consecutive zeros or ones. * It shall have no more than six consecutive zeros or ones.
* It shall not be t he advertising channel packets¡¯ Access Address. * It shall not be t he advertising channel packets Access Address.
* It shall not be a sequence that differ s from the advertising channel packets' Access Address by only one bit. * It shall not be a sequence that differ s from the advertising channel packets' Access Address by only one bit.
* It shall not have all four octets equal. * It shall not have all four octets equal.
* It shall have no more than 24 transitions. * It shall have no more than 24 transitions.
@@ -4037,7 +4037,7 @@ typedef struct tag_rf_config
* @return SUCCESS - bond record found and changed * @return SUCCESS - bond record found and changed
* bleIncorrectMode - Link not found. * bleIncorrectMode - Link not found.
*/ */
#define GAPBondMgr_OobRsp (( bStatus_t (*) ( uint16_t connHandle, uint8_t status, uint8_t *oob, uint8_t * c_peer )£© BLE_LIB_JT(139) ) #define GAPBondMgr_OobRsp (( bStatus_t (*) ( uint16_t connHandle, uint8_t status, uint8_t *oob, uint8_t * c_peer ) BLE_LIB_JT(139) )
/** /**
* @brief Initialization function for the ecc-function callback. * @brief Initialization function for the ecc-function callback.
@@ -4046,7 +4046,7 @@ typedef struct tag_rf_config
* *
* @return null. * @return null.
*/ */
#define GAPBondMgr_EccInit (( void (*) ( gapEccCBs_t *pEcc )£© BLE_LIB_JT(140) ) #define GAPBondMgr_EccInit (( void (*) ( gapEccCBs_t *pEcc ) BLE_LIB_JT(140) )
/** /**
* @brief Send a security request * @brief Send a security request
+27 -27
View File
@@ -15,24 +15,24 @@
/********************************************************************* /*********************************************************************
* @fn ADC_DataCalib_Rough * @fn ADC_DataCalib_Rough
* *
* @brief 采样数据粗调,获取偏差值,必须先配置ADC后调用此函数获取校准值 * @brief 采样数据粗调,获取偏差值,必须先配置ADC后调用此函数获取校准值
* *
* @param none * @param none
* *
* @return 偏差 * @return 偏差
*/ */
signed short ADC_DataCalib_Rough(void) // 采样数据粗调,获取偏差值 signed short ADC_DataCalib_Rough(void) // 采样数据粗调,获取偏差值
{ {
uint16_t i; uint16_t i;
uint32_t sum = 0; uint32_t sum = 0;
uint8_t ch = 0; // 备份通道 uint8_t ch = 0; // 备份通道
uint8_t cfg = 0; // 备份 uint8_t cfg = 0; // 备份
ch = R8_ADC_CHANNEL; ch = R8_ADC_CHANNEL;
cfg = R8_ADC_CFG; cfg = R8_ADC_CFG;
R8_ADC_CFG |= RB_ADC_OFS_TEST; // 进入测试模式 R8_ADC_CFG |= RB_ADC_OFS_TEST; // 进入测试模式
R8_ADC_CFG &= ~RB_ADC_DIFF_EN; // 关闭差分 R8_ADC_CFG &= ~RB_ADC_DIFF_EN; // 关闭差分
R8_ADC_CONVERT |= RB_ADC_START; R8_ADC_CONVERT |= RB_ADC_START;
while(R8_ADC_CONVERT & RB_ADC_START); while(R8_ADC_CONVERT & RB_ADC_START);
@@ -44,7 +44,7 @@ signed short ADC_DataCalib_Rough(void) //
} }
sum = (sum + 8) >> 4; sum = (sum + 8) >> 4;
R8_ADC_CFG = cfg; // 恢复配置值 R8_ADC_CFG = cfg; // 恢复配置值
R8_ADC_CHANNEL = ch; R8_ADC_CHANNEL = ch;
return (2048 - sum); return (2048 - sum);
@@ -53,7 +53,7 @@ signed short ADC_DataCalib_Rough(void) //
/********************************************************************* /*********************************************************************
* @fn ADC_ExtSingleChSampInit * @fn ADC_ExtSingleChSampInit
* *
* @brief 外部信号单通道采样初始化 * @brief 外部信号单通道采样初始化
* *
* @param sp - refer to ADC_SampClkTypeDef * @param sp - refer to ADC_SampClkTypeDef
* @param ga - refer to ADC_SignalPGATypeDef * @param ga - refer to ADC_SignalPGATypeDef
@@ -77,7 +77,7 @@ void ADC_ExtSingleChSampInit(ADC_SampClkTypeDef sp, ADC_SignalPGATypeDef ga)
/********************************************************************* /*********************************************************************
* @fn ADC_ExtDiffChSampInit * @fn ADC_ExtDiffChSampInit
* *
* @brief 外部信号差分通道采样初始化 * @brief 外部信号差分通道采样初始化
* *
* @param sp - refer to ADC_SampClkTypeDef * @param sp - refer to ADC_SampClkTypeDef
* @param ga - refer to ADC_SignalPGATypeDef * @param ga - refer to ADC_SignalPGATypeDef
@@ -101,7 +101,7 @@ void ADC_ExtDiffChSampInit(ADC_SampClkTypeDef sp, ADC_SignalPGATypeDef ga)
/********************************************************************* /*********************************************************************
* @fn ADC_InterTSSampInit * @fn ADC_InterTSSampInit
* *
* @brief 内置温度传感器采样初始化 * @brief 内置温度传感器采样初始化
* *
* @param none * @param none
* *
@@ -119,7 +119,7 @@ void ADC_InterTSSampInit(void)
/********************************************************************* /*********************************************************************
* @fn ADC_InterBATSampInit * @fn ADC_InterBATSampInit
* *
* @brief 内置电池电压采样初始化 * @brief 内置电池电压采样初始化
* *
* @param none * @param none
* *
@@ -129,14 +129,14 @@ void ADC_InterBATSampInit(void)
{ {
R8_TKEY_CFG &= ~RB_TKEY_PWR_ON; R8_TKEY_CFG &= ~RB_TKEY_PWR_ON;
R8_ADC_CHANNEL = CH_INTE_VBAT; R8_ADC_CHANNEL = CH_INTE_VBAT;
R8_ADC_CFG = RB_ADC_POWER_ON | RB_ADC_BUF_EN | (0 << 4); // 使用-12dB模式 R8_ADC_CFG = RB_ADC_POWER_ON | RB_ADC_BUF_EN | (0 << 4); // 使用-12dB模式
R8_ADC_CONVERT &= ~RB_ADC_PGA_GAIN2; R8_ADC_CONVERT &= ~RB_ADC_PGA_GAIN2;
} }
/********************************************************************* /*********************************************************************
* @fn TouchKey_ChSampInit * @fn TouchKey_ChSampInit
* *
* @brief 触摸按键通道采样初始化 * @brief 触摸按键通道采样初始化
* *
* @param none * @param none
* *
@@ -152,11 +152,11 @@ void TouchKey_ChSampInit(void)
/********************************************************************* /*********************************************************************
* @fn ADC_ExcutSingleConver * @fn ADC_ExcutSingleConver
* *
* @brief ADC执行单次转换 * @brief ADC执行单次转换
* *
* @param none * @param none
* *
* @return ADC转换后的数据 * @return ADC转换后的数据
*/ */
uint16_t ADC_ExcutSingleConver(void) uint16_t ADC_ExcutSingleConver(void)
{ {
@@ -169,12 +169,12 @@ uint16_t ADC_ExcutSingleConver(void)
/********************************************************************* /*********************************************************************
* @fn TouchKey_ExcutSingleConver * @fn TouchKey_ExcutSingleConver
* *
* @brief TouchKey转换后数据 * @brief TouchKey转换后数据
* *
* @param charg - Touchkey充电时间,5bits有效, t=charg*Tadc * @param charg - Touchkey充电时间,5bits有效, t=charg*Tadc
* @param disch - Touchkey放电时间,3bits有效, t=disch*Tadc * @param disch - Touchkey放电时间,3bits有效, t=disch*Tadc
* *
* @return 当前TouchKey等效数据 * @return 当前TouchKey等效数据
*/ */
uint16_t TouchKey_ExcutSingleConver(uint8_t charg, uint8_t disch) uint16_t TouchKey_ExcutSingleConver(uint8_t charg, uint8_t disch)
{ {
@@ -187,9 +187,9 @@ uint16_t TouchKey_ExcutSingleConver(uint8_t charg, uint8_t disch)
/********************************************************************* /*********************************************************************
* @fn ADC_AutoConverCycle * @fn ADC_AutoConverCycle
* *
* @brief 设置连续 ADC的周期 * @brief 设置连续 ADC的周期
* *
* @param cycle - 采样周期计算方法为(256-cycle)*16*Tsys * @param cycle - 采样周期计算方法为(256-cycle)*16*Tsys
* *
* @return none * @return none
*/ */
@@ -201,12 +201,12 @@ void ADC_AutoConverCycle(uint8_t cycle)
/********************************************************************* /*********************************************************************
* @fn ADC_DMACfg * @fn ADC_DMACfg
* *
* @brief 配置DMA功能 * @brief 配置DMA功能
* *
* @param s - 是否打开DMA功能 * @param s - 是否打开DMA功能
* @param startAddr - DMA 起始地址 * @param startAddr - DMA 起始地址
* @param endAddr - DMA 结束地址 * @param endAddr - DMA 结束地址
* @param m - 配置DMA模式 * @param m - 配置DMA模式
* *
* @return none * @return none
*/ */
+46 -46
View File
@@ -15,9 +15,9 @@
/********************************************************************* /*********************************************************************
* @fn LClk32K_Select * @fn LClk32K_Select
* *
* @brief 32K 低频时钟来源 * @brief 32K 低频时钟来源
* *
* @param hc - 选择32K使用内部还是外部 * @param hc - 选择32K使用内部还是外部
* *
* @return none * @return none
*/ */
@@ -43,10 +43,10 @@ void LClk32K_Select(LClk32KTypeDef hc)
/********************************************************************* /*********************************************************************
* @fn LClk32K_Cfg * @fn LClk32K_Cfg
* *
* @brief 32K 低频时钟电源配置 * @brief 32K 低频时钟电源配置
* *
* @param hc - 选择内部32K还是外部32K * @param hc - 选择内部32K还是外部32K
* @param s - 是否打开电源 * @param s - 是否打开电源
* *
* @return none * @return none
*/ */
@@ -85,7 +85,7 @@ void LClk32K_Cfg(LClk32KTypeDef hc, FunctionalState s)
/********************************************************************* /*********************************************************************
* @fn HSECFG_Current * @fn HSECFG_Current
* *
* @brief HSE晶体 偏置电流配置 * @brief HSE晶体 偏置电流配置
* *
* @param c - 75%,100%,125%,150% * @param c - 75%,100%,125%,150%
* *
@@ -106,7 +106,7 @@ void HSECFG_Current(HSECurrentTypeDef c)
/********************************************************************* /*********************************************************************
* @fn HSECFG_Capacitance * @fn HSECFG_Capacitance
* *
* @brief HSE晶体 负载电容配置 * @brief HSE晶体 负载电容配置
* *
* @param c - refer to HSECapTypeDef * @param c - refer to HSECapTypeDef
* *
@@ -127,7 +127,7 @@ void HSECFG_Capacitance(HSECapTypeDef c)
/********************************************************************* /*********************************************************************
* @fn LSECFG_Current * @fn LSECFG_Current
* *
* @brief LSE晶体 偏置电流配置 * @brief LSE晶体 偏置电流配置
* *
* @param c - 70%,100%,140%,200% * @param c - 70%,100%,140%,200%
* *
@@ -148,7 +148,7 @@ void LSECFG_Current(LSECurrentTypeDef c)
/********************************************************************* /*********************************************************************
* @fn LSECFG_Capacitance * @fn LSECFG_Capacitance
* *
* @brief LSE晶体 负载电容配置 * @brief LSE晶体 负载电容配置
* *
* @param c - refer to LSECapTypeDef * @param c - refer to LSECapTypeDef
* *
@@ -169,11 +169,11 @@ void LSECFG_Capacitance(LSECapTypeDef c)
/********************************************************************* /*********************************************************************
* @fn Calibration_LSI * @fn Calibration_LSI
* *
* @brief 校准内部32K时钟 * @brief 校准内部32K时钟
* *
* @param cali_Lv - 校准等级选择 Level_32 2.4ms 1000ppm (32M 主频) 1100ppm (60M 主频) * @param cali_Lv - 校准等级选择 Level_32 2.4ms 1000ppm (32M 主频) 1100ppm (60M 主频)
* Level_64 4.4ms 800ppm (32M 主频) 1000ppm (60M 主频) * Level_64 4.4ms 800ppm (32M 主频) 1000ppm (60M 主频)
* Level_128 8.4ms 600ppm (32M 主频) 800ppm (60M 主频) * Level_128 8.4ms 600ppm (32M 主频) 800ppm (60M 主频)
* *
* @return none * @return none
*/ */
@@ -197,7 +197,7 @@ void Calibration_LSI(Cali_LevelTypeDef cali_Lv)
while(1) while(1)
{ {
// 粗调 // 粗调
sys_safe_access_enable(); sys_safe_access_enable();
R8_OSC_CAL_CTRL &= ~RB_OSC_CNT_TOTAL; R8_OSC_CAL_CTRL &= ~RB_OSC_CNT_TOTAL;
R8_OSC_CAL_CTRL |= 1; R8_OSC_CAL_CTRL |= 1;
@@ -217,7 +217,7 @@ void Calibration_LSI(Cali_LevelTypeDef cali_Lv)
sys_safe_access_disable(); sys_safe_access_disable();
} }
while(!(R8_OSC_CAL_CTRL & RB_OSC_CNT_HALT)); // 用于丢弃 while(!(R8_OSC_CAL_CTRL & RB_OSC_CNT_HALT)); // 用于丢弃
SYS_DisableAllIrq(&irqv); SYS_DisableAllIrq(&irqv);
sys_safe_access_enable(); sys_safe_access_enable();
@@ -239,7 +239,7 @@ void Calibration_LSI(Cali_LevelTypeDef cali_Lv)
R16_OSC_CAL_CNT |= RB_OSC_CAL_OV_CLR; R16_OSC_CAL_CNT |= RB_OSC_CAL_OV_CLR;
SYS_RecoverIrq(irqv); SYS_RecoverIrq(irqv);
while(!(R8_OSC_CAL_CTRL & RB_OSC_CNT_HALT)); while(!(R8_OSC_CAL_CTRL & RB_OSC_CNT_HALT));
i = R16_OSC_CAL_CNT; // 实时校准后采样值 i = R16_OSC_CAL_CNT; // 实时校准后采样值
cnt_offset = (i & 0x3FFF) + R8_OSC_CAL_OV_CNT * 0x3FFF - 2000 * (freq_sys / 1000) / CAB_LSIFQ; cnt_offset = (i & 0x3FFF) + R8_OSC_CAL_OV_CNT * 0x3FFF - 2000 * (freq_sys / 1000) / CAB_LSIFQ;
if(((cnt_offset > -37 * (freq_sys / 1000) / 60000) && (cnt_offset < 37 * (freq_sys / 1000) / 60000)) || retry > 2) if(((cnt_offset > -37 * (freq_sys / 1000) / 60000) && (cnt_offset < 37 * (freq_sys / 1000) / 60000)) || retry > 2)
{ {
@@ -253,8 +253,8 @@ void Calibration_LSI(Cali_LevelTypeDef cali_Lv)
sys_safe_access_disable(); sys_safe_access_disable();
} }
// 细调 // 细调
// 配置细调参数后,丢弃2次捕获值(软件行为)上判断已有一次,这里只留一次 // 配置细调参数后,丢弃2次捕获值(软件行为)上判断已有一次,这里只留一次
sys_safe_access_enable(); sys_safe_access_enable();
R8_OSC_CAL_CTRL &= ~RB_OSC_CNT_TOTAL; R8_OSC_CAL_CTRL &= ~RB_OSC_CNT_TOTAL;
R8_OSC_CAL_CTRL |= cali_Lv; R8_OSC_CAL_CTRL |= cali_Lv;
@@ -279,7 +279,7 @@ void Calibration_LSI(Cali_LevelTypeDef cali_Lv)
sys_safe_access_disable(); sys_safe_access_disable();
} }
while(!(R8_OSC_CAL_CTRL & RB_OSC_CNT_HALT)); // 用于丢弃 while(!(R8_OSC_CAL_CTRL & RB_OSC_CNT_HALT)); // 用于丢弃
SYS_DisableAllIrq(&irqv); SYS_DisableAllIrq(&irqv);
sys_safe_access_enable(); sys_safe_access_enable();
@@ -304,7 +304,7 @@ void Calibration_LSI(Cali_LevelTypeDef cali_Lv)
sys_safe_access_enable(); sys_safe_access_enable();
R8_OSC_CAL_CTRL &= ~RB_OSC_CNT_EN; R8_OSC_CAL_CTRL &= ~RB_OSC_CNT_EN;
sys_safe_access_disable(); sys_safe_access_disable();
i = R16_OSC_CAL_CNT; // 实时校准后采样值 i = R16_OSC_CAL_CNT; // 实时校准后采样值
cnt_offset = (i & 0x3FFF) + R8_OSC_CAL_OV_CNT * 0x3FFF - 4000 * (1 << cali_Lv) * (freq_sys / 1000000) / 256 * 1000/(CAB_LSIFQ/256); cnt_offset = (i & 0x3FFF) + R8_OSC_CAL_OV_CNT * 0x3FFF - 4000 * (1 << cali_Lv) * (freq_sys / 1000000) / 256 * 1000/(CAB_LSIFQ/256);
cnt_offset = (cnt_offset > 0) ? ((((cnt_offset * 2*(100 )) / (1366 * ((1 << cali_Lv)/8) * (freq_sys/1000) / 60000)) + 1) / 2) : ((((cnt_offset * 2*(100)) / (1366 * ((1 << cali_Lv)/8) * (freq_sys/1000) / 60000)) - 1) / 2); cnt_offset = (cnt_offset > 0) ? ((((cnt_offset * 2*(100 )) / (1366 * ((1 << cali_Lv)/8) * (freq_sys/1000) / 60000)) + 1) / 2) : ((((cnt_offset * 2*(100)) / (1366 * ((1 << cali_Lv)/8) * (freq_sys/1000) / 60000)) - 1) / 2);
if((cnt_offset > 0)&&(((R16_INT32K_TUNE>>5)+cnt_offset)>0xFF)) if((cnt_offset > 0)&&(((R16_INT32K_TUNE>>5)+cnt_offset)>0xFF))
@@ -354,14 +354,14 @@ void Calibration_LSI(Cali_LevelTypeDef cali_Lv)
/********************************************************************* /*********************************************************************
* @fn RTCInitTime * @fn RTCInitTime
* *
* @brief RTC时钟初始化当前时间 * @brief RTC时钟初始化当前时间
* *
* @param y - 配置年,MAX_Y = BEGYEAR + 44 * @param y - 配置年,MAX_Y = BEGYEAR + 44
* @param mon - 配置月,MAX_MON = 12 * @param mon - 配置月,MAX_MON = 12
* @param d - 配置日,MAX_D = 31 * @param d - 配置日,MAX_D = 31
* @param h - 配置小时,MAX_H = 23 * @param h - 配置小时,MAX_H = 23
* @param m - 配置分钟,MAX_M = 59 * @param m - 配置分钟,MAX_M = 59
* @param s - 配置秒,MAX_S = 59 * @param s - 配置秒,MAX_S = 59
* *
* @return none * @return none
*/ */
@@ -420,14 +420,14 @@ void RTC_InitTime(uint16_t y, uint16_t mon, uint16_t d, uint16_t h, uint16_t m,
/********************************************************************* /*********************************************************************
* @fn RTC_GetTime * @fn RTC_GetTime
* *
* @brief 获取当前时间 * @brief 获取当前时间
* *
* @param py - 获取到的年,MAX_Y = BEGYEAR + 44 * @param py - 获取到的年,MAX_Y = BEGYEAR + 44
* @param pmon - 获取到的月,MAX_MON = 12 * @param pmon - 获取到的月,MAX_MON = 12
* @param pd - 获取到的日,MAX_D = 31 * @param pd - 获取到的日,MAX_D = 31
* @param ph - 获取到的小时,MAX_H = 23 * @param ph - 获取到的小时,MAX_H = 23
* @param pm - 获取到的分钟,MAX_M = 59 * @param pm - 获取到的分钟,MAX_M = 59
* @param ps - 获取到的秒,MAX_S = 59 * @param ps - 获取到的秒,MAX_S = 59
* *
* @return none * @return none
*/ */
@@ -465,9 +465,9 @@ void RTC_GetTime(uint16_t *py, uint16_t *pmon, uint16_t *pd, uint16_t *ph, uint1
/********************************************************************* /*********************************************************************
* @fn RTC_SetCycle32k * @fn RTC_SetCycle32k
* *
* @brief 基于LSE/LSI时钟,配置当前RTC 周期数 * @brief 基于LSE/LSI时钟,配置当前RTC 周期数
* *
* @param cyc - 配置周期计数初值,MAX_CYC = 0xA8BFFFFF = 2831155199 * @param cyc - 配置周期计数初值,MAX_CYC = 0xA8BFFFFF = 2831155199
* *
* @return none * @return none
*/ */
@@ -489,11 +489,11 @@ void RTC_SetCycle32k(uint32_t cyc)
/********************************************************************* /*********************************************************************
* @fn RTC_GetCycle32k * @fn RTC_GetCycle32k
* *
* @brief 基于LSE/LSI时钟,获取当前RTC 周期数 * @brief 基于LSE/LSI时钟,获取当前RTC 周期数
* *
* @param none * @param none
* *
* @return 当前周期数,MAX_CYC = 0xA8BFFFFF = 2831155199 * @return 当前周期数,MAX_CYC = 0xA8BFFFFF = 2831155199
*/ */
__HIGH_CODE __HIGH_CODE
uint32_t RTC_GetCycle32k(void) uint32_t RTC_GetCycle32k(void)
@@ -510,7 +510,7 @@ uint32_t RTC_GetCycle32k(void)
/********************************************************************* /*********************************************************************
* @fn RTC_TMRFunCfg * @fn RTC_TMRFunCfg
* *
* @brief RTC定时模式配置(注意定时基准固定为32768Hz) * @brief RTC定时模式配置(注意定时基准固定为32768Hz)
* *
* @param t - refer to RTC_TMRCycTypeDef * @param t - refer to RTC_TMRCycTypeDef
* *
@@ -529,9 +529,9 @@ void RTC_TMRFunCfg(RTC_TMRCycTypeDef t)
/********************************************************************* /*********************************************************************
* @fn RTC_TRIGFunCfg * @fn RTC_TRIGFunCfg
* *
* @brief RTC时间触发模式配置 * @brief RTC时间触发模式配置
* *
* @param cyc - 相对当前时间的触发间隔时间,基于LSE/LSI时钟周期数 * @param cyc - 相对当前时间的触发间隔时间,基于LSE/LSI时钟周期数
* *
* @return none * @return none
*/ */
@@ -554,9 +554,9 @@ void RTC_TRIGFunCfg(uint32_t cyc)
/********************************************************************* /*********************************************************************
* @fn RTC_ModeFunDisable * @fn RTC_ModeFunDisable
* *
* @brief RTC 模式功能关闭 * @brief RTC 模式功能关闭
* *
* @param m - 需要关闭的当前模式 * @param m - 需要关闭的当前模式
* *
* @return none * @return none
*/ */
@@ -581,11 +581,11 @@ void RTC_ModeFunDisable(RTC_MODETypeDef m)
/********************************************************************* /*********************************************************************
* @fn RTC_GetITFlag * @fn RTC_GetITFlag
* *
* @brief 获取RTC中断标志 * @brief 获取RTC中断标志
* *
* @param f - refer to RTC_EVENTTypeDef * @param f - refer to RTC_EVENTTypeDef
* *
* @return 中断标志状态 * @return 中断标志状态
*/ */
uint8_t RTC_GetITFlag(RTC_EVENTTypeDef f) uint8_t RTC_GetITFlag(RTC_EVENTTypeDef f)
{ {
@@ -602,7 +602,7 @@ uint8_t RTC_GetITFlag(RTC_EVENTTypeDef f)
/********************************************************************* /*********************************************************************
* @fn RTC_ClearITFlag * @fn RTC_ClearITFlag
* *
* @brief 清除RTC中断标志 * @brief 清除RTC中断标志
* *
* @param f - refer to RTC_EVENTTypeDef * @param f - refer to RTC_EVENTTypeDef
* *
+12 -12
View File
@@ -53,13 +53,13 @@ void FLASH_ROM_READ(uint32_t StartAddr, void *Buffer, uint32_t len)
/********************************************************************* /*********************************************************************
* @fn UserOptionByteConfig * @fn UserOptionByteConfig
* *
* @brief Configure User Option Byte.需在调用用户配置字生效函数后生效,且每次烧录后只能修改一次 * @brief Configure User Option Byte.需在调用用户配置字生效函数后生效,且每次烧录后只能修改一次
* (使用该函数,必须使用官方提供的.S文件,同时调用该函数后,两次上电后,两线调试接口默认关闭) * (使用该函数,必须使用官方提供的.S文件,同时调用该函数后,两次上电后,两线调试接口默认关闭)
* *
* @param RESET_EN - 外部复位引脚使能 * @param RESET_EN - 外部复位引脚使能
* @param BOOT_PIN - ENABLE-使用默认boot脚-PB22,DISABLE-使用boot脚-PB11 * @param BOOT_PIN - ENABLE-使用默认boot脚-PB22,DISABLE-使用boot脚-PB11
* @param UART_NO_KEY_EN - 串口免按键下载使能 * @param UART_NO_KEY_EN - 串口免按键下载使能
* @param FLASHProt_Size - 写保护大小(单位4K) * @param FLASHProt_Size - 写保护大小(单位4K)
* *
* @return 0-Success, 1-Err * @return 0-Success, 1-Err
*/ */
@@ -82,7 +82,7 @@ uint8_t UserOptionByteConfig(FunctionalState RESET_EN, FunctionalState BOOT_PIN,
s &= RESET_Disable; s &= RESET_Disable;
/* bit[7:0]-bit[31-24] */ /* bit[7:0]-bit[31-24] */
s |= ((~(s << 24)) & 0xFF000000); //高8位 配置信息取反; s |= ((~(s << 24)) & 0xFF000000); //高8位 配置信息取反;
if(BOOT_PIN == ENABLE) if(BOOT_PIN == ENABLE)
s |= BOOT_PIN_PB22; s |= BOOT_PIN_PB22;
@@ -111,8 +111,8 @@ uint8_t UserOptionByteConfig(FunctionalState RESET_EN, FunctionalState BOOT_PIN,
/********************************************************************* /*********************************************************************
* @fn UserOptionByteClose_SWD * @fn UserOptionByteClose_SWD
* *
* @brief 关两线调试接口,其余配置值保持不变.需在调用用户配置字生效函数后生效,且每次烧录后只能修改一次 * @brief 关两线调试接口,其余配置值保持不变.需在调用用户配置字生效函数后生效,且每次烧录后只能修改一次
* (使用该函数,必须使用官方提供的.S文件,同时调用该函数后,两次上电后,两线调试接口默认关闭) * (使用该函数,必须使用官方提供的.S文件,同时调用该函数后,两次上电后,两线调试接口默认关闭)
* *
* @return 0-Success, 1-Err * @return 0-Success, 1-Err
*/ */
@@ -126,11 +126,11 @@ uint8_t UserOptionByteClose_SWD(void)
{ {
FLASH_EEPROM_CMD(CMD_GET_ROM_INFO, 0x7EFFC, &s, 4); FLASH_EEPROM_CMD(CMD_GET_ROM_INFO, 0x7EFFC, &s, 4);
s &= ~((1 << 4) | (1 << 7)); //禁用调试功能, 禁用SPI读写FLASH s &= ~((1 << 4) | (1 << 7)); //禁用调试功能, 禁用SPI读写FLASH
/* bit[7:0]-bit[31-24] */ /* bit[7:0]-bit[31-24] */
s &= 0x00FFFFFF; s &= 0x00FFFFFF;
s |= ((~(s << 24)) & 0xFF000000); //高8位 配置信息取反; s |= ((~(s << 24)) & 0xFF000000); //高8位 配置信息取反;
/*Write user option byte*/ /*Write user option byte*/
FLASH_ROM_WRITE(0x14, &s, 4); FLASH_ROM_WRITE(0x14, &s, 4);
@@ -150,7 +150,7 @@ uint8_t UserOptionByteClose_SWD(void)
/********************************************************************* /*********************************************************************
* @fn UserOptionByte_Active * @fn UserOptionByte_Active
* *
* @brief 用户配置字生效函数,执行后自动复位 * @brief 用户配置字生效函数,执行后自动复位
* *
* @return 0-Success, 1-Err * @return 0-Success, 1-Err
*/ */
+23 -23
View File
@@ -15,10 +15,10 @@
/********************************************************************* /*********************************************************************
* @fn GPIOA_ModeCfg * @fn GPIOA_ModeCfg
* *
* @brief GPIOA端口引脚模式配置 * @brief GPIOA端口引脚模式配置
* *
* @param pin - PA0-PA15 * @param pin - PA0-PA15
* @param mode - 输入输出类型 * @param mode - 输入输出类型
* *
* @return none * @return none
*/ */
@@ -62,10 +62,10 @@ void GPIOA_ModeCfg(uint32_t pin, GPIOModeTypeDef mode)
/********************************************************************* /*********************************************************************
* @fn GPIOB_ModeCfg * @fn GPIOB_ModeCfg
* *
* @brief GPIOB端口引脚模式配置 * @brief GPIOB端口引脚模式配置
* *
* @param pin - PB0-PB23 * @param pin - PB0-PB23
* @param mode - 输入输出类型 * @param mode - 输入输出类型
* *
* @return none * @return none
*/ */
@@ -109,10 +109,10 @@ void GPIOB_ModeCfg(uint32_t pin, GPIOModeTypeDef mode)
/********************************************************************* /*********************************************************************
* @fn GPIOA_ITModeCfg * @fn GPIOA_ITModeCfg
* *
* @brief GPIOA引脚中断模式配置 * @brief GPIOA引脚中断模式配置
* *
* @param pin - PA0-PA15 * @param pin - PA0-PA15
* @param mode - 触发类型 * @param mode - 触发类型
* *
* @return none * @return none
*/ */
@@ -120,22 +120,22 @@ void GPIOA_ITModeCfg(uint32_t pin, GPIOITModeTpDef mode)
{ {
switch(mode) switch(mode)
{ {
case GPIO_ITMode_LowLevel: // 低电平触发 case GPIO_ITMode_LowLevel: // 低电平触发
R16_PA_INT_MODE &= ~pin; R16_PA_INT_MODE &= ~pin;
R32_PA_CLR |= pin; R32_PA_CLR |= pin;
break; break;
case GPIO_ITMode_HighLevel: // 高电平触发 case GPIO_ITMode_HighLevel: // 高电平触发
R16_PA_INT_MODE &= ~pin; R16_PA_INT_MODE &= ~pin;
R32_PA_OUT |= pin; R32_PA_OUT |= pin;
break; break;
case GPIO_ITMode_FallEdge: // 下降沿触发 case GPIO_ITMode_FallEdge: // 下降沿触发
R16_PA_INT_MODE |= pin; R16_PA_INT_MODE |= pin;
R32_PA_CLR |= pin; R32_PA_CLR |= pin;
break; break;
case GPIO_ITMode_RiseEdge: // 上升沿触发 case GPIO_ITMode_RiseEdge: // 上升沿触发
R16_PA_INT_MODE |= pin; R16_PA_INT_MODE |= pin;
R32_PA_OUT |= pin; R32_PA_OUT |= pin;
break; break;
@@ -150,10 +150,10 @@ void GPIOA_ITModeCfg(uint32_t pin, GPIOITModeTpDef mode)
/********************************************************************* /*********************************************************************
* @fn GPIOB_ITModeCfg * @fn GPIOB_ITModeCfg
* *
* @brief GPIOB引脚中断模式配置 * @brief GPIOB引脚中断模式配置
* *
* @param pin - PB0-PB23 * @param pin - PB0-PB23
* @param mode - 触发类型 * @param mode - 触发类型
* *
* @return none * @return none
*/ */
@@ -162,22 +162,22 @@ void GPIOB_ITModeCfg(uint32_t pin, GPIOITModeTpDef mode)
uint32_t Pin = pin | ((pin & (GPIO_Pin_22 | GPIO_Pin_23)) >> 14); uint32_t Pin = pin | ((pin & (GPIO_Pin_22 | GPIO_Pin_23)) >> 14);
switch(mode) switch(mode)
{ {
case GPIO_ITMode_LowLevel: // 低电平触发 case GPIO_ITMode_LowLevel: // 低电平触发
R16_PB_INT_MODE &= ~Pin; R16_PB_INT_MODE &= ~Pin;
R32_PB_CLR |= pin; R32_PB_CLR |= pin;
break; break;
case GPIO_ITMode_HighLevel: // 高电平触发 case GPIO_ITMode_HighLevel: // 高电平触发
R16_PB_INT_MODE &= ~Pin; R16_PB_INT_MODE &= ~Pin;
R32_PB_OUT |= pin; R32_PB_OUT |= pin;
break; break;
case GPIO_ITMode_FallEdge: // 下降沿触发 case GPIO_ITMode_FallEdge: // 下降沿触发
R16_PB_INT_MODE |= Pin; R16_PB_INT_MODE |= Pin;
R32_PB_CLR |= pin; R32_PB_CLR |= pin;
break; break;
case GPIO_ITMode_RiseEdge: // 上升沿触发 case GPIO_ITMode_RiseEdge: // 上升沿触发
R16_PB_INT_MODE |= Pin; R16_PB_INT_MODE |= Pin;
R32_PB_OUT |= pin; R32_PB_OUT |= pin;
break; break;
@@ -192,9 +192,9 @@ void GPIOB_ITModeCfg(uint32_t pin, GPIOITModeTpDef mode)
/********************************************************************* /*********************************************************************
* @fn GPIOPinRemap * @fn GPIOPinRemap
* *
* @brief 外设功能引脚映射 * @brief 外设功能引脚映射
* *
* @param s - 是否使能映射 * @param s - 是否使能映射
* @param perph - RB_RF_ANT_SW_EN - RF antenna switch control output on PA4/PA5/PA12/PA13/PA14/PA15 * @param perph - RB_RF_ANT_SW_EN - RF antenna switch control output on PA4/PA5/PA12/PA13/PA14/PA15
* RB_PIN_U0_INV - RXD0/RXD0_/TXD0/TXD0_ invert input/output * RB_PIN_U0_INV - RXD0/RXD0_/TXD0/TXD0_ invert input/output
* RB_PIN_INTX - INTX: INT24/INT25 PB8/PB9 -> INT24_/INT25_ PB22/PB23 * RB_PIN_INTX - INTX: INT24/INT25 PB8/PB9 -> INT24_/INT25_ PB22/PB23
@@ -228,12 +228,12 @@ void GPIOPinRemap(FunctionalState s, uint16_t perph)
/********************************************************************* /*********************************************************************
* @fn GPIOAGPPCfg * @fn GPIOAGPPCfg
* *
* @brief 模拟外设GPIO引脚功能控制 * @brief 模拟外设GPIO引脚功能控制
* *
* @param s - ENABLE - 打开模拟外设功能,关闭数字功能 * @param s - ENABLE - 打开模拟外设功能,关闭数字功能
* DISABLE - 启用数字功能,关闭模拟外设功能 * DISABLE - 启用数字功能,关闭模拟外设功能
* @param perph - RB_PIN_USB_DP_PU - USB UD+引脚内部上拉电阻 * @param perph - RB_PIN_USB_DP_PU - USB UD+引脚内部上拉电阻
* RB_PIN_USB_IE - USB 引脚 * RB_PIN_USB_IE - USB 引脚
* *
* @return none * @return none
*/ */
+5 -5
View File
@@ -15,15 +15,15 @@
/******************************************************************************* /*******************************************************************************
* Function Name : LCD_DefInit * Function Name : LCD_DefInit
* Description : LCD段式屏驱动初始化配置 * Description : LCD段式屏驱动初始化配置
* Input : duty 占空比 * Input : duty 占空比
* bias 偏压比 * bias 偏压比
* Return : None * Return : None
*******************************************************************************/ *******************************************************************************/
void LCD_Init(LCDDutyTypeDef duty, LCDBiasTypeDef bias) void LCD_Init(LCDDutyTypeDef duty, LCDBiasTypeDef bias)
{ {
R32_PIN_CONFIG2 = 0xfffeff3f; // 关闭数字输入 R32_PIN_CONFIG2 = 0xfffeff3f; // 关闭数字输入
R16_PIN_ALTERNATE |= RB_DEBUG_EN; // 操作LCD时,需关闭debug R16_PIN_ALTERNATE |= RB_DEBUG_EN; // 操作LCD时,需关闭debug
R32_LCD_CMD = 0x1ffff << 8; R32_LCD_CMD = 0x1ffff << 8;
R32_LCD_CMD |= RB_LCD_SYS_EN | RB_LCD_ON | R32_LCD_CMD |= RB_LCD_SYS_EN | RB_LCD_ON |
(LCD_CLK_128 << 5) | (LCD_CLK_128 << 5) |
+10 -10
View File
@@ -15,7 +15,7 @@
/********************************************************************* /*********************************************************************
* @fn PWMX_CycleCfg * @fn PWMX_CycleCfg
* *
* @brief PWM4-PWM11周期配置 * @brief PWM4-PWM11周期配置
* *
* @param cyc - refer to PWMX_CycleTypeDef * @param cyc - refer to PWMX_CycleTypeDef
* *
@@ -57,9 +57,9 @@ void PWMX_CycleCfg(PWMX_CycleTypeDef cyc)
/********************************************************************* /*********************************************************************
* @fn PWMX_16bit_CycleCfg * @fn PWMX_16bit_CycleCfg
* *
* @brief PWM4-PWM9 16位周期配置 * @brief PWM4-PWM9 16位周期配置
* *
* @param cyc - 16位周期 * @param cyc - 16位周期
* *
* @return none * @return none
*/ */
@@ -72,7 +72,7 @@ void PWMX_16bit_CycleCfg(uint16_t cyc)
/********************************************************************* /*********************************************************************
* @fn PWMX_16bit_ACTOUT * @fn PWMX_16bit_ACTOUT
* *
* @brief PWM4-PWM9 通道16位输出波形配置 * @brief PWM4-PWM9 通道16位输出波形配置
* *
* @param ch - select channel of pwm, refer to channel of PWM define * @param ch - select channel of pwm, refer to channel of PWM define
* @param da - effective pulse width * @param da - effective pulse width
@@ -113,7 +113,7 @@ void PWMX_16bit_ACTOUT(uint8_t ch, uint16_t da, PWMX_PolarTypeDef pr, Functional
/********************************************************************* /*********************************************************************
* @fn PWMX_ACTOUT * @fn PWMX_ACTOUT
* *
* @brief PWM4-PWM11通道输出波形配置 * @brief PWM4-PWM11通道输出波形配置
* *
* @param ch - select channel of pwm, refer to channel of PWM define * @param ch - select channel of pwm, refer to channel of PWM define
* @param da - effective pulse width * @param da - effective pulse width
@@ -147,13 +147,13 @@ void PWMX_ACTOUT(uint8_t ch, uint8_t da, PWMX_PolarTypeDef pr, FunctionalState s
/********************************************************************* /*********************************************************************
* @fn PWMX_AlterOutCfg * @fn PWMX_AlterOutCfg
* *
* @brief PWM 交替输出模式配置 * @brief PWM 交替输出模式配置
* *
* @param ch - select group of PWM alternate output * @param ch - select group of PWM alternate output
* RB_PWM4_5_STAG_EN - PWM4 和 PWM5 通道交替输出 * RB_PWM4_5_STAG_EN - PWM4 和 PWM5 通道交替输出
* RB_PWM6_7_STAG_EN - PWM6 和 PWM7 通道交替输出 * RB_PWM6_7_STAG_EN - PWM6 和 PWM7 通道交替输出
* RB_PWM8_9_STAG_EN - PWM8 和 PWM9 通道交替输出 * RB_PWM8_9_STAG_EN - PWM8 和 PWM9 通道交替输出
* RB_PWM10_11_STAG_EN - PWM10 和 PWM11 通道交替输出 * RB_PWM10_11_STAG_EN - PWM10 和 PWM11 通道交替输出
* @param s - control pwmx function, ENABLE or DISABLE * @param s - control pwmx function, ENABLE or DISABLE
* *
* @return none * @return none
+43 -43
View File
@@ -15,9 +15,9 @@
/********************************************************************* /*********************************************************************
* @fn PWR_DCDCCfg * @fn PWR_DCDCCfg
* *
* @brief 启用内部DC/DC电源,用于节约系统功耗 * @brief 启用内部DC/DC电源,用于节约系统功耗
* *
* @param s - 是否打开DCDC电源 * @param s - 是否打开DCDC电源
* *
* @return none * @return none
*/ */
@@ -30,7 +30,7 @@ void PWR_DCDCCfg(FunctionalState s)
{ {
adj &= ~RB_DCDC_CHARGE; adj &= ~RB_DCDC_CHARGE;
plan &= ~(RB_PWR_DCDC_EN | RB_PWR_DCDC_PRE); // 旁路 DC/DC plan &= ~(RB_PWR_DCDC_EN | RB_PWR_DCDC_PRE); // 旁路 DC/DC
sys_safe_access_enable(); sys_safe_access_enable();
R16_AUX_POWER_ADJ = adj; R16_AUX_POWER_ADJ = adj;
R16_POWER_PLAN = plan; R16_POWER_PLAN = plan;
@@ -60,9 +60,9 @@ void PWR_DCDCCfg(FunctionalState s)
/********************************************************************* /*********************************************************************
* @fn PWR_UnitModCfg * @fn PWR_UnitModCfg
* *
* @brief 可控单元模块的电源控制 * @brief 可控单元模块的电源控制
* *
* @param s - 是否打开电源 * @param s - 是否打开电源
* @param unit - please refer to unit of controllable power supply * @param unit - please refer to unit of controllable power supply
* *
* @return none * @return none
@@ -71,11 +71,11 @@ void PWR_UnitModCfg(FunctionalState s, uint8_t unit)
{ {
uint8_t ck32k_cfg = R8_CK32K_CONFIG; uint8_t ck32k_cfg = R8_CK32K_CONFIG;
if(s == DISABLE) //关闭 if(s == DISABLE) //关闭
{ {
ck32k_cfg &= ~(unit & 0x03); ck32k_cfg &= ~(unit & 0x03);
} }
else //打开 else //打开
{ {
ck32k_cfg |= (unit & 0x03); ck32k_cfg |= (unit & 0x03);
} }
@@ -88,9 +88,9 @@ void PWR_UnitModCfg(FunctionalState s, uint8_t unit)
/********************************************************************* /*********************************************************************
* @fn PWR_PeriphClkCfg * @fn PWR_PeriphClkCfg
* *
* @brief 外设时钟控制位 * @brief 外设时钟控制位
* *
* @param s - 是否打开对应外设时钟 * @param s - 是否打开对应外设时钟
* @param perph - please refer to Peripher CLK control bit define * @param perph - please refer to Peripher CLK control bit define
* *
* @return none * @return none
@@ -116,14 +116,14 @@ void PWR_PeriphClkCfg(FunctionalState s, uint16_t perph)
/********************************************************************* /*********************************************************************
* @fn PWR_PeriphWakeUpCfg * @fn PWR_PeriphWakeUpCfg
* *
* @brief 睡眠唤醒源配置 * @brief 睡眠唤醒源配置
* *
* @param s - 是否打开此外设睡眠唤醒功能 * @param s - 是否打开此外设睡眠唤醒功能
* @param perph - 需要设置的唤醒源 * @param perph - 需要设置的唤醒源
* RB_SLP_USB_WAKE - USB 为唤醒源 * RB_SLP_USB_WAKE - USB 为唤醒源
* RB_SLP_RTC_WAKE - RTC 为唤醒源 * RB_SLP_RTC_WAKE - RTC 为唤醒源
* RB_SLP_GPIO_WAKE - GPIO 为唤醒源 * RB_SLP_GPIO_WAKE - GPIO 为唤醒源
* RB_SLP_BAT_WAKE - BAT 为唤醒源 * RB_SLP_BAT_WAKE - BAT 为唤醒源
* @param mode - refer to WakeUP_ModeypeDef * @param mode - refer to WakeUP_ModeypeDef
* *
* @return none * @return none
@@ -170,9 +170,9 @@ void PWR_PeriphWakeUpCfg(FunctionalState s, uint8_t perph, WakeUP_ModeypeDef mod
/********************************************************************* /*********************************************************************
* @fn PowerMonitor * @fn PowerMonitor
* *
* @brief 电源监控 * @brief 电源监控
* *
* @param s - 是否打开此功能 * @param s - 是否打开此功能
* @param vl - refer to VolM_LevelypeDef * @param vl - refer to VolM_LevelypeDef
* *
* @return none * @return none
@@ -216,7 +216,7 @@ void PowerMonitor(FunctionalState s, VolM_LevelypeDef vl)
/********************************************************************* /*********************************************************************
* @fn LowPower_Idle * @fn LowPower_Idle
* *
* @brief 低功耗-Idle模式 * @brief 低功耗-Idle模式
* *
* @param none * @param none
* *
@@ -226,7 +226,7 @@ __HIGH_CODE
void LowPower_Idle(void) void LowPower_Idle(void)
{ {
FLASH_ROM_SW_RESET(); FLASH_ROM_SW_RESET();
R8_FLASH_CTRL = 0x04; //flash关闭 R8_FLASH_CTRL = 0x04; //flash关闭
PFIC->SCTLR &= ~(1 << 2); // sleep PFIC->SCTLR &= ~(1 << 2); // sleep
__WFI(); __WFI();
@@ -237,7 +237,7 @@ void LowPower_Idle(void)
/********************************************************************* /*********************************************************************
* @fn LowPower_Halt * @fn LowPower_Halt
* *
* @brief 低功耗-Halt模式,此低功耗切到HSI/5时钟运行,唤醒后需要用户自己重新选择系统时钟源 * @brief 低功耗-Halt模式,此低功耗切到HSI/5时钟运行,唤醒后需要用户自己重新选择系统时钟源
* *
* @param none * @param none
* *
@@ -249,14 +249,14 @@ void LowPower_Halt(void)
uint8_t x32Kpw, x32Mpw; uint8_t x32Kpw, x32Mpw;
FLASH_ROM_SW_RESET(); FLASH_ROM_SW_RESET();
R8_FLASH_CTRL = 0x04; //flash关闭 R8_FLASH_CTRL = 0x04; //flash关闭
x32Kpw = R8_XT32K_TUNE; x32Kpw = R8_XT32K_TUNE;
x32Mpw = R8_XT32M_TUNE; x32Mpw = R8_XT32M_TUNE;
x32Mpw = (x32Mpw & 0xfc) | 0x03; // 150%额定电流 x32Mpw = (x32Mpw & 0xfc) | 0x03; // 150%额定电流
x32Kpw = (x32Kpw & 0xfc) | 0x01; // LSE驱动电流降低到额定电流 x32Kpw = (x32Kpw & 0xfc) | 0x01; // LSE驱动电流降低到额定电流
sys_safe_access_enable(); sys_safe_access_enable();
R8_BAT_DET_CTRL = 0; // 关闭电压监控 R8_BAT_DET_CTRL = 0; // 关闭电压监控
sys_safe_access_disable(); sys_safe_access_disable();
sys_safe_access_enable(); sys_safe_access_enable();
R8_XT32K_TUNE = x32Kpw; R8_XT32K_TUNE = x32Kpw;
@@ -277,14 +277,14 @@ void LowPower_Halt(void)
/******************************************************************************* /*******************************************************************************
* Function Name : LowPower_Sleep * Function Name : LowPower_Sleep
* Description : 低功耗-Sleep模式。 * Description : 低功耗-Sleep模式。
注意当主频为80M时,睡眠唤醒中断不可调用flash内代码,且退出此函数前需要加上30us延迟。 注意当主频为80M时,睡眠唤醒中断不可调用flash内代码,且退出此函数前需要加上30us延迟。
* Input : rm: * Input : rm:
RB_PWR_RAM2K - 2K retention SRAM 供电 RB_PWR_RAM2K - 2K retention SRAM 供电
RB_PWR_RAM24K - 24K main SRAM 供电 RB_PWR_RAM24K - 24K main SRAM 供电
RB_PWR_EXTEND - USB 和 BLE 单元保留区域供电 RB_PWR_EXTEND - USB 和 BLE 单元保留区域供电
RB_PWR_XROM - FlashROM 供电 RB_PWR_XROM - FlashROM 供电
NULL - 以上单元都断电 NULL - 以上单元都断电
* Return : None * Return : None
*******************************************************************************/ *******************************************************************************/
__HIGH_CODE __HIGH_CODE
@@ -297,10 +297,10 @@ void LowPower_Sleep(uint16_t rm)
GetMACAddress(MacAddr); GetMACAddress(MacAddr);
x32Mpw = R8_XT32M_TUNE; x32Mpw = R8_XT32M_TUNE;
x32Mpw = (x32Mpw & 0xfc) | 0x03; // 150%额定电流 x32Mpw = (x32Mpw & 0xfc) | 0x03; // 150%额定电流
sys_safe_access_enable(); sys_safe_access_enable();
R8_BAT_DET_CTRL = 0; // 关闭电压监控 R8_BAT_DET_CTRL = 0; // 关闭电压监控
sys_safe_access_disable(); sys_safe_access_disable();
sys_safe_access_enable(); sys_safe_access_enable();
R8_XT32M_TUNE = x32Mpw; R8_XT32M_TUNE = x32Mpw;
@@ -350,13 +350,13 @@ void LowPower_Sleep(uint16_t rm)
/********************************************************************* /*********************************************************************
* @fn LowPower_Shutdown * @fn LowPower_Shutdown
* *
* @brief 低功耗-Shutdown模式,此低功耗切到HSI/5时钟运行,唤醒后需要用户自己重新选择系统时钟源 * @brief 低功耗-Shutdown模式,此低功耗切到HSI/5时钟运行,唤醒后需要用户自己重新选择系统时钟源
* @note 注意调用此函数,DCDC功能强制关闭,唤醒后可以手动再次打开 * @note 注意调用此函数,DCDC功能强制关闭,唤醒后可以手动再次打开
* *
* @param rm - 供电模块选择 * @param rm - 供电模块选择
* RB_PWR_RAM2K - 2K retention SRAM 供电 * RB_PWR_RAM2K - 2K retention SRAM 供电
* RB_PWR_RAM16K - 16K main SRAM 供电 * RB_PWR_RAM16K - 16K main SRAM 供电
* NULL - 以上单元都断电 * NULL - 以上单元都断电
* *
* @return none * @return none
*/ */
@@ -368,11 +368,11 @@ void LowPower_Shutdown(uint16_t rm)
FLASH_ROM_SW_RESET(); FLASH_ROM_SW_RESET();
x32Kpw = R8_XT32K_TUNE; x32Kpw = R8_XT32K_TUNE;
x32Mpw = R8_XT32M_TUNE; x32Mpw = R8_XT32M_TUNE;
x32Mpw = (x32Mpw & 0xfc) | 0x03; // 150%额定电流 x32Mpw = (x32Mpw & 0xfc) | 0x03; // 150%额定电流
x32Kpw = (x32Kpw & 0xfc) | 0x01; // LSE驱动电流降低到额定电流 x32Kpw = (x32Kpw & 0xfc) | 0x01; // LSE驱动电流降低到额定电流
sys_safe_access_enable(); sys_safe_access_enable();
R8_BAT_DET_CTRL = 0; // 关闭电压监控 R8_BAT_DET_CTRL = 0; // 关闭电压监控
sys_safe_access_disable(); sys_safe_access_disable();
sys_safe_access_enable(); sys_safe_access_enable();
R8_XT32K_TUNE = x32Kpw; R8_XT32K_TUNE = x32Kpw;
+50 -50
View File
@@ -15,7 +15,7 @@
/********************************************************************* /*********************************************************************
* @fn SPI0_MasterDefInit * @fn SPI0_MasterDefInit
* *
* @brief 主机模式默认初始化:模式0+3线全双工+8MHz * @brief 主机模式默认初始化:模式0+3线全双工+8MHz
* *
* @param none * @param none
* *
@@ -23,19 +23,19 @@
*/ */
void SPI0_MasterDefInit(void) void SPI0_MasterDefInit(void)
{ {
R8_SPI0_CLOCK_DIV = 4; // 主频时钟4分频 R8_SPI0_CLOCK_DIV = 4; // 主频时钟4分频
R8_SPI0_CTRL_MOD = RB_SPI_ALL_CLEAR; R8_SPI0_CTRL_MOD = RB_SPI_ALL_CLEAR;
R8_SPI0_CTRL_MOD = RB_SPI_MOSI_OE | RB_SPI_SCK_OE; R8_SPI0_CTRL_MOD = RB_SPI_MOSI_OE | RB_SPI_SCK_OE;
R8_SPI0_CTRL_CFG |= RB_SPI_AUTO_IF; // 访问BUFFER/FIFO自动清除IF_BYTE_END标志 R8_SPI0_CTRL_CFG |= RB_SPI_AUTO_IF; // 访问BUFFER/FIFO自动清除IF_BYTE_END标志
R8_SPI0_CTRL_CFG &= ~RB_SPI_DMA_ENABLE; // 不启动DMA方式 R8_SPI0_CTRL_CFG &= ~RB_SPI_DMA_ENABLE; // 不启动DMA方式
} }
/********************************************************************* /*********************************************************************
* @fn SPI0_CLKCfg * @fn SPI0_CLKCfg
* *
* @brief SPI0 基准时钟配置,= d*Tsys * @brief SPI0 基准时钟配置,= d*Tsys
* *
* @param c - 时钟分频系数 * @param c - 时钟分频系数
* *
* @return none * @return none
*/ */
@@ -55,9 +55,9 @@ void SPI0_CLKCfg(uint8_t c)
/********************************************************************* /*********************************************************************
* @fn SPI0_DataMode * @fn SPI0_DataMode
* *
* @brief 设置数据流模式 * @brief 设置数据流模式
* *
* @param m - 数据流模式 refer to ModeBitOrderTypeDef * @param m - 数据流模式 refer to ModeBitOrderTypeDef
* *
* @return none * @return none
*/ */
@@ -89,9 +89,9 @@ void SPI0_DataMode(ModeBitOrderTypeDef m)
/********************************************************************* /*********************************************************************
* @fn SPI0_MasterSendByte * @fn SPI0_MasterSendByte
* *
* @brief 发送单字节 (buffer) * @brief 发送单字节 (buffer)
* *
* @param d - 发送字节 * @param d - 发送字节
* *
* @return none * @return none
*/ */
@@ -105,16 +105,16 @@ void SPI0_MasterSendByte(uint8_t d)
/********************************************************************* /*********************************************************************
* @fn SPI0_MasterRecvByte * @fn SPI0_MasterRecvByte
* *
* @brief 接收单字节 (buffer) * @brief 接收单字节 (buffer)
* *
* @param none * @param none
* *
* @return 接收到的字节 * @return 接收到的字节
*/ */
uint8_t SPI0_MasterRecvByte(void) uint8_t SPI0_MasterRecvByte(void)
{ {
R8_SPI0_CTRL_MOD &= ~RB_SPI_FIFO_DIR; R8_SPI0_CTRL_MOD &= ~RB_SPI_FIFO_DIR;
R8_SPI0_BUFFER = 0xFF; // 启动传输 R8_SPI0_BUFFER = 0xFF; // 启动传输
while(!(R8_SPI0_INT_FLAG & RB_SPI_FREE)); while(!(R8_SPI0_INT_FLAG & RB_SPI_FREE));
return (R8_SPI0_BUFFER); return (R8_SPI0_BUFFER);
} }
@@ -122,10 +122,10 @@ uint8_t SPI0_MasterRecvByte(void)
/********************************************************************* /*********************************************************************
* @fn SPI0_MasterTrans * @fn SPI0_MasterTrans
* *
* @brief 使用FIFO连续发送多字节 * @brief 使用FIFO连续发送多字节
* *
* @param pbuf - 待发送的数据内容首地址 * @param pbuf - 待发送的数据内容首地址
* @param len - 请求发送的数据长度,最大4095 * @param len - 请求发送的数据长度,最大4095
* *
* @return none * @return none
*/ */
@@ -134,8 +134,8 @@ void SPI0_MasterTrans(uint8_t *pbuf, uint16_t len)
uint16_t sendlen; uint16_t sendlen;
sendlen = len; sendlen = len;
R8_SPI0_CTRL_MOD &= ~RB_SPI_FIFO_DIR; // 设置数据方向为输出 R8_SPI0_CTRL_MOD &= ~RB_SPI_FIFO_DIR; // 设置数据方向为输出
R16_SPI0_TOTAL_CNT = sendlen; // 设置要发送的数据长度 R16_SPI0_TOTAL_CNT = sendlen; // 设置要发送的数据长度
R8_SPI0_INT_FLAG = RB_SPI_IF_CNT_END; R8_SPI0_INT_FLAG = RB_SPI_IF_CNT_END;
while(sendlen) while(sendlen)
{ {
@@ -146,16 +146,16 @@ void SPI0_MasterTrans(uint8_t *pbuf, uint16_t len)
sendlen--; sendlen--;
} }
} }
while(R8_SPI0_FIFO_COUNT != 0); // 等待FIFO中的数据全部发送完成 while(R8_SPI0_FIFO_COUNT != 0); // 等待FIFO中的数据全部发送完成
} }
/********************************************************************* /*********************************************************************
* @fn SPI0_MasterRecv * @fn SPI0_MasterRecv
* *
* @brief 使用FIFO连续接收多字节 * @brief 使用FIFO连续接收多字节
* *
* @param pbuf - 待接收的数据首地址 * @param pbuf - 待接收的数据首地址
* @param len - 待接收的数据长度,最大4095 * @param len - 待接收的数据长度,最大4095
* *
* @return none * @return none
*/ */
@@ -164,8 +164,8 @@ void SPI0_MasterRecv(uint8_t *pbuf, uint16_t len)
uint16_t readlen; uint16_t readlen;
readlen = len; readlen = len;
R8_SPI0_CTRL_MOD |= RB_SPI_FIFO_DIR; // 设置数据方向为输入 R8_SPI0_CTRL_MOD |= RB_SPI_FIFO_DIR; // 设置数据方向为输入
R16_SPI0_TOTAL_CNT = len; // 设置需要接收的数据长度,FIFO方向为输入长度不为0则会启动传输 */ R16_SPI0_TOTAL_CNT = len; // 设置需要接收的数据长度,FIFO方向为输入长度不为0则会启动传输 */
R8_SPI0_INT_FLAG = RB_SPI_IF_CNT_END; R8_SPI0_INT_FLAG = RB_SPI_IF_CNT_END;
while(readlen) while(readlen)
{ {
@@ -181,10 +181,10 @@ void SPI0_MasterRecv(uint8_t *pbuf, uint16_t len)
/********************************************************************* /*********************************************************************
* @fn SPI0_MasterDMATrans * @fn SPI0_MasterDMATrans
* *
* @brief DMA方式连续发送数据 * @brief DMA方式连续发送数据
* *
* @param pbuf - 待发送数据起始地址,需要四字节对其 * @param pbuf - 待发送数据起始地址,需要四字节对其
* @param len - 待发送数据长度 * @param len - 待发送数据长度
* *
* @return none * @return none
*/ */
@@ -203,10 +203,10 @@ void SPI0_MasterDMATrans(uint8_t *pbuf, uint16_t len)
/********************************************************************* /*********************************************************************
* @fn SPI0_MasterDMARecv * @fn SPI0_MasterDMARecv
* *
* @brief DMA方式连续接收数据 * @brief DMA方式连续接收数据
* *
* @param pbuf - 待接收数据存放起始地址,需要四字节对其 * @param pbuf - 待接收数据存放起始地址,需要四字节对其
* @param len - 待接收数据长度 * @param len - 待接收数据长度
* *
* @return none * @return none
*/ */
@@ -225,7 +225,7 @@ void SPI0_MasterDMARecv(uint8_t *pbuf, uint16_t len)
/********************************************************************* /*********************************************************************
* @fn SPI0_SlaveInit * @fn SPI0_SlaveInit
* *
* @brief 设备模式默认初始化,建议设置MISO的GPIO对应为输入模式 * @brief 设备模式默认初始化,建议设置MISO的GPIO对应为输入模式
* *
* @return none * @return none
*/ */
@@ -239,9 +239,9 @@ void SPI0_SlaveInit(void)
/********************************************************************* /*********************************************************************
* @fn SPI0_SlaveRecvByte * @fn SPI0_SlaveRecvByte
* *
* @brief 从机模式,接收一字节数据 * @brief 从机模式,接收一字节数据
* *
* @return 接收到数据 * @return 接收到数据
*/ */
uint8_t SPI0_SlaveRecvByte(void) uint8_t SPI0_SlaveRecvByte(void)
{ {
@@ -253,9 +253,9 @@ uint8_t SPI0_SlaveRecvByte(void)
/********************************************************************* /*********************************************************************
* @fn SPI0_SlaveSendByte * @fn SPI0_SlaveSendByte
* *
* @brief 从机模式,发送一字节数据 * @brief 从机模式,发送一字节数据
* *
* @param d - 待发送数据 * @param d - 待发送数据
* *
* @return none * @return none
*/ */
@@ -263,16 +263,16 @@ void SPI0_SlaveSendByte(uint8_t d)
{ {
R8_SPI0_CTRL_MOD &= ~RB_SPI_FIFO_DIR; R8_SPI0_CTRL_MOD &= ~RB_SPI_FIFO_DIR;
R8_SPI0_FIFO = d; R8_SPI0_FIFO = d;
while(R8_SPI0_FIFO_COUNT != 0); // 等待发送完成 while(R8_SPI0_FIFO_COUNT != 0); // 等待发送完成
} }
/********************************************************************* /*********************************************************************
* @fn SPI0_SlaveRecv * @fn SPI0_SlaveRecv
* *
* @brief 从机模式,接收多字节数据 * @brief 从机模式,接收多字节数据
* *
* @param pbuf - 接收收数据存放起始地址 * @param pbuf - 接收收数据存放起始地址
* @param len - 请求接收数据长度 * @param len - 请求接收数据长度
* *
* @return none * @return none
*/ */
@@ -298,10 +298,10 @@ void SPI0_SlaveRecv(uint8_t *pbuf, uint16_t len)
/********************************************************************* /*********************************************************************
* @fn SPI0_SlaveTrans * @fn SPI0_SlaveTrans
* *
* @brief 从机模式,发送多字节数据 * @brief 从机模式,发送多字节数据
* *
* @param pbuf - 待发送的数据内容首地址 * @param pbuf - 待发送的数据内容首地址
* @param len - 请求发送的数据长度,最大4095 * @param len - 请求发送的数据长度,最大4095
* *
* @return none * @return none
*/ */
@@ -311,7 +311,7 @@ void SPI0_SlaveTrans(uint8_t *pbuf, uint16_t len)
uint16_t sendlen; uint16_t sendlen;
sendlen = len; sendlen = len;
R8_SPI0_CTRL_MOD &= ~RB_SPI_FIFO_DIR; // 设置数据方向为输出 R8_SPI0_CTRL_MOD &= ~RB_SPI_FIFO_DIR; // 设置数据方向为输出
R8_SPI0_INT_FLAG = RB_SPI_IF_CNT_END; R8_SPI0_INT_FLAG = RB_SPI_IF_CNT_END;
while(sendlen) while(sendlen)
{ {
@@ -322,16 +322,16 @@ void SPI0_SlaveTrans(uint8_t *pbuf, uint16_t len)
sendlen--; sendlen--;
} }
} }
while(R8_SPI0_FIFO_COUNT != 0); // 等待FIFO中的数据全部发送完成 while(R8_SPI0_FIFO_COUNT != 0); // 等待FIFO中的数据全部发送完成
} }
/********************************************************************* /*********************************************************************
* @fn SPI0_SlaveDMARecv * @fn SPI0_SlaveDMARecv
* *
* @brief DMA方式连续接收数据 * @brief DMA方式连续接收数据
* *
* @param pbuf - 待接收数据存放起始地址,需要四字节对其 * @param pbuf - 待接收数据存放起始地址,需要四字节对其
* @param len - 待接收数据长度 * @param len - 待接收数据长度
* *
* @return none * @return none
*/ */
@@ -350,10 +350,10 @@ void SPI0_SlaveDMARecv(uint8_t *pbuf, uint16_t len)
/********************************************************************* /*********************************************************************
* @fn SPI0_SlaveDMATrans * @fn SPI0_SlaveDMATrans
* *
* @brief DMA方式连续发送数据 * @brief DMA方式连续发送数据
* *
* @param pbuf - 待发送数据起始地址,需要四字节对其 * @param pbuf - 待发送数据起始地址,需要四字节对其
* @param len - 待发送数据长度 * @param len - 待发送数据长度
* *
* @return none * @return none
*/ */
+34 -34
View File
@@ -15,9 +15,9 @@
/********************************************************************* /*********************************************************************
* @fn SetSysClock * @fn SetSysClock
* *
* @brief 配置系统运行时钟 * @brief 配置系统运行时钟
* *
* @param sc - 系统时钟源选择 refer to SYS_CLKTypeDef * @param sc - 系统时钟源选择 refer to SYS_CLKTypeDef
* *
* @return none * @return none
*/ */
@@ -61,7 +61,7 @@ void SetSysClock(SYS_CLKTypeDef sc)
R32_CLK_SYS_CFG |= RB_CLK_SYS_MOD; R32_CLK_SYS_CFG |= RB_CLK_SYS_MOD;
sys_safe_access_disable(); sys_safe_access_disable();
} }
//更改FLASH clk的驱动能力 //更改FLASH clk的驱动能力
sys_safe_access_enable(); sys_safe_access_enable();
R8_PLL_CONFIG |= 1 << 7; R8_PLL_CONFIG |= 1 << 7;
sys_safe_access_disable(); sys_safe_access_disable();
@@ -70,7 +70,7 @@ void SetSysClock(SYS_CLKTypeDef sc)
/********************************************************************* /*********************************************************************
* @fn GetSysClock * @fn GetSysClock
* *
* @brief 获取当前系统时钟 * @brief 获取当前系统时钟
* *
* @param none * @param none
* *
@@ -82,15 +82,15 @@ uint32_t GetSysClock(void)
rev = R32_CLK_SYS_CFG & 0xff; rev = R32_CLK_SYS_CFG & 0xff;
if((rev & 0x40) == (0 << 6)) if((rev & 0x40) == (0 << 6))
{ // 32M进行分频 { // 32M进行分频
return (32000000 / (rev & 0x1f)); return (32000000 / (rev & 0x1f));
} }
else if((rev & RB_CLK_SYS_MOD) == (1 << 6)) else if((rev & RB_CLK_SYS_MOD) == (1 << 6))
{ // PLL进行分频 { // PLL进行分频
return (480000000 / (rev & 0x1f)); return (480000000 / (rev & 0x1f));
} }
else else
{ // 32K做主频 { // 32K做主频
return (32000); return (32000);
} }
} }
@@ -98,11 +98,11 @@ uint32_t GetSysClock(void)
/********************************************************************* /*********************************************************************
* @fn SYS_GetInfoSta * @fn SYS_GetInfoSta
* *
* @brief 获取当前系统信息状态 * @brief 获取当前系统信息状态
* *
* @param i - refer to SYS_InfoStaTypeDef * @param i - refer to SYS_InfoStaTypeDef
* *
* @return 是否开启 * @return 是否开启
*/ */
uint8_t SYS_GetInfoSta(SYS_InfoStaTypeDef i) uint8_t SYS_GetInfoSta(SYS_InfoStaTypeDef i)
{ {
@@ -119,7 +119,7 @@ uint8_t SYS_GetInfoSta(SYS_InfoStaTypeDef i)
/********************************************************************* /*********************************************************************
* @fn SYS_ResetExecute * @fn SYS_ResetExecute
* *
* @brief 执行系统软件复位 * @brief 执行系统软件复位
* *
* @param none * @param none
* *
@@ -137,9 +137,9 @@ void SYS_ResetExecute(void)
/********************************************************************* /*********************************************************************
* @fn SYS_DisableAllIrq * @fn SYS_DisableAllIrq
* *
* @brief 关闭所有中断,并保留当前中断值 * @brief 关闭所有中断,并保留当前中断值
* *
* @param pirqv - 当前保留中断值 * @param pirqv - 当前保留中断值
* *
* @return none * @return none
*/ */
@@ -153,9 +153,9 @@ void SYS_DisableAllIrq(uint32_t *pirqv)
/********************************************************************* /*********************************************************************
* @fn SYS_RecoverIrq * @fn SYS_RecoverIrq
* *
* @brief 恢复之前关闭的中断值 * @brief 恢复之前关闭的中断值
* *
* @param irq_status - 当前保留中断值 * @param irq_status - 当前保留中断值
* *
* @return none * @return none
*/ */
@@ -168,11 +168,11 @@ void SYS_RecoverIrq(uint32_t irq_status)
/********************************************************************* /*********************************************************************
* @fn SYS_GetSysTickCnt * @fn SYS_GetSysTickCnt
* *
* @brief 获取当前系统(SYSTICK)计数值 * @brief 获取当前系统(SYSTICK)计数值
* *
* @param none * @param none
* *
* @return 当前计数值 * @return 当前计数值
*/ */
uint32_t SYS_GetSysTickCnt(void) uint32_t SYS_GetSysTickCnt(void)
{ {
@@ -185,9 +185,9 @@ uint32_t SYS_GetSysTickCnt(void)
/********************************************************************* /*********************************************************************
* @fn WWDG_ITCfg * @fn WWDG_ITCfg
* *
* @brief 看门狗定时器溢出中断使能 * @brief 看门狗定时器溢出中断使能
* *
* @param s - 溢出是否中断 * @param s - 溢出是否中断
* *
* @return none * @return none
*/ */
@@ -212,9 +212,9 @@ void WWDG_ITCfg(FunctionalState s)
/********************************************************************* /*********************************************************************
* @fn WWDG_ResetCfg * @fn WWDG_ResetCfg
* *
* @brief 看门狗定时器复位功能 * @brief 看门狗定时器复位功能
* *
* @param s - 溢出是否复位 * @param s - 溢出是否复位
* *
* @return none * @return none
*/ */
@@ -239,7 +239,7 @@ void WWDG_ResetCfg(FunctionalState s)
/********************************************************************* /*********************************************************************
* @fn WWDG_ClearFlag * @fn WWDG_ClearFlag
* *
* @brief 清除看门狗中断标志,重新加载计数值也可清除 * @brief 清除看门狗中断标志,重新加载计数值也可清除
* *
* @param none * @param none
* *
@@ -255,7 +255,7 @@ void WWDG_ClearFlag(void)
/********************************************************************* /*********************************************************************
* @fn HardFault_Handler * @fn HardFault_Handler
* *
* @brief 硬件错误中断,进入后执行复位,复位类型为上电复位 * @brief 硬件错误中断,进入后执行复位,复位类型为上电复位
* *
* @param none * @param none
* *
@@ -279,9 +279,9 @@ void HardFault_Handler(void)
/********************************************************************* /*********************************************************************
* @fn mDelayuS * @fn mDelayuS
* *
* @brief uS 延时 * @brief uS 延时
* *
* @param t - 时间参数 * @param t - 时间参数
* *
* @return none * @return none
*/ */
@@ -323,9 +323,9 @@ void mDelayuS(uint16_t t)
/********************************************************************* /*********************************************************************
* @fn mDelaymS * @fn mDelaymS
* *
* @brief mS 延时 * @brief mS 延时
* *
* @param t - 时间参数 * @param t - 时间参数
* *
* @return none * @return none
*/ */
@@ -347,17 +347,17 @@ int _write(int fd, char *buf, int size)
for(i = 0; i < size; i++) for(i = 0; i < size; i++)
{ {
#if DEBUG == Debug_UART0 #if DEBUG == Debug_UART0
while(R8_UART0_TFC == UART_FIFO_SIZE); /* 等待数据发送 */ while(R8_UART0_TFC == UART_FIFO_SIZE); /* 等待数据发送 */
R8_UART0_THR = *buf++; /* 发送数据 */ R8_UART0_THR = *buf++; /* 发送数据 */
#elif DEBUG == Debug_UART1 #elif DEBUG == Debug_UART1
while(R8_UART1_TFC == UART_FIFO_SIZE); /* 等待数据发送 */ while(R8_UART1_TFC == UART_FIFO_SIZE); /* 等待数据发送 */
R8_UART1_THR = *buf++; /* 发送数据 */ R8_UART1_THR = *buf++; /* 发送数据 */
#elif DEBUG == Debug_UART2 #elif DEBUG == Debug_UART2
while(R8_UART2_TFC == UART_FIFO_SIZE); /* 等待数据发送 */ while(R8_UART2_TFC == UART_FIFO_SIZE); /* 等待数据发送 */
R8_UART2_THR = *buf++; /* 发送数据 */ R8_UART2_THR = *buf++; /* 发送数据 */
#elif DEBUG == Debug_UART3 #elif DEBUG == Debug_UART3
while(R8_UART3_TFC == UART_FIFO_SIZE); /* 等待数据发送 */ while(R8_UART3_TFC == UART_FIFO_SIZE); /* 等待数据发送 */
R8_UART3_THR = *buf++; /* 发送数据 */ R8_UART3_THR = *buf++; /* 发送数据 */
#endif #endif
} }
return size; return size;
+6 -6
View File
@@ -15,9 +15,9 @@
/********************************************************************* /*********************************************************************
* @fn TMR0_TimerInit * @fn TMR0_TimerInit
* *
* @brief 定时功能初始化 * @brief 定时功能初始化
* *
* @param t - 定时时间,基于当前系统时钟Tsys, 最长定时周期 67108864 * @param t - 定时时间,基于当前系统时钟Tsys, 最长定时周期 67108864
* *
* @return none * @return none
*/ */
@@ -31,9 +31,9 @@ void TMR0_TimerInit(uint32_t t)
/********************************************************************* /*********************************************************************
* @fn TMR0_EXTSingleCounterInit * @fn TMR0_EXTSingleCounterInit
* *
* @brief 边沿计数功能初始化 * @brief 边沿计数功能初始化
* *
* @param cap - 采集计数类型 * @param cap - 采集计数类型
* *
* @return none * @return none
*/ */
@@ -46,7 +46,7 @@ void TMR0_EXTSingleCounterInit(CapModeTypeDef cap)
/********************************************************************* /*********************************************************************
* @fn TMR0_PWMInit * @fn TMR0_PWMInit
* *
* @brief PWM 输出初始化 * @brief PWM 输出初始化
* *
* @param pr - select wave polar, refer to PWMX_PolarTypeDef * @param pr - select wave polar, refer to PWMX_PolarTypeDef
* @param ts - set pwm repeat times, refer to PWM_RepeatTsTypeDef * @param ts - set pwm repeat times, refer to PWM_RepeatTsTypeDef
@@ -62,7 +62,7 @@ void TMR0_PWMInit(PWMX_PolarTypeDef pr, PWM_RepeatTsTypeDef ts)
/********************************************************************* /*********************************************************************
* @fn TMR0_CapInit * @fn TMR0_CapInit
* *
* @brief 外部信号捕捉功能初始化 * @brief 外部信号捕捉功能初始化
* *
* @param cap - select capture mode, refer to CapModeTypeDef * @param cap - select capture mode, refer to CapModeTypeDef
* *
+11 -11
View File
@@ -15,9 +15,9 @@
/********************************************************************* /*********************************************************************
* @fn TMR1_TimerInit * @fn TMR1_TimerInit
* *
* @brief 定时功能初始化 * @brief 定时功能初始化
* *
* @param t - 定时时间,基于当前系统时钟Tsys, 最长定时周期 67108864 * @param t - 定时时间,基于当前系统时钟Tsys, 最长定时周期 67108864
* *
* @return none * @return none
*/ */
@@ -31,9 +31,9 @@ void TMR1_TimerInit(uint32_t t)
/********************************************************************* /*********************************************************************
* @fn TMR1_EXTSingleCounterInit * @fn TMR1_EXTSingleCounterInit
* *
* @brief 边沿计数功能初始化 * @brief 边沿计数功能初始化
* *
* @param cap - 采集计数类型 * @param cap - 采集计数类型
* *
* @return none * @return none
*/ */
@@ -46,7 +46,7 @@ void TMR1_EXTSingleCounterInit(CapModeTypeDef cap)
/********************************************************************* /*********************************************************************
* @fn TMR1_PWMInit * @fn TMR1_PWMInit
* *
* @brief PWM 输出初始化 * @brief PWM 输出初始化
* *
* @param pr - select wave polar, refer to PWMX_PolarTypeDef * @param pr - select wave polar, refer to PWMX_PolarTypeDef
* @param ts - set pwm repeat times, refer to PWM_RepeatTsTypeDef * @param ts - set pwm repeat times, refer to PWM_RepeatTsTypeDef
@@ -62,7 +62,7 @@ void TMR1_PWMInit(PWMX_PolarTypeDef pr, PWM_RepeatTsTypeDef ts)
/********************************************************************* /*********************************************************************
* @fn TMR1_CapInit * @fn TMR1_CapInit
* *
* @brief 外部信号捕捉功能初始化 * @brief 外部信号捕捉功能初始化
* *
* @param cap - select capture mode, refer to CapModeTypeDef * @param cap - select capture mode, refer to CapModeTypeDef
* *
@@ -77,12 +77,12 @@ void TMR1_CapInit(CapModeTypeDef cap)
/********************************************************************* /*********************************************************************
* @fn TMR1_DMACfg * @fn TMR1_DMACfg
* *
* @brief 配置DMA功能 * @brief 配置DMA功能
* *
* @param s - 是否打开DMA功能 * @param s - 是否打开DMA功能
* @param startAddr - DMA 起始地址 * @param startAddr - DMA 起始地址
* @param endAddr - DMA 结束地址 * @param endAddr - DMA 结束地址
* @param m - 配置DMA模式 * @param m - 配置DMA模式
* *
* @return none * @return none
*/ */
+11 -11
View File
@@ -15,9 +15,9 @@
/********************************************************************* /*********************************************************************
* @fn TMR2_TimerInit * @fn TMR2_TimerInit
* *
* @brief 定时功能初始化 * @brief 定时功能初始化
* *
* @param t - 定时时间,基于当前系统时钟Tsys, 最长定时周期 67108864 * @param t - 定时时间,基于当前系统时钟Tsys, 最长定时周期 67108864
* *
* @return none * @return none
*/ */
@@ -31,9 +31,9 @@ void TMR2_TimerInit(uint32_t t)
/********************************************************************* /*********************************************************************
* @fn TMR2_EXTSingleCounterInit * @fn TMR2_EXTSingleCounterInit
* *
* @brief 边沿计数功能初始化 * @brief 边沿计数功能初始化
* *
* @param cap - 采集计数类型 * @param cap - 采集计数类型
* *
* @return none * @return none
*/ */
@@ -46,7 +46,7 @@ void TMR2_EXTSingleCounterInit(CapModeTypeDef cap)
/********************************************************************* /*********************************************************************
* @fn TMR2_PWMInit * @fn TMR2_PWMInit
* *
* @brief PWM 输出初始化 * @brief PWM 输出初始化
* *
* @param pr - select wave polar, refer to PWMX_PolarTypeDef * @param pr - select wave polar, refer to PWMX_PolarTypeDef
* @param ts - set pwm repeat times, refer to PWM_RepeatTsTypeDef * @param ts - set pwm repeat times, refer to PWM_RepeatTsTypeDef
@@ -62,7 +62,7 @@ void TMR2_PWMInit(PWMX_PolarTypeDef pr, PWM_RepeatTsTypeDef ts)
/********************************************************************* /*********************************************************************
* @fn TMR2_CapInit * @fn TMR2_CapInit
* *
* @brief 外部信号捕捉功能初始化 * @brief 外部信号捕捉功能初始化
* *
* @param cap - select capture mode, refer to CapModeTypeDef * @param cap - select capture mode, refer to CapModeTypeDef
* *
@@ -77,12 +77,12 @@ void TMR2_CapInit(CapModeTypeDef cap)
/********************************************************************* /*********************************************************************
* @fn TMR2_DMACfg * @fn TMR2_DMACfg
* *
* @brief 配置DMA功能 * @brief 配置DMA功能
* *
* @param s - 是否打开DMA功能 * @param s - 是否打开DMA功能
* @param startAddr - DMA 起始地址 * @param startAddr - DMA 起始地址
* @param endAddr - DMA 结束地址 * @param endAddr - DMA 结束地址
* @param m - 配置DMA模式 * @param m - 配置DMA模式
* *
* @return none * @return none
*/ */
+6 -6
View File
@@ -15,9 +15,9 @@
/********************************************************************* /*********************************************************************
* @fn TMR3_TimerInit * @fn TMR3_TimerInit
* *
* @brief 定时功能初始化 * @brief 定时功能初始化
* *
* @param t - 定时时间,基于当前系统时钟Tsys, 最长定时周期 67108864 * @param t - 定时时间,基于当前系统时钟Tsys, 最长定时周期 67108864
* *
* @return none * @return none
*/ */
@@ -31,9 +31,9 @@ void TMR3_TimerInit(uint32_t t)
/********************************************************************* /*********************************************************************
* @fn TMR3_EXTSingleCounterInit * @fn TMR3_EXTSingleCounterInit
* *
* @brief 边沿计数功能初始化 * @brief 边沿计数功能初始化
* *
* @param cap - 采集计数类型 * @param cap - 采集计数类型
* *
* @return none * @return none
*/ */
@@ -46,7 +46,7 @@ void TMR3_EXTSingleCounterInit(CapModeTypeDef cap)
/********************************************************************* /*********************************************************************
* @fn TMR3_PWMInit * @fn TMR3_PWMInit
* *
* @brief PWM 输出初始化 * @brief PWM 输出初始化
* *
* @param pr - select wave polar, refer to PWMX_PolarTypeDef * @param pr - select wave polar, refer to PWMX_PolarTypeDef
* @param ts - set pwm repeat times, refer to PWM_RepeatTsTypeDef * @param ts - set pwm repeat times, refer to PWM_RepeatTsTypeDef
@@ -62,7 +62,7 @@ void TMR3_PWMInit(PWMX_PolarTypeDef pr, PWM_RepeatTsTypeDef ts)
/********************************************************************* /*********************************************************************
* @fn TMR3_CapInit * @fn TMR3_CapInit
* *
* @brief 外部信号捕捉功能初始化 * @brief 外部信号捕捉功能初始化
* *
* @param cap - select capture mode, refer to CapModeTypeDef * @param cap - select capture mode, refer to CapModeTypeDef
* *
+20 -20
View File
@@ -15,7 +15,7 @@
/********************************************************************* /*********************************************************************
* @fn UART0_DefInit * @fn UART0_DefInit
* *
* @brief 串口默认初始化配置 * @brief 串口默认初始化配置
* *
* @param none * @param none
* *
@@ -24,7 +24,7 @@
void UART0_DefInit(void) void UART0_DefInit(void)
{ {
UART0_BaudRateCfg(115200); UART0_BaudRateCfg(115200);
R8_UART0_FCR = (2 << 6) | RB_FCR_TX_FIFO_CLR | RB_FCR_RX_FIFO_CLR | RB_FCR_FIFO_EN; // FIFO打开,触发点4字节 R8_UART0_FCR = (2 << 6) | RB_FCR_TX_FIFO_CLR | RB_FCR_RX_FIFO_CLR | RB_FCR_FIFO_EN; // FIFO打开,触发点4字节
R8_UART0_LCR = RB_LCR_WORD_SZ; R8_UART0_LCR = RB_LCR_WORD_SZ;
R8_UART0_IER = RB_IER_TXD_EN; R8_UART0_IER = RB_IER_TXD_EN;
R8_UART0_DIV = 1; R8_UART0_DIV = 1;
@@ -33,9 +33,9 @@ void UART0_DefInit(void)
/********************************************************************* /*********************************************************************
* @fn UART0_BaudRateCfg * @fn UART0_BaudRateCfg
* *
* @brief 串口波特率配置 * @brief 串口波特率配置
* *
* @param baudrate - 波特率 * @param baudrate - 波特率
* *
* @return none * @return none
*/ */
@@ -51,9 +51,9 @@ void UART0_BaudRateCfg(uint32_t baudrate)
/********************************************************************* /*********************************************************************
* @fn UART0_ByteTrigCfg * @fn UART0_ByteTrigCfg
* *
* @brief 串口字节触发中断配置 * @brief 串口字节触发中断配置
* *
* @param b - 触发字节数 refer to UARTByteTRIGTypeDef * @param b - 触发字节数 refer to UARTByteTRIGTypeDef
* *
* @return none * @return none
*/ */
@@ -65,14 +65,14 @@ void UART0_ByteTrigCfg(UARTByteTRIGTypeDef b)
/********************************************************************* /*********************************************************************
* @fn UART0_INTCfg * @fn UART0_INTCfg
* *
* @brief 串口中断配置 * @brief 串口中断配置
* *
* @param s - 中断控制状态,是否使能相应中断 * @param s - 中断控制状态,是否使能相应中断
* @param i - 中断类型 * @param i - 中断类型
* RB_IER_MODEM_CHG - 调制解调器输入状态变化中断使能位(仅 UART0 支持) * RB_IER_MODEM_CHG - 调制解调器输入状态变化中断使能位(仅 UART0 支持)
* RB_IER_LINE_STAT - 接收线路状态中断 * RB_IER_LINE_STAT - 接收线路状态中断
* RB_IER_THR_EMPTY - 发送保持寄存器空中断 * RB_IER_THR_EMPTY - 发送保持寄存器空中断
* RB_IER_RECV_RDY - 接收数据中断 * RB_IER_RECV_RDY - 接收数据中断
* *
* @return none * @return none
*/ */
@@ -92,7 +92,7 @@ void UART0_INTCfg(FunctionalState s, uint8_t i)
/********************************************************************* /*********************************************************************
* @fn UART0_Reset * @fn UART0_Reset
* *
* @brief 串口软件复位 * @brief 串口软件复位
* *
* @param none * @param none
* *
@@ -106,10 +106,10 @@ void UART0_Reset(void)
/********************************************************************* /*********************************************************************
* @fn UART0_SendString * @fn UART0_SendString
* *
* @brief 串口多字节发送 * @brief 串口多字节发送
* *
* @param buf - 待发送的数据内容首地址 * @param buf - 待发送的数据内容首地址
* @param l - 待发送的数据长度 * @param l - 待发送的数据长度
* *
* @return none * @return none
*/ */
@@ -130,11 +130,11 @@ void UART0_SendString(uint8_t *buf, uint16_t l)
/********************************************************************* /*********************************************************************
* @fn UART0_RecvString * @fn UART0_RecvString
* *
* @brief 串口读取多字节 * @brief 串口读取多字节
* *
* @param buf - 读取数据存放缓存区首地址 * @param buf - 读取数据存放缓存区首地址
* *
* @return 读取数据长度 * @return 读取数据长度
*/ */
uint16_t UART0_RecvString(uint8_t *buf) uint16_t UART0_RecvString(uint8_t *buf)
{ {
+20 -20
View File
@@ -15,7 +15,7 @@
/********************************************************************* /*********************************************************************
* @fn UART1_DefInit * @fn UART1_DefInit
* *
* @brief 串口默认初始化配置 * @brief 串口默认初始化配置
* *
* @param none * @param none
* *
@@ -24,7 +24,7 @@
void UART1_DefInit(void) void UART1_DefInit(void)
{ {
UART1_BaudRateCfg(115200); UART1_BaudRateCfg(115200);
R8_UART1_FCR = (2 << 6) | RB_FCR_TX_FIFO_CLR | RB_FCR_RX_FIFO_CLR | RB_FCR_FIFO_EN; // FIFO打开,触发点4字节 R8_UART1_FCR = (2 << 6) | RB_FCR_TX_FIFO_CLR | RB_FCR_RX_FIFO_CLR | RB_FCR_FIFO_EN; // FIFO打开,触发点4字节
R8_UART1_LCR = RB_LCR_WORD_SZ; R8_UART1_LCR = RB_LCR_WORD_SZ;
R8_UART1_IER = RB_IER_TXD_EN; R8_UART1_IER = RB_IER_TXD_EN;
R8_UART1_DIV = 1; R8_UART1_DIV = 1;
@@ -33,9 +33,9 @@ void UART1_DefInit(void)
/********************************************************************* /*********************************************************************
* @fn UART1_BaudRateCfg * @fn UART1_BaudRateCfg
* *
* @brief 串口波特率配置 * @brief 串口波特率配置
* *
* @param baudrate - 波特率 * @param baudrate - 波特率
* *
* @return none * @return none
*/ */
@@ -51,9 +51,9 @@ void UART1_BaudRateCfg(uint32_t baudrate)
/********************************************************************* /*********************************************************************
* @fn UART1_ByteTrigCfg * @fn UART1_ByteTrigCfg
* *
* @brief 串口字节触发中断配置 * @brief 串口字节触发中断配置
* *
* @param b - 触发字节数 refer to UARTByteTRIGTypeDef * @param b - 触发字节数 refer to UARTByteTRIGTypeDef
* *
* @return none * @return none
*/ */
@@ -65,14 +65,14 @@ void UART1_ByteTrigCfg(UARTByteTRIGTypeDef b)
/********************************************************************* /*********************************************************************
* @fn UART1_INTCfg * @fn UART1_INTCfg
* *
* @brief 串口中断配置 * @brief 串口中断配置
* *
* @param s - 中断控制状态,是否使能相应中断 * @param s - 中断控制状态,是否使能相应中断
* @param i - 中断类型 * @param i - 中断类型
* RB_IER_MODEM_CHG - 调制解调器输入状态变化中断使能位(仅 UART0 支持) * RB_IER_MODEM_CHG - 调制解调器输入状态变化中断使能位(仅 UART0 支持)
* RB_IER_LINE_STAT - 接收线路状态中断 * RB_IER_LINE_STAT - 接收线路状态中断
* RB_IER_THR_EMPTY - 发送保持寄存器空中断 * RB_IER_THR_EMPTY - 发送保持寄存器空中断
* RB_IER_RECV_RDY - 接收数据中断 * RB_IER_RECV_RDY - 接收数据中断
* *
* @return none * @return none
*/ */
@@ -92,7 +92,7 @@ void UART1_INTCfg(FunctionalState s, uint8_t i)
/********************************************************************* /*********************************************************************
* @fn UART1_Reset * @fn UART1_Reset
* *
* @brief 串口软件复位 * @brief 串口软件复位
* *
* @param none * @param none
* *
@@ -106,10 +106,10 @@ void UART1_Reset(void)
/********************************************************************* /*********************************************************************
* @fn UART1_SendString * @fn UART1_SendString
* *
* @brief 串口多字节发送 * @brief 串口多字节发送
* *
* @param buf - 待发送的数据内容首地址 * @param buf - 待发送的数据内容首地址
* @param l - 待发送的数据长度 * @param l - 待发送的数据长度
* *
* @return none * @return none
*/ */
@@ -130,11 +130,11 @@ void UART1_SendString(uint8_t *buf, uint16_t l)
/********************************************************************* /*********************************************************************
* @fn UART1_RecvString * @fn UART1_RecvString
* *
* @brief 串口读取多字节 * @brief 串口读取多字节
* *
* @param buf - 读取数据存放缓存区首地址 * @param buf - 读取数据存放缓存区首地址
* *
* @return 读取数据长度 * @return 读取数据长度
*/ */
uint16_t UART1_RecvString(uint8_t *buf) uint16_t UART1_RecvString(uint8_t *buf)
{ {
+20 -20
View File
@@ -15,7 +15,7 @@
/********************************************************************* /*********************************************************************
* @fn UART2_DefInit * @fn UART2_DefInit
* *
* @brief 串口默认初始化配置 * @brief 串口默认初始化配置
* *
* @param none * @param none
* *
@@ -24,7 +24,7 @@
void UART2_DefInit(void) void UART2_DefInit(void)
{ {
UART2_BaudRateCfg(115200); UART2_BaudRateCfg(115200);
R8_UART2_FCR = (2 << 6) | RB_FCR_TX_FIFO_CLR | RB_FCR_RX_FIFO_CLR | RB_FCR_FIFO_EN; // FIFO打开,触发点4字节 R8_UART2_FCR = (2 << 6) | RB_FCR_TX_FIFO_CLR | RB_FCR_RX_FIFO_CLR | RB_FCR_FIFO_EN; // FIFO打开,触发点4字节
R8_UART2_LCR = RB_LCR_WORD_SZ; R8_UART2_LCR = RB_LCR_WORD_SZ;
R8_UART2_IER = RB_IER_TXD_EN; R8_UART2_IER = RB_IER_TXD_EN;
R8_UART2_DIV = 1; R8_UART2_DIV = 1;
@@ -33,9 +33,9 @@ void UART2_DefInit(void)
/********************************************************************* /*********************************************************************
* @fn UART2_BaudRateCfg * @fn UART2_BaudRateCfg
* *
* @brief 串口波特率配置 * @brief 串口波特率配置
* *
* @param baudrate - 波特率 * @param baudrate - 波特率
* *
* @return none * @return none
*/ */
@@ -51,9 +51,9 @@ void UART2_BaudRateCfg(uint32_t baudrate)
/********************************************************************* /*********************************************************************
* @fn UART2_ByteTrigCfg * @fn UART2_ByteTrigCfg
* *
* @brief 串口字节触发中断配置 * @brief 串口字节触发中断配置
* *
* @param b - 触发字节数 refer to UARTByteTRIGTypeDef * @param b - 触发字节数 refer to UARTByteTRIGTypeDef
* *
* @return none * @return none
*/ */
@@ -65,14 +65,14 @@ void UART2_ByteTrigCfg(UARTByteTRIGTypeDef b)
/********************************************************************* /*********************************************************************
* @fn UART2_INTCfg * @fn UART2_INTCfg
* *
* @brief 串口中断配置 * @brief 串口中断配置
* *
* @param s - 中断控制状态,是否使能相应中断 * @param s - 中断控制状态,是否使能相应中断
* @param i - 中断类型 * @param i - 中断类型
* RB_IER_MODEM_CHG - 调制解调器输入状态变化中断使能位(仅 UART0 支持) * RB_IER_MODEM_CHG - 调制解调器输入状态变化中断使能位(仅 UART0 支持)
* RB_IER_LINE_STAT - 接收线路状态中断 * RB_IER_LINE_STAT - 接收线路状态中断
* RB_IER_THR_EMPTY - 发送保持寄存器空中断 * RB_IER_THR_EMPTY - 发送保持寄存器空中断
* RB_IER_RECV_RDY - 接收数据中断 * RB_IER_RECV_RDY - 接收数据中断
* *
* @return none * @return none
*/ */
@@ -92,7 +92,7 @@ void UART2_INTCfg(FunctionalState s, uint8_t i)
/********************************************************************* /*********************************************************************
* @fn UART2_Reset * @fn UART2_Reset
* *
* @brief 串口软件复位 * @brief 串口软件复位
* *
* @param none * @param none
* *
@@ -106,10 +106,10 @@ void UART2_Reset(void)
/********************************************************************* /*********************************************************************
* @fn UART2_SendString * @fn UART2_SendString
* *
* @brief 串口多字节发送 * @brief 串口多字节发送
* *
* @param buf - 待发送的数据内容首地址 * @param buf - 待发送的数据内容首地址
* @param l - 待发送的数据长度 * @param l - 待发送的数据长度
* *
* @return none * @return none
*/ */
@@ -130,11 +130,11 @@ void UART2_SendString(uint8_t *buf, uint16_t l)
/********************************************************************* /*********************************************************************
* @fn UART2_RecvString * @fn UART2_RecvString
* *
* @brief 串口读取多字节 * @brief 串口读取多字节
* *
* @param buf - 读取数据存放缓存区首地址 * @param buf - 读取数据存放缓存区首地址
* *
* @return 读取数据长度 * @return 读取数据长度
*/ */
uint16_t UART2_RecvString(uint8_t *buf) uint16_t UART2_RecvString(uint8_t *buf)
{ {
+20 -20
View File
@@ -15,7 +15,7 @@
/********************************************************************* /*********************************************************************
* @fn UART3_DefInit * @fn UART3_DefInit
* *
* @brief 串口默认初始化配置 * @brief 串口默认初始化配置
* *
* @param none * @param none
* *
@@ -24,7 +24,7 @@
void UART3_DefInit(void) void UART3_DefInit(void)
{ {
UART3_BaudRateCfg(115200); UART3_BaudRateCfg(115200);
R8_UART3_FCR = (2 << 6) | RB_FCR_TX_FIFO_CLR | RB_FCR_RX_FIFO_CLR | RB_FCR_FIFO_EN; // FIFO打开,触发点4字节 R8_UART3_FCR = (2 << 6) | RB_FCR_TX_FIFO_CLR | RB_FCR_RX_FIFO_CLR | RB_FCR_FIFO_EN; // FIFO打开,触发点4字节
R8_UART3_LCR = RB_LCR_WORD_SZ; R8_UART3_LCR = RB_LCR_WORD_SZ;
R8_UART3_IER = RB_IER_TXD_EN; R8_UART3_IER = RB_IER_TXD_EN;
R8_UART3_DIV = 1; R8_UART3_DIV = 1;
@@ -33,9 +33,9 @@ void UART3_DefInit(void)
/********************************************************************* /*********************************************************************
* @fn UART3_BaudRateCfg * @fn UART3_BaudRateCfg
* *
* @brief 串口波特率配置 * @brief 串口波特率配置
* *
* @param baudrate - 波特率 * @param baudrate - 波特率
* *
* @return none * @return none
*/ */
@@ -51,9 +51,9 @@ void UART3_BaudRateCfg(uint32_t baudrate)
/********************************************************************* /*********************************************************************
* @fn UART3_ByteTrigCfg * @fn UART3_ByteTrigCfg
* *
* @brief 串口字节触发中断配置 * @brief 串口字节触发中断配置
* *
* @param b - 触发字节数 refer to UARTByteTRIGTypeDef * @param b - 触发字节数 refer to UARTByteTRIGTypeDef
* *
* @return none * @return none
*/ */
@@ -65,14 +65,14 @@ void UART3_ByteTrigCfg(UARTByteTRIGTypeDef b)
/********************************************************************* /*********************************************************************
* @fn UART3_INTCfg * @fn UART3_INTCfg
* *
* @brief 串口中断配置 * @brief 串口中断配置
* *
* @param s - 中断控制状态,是否使能相应中断 * @param s - 中断控制状态,是否使能相应中断
* @param i - 中断类型 * @param i - 中断类型
* RB_IER_MODEM_CHG - 调制解调器输入状态变化中断使能位(仅 UART0 支持) * RB_IER_MODEM_CHG - 调制解调器输入状态变化中断使能位(仅 UART0 支持)
* RB_IER_LINE_STAT - 接收线路状态中断 * RB_IER_LINE_STAT - 接收线路状态中断
* RB_IER_THR_EMPTY - 发送保持寄存器空中断 * RB_IER_THR_EMPTY - 发送保持寄存器空中断
* RB_IER_RECV_RDY - 接收数据中断 * RB_IER_RECV_RDY - 接收数据中断
* *
* @return none * @return none
*/ */
@@ -92,7 +92,7 @@ void UART3_INTCfg(FunctionalState s, uint8_t i)
/********************************************************************* /*********************************************************************
* @fn UART3_Reset * @fn UART3_Reset
* *
* @brief 串口软件复位 * @brief 串口软件复位
* *
* @param none * @param none
* *
@@ -106,10 +106,10 @@ void UART3_Reset(void)
/********************************************************************* /*********************************************************************
* @fn UART3_SendString * @fn UART3_SendString
* *
* @brief 串口多字节发送 * @brief 串口多字节发送
* *
* @param buf - 待发送的数据内容首地址 * @param buf - 待发送的数据内容首地址
* @param l - 待发送的数据长度 * @param l - 待发送的数据长度
* *
* @return none * @return none
*/ */
@@ -130,11 +130,11 @@ void UART3_SendString(uint8_t *buf, uint16_t l)
/********************************************************************* /*********************************************************************
* @fn UART3_RecvString * @fn UART3_RecvString
* *
* @brief 串口读取多字节 * @brief 串口读取多字节
* *
* @param buf - 读取数据存放缓存区首地址 * @param buf - 读取数据存放缓存区首地址
* *
* @return 读取数据长度 * @return 读取数据长度
*/ */
uint16_t UART3_RecvString(uint8_t *buf) uint16_t UART3_RecvString(uint8_t *buf)
{ {
+16 -16
View File
@@ -20,7 +20,7 @@ uint8_t *pEP3_RAM_Addr;
/********************************************************************* /*********************************************************************
* @fn USB_DeviceInit * @fn USB_DeviceInit
* *
* @brief USB设备功能初始化,4个端点,8个通道。 * @brief USB设备功能初始化,4个端点,8个通道。
* *
* @param none * @param none
* *
@@ -28,10 +28,10 @@ uint8_t *pEP3_RAM_Addr;
*/ */
void USB_DeviceInit(void) void USB_DeviceInit(void)
{ {
R8_USB_CTRL = 0x00; // 先设定模式,取消 RB_UC_CLR_ALL R8_USB_CTRL = 0x00; // 先设定模式,取消 RB_UC_CLR_ALL
R8_UEP4_1_MOD = RB_UEP4_RX_EN | RB_UEP4_TX_EN | RB_UEP1_RX_EN | RB_UEP1_TX_EN; // 端点4 OUT+IN,端点1 OUT+IN R8_UEP4_1_MOD = RB_UEP4_RX_EN | RB_UEP4_TX_EN | RB_UEP1_RX_EN | RB_UEP1_TX_EN; // 端点4 OUT+IN,端点1 OUT+IN
R8_UEP2_3_MOD = RB_UEP2_RX_EN | RB_UEP2_TX_EN | RB_UEP3_RX_EN | RB_UEP3_TX_EN; // 端点2 OUT+IN,端点3 OUT+IN R8_UEP2_3_MOD = RB_UEP2_RX_EN | RB_UEP2_TX_EN | RB_UEP3_RX_EN | RB_UEP3_TX_EN; // 端点2 OUT+IN,端点3 OUT+IN
R16_UEP0_DMA = (uint16_t)(uint32_t)pEP0_RAM_Addr; R16_UEP0_DMA = (uint16_t)(uint32_t)pEP0_RAM_Addr;
R16_UEP1_DMA = (uint16_t)(uint32_t)pEP1_RAM_Addr; R16_UEP1_DMA = (uint16_t)(uint32_t)pEP1_RAM_Addr;
@@ -45,19 +45,19 @@ void USB_DeviceInit(void)
R8_UEP4_CTRL = UEP_R_RES_ACK | UEP_T_RES_NAK; R8_UEP4_CTRL = UEP_R_RES_ACK | UEP_T_RES_NAK;
R8_USB_DEV_AD = 0x00; R8_USB_DEV_AD = 0x00;
R8_USB_CTRL = RB_UC_DEV_PU_EN | RB_UC_INT_BUSY | RB_UC_DMA_EN; // 启动USB设备及DMA,在中断期间中断标志未清除前自动返回NAK R8_USB_CTRL = RB_UC_DEV_PU_EN | RB_UC_INT_BUSY | RB_UC_DMA_EN; // 启动USB设备及DMA,在中断期间中断标志未清除前自动返回NAK
R16_PIN_ANALOG_IE |= RB_PIN_USB_IE | RB_PIN_USB_DP_PU; // 防止USB端口浮空及上拉电阻 R16_PIN_ANALOG_IE |= RB_PIN_USB_IE | RB_PIN_USB_DP_PU; // 防止USB端口浮空及上拉电阻
R8_USB_INT_FG = 0xFF; // 清中断标志 R8_USB_INT_FG = 0xFF; // 清中断标志
R8_UDEV_CTRL = RB_UD_PD_DIS | RB_UD_PORT_EN; // 允许USB端口 R8_UDEV_CTRL = RB_UD_PD_DIS | RB_UD_PORT_EN; // 允许USB端口
R8_USB_INT_EN = RB_UIE_SUSPEND | RB_UIE_BUS_RST | RB_UIE_TRANSFER; R8_USB_INT_EN = RB_UIE_SUSPEND | RB_UIE_BUS_RST | RB_UIE_TRANSFER;
} }
/********************************************************************* /*********************************************************************
* @fn DevEP1_IN_Deal * @fn DevEP1_IN_Deal
* *
* @brief 端点1数据上传 * @brief 端点1数据上传
* *
* @param l - 上传数据长度(<64B) * @param l - 上传数据长度(<64B)
* *
* @return none * @return none
*/ */
@@ -70,9 +70,9 @@ void DevEP1_IN_Deal(uint8_t l)
/********************************************************************* /*********************************************************************
* @fn DevEP2_IN_Deal * @fn DevEP2_IN_Deal
* *
* @brief 端点2数据上传 * @brief 端点2数据上传
* *
* @param l - 上传数据长度(<64B) * @param l - 上传数据长度(<64B)
* *
* @return none * @return none
*/ */
@@ -85,9 +85,9 @@ void DevEP2_IN_Deal(uint8_t l)
/********************************************************************* /*********************************************************************
* @fn DevEP3_IN_Deal * @fn DevEP3_IN_Deal
* *
* @brief 端点3数据上传 * @brief 端点3数据上传
* *
* @param l - 上传数据长度(<64B) * @param l - 上传数据长度(<64B)
* *
* @return none * @return none
*/ */
@@ -100,9 +100,9 @@ void DevEP3_IN_Deal(uint8_t l)
/********************************************************************* /*********************************************************************
* @fn DevEP4_IN_Deal * @fn DevEP4_IN_Deal
* *
* @brief 端点4数据上传 * @brief 端点4数据上传
* *
* @param l - 上传数据长度(<64B) * @param l - 上传数据长度(<64B)
* *
* @return none * @return none
*/ */
+149 -149
View File
@@ -15,37 +15,37 @@
#include "CHRV3UFI.H" #include "CHRV3UFI.H"
#endif #endif
uint8_t UsbDevEndp0Size; // USB设备的端点0的最大包尺寸 uint8_t UsbDevEndp0Size; // USB设备的端点0的最大包尺寸
uint8_t FoundNewDev; uint8_t FoundNewDev;
_RootHubDev ThisUsbDev; //ROOT口 _RootHubDev ThisUsbDev; //ROOT口
_DevOnHubPort DevOnHubPort[HUB_MAX_PORTS]; // 假定:不超过1个外部HUB,每个外部HUB不超过HUB_MAX_PORTS个端口(多了不管) _DevOnHubPort DevOnHubPort[HUB_MAX_PORTS]; // 假定:不超过1个外部HUB,每个外部HUB不超过HUB_MAX_PORTS个端口(多了不管)
uint8_t *pHOST_RX_RAM_Addr; uint8_t *pHOST_RX_RAM_Addr;
uint8_t *pHOST_TX_RAM_Addr; uint8_t *pHOST_TX_RAM_Addr;
/*获取设备描述符*/ /*获取设备描述符*/
__attribute__((aligned(4))) const uint8_t SetupGetDevDescr[] = {USB_REQ_TYP_IN, USB_GET_DESCRIPTOR, 0x00, __attribute__((aligned(4))) const uint8_t SetupGetDevDescr[] = {USB_REQ_TYP_IN, USB_GET_DESCRIPTOR, 0x00,
USB_DESCR_TYP_DEVICE, 0x00, 0x00, sizeof(USB_DEV_DESCR), 0x00}; USB_DESCR_TYP_DEVICE, 0x00, 0x00, sizeof(USB_DEV_DESCR), 0x00};
/*获取配置描述符*/ /*获取配置描述符*/
__attribute__((aligned(4))) const uint8_t SetupGetCfgDescr[] = {USB_REQ_TYP_IN, USB_GET_DESCRIPTOR, 0x00, __attribute__((aligned(4))) const uint8_t SetupGetCfgDescr[] = {USB_REQ_TYP_IN, USB_GET_DESCRIPTOR, 0x00,
USB_DESCR_TYP_CONFIG, 0x00, 0x00, 0x04, 0x00}; USB_DESCR_TYP_CONFIG, 0x00, 0x00, 0x04, 0x00};
/*设置USB地址*/ /*设置USB地址*/
__attribute__((aligned(4))) const uint8_t SetupSetUsbAddr[] = {USB_REQ_TYP_OUT, USB_SET_ADDRESS, USB_DEVICE_ADDR, 0x00, __attribute__((aligned(4))) const uint8_t SetupSetUsbAddr[] = {USB_REQ_TYP_OUT, USB_SET_ADDRESS, USB_DEVICE_ADDR, 0x00,
0x00, 0x00, 0x00, 0x00}; 0x00, 0x00, 0x00, 0x00};
/*设置USB配置*/ /*设置USB配置*/
__attribute__((aligned(4))) const uint8_t SetupSetUsbConfig[] = {USB_REQ_TYP_OUT, USB_SET_CONFIGURATION, 0x00, 0x00, 0x00, __attribute__((aligned(4))) const uint8_t SetupSetUsbConfig[] = {USB_REQ_TYP_OUT, USB_SET_CONFIGURATION, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00}; 0x00, 0x00, 0x00};
/*设置USB接口配置*/ /*设置USB接口配置*/
__attribute__((aligned(4))) const uint8_t SetupSetUsbInterface[] = {USB_REQ_RECIP_INTERF, USB_SET_INTERFACE, 0x00, 0x00, __attribute__((aligned(4))) const uint8_t SetupSetUsbInterface[] = {USB_REQ_RECIP_INTERF, USB_SET_INTERFACE, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00}; 0x00, 0x00, 0x00, 0x00};
/*清除端点STALL*/ /*清除端点STALL*/
__attribute__((aligned(4))) const uint8_t SetupClrEndpStall[] = {USB_REQ_TYP_OUT | USB_REQ_RECIP_ENDP, USB_CLEAR_FEATURE, __attribute__((aligned(4))) const uint8_t SetupClrEndpStall[] = {USB_REQ_TYP_OUT | USB_REQ_RECIP_ENDP, USB_CLEAR_FEATURE,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
/********************************************************************* /*********************************************************************
* @fn DisableRootHubPort * @fn DisableRootHubPort
* *
* @brief 关闭ROOT-HUB端口,实际上硬件已经自动关闭,此处只是清除一些结构状态 * @brief 关闭ROOT-HUB端口,实际上硬件已经自动关闭,此处只是清除一些结构状态
* *
* @param none * @param none
* *
@@ -65,12 +65,12 @@ void DisableRootHubPort(void)
/********************************************************************* /*********************************************************************
* @fn AnalyzeRootHub * @fn AnalyzeRootHub
* *
* @brief 分析ROOT-HUB状态,处理ROOT-HUB端口的设备插拔事件 * @brief 分析ROOT-HUB状态,处理ROOT-HUB端口的设备插拔事件
* 如果设备拔出,函数中调用DisableRootHubPort()函数,将端口关闭,插入事件,置相应端口的状态位 * 如果设备拔出,函数中调用DisableRootHubPort()函数,将端口关闭,插入事件,置相应端口的状态位
* *
* @param none * @param none
* *
* @return 返回ERR_SUCCESS为没有情况,返回ERR_USB_CONNECT为检测到新连接,返回ERR_USB_DISCON为检测到断开 * @return 返回ERR_SUCCESS为没有情况,返回ERR_USB_CONNECT为检测到新连接,返回ERR_USB_DISCON为检测到断开
*/ */
uint8_t AnalyzeRootHub(void) uint8_t AnalyzeRootHub(void)
{ {
@@ -79,20 +79,20 @@ uint8_t AnalyzeRootHub(void)
s = ERR_SUCCESS; s = ERR_SUCCESS;
if(R8_USB_MIS_ST & RB_UMS_DEV_ATTACH) if(R8_USB_MIS_ST & RB_UMS_DEV_ATTACH)
{ // 设备存在 { // 设备存在
#ifdef DISK_BASE_BUF_LEN #ifdef DISK_BASE_BUF_LEN
if(CHRV3DiskStatus == DISK_DISCONNECT if(CHRV3DiskStatus == DISK_DISCONNECT
#else #else
if(ThisUsbDev.DeviceStatus == ROOT_DEV_DISCONNECT // 检测到有设备插入 if(ThisUsbDev.DeviceStatus == ROOT_DEV_DISCONNECT // 检测到有设备插入
#endif #endif
|| (R8_UHOST_CTRL & RB_UH_PORT_EN) == 0x00) || (R8_UHOST_CTRL & RB_UH_PORT_EN) == 0x00)
{ // 检测到有设备插入,但尚未允许,说明是刚插入 { // 检测到有设备插入,但尚未允许,说明是刚插入
DisableRootHubPort(); // 关闭端口 DisableRootHubPort(); // 关闭端口
#ifdef DISK_BASE_BUF_LEN #ifdef DISK_BASE_BUF_LEN
CHRV3DiskStatus = DISK_CONNECT; CHRV3DiskStatus = DISK_CONNECT;
#else #else
ThisUsbDev.DeviceSpeed = R8_USB_MIS_ST & RB_UMS_DM_LEVEL ? 0 : 1; ThisUsbDev.DeviceSpeed = R8_USB_MIS_ST & RB_UMS_DM_LEVEL ? 0 : 1;
ThisUsbDev.DeviceStatus = ROOT_DEV_CONNECTED; //置连接标志 ThisUsbDev.DeviceStatus = ROOT_DEV_CONNECTED; //置连接标志
#endif #endif
PRINT("USB dev in\n"); PRINT("USB dev in\n");
s = ERR_USB_CONNECT; s = ERR_USB_CONNECT;
@@ -104,25 +104,25 @@ uint8_t AnalyzeRootHub(void)
{ {
#else #else
else if(ThisUsbDev.DeviceStatus >= ROOT_DEV_CONNECTED) else if(ThisUsbDev.DeviceStatus >= ROOT_DEV_CONNECTED)
{ //检测到设备拔出 { //检测到设备拔出
#endif #endif
DisableRootHubPort(); // 关闭端口 DisableRootHubPort(); // 关闭端口
PRINT("USB dev out\n"); PRINT("USB dev out\n");
if(s == ERR_SUCCESS) if(s == ERR_SUCCESS)
{ {
s = ERR_USB_DISCON; s = ERR_USB_DISCON;
} }
} }
// R8_USB_INT_FG = RB_UIF_DETECT; // 清中断标志 // R8_USB_INT_FG = RB_UIF_DETECT; // 清中断标志
return (s); return (s);
} }
/********************************************************************* /*********************************************************************
* @fn SetHostUsbAddr * @fn SetHostUsbAddr
* *
* @brief 设置USB主机当前操作的USB设备地址 * @brief 设置USB主机当前操作的USB设备地址
* *
* @param addr - USB设备地址 * @param addr - USB设备地址
* *
* @return none * @return none
*/ */
@@ -134,23 +134,23 @@ void SetHostUsbAddr(uint8_t addr)
/********************************************************************* /*********************************************************************
* @fn SetUsbSpeed * @fn SetUsbSpeed
* *
* @brief 设置当前USB速度 * @brief 设置当前USB速度
* *
* @param FullSpeed - USB速度 * @param FullSpeed - USB速度
* *
* @return none * @return none
*/ */
void SetUsbSpeed(uint8_t FullSpeed) void SetUsbSpeed(uint8_t FullSpeed)
{ {
#ifndef DISK_BASE_BUF_LEN #ifndef DISK_BASE_BUF_LEN
if(FullSpeed) // 全速 if(FullSpeed) // 全速
{ {
R8_USB_CTRL &= ~RB_UC_LOW_SPEED; // 全速 R8_USB_CTRL &= ~RB_UC_LOW_SPEED; // 全速
R8_UH_SETUP &= ~RB_UH_PRE_PID_EN; // 禁止PRE PID R8_UH_SETUP &= ~RB_UH_PRE_PID_EN; // 禁止PRE PID
} }
else else
{ {
R8_USB_CTRL |= RB_UC_LOW_SPEED; // 低速 R8_USB_CTRL |= RB_UC_LOW_SPEED; // 低速
} }
#endif #endif
(void)FullSpeed; (void)FullSpeed;
@@ -159,7 +159,7 @@ void SetUsbSpeed(uint8_t FullSpeed)
/********************************************************************* /*********************************************************************
* @fn ResetRootHubPort * @fn ResetRootHubPort
* *
* @brief 检测到设备后,复位总线,为枚举设备准备,设置为默认为全速 * @brief 检测到设备后,复位总线,为枚举设备准备,设置为默认为全速
* *
* @param none * @param none
* *
@@ -167,25 +167,25 @@ void SetUsbSpeed(uint8_t FullSpeed)
*/ */
void ResetRootHubPort(void) void ResetRootHubPort(void)
{ {
UsbDevEndp0Size = DEFAULT_ENDP0_SIZE; //USB设备的端点0的最大包尺寸 UsbDevEndp0Size = DEFAULT_ENDP0_SIZE; //USB设备的端点0的最大包尺寸
SetHostUsbAddr(0x00); SetHostUsbAddr(0x00);
R8_UHOST_CTRL &= ~RB_UH_PORT_EN; // 关掉端口 R8_UHOST_CTRL &= ~RB_UH_PORT_EN; // 关掉端口
SetUsbSpeed(1); // 默认为全速 SetUsbSpeed(1); // 默认为全速
R8_UHOST_CTRL = (R8_UHOST_CTRL & ~RB_UH_LOW_SPEED) | RB_UH_BUS_RESET; // 默认为全速,开始复位 R8_UHOST_CTRL = (R8_UHOST_CTRL & ~RB_UH_LOW_SPEED) | RB_UH_BUS_RESET; // 默认为全速,开始复位
mDelaymS(15); // 复位时间10mS到20mS mDelaymS(15); // 复位时间10mS到20mS
R8_UHOST_CTRL = R8_UHOST_CTRL & ~RB_UH_BUS_RESET; // 结束复位 R8_UHOST_CTRL = R8_UHOST_CTRL & ~RB_UH_BUS_RESET; // 结束复位
mDelayuS(250); mDelayuS(250);
R8_USB_INT_FG = RB_UIF_DETECT; // 清中断标志 R8_USB_INT_FG = RB_UIF_DETECT; // 清中断标志
} }
/********************************************************************* /*********************************************************************
* @fn EnableRootHubPort * @fn EnableRootHubPort
* *
* @brief 使能ROOT-HUB端口,相应的bUH_PORT_EN置1开启端口,设备断开可能导致返回失败 * @brief 使能ROOT-HUB端口,相应的bUH_PORT_EN置1开启端口,设备断开可能导致返回失败
* *
* @param none * @param none
* *
* @return 返回ERR_SUCCESS为检测到新连接,返回ERR_USB_DISCON为无连接 * @return 返回ERR_SUCCESS为检测到新连接,返回ERR_USB_DISCON为无连接
*/ */
uint8_t EnableRootHubPort(void) uint8_t EnableRootHubPort(void)
{ {
@@ -197,18 +197,18 @@ uint8_t EnableRootHubPort(void)
ThisUsbDev.DeviceStatus = ROOT_DEV_CONNECTED; ThisUsbDev.DeviceStatus = ROOT_DEV_CONNECTED;
#endif #endif
if(R8_USB_MIS_ST & RB_UMS_DEV_ATTACH) if(R8_USB_MIS_ST & RB_UMS_DEV_ATTACH)
{ // 有设备 { // 有设备
#ifndef DISK_BASE_BUF_LEN #ifndef DISK_BASE_BUF_LEN
if((R8_UHOST_CTRL & RB_UH_PORT_EN) == 0x00) if((R8_UHOST_CTRL & RB_UH_PORT_EN) == 0x00)
{ // 尚未使能 { // 尚未使能
ThisUsbDev.DeviceSpeed = (R8_USB_MIS_ST & RB_UMS_DM_LEVEL) ? 0 : 1; ThisUsbDev.DeviceSpeed = (R8_USB_MIS_ST & RB_UMS_DM_LEVEL) ? 0 : 1;
if(ThisUsbDev.DeviceSpeed == 0) if(ThisUsbDev.DeviceSpeed == 0)
{ {
R8_UHOST_CTRL |= RB_UH_LOW_SPEED; // 低速 R8_UHOST_CTRL |= RB_UH_LOW_SPEED; // 低速
} }
} }
#endif #endif
R8_UHOST_CTRL |= RB_UH_PORT_EN; //使能HUB端口 R8_UHOST_CTRL |= RB_UH_PORT_EN; //使能HUB端口
return (ERR_SUCCESS); return (ERR_SUCCESS);
} }
return (ERR_USB_DISCON); return (ERR_USB_DISCON);
@@ -218,28 +218,28 @@ uint8_t EnableRootHubPort(void)
/********************************************************************* /*********************************************************************
* @fn SelectHubPort * @fn SelectHubPort
* *
* @brief 选定需要操作的HUB口 * @brief 选定需要操作的HUB口
* *
* @param HubPortIndex - 选择操作指定的ROOT-HUB端口的外部HUB的指定端口 * @param HubPortIndex - 选择操作指定的ROOT-HUB端口的外部HUB的指定端口
* *
* @return None * @return None
*/ */
void SelectHubPort(uint8_t HubPortIndex) void SelectHubPort(uint8_t HubPortIndex)
{ {
if(HubPortIndex) // 选择操作指定的ROOT-HUB端口的外部HUB的指定端口 if(HubPortIndex) // 选择操作指定的ROOT-HUB端口的外部HUB的指定端口
{ {
SetHostUsbAddr(DevOnHubPort[HubPortIndex - 1].DeviceAddress); // 设置USB主机当前操作的USB设备地址 SetHostUsbAddr(DevOnHubPort[HubPortIndex - 1].DeviceAddress); // 设置USB主机当前操作的USB设备地址
SetUsbSpeed(DevOnHubPort[HubPortIndex - 1].DeviceSpeed); // 设置当前USB速度 SetUsbSpeed(DevOnHubPort[HubPortIndex - 1].DeviceSpeed); // 设置当前USB速度
if(DevOnHubPort[HubPortIndex - 1].DeviceSpeed == 0) // 通过外部HUB与低速USB设备通讯需要前置ID if(DevOnHubPort[HubPortIndex - 1].DeviceSpeed == 0) // 通过外部HUB与低速USB设备通讯需要前置ID
{ {
R8_UEP1_CTRL |= RB_UH_PRE_PID_EN; // 启用PRE PID R8_UEP1_CTRL |= RB_UH_PRE_PID_EN; // 启用PRE PID
mDelayuS(100); mDelayuS(100);
} }
} }
else else
{ {
SetHostUsbAddr(ThisUsbDev.DeviceAddress); // 设置USB主机当前操作的USB设备地址 SetHostUsbAddr(ThisUsbDev.DeviceAddress); // 设置USB主机当前操作的USB设备地址
SetUsbSpeed(ThisUsbDev.DeviceSpeed); // 设置USB设备的速度 SetUsbSpeed(ThisUsbDev.DeviceSpeed); // 设置USB设备的速度
} }
} }
#endif #endif
@@ -247,11 +247,11 @@ void SelectHubPort(uint8_t HubPortIndex)
/********************************************************************* /*********************************************************************
* @fn WaitUSB_Interrupt * @fn WaitUSB_Interrupt
* *
* @brief 等待USB中断 * @brief 等待USB中断
* *
* @param none * @param none
* *
* @return 返回ERR_SUCCESS 数据接收或者发送成功,返回ERR_USB_UNKNOWN 数据接收或者发送失败 * @return 返回ERR_SUCCESS 数据接收或者发送成功,返回ERR_USB_UNKNOWN 数据接收或者发送失败
*/ */
uint8_t WaitUSB_Interrupt(void) uint8_t WaitUSB_Interrupt(void)
{ {
@@ -266,17 +266,17 @@ uint8_t WaitUSB_Interrupt(void)
/********************************************************************* /*********************************************************************
* @fn USBHostTransact * @fn USBHostTransact
* *
* @brief 传输事务,输入目的端点地址/PID令牌,同步标志,以20uS为单位的NAK重试总时间(0则不重试,0xFFFF无限重试),返回0成功,超时/出错重试 * @brief 传输事务,输入目的端点地址/PID令牌,同步标志,以20uS为单位的NAK重试总时间(0则不重试,0xFFFF无限重试),返回0成功,超时/出错重试
* 本子程序着重于易理解,而在实际应用中,为了提供运行速度,应该对本子程序代码进行优化 * 本子程序着重于易理解,而在实际应用中,为了提供运行速度,应该对本子程序代码进行优化
* *
* @param endp_pid - 令牌和地址, 高4位是token_pid令牌, 低4位是端点地址 * @param endp_pid - 令牌和地址, 高4位是token_pid令牌, 低4位是端点地址
* @param tog - 同步标志 * @param tog - 同步标志
* @param timeout - 超时时间 * @param timeout - 超时时间
* *
* @return ERR_USB_UNKNOWN 超时,可能硬件异常 * @return ERR_USB_UNKNOWN 超时,可能硬件异常
* ERR_USB_DISCON 设备断开 * ERR_USB_DISCON 设备断开
* ERR_USB_CONNECT 设备连接 * ERR_USB_CONNECT 设备连接
* ERR_SUCCESS 传输完成 * ERR_SUCCESS 传输完成
*/ */
uint8_t USBHostTransact(uint8_t endp_pid, uint8_t tog, uint32_t timeout) uint8_t USBHostTransact(uint8_t endp_pid, uint8_t tog, uint32_t timeout)
{ {
@@ -290,23 +290,23 @@ uint8_t USBHostTransact(uint8_t endp_pid, uint8_t tog, uint32_t timeout)
do do
{ {
R8_UH_EP_PID = endp_pid; // 指定令牌PID和目的端点号 R8_UH_EP_PID = endp_pid; // 指定令牌PID和目的端点号
R8_USB_INT_FG = RB_UIF_TRANSFER; R8_USB_INT_FG = RB_UIF_TRANSFER;
for(i = WAIT_USB_TOUT_200US; i != 0 && (R8_USB_INT_FG & RB_UIF_TRANSFER) == 0; i--) for(i = WAIT_USB_TOUT_200US; i != 0 && (R8_USB_INT_FG & RB_UIF_TRANSFER) == 0; i--)
{ {
; ;
} }
R8_UH_EP_PID = 0x00; // 停止USB传输 R8_UH_EP_PID = 0x00; // 停止USB传输
if((R8_USB_INT_FG & RB_UIF_TRANSFER) == 0) if((R8_USB_INT_FG & RB_UIF_TRANSFER) == 0)
{ {
return (ERR_USB_UNKNOWN); return (ERR_USB_UNKNOWN);
} }
if(R8_USB_INT_FG & RB_UIF_DETECT) if(R8_USB_INT_FG & RB_UIF_DETECT)
{ // USB设备插拔事件 { // USB设备插拔事件
// mDelayuS( 200 ); // 等待传输完成 // mDelayuS( 200 ); // 等待传输完成
R8_USB_INT_FG = RB_UIF_DETECT; R8_USB_INT_FG = RB_UIF_DETECT;
s = AnalyzeRootHub(); // 分析ROOT-HUB状态 s = AnalyzeRootHub(); // 分析ROOT-HUB状态
if(s == ERR_USB_CONNECT) if(s == ERR_USB_CONNECT)
FoundNewDev = 1; FoundNewDev = 1;
@@ -314,31 +314,31 @@ uint8_t USBHostTransact(uint8_t endp_pid, uint8_t tog, uint32_t timeout)
if(CHRV3DiskStatus == DISK_DISCONNECT) if(CHRV3DiskStatus == DISK_DISCONNECT)
{ {
return (ERR_USB_DISCON); return (ERR_USB_DISCON);
} // USB设备断开事件 } // USB设备断开事件
if(CHRV3DiskStatus == DISK_CONNECT) if(CHRV3DiskStatus == DISK_CONNECT)
{ {
return (ERR_USB_CONNECT); return (ERR_USB_CONNECT);
} // USB设备连接事件 } // USB设备连接事件
#else #else
if(ThisUsbDev.DeviceStatus == ROOT_DEV_DISCONNECT) if(ThisUsbDev.DeviceStatus == ROOT_DEV_DISCONNECT)
{ {
return (ERR_USB_DISCON); return (ERR_USB_DISCON);
} // USB设备断开事件 } // USB设备断开事件
if(ThisUsbDev.DeviceStatus == ROOT_DEV_CONNECTED) if(ThisUsbDev.DeviceStatus == ROOT_DEV_CONNECTED)
{ {
return (ERR_USB_CONNECT); return (ERR_USB_CONNECT);
} // USB设备连接事件 } // USB设备连接事件
#endif #endif
mDelayuS(200); // 等待传输完成 mDelayuS(200); // 等待传输完成
} }
if(R8_USB_INT_FG & RB_UIF_TRANSFER) // 传输完成事件 if(R8_USB_INT_FG & RB_UIF_TRANSFER) // 传输完成事件
{ {
if(R8_USB_INT_ST & RB_UIS_TOG_OK) if(R8_USB_INT_ST & RB_UIS_TOG_OK)
{ {
return (ERR_SUCCESS); return (ERR_SUCCESS);
} }
r = R8_USB_INT_ST & MASK_UIS_H_RES; // USB设备应答状态 r = R8_USB_INT_ST & MASK_UIS_H_RES; // USB设备应答状态
if(r == USB_PID_STALL) if(r == USB_PID_STALL)
{ {
return (r | ERR_USB_TRANSFER); return (r | ERR_USB_TRANSFER);
@@ -363,41 +363,41 @@ uint8_t USBHostTransact(uint8_t endp_pid, uint8_t tog, uint32_t timeout)
if(r) if(r)
{ {
return (r | ERR_USB_TRANSFER); return (r | ERR_USB_TRANSFER);
} // 不是超时/出错,意外应答 } // 不是超时/出错,意外应答
break; // 超时重试 break; // 超时重试
case USB_PID_IN: case USB_PID_IN:
if(r == USB_PID_DATA0 || r == USB_PID_DATA1) if(r == USB_PID_DATA0 || r == USB_PID_DATA1)
{ // 不同步则需丢弃后重试 { // 不同步则需丢弃后重试
} // 不同步重试 } // 不同步重试
else if(r) else if(r)
{ {
return (r | ERR_USB_TRANSFER); return (r | ERR_USB_TRANSFER);
} // 不是超时/出错,意外应答 } // 不是超时/出错,意外应答
break; // 超时重试 break; // 超时重试
default: default:
return (ERR_USB_UNKNOWN); // 不可能的情况 return (ERR_USB_UNKNOWN); // 不可能的情况
break; break;
} }
} }
else else
{ // 其它中断,不应该发生的情况 { // 其它中断,不应该发生的情况
R8_USB_INT_FG = 0xFF; /* 清中断标志 */ R8_USB_INT_FG = 0xFF; /* 清中断标志 */
} }
mDelayuS(15); mDelayuS(15);
} while(++TransRetry < 3); } while(++TransRetry < 3);
return (ERR_USB_TRANSFER); // 应答超时 return (ERR_USB_TRANSFER); // 应答超时
} }
/********************************************************************* /*********************************************************************
* @fn HostCtrlTransfer * @fn HostCtrlTransfer
* *
* @brief 执行控制传输,8字节请求码在pSetupReq中,DataBuf为可选的收发缓冲区 * @brief 执行控制传输,8字节请求码在pSetupReq中,DataBuf为可选的收发缓冲区
* *
* @param DataBuf - 如果需要接收和发送数据,那么DataBuf需指向有效缓冲区用于存放后续数据 * @param DataBuf - 如果需要接收和发送数据,那么DataBuf需指向有效缓冲区用于存放后续数据
* @param RetLen - 实际成功收发的总长度保存在RetLen指向的字节变量中 * @param RetLen - 实际成功收发的总长度保存在RetLen指向的字节变量中
* *
* @return ERR_USB_BUF_OVER IN状态阶段出错 * @return ERR_USB_BUF_OVER IN状态阶段出错
* ERR_SUCCESS 数据交换成功 * ERR_SUCCESS 数据交换成功
*/ */
uint8_t HostCtrlTransfer(uint8_t *DataBuf, uint8_t *RetLen) uint8_t HostCtrlTransfer(uint8_t *DataBuf, uint8_t *RetLen)
{ {
@@ -411,28 +411,28 @@ uint8_t HostCtrlTransfer(uint8_t *DataBuf, uint8_t *RetLen)
mDelayuS(200); mDelayuS(200);
if(pLen) if(pLen)
{ {
*pLen = 0; // 实际成功收发的总长度 *pLen = 0; // 实际成功收发的总长度
} }
R8_UH_TX_LEN = sizeof(USB_SETUP_REQ); R8_UH_TX_LEN = sizeof(USB_SETUP_REQ);
s = USBHostTransact(USB_PID_SETUP << 4 | 0x00, 0x00, 200000 / 20); // SETUP阶段,200mS超时 s = USBHostTransact(USB_PID_SETUP << 4 | 0x00, 0x00, 200000 / 20); // SETUP阶段,200mS超时
if(s != ERR_SUCCESS) if(s != ERR_SUCCESS)
{ {
return (s); return (s);
} }
R8_UH_RX_CTRL = R8_UH_TX_CTRL = RB_UH_R_TOG | RB_UH_R_AUTO_TOG | RB_UH_T_TOG | RB_UH_T_AUTO_TOG; // 默认DATA1 R8_UH_RX_CTRL = R8_UH_TX_CTRL = RB_UH_R_TOG | RB_UH_R_AUTO_TOG | RB_UH_T_TOG | RB_UH_T_AUTO_TOG; // 默认DATA1
R8_UH_TX_LEN = 0x01; // 默认无数据故状态阶段为IN R8_UH_TX_LEN = 0x01; // 默认无数据故状态阶段为IN
RemLen = pSetupReq->wLength; RemLen = pSetupReq->wLength;
PRINT("wLength: %x\n", RemLen); PRINT("wLength: %x\n", RemLen);
if(RemLen && pBuf) // 需要收发数据 if(RemLen && pBuf) // 需要收发数据
{ {
PRINT("bRequestType: %x\n", pSetupReq->bRequestType); PRINT("bRequestType: %x\n", pSetupReq->bRequestType);
if(pSetupReq->bRequestType & USB_REQ_TYP_IN) // 收 if(pSetupReq->bRequestType & USB_REQ_TYP_IN) // 收
{ {
while(RemLen) while(RemLen)
{ {
mDelayuS(200); mDelayuS(200);
s = USBHostTransact(USB_PID_IN << 4 | 0x00, R8_UH_RX_CTRL, 200000 / 20); // IN数据 s = USBHostTransact(USB_PID_IN << 4 | 0x00, R8_UH_RX_CTRL, 200000 / 20); // IN数据
if(s != ERR_SUCCESS) if(s != ERR_SUCCESS)
{ {
return (s); return (s);
@@ -441,7 +441,7 @@ uint8_t HostCtrlTransfer(uint8_t *DataBuf, uint8_t *RetLen)
RemLen -= RxLen; RemLen -= RxLen;
if(pLen) if(pLen)
{ {
*pLen += RxLen; // 实际成功收发的总长度 *pLen += RxLen; // 实际成功收发的总长度
} }
for(RxCnt = 0; RxCnt != RxLen; RxCnt++) for(RxCnt = 0; RxCnt != RxLen; RxCnt++)
{ {
@@ -450,12 +450,12 @@ uint8_t HostCtrlTransfer(uint8_t *DataBuf, uint8_t *RetLen)
} }
if(R8_USB_RX_LEN == 0 || (R8_USB_RX_LEN & (UsbDevEndp0Size - 1))) if(R8_USB_RX_LEN == 0 || (R8_USB_RX_LEN & (UsbDevEndp0Size - 1)))
{ {
break; // 短包 break; // 短包
} }
} }
R8_UH_TX_LEN = 0x00; // 状态阶段为OUT R8_UH_TX_LEN = 0x00; // 状态阶段为OUT
} }
else // 发 else // 发
{ {
while(RemLen) while(RemLen)
{ {
@@ -466,7 +466,7 @@ uint8_t HostCtrlTransfer(uint8_t *DataBuf, uint8_t *RetLen)
pHOST_TX_RAM_Addr[TxCnt] = *pBuf; pHOST_TX_RAM_Addr[TxCnt] = *pBuf;
pBuf++; pBuf++;
} }
s = USBHostTransact(USB_PID_OUT << 4 | 0x00, R8_UH_TX_CTRL, 200000 / 20); // OUT数据 s = USBHostTransact(USB_PID_OUT << 4 | 0x00, R8_UH_TX_CTRL, 200000 / 20); // OUT数据
if(s != ERR_SUCCESS) if(s != ERR_SUCCESS)
{ {
return (s); return (s);
@@ -474,40 +474,40 @@ uint8_t HostCtrlTransfer(uint8_t *DataBuf, uint8_t *RetLen)
RemLen -= R8_UH_TX_LEN; RemLen -= R8_UH_TX_LEN;
if(pLen) if(pLen)
{ {
*pLen += R8_UH_TX_LEN; // 实际成功收发的总长度 *pLen += R8_UH_TX_LEN; // 实际成功收发的总长度
} }
} }
PRINT("Send: %d\n", *pLen); PRINT("Send: %d\n", *pLen);
// R8_UH_TX_LEN = 0x01; // 状态阶段为IN // R8_UH_TX_LEN = 0x01; // 状态阶段为IN
} }
} }
mDelayuS(200); mDelayuS(200);
s = USBHostTransact((R8_UH_TX_LEN ? USB_PID_IN << 4 | 0x00 : USB_PID_OUT << 4 | 0x00), RB_UH_R_TOG | RB_UH_T_TOG, 200000 / 20); // STATUS阶段 s = USBHostTransact((R8_UH_TX_LEN ? USB_PID_IN << 4 | 0x00 : USB_PID_OUT << 4 | 0x00), RB_UH_R_TOG | RB_UH_T_TOG, 200000 / 20); // STATUS阶段
if(s != ERR_SUCCESS) if(s != ERR_SUCCESS)
{ {
return (s); return (s);
} }
if(R8_UH_TX_LEN == 0) if(R8_UH_TX_LEN == 0)
{ {
return (ERR_SUCCESS); // 状态OUT return (ERR_SUCCESS); // 状态OUT
} }
if(R8_USB_RX_LEN == 0) if(R8_USB_RX_LEN == 0)
{ {
return (ERR_SUCCESS); // 状态IN,检查IN状态返回数据长度 return (ERR_SUCCESS); // 状态IN,检查IN状态返回数据长度
} }
return (ERR_USB_BUF_OVER); // IN状态阶段错误 return (ERR_USB_BUF_OVER); // IN状态阶段错误
} }
/********************************************************************* /*********************************************************************
* @fn CopySetupReqPkg * @fn CopySetupReqPkg
* *
* @brief 复制控制传输的请求包 * @brief 复制控制传输的请求包
* *
* @param pReqPkt - 控制请求包地址 * @param pReqPkt - 控制请求包地址
* *
* @return none * @return none
*/ */
void CopySetupReqPkg(const uint8_t *pReqPkt) // 复制控制传输的请求包 void CopySetupReqPkg(const uint8_t *pReqPkt) // 复制控制传输的请求包
{ {
uint8_t i; uint8_t i;
for(i = 0; i != sizeof(USB_SETUP_REQ); i++) for(i = 0; i != sizeof(USB_SETUP_REQ); i++)
@@ -520,12 +520,12 @@ void CopySetupReqPkg(const uint8_t *pReqPkt) //
/********************************************************************* /*********************************************************************
* @fn CtrlGetDeviceDescr * @fn CtrlGetDeviceDescr
* *
* @brief 获取设备描述符,返回在 pHOST_TX_RAM_Addr 中 * @brief 获取设备描述符,返回在 pHOST_TX_RAM_Addr 中
* *
* @param none * @param none
* *
* @return ERR_USB_BUF_OVER 描述符长度错误 * @return ERR_USB_BUF_OVER 描述符长度错误
* ERR_SUCCESS 成功 * ERR_SUCCESS 成功
*/ */
uint8_t CtrlGetDeviceDescr(void) uint8_t CtrlGetDeviceDescr(void)
{ {
@@ -534,15 +534,15 @@ uint8_t CtrlGetDeviceDescr(void)
UsbDevEndp0Size = DEFAULT_ENDP0_SIZE; UsbDevEndp0Size = DEFAULT_ENDP0_SIZE;
CopySetupReqPkg(SetupGetDevDescr); CopySetupReqPkg(SetupGetDevDescr);
s = HostCtrlTransfer(Com_Buffer, &len); // 执行控制传输 s = HostCtrlTransfer(Com_Buffer, &len); // 执行控制传输
if(s != ERR_SUCCESS) if(s != ERR_SUCCESS)
{ {
return (s); return (s);
} }
UsbDevEndp0Size = ((PUSB_DEV_DESCR)Com_Buffer)->bMaxPacketSize0; // 端点0最大包长度,这是简化处理,正常应该先获取前8字节后立即更新UsbDevEndp0Size再继续 UsbDevEndp0Size = ((PUSB_DEV_DESCR)Com_Buffer)->bMaxPacketSize0; // 端点0最大包长度,这是简化处理,正常应该先获取前8字节后立即更新UsbDevEndp0Size再继续
if(len < ((PUSB_SETUP_REQ)SetupGetDevDescr)->wLength) if(len < ((PUSB_SETUP_REQ)SetupGetDevDescr)->wLength)
{ {
return (ERR_USB_BUF_OVER); // 描述符长度错误 return (ERR_USB_BUF_OVER); // 描述符长度错误
} }
return (ERR_SUCCESS); return (ERR_SUCCESS);
} }
@@ -550,12 +550,12 @@ uint8_t CtrlGetDeviceDescr(void)
/********************************************************************* /*********************************************************************
* @fn CtrlGetConfigDescr * @fn CtrlGetConfigDescr
* *
* @brief 获取配置描述符,返回在 pHOST_TX_RAM_Addr 中 * @brief 获取配置描述符,返回在 pHOST_TX_RAM_Addr 中
* *
* @param none * @param none
* *
* @return ERR_USB_BUF_OVER 描述符长度错误 * @return ERR_USB_BUF_OVER 描述符长度错误
* ERR_SUCCESS 成功 * ERR_SUCCESS 成功
*/ */
uint8_t CtrlGetConfigDescr(void) uint8_t CtrlGetConfigDescr(void)
{ {
@@ -563,20 +563,20 @@ uint8_t CtrlGetConfigDescr(void)
uint8_t len; uint8_t len;
CopySetupReqPkg(SetupGetCfgDescr); CopySetupReqPkg(SetupGetCfgDescr);
s = HostCtrlTransfer(Com_Buffer, &len); // 执行控制传输 s = HostCtrlTransfer(Com_Buffer, &len); // 执行控制传输
if(s != ERR_SUCCESS) if(s != ERR_SUCCESS)
{ {
return (s); return (s);
} }
if(len < ((PUSB_SETUP_REQ)SetupGetCfgDescr)->wLength) if(len < ((PUSB_SETUP_REQ)SetupGetCfgDescr)->wLength)
{ {
return (ERR_USB_BUF_OVER); // 返回长度错误 return (ERR_USB_BUF_OVER); // 返回长度错误
} }
len = ((PUSB_CFG_DESCR)Com_Buffer)->wTotalLength; len = ((PUSB_CFG_DESCR)Com_Buffer)->wTotalLength;
CopySetupReqPkg(SetupGetCfgDescr); CopySetupReqPkg(SetupGetCfgDescr);
pSetupReq->wLength = len; // 完整配置描述符的总长度 pSetupReq->wLength = len; // 完整配置描述符的总长度
s = HostCtrlTransfer(Com_Buffer, &len); // 执行控制传输 s = HostCtrlTransfer(Com_Buffer, &len); // 执行控制传输
if(s != ERR_SUCCESS) if(s != ERR_SUCCESS)
{ {
return (s); return (s);
@@ -585,7 +585,7 @@ uint8_t CtrlGetConfigDescr(void)
#ifdef DISK_BASE_BUF_LEN #ifdef DISK_BASE_BUF_LEN
if(len > 64) if(len > 64)
len = 64; len = 64;
memcpy(TxBuffer, Com_Buffer, len); //U盘操作时,需要拷贝到TxBuffer memcpy(TxBuffer, Com_Buffer, len); //U盘操作时,需要拷贝到TxBuffer
#endif #endif
return (ERR_SUCCESS); return (ERR_SUCCESS);
@@ -594,80 +594,80 @@ uint8_t CtrlGetConfigDescr(void)
/********************************************************************* /*********************************************************************
* @fn CtrlSetUsbAddress * @fn CtrlSetUsbAddress
* *
* @brief 设置USB设备地址 * @brief 设置USB设备地址
* *
* @param addr - 设备地址 * @param addr - 设备地址
* *
* @return ERR_SUCCESS 成功 * @return ERR_SUCCESS 成功
*/ */
uint8_t CtrlSetUsbAddress(uint8_t addr) uint8_t CtrlSetUsbAddress(uint8_t addr)
{ {
uint8_t s; uint8_t s;
CopySetupReqPkg(SetupSetUsbAddr); CopySetupReqPkg(SetupSetUsbAddr);
pSetupReq->wValue = addr; // USB设备地址 pSetupReq->wValue = addr; // USB设备地址
s = HostCtrlTransfer(NULL, NULL); // 执行控制传输 s = HostCtrlTransfer(NULL, NULL); // 执行控制传输
if(s != ERR_SUCCESS) if(s != ERR_SUCCESS)
{ {
return (s); return (s);
} }
SetHostUsbAddr(addr); // 设置USB主机当前操作的USB设备地址 SetHostUsbAddr(addr); // 设置USB主机当前操作的USB设备地址
mDelaymS(10); // 等待USB设备完成操作 mDelaymS(10); // 等待USB设备完成操作
return (ERR_SUCCESS); return (ERR_SUCCESS);
} }
/********************************************************************* /*********************************************************************
* @fn CtrlSetUsbConfig * @fn CtrlSetUsbConfig
* *
* @brief 设置USB设备配置 * @brief 设置USB设备配置
* *
* @param cfg - 配置值 * @param cfg - 配置值
* *
* @return ERR_SUCCESS 成功 * @return ERR_SUCCESS 成功
*/ */
uint8_t CtrlSetUsbConfig(uint8_t cfg) uint8_t CtrlSetUsbConfig(uint8_t cfg)
{ {
CopySetupReqPkg(SetupSetUsbConfig); CopySetupReqPkg(SetupSetUsbConfig);
pSetupReq->wValue = cfg; // USB设备配置 pSetupReq->wValue = cfg; // USB设备配置
return (HostCtrlTransfer(NULL, NULL)); // 执行控制传输 return (HostCtrlTransfer(NULL, NULL)); // 执行控制传输
} }
/********************************************************************* /*********************************************************************
* @fn CtrlClearEndpStall * @fn CtrlClearEndpStall
* *
* @brief 清除端点STALL * @brief 清除端点STALL
* *
* @param endp - 端点地址 * @param endp - 端点地址
* *
* @return ERR_SUCCESS 成功 * @return ERR_SUCCESS 成功
*/ */
uint8_t CtrlClearEndpStall(uint8_t endp) uint8_t CtrlClearEndpStall(uint8_t endp)
{ {
CopySetupReqPkg(SetupClrEndpStall); // 清除端点的错误 CopySetupReqPkg(SetupClrEndpStall); // 清除端点的错误
pSetupReq->wIndex = endp; // 端点地址 pSetupReq->wIndex = endp; // 端点地址
return (HostCtrlTransfer(NULL, NULL)); // 执行控制传输 return (HostCtrlTransfer(NULL, NULL)); // 执行控制传输
} }
/********************************************************************* /*********************************************************************
* @fn CtrlSetUsbIntercace * @fn CtrlSetUsbIntercace
* *
* @brief 设置USB设备接口 * @brief 设置USB设备接口
* *
* @param cfg - 配置值 * @param cfg - 配置值
* *
* @return ERR_SUCCESS 成功 * @return ERR_SUCCESS 成功
*/ */
uint8_t CtrlSetUsbIntercace(uint8_t cfg) uint8_t CtrlSetUsbIntercace(uint8_t cfg)
{ {
CopySetupReqPkg(SetupSetUsbInterface); CopySetupReqPkg(SetupSetUsbInterface);
pSetupReq->wValue = cfg; // USB设备配置 pSetupReq->wValue = cfg; // USB设备配置
return (HostCtrlTransfer(NULL, NULL)); // 执行控制传输 return (HostCtrlTransfer(NULL, NULL)); // 执行控制传输
} }
/********************************************************************* /*********************************************************************
* @fn USB_HostInit * @fn USB_HostInit
* *
* @brief USB主机功能初始化 * @brief USB主机功能初始化
* *
* @param none * @param none
* *
+189 -189
View File
@@ -15,25 +15,25 @@
#include "CHRV3UFI.H" #include "CHRV3UFI.H"
#endif #endif
/* 设置HID上传速率 */ /* 设置HID上传速率 */
__attribute__((aligned(4))) const uint8_t SetupSetHIDIdle[] = {0x21, HID_SET_IDLE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; __attribute__((aligned(4))) const uint8_t SetupSetHIDIdle[] = {0x21, HID_SET_IDLE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
/* 获取HID设备报表描述符 */ /* 获取HID设备报表描述符 */
__attribute__((aligned(4))) const uint8_t SetupGetHIDDevReport[] = {0x81, USB_GET_DESCRIPTOR, 0x00, USB_DESCR_TYP_REPORT, __attribute__((aligned(4))) const uint8_t SetupGetHIDDevReport[] = {0x81, USB_GET_DESCRIPTOR, 0x00, USB_DESCR_TYP_REPORT,
0x00, 0x00, 0x41, 0x00}; 0x00, 0x00, 0x41, 0x00};
/* 获取HUB描述符 */ /* 获取HUB描述符 */
__attribute__((aligned(4))) const uint8_t SetupGetHubDescr[] = {HUB_GET_HUB_DESCRIPTOR, HUB_GET_DESCRIPTOR, 0x00, __attribute__((aligned(4))) const uint8_t SetupGetHubDescr[] = {HUB_GET_HUB_DESCRIPTOR, HUB_GET_DESCRIPTOR, 0x00,
USB_DESCR_TYP_HUB, 0x00, 0x00, sizeof(USB_HUB_DESCR), 0x00}; USB_DESCR_TYP_HUB, 0x00, 0x00, sizeof(USB_HUB_DESCR), 0x00};
__attribute__((aligned(4))) uint8_t Com_Buffer[128]; // 定义用户临时缓冲区,枚举时用于处理描述符,枚举结束也可以用作普通临时缓冲区 __attribute__((aligned(4))) uint8_t Com_Buffer[128]; // 定义用户临时缓冲区,枚举时用于处理描述符,枚举结束也可以用作普通临时缓冲区
/********************************************************************* /*********************************************************************
* @fn AnalyzeHidIntEndp * @fn AnalyzeHidIntEndp
* *
* @brief 从描述符中分析出HID中断端点的地址,如果HubPortIndex是0保存到ROOTHUB,如果是非零值则保存到HUB下结构体 * @brief 从描述符中分析出HID中断端点的地址,如果HubPortIndex是0保存到ROOTHUB,如果是非零值则保存到HUB下结构体
* *
* @param buf - 待分析数据缓冲区地址 HubPortIndex0表示根HUB,非0表示外部HUB下的端口号 * @param buf - 待分析数据缓冲区地址 HubPortIndex0表示根HUB,非0表示外部HUB下的端口号
* *
* @return 端点数 * @return 端点数
*/ */
uint8_t AnalyzeHidIntEndp(uint8_t *buf, uint8_t HubPortIndex) uint8_t AnalyzeHidIntEndp(uint8_t *buf, uint8_t HubPortIndex)
{ {
@@ -42,35 +42,35 @@ uint8_t AnalyzeHidIntEndp(uint8_t *buf, uint8_t HubPortIndex)
if(HubPortIndex) if(HubPortIndex)
{ {
memset(DevOnHubPort[HubPortIndex - 1].GpVar, 0, sizeof(DevOnHubPort[HubPortIndex - 1].GpVar)); //清空数组 memset(DevOnHubPort[HubPortIndex - 1].GpVar, 0, sizeof(DevOnHubPort[HubPortIndex - 1].GpVar)); //清空数组
} }
else else
{ {
memset(ThisUsbDev.GpVar, 0, sizeof(ThisUsbDev.GpVar)); //清空数组 memset(ThisUsbDev.GpVar, 0, sizeof(ThisUsbDev.GpVar)); //清空数组
} }
for(i = 0; i < ((PUSB_CFG_DESCR)buf)->wTotalLength; i += l) // 搜索中断端点描述符,跳过配置描述符和接口描述符 for(i = 0; i < ((PUSB_CFG_DESCR)buf)->wTotalLength; i += l) // 搜索中断端点描述符,跳过配置描述符和接口描述符
{ {
if(((PUSB_ENDP_DESCR)(buf + i))->bDescriptorType == USB_DESCR_TYP_ENDP // 是端点描述符 if(((PUSB_ENDP_DESCR)(buf + i))->bDescriptorType == USB_DESCR_TYP_ENDP // 是端点描述符
&& (((PUSB_ENDP_DESCR)(buf + i))->bmAttributes & USB_ENDP_TYPE_MASK) == USB_ENDP_TYPE_INTER // 是中断端点 && (((PUSB_ENDP_DESCR)(buf + i))->bmAttributes & USB_ENDP_TYPE_MASK) == USB_ENDP_TYPE_INTER // 是中断端点
&& (((PUSB_ENDP_DESCR)(buf + i))->bEndpointAddress & USB_ENDP_DIR_MASK)) // 是IN端点 && (((PUSB_ENDP_DESCR)(buf + i))->bEndpointAddress & USB_ENDP_DIR_MASK)) // 是IN端点
{ // 保存中断端点的地址,位7用于同步标志位,清0 { // 保存中断端点的地址,位7用于同步标志位,清0
if(HubPortIndex) if(HubPortIndex)
{ {
DevOnHubPort[HubPortIndex - 1].GpVar[s] = ((PUSB_ENDP_DESCR)(buf + i))->bEndpointAddress & USB_ENDP_ADDR_MASK; DevOnHubPort[HubPortIndex - 1].GpVar[s] = ((PUSB_ENDP_DESCR)(buf + i))->bEndpointAddress & USB_ENDP_ADDR_MASK;
} }
else else
{ {
ThisUsbDev.GpVar[s] = ((PUSB_ENDP_DESCR)(buf + i))->bEndpointAddress & USB_ENDP_ADDR_MASK; // 中断端点的地址,可以根据需要保存wMaxPacketSize和bInterval ThisUsbDev.GpVar[s] = ((PUSB_ENDP_DESCR)(buf + i))->bEndpointAddress & USB_ENDP_ADDR_MASK; // 中断端点的地址,可以根据需要保存wMaxPacketSize和bInterval
} }
PRINT("%02x ", (uint16_t)ThisUsbDev.GpVar[s]); PRINT("%02x ", (uint16_t)ThisUsbDev.GpVar[s]);
s++; s++;
if(s >= 4) if(s >= 4)
{ {
break; //只分析4个端点 break; //只分析4个端点
} }
} }
l = ((PUSB_ENDP_DESCR)(buf + i))->bLength; // 当前描述符长度,跳过 l = ((PUSB_ENDP_DESCR)(buf + i))->bLength; // 当前描述符长度,跳过
if(l > 16) if(l > 16)
{ {
break; break;
@@ -83,9 +83,9 @@ uint8_t AnalyzeHidIntEndp(uint8_t *buf, uint8_t HubPortIndex)
/********************************************************************* /*********************************************************************
* @fn AnalyzeBulkEndp * @fn AnalyzeBulkEndp
* *
* @brief 分析出批量端点,GpVar[0]、GpVar[1]存放上传端点。GpVar[2]、GpVar[3]存放下传端点 * @brief 分析出批量端点,GpVar[0]、GpVar[1]存放上传端点。GpVar[2]、GpVar[3]存放下传端点
* *
* @param buf - 待分析数据缓冲区地址 HubPortIndex0表示根HUB,非0表示外部HUB下的端口号 * @param buf - 待分析数据缓冲区地址 HubPortIndex0表示根HUB,非0表示外部HUB下的端口号
* *
* @return 0 * @return 0
*/ */
@@ -97,17 +97,17 @@ uint8_t AnalyzeBulkEndp(uint8_t *buf, uint8_t HubPortIndex)
if(HubPortIndex) if(HubPortIndex)
{ {
memset(DevOnHubPort[HubPortIndex - 1].GpVar, 0, sizeof(DevOnHubPort[HubPortIndex - 1].GpVar)); //清空数组 memset(DevOnHubPort[HubPortIndex - 1].GpVar, 0, sizeof(DevOnHubPort[HubPortIndex - 1].GpVar)); //清空数组
} }
else else
{ {
memset(ThisUsbDev.GpVar, 0, sizeof(ThisUsbDev.GpVar)); //清空数组 memset(ThisUsbDev.GpVar, 0, sizeof(ThisUsbDev.GpVar)); //清空数组
} }
for(i = 0; i < ((PUSB_CFG_DESCR)buf)->wTotalLength; i += l) // 搜索中断端点描述符,跳过配置描述符和接口描述符 for(i = 0; i < ((PUSB_CFG_DESCR)buf)->wTotalLength; i += l) // 搜索中断端点描述符,跳过配置描述符和接口描述符
{ {
if((((PUSB_ENDP_DESCR)(buf + i))->bDescriptorType == USB_DESCR_TYP_ENDP) // 是端点描述符 if((((PUSB_ENDP_DESCR)(buf + i))->bDescriptorType == USB_DESCR_TYP_ENDP) // 是端点描述符
&& ((((PUSB_ENDP_DESCR)(buf + i))->bmAttributes & USB_ENDP_TYPE_MASK) == USB_ENDP_TYPE_BULK)) // 是中断端点 && ((((PUSB_ENDP_DESCR)(buf + i))->bmAttributes & USB_ENDP_TYPE_MASK) == USB_ENDP_TYPE_BULK)) // 是中断端点
{ {
if(HubPortIndex) if(HubPortIndex)
@@ -142,7 +142,7 @@ uint8_t AnalyzeBulkEndp(uint8_t *buf, uint8_t HubPortIndex)
s2 = 3; s2 = 3;
} }
} }
l = ((PUSB_ENDP_DESCR)(buf + i))->bLength; // 当前描述符长度,跳过 l = ((PUSB_ENDP_DESCR)(buf + i))->bLength; // 当前描述符长度,跳过
if(l > 16) if(l > 16)
{ {
break; break;
@@ -154,11 +154,11 @@ uint8_t AnalyzeBulkEndp(uint8_t *buf, uint8_t HubPortIndex)
/********************************************************************* /*********************************************************************
* @fn InitRootDevice * @fn InitRootDevice
* *
* @brief 初始化指定ROOT-HUB端口的USB设备 * @brief 初始化指定ROOT-HUB端口的USB设备
* *
* @param none * @param none
* *
* @return 错误码 * @return 错误码
*/ */
uint8_t InitRootDevice(void) uint8_t InitRootDevice(void)
{ {
@@ -166,30 +166,30 @@ uint8_t InitRootDevice(void)
uint8_t cfg, dv_cls, if_cls; uint8_t cfg, dv_cls, if_cls;
PRINT("Reset host port\n"); PRINT("Reset host port\n");
ResetRootHubPort(); // 检测到设备后,复位相应端口的USB总线 ResetRootHubPort(); // 检测到设备后,复位相应端口的USB总线
for(i = 0, s = 0; i < 100; i++) for(i = 0, s = 0; i < 100; i++)
{ // 等待USB设备复位后重新连接,100mS超时 { // 等待USB设备复位后重新连接,100mS超时
mDelaymS(1); mDelaymS(1);
if(EnableRootHubPort() == ERR_SUCCESS) if(EnableRootHubPort() == ERR_SUCCESS)
{ // 使能端口 { // 使能端口
i = 0; i = 0;
s++; s++;
if(s > 100) if(s > 100)
{ {
break; // 已经稳定连接100mS break; // 已经稳定连接100mS
} }
} }
} }
if(i) if(i)
{ // 复位后设备没有连接 { // 复位后设备没有连接
DisableRootHubPort(); DisableRootHubPort();
PRINT("Disable host port because of disconnect\n"); PRINT("Disable host port because of disconnect\n");
return (ERR_USB_DISCON); return (ERR_USB_DISCON);
} }
SetUsbSpeed(ThisUsbDev.DeviceSpeed); // 设置当前USB速度 SetUsbSpeed(ThisUsbDev.DeviceSpeed); // 设置当前USB速度
PRINT("GetDevDescr: "); PRINT("GetDevDescr: ");
s = CtrlGetDeviceDescr(); // 获取设备描述符 s = CtrlGetDeviceDescr(); // 获取设备描述符
if(s == ERR_SUCCESS) if(s == ERR_SUCCESS)
{ {
for(i = 0; i < ((PUSB_SETUP_REQ)SetupGetDevDescr)->wLength; i++) for(i = 0; i < ((PUSB_SETUP_REQ)SetupGetDevDescr)->wLength; i++)
@@ -198,14 +198,14 @@ uint8_t InitRootDevice(void)
} }
PRINT("\n"); PRINT("\n");
ThisUsbDev.DeviceVID = ((PUSB_DEV_DESCR)Com_Buffer)->idVendor; //保存VID PID信息 ThisUsbDev.DeviceVID = ((PUSB_DEV_DESCR)Com_Buffer)->idVendor; //保存VID PID信息
ThisUsbDev.DevicePID = ((PUSB_DEV_DESCR)Com_Buffer)->idProduct; ThisUsbDev.DevicePID = ((PUSB_DEV_DESCR)Com_Buffer)->idProduct;
dv_cls = ((PUSB_DEV_DESCR)Com_Buffer)->bDeviceClass; dv_cls = ((PUSB_DEV_DESCR)Com_Buffer)->bDeviceClass;
s = CtrlSetUsbAddress(((PUSB_SETUP_REQ)SetupSetUsbAddr)->wValue); s = CtrlSetUsbAddress(((PUSB_SETUP_REQ)SetupSetUsbAddr)->wValue);
if(s == ERR_SUCCESS) if(s == ERR_SUCCESS)
{ {
ThisUsbDev.DeviceAddress = ((PUSB_SETUP_REQ)SetupSetUsbAddr)->wValue; // 保存USB地址 ThisUsbDev.DeviceAddress = ((PUSB_SETUP_REQ)SetupSetUsbAddr)->wValue; // 保存USB地址
PRINT("GetCfgDescr: "); PRINT("GetCfgDescr: ");
s = CtrlGetConfigDescr(); s = CtrlGetConfigDescr();
@@ -216,12 +216,12 @@ uint8_t InitRootDevice(void)
PRINT("x%02X ", (uint16_t)(Com_Buffer[i])); PRINT("x%02X ", (uint16_t)(Com_Buffer[i]));
} }
PRINT("\n"); PRINT("\n");
/* 分析配置描述符,获取端点数据/各端点地址/各端点大小等,更新变量endp_addr和endp_size等 */ /* 分析配置描述符,获取端点数据/各端点地址/各端点大小等,更新变量endp_addr和endp_size等 */
cfg = ((PUSB_CFG_DESCR)Com_Buffer)->bConfigurationValue; cfg = ((PUSB_CFG_DESCR)Com_Buffer)->bConfigurationValue;
if_cls = ((PUSB_CFG_DESCR_LONG)Com_Buffer)->itf_descr.bInterfaceClass; // 接口类代码 if_cls = ((PUSB_CFG_DESCR_LONG)Com_Buffer)->itf_descr.bInterfaceClass; // 接口类代码
if((dv_cls == 0x00) && (if_cls == USB_DEV_CLASS_STORAGE)) if((dv_cls == 0x00) && (if_cls == USB_DEV_CLASS_STORAGE))
{ // 是USB存储类设备,基本上确认是U盘 { // 是USB存储类设备,基本上确认是U盘
#ifdef FOR_ROOT_UDISK_ONLY #ifdef FOR_ROOT_UDISK_ONLY
CHRV3DiskStatus = DISK_USB_ADDR; CHRV3DiskStatus = DISK_USB_ADDR;
return (ERR_SUCCESS); return (ERR_SUCCESS);
@@ -231,40 +231,40 @@ uint8_t InitRootDevice(void)
return (ERR_USB_UNSUPPORT); return (ERR_USB_UNSUPPORT);
} }
#else #else
s = CtrlSetUsbConfig(cfg); // 设置USB设备配置 s = CtrlSetUsbConfig(cfg); // 设置USB设备配置
if(s == ERR_SUCCESS) if(s == ERR_SUCCESS)
{ {
ThisUsbDev.DeviceStatus = ROOT_DEV_SUCCESS; ThisUsbDev.DeviceStatus = ROOT_DEV_SUCCESS;
ThisUsbDev.DeviceType = USB_DEV_CLASS_STORAGE; ThisUsbDev.DeviceType = USB_DEV_CLASS_STORAGE;
PRINT("USB-Disk Ready\n"); PRINT("USB-Disk Ready\n");
SetUsbSpeed(1); // 默认为全速 SetUsbSpeed(1); // 默认为全速
return (ERR_SUCCESS); return (ERR_SUCCESS);
} }
} }
else if((dv_cls == 0x00) && (if_cls == USB_DEV_CLASS_PRINTER) && ((PUSB_CFG_DESCR_LONG)Com_Buffer)->itf_descr.bInterfaceSubClass == 0x01) else if((dv_cls == 0x00) && (if_cls == USB_DEV_CLASS_PRINTER) && ((PUSB_CFG_DESCR_LONG)Com_Buffer)->itf_descr.bInterfaceSubClass == 0x01)
{ // 是打印机类设备 { // 是打印机类设备
s = CtrlSetUsbConfig(cfg); // 设置USB设备配置 s = CtrlSetUsbConfig(cfg); // 设置USB设备配置
if(s == ERR_SUCCESS) if(s == ERR_SUCCESS)
{ {
// 需保存端点信息以便主程序进行USB传输 // 需保存端点信息以便主程序进行USB传输
ThisUsbDev.DeviceStatus = ROOT_DEV_SUCCESS; ThisUsbDev.DeviceStatus = ROOT_DEV_SUCCESS;
ThisUsbDev.DeviceType = USB_DEV_CLASS_PRINTER; ThisUsbDev.DeviceType = USB_DEV_CLASS_PRINTER;
PRINT("USB-Print Ready\n"); PRINT("USB-Print Ready\n");
SetUsbSpeed(1); // 默认为全速 SetUsbSpeed(1); // 默认为全速
return (ERR_SUCCESS); return (ERR_SUCCESS);
} }
} }
else if((dv_cls == 0x00) && (if_cls == USB_DEV_CLASS_HID) && ((PUSB_CFG_DESCR_LONG)Com_Buffer)->itf_descr.bInterfaceSubClass <= 0x01) else if((dv_cls == 0x00) && (if_cls == USB_DEV_CLASS_HID) && ((PUSB_CFG_DESCR_LONG)Com_Buffer)->itf_descr.bInterfaceSubClass <= 0x01)
{ // 是HID类设备,键盘/鼠标等 { // 是HID类设备,键盘/鼠标等
// 从描述符中分析出HID中断端点的地址 // 从描述符中分析出HID中断端点的地址
s = AnalyzeHidIntEndp(Com_Buffer, 0); // 从描述符中分析出HID中断端点的地址 s = AnalyzeHidIntEndp(Com_Buffer, 0); // 从描述符中分析出HID中断端点的地址
PRINT("AnalyzeHidIntEndp %02x\n", (uint16_t)s); PRINT("AnalyzeHidIntEndp %02x\n", (uint16_t)s);
// 保存中断端点的地址,位7用于同步标志位,清0 // 保存中断端点的地址,位7用于同步标志位,清0
if_cls = ((PUSB_CFG_DESCR_LONG)Com_Buffer)->itf_descr.bInterfaceProtocol; if_cls = ((PUSB_CFG_DESCR_LONG)Com_Buffer)->itf_descr.bInterfaceProtocol;
s = CtrlSetUsbConfig(cfg); // 设置USB设备配置 s = CtrlSetUsbConfig(cfg); // 设置USB设备配置
if(s == ERR_SUCCESS) if(s == ERR_SUCCESS)
{ {
s = CtrlGetHIDDeviceReport(dv_cls); //获取报表描述符 s = CtrlGetHIDDeviceReport(dv_cls); //获取报表描述符
if(s == ERR_SUCCESS) if(s == ERR_SUCCESS)
{ {
for(i = 0; i < 64; i++) for(i = 0; i < 64; i++)
@@ -273,70 +273,70 @@ uint8_t InitRootDevice(void)
} }
PRINT("\n"); PRINT("\n");
} }
// 需保存端点信息以便主程序进行USB传输 // 需保存端点信息以便主程序进行USB传输
ThisUsbDev.DeviceStatus = ROOT_DEV_SUCCESS; ThisUsbDev.DeviceStatus = ROOT_DEV_SUCCESS;
if(if_cls == 1) if(if_cls == 1)
{ {
ThisUsbDev.DeviceType = DEV_TYPE_KEYBOARD; ThisUsbDev.DeviceType = DEV_TYPE_KEYBOARD;
// 进一步初始化,例如设备键盘指示灯LED等 // 进一步初始化,例如设备键盘指示灯LED等
PRINT("USB-Keyboard Ready\n"); PRINT("USB-Keyboard Ready\n");
SetUsbSpeed(1); // 默认为全速 SetUsbSpeed(1); // 默认为全速
return (ERR_SUCCESS); return (ERR_SUCCESS);
} }
else if(if_cls == 2) else if(if_cls == 2)
{ {
ThisUsbDev.DeviceType = DEV_TYPE_MOUSE; ThisUsbDev.DeviceType = DEV_TYPE_MOUSE;
// 为了以后查询鼠标状态,应该分析描述符,取得中断端口的地址,长度等信息 // 为了以后查询鼠标状态,应该分析描述符,取得中断端口的地址,长度等信息
PRINT("USB-Mouse Ready\n"); PRINT("USB-Mouse Ready\n");
SetUsbSpeed(1); // 默认为全速 SetUsbSpeed(1); // 默认为全速
return (ERR_SUCCESS); return (ERR_SUCCESS);
} }
s = ERR_USB_UNSUPPORT; s = ERR_USB_UNSUPPORT;
} }
} }
else if(dv_cls == USB_DEV_CLASS_HUB) else if(dv_cls == USB_DEV_CLASS_HUB)
{ // 是HUB类设备,集线器等 { // 是HUB类设备,集线器等
s = CtrlGetHubDescr(); s = CtrlGetHubDescr();
if(s == ERR_SUCCESS) if(s == ERR_SUCCESS)
{ {
PRINT("Max Port:%02X ", (((PXUSB_HUB_DESCR)Com_Buffer)->bNbrPorts)); PRINT("Max Port:%02X ", (((PXUSB_HUB_DESCR)Com_Buffer)->bNbrPorts));
ThisUsbDev.GpHUBPortNum = ((PXUSB_HUB_DESCR)Com_Buffer)->bNbrPorts; // 保存HUB的端口数量 ThisUsbDev.GpHUBPortNum = ((PXUSB_HUB_DESCR)Com_Buffer)->bNbrPorts; // 保存HUB的端口数量
if(ThisUsbDev.GpHUBPortNum > HUB_MAX_PORTS) if(ThisUsbDev.GpHUBPortNum > HUB_MAX_PORTS)
{ {
ThisUsbDev.GpHUBPortNum = HUB_MAX_PORTS; // 因为定义结构DevOnHubPort时人为假定每个HUB不超过HUB_MAX_PORTS个端口 ThisUsbDev.GpHUBPortNum = HUB_MAX_PORTS; // 因为定义结构DevOnHubPort时人为假定每个HUB不超过HUB_MAX_PORTS个端口
} }
s = CtrlSetUsbConfig(cfg); // 设置USB设备配置 s = CtrlSetUsbConfig(cfg); // 设置USB设备配置
if(s == ERR_SUCCESS) if(s == ERR_SUCCESS)
{ {
ThisUsbDev.DeviceStatus = ROOT_DEV_SUCCESS; ThisUsbDev.DeviceStatus = ROOT_DEV_SUCCESS;
ThisUsbDev.DeviceType = USB_DEV_CLASS_HUB; ThisUsbDev.DeviceType = USB_DEV_CLASS_HUB;
//需保存端点信息以便主程序进行USB传输,本来中断端点可用于HUB事件通知,但本程序使用查询状态控制传输代替 //需保存端点信息以便主程序进行USB传输,本来中断端点可用于HUB事件通知,但本程序使用查询状态控制传输代替
//给HUB各端口上电,查询各端口状态,初始化有设备连接的HUB端口,初始化设备 //给HUB各端口上电,查询各端口状态,初始化有设备连接的HUB端口,初始化设备
for(i = 1; i <= ThisUsbDev.GpHUBPortNum; i++) // 给HUB各端口都上电 for(i = 1; i <= ThisUsbDev.GpHUBPortNum; i++) // 给HUB各端口都上电
{ {
DevOnHubPort[i - 1].DeviceStatus = ROOT_DEV_DISCONNECT; // 清外部HUB端口上设备的状态 DevOnHubPort[i - 1].DeviceStatus = ROOT_DEV_DISCONNECT; // 清外部HUB端口上设备的状态
s = HubSetPortFeature(i, HUB_PORT_POWER); s = HubSetPortFeature(i, HUB_PORT_POWER);
if(s != ERR_SUCCESS) if(s != ERR_SUCCESS)
{ {
PRINT("Ext-HUB Port_%1d# power on error\n", (uint16_t)i); // 端口上电失败 PRINT("Ext-HUB Port_%1d# power on error\n", (uint16_t)i); // 端口上电失败
} }
} }
PRINT("USB-HUB Ready\n"); PRINT("USB-HUB Ready\n");
SetUsbSpeed(1); // 默认为全速 SetUsbSpeed(1); // 默认为全速
return (ERR_SUCCESS); return (ERR_SUCCESS);
} }
} }
} }
else else
{ // 可以进一步分析 { // 可以进一步分析
s = CtrlSetUsbConfig(cfg); // 设置USB设备配置 s = CtrlSetUsbConfig(cfg); // 设置USB设备配置
if(s == ERR_SUCCESS) if(s == ERR_SUCCESS)
{ {
// 需保存端点信息以便主程序进行USB传输 // 需保存端点信息以便主程序进行USB传输
ThisUsbDev.DeviceStatus = ROOT_DEV_SUCCESS; ThisUsbDev.DeviceStatus = ROOT_DEV_SUCCESS;
ThisUsbDev.DeviceType = DEV_TYPE_UNKNOW; ThisUsbDev.DeviceType = DEV_TYPE_UNKNOW;
SetUsbSpeed(1); // 默认为全速 SetUsbSpeed(1); // 默认为全速
return (ERR_SUCCESS); /* 未知设备初始化成功 */ return (ERR_SUCCESS); /* 未知设备初始化成功 */
} }
} }
#endif #endif
@@ -350,18 +350,18 @@ uint8_t InitRootDevice(void)
#else #else
ThisUsbDev.DeviceStatus = ROOT_DEV_FAILED; ThisUsbDev.DeviceStatus = ROOT_DEV_FAILED;
#endif #endif
SetUsbSpeed(1); // 默认为全速 SetUsbSpeed(1); // 默认为全速
return (s); return (s);
} }
/********************************************************************* /*********************************************************************
* @fn InitDevOnHub * @fn InitDevOnHub
* *
* @brief 初始化枚举外部HUB后的二级USB设备 * @brief 初始化枚举外部HUB后的二级USB设备
* *
* @param HubPortIndex - 指定外部HUB * @param HubPortIndex - 指定外部HUB
* *
* @return 错误码 * @return 错误码
*/ */
uint8_t InitDevOnHub(uint8_t HubPortIndex) uint8_t InitDevOnHub(uint8_t HubPortIndex)
{ {
@@ -372,26 +372,26 @@ uint8_t InitDevOnHub(uint8_t HubPortIndex)
{ {
return (ERR_USB_UNKNOWN); return (ERR_USB_UNKNOWN);
} }
SelectHubPort(HubPortIndex); // 选择操作指定的ROOT-HUB端口的外部HUB的指定端口,选择速度 SelectHubPort(HubPortIndex); // 选择操作指定的ROOT-HUB端口的外部HUB的指定端口,选择速度
PRINT("GetDevDescr: "); PRINT("GetDevDescr: ");
s = CtrlGetDeviceDescr(); // 获取设备描述符 s = CtrlGetDeviceDescr(); // 获取设备描述符
if(s != ERR_SUCCESS) if(s != ERR_SUCCESS)
{ {
return (s); return (s);
} }
DevOnHubPort[HubPortIndex - 1].DeviceVID = ((uint16_t)((PUSB_DEV_DESCR)Com_Buffer)->idVendor); //保存VID PID信息 DevOnHubPort[HubPortIndex - 1].DeviceVID = ((uint16_t)((PUSB_DEV_DESCR)Com_Buffer)->idVendor); //保存VID PID信息
DevOnHubPort[HubPortIndex - 1].DevicePID = ((uint16_t)((PUSB_DEV_DESCR)Com_Buffer)->idProduct); DevOnHubPort[HubPortIndex - 1].DevicePID = ((uint16_t)((PUSB_DEV_DESCR)Com_Buffer)->idProduct);
dv_cls = ((PUSB_DEV_DESCR)Com_Buffer)->bDeviceClass; // 设备类代码 dv_cls = ((PUSB_DEV_DESCR)Com_Buffer)->bDeviceClass; // 设备类代码
cfg = (1 << 4) + HubPortIndex; // 计算出一个USB地址,避免地址重叠 cfg = (1 << 4) + HubPortIndex; // 计算出一个USB地址,避免地址重叠
s = CtrlSetUsbAddress(cfg); // 设置USB设备地址 s = CtrlSetUsbAddress(cfg); // 设置USB设备地址
if(s != ERR_SUCCESS) if(s != ERR_SUCCESS)
{ {
return (s); return (s);
} }
DevOnHubPort[HubPortIndex - 1].DeviceAddress = cfg; // 保存分配的USB地址 DevOnHubPort[HubPortIndex - 1].DeviceAddress = cfg; // 保存分配的USB地址
PRINT("GetCfgDescr: "); PRINT("GetCfgDescr: ");
s = CtrlGetConfigDescr(); // 获取配置描述符 s = CtrlGetConfigDescr(); // 获取配置描述符
if(s != ERR_SUCCESS) if(s != ERR_SUCCESS)
{ {
return (s); return (s);
@@ -402,9 +402,9 @@ uint8_t InitDevOnHub(uint8_t HubPortIndex)
PRINT("x%02X ", (uint16_t)(Com_Buffer[i])); PRINT("x%02X ", (uint16_t)(Com_Buffer[i]));
} }
PRINT("\n"); PRINT("\n");
/* 分析配置描述符,获取端点数据/各端点地址/各端点大小等,更新变量endp_addr和endp_size等 */ /* 分析配置描述符,获取端点数据/各端点地址/各端点大小等,更新变量endp_addr和endp_size等 */
if_cls = ((PXUSB_CFG_DESCR_LONG)Com_Buffer)->itf_descr.bInterfaceClass; // 接口类代码 if_cls = ((PXUSB_CFG_DESCR_LONG)Com_Buffer)->itf_descr.bInterfaceClass; // 接口类代码
if(dv_cls == 0x00 && if_cls == USB_DEV_CLASS_STORAGE) // 是USB存储类设备,基本上确认是U盘 if(dv_cls == 0x00 && if_cls == USB_DEV_CLASS_STORAGE) // 是USB存储类设备,基本上确认是U盘
{ {
AnalyzeBulkEndp(Com_Buffer, HubPortIndex); AnalyzeBulkEndp(Com_Buffer, HubPortIndex);
for(i = 0; i != 4; i++) for(i = 0; i != 4; i++)
@@ -412,28 +412,28 @@ uint8_t InitDevOnHub(uint8_t HubPortIndex)
PRINT("%02x ", (uint16_t)DevOnHubPort[HubPortIndex - 1].GpVar[i]); PRINT("%02x ", (uint16_t)DevOnHubPort[HubPortIndex - 1].GpVar[i]);
} }
PRINT("\n"); PRINT("\n");
s = CtrlSetUsbConfig(cfg); // 设置USB设备配置 s = CtrlSetUsbConfig(cfg); // 设置USB设备配置
if(s == ERR_SUCCESS) if(s == ERR_SUCCESS)
{ {
DevOnHubPort[HubPortIndex - 1].DeviceStatus = ROOT_DEV_SUCCESS; DevOnHubPort[HubPortIndex - 1].DeviceStatus = ROOT_DEV_SUCCESS;
DevOnHubPort[HubPortIndex - 1].DeviceType = USB_DEV_CLASS_STORAGE; DevOnHubPort[HubPortIndex - 1].DeviceType = USB_DEV_CLASS_STORAGE;
PRINT("USB-Disk Ready\n"); PRINT("USB-Disk Ready\n");
SetUsbSpeed(1); // 默认为全速 SetUsbSpeed(1); // 默认为全速
return (ERR_SUCCESS); return (ERR_SUCCESS);
} }
} }
else if((dv_cls == 0x00) && (if_cls == USB_DEV_CLASS_HID) && (((PXUSB_CFG_DESCR_LONG)Com_Buffer)->itf_descr.bInterfaceSubClass <= 0x01)) // 是HID类设备,键盘/鼠标等 else if((dv_cls == 0x00) && (if_cls == USB_DEV_CLASS_HID) && (((PXUSB_CFG_DESCR_LONG)Com_Buffer)->itf_descr.bInterfaceSubClass <= 0x01)) // 是HID类设备,键盘/鼠标等
{ {
ifc = ((PXUSB_CFG_DESCR_LONG)Com_Buffer)->cfg_descr.bNumInterfaces; ifc = ((PXUSB_CFG_DESCR_LONG)Com_Buffer)->cfg_descr.bNumInterfaces;
s = AnalyzeHidIntEndp(Com_Buffer, HubPortIndex); // 从描述符中分析出HID中断端点的地址 s = AnalyzeHidIntEndp(Com_Buffer, HubPortIndex); // 从描述符中分析出HID中断端点的地址
PRINT("AnalyzeHidIntEndp %02x\n", (uint16_t)s); PRINT("AnalyzeHidIntEndp %02x\n", (uint16_t)s);
if_cls = ((PXUSB_CFG_DESCR_LONG)Com_Buffer)->itf_descr.bInterfaceProtocol; if_cls = ((PXUSB_CFG_DESCR_LONG)Com_Buffer)->itf_descr.bInterfaceProtocol;
s = CtrlSetUsbConfig(cfg); // 设置USB设备配置 s = CtrlSetUsbConfig(cfg); // 设置USB设备配置
if(s == ERR_SUCCESS) if(s == ERR_SUCCESS)
{ {
for(dv_cls = 0; dv_cls < ifc; dv_cls++) for(dv_cls = 0; dv_cls < ifc; dv_cls++)
{ {
s = CtrlGetHIDDeviceReport(dv_cls); //获取报表描述符 s = CtrlGetHIDDeviceReport(dv_cls); //获取报表描述符
if(s == ERR_SUCCESS) if(s == ERR_SUCCESS)
{ {
for(i = 0; i < 64; i++) for(i = 0; i < 64; i++)
@@ -443,105 +443,105 @@ uint8_t InitDevOnHub(uint8_t HubPortIndex)
PRINT("\n"); PRINT("\n");
} }
} }
//需保存端点信息以便主程序进行USB传输 //需保存端点信息以便主程序进行USB传输
DevOnHubPort[HubPortIndex - 1].DeviceStatus = ROOT_DEV_SUCCESS; DevOnHubPort[HubPortIndex - 1].DeviceStatus = ROOT_DEV_SUCCESS;
if(if_cls == 1) if(if_cls == 1)
{ {
DevOnHubPort[HubPortIndex - 1].DeviceType = DEV_TYPE_KEYBOARD; DevOnHubPort[HubPortIndex - 1].DeviceType = DEV_TYPE_KEYBOARD;
//进一步初始化,例如设备键盘指示灯LED等 //进一步初始化,例如设备键盘指示灯LED等
if(ifc > 1) if(ifc > 1)
{ {
PRINT("USB_DEV_CLASS_HID Ready\n"); PRINT("USB_DEV_CLASS_HID Ready\n");
DevOnHubPort[HubPortIndex - 1].DeviceType = USB_DEV_CLASS_HID; //复合HID设备 DevOnHubPort[HubPortIndex - 1].DeviceType = USB_DEV_CLASS_HID; //复合HID设备
} }
PRINT("USB-Keyboard Ready\n"); PRINT("USB-Keyboard Ready\n");
SetUsbSpeed(1); // 默认为全速 SetUsbSpeed(1); // 默认为全速
return (ERR_SUCCESS); return (ERR_SUCCESS);
} }
else if(if_cls == 2) else if(if_cls == 2)
{ {
DevOnHubPort[HubPortIndex - 1].DeviceType = DEV_TYPE_MOUSE; DevOnHubPort[HubPortIndex - 1].DeviceType = DEV_TYPE_MOUSE;
//为了以后查询鼠标状态,应该分析描述符,取得中断端口的地址,长度等信息 //为了以后查询鼠标状态,应该分析描述符,取得中断端口的地址,长度等信息
if(ifc > 1) if(ifc > 1)
{ {
PRINT("USB_DEV_CLASS_HID Ready\n"); PRINT("USB_DEV_CLASS_HID Ready\n");
DevOnHubPort[HubPortIndex - 1].DeviceType = USB_DEV_CLASS_HID; //复合HID设备 DevOnHubPort[HubPortIndex - 1].DeviceType = USB_DEV_CLASS_HID; //复合HID设备
} }
PRINT("USB-Mouse Ready\n"); PRINT("USB-Mouse Ready\n");
SetUsbSpeed(1); // 默认为全速 SetUsbSpeed(1); // 默认为全速
return (ERR_SUCCESS); return (ERR_SUCCESS);
} }
s = ERR_USB_UNSUPPORT; s = ERR_USB_UNSUPPORT;
} }
} }
else if(dv_cls == USB_DEV_CLASS_HUB) // 是HUB类设备,集线器等 else if(dv_cls == USB_DEV_CLASS_HUB) // 是HUB类设备,集线器等
{ {
DevOnHubPort[HubPortIndex - 1].DeviceType = USB_DEV_CLASS_HUB; DevOnHubPort[HubPortIndex - 1].DeviceType = USB_DEV_CLASS_HUB;
PRINT("This program don't support Level 2 HUB\n"); // 需要支持多级HUB级联请参考本程序进行扩展 PRINT("This program don't support Level 2 HUB\n"); // 需要支持多级HUB级联请参考本程序进行扩展
s = HubClearPortFeature(i, HUB_PORT_ENABLE); // 禁止HUB端口 s = HubClearPortFeature(i, HUB_PORT_ENABLE); // 禁止HUB端口
if(s != ERR_SUCCESS) if(s != ERR_SUCCESS)
{ {
return (s); return (s);
} }
s = ERR_USB_UNSUPPORT; s = ERR_USB_UNSUPPORT;
} }
else //其他设备 else //其他设备
{ {
AnalyzeBulkEndp(Com_Buffer, HubPortIndex); //分析出批量端点 AnalyzeBulkEndp(Com_Buffer, HubPortIndex); //分析出批量端点
for(i = 0; i != 4; i++) for(i = 0; i != 4; i++)
{ {
PRINT("%02x ", (uint16_t)DevOnHubPort[HubPortIndex - 1].GpVar[i]); PRINT("%02x ", (uint16_t)DevOnHubPort[HubPortIndex - 1].GpVar[i]);
} }
PRINT("\n"); PRINT("\n");
s = CtrlSetUsbConfig(cfg); // 设置USB设备配置 s = CtrlSetUsbConfig(cfg); // 设置USB设备配置
if(s == ERR_SUCCESS) if(s == ERR_SUCCESS)
{ {
//需保存端点信息以便主程序进行USB传输 //需保存端点信息以便主程序进行USB传输
DevOnHubPort[HubPortIndex - 1].DeviceStatus = ROOT_DEV_SUCCESS; DevOnHubPort[HubPortIndex - 1].DeviceStatus = ROOT_DEV_SUCCESS;
DevOnHubPort[HubPortIndex - 1].DeviceType = dv_cls ? dv_cls : if_cls; DevOnHubPort[HubPortIndex - 1].DeviceType = dv_cls ? dv_cls : if_cls;
SetUsbSpeed(1); // 默认为全速 SetUsbSpeed(1); // 默认为全速
return (ERR_SUCCESS); //未知设备初始化成功 return (ERR_SUCCESS); //未知设备初始化成功
} }
} }
PRINT("InitDevOnHub Err = %02X\n", (uint16_t)s); PRINT("InitDevOnHub Err = %02X\n", (uint16_t)s);
DevOnHubPort[HubPortIndex - 1].DeviceStatus = ROOT_DEV_FAILED; DevOnHubPort[HubPortIndex - 1].DeviceStatus = ROOT_DEV_FAILED;
SetUsbSpeed(1); // 默认为全速 SetUsbSpeed(1); // 默认为全速
return (s); return (s);
} }
/********************************************************************* /*********************************************************************
* @fn EnumHubPort * @fn EnumHubPort
* *
* @brief 枚举指定ROOT-HUB端口上的外部HUB集线器的各个端口,检查各端口有无连接或移除事件并初始化二级USB设备 * @brief 枚举指定ROOT-HUB端口上的外部HUB集线器的各个端口,检查各端口有无连接或移除事件并初始化二级USB设备
* *
* @param RootHubIndex - ROOT_HUB0和ROOT_HUB1 * @param RootHubIndex - ROOT_HUB0和ROOT_HUB1
* *
* @return 错误码 * @return 错误码
*/ */
uint8_t EnumHubPort() uint8_t EnumHubPort()
{ {
uint8_t i, s; uint8_t i, s;
for(i = 1; i <= ThisUsbDev.GpHUBPortNum; i++) // 查询集线器的端口是否有变化 for(i = 1; i <= ThisUsbDev.GpHUBPortNum; i++) // 查询集线器的端口是否有变化
{ {
SelectHubPort(0); // 选择操作指定的ROOT-HUB端口,设置当前USB速度以及被操作设备的USB地址 SelectHubPort(0); // 选择操作指定的ROOT-HUB端口,设置当前USB速度以及被操作设备的USB地址
s = HubGetPortStatus(i); // 获取端口状态 s = HubGetPortStatus(i); // 获取端口状态
if(s != ERR_SUCCESS) if(s != ERR_SUCCESS)
{ {
return (s); // 可能是该HUB断开了 return (s); // 可能是该HUB断开了
} }
if(((Com_Buffer[0] & (1 << (HUB_PORT_CONNECTION & 0x07))) && (Com_Buffer[2] & (1 << (HUB_C_PORT_CONNECTION & 0x07)))) || (Com_Buffer[2] == 0x10)) if(((Com_Buffer[0] & (1 << (HUB_PORT_CONNECTION & 0x07))) && (Com_Buffer[2] & (1 << (HUB_C_PORT_CONNECTION & 0x07)))) || (Com_Buffer[2] == 0x10))
{ // 发现有设备连接 { // 发现有设备连接
DevOnHubPort[i - 1].DeviceStatus = ROOT_DEV_CONNECTED; // 有设备连接 DevOnHubPort[i - 1].DeviceStatus = ROOT_DEV_CONNECTED; // 有设备连接
DevOnHubPort[i - 1].DeviceAddress = 0x00; DevOnHubPort[i - 1].DeviceAddress = 0x00;
s = HubGetPortStatus(i); // 获取端口状态 s = HubGetPortStatus(i); // 获取端口状态
if(s != ERR_SUCCESS) if(s != ERR_SUCCESS)
{ {
return (s); // 可能是该HUB断开了 return (s); // 可能是该HUB断开了
} }
DevOnHubPort[i - 1].DeviceSpeed = Com_Buffer[1] & (1 << (HUB_PORT_LOW_SPEED & 0x07)) ? 0 : 1; // 低速还是全速 DevOnHubPort[i - 1].DeviceSpeed = Com_Buffer[1] & (1 << (HUB_PORT_LOW_SPEED & 0x07)) ? 0 : 1; // 低速还是全速
if(DevOnHubPort[i - 1].DeviceSpeed) if(DevOnHubPort[i - 1].DeviceSpeed)
{ {
PRINT("Found full speed device on port %1d\n", (uint16_t)i); PRINT("Found full speed device on port %1d\n", (uint16_t)i);
@@ -550,97 +550,97 @@ uint8_t EnumHubPort()
{ {
PRINT("Found low speed device on port %1d\n", (uint16_t)i); PRINT("Found low speed device on port %1d\n", (uint16_t)i);
} }
mDelaymS(200); // 等待设备上电稳定 mDelaymS(200); // 等待设备上电稳定
s = HubSetPortFeature(i, HUB_PORT_RESET); // 对有设备连接的端口复位 s = HubSetPortFeature(i, HUB_PORT_RESET); // 对有设备连接的端口复位
if(s != ERR_SUCCESS) if(s != ERR_SUCCESS)
{ {
return (s); // 可能是该HUB断开了 return (s); // 可能是该HUB断开了
} }
PRINT("Reset port and then wait in\n"); PRINT("Reset port and then wait in\n");
do // 查询复位端口,直到复位完成,把完成后的状态显示出来 do // 查询复位端口,直到复位完成,把完成后的状态显示出来
{ {
mDelaymS(1); mDelaymS(1);
s = HubGetPortStatus(i); s = HubGetPortStatus(i);
if(s != ERR_SUCCESS) if(s != ERR_SUCCESS)
{ {
return (s); // 可能是该HUB断开了 return (s); // 可能是该HUB断开了
} }
} while(Com_Buffer[0] & (1 << (HUB_PORT_RESET & 0x07))); // 端口正在复位则等待 } while(Com_Buffer[0] & (1 << (HUB_PORT_RESET & 0x07))); // 端口正在复位则等待
mDelaymS(100); mDelaymS(100);
s = HubClearPortFeature(i, HUB_C_PORT_RESET); // 清除复位完成标志 s = HubClearPortFeature(i, HUB_C_PORT_RESET); // 清除复位完成标志
// s = HubSetPortFeature( i, HUB_PORT_ENABLE ); // 启用HUB端口 // s = HubSetPortFeature( i, HUB_PORT_ENABLE ); // 启用HUB端口
s = HubClearPortFeature(i, HUB_C_PORT_CONNECTION); // 清除连接或移除变化标志 s = HubClearPortFeature(i, HUB_C_PORT_CONNECTION); // 清除连接或移除变化标志
if(s != ERR_SUCCESS) if(s != ERR_SUCCESS)
{ {
return (s); return (s);
} }
s = HubGetPortStatus(i); // 再读取状态,复查设备是否还在 s = HubGetPortStatus(i); // 再读取状态,复查设备是否还在
if(s != ERR_SUCCESS) if(s != ERR_SUCCESS)
{ {
return (s); return (s);
} }
if((Com_Buffer[0] & (1 << (HUB_PORT_CONNECTION & 0x07))) == 0) if((Com_Buffer[0] & (1 << (HUB_PORT_CONNECTION & 0x07))) == 0)
{ {
DevOnHubPort[i - 1].DeviceStatus = ROOT_DEV_DISCONNECT; // 设备不在了 DevOnHubPort[i - 1].DeviceStatus = ROOT_DEV_DISCONNECT; // 设备不在了
} }
s = InitDevOnHub(i); // 初始化二级USB设备 s = InitDevOnHub(i); // 初始化二级USB设备
if(s != ERR_SUCCESS) if(s != ERR_SUCCESS)
{ {
return (s); return (s);
} }
SetUsbSpeed(1); // 默认为全速 SetUsbSpeed(1); // 默认为全速
} }
else if(Com_Buffer[2] & (1 << (HUB_C_PORT_ENABLE & 0x07))) // 设备连接出错 else if(Com_Buffer[2] & (1 << (HUB_C_PORT_ENABLE & 0x07))) // 设备连接出错
{ {
HubClearPortFeature(i, HUB_C_PORT_ENABLE); // 清除连接错误标志 HubClearPortFeature(i, HUB_C_PORT_ENABLE); // 清除连接错误标志
PRINT("Device on port error\n"); PRINT("Device on port error\n");
s = HubSetPortFeature(i, HUB_PORT_RESET); // 对有设备连接的端口复位 s = HubSetPortFeature(i, HUB_PORT_RESET); // 对有设备连接的端口复位
if(s != ERR_SUCCESS) if(s != ERR_SUCCESS)
return (s); // 可能是该HUB断开了 return (s); // 可能是该HUB断开了
do // 查询复位端口,直到复位完成,把完成后的状态显示出来 do // 查询复位端口,直到复位完成,把完成后的状态显示出来
{ {
mDelaymS(1); mDelaymS(1);
s = HubGetPortStatus(i); s = HubGetPortStatus(i);
if(s != ERR_SUCCESS) if(s != ERR_SUCCESS)
return (s); // 可能是该HUB断开了 return (s); // 可能是该HUB断开了
} while(Com_Buffer[0] & (1 << (HUB_PORT_RESET & 0x07))); // 端口正在复位则等待 } while(Com_Buffer[0] & (1 << (HUB_PORT_RESET & 0x07))); // 端口正在复位则等待
} }
else if((Com_Buffer[0] & (1 << (HUB_PORT_CONNECTION & 0x07))) == 0) // 设备已经断开 else if((Com_Buffer[0] & (1 << (HUB_PORT_CONNECTION & 0x07))) == 0) // 设备已经断开
{ {
if(DevOnHubPort[i - 1].DeviceStatus >= ROOT_DEV_CONNECTED) if(DevOnHubPort[i - 1].DeviceStatus >= ROOT_DEV_CONNECTED)
{ {
PRINT("Device on port %1d removed\n", (uint16_t)i); PRINT("Device on port %1d removed\n", (uint16_t)i);
} }
DevOnHubPort[i - 1].DeviceStatus = ROOT_DEV_DISCONNECT; // 有设备连接 DevOnHubPort[i - 1].DeviceStatus = ROOT_DEV_DISCONNECT; // 有设备连接
if(Com_Buffer[2] & (1 << (HUB_C_PORT_CONNECTION & 0x07))) if(Com_Buffer[2] & (1 << (HUB_C_PORT_CONNECTION & 0x07)))
{ {
HubClearPortFeature(i, HUB_C_PORT_CONNECTION); // 清除移除变化标志 HubClearPortFeature(i, HUB_C_PORT_CONNECTION); // 清除移除变化标志
} }
} }
} }
return (ERR_SUCCESS); // 返回操作成功 return (ERR_SUCCESS); // 返回操作成功
} }
/********************************************************************* /*********************************************************************
* @fn EnumAllHubPort * @fn EnumAllHubPort
* *
* @brief 枚举所有ROOT-HUB端口下外部HUB后的二级USB设备 * @brief 枚举所有ROOT-HUB端口下外部HUB后的二级USB设备
* *
* @return 错误码 * @return 错误码
*/ */
uint8_t EnumAllHubPort(void) uint8_t EnumAllHubPort(void)
{ {
uint8_t s; uint8_t s;
if((ThisUsbDev.DeviceStatus >= ROOT_DEV_SUCCESS) && (ThisUsbDev.DeviceType == USB_DEV_CLASS_HUB)) // HUB枚举成功 if((ThisUsbDev.DeviceStatus >= ROOT_DEV_SUCCESS) && (ThisUsbDev.DeviceType == USB_DEV_CLASS_HUB)) // HUB枚举成功
{ {
SelectHubPort(0); // 选择操作指定的ROOT-HUB端口,设置当前USB速度以及被操作设备的USB地址 SelectHubPort(0); // 选择操作指定的ROOT-HUB端口,设置当前USB速度以及被操作设备的USB地址
s = EnumHubPort(); // 枚举指定ROOT-HUB端口上的外部HUB集线器的各个端口,检查各端口有无连接或移除事件 s = EnumHubPort(); // 枚举指定ROOT-HUB端口上的外部HUB集线器的各个端口,检查各端口有无连接或移除事件
if(s != ERR_SUCCESS) // 可能是HUB断开了 if(s != ERR_SUCCESS) // 可能是HUB断开了
{ {
PRINT("EnumAllHubPort err = %02X\n", (uint16_t)s); PRINT("EnumAllHubPort err = %02X\n", (uint16_t)s);
} }
SetUsbSpeed(1); // 默认为全速 SetUsbSpeed(1); // 默认为全速
} }
return (ERR_SUCCESS); return (ERR_SUCCESS);
} }
@@ -648,32 +648,32 @@ uint8_t EnumAllHubPort(void)
/********************************************************************* /*********************************************************************
* @fn SearchTypeDevice * @fn SearchTypeDevice
* *
* @brief 在ROOT-HUB以及外部HUB各端口上搜索指定类型的设备所在的端口号,输出端口号为0xFFFF则未搜索到. * @brief 在ROOT-HUB以及外部HUB各端口上搜索指定类型的设备所在的端口号,输出端口号为0xFFFF则未搜索到.
* 当然也可以根据USB的厂商VID产品PID进行搜索(事先要记录各设备的VID和PID),以及指定搜索序号 * 当然也可以根据USB的厂商VID产品PID进行搜索(事先要记录各设备的VID和PID),以及指定搜索序号
* *
* @param type - 搜索的设备类型 * @param type - 搜索的设备类型
* *
* @return 输出高8位为ROOT-HUB端口号,低8位为外部HUB的端口号,低8位为0则设备直接在ROOT-HUB端口上 * @return 输出高8位为ROOT-HUB端口号,低8位为外部HUB的端口号,低8位为0则设备直接在ROOT-HUB端口上
*/ */
uint16_t SearchTypeDevice(uint8_t type) uint16_t SearchTypeDevice(uint8_t type)
{ {
uint8_t RootHubIndex; //CH554只有一个USB口,RootHubIndex = 0,只需看返回值的低八位即可 uint8_t RootHubIndex; //CH554只有一个USB口,RootHubIndex = 0,只需看返回值的低八位即可
uint8_t HubPortIndex; uint8_t HubPortIndex;
RootHubIndex = 0; RootHubIndex = 0;
if((ThisUsbDev.DeviceType == USB_DEV_CLASS_HUB) && (ThisUsbDev.DeviceStatus >= ROOT_DEV_SUCCESS)) // 外部集线器HUB且枚举成功 if((ThisUsbDev.DeviceType == USB_DEV_CLASS_HUB) && (ThisUsbDev.DeviceStatus >= ROOT_DEV_SUCCESS)) // 外部集线器HUB且枚举成功
{ {
for(HubPortIndex = 1; HubPortIndex <= ThisUsbDev.GpHUBPortNum; HubPortIndex++) // 搜索外部HUB的各个端口 for(HubPortIndex = 1; HubPortIndex <= ThisUsbDev.GpHUBPortNum; HubPortIndex++) // 搜索外部HUB的各个端口
{ {
if(DevOnHubPort[HubPortIndex - 1].DeviceType == type && DevOnHubPort[HubPortIndex - 1].DeviceStatus >= ROOT_DEV_SUCCESS) if(DevOnHubPort[HubPortIndex - 1].DeviceType == type && DevOnHubPort[HubPortIndex - 1].DeviceStatus >= ROOT_DEV_SUCCESS)
{ {
return (((uint16_t)RootHubIndex << 8) | HubPortIndex); // 类型匹配且枚举成功 return (((uint16_t)RootHubIndex << 8) | HubPortIndex); // 类型匹配且枚举成功
} }
} }
} }
if((ThisUsbDev.DeviceType == type) && (ThisUsbDev.DeviceStatus >= ROOT_DEV_SUCCESS)) if((ThisUsbDev.DeviceType == type) && (ThisUsbDev.DeviceStatus >= ROOT_DEV_SUCCESS))
{ {
return ((uint16_t)RootHubIndex << 8); // 类型匹配且枚举成功,在ROOT-HUB端口上 return ((uint16_t)RootHubIndex << 8); // 类型匹配且枚举成功,在ROOT-HUB端口上
} }
return (0xFFFF); return (0xFFFF);
@@ -682,11 +682,11 @@ uint16_t SearchTypeDevice(uint8_t type)
/********************************************************************* /*********************************************************************
* @fn SETorOFFNumLock * @fn SETorOFFNumLock
* *
* @brief NumLock的点灯判断 * @brief NumLock的点灯判断
* *
* @param buf - 点灯键值 * @param buf - 点灯键值
* *
* @return 错误码 * @return 错误码
*/ */
uint8_t SETorOFFNumLock(uint8_t *buf) uint8_t SETorOFFNumLock(uint8_t *buf)
{ {
@@ -698,7 +698,7 @@ uint8_t SETorOFFNumLock(uint8_t *buf)
{ {
((uint8_t *)pSetupReq)[s] = tmp[s]; ((uint8_t *)pSetupReq)[s] = tmp[s];
} }
s = HostCtrlTransfer(Com_Buffer, &len); // 执行控制传输 s = HostCtrlTransfer(Com_Buffer, &len); // 执行控制传输
if(s != ERR_SUCCESS) if(s != ERR_SUCCESS)
{ {
return (s); return (s);
@@ -710,11 +710,11 @@ uint8_t SETorOFFNumLock(uint8_t *buf)
/********************************************************************* /*********************************************************************
* @fn CtrlGetHIDDeviceReport * @fn CtrlGetHIDDeviceReport
* *
* @brief 获取HID设备报表描述符,返回在TxBuffer中 * @brief 获取HID设备报表描述符,返回在TxBuffer中
* *
* @param none * @param none
* *
* @return 错误码 * @return 错误码
*/ */
uint8_t CtrlGetHIDDeviceReport(uint8_t infc) uint8_t CtrlGetHIDDeviceReport(uint8_t infc)
{ {
@@ -723,7 +723,7 @@ uint8_t CtrlGetHIDDeviceReport(uint8_t infc)
CopySetupReqPkg(SetupSetHIDIdle); CopySetupReqPkg(SetupSetHIDIdle);
pSetupReq->wIndex = infc; pSetupReq->wIndex = infc;
s = HostCtrlTransfer(Com_Buffer, &len); // 执行控制传输 s = HostCtrlTransfer(Com_Buffer, &len); // 执行控制传输
if(s != ERR_SUCCESS) if(s != ERR_SUCCESS)
{ {
return (s); return (s);
@@ -731,7 +731,7 @@ uint8_t CtrlGetHIDDeviceReport(uint8_t infc)
CopySetupReqPkg(SetupGetHIDDevReport); CopySetupReqPkg(SetupGetHIDDevReport);
pSetupReq->wIndex = infc; pSetupReq->wIndex = infc;
s = HostCtrlTransfer(Com_Buffer, &len); // 执行控制传输 s = HostCtrlTransfer(Com_Buffer, &len); // 执行控制传输
if(s != ERR_SUCCESS) if(s != ERR_SUCCESS)
{ {
return (s); return (s);
@@ -743,11 +743,11 @@ uint8_t CtrlGetHIDDeviceReport(uint8_t infc)
/********************************************************************* /*********************************************************************
* @fn CtrlGetHubDescr * @fn CtrlGetHubDescr
* *
* @brief 获取HUB描述符,返回在Com_Buffer中 * @brief 获取HUB描述符,返回在Com_Buffer中
* *
* @param none * @param none
* *
* @return 错误码 * @return 错误码
*/ */
uint8_t CtrlGetHubDescr(void) uint8_t CtrlGetHubDescr(void)
{ {
@@ -755,27 +755,27 @@ uint8_t CtrlGetHubDescr(void)
uint8_t len; uint8_t len;
CopySetupReqPkg(SetupGetHubDescr); CopySetupReqPkg(SetupGetHubDescr);
s = HostCtrlTransfer(Com_Buffer, &len); // 执行控制传输 s = HostCtrlTransfer(Com_Buffer, &len); // 执行控制传输
if(s != ERR_SUCCESS) if(s != ERR_SUCCESS)
{ {
return (s); return (s);
} }
if(len < ((PUSB_SETUP_REQ)SetupGetHubDescr)->wLength) if(len < ((PUSB_SETUP_REQ)SetupGetHubDescr)->wLength)
{ {
return (ERR_USB_BUF_OVER); // 描述符长度错误 return (ERR_USB_BUF_OVER); // 描述符长度错误
} }
// if ( len < 4 ) return( ERR_USB_BUF_OVER ); // 描述符长度错误 // if ( len < 4 ) return( ERR_USB_BUF_OVER ); // 描述符长度错误
return (ERR_SUCCESS); return (ERR_SUCCESS);
} }
/********************************************************************* /*********************************************************************
* @fn HubGetPortStatus * @fn HubGetPortStatus
* *
* @brief 查询HUB端口状态,返回在Com_Buffer中 * @brief 查询HUB端口状态,返回在Com_Buffer中
* *
* @param HubPortIndex - 端口号 * @param HubPortIndex - 端口号
* *
* @return 错误码 * @return 错误码
*/ */
uint8_t HubGetPortStatus(uint8_t HubPortIndex) uint8_t HubGetPortStatus(uint8_t HubPortIndex)
{ {
@@ -787,14 +787,14 @@ uint8_t HubGetPortStatus(uint8_t HubPortIndex)
pSetupReq->wValue = 0x0000; pSetupReq->wValue = 0x0000;
pSetupReq->wIndex = 0x0000 | HubPortIndex; pSetupReq->wIndex = 0x0000 | HubPortIndex;
pSetupReq->wLength = 0x0004; pSetupReq->wLength = 0x0004;
s = HostCtrlTransfer(Com_Buffer, &len); // 执行控制传输 s = HostCtrlTransfer(Com_Buffer, &len); // 执行控制传输
if(s != ERR_SUCCESS) if(s != ERR_SUCCESS)
{ {
return (s); return (s);
} }
if(len < 4) if(len < 4)
{ {
return (ERR_USB_BUF_OVER); // 描述符长度错误 return (ERR_USB_BUF_OVER); // 描述符长度错误
} }
return (ERR_SUCCESS); return (ERR_SUCCESS);
} }
@@ -802,12 +802,12 @@ uint8_t HubGetPortStatus(uint8_t HubPortIndex)
/********************************************************************* /*********************************************************************
* @fn HubSetPortFeature * @fn HubSetPortFeature
* *
* @brief 设置HUB端口特性 * @brief 设置HUB端口特性
* *
* @param HubPortIndex - 端口号 * @param HubPortIndex - 端口号
* @param FeatureSelt - 端口特性 * @param FeatureSelt - 端口特性
* *
* @return 错误码 * @return 错误码
*/ */
uint8_t HubSetPortFeature(uint8_t HubPortIndex, uint8_t FeatureSelt) uint8_t HubSetPortFeature(uint8_t HubPortIndex, uint8_t FeatureSelt)
{ {
@@ -816,18 +816,18 @@ uint8_t HubSetPortFeature(uint8_t HubPortIndex, uint8_t FeatureSelt)
pSetupReq->wValue = 0x0000 | FeatureSelt; pSetupReq->wValue = 0x0000 | FeatureSelt;
pSetupReq->wIndex = 0x0000 | HubPortIndex; pSetupReq->wIndex = 0x0000 | HubPortIndex;
pSetupReq->wLength = 0x0000; pSetupReq->wLength = 0x0000;
return (HostCtrlTransfer(NULL, NULL)); // 执行控制传输 return (HostCtrlTransfer(NULL, NULL)); // 执行控制传输
} }
/********************************************************************* /*********************************************************************
* @fn HubClearPortFeature * @fn HubClearPortFeature
* *
* @brief 清除HUB端口特性 * @brief 清除HUB端口特性
* *
* @param HubPortIndex - 端口号 * @param HubPortIndex - 端口号
* @param FeatureSelt - 端口特性 * @param FeatureSelt - 端口特性
* *
* @return 错误码 * @return 错误码
*/ */
uint8_t HubClearPortFeature(uint8_t HubPortIndex, uint8_t FeatureSelt) uint8_t HubClearPortFeature(uint8_t HubPortIndex, uint8_t FeatureSelt)
{ {
@@ -836,5 +836,5 @@ uint8_t HubClearPortFeature(uint8_t HubPortIndex, uint8_t FeatureSelt)
pSetupReq->wValue = 0x0000 | FeatureSelt; pSetupReq->wValue = 0x0000 | FeatureSelt;
pSetupReq->wIndex = 0x0000 | HubPortIndex; pSetupReq->wIndex = 0x0000 | HubPortIndex;
pSetupReq->wLength = 0x0000; pSetupReq->wLength = 0x0000;
return (HostCtrlTransfer(NULL, NULL)); // 执行控制传输 return (HostCtrlTransfer(NULL, NULL)); // 执行控制传输
} }
+71 -71
View File
@@ -24,23 +24,23 @@ extern "C" {
*/ */
typedef enum typedef enum
{ {
CH_EXTIN_0 = 0, // ADC 外部模拟通道 0 CH_EXTIN_0 = 0, // ADC 外部模拟通道 0
CH_EXTIN_1, // ADC 外部模拟通道 1 CH_EXTIN_1, // ADC 外部模拟通道 1
CH_EXTIN_2, // ADC 外部模拟通道 2 CH_EXTIN_2, // ADC 外部模拟通道 2
CH_EXTIN_3, // ADC 外部模拟通道 3 CH_EXTIN_3, // ADC 外部模拟通道 3
CH_EXTIN_4, // ADC 外部模拟通道 4 CH_EXTIN_4, // ADC 外部模拟通道 4
CH_EXTIN_5, // ADC 外部模拟通道 5 CH_EXTIN_5, // ADC 外部模拟通道 5
CH_EXTIN_6, // ADC 外部模拟通道 6 CH_EXTIN_6, // ADC 外部模拟通道 6
CH_EXTIN_7, // ADC 外部模拟通道 7 CH_EXTIN_7, // ADC 外部模拟通道 7
CH_EXTIN_8, // ADC 外部模拟通道 8 CH_EXTIN_8, // ADC 外部模拟通道 8
CH_EXTIN_9, // ADC 外部模拟通道 9 CH_EXTIN_9, // ADC 外部模拟通道 9
CH_EXTIN_10, // ADC 外部模拟通道 10 CH_EXTIN_10, // ADC 外部模拟通道 10
CH_EXTIN_11, // ADC 外部模拟通道 11 CH_EXTIN_11, // ADC 外部模拟通道 11
CH_EXTIN_12, // ADC 外部模拟通道 12 CH_EXTIN_12, // ADC 外部模拟通道 12
CH_EXTIN_13, // ADC 外部模拟通道 13 CH_EXTIN_13, // ADC 外部模拟通道 13
CH_INTE_VBAT = 14, // ADC 内部电池检测通道 CH_INTE_VBAT = 14, // ADC 内部电池检测通道
CH_INTE_VTEMP = 15, // ADC 内部温度传感器检测通道 CH_INTE_VTEMP = 15, // ADC 内部温度传感器检测通道
} ADC_SingleChannelTypeDef; } ADC_SingleChannelTypeDef;
@@ -49,8 +49,8 @@ typedef enum
*/ */
typedef enum typedef enum
{ {
CH_DIFF_0_2 = 0, // ADC 差分通道 #0-#2 CH_DIFF_0_2 = 0, // ADC 差分通道 #0-#2
CH_DIFF_1_3, // ADC 差分通道 #1-#3 CH_DIFF_1_3, // ADC 差分通道 #1-#3
} ADC_DiffChannelTypeDef; } ADC_DiffChannelTypeDef;
@@ -59,10 +59,10 @@ typedef enum
*/ */
typedef enum typedef enum
{ {
SampleFreq_3_2 = 0, // 3.2M 采样频率 SampleFreq_3_2 = 0, // 3.2M 采样频率
SampleFreq_8, // 8M 采样频率 SampleFreq_8, // 8M 采样频率
SampleFreq_5_33, // 5.33M 采样频率 SampleFreq_5_33, // 5.33M 采样频率
SampleFreq_4, // 4M 采样频率 SampleFreq_4, // 4M 采样频率
} ADC_SampClkTypeDef; } ADC_SampClkTypeDef;
/** /**
@@ -70,14 +70,14 @@ typedef enum
*/ */
typedef enum typedef enum
{ {
ADC_PGA_1_4 = 0, // -12dB, 1/4倍 ADC_PGA_1_4 = 0, // -12dB, 1/4倍
ADC_PGA_1_2, // -6dB, 1/2倍 ADC_PGA_1_2, // -6dB, 1/2倍
ADC_PGA_0, // 0dB, 1倍,无增益 ADC_PGA_0, // 0dB, 1倍,无增益
ADC_PGA_2, // 6dB, 2倍 ADC_PGA_2, // 6dB, 2倍
ADC_PGA_2_ = 0x10, // 6dB, 2倍 ADC_PGA_2_ = 0x10, // 6dB, 2倍
ADC_PGA_4, // 12dB, 4倍 ADC_PGA_4, // 12dB, 4倍
ADC_PGA_8, // 18dB, 8倍 ADC_PGA_8, // 18dB, 8倍
ADC_PGA_16, // 24dB, 16倍 ADC_PGA_16, // 24dB, 16倍
} ADC_SignalPGATypeDef; } ADC_SignalPGATypeDef;
/** /**
@@ -85,41 +85,41 @@ typedef enum
*/ */
typedef enum typedef enum
{ {
ADC_Mode_Single = 0, // 单次模式 ADC_Mode_Single = 0, // 单次模式
ADC_Mode_LOOP, // 循环模式 ADC_Mode_LOOP, // 循环模式
} ADC_DMAModeTypeDef; } ADC_DMAModeTypeDef;
/** /**
* @brief 设置 ADC 采样通道 * @brief 设置 ADC 采样通道
* *
* @param d - refer to ADC_SingleChannelTypeDef * @param d - refer to ADC_SingleChannelTypeDef
*/ */
#define ADC_ChannelCfg(d) (R8_ADC_CHANNEL = d) #define ADC_ChannelCfg(d) (R8_ADC_CHANNEL = d)
/** /**
* @brief 设置 ADC 采样时钟 * @brief 设置 ADC 采样时钟
* *
* @param d - refer to ADC_SampClkTypeDef * @param d - refer to ADC_SampClkTypeDef
*/ */
#define ADC_SampClkCfg(d) (R8_ADC_CFG = R8_ADC_CFG & (~RB_ADC_CLK_DIV) | (d << 6)) #define ADC_SampClkCfg(d) (R8_ADC_CFG = R8_ADC_CFG & (~RB_ADC_CLK_DIV) | (d << 6))
/** /**
* @brief 设置 ADC 信号增益 * @brief 设置 ADC 信号增益
* *
* @param d - refer to ADC_SignalPGATypeDef * @param d - refer to ADC_SignalPGATypeDef
*/ */
#define ADC_PGACfg(d) (R8_ADC_CFG = R8_ADC_CFG & (~RB_ADC_PGA_GAIN) | (d << 4)) #define ADC_PGACfg(d) (R8_ADC_CFG = R8_ADC_CFG & (~RB_ADC_PGA_GAIN) | (d << 4))
/** /**
* @brief 设置内部温度传感器校准值 * @brief 设置内部温度传感器校准值
* *
* @param d - 校准值 * @param d - 校准值
*/ */
#define ADC_TempCalibCfg(d) (R8_TEM_SENSOR = R8_TEM_SENSOR & (~RB_TEM_SEN_CALIB) | d) #define ADC_TempCalibCfg(d) (R8_TEM_SENSOR = R8_TEM_SENSOR & (~RB_TEM_SEN_CALIB) | d)
/** /**
* @brief 外部信号单通道采样初始化 * @brief 外部信号单通道采样初始化
* *
* @param sp - refer to ADC_SampClkTypeDef * @param sp - refer to ADC_SampClkTypeDef
* @param ga - refer to ADC_SignalPGATypeDef * @param ga - refer to ADC_SignalPGATypeDef
@@ -127,7 +127,7 @@ typedef enum
void ADC_ExtSingleChSampInit(ADC_SampClkTypeDef sp, ADC_SignalPGATypeDef ga); void ADC_ExtSingleChSampInit(ADC_SampClkTypeDef sp, ADC_SignalPGATypeDef ga);
/** /**
* @brief 外部信号差分通道采样初始化 * @brief 外部信号差分通道采样初始化
* *
* @param sp - refer to ADC_SampClkTypeDef * @param sp - refer to ADC_SampClkTypeDef
* @param ga - refer to ADC_SignalPGATypeDef * @param ga - refer to ADC_SignalPGATypeDef
@@ -135,68 +135,68 @@ void ADC_ExtSingleChSampInit(ADC_SampClkTypeDef sp, ADC_SignalPGATypeDef ga);
void ADC_ExtDiffChSampInit(ADC_SampClkTypeDef sp, ADC_SignalPGATypeDef ga); void ADC_ExtDiffChSampInit(ADC_SampClkTypeDef sp, ADC_SignalPGATypeDef ga);
/** /**
* @brief 触摸按键通道采样初始化 * @brief 触摸按键通道采样初始化
*/ */
void TouchKey_ChSampInit(void); void TouchKey_ChSampInit(void);
/** /**
* @brief 关闭TouchKey电源 * @brief 关闭TouchKey电源
*/ */
#define TouchKey_DisableTSPower() (R8_TKEY_CFG &= ~RB_TKEY_PWR_ON) #define TouchKey_DisableTSPower() (R8_TKEY_CFG &= ~RB_TKEY_PWR_ON)
/** /**
* @brief 内置温度传感器采样初始化 * @brief 内置温度传感器采样初始化
*/ */
void ADC_InterTSSampInit(void); void ADC_InterTSSampInit(void);
/** /**
* @brief 关闭温度传感器电源 * @brief 关闭温度传感器电源
*/ */
#define ADC_DisableTSPower() (R8_TEM_SENSOR = 0) #define ADC_DisableTSPower() (R8_TEM_SENSOR = 0)
/** /**
* @brief 内置电池电压采样初始化 * @brief 内置电池电压采样初始化
*/ */
void ADC_InterBATSampInit(void); void ADC_InterBATSampInit(void);
/** /**
* @brief ADC执行单次转换 * @brief ADC执行单次转换
* *
* @return ADC转换后的数据 * @return ADC转换后的数据
*/ */
uint16_t ADC_ExcutSingleConver(void); uint16_t ADC_ExcutSingleConver(void);
/** /**
* @brief 采样数据粗调,获取偏差值,必须先配置ADC后调用此函数获取校准值 * @brief 采样数据粗调,获取偏差值,必须先配置ADC后调用此函数获取校准值
* *
* @return 偏差 * @return 偏差
*/ */
signed short ADC_DataCalib_Rough(void); signed short ADC_DataCalib_Rough(void);
/** /**
* @brief TouchKey转换后数据 * @brief TouchKey转换后数据
* *
* @param charg - Touchkey充电时间,5bits有效, t=charg*Tadc * @param charg - Touchkey充电时间,5bits有效, t=charg*Tadc
* @param disch - Touchkey放电时间,3bits有效, t=disch*Tadc * @param disch - Touchkey放电时间,3bits有效, t=disch*Tadc
* *
* @return 当前TouchKey等效数据 * @return 当前TouchKey等效数据
*/ */
uint16_t TouchKey_ExcutSingleConver(uint8_t charg, uint8_t disch); uint16_t TouchKey_ExcutSingleConver(uint8_t charg, uint8_t disch);
/** /**
* @brief 设置连续 ADC的周期 * @brief 设置连续 ADC的周期
* *
* @param cycle - 单位为 16个系统时钟 * @param cycle - 单位为 16个系统时钟
*/ */
void ADC_AutoConverCycle(uint8_t cycle); void ADC_AutoConverCycle(uint8_t cycle);
/** /**
* @brief 配置DMA功能 * @brief 配置DMA功能
* *
* @param s - 是否打开DMA功能 * @param s - 是否打开DMA功能
* @param startAddr - DMA 起始地址 * @param startAddr - DMA 起始地址
* @param endAddr - DMA 结束地址 * @param endAddr - DMA 结束地址
* @param m - 配置DMA模式 * @param m - 配置DMA模式
*/ */
void ADC_DMACfg(uint8_t s, uint32_t startAddr, uint32_t endAddr, ADC_DMAModeTypeDef m); void ADC_DMACfg(uint8_t s, uint32_t startAddr, uint32_t endAddr, ADC_DMAModeTypeDef m);
@@ -210,59 +210,59 @@ void ADC_DMACfg(uint8_t s, uint32_t startAddr, uint32_t endAddr, ADC_DMAModeType
int adc_to_temperature_celsius(uint16_t adc_val); int adc_to_temperature_celsius(uint16_t adc_val);
/** /**
* @brief 获取ADC转换值 * @brief 获取ADC转换值
* *
* @return ADC转换值 * @return ADC转换值
*/ */
#define ADC_ReadConverValue() (R16_ADC_DATA) #define ADC_ReadConverValue() (R16_ADC_DATA)
/** /**
* @brief ADC执行单次转换 * @brief ADC执行单次转换
*/ */
#define ADC_StartUp() (R8_ADC_CONVERT |= RB_ADC_START) #define ADC_StartUp() (R8_ADC_CONVERT |= RB_ADC_START)
/** /**
* @brief 获取ADC中断状态 * @brief 获取ADC中断状态
*/ */
#define ADC_GetITStatus() (R8_ADC_INT_FLAG & RB_ADC_IF_EOC) #define ADC_GetITStatus() (R8_ADC_INT_FLAG & RB_ADC_IF_EOC)
/** /**
* @brief 清除ADC中断标志 * @brief 清除ADC中断标志
*/ */
#define ADC_ClearITFlag() (R8_ADC_CONVERT = R8_ADC_CONVERT) #define ADC_ClearITFlag() (R8_ADC_CONVERT = R8_ADC_CONVERT)
/** /**
* @brief 获取ADC DMA完成状态 * @brief 获取ADC DMA完成状态
*/ */
#define ADC_GetDMAStatus() (R8_ADC_DMA_IF & RB_ADC_IF_DMA_END) #define ADC_GetDMAStatus() (R8_ADC_DMA_IF & RB_ADC_IF_DMA_END)
/** /**
* @brief 清除ADC DMA完成标志 * @brief 清除ADC DMA完成标志
*/ */
#define ADC_ClearDMAFlag() (R8_ADC_DMA_IF |= RB_ADC_IF_DMA_END) #define ADC_ClearDMAFlag() (R8_ADC_DMA_IF |= RB_ADC_IF_DMA_END)
/** /**
* @brief 开启定时间隔自动连续 ADC * @brief 开启定时间隔自动连续 ADC
*/ */
#define ADC_StartAutoDMA() (R8_ADC_CTRL_DMA |= RB_ADC_AUTO_EN) #define ADC_StartAutoDMA() (R8_ADC_CTRL_DMA |= RB_ADC_AUTO_EN)
/** /**
* @brief 停止定时间隔自动连续 ADC * @brief 停止定时间隔自动连续 ADC
*/ */
#define ADC_StopAutoDMA() (R8_ADC_CTRL_DMA &= ~RB_ADC_AUTO_EN) #define ADC_StopAutoDMA() (R8_ADC_CTRL_DMA &= ~RB_ADC_AUTO_EN)
/** /**
* @brief 开启连续转换 ADC * @brief 开启连续转换 ADC
*/ */
#define ADC_StartContDMA() (R8_ADC_CTRL_DMA |= RB_ADC_CONT_EN) #define ADC_StartContDMA() (R8_ADC_CTRL_DMA |= RB_ADC_CONT_EN)
/** /**
* @brief 停止连续转换 ADC * @brief 停止连续转换 ADC
*/ */
#define ADC_StopContDMA() (R8_ADC_CTRL_DMA &= ~RB_ADC_CONT_EN) #define ADC_StopContDMA() (R8_ADC_CTRL_DMA &= ~RB_ADC_CONT_EN)
/** /**
* @brief 关闭ADC电源 * @brief 关闭ADC电源
*/ */
#define ADC_DisablePower() (R8_ADC_CFG &= ~RB_ADC_POWER_ON) #define ADC_DisablePower() (R8_ADC_CFG &= ~RB_ADC_POWER_ON)
+56 -56
View File
@@ -18,7 +18,7 @@ extern "C" {
#endif #endif
/** /**
* @brief 系统主频定义 * @brief 系统主频定义
*/ */
typedef enum typedef enum
{ {
@@ -37,7 +37,7 @@ typedef enum
} SYS_CLKTypeDef; } SYS_CLKTypeDef;
/** /**
* @brief 32K时钟选择 * @brief 32K时钟选择
*/ */
typedef enum typedef enum
{ {
@@ -47,7 +47,7 @@ typedef enum
} LClk32KTypeDef; } LClk32KTypeDef;
/** /**
* @brief 32M晶振电流挡位 * @brief 32M晶振电流挡位
*/ */
typedef enum typedef enum
{ {
@@ -59,7 +59,7 @@ typedef enum
} HSECurrentTypeDef; } HSECurrentTypeDef;
/** /**
* @brief 32M晶振内部电容挡位 * @brief 32M晶振内部电容挡位
*/ */
typedef enum typedef enum
{ {
@@ -75,7 +75,7 @@ typedef enum
} HSECapTypeDef; } HSECapTypeDef;
/** /**
* @brief 32K晶振电流挡位 * @brief 32K晶振电流挡位
*/ */
typedef enum typedef enum
{ {
@@ -87,11 +87,11 @@ typedef enum
} LSECurrentTypeDef; } LSECurrentTypeDef;
/** /**
* @brief 32K晶振内部电容挡位 * @brief 32K晶振内部电容挡位
*/ */
typedef enum typedef enum
{ {
LSECap_2p = 0, // 定义保留,实际上为12p LSECap_2p = 0, // 定义保留,实际上为12p
LSECap_12p = 0, LSECap_12p = 0,
LSECap_13p, LSECap_13p,
LSECap_14p, LSECap_14p,
@@ -127,14 +127,14 @@ typedef enum
*/ */
typedef enum typedef enum
{ {
Period_0_125_S = 0, // 0.125s 周期 Period_0_125_S = 0, // 0.125s 周期
Period_0_25_S, // 0.25s 周期 Period_0_25_S, // 0.25s 周期
Period_0_5_S, // 0.5s 周期 Period_0_5_S, // 0.5s 周期
Period_1_S, // 1s 周期 Period_1_S, // 1s 周期
Period_2_S, // 2s 周期 Period_2_S, // 2s 周期
Period_4_S, // 4s 周期 Period_4_S, // 4s 周期
Period_8_S, // 8s 周期 Period_8_S, // 8s 周期
Period_16_S, // 16s 周期 Period_16_S, // 16s 周期
} RTC_TMRCycTypeDef; } RTC_TMRCycTypeDef;
/** /**
@@ -142,8 +142,8 @@ typedef enum
*/ */
typedef enum typedef enum
{ {
RTC_TRIG_EVENT = 0, // RTC 触发事件 RTC_TRIG_EVENT = 0, // RTC 触发事件
RTC_TMR_EVENT, // RTC 周期定时事件 RTC_TMR_EVENT, // RTC 周期定时事件
} RTC_EVENTTypeDef; } RTC_EVENTTypeDef;
@@ -152,134 +152,134 @@ typedef enum
*/ */
typedef enum typedef enum
{ {
RTC_TRIG_MODE = 0, // RTC 触发模式 RTC_TRIG_MODE = 0, // RTC 触发模式
RTC_TMR_MODE, // RTC 周期定时模式 RTC_TMR_MODE, // RTC 周期定时模式
} RTC_MODETypeDef; } RTC_MODETypeDef;
typedef enum typedef enum
{ {
/* 校准精度越高,耗时越长 */ /* 校准精度越高,耗时越长 */
Level_32 = 3, // 用时 1.2ms 1000ppm (32M 主频) 1100ppm (60M 主频) Level_32 = 3, // 用时 1.2ms 1000ppm (32M 主频) 1100ppm (60M 主频)
Level_64, // 用时 2.2ms 800ppm (32M 主频) 1000ppm (60M 主频) Level_64, // 用时 2.2ms 800ppm (32M 主频) 1000ppm (60M 主频)
Level_128, // 用时 4.2ms 600ppm (32M 主频) 800ppm (60M 主频) Level_128, // 用时 4.2ms 600ppm (32M 主频) 800ppm (60M 主频)
} Cali_LevelTypeDef; } Cali_LevelTypeDef;
/** /**
* @brief 32K 低频时钟来源 * @brief 32K 低频时钟来源
* *
* @param hc - 选择32K使用内部还是外部 * @param hc - 选择32K使用内部还是外部
*/ */
void LClk32K_Select(LClk32KTypeDef hc); void LClk32K_Select(LClk32KTypeDef hc);
/** /**
* @brief HSE晶体 偏置电流配置 * @brief HSE晶体 偏置电流配置
* *
* @param c - 75%,100%,125%,150% * @param c - 75%,100%,125%,150%
*/ */
void HSECFG_Current(HSECurrentTypeDef c); void HSECFG_Current(HSECurrentTypeDef c);
/** /**
* @brief HSE晶体 负载电容配置 * @brief HSE晶体 负载电容配置
* *
* @param c - refer to HSECapTypeDef * @param c - refer to HSECapTypeDef
*/ */
void HSECFG_Capacitance(HSECapTypeDef c); void HSECFG_Capacitance(HSECapTypeDef c);
/** /**
* @brief LSE晶体 偏置电流配置 * @brief LSE晶体 偏置电流配置
* *
* @param c - 70%,100%,140%,200% * @param c - 70%,100%,140%,200%
*/ */
void LSECFG_Current(LSECurrentTypeDef c); void LSECFG_Current(LSECurrentTypeDef c);
/** /**
* @brief LSE晶体 负载电容配置 * @brief LSE晶体 负载电容配置
* *
* @param c - refer to LSECapTypeDef * @param c - refer to LSECapTypeDef
*/ */
void LSECFG_Capacitance(LSECapTypeDef c); void LSECFG_Capacitance(LSECapTypeDef c);
void Calibration_LSI(Cali_LevelTypeDef cali_Lv); /* 用主频校准内部32K时钟 */ void Calibration_LSI(Cali_LevelTypeDef cali_Lv); /* 用主频校准内部32K时钟 */
/** /**
* @brief RTC时钟初始化当前时间 * @brief RTC时钟初始化当前时间
* *
* @param y - 配置年,MAX_Y = BEGYEAR + 44 * @param y - 配置年,MAX_Y = BEGYEAR + 44
* @param mon - 配置月,MAX_MON = 12 * @param mon - 配置月,MAX_MON = 12
* @param d - 配置日,MAX_D = 31 * @param d - 配置日,MAX_D = 31
* @param h - 配置小时,MAX_H = 23 * @param h - 配置小时,MAX_H = 23
* @param m - 配置分钟,MAX_M = 59 * @param m - 配置分钟,MAX_M = 59
* @param s - 配置秒,MAX_S = 59 * @param s - 配置秒,MAX_S = 59
*/ */
void RTC_InitTime(uint16_t y, uint16_t mon, uint16_t d, uint16_t h, uint16_t m, uint16_t s); void RTC_InitTime(uint16_t y, uint16_t mon, uint16_t d, uint16_t h, uint16_t m, uint16_t s);
/** /**
* @brief 获取当前时间 * @brief 获取当前时间
* *
* @param py - 获取到的年,MAX_Y = BEGYEAR + 44 * @param py - 获取到的年,MAX_Y = BEGYEAR + 44
* @param pmon - 获取到的月,MAX_MON = 12 * @param pmon - 获取到的月,MAX_MON = 12
* @param pd - 获取到的日,MAX_D = 31 * @param pd - 获取到的日,MAX_D = 31
* @param ph - 获取到的小时,MAX_H = 23 * @param ph - 获取到的小时,MAX_H = 23
* @param pm - 获取到的分钟,MAX_M = 59 * @param pm - 获取到的分钟,MAX_M = 59
* @param ps - 获取到的秒,MAX_S = 59 * @param ps - 获取到的秒,MAX_S = 59
*/ */
void RTC_GetTime(uint16_t *py, uint16_t *pmon, uint16_t *pd, uint16_t *ph, uint16_t *pm, uint16_t *ps); void RTC_GetTime(uint16_t *py, uint16_t *pmon, uint16_t *pd, uint16_t *ph, uint16_t *pm, uint16_t *ps);
/** /**
* @brief 基于LSE/LSI时钟,配置当前RTC 周期数 * @brief 基于LSE/LSI时钟,配置当前RTC 周期数
* *
* @param cyc - 配置周期计数初值,MAX_CYC = 0xA8BFFFFF = 2831155199 * @param cyc - 配置周期计数初值,MAX_CYC = 0xA8BFFFFF = 2831155199
*/ */
void RTC_SetCycle32k(uint32_t cyc); void RTC_SetCycle32k(uint32_t cyc);
/** /**
* @brief 基于LSE/LSI时钟,获取当前RTC 周期数 * @brief 基于LSE/LSI时钟,获取当前RTC 周期数
* *
* @return 当前周期数,MAX_CYC = 0xA8BFFFFF = 2831155199 * @return 当前周期数,MAX_CYC = 0xA8BFFFFF = 2831155199
*/ */
uint32_t RTC_GetCycle32k(void); uint32_t RTC_GetCycle32k(void);
/** /**
* @brief RTC定时模式配置(注意定时基准固定为32768Hz) * @brief RTC定时模式配置(注意定时基准固定为32768Hz)
* *
* @param t - refer to RTC_TMRCycTypeDef * @param t - refer to RTC_TMRCycTypeDef
*/ */
void RTC_TRIGFunCfg(uint32_t cyc); void RTC_TRIGFunCfg(uint32_t cyc);
/** /**
* @brief RTC定时模式配置(注意定时基准固定为32768Hz) * @brief RTC定时模式配置(注意定时基准固定为32768Hz)
* *
* @param t - refer to RTC_TMRCycTypeDef * @param t - refer to RTC_TMRCycTypeDef
*/ */
void RTC_TMRFunCfg(RTC_TMRCycTypeDef t); void RTC_TMRFunCfg(RTC_TMRCycTypeDef t);
/** /**
* @brief RTC 模式功能关闭 * @brief RTC 模式功能关闭
* *
* @param m - 需要关闭的当前模式 * @param m - 需要关闭的当前模式
*/ */
void RTC_ModeFunDisable(RTC_MODETypeDef m); void RTC_ModeFunDisable(RTC_MODETypeDef m);
/** /**
* @brief 获取RTC中断标志 * @brief 获取RTC中断标志
* *
* @param f - refer to RTC_EVENTTypeDef * @param f - refer to RTC_EVENTTypeDef
* *
* @return 中断标志状态 * @return 中断标志状态
*/ */
uint8_t RTC_GetITFlag(RTC_EVENTTypeDef f); uint8_t RTC_GetITFlag(RTC_EVENTTypeDef f);
/** /**
* @brief 清除RTC中断标志 * @brief 清除RTC中断标志
* *
* @param f - refer to RTC_EVENTTypeDef * @param f - refer to RTC_EVENTTypeDef
*/ */
void RTC_ClearITFlag(RTC_EVENTTypeDef f); void RTC_ClearITFlag(RTC_EVENTTypeDef f);
/** /**
* @brief 32K 低频时钟电源配置 * @brief 32K 低频时钟电源配置
*/ */
void LClk32K_Cfg(LClk32KTypeDef hc, FunctionalState s); void LClk32K_Cfg(LClk32KTypeDef hc, FunctionalState s);
+2 -2
View File
@@ -46,7 +46,7 @@
#endif #endif
/** /**
* @brief 系统主频时钟(Hz * @brief 系统主频时钟(Hz
*/ */
#ifndef FREQ_SYS #ifndef FREQ_SYS
#define FREQ_SYS 60000000 #define FREQ_SYS 60000000
@@ -57,7 +57,7 @@
#endif #endif
/** /**
* @brief 32K时钟(Hz * @brief 32K时钟(Hz
*/ */
#ifdef CLK_OSC32K #ifdef CLK_OSC32K
#if ( CLK_OSC32K == 1 ) #if ( CLK_OSC32K == 1 )
+1 -1
View File
@@ -18,7 +18,7 @@ extern "C" {
#endif #endif
/** /**
* @brief ¶ÁÈ¡Flash-ROM * @brief 读取Flash-ROM
* *
* @param StartAddr - read address * @param StartAddr - read address
* @param Buffer - read buffer * @param Buffer - read buffer
+47 -47
View File
@@ -51,11 +51,11 @@ extern "C" {
*/ */
typedef enum typedef enum
{ {
GPIO_ModeIN_Floating, //浮空输入 GPIO_ModeIN_Floating, //浮空输入
GPIO_ModeIN_PU, //上拉输入 GPIO_ModeIN_PU, //上拉输入
GPIO_ModeIN_PD, //下拉输入 GPIO_ModeIN_PD, //下拉输入
GPIO_ModeOut_PP_5mA, //推挽输出最大5mA GPIO_ModeOut_PP_5mA, //推挽输出最大5mA
GPIO_ModeOut_PP_20mA, //推挽输出最大20mA GPIO_ModeOut_PP_20mA, //推挽输出最大20mA
} GPIOModeTypeDef; } GPIOModeTypeDef;
@@ -64,169 +64,169 @@ typedef enum
*/ */
typedef enum typedef enum
{ {
GPIO_ITMode_LowLevel, //低电平触发 GPIO_ITMode_LowLevel, //低电平触发
GPIO_ITMode_HighLevel, //高电平触发 GPIO_ITMode_HighLevel, //高电平触发
GPIO_ITMode_FallEdge, //下降沿触发 GPIO_ITMode_FallEdge, //下降沿触发
GPIO_ITMode_RiseEdge, //上升沿触发 GPIO_ITMode_RiseEdge, //上升沿触发
} GPIOITModeTpDef; } GPIOITModeTpDef;
/** /**
* @brief GPIOA端口引脚模式配置 * @brief GPIOA端口引脚模式配置
* *
* @param pin - PA0-PA15 * @param pin - PA0-PA15
* @param mode - 输入输出类型 * @param mode - 输入输出类型
*/ */
void GPIOA_ModeCfg(uint32_t pin, GPIOModeTypeDef mode); void GPIOA_ModeCfg(uint32_t pin, GPIOModeTypeDef mode);
/** /**
* @brief GPIOB端口引脚模式配置 * @brief GPIOB端口引脚模式配置
* *
* @param pin - PB0-PB23 * @param pin - PB0-PB23
* @param mode - 输入输出类型 * @param mode - 输入输出类型
*/ */
void GPIOB_ModeCfg(uint32_t pin, GPIOModeTypeDef mode); void GPIOB_ModeCfg(uint32_t pin, GPIOModeTypeDef mode);
/** /**
* @brief GPIOA端口引脚输出置低 * @brief GPIOA端口引脚输出置低
* *
* @param pin - PA0-PA15 * @param pin - PA0-PA15
*/ */
#define GPIOA_ResetBits(pin) (R32_PA_CLR |= pin) #define GPIOA_ResetBits(pin) (R32_PA_CLR |= pin)
/** /**
* @brief GPIOA端口引脚输出置高 * @brief GPIOA端口引脚输出置高
* *
* @param pin - PA0-PA15 * @param pin - PA0-PA15
*/ */
#define GPIOA_SetBits(pin) (R32_PA_OUT |= pin) #define GPIOA_SetBits(pin) (R32_PA_OUT |= pin)
/** /**
* @brief GPIOB端口引脚输出置低 * @brief GPIOB端口引脚输出置低
* *
* @param pin - PB0-PB23 * @param pin - PB0-PB23
*/ */
#define GPIOB_ResetBits(pin) (R32_PB_CLR |= pin) #define GPIOB_ResetBits(pin) (R32_PB_CLR |= pin)
/** /**
* @brief GPIOB端口引脚输出置高 * @brief GPIOB端口引脚输出置高
* *
* @param pin - PB0-PB23 * @param pin - PB0-PB23
*/ */
#define GPIOB_SetBits(pin) (R32_PB_OUT |= pin) #define GPIOB_SetBits(pin) (R32_PB_OUT |= pin)
/** /**
* @brief GPIOA端口引脚输出电平翻转 * @brief GPIOA端口引脚输出电平翻转
* *
* @param pin - PA0-PA15 * @param pin - PA0-PA15
*/ */
#define GPIOA_InverseBits(pin) (R32_PA_OUT ^= pin) #define GPIOA_InverseBits(pin) (R32_PA_OUT ^= pin)
/** /**
* @brief GPIOB端口引脚输出电平翻转 * @brief GPIOB端口引脚输出电平翻转
* *
* @param pin - PB0-PB23 * @param pin - PB0-PB23
*/ */
#define GPIOB_InverseBits(pin) (R32_PB_OUT ^= pin) #define GPIOB_InverseBits(pin) (R32_PB_OUT ^= pin)
/** /**
* @brief GPIOA端口32位数据返回,低16位有效 * @brief GPIOA端口32位数据返回,低16位有效
* *
* @return GPIOA端口32位数据 * @return GPIOA端口32位数据
*/ */
#define GPIOA_ReadPort() (R32_PA_PIN) #define GPIOA_ReadPort() (R32_PA_PIN)
/** /**
* @brief GPIOB端口32位数据返回,低24位有效 * @brief GPIOB端口32位数据返回,低24位有效
* *
* @return GPIOB端口32位数据 * @return GPIOB端口32位数据
*/ */
#define GPIOB_ReadPort() (R32_PB_PIN) #define GPIOB_ReadPort() (R32_PB_PIN)
/** /**
* @brief GPIOA端口引脚状态,0-引脚低电平,(!0)-引脚高电平 * @brief GPIOA端口引脚状态,0-引脚低电平,(!0)-引脚高电平
* *
* @param pin - PA0-PA15 * @param pin - PA0-PA15
* *
* @return GPIOA端口引脚状态 * @return GPIOA端口引脚状态
*/ */
#define GPIOA_ReadPortPin(pin) (R32_PA_PIN & (pin)) #define GPIOA_ReadPortPin(pin) (R32_PA_PIN & (pin))
/** /**
* @brief GPIOB端口引脚状态,0-引脚低电平,(!0)-引脚高电平 * @brief GPIOB端口引脚状态,0-引脚低电平,(!0)-引脚高电平
* *
* @param pin - PB0-PB23 * @param pin - PB0-PB23
* *
* @return GPIOB端口引脚状态 * @return GPIOB端口引脚状态
*/ */
#define GPIOB_ReadPortPin(pin) (R32_PB_PIN & (pin)) #define GPIOB_ReadPortPin(pin) (R32_PB_PIN & (pin))
/** /**
* @brief GPIOA引脚中断模式配置 * @brief GPIOA引脚中断模式配置
* *
* @param pin - PA0-PA15 * @param pin - PA0-PA15
* @param mode - 触发类型 * @param mode - 触发类型
*/ */
void GPIOA_ITModeCfg(uint32_t pin, GPIOITModeTpDef mode); void GPIOA_ITModeCfg(uint32_t pin, GPIOITModeTpDef mode);
/** /**
* @brief GPIOB引脚中断模式配置 * @brief GPIOB引脚中断模式配置
* *
* @param pin - PB0-PB23 * @param pin - PB0-PB23
* @param mode - 触发类型 * @param mode - 触发类型
*/ */
void GPIOB_ITModeCfg(uint32_t pin, GPIOITModeTpDef mode); void GPIOB_ITModeCfg(uint32_t pin, GPIOITModeTpDef mode);
/** /**
* @brief 读取GPIOA端口中断标志状态 * @brief 读取GPIOA端口中断标志状态
* *
* @return GPIOA端口中断标志状态 * @return GPIOA端口中断标志状态
*/ */
#define GPIOA_ReadITFlagPort() (R16_PA_INT_IF) #define GPIOA_ReadITFlagPort() (R16_PA_INT_IF)
/** /**
* @brief 读取GPIOB端口中断标志状态 * @brief 读取GPIOB端口中断标志状态
* *
* @return GPIOB端口中断标志状态 * @return GPIOB端口中断标志状态
*/ */
#define GPIOB_ReadITFlagPort() ((R16_PB_INT_IF & (~((GPIO_Pin_22 | GPIO_Pin_23) >> 14))) | ((R16_PB_INT_IF << 14) & (GPIO_Pin_22 | GPIO_Pin_23))) #define GPIOB_ReadITFlagPort() ((R16_PB_INT_IF & (~((GPIO_Pin_22 | GPIO_Pin_23) >> 14))) | ((R16_PB_INT_IF << 14) & (GPIO_Pin_22 | GPIO_Pin_23)))
/** /**
* @brief 读取GPIOA端口引脚中断标志状态 * @brief 读取GPIOA端口引脚中断标志状态
* *
* @param pin - PA0-PA15 * @param pin - PA0-PA15
* *
* @return GPIOA端口引脚中断标志状态 * @return GPIOA端口引脚中断标志状态
*/ */
#define GPIOA_ReadITFlagBit(pin) (R16_PA_INT_IF & (pin)) #define GPIOA_ReadITFlagBit(pin) (R16_PA_INT_IF & (pin))
/** /**
* @brief 读取GPIOB端口引脚中断标志状态 * @brief 读取GPIOB端口引脚中断标志状态
* *
* @param pin - PB0-PB23 * @param pin - PB0-PB23
* *
* @return GPIOB端口引脚中断标志状态 * @return GPIOB端口引脚中断标志状态
*/ */
#define GPIOB_ReadITFlagBit(pin) (R16_PB_INT_IF & ((pin) | (((pin) & (GPIO_Pin_22 | GPIO_Pin_23)) >> 14))) #define GPIOB_ReadITFlagBit(pin) (R16_PB_INT_IF & ((pin) | (((pin) & (GPIO_Pin_22 | GPIO_Pin_23)) >> 14)))
/** /**
* @brief 清除GPIOA端口引脚中断标志状态 * @brief 清除GPIOA端口引脚中断标志状态
* *
* @param pin - PA0-PA15 * @param pin - PA0-PA15
*/ */
#define GPIOA_ClearITFlagBit(pin) (R16_PA_INT_IF = pin) #define GPIOA_ClearITFlagBit(pin) (R16_PA_INT_IF = pin)
/** /**
* @brief 清除GPIOB端口引脚中断标志状态 * @brief 清除GPIOB端口引脚中断标志状态
* *
* @param pin - PB0-PB23 * @param pin - PB0-PB23
*/ */
#define GPIOB_ClearITFlagBit(pin) (R16_PB_INT_IF = ((pin) | (((pin) & (GPIO_Pin_22 | GPIO_Pin_23)) >> 14))) #define GPIOB_ClearITFlagBit(pin) (R16_PB_INT_IF = ((pin) | (((pin) & (GPIO_Pin_22 | GPIO_Pin_23)) >> 14)))
/** /**
* @brief 外设功能引脚映射 * @brief 外设功能引脚映射
* *
* @param s - 是否使能映射 * @param s - 是否使能映射
* @param perph - RB_RF_ANT_SW_EN - RF antenna switch control output on PB16/PB17/PB18/PB19/PB20/PB21 * @param perph - RB_RF_ANT_SW_EN - RF antenna switch control output on PB16/PB17/PB18/PB19/PB20/PB21
* RB_PIN_U0_INV - RXD0/RXD0_/TXD0/TXD0_ invert input/output * RB_PIN_U0_INV - RXD0/RXD0_/TXD0/TXD0_ invert input/output
* RB_PIN_INTX - INTX: INT24/INT25 PB8/PB9 -> INT24_/INT25_ PB22/PB23 * RB_PIN_INTX - INTX: INT24/INT25 PB8/PB9 -> INT24_/INT25_ PB22/PB23
@@ -246,11 +246,11 @@ void GPIOB_ITModeCfg(uint32_t pin, GPIOITModeTpDef mode);
void GPIOPinRemap(FunctionalState s, uint16_t perph); void GPIOPinRemap(FunctionalState s, uint16_t perph);
/** /**
* @brief 模拟外设GPIO引脚功能控制 * @brief 模拟外设GPIO引脚功能控制
* *
* @param s - 是否启用模拟外设功能 * @param s - 是否启用模拟外设功能
* @param perph - RB_PIN_USB_DP_PU - USB UD+引脚内部上拉电阻 * @param perph - RB_PIN_USB_DP_PU - USB UD+引脚内部上拉电阻
* RB_PIN_USB_IE - USB 引脚 * RB_PIN_USB_IE - USB 引脚
*/ */
void GPIOAGPPCfg(FunctionalState s, uint16_t perph); void GPIOAGPPCfg(FunctionalState s, uint16_t perph);
+26 -26
View File
@@ -25,8 +25,8 @@
*/ */
typedef enum typedef enum
{ {
LCD_PS_3V3 = 0, // 3.3V 驱动 LCD_PS_3V3 = 0, // 3.3V 驱动
LCD_PS_2V5, // 2.5V 驱动 LCD_PS_2V5, // 2.5V 驱动
}LCDDrvPowerTypeDef; }LCDDrvPowerTypeDef;
/** /**
@@ -34,8 +34,8 @@ typedef enum
*/ */
typedef enum typedef enum
{ {
LCD_1_2_Bias = 0, // 2级分压 LCD_1_2_Bias = 0, // 2级分压
LCD_1_3_Bias, // 3级分压 LCD_1_3_Bias, // 3级分压
}LCDBiasTypeDef; }LCDBiasTypeDef;
/** /**
@@ -59,34 +59,34 @@ typedef enum
LCD_CLK_128 // 128Hz LCD_CLK_128 // 128Hz
}LCDSCANCLKTypeDef; }LCDSCANCLKTypeDef;
/* LCD段式屏驱动初始化配置 */ /* LCD段式屏驱动初始化配置 */
void LCD_Init(LCDDutyTypeDef duty, LCDBiasTypeDef bias); void LCD_Init(LCDDutyTypeDef duty, LCDBiasTypeDef bias);
#define LCD_PowerDown() (R32_LCD_CMD &= ~(RB_LCD_ON | RB_LCD_SYS_EN)) /* LCD功能模块关闭 */ #define LCD_PowerDown() (R32_LCD_CMD &= ~(RB_LCD_ON | RB_LCD_SYS_EN)) /* LCD功能模块关闭 */
#define LCD_PowerOn() (R32_LCD_CMD |= (RB_LCD_ON | RB_LCD_SYS_EN)) /* LCD功能模块开启 */ #define LCD_PowerOn() (R32_LCD_CMD |= (RB_LCD_ON | RB_LCD_SYS_EN)) /* LCD功能模块开启 */
// 输入值参考 LCDDrvPowerTypeDef // 输入值参考 LCDDrvPowerTypeDef
#define LCD_PowerCfg( d ) (R32_LCD_CMD = (R32_LCD_CMD & ~RB_LCD_VLCD_SEL) | (d<<7)) /* 配置LCD的 供电电压选择 */ #define LCD_PowerCfg( d ) (R32_LCD_CMD = (R32_LCD_CMD & ~RB_LCD_VLCD_SEL) | (d<<7)) /* 配置LCD的 供电电压选择 */
// 输入值参考 LCDSCANCLKTypeDef // 输入值参考 LCDSCANCLKTypeDef
#define LCD_ScanCLKCfg( d ) (R32_LCD_CMD = (R32_LCD_CMD & ~RB_LCD_SCAN_CLK) | (d<<5)) /* 配置LCD的 扫描时钟选择 */ #define LCD_ScanCLKCfg( d ) (R32_LCD_CMD = (R32_LCD_CMD & ~RB_LCD_SCAN_CLK) | (d<<5)) /* 配置LCD的 扫描时钟选择 */
// 输入值参考 LCDDutyTypeDef // 输入值参考 LCDDutyTypeDef
#define LCD_DutyCfg( d ) (R32_LCD_CMD = (R32_LCD_CMD & ~RB_LCD_DUTY) | (d<<3)) /* 配置LCD的 duty选择 */ #define LCD_DutyCfg( d ) (R32_LCD_CMD = (R32_LCD_CMD & ~RB_LCD_DUTY) | (d<<3)) /* 配置LCD的 duty选择 */
// 输入值参考 LCDBiasTypeDef // 输入值参考 LCDBiasTypeDef
#define LCD_BiasCfg( d ) (R32_LCD_CMD = (R32_LCD_CMD & ~RB_LCD_BIAS) | (d<<2)) /* 配置LCD的 bias选择 */ #define LCD_BiasCfg( d ) (R32_LCD_CMD = (R32_LCD_CMD & ~RB_LCD_BIAS) | (d<<2)) /* 配置LCD的 bias选择 */
#define LCD_WriteData0( d ) (R32_LCD_RAM0 = (R32_LCD_RAM0 & 0xffffff00) | ((UINT32)d)) /* 填充SEG0驱动数值 */ #define LCD_WriteData0( d ) (R32_LCD_RAM0 = (R32_LCD_RAM0 & 0xffffff00) | ((UINT32)d)) /* 填充SEG0驱动数值 */
#define LCD_WriteData1( d ) (R32_LCD_RAM0 = (R32_LCD_RAM0 & 0xffff00ff) | ((UINT32)d<<8)) /* 填充SEG1驱动数值 */ #define LCD_WriteData1( d ) (R32_LCD_RAM0 = (R32_LCD_RAM0 & 0xffff00ff) | ((UINT32)d<<8)) /* 填充SEG1驱动数值 */
#define LCD_WriteData2( d ) (R32_LCD_RAM0 = (R32_LCD_RAM0 & 0xff00ffff) | ((UINT32)d<<16)) /* 填充SEG2驱动数值 */ #define LCD_WriteData2( d ) (R32_LCD_RAM0 = (R32_LCD_RAM0 & 0xff00ffff) | ((UINT32)d<<16)) /* 填充SEG2驱动数值 */
#define LCD_WriteData3( d ) (R32_LCD_RAM0 = (R32_LCD_RAM0 & 0x00ffffff) | ((UINT32)d<<24)) /* 填充SEG3驱动数值 */ #define LCD_WriteData3( d ) (R32_LCD_RAM0 = (R32_LCD_RAM0 & 0x00ffffff) | ((UINT32)d<<24)) /* 填充SEG3驱动数值 */
#define LCD_WriteData4( d ) (R32_LCD_RAM1 = (R32_LCD_RAM1 & 0xffffff00) | ((UINT32)d)) /* 填充SEG4驱动数值 */ #define LCD_WriteData4( d ) (R32_LCD_RAM1 = (R32_LCD_RAM1 & 0xffffff00) | ((UINT32)d)) /* 填充SEG4驱动数值 */
#define LCD_WriteData5( d ) (R32_LCD_RAM1 = (R32_LCD_RAM1 & 0xffff00ff) | ((UINT32)d<<8)) /* 填充SEG5驱动数值 */ #define LCD_WriteData5( d ) (R32_LCD_RAM1 = (R32_LCD_RAM1 & 0xffff00ff) | ((UINT32)d<<8)) /* 填充SEG5驱动数值 */
#define LCD_WriteData6( d ) (R32_LCD_RAM1 = (R32_LCD_RAM1 & 0xff00ffff) | ((UINT32)d<<16)) /* 填充SEG6驱动数值 */ #define LCD_WriteData6( d ) (R32_LCD_RAM1 = (R32_LCD_RAM1 & 0xff00ffff) | ((UINT32)d<<16)) /* 填充SEG6驱动数值 */
#define LCD_WriteData7( d ) (R32_LCD_RAM1 = (R32_LCD_RAM1 & 0x00ffffff) | ((UINT32)d<<24)) /* 填充SEG7驱动数值 */ #define LCD_WriteData7( d ) (R32_LCD_RAM1 = (R32_LCD_RAM1 & 0x00ffffff) | ((UINT32)d<<24)) /* 填充SEG7驱动数值 */
#define LCD_WriteData8( d ) (R32_LCD_RAM2 = (R32_LCD_RAM2 & 0xffffff00) | ((UINT32)d)) /* 填充SEG8驱动数值 */ #define LCD_WriteData8( d ) (R32_LCD_RAM2 = (R32_LCD_RAM2 & 0xffffff00) | ((UINT32)d)) /* 填充SEG8驱动数值 */
#define LCD_WriteData9( d ) (R32_LCD_RAM2 = (R32_LCD_RAM2 & 0xffff00ff) | ((UINT32)d<<8)) /* 填充SEG9驱动数值 */ #define LCD_WriteData9( d ) (R32_LCD_RAM2 = (R32_LCD_RAM2 & 0xffff00ff) | ((UINT32)d<<8)) /* 填充SEG9驱动数值 */
#define LCD_WriteData10( d ) (R32_LCD_RAM2 = (R32_LCD_RAM2 & 0xff00ffff) | ((UINT32)d<<16)) /* 填充SEG10驱动数值 */ #define LCD_WriteData10( d ) (R32_LCD_RAM2 = (R32_LCD_RAM2 & 0xff00ffff) | ((UINT32)d<<16)) /* 填充SEG10驱动数值 */
+44 -44
View File
@@ -20,22 +20,22 @@ extern "C" {
/** /**
* @brief channel of PWM define * @brief channel of PWM define
*/ */
#define CH_PWM4 0x01 // PWM4 通道 #define CH_PWM4 0x01 // PWM4 通道
#define CH_PWM5 0x02 // PWM5 通道 #define CH_PWM5 0x02 // PWM5 通道
#define CH_PWM6 0x04 // PWM6 通道 #define CH_PWM6 0x04 // PWM6 通道
#define CH_PWM7 0x08 // PWM7 通道 #define CH_PWM7 0x08 // PWM7 通道
#define CH_PWM8 0x10 // PWM8 通道 #define CH_PWM8 0x10 // PWM8 通道
#define CH_PWM9 0x20 // PWM9 通道 #define CH_PWM9 0x20 // PWM9 通道
#define CH_PWM10 0x40 // PWM10 通道 #define CH_PWM10 0x40 // PWM10 通道
#define CH_PWM11 0x80 // PWM11 通道 #define CH_PWM11 0x80 // PWM11 通道
/** /**
* @brief channel of PWM define * @brief channel of PWM define
*/ */
typedef enum typedef enum
{ {
High_Level = 0, // 默认低电平,高电平有效 High_Level = 0, // 默认低电平,高电平有效
Low_Level, // 默认高电平,低电平有效 Low_Level, // 默认高电平,低电平有效
} PWMX_PolarTypeDef; } PWMX_PolarTypeDef;
/** /**
@@ -43,93 +43,93 @@ typedef enum
*/ */
typedef enum typedef enum
{ {
PWMX_Cycle_256 = 0, // 256 个PWMX周期 PWMX_Cycle_256 = 0, // 256 个PWMX周期
PWMX_Cycle_255, // 255 个PWMX周期 PWMX_Cycle_255, // 255 个PWMX周期
PWMX_Cycle_128, // 128 个PWMX周期 PWMX_Cycle_128, // 128 个PWMX周期
PWMX_Cycle_127, // 127 个PWMX周期 PWMX_Cycle_127, // 127 个PWMX周期
PWMX_Cycle_64, // 64 个PWMX周期 PWMX_Cycle_64, // 64 个PWMX周期
PWMX_Cycle_63, // 63 个PWMX周期 PWMX_Cycle_63, // 63 个PWMX周期
} PWMX_CycleTypeDef; } PWMX_CycleTypeDef;
/** /**
* @brief PWM4-PWM11 通道基准时钟配置 * @brief PWM4-PWM11 通道基准时钟配置
* *
* @param d - 通道基准时钟 = d*Tsys * @param d - 通道基准时钟 = d*Tsys
*/ */
#define PWMX_CLKCfg(d) (R8_PWM_CLOCK_DIV = d) #define PWMX_CLKCfg(d) (R8_PWM_CLOCK_DIV = d)
/** /**
* @brief PWM4-PWM11周期配置 * @brief PWM4-PWM11周期配置
* *
* @param cyc - refer to PWMX_CycleTypeDef * @param cyc - refer to PWMX_CycleTypeDef
*/ */
void PWMX_CycleCfg(PWMX_CycleTypeDef cyc); void PWMX_CycleCfg(PWMX_CycleTypeDef cyc);
/** /**
* @brief PWM4-PWM9 16位周期配置 * @brief PWM4-PWM9 16位周期配置
* *
* @param cyc - 16位周期 * @param cyc - 16位周期
*/ */
void PWMX_16bit_CycleCfg(uint16_t cyc); void PWMX_16bit_CycleCfg(uint16_t cyc);
/** /**
* @brief 设置 PWM4 有效数据脉宽 * @brief 设置 PWM4 有效数据脉宽
* *
* @param d - 有效数据脉宽 * @param d - 有效数据脉宽
*/ */
#define PWM4_ActDataWidth(d) (R8_PWM4_DATA = d) #define PWM4_ActDataWidth(d) (R8_PWM4_DATA = d)
/** /**
* @brief 设置 PWM5 有效数据脉宽 * @brief 设置 PWM5 有效数据脉宽
* *
* @param d - 有效数据脉宽 * @param d - 有效数据脉宽
*/ */
#define PWM5_ActDataWidth(d) (R8_PWM5_DATA = d) #define PWM5_ActDataWidth(d) (R8_PWM5_DATA = d)
/** /**
* @brief 设置 PWM6 有效数据脉宽 * @brief 设置 PWM6 有效数据脉宽
* *
* @param d - 有效数据脉宽 * @param d - 有效数据脉宽
*/ */
#define PWM6_ActDataWidth(d) (R8_PWM6_DATA = d) #define PWM6_ActDataWidth(d) (R8_PWM6_DATA = d)
/** /**
* @brief 设置 PWM7 有效数据脉宽 * @brief 设置 PWM7 有效数据脉宽
* *
* @param d - 有效数据脉宽 * @param d - 有效数据脉宽
*/ */
#define PWM7_ActDataWidth(d) (R8_PWM7_DATA = d) #define PWM7_ActDataWidth(d) (R8_PWM7_DATA = d)
/** /**
* @brief 设置 PWM8 有效数据脉宽 * @brief 设置 PWM8 有效数据脉宽
* *
* @param d - 有效数据脉宽 * @param d - 有效数据脉宽
*/ */
#define PWM8_ActDataWidth(d) (R8_PWM8_DATA = d) #define PWM8_ActDataWidth(d) (R8_PWM8_DATA = d)
/** /**
* @brief 设置 PWM9 有效数据脉宽 * @brief 设置 PWM9 有效数据脉宽
* *
* @param d - 有效数据脉宽 * @param d - 有效数据脉宽
*/ */
#define PWM9_ActDataWidth(d) (R8_PWM9_DATA = d) #define PWM9_ActDataWidth(d) (R8_PWM9_DATA = d)
/** /**
* @brief 设置 PWM10 有效数据脉宽 * @brief 设置 PWM10 有效数据脉宽
* *
* @param d - 有效数据脉宽 * @param d - 有效数据脉宽
*/ */
#define PWM10_ActDataWidth(d) (R8_PWM10_DATA = d) #define PWM10_ActDataWidth(d) (R8_PWM10_DATA = d)
/** /**
* @brief 设置 PWM11 有效数据脉宽 * @brief 设置 PWM11 有效数据脉宽
* *
* @param d - 有效数据脉宽 * @param d - 有效数据脉宽
*/ */
#define PWM11_ActDataWidth(d) (R8_PWM11_DATA = d) #define PWM11_ActDataWidth(d) (R8_PWM11_DATA = d)
/** /**
* @brief PWM4-PWM11通道输出波形配置 * @brief PWM4-PWM11通道输出波形配置
* *
* @param ch - select channel of pwm, refer to channel of PWM define * @param ch - select channel of pwm, refer to channel of PWM define
* @param da - effective pulse width * @param da - effective pulse width
@@ -139,7 +139,7 @@ void PWMX_16bit_CycleCfg(uint16_t cyc);
void PWMX_ACTOUT(uint8_t ch, uint8_t da, PWMX_PolarTypeDef pr, FunctionalState s); void PWMX_ACTOUT(uint8_t ch, uint8_t da, PWMX_PolarTypeDef pr, FunctionalState s);
/** /**
* @brief PWM4-PWM9 通道16位输出波形配置 * @brief PWM4-PWM9 通道16位输出波形配置
* *
* @param ch - select channel of pwm, refer to channel of PWM define * @param ch - select channel of pwm, refer to channel of PWM define
* @param da - effective pulse width * @param da - effective pulse width
@@ -149,13 +149,13 @@ void PWMX_ACTOUT(uint8_t ch, uint8_t da, PWMX_PolarTypeDef pr, FunctionalState s
void PWMX_16bit_ACTOUT(uint8_t ch, uint16_t da, PWMX_PolarTypeDef pr, FunctionalState s); void PWMX_16bit_ACTOUT(uint8_t ch, uint16_t da, PWMX_PolarTypeDef pr, FunctionalState s);
/** /**
* @brief PWM 交替输出模式配置 * @brief PWM 交替输出模式配置
* *
* @param ch - select group of PWM alternate output * @param ch - select group of PWM alternate output
* RB_PWM4_5_STAG_EN - PWM4 和 PWM5 通道交替输出 * RB_PWM4_5_STAG_EN - PWM4 和 PWM5 通道交替输出
* RB_PWM6_7_STAG_EN - PWM6 和 PWM7 通道交替输出 * RB_PWM6_7_STAG_EN - PWM6 和 PWM7 通道交替输出
* RB_PWM8_9_STAG_EN - PWM8 和 PWM9 通道交替输出 * RB_PWM8_9_STAG_EN - PWM8 和 PWM9 通道交替输出
* RB_PWM10_11_STAG_EN - PWM10 和 PWM11 通道交替输出 * RB_PWM10_11_STAG_EN - PWM10 和 PWM11 通道交替输出
* @param s - control pwmx function, ENABLE or DISABLE * @param s - control pwmx function, ENABLE or DISABLE
*/ */
void PWMX_AlterOutCfg(uint8_t ch, FunctionalState s); void PWMX_AlterOutCfg(uint8_t ch, FunctionalState s);
+37 -37
View File
@@ -46,10 +46,10 @@ extern "C" {
/** /**
* @brief unit of controllable power supply * @brief unit of controllable power supply
*/ */
#define UNIT_SYS_LSE RB_CLK_XT32K_PON // 外部32K 时钟振荡 #define UNIT_SYS_LSE RB_CLK_XT32K_PON // 外部32K 时钟振荡
#define UNIT_SYS_LSI RB_CLK_INT32K_PON // 内部32K 时钟振荡 #define UNIT_SYS_LSI RB_CLK_INT32K_PON // 内部32K 时钟振荡
#define UNIT_SYS_HSE RB_CLK_XT32M_PON // 外部32M 时钟振荡 #define UNIT_SYS_HSE RB_CLK_XT32M_PON // 外部32M 时钟振荡
#define UNIT_SYS_PLL RB_CLK_PLL_PON // PLL 时钟振荡 #define UNIT_SYS_PLL RB_CLK_PLL_PON // PLL 时钟振荡
/** /**
* @brief wakeup mode define * @brief wakeup mode define
@@ -66,13 +66,13 @@ typedef enum
*/ */
typedef enum typedef enum
{ {
/* 下面等级将使用高精度监控,210uA消耗 */ /* 下面等级将使用高精度监控,210uA消耗 */
HALevel_1V9 = 0, // 1.7-1.9 HALevel_1V9 = 0, // 1.7-1.9
HALevel_2V1, // 1.9-2.1 HALevel_2V1, // 1.9-2.1
HALevel_2V3, // 2.1-2.3 HALevel_2V3, // 2.1-2.3
HALevel_2V5, // 2.3-2.5 HALevel_2V5, // 2.3-2.5
/* 下面等级将使用低功耗监控,1uA消耗 */ /* 下面等级将使用低功耗监控,1uA消耗 */
LPLevel_1V8 = 0x80, LPLevel_1V8 = 0x80,
LPLevel_1V9, LPLevel_1V9,
LPLevel_2V0, LPLevel_2V0,
@@ -85,80 +85,80 @@ typedef enum
} VolM_LevelypeDef; } VolM_LevelypeDef;
/** /**
* @brief 启用内部DC/DC电源,用于节约系统功耗 * @brief 启用内部DC/DC电源,用于节约系统功耗
* *
* @param s - 是否打开DCDC电源 * @param s - 是否打开DCDC电源
*/ */
void PWR_DCDCCfg(FunctionalState s); void PWR_DCDCCfg(FunctionalState s);
/** /**
* @brief 可控单元模块的电源控制 * @brief 可控单元模块的电源控制
* *
* @param s - 是否打开电源 * @param s - 是否打开电源
* @param unit - please refer to unit of controllable power supply * @param unit - please refer to unit of controllable power supply
*/ */
void PWR_UnitModCfg(FunctionalState s, uint8_t unit); void PWR_UnitModCfg(FunctionalState s, uint8_t unit);
/** /**
* @brief 外设时钟控制位 * @brief 外设时钟控制位
* *
* @param s - 是否打开对应外设时钟 * @param s - 是否打开对应外设时钟
* @param perph - please refer to Peripher CLK control bit define * @param perph - please refer to Peripher CLK control bit define
*/ */
void PWR_PeriphClkCfg(FunctionalState s, uint16_t perph); void PWR_PeriphClkCfg(FunctionalState s, uint16_t perph);
/** /**
* @brief 睡眠唤醒源配置 * @brief 睡眠唤醒源配置
* *
* @param s - 是否打开此外设睡眠唤醒功能 * @param s - 是否打开此外设睡眠唤醒功能
* @param perph - 需要设置的唤醒源 * @param perph - 需要设置的唤醒源
* RB_SLP_USB_WAKE - USB 为唤醒源 * RB_SLP_USB_WAKE - USB 为唤醒源
* RB_SLP_RTC_WAKE - RTC 为唤醒源 * RB_SLP_RTC_WAKE - RTC 为唤醒源
* RB_SLP_GPIO_WAKE - GPIO 为唤醒源 * RB_SLP_GPIO_WAKE - GPIO 为唤醒源
* RB_SLP_BAT_WAKE - BAT 为唤醒源 * RB_SLP_BAT_WAKE - BAT 为唤醒源
* @param mode - refer to WakeUP_ModeypeDef * @param mode - refer to WakeUP_ModeypeDef
*/ */
void PWR_PeriphWakeUpCfg(FunctionalState s, uint8_t perph, WakeUP_ModeypeDef mode); void PWR_PeriphWakeUpCfg(FunctionalState s, uint8_t perph, WakeUP_ModeypeDef mode);
/** /**
* @brief 电源监控 * @brief 电源监控
* *
* @param s - 是否打开此功能 * @param s - 是否打开此功能
* @param vl - refer to VolM_LevelypeDef * @param vl - refer to VolM_LevelypeDef
*/ */
void PowerMonitor(FunctionalState s, VolM_LevelypeDef vl); void PowerMonitor(FunctionalState s, VolM_LevelypeDef vl);
/** /**
* @brief 低功耗-Idle模式 * @brief 低功耗-Idle模式
*/ */
void LowPower_Idle(void); void LowPower_Idle(void);
/** /**
* @brief 低功耗-Halt模式,此低功耗切到HSI/5时钟运行,唤醒后需要用户自己重新选择系统时钟源 * @brief 低功耗-Halt模式,此低功耗切到HSI/5时钟运行,唤醒后需要用户自己重新选择系统时钟源
*/ */
void LowPower_Halt(void); void LowPower_Halt(void);
/** /**
* @brief 低功耗-Sleep模式,此低功耗切到HSI/5时钟运行,唤醒后需要用户自己重新选择系统时钟源 * @brief 低功耗-Sleep模式,此低功耗切到HSI/5时钟运行,唤醒后需要用户自己重新选择系统时钟源
* @note 注意调用此函数,DCDC功能强制关闭,唤醒后可以手动再次打开 * @note 注意调用此函数,DCDC功能强制关闭,唤醒后可以手动再次打开
* *
* @param rm - 供电模块选择 * @param rm - 供电模块选择
* RB_PWR_RAM2K - 2K retention SRAM 供电 * RB_PWR_RAM2K - 2K retention SRAM 供电
* RB_PWR_RAM16K - 16K main SRAM 供电 * RB_PWR_RAM16K - 16K main SRAM 供电
* RB_PWR_EXTEND - USB 和 BLE 单元保留区域供电 * RB_PWR_EXTEND - USB 和 BLE 单元保留区域供电
* RB_PWR_XROM - FlashROM 供电 * RB_PWR_XROM - FlashROM 供电
* NULL - 以上单元都断电 * NULL - 以上单元都断电
*/ */
void LowPower_Sleep(uint16_t rm); void LowPower_Sleep(uint16_t rm);
/** /**
* @brief 低功耗-Shutdown模式,此低功耗切到HSI/5时钟运行,唤醒后需要用户自己重新选择系统时钟源 * @brief 低功耗-Shutdown模式,此低功耗切到HSI/5时钟运行,唤醒后需要用户自己重新选择系统时钟源
* @note 注意调用此函数,DCDC功能强制关闭,唤醒后可以手动再次打开 * @note 注意调用此函数,DCDC功能强制关闭,唤醒后可以手动再次打开
* *
* @param rm - 供电模块选择 * @param rm - 供电模块选择
* RB_PWR_RAM2K - 2K retention SRAM 供电 * RB_PWR_RAM2K - 2K retention SRAM 供电
* RB_PWR_RAM16K - 16K main SRAM 供电 * RB_PWR_RAM16K - 16K main SRAM 供电
* NULL - 以上单元都断电 * NULL - 以上单元都断电
*/ */
void LowPower_Shutdown(uint16_t rm); void LowPower_Shutdown(uint16_t rm);
+63 -63
View File
@@ -20,22 +20,22 @@ extern "C" {
/** /**
* @brief SPI0 interrupt bit define * @brief SPI0 interrupt bit define
*/ */
#define SPI0_IT_FST_BYTE RB_SPI_IE_FST_BYTE // 从机模式的首字节命令模式下,接收到首字节中断 #define SPI0_IT_FST_BYTE RB_SPI_IE_FST_BYTE // 从机模式的首字节命令模式下,接收到首字节中断
#define SPI0_IT_FIFO_OV RB_SPI_IE_FIFO_OV // FIFO 溢出 #define SPI0_IT_FIFO_OV RB_SPI_IE_FIFO_OV // FIFO 溢出
#define SPI0_IT_DMA_END RB_SPI_IE_DMA_END // DMA 传输结束 #define SPI0_IT_DMA_END RB_SPI_IE_DMA_END // DMA 传输结束
#define SPI0_IT_FIFO_HF RB_SPI_IE_FIFO_HF // FIFO 使用过半 #define SPI0_IT_FIFO_HF RB_SPI_IE_FIFO_HF // FIFO 使用过半
#define SPI0_IT_BYTE_END RB_SPI_IE_BYTE_END // 单字节传输完成 #define SPI0_IT_BYTE_END RB_SPI_IE_BYTE_END // 单字节传输完成
#define SPI0_IT_CNT_END RB_SPI_IE_CNT_END // 全部字节传输完成 #define SPI0_IT_CNT_END RB_SPI_IE_CNT_END // 全部字节传输完成
/** /**
* @brief Configuration data mode * @brief Configuration data mode
*/ */
typedef enum typedef enum
{ {
Mode0_LowBitINFront = 0, // 模式0,低位在前 Mode0_LowBitINFront = 0, // 模式0,低位在前
Mode0_HighBitINFront, // 模式0,高位在前 Mode0_HighBitINFront, // 模式0,高位在前
Mode3_LowBitINFront, // 模式3,低位在前 Mode3_LowBitINFront, // 模式3,低位在前
Mode3_HighBitINFront, // 模式3,高位在前 Mode3_HighBitINFront, // 模式3,高位在前
} ModeBitOrderTypeDef; } ModeBitOrderTypeDef;
/** /**
@@ -43,167 +43,167 @@ typedef enum
*/ */
typedef enum typedef enum
{ {
Mode_DataStream = 0, // 数据流模式 Mode_DataStream = 0, // 数据流模式
Mose_FirstCmd, // 首字节命令模式 Mose_FirstCmd, // 首字节命令模式
} Slave_ModeTypeDef; } Slave_ModeTypeDef;
/** /**
* @brief 主机模式默认初始化:模式0+3线全双工+8MHz * @brief 主机模式默认初始化:模式0+3线全双工+8MHz
*/ */
void SPI0_MasterDefInit(void); void SPI0_MasterDefInit(void);
/** /**
* @brief SPI0 基准时钟配置,= d*Tsys * @brief SPI0 基准时钟配置,= d*Tsys
* *
* @param c - 时钟分频系数 * @param c - 时钟分频系数
*/ */
void SPI0_CLKCfg(uint8_t c); void SPI0_CLKCfg(uint8_t c);
/** /**
* @brief 设置数据流模式 * @brief 设置数据流模式
* *
* @param m - 数据流模式 refer to ModeBitOrderTypeDef * @param m - 数据流模式 refer to ModeBitOrderTypeDef
*/ */
void SPI0_DataMode(ModeBitOrderTypeDef m); void SPI0_DataMode(ModeBitOrderTypeDef m);
/** /**
* @brief 发送单字节 (buffer) * @brief 发送单字节 (buffer)
* *
* @param d - 发送字节 * @param d - 发送字节
*/ */
void SPI0_MasterSendByte(uint8_t d); void SPI0_MasterSendByte(uint8_t d);
/** /**
* @brief 接收单字节 (buffer) * @brief 接收单字节 (buffer)
* *
* @param none * @param none
*/ */
uint8_t SPI0_MasterRecvByte(void); uint8_t SPI0_MasterRecvByte(void);
/** /**
* @brief 使用FIFO连续发送多字节 * @brief 使用FIFO连续发送多字节
* *
* @param pbuf - 待发送的数据内容首地址 * @param pbuf - 待发送的数据内容首地址
* @param len - 请求发送的数据长度,最大4095 * @param len - 请求发送的数据长度,最大4095
*/ */
void SPI0_MasterTrans(uint8_t *pbuf, uint16_t len); void SPI0_MasterTrans(uint8_t *pbuf, uint16_t len);
/** /**
* @brief 使用FIFO连续接收多字节 * @brief 使用FIFO连续接收多字节
* *
* @param pbuf - 待接收的数据首地址 * @param pbuf - 待接收的数据首地址
* @param len - 待接收的数据长度,最大4095 * @param len - 待接收的数据长度,最大4095
*/ */
void SPI0_MasterRecv(uint8_t *pbuf, uint16_t len); void SPI0_MasterRecv(uint8_t *pbuf, uint16_t len);
/** /**
* @brief DMA方式连续发送数据 * @brief DMA方式连续发送数据
* *
* @param pbuf - 待发送数据起始地址,需要四字节对其 * @param pbuf - 待发送数据起始地址,需要四字节对其
* @param len - 待发送数据长度 * @param len - 待发送数据长度
*/ */
void SPI0_MasterDMATrans(uint8_t *pbuf, uint16_t len); void SPI0_MasterDMATrans(uint8_t *pbuf, uint16_t len);
/** /**
* @brief DMA方式连续接收数据 * @brief DMA方式连续接收数据
* *
* @param pbuf - 待接收数据存放起始地址,需要四字节对其 * @param pbuf - 待接收数据存放起始地址,需要四字节对其
* @param len - 待接收数据长度 * @param len - 待接收数据长度
*/ */
void SPI0_MasterDMARecv(uint8_t *pbuf, uint16_t len); void SPI0_MasterDMARecv(uint8_t *pbuf, uint16_t len);
void SPI1_MasterDefInit(void); /* 主机模式默认初始化:模式0+3线全双工+8MHz */ void SPI1_MasterDefInit(void); /* 主机模式默认初始化:模式0+3线全双工+8MHz */
void SPI1_CLKCfg(UINT8 c); /* SPI1 基准时钟配置,= d*Tsys */ void SPI1_CLKCfg(UINT8 c); /* SPI1 基准时钟配置,= d*Tsys */
void SPI1_DataMode(ModeBitOrderTypeDef m); /* 设置数据流模式 */ void SPI1_DataMode(ModeBitOrderTypeDef m); /* 设置数据流模式 */
void SPI1_MasterSendByte(UINT8 d); /* 发送单字节 (buffer) */ void SPI1_MasterSendByte(UINT8 d); /* 发送单字节 (buffer) */
UINT8 SPI1_MasterRecvByte(void); /* 接收单字节 (buffer) */ UINT8 SPI1_MasterRecvByte(void); /* 接收单字节 (buffer) */
void SPI1_MasterTrans(UINT8 *pbuf, UINT16 len); /* 使用FIFO连续发送多字节 */ void SPI1_MasterTrans(UINT8 *pbuf, UINT16 len); /* 使用FIFO连续发送多字节 */
void SPI1_MasterRecv(UINT8 *pbuf, UINT16 len); /* 使用FIFO连续接收多字节 */ void SPI1_MasterRecv(UINT8 *pbuf, UINT16 len); /* 使用FIFO连续接收多字节 */
/** /**
* @brief 设备模式默认初始化,建议设置MISO的GPIO对应为输入模式 * @brief 设备模式默认初始化,建议设置MISO的GPIO对应为输入模式
*/ */
void SPI0_SlaveInit(void); void SPI0_SlaveInit(void);
/** /**
* @brief 加载首字节数据内容 * @brief 加载首字节数据内容
* *
* @param d - 首字节数据内容 * @param d - 首字节数据内容
*/ */
#define SetFirstData(d) (R8_SPI0_SLAVE_PRE = d) #define SetFirstData(d) (R8_SPI0_SLAVE_PRE = d)
/** /**
* @brief 从机模式,发送一字节数据 * @brief 从机模式,发送一字节数据
* *
* @param d - 待发送数据 * @param d - 待发送数据
*/ */
void SPI0_SlaveSendByte(uint8_t d); void SPI0_SlaveSendByte(uint8_t d);
/** /**
* @brief 从机模式,接收一字节数据 * @brief 从机模式,接收一字节数据
* *
* @return 接收到数据 * @return 接收到数据
*/ */
uint8_t SPI0_SlaveRecvByte(void); uint8_t SPI0_SlaveRecvByte(void);
/** /**
* @brief 从机模式,发送多字节数据 * @brief 从机模式,发送多字节数据
* *
* @param pbuf - 待发送的数据内容首地址 * @param pbuf - 待发送的数据内容首地址
* @param len - 请求发送的数据长度,最大4095 * @param len - 请求发送的数据长度,最大4095
*/ */
void SPI0_SlaveTrans(uint8_t *pbuf, uint16_t len); void SPI0_SlaveTrans(uint8_t *pbuf, uint16_t len);
/** /**
* @brief 从机模式,接收多字节数据 * @brief 从机模式,接收多字节数据
* *
* @param pbuf - 接收收数据存放起始地址 * @param pbuf - 接收收数据存放起始地址
* @param len - 请求接收数据长度 * @param len - 请求接收数据长度
*/ */
void SPI0_SlaveRecv(uint8_t *pbuf, uint16_t len); void SPI0_SlaveRecv(uint8_t *pbuf, uint16_t len);
/** /**
* @brief DMA方式连续发送数据 * @brief DMA方式连续发送数据
* *
* @param pbuf - 待发送数据起始地址,需要四字节对其 * @param pbuf - 待发送数据起始地址,需要四字节对其
* @param len - 待发送数据长度 * @param len - 待发送数据长度
*/ */
void SPI0_SlaveDMATrans(uint8_t *pbuf, uint16_t len); void SPI0_SlaveDMATrans(uint8_t *pbuf, uint16_t len);
/** /**
* @brief DMA方式连续接收数据 * @brief DMA方式连续接收数据
* *
* @param pbuf - 待接收数据存放起始地址,需要四字节对其 * @param pbuf - 待接收数据存放起始地址,需要四字节对其
* @param len - 待接收数据长度 * @param len - 待接收数据长度
*/ */
void SPI0_SlaveDMARecv(uint8_t *pbuf, uint16_t len); void SPI0_SlaveDMARecv(uint8_t *pbuf, uint16_t len);
/** /**
* @brief 配置SPI0中断 * @brief 配置SPI0中断
* *
* @param s - 使能/关闭 * @param s - 使能/关闭
* @param f - refer to SPI0 interrupt bit define * @param f - refer to SPI0 interrupt bit define
*/ */
#define SPI0_ITCfg(s, f) ((s) ? (R8_SPI0_INTER_EN |= f) : (R8_SPI0_INTER_EN &= ~f)) #define SPI0_ITCfg(s, f) ((s) ? (R8_SPI0_INTER_EN |= f) : (R8_SPI0_INTER_EN &= ~f))
/** /**
* @brief 获取中断标志状态,0-未置位,(!0)-触发 * @brief 获取中断标志状态,0-未置位,(!0)-触发
* *
* @param f - refer to SPI0 interrupt bit define * @param f - refer to SPI0 interrupt bit define
*/ */
#define SPI0_GetITFlag(f) (R8_SPI0_INT_FLAG & f) #define SPI0_GetITFlag(f) (R8_SPI0_INT_FLAG & f)
/** /**
* @brief 清除当前中断标志 * @brief 清除当前中断标志
* *
* @param f - refer to SPI0 interrupt bit define * @param f - refer to SPI0 interrupt bit define
*/ */
#define SPI0_ClearITFlag(f) (R8_SPI0_INT_FLAG = f) #define SPI0_ClearITFlag(f) (R8_SPI0_INT_FLAG = f)
/** /**
* @brief 关闭SPI0 * @brief 关闭SPI0
*/ */
#define SPI0_Disable() (R8_SPI0_CTRL_MOD &= ~(RB_SPI_MOSI_OE | RB_SPI_SCK_OE | RB_SPI_MISO_OE)) #define SPI0_Disable() (R8_SPI0_CTRL_MOD &= ~(RB_SPI_MOSI_OE | RB_SPI_SCK_OE | RB_SPI_MISO_OE))
+43 -43
View File
@@ -22,14 +22,14 @@ extern "C" {
*/ */
typedef enum typedef enum
{ {
RST_STATUS_SW = 0, // 软件复位 RST_STATUS_SW = 0, // 软件复位
RST_STATUS_RPOR, // 上电复位 RST_STATUS_RPOR, // 上电复位
RST_STATUS_WTR, // 看门狗超时复位 RST_STATUS_WTR, // 看门狗超时复位
RST_STATUS_MR, // 外部手动复位 RST_STATUS_MR, // 外部手动复位
RST_STATUS_LRM0, // 唤醒复位-软复位引起 RST_STATUS_LRM0, // 唤醒复位-软复位引起
RST_STATUS_GPWSM, // 下电模式唤醒复位 RST_STATUS_GPWSM, // 下电模式唤醒复位
RST_STATUS_LRM1, // 唤醒复位-看门狗引起 RST_STATUS_LRM1, // 唤醒复位-看门狗引起
RST_STATUS_LRM2, // 唤醒复位-手动复位引起 RST_STATUS_LRM2, // 唤醒复位-手动复位引起
} SYS_ResetStaTypeDef; } SYS_ResetStaTypeDef;
@@ -38,132 +38,132 @@ typedef enum
*/ */
typedef enum typedef enum
{ {
INFO_ROM_READ = 0, // FlashROM 代码和数据区 是否可读 INFO_ROM_READ = 0, // FlashROM 代码和数据区 是否可读
INFO_RESET_EN = 2, // RST#外部手动复位输入功能是否开启 INFO_RESET_EN = 2, // RST#外部手动复位输入功能是否开启
INFO_BOOT_EN, // 系统引导程序 BootLoader 是否开启 INFO_BOOT_EN, // 系统引导程序 BootLoader 是否开启
INFO_DEBUG_EN, // 系统仿真调试接口是否开启 INFO_DEBUG_EN, // 系统仿真调试接口是否开启
INFO_LOADER, // 当前系统是否处于Bootloader 区 INFO_LOADER, // 当前系统是否处于Bootloader 区
STA_SAFEACC_ACT, // 当前系统是否处于安全访问状态,否则RWA属性区域不可访问 STA_SAFEACC_ACT, // 当前系统是否处于安全访问状态,否则RWA属性区域不可访问
} SYS_InfoStaTypeDef; } SYS_InfoStaTypeDef;
/** /**
* @brief ID类 * @brief ID类
*/ */
#define SYS_GetChipID() R8_CHIP_ID #define SYS_GetChipID() R8_CHIP_ID
/** /**
* @brief 访ID * @brief 访ID
*/ */
#define SYS_GetAccessID() R8_SAFE_ACCESS_ID #define SYS_GetAccessID() R8_SAFE_ACCESS_ID
/** /**
* @brief * @brief
* *
* @param sc - refer to SYS_CLKTypeDef * @param sc - refer to SYS_CLKTypeDef
*/ */
void SetSysClock(SYS_CLKTypeDef sc); void SetSysClock(SYS_CLKTypeDef sc);
/** /**
* @brief * @brief
* *
* @return Hz * @return Hz
*/ */
uint32_t GetSysClock(void); uint32_t GetSysClock(void);
/** /**
* @brief * @brief
* *
* @param i - refer to SYS_InfoStaTypeDef * @param i - refer to SYS_InfoStaTypeDef
* *
* @return * @return
*/ */
uint8_t SYS_GetInfoSta(SYS_InfoStaTypeDef i); uint8_t SYS_GetInfoSta(SYS_InfoStaTypeDef i);
/** /**
* @brief * @brief
* *
* @return refer to SYS_ResetStaTypeDef * @return refer to SYS_ResetStaTypeDef
*/ */
#define SYS_GetLastResetSta() (R8_RESET_STATUS & RB_RESET_FLAG) #define SYS_GetLastResetSta() (R8_RESET_STATUS & RB_RESET_FLAG)
/** /**
* @brief * @brief
*/ */
void SYS_ResetExecute(void); void SYS_ResetExecute(void);
/** /**
* @brief * @brief
* *
* @param i - refer to SYS_InfoStaTypeDef * @param i - refer to SYS_InfoStaTypeDef
*/ */
#define SYS_ResetKeepBuf(d) (R8_GLOB_RESET_KEEP = d) #define SYS_ResetKeepBuf(d) (R8_GLOB_RESET_KEEP = d)
/** /**
* @brief * @brief
* *
* @param pirqv - * @param pirqv -
*/ */
void SYS_DisableAllIrq(uint32_t *pirqv); void SYS_DisableAllIrq(uint32_t *pirqv);
/** /**
* @brief * @brief
* *
* @param irq_status - * @param irq_status -
*/ */
void SYS_RecoverIrq(uint32_t irq_status); void SYS_RecoverIrq(uint32_t irq_status);
/** /**
* @brief (SYSTICK) * @brief (SYSTICK)
* *
* @return * @return
*/ */
uint32_t SYS_GetSysTickCnt(void); uint32_t SYS_GetSysTickCnt(void);
/** /**
* @brief * @brief
* *
* @param c - * @param c -
*/ */
#define WWDG_SetCounter(c) (R8_WDOG_COUNT = c) #define WWDG_SetCounter(c) (R8_WDOG_COUNT = c)
/** /**
* @brief 使 * @brief 使
* *
* @param s - * @param s -
*/ */
void WWDG_ITCfg(FunctionalState s); void WWDG_ITCfg(FunctionalState s);
/** /**
* @brief * @brief
* *
* @param s - * @param s -
*/ */
void WWDG_ResetCfg(FunctionalState s); void WWDG_ResetCfg(FunctionalState s);
/** /**
* @brief * @brief
* *
* @return * @return
*/ */
#define WWDG_GetFlowFlag() (R8_RST_WDOG_CTRL & RB_WDOG_INT_FLAG) #define WWDG_GetFlowFlag() (R8_RST_WDOG_CTRL & RB_WDOG_INT_FLAG)
/** /**
* @brief * @brief
*/ */
void WWDG_ClearFlag(void); void WWDG_ClearFlag(void);
/** /**
* @brief uS * @brief uS
* *
* @param t - * @param t -
*/ */
void mDelayuS(uint16_t t); void mDelayuS(uint16_t t);
/** /**
* @brief mS * @brief mS
* *
* @param t - * @param t -
*/ */
void mDelaymS(uint16_t t); void mDelaymS(uint16_t t);
+145 -145
View File
@@ -23,21 +23,21 @@ extern "C" {
* @brief TMR0 interrupt bit define * @brief TMR0 interrupt bit define
*/ */
#define TMR0_3_IT_CYC_END 0x01 // 周期结束标志:捕捉-超时,定时-周期结束,PWM-周期结束 #define TMR0_3_IT_CYC_END 0x01 // 周期结束标志:捕捉-超时,定时-周期结束,PWM-周期结束
#define TMR0_3_IT_DATA_ACT 0x02 // 数据有效标志:捕捉-新数据,PWM-有效电平结束 #define TMR0_3_IT_DATA_ACT 0x02 // 数据有效标志:捕捉-新数据,PWM-有效电平结束
#define TMR0_3_IT_FIFO_HF 0x04 // FIFO 使用过半:捕捉- FIFO>=4 PWM- FIFO<4 #define TMR0_3_IT_FIFO_HF 0x04 // FIFO 使用过半:捕捉- FIFO>=4 PWM- FIFO<4
#define TMR1_2_IT_DMA_END 0x08 // DMA 结束,支持TMR1和TMR2 #define TMR1_2_IT_DMA_END 0x08 // DMA 结束,支持TMR1和TMR2
#define TMR0_3_IT_FIFO_OV 0x10 // FIFO 溢出:捕捉- FIFO满, PWM- FIFO空 #define TMR0_3_IT_FIFO_OV 0x10 // FIFO 溢出:捕捉- FIFO满, PWM- FIFO空
/** /**
* @brief Configuration PWM effective level repeat times * @brief Configuration PWM effective level repeat times
*/ */
typedef enum typedef enum
{ {
PWM_Times_1 = 0, // PWM 有效输出重复1次数 PWM_Times_1 = 0, // PWM 有效输出重复1次数
PWM_Times_4, // PWM 有效输出重复4次数 PWM_Times_4, // PWM 有效输出重复4次数
PWM_Times_8, // PWM 有效输出重复8次数 PWM_Times_8, // PWM 有效输出重复8次数
PWM_Times_16, // PWM 有效输出重复16次数 PWM_Times_16, // PWM 有效输出重复16次数
} PWM_RepeatTsTypeDef; } PWM_RepeatTsTypeDef;
/** /**
@@ -45,10 +45,10 @@ typedef enum
*/ */
typedef enum typedef enum
{ {
CAP_NULL = 0, // 不捕捉 & 不计数 CAP_NULL = 0, // 不捕捉 & 不计数
Edge_To_Edge, // 任意边沿之间 & 计数任意边沿 Edge_To_Edge, // 任意边沿之间 & 计数任意边沿
FallEdge_To_FallEdge, // 下降沿到下降沿 & 计数下降沿 FallEdge_To_FallEdge, // 下降沿到下降沿 & 计数下降沿
RiseEdge_To_RiseEdge, // 上升沿到上升沿 & 计数上升沿 RiseEdge_To_RiseEdge, // 上升沿到上升沿 & 计数上升沿
} CapModeTypeDef; } CapModeTypeDef;
/** /**
@@ -56,54 +56,54 @@ typedef enum
*/ */
typedef enum typedef enum
{ {
Mode_Single = 0, // 单次模式 Mode_Single = 0, // 单次模式
Mode_LOOP, // 循环模式 Mode_LOOP, // 循环模式
} DMAModeTypeDef; } DMAModeTypeDef;
/** /**
* @brief * @brief
* *
* @param t - Tsys, 67108864 * @param t - Tsys, 67108864
*/ */
void TMR0_TimerInit(uint32_t t); void TMR0_TimerInit(uint32_t t);
/** /**
* @brief 67108864 * @brief 67108864
* *
* @return * @return
*/ */
#define TMR0_GetCurrentTimer() R32_TMR0_COUNT #define TMR0_GetCurrentTimer() R32_TMR0_COUNT
/** /**
* @brief 沿 * @brief 沿
* *
* @param cap - * @param cap -
*/ */
void TMR0_EXTSingleCounterInit(CapModeTypeDef cap); void TMR0_EXTSingleCounterInit(CapModeTypeDef cap);
/** /**
* @brief 67108862 * @brief 67108862
* *
* @param cyc - * @param cyc -
*/ */
#define TMR0_CountOverflowCfg(cyc) (R32_TMR0_CNT_END = (cyc + 2)) #define TMR0_CountOverflowCfg(cyc) (R32_TMR0_CNT_END = (cyc + 2))
/** /**
* @brief 67108862 * @brief 67108862
* *
* @return * @return
*/ */
#define TMR0_GetCurrentCount() R32_TMR0_COUNT #define TMR0_GetCurrentCount() R32_TMR0_COUNT
/** /**
* @brief PWM0 , 67108864 * @brief PWM0 , 67108864
* *
* @param cyc - * @param cyc -
*/ */
#define TMR0_PWMCycleCfg(cyc) (R32_TMR0_CNT_END = cyc) #define TMR0_PWMCycleCfg(cyc) (R32_TMR0_CNT_END = cyc)
/** /**
* @brief PWM * @brief PWM
* *
* @param pr - select wave polar, refer to PWMX_PolarTypeDef * @param pr - select wave polar, refer to PWMX_PolarTypeDef
* @param ts - set pwm repeat times, refer to PWM_RepeatTsTypeDef * @param ts - set pwm repeat times, refer to PWM_RepeatTsTypeDef
@@ -111,126 +111,126 @@ void TMR0_EXTSingleCounterInit(CapModeTypeDef cap);
void TMR0_PWMInit(PWMX_PolarTypeDef pr, PWM_RepeatTsTypeDef ts); void TMR0_PWMInit(PWMX_PolarTypeDef pr, PWM_RepeatTsTypeDef ts);
/** /**
* @brief PWM0 , 67108864 * @brief PWM0 , 67108864
* *
* @param d - * @param d -
*/ */
#define TMR0_PWMActDataWidth(d) (R32_TMR0_FIFO = d) #define TMR0_PWMActDataWidth(d) (R32_TMR0_FIFO = d)
/** /**
* @brief CAP0 , 33554432 * @brief CAP0 , 33554432
* *
* @param cyc - * @param cyc -
*/ */
#define TMR0_CAPTimeoutCfg(cyc) (R32_TMR0_CNT_END = cyc) #define TMR0_CAPTimeoutCfg(cyc) (R32_TMR0_CNT_END = cyc)
/** /**
* @brief * @brief
* *
* @param cap - select capture mode, refer to CapModeTypeDef * @param cap - select capture mode, refer to CapModeTypeDef
*/ */
void TMR0_CapInit(CapModeTypeDef cap); void TMR0_CapInit(CapModeTypeDef cap);
/** /**
* @brief * @brief
* *
* @return * @return
*/ */
#define TMR0_CAPGetData() R32_TMR0_FIFO #define TMR0_CAPGetData() R32_TMR0_FIFO
/** /**
* @brief * @brief
* *
* @return * @return
*/ */
#define TMR0_CAPDataCounter() R8_TMR0_FIFO_COUNT #define TMR0_CAPDataCounter() R8_TMR0_FIFO_COUNT
/** /**
* @brief TMR0 PWM输出 * @brief TMR0 PWM输出
*/ */
#define TMR0_PWMDisable() (R8_TMR0_CTRL_MOD &= ~RB_TMR_OUT_EN) #define TMR0_PWMDisable() (R8_TMR0_CTRL_MOD &= ~RB_TMR_OUT_EN)
/** /**
* @brief TMR0 PWM输出 * @brief TMR0 PWM输出
*/ */
#define TMR0_PWMEnable() (R8_TMR0_CTRL_MOD |= RB_TMR_OUT_EN) #define TMR0_PWMEnable() (R8_TMR0_CTRL_MOD |= RB_TMR_OUT_EN)
/** /**
* @brief TMR0 * @brief TMR0
*/ */
#define TMR0_Disable() (R8_TMR0_CTRL_MOD &= ~RB_TMR_COUNT_EN) #define TMR0_Disable() (R8_TMR0_CTRL_MOD &= ~RB_TMR_COUNT_EN)
/** /**
* @brief TMR0 * @brief TMR0
*/ */
#define TMR0_Enable() (R8_TMR0_CTRL_MOD |= RB_TMR_COUNT_EN) #define TMR0_Enable() (R8_TMR0_CTRL_MOD |= RB_TMR_COUNT_EN)
/** /**
* @brief * @brief
* *
* @param s - 使/ * @param s - 使/
* @param f - refer to TMR interrupt bit define * @param f - refer to TMR interrupt bit define
*/ */
#define TMR0_ITCfg(s, f) ((s) ? (R8_TMR0_INTER_EN |= f) : (R8_TMR0_INTER_EN &= ~f)) #define TMR0_ITCfg(s, f) ((s) ? (R8_TMR0_INTER_EN |= f) : (R8_TMR0_INTER_EN &= ~f))
/** /**
* @brief * @brief
* *
* @param f - refer to TMR interrupt bit define * @param f - refer to TMR interrupt bit define
*/ */
#define TMR0_ClearITFlag(f) (R8_TMR0_INT_FLAG = f) #define TMR0_ClearITFlag(f) (R8_TMR0_INT_FLAG = f)
/** /**
* @brief * @brief
* *
* @param f - refer to TMR interrupt bit define * @param f - refer to TMR interrupt bit define
*/ */
#define TMR0_GetITFlag(f) (R8_TMR0_INT_FLAG & f) #define TMR0_GetITFlag(f) (R8_TMR0_INT_FLAG & f)
/** /**
* @brief * @brief
* *
* @param t - Tsys, 67108864 * @param t - Tsys, 67108864
*/ */
void TMR1_TimerInit(uint32_t t); void TMR1_TimerInit(uint32_t t);
/** /**
* @brief 67108864 * @brief 67108864
* *
* @return * @return
*/ */
#define TMR1_GetCurrentTimer() R32_TMR1_COUNT #define TMR1_GetCurrentTimer() R32_TMR1_COUNT
/** /**
* @brief 沿 * @brief 沿
* *
* @param cap - * @param cap -
*/ */
void TMR1_EXTSingleCounterInit(CapModeTypeDef cap); void TMR1_EXTSingleCounterInit(CapModeTypeDef cap);
/** /**
* @brief 67108862 * @brief 67108862
* *
* @param cyc - * @param cyc -
*/ */
#define TMR1_CountOverflowCfg(cyc) (R32_TMR1_CNT_END = (cyc + 2)) #define TMR1_CountOverflowCfg(cyc) (R32_TMR1_CNT_END = (cyc + 2))
/** /**
* @brief 67108862 * @brief 67108862
* *
* @return * @return
*/ */
#define TMR1_GetCurrentCount() R32_TMR1_COUNT #define TMR1_GetCurrentCount() R32_TMR1_COUNT
/** /**
* @brief PWM1 , 67108864 * @brief PWM1 , 67108864
* *
* @param cyc - * @param cyc -
*/ */
#define TMR1_PWMCycleCfg(cyc) (R32_TMR1_CNT_END = cyc) #define TMR1_PWMCycleCfg(cyc) (R32_TMR1_CNT_END = cyc)
/** /**
* @brief PWM * @brief PWM
* *
* @param pr - select wave polar, refer to PWMX_PolarTypeDef * @param pr - select wave polar, refer to PWMX_PolarTypeDef
* @param ts - set pwm repeat times, refer to PWM_RepeatTsTypeDef * @param ts - set pwm repeat times, refer to PWM_RepeatTsTypeDef
@@ -238,136 +238,136 @@ void TMR1_EXTSingleCounterInit(CapModeTypeDef cap);
void TMR1_PWMInit(PWMX_PolarTypeDef pr, PWM_RepeatTsTypeDef ts); void TMR1_PWMInit(PWMX_PolarTypeDef pr, PWM_RepeatTsTypeDef ts);
/** /**
* @brief PWM1 , 67108864 * @brief PWM1 , 67108864
* *
* @param d - * @param d -
*/ */
#define TMR1_PWMActDataWidth(d) (R32_TMR1_FIFO = d) #define TMR1_PWMActDataWidth(d) (R32_TMR1_FIFO = d)
/** /**
* @brief CAP1 , 33554432 * @brief CAP1 , 33554432
* *
* @param cyc - * @param cyc -
*/ */
#define TMR1_CAPTimeoutCfg(cyc) (R32_TMR1_CNT_END = cyc) #define TMR1_CAPTimeoutCfg(cyc) (R32_TMR1_CNT_END = cyc)
/** /**
* @brief * @brief
* *
* @param cap - select capture mode, refer to CapModeTypeDef * @param cap - select capture mode, refer to CapModeTypeDef
*/ */
void TMR1_CapInit(CapModeTypeDef cap); void TMR1_CapInit(CapModeTypeDef cap);
/** /**
* @brief * @brief
* *
* @return * @return
*/ */
#define TMR1_CAPGetData() R32_TMR1_FIFO #define TMR1_CAPGetData() R32_TMR1_FIFO
/** /**
* @brief * @brief
* *
* @return * @return
*/ */
#define TMR1_CAPDataCounter() R8_TMR1_FIFO_COUNT #define TMR1_CAPDataCounter() R8_TMR1_FIFO_COUNT
/** /**
* @brief DMA功能 * @brief DMA功能
* *
* @param s - DMA功能 * @param s - DMA功能
* @param startAddr - DMA * @param startAddr - DMA
* @param endAddr - DMA * @param endAddr - DMA
* @param m - DMA模式 * @param m - DMA模式
*/ */
void TMR1_DMACfg(uint8_t s, uint16_t startAddr, uint16_t endAddr, DMAModeTypeDef m); void TMR1_DMACfg(uint8_t s, uint16_t startAddr, uint16_t endAddr, DMAModeTypeDef m);
/** /**
* @brief TMR1 PWM输出 * @brief TMR1 PWM输出
*/ */
#define TMR1_PWMDisable() (R8_TMR1_CTRL_MOD &= ~RB_TMR_OUT_EN) #define TMR1_PWMDisable() (R8_TMR1_CTRL_MOD &= ~RB_TMR_OUT_EN)
/** /**
* @brief TMR1 PWM输出 * @brief TMR1 PWM输出
*/ */
#define TMR1_PWMEnable() (R8_TMR1_CTRL_MOD |= RB_TMR_OUT_EN) #define TMR1_PWMEnable() (R8_TMR1_CTRL_MOD |= RB_TMR_OUT_EN)
/** /**
* @brief TMR1 * @brief TMR1
*/ */
#define TMR1_Disable() (R8_TMR1_CTRL_MOD &= ~RB_TMR_COUNT_EN) #define TMR1_Disable() (R8_TMR1_CTRL_MOD &= ~RB_TMR_COUNT_EN)
/** /**
* @brief TMR1 * @brief TMR1
*/ */
#define TMR1_Enable() (R8_TMR1_CTRL_MOD |= RB_TMR_COUNT_EN) #define TMR1_Enable() (R8_TMR1_CTRL_MOD |= RB_TMR_COUNT_EN)
/** /**
* @brief * @brief
* *
* @param s - 使/ * @param s - 使/
* @param f - refer to TMR interrupt bit define * @param f - refer to TMR interrupt bit define
*/ */
#define TMR1_ITCfg(s, f) ((s) ? (R8_TMR1_INTER_EN |= f) : (R8_TMR1_INTER_EN &= ~f)) #define TMR1_ITCfg(s, f) ((s) ? (R8_TMR1_INTER_EN |= f) : (R8_TMR1_INTER_EN &= ~f))
/** /**
* @brief * @brief
* *
* @param f - refer to TMR interrupt bit define * @param f - refer to TMR interrupt bit define
*/ */
#define TMR1_ClearITFlag(f) (R8_TMR1_INT_FLAG = f) #define TMR1_ClearITFlag(f) (R8_TMR1_INT_FLAG = f)
/** /**
* @brief * @brief
* *
* @param f - refer to TMR interrupt bit define * @param f - refer to TMR interrupt bit define
*/ */
#define TMR1_GetITFlag(f) (R8_TMR1_INT_FLAG & f) #define TMR1_GetITFlag(f) (R8_TMR1_INT_FLAG & f)
/** /**
* @brief * @brief
* *
* @param t - Tsys, 67108864 * @param t - Tsys, 67108864
*/ */
void TMR2_TimerInit(uint32_t t); void TMR2_TimerInit(uint32_t t);
/** /**
* @brief 67108864 * @brief 67108864
* *
* @return * @return
*/ */
#define TMR2_GetCurrentTimer() R32_TMR2_COUNT #define TMR2_GetCurrentTimer() R32_TMR2_COUNT
/** /**
* @brief 沿 * @brief 沿
* *
* @param cap - * @param cap -
*/ */
void TMR2_EXTSingleCounterInit(CapModeTypeDef cap); void TMR2_EXTSingleCounterInit(CapModeTypeDef cap);
/** /**
* @brief 67108862 * @brief 67108862
* *
* @param cyc - * @param cyc -
*/ */
#define TMR2_CountOverflowCfg(cyc) (R32_TMR2_CNT_END = (cyc + 2)) #define TMR2_CountOverflowCfg(cyc) (R32_TMR2_CNT_END = (cyc + 2))
/** /**
* @brief 67108862 * @brief 67108862
* *
* @return * @return
*/ */
#define TMR2_GetCurrentCount() R32_TMR2_COUNT #define TMR2_GetCurrentCount() R32_TMR2_COUNT
/** /**
* @brief PWM2 , 67108864 * @brief PWM2 , 67108864
* *
* @param cyc - * @param cyc -
*/ */
#define TMR2_PWMCycleCfg(cyc) (R32_TMR2_CNT_END = cyc) #define TMR2_PWMCycleCfg(cyc) (R32_TMR2_CNT_END = cyc)
/** /**
* @brief PWM * @brief PWM
* *
* @param pr - select wave polar, refer to PWMX_PolarTypeDef * @param pr - select wave polar, refer to PWMX_PolarTypeDef
* @param ts - set pwm repeat times, refer to PWM_RepeatTsTypeDef * @param ts - set pwm repeat times, refer to PWM_RepeatTsTypeDef
@@ -375,136 +375,136 @@ void TMR2_EXTSingleCounterInit(CapModeTypeDef cap);
void TMR2_PWMInit(PWMX_PolarTypeDef pr, PWM_RepeatTsTypeDef ts); void TMR2_PWMInit(PWMX_PolarTypeDef pr, PWM_RepeatTsTypeDef ts);
/** /**
* @brief PWM2 , 67108864 * @brief PWM2 , 67108864
* *
* @param d - * @param d -
*/ */
#define TMR2_PWMActDataWidth(d) (R32_TMR2_FIFO = d) #define TMR2_PWMActDataWidth(d) (R32_TMR2_FIFO = d)
/** /**
* @brief CAP2 , 33554432 * @brief CAP2 , 33554432
* *
* @param cyc - * @param cyc -
*/ */
#define TMR2_CAPTimeoutCfg(cyc) (R32_TMR2_CNT_END = cyc) #define TMR2_CAPTimeoutCfg(cyc) (R32_TMR2_CNT_END = cyc)
/** /**
* @brief * @brief
* *
* @param cap - select capture mode, refer to CapModeTypeDef * @param cap - select capture mode, refer to CapModeTypeDef
*/ */
void TMR2_CapInit(CapModeTypeDef cap); void TMR2_CapInit(CapModeTypeDef cap);
/** /**
* @brief * @brief
* *
* @return * @return
*/ */
#define TMR2_CAPGetData() R32_TMR2_FIFO #define TMR2_CAPGetData() R32_TMR2_FIFO
/** /**
* @brief * @brief
* *
* @return * @return
*/ */
#define TMR2_CAPDataCounter() R8_TMR2_FIFO_COUNT #define TMR2_CAPDataCounter() R8_TMR2_FIFO_COUNT
/** /**
* @brief DMA功能 * @brief DMA功能
* *
* @param s - DMA功能 * @param s - DMA功能
* @param startAddr - DMA * @param startAddr - DMA
* @param endAddr - DMA * @param endAddr - DMA
* @param m - DMA模式 * @param m - DMA模式
*/ */
void TMR2_DMACfg(uint8_t s, uint32_t startAddr, uint32_t endAddr, DMAModeTypeDef m); void TMR2_DMACfg(uint8_t s, uint32_t startAddr, uint32_t endAddr, DMAModeTypeDef m);
/** /**
* @brief TMR2 PWM输出 * @brief TMR2 PWM输出
*/ */
#define TMR2_PWMDisable() (R8_TMR2_CTRL_MOD &= ~RB_TMR_OUT_EN) #define TMR2_PWMDisable() (R8_TMR2_CTRL_MOD &= ~RB_TMR_OUT_EN)
/** /**
* @brief TMR2 PWM输出 * @brief TMR2 PWM输出
*/ */
#define TMR2_PWMEnable() (R8_TMR2_CTRL_MOD |= RB_TMR_OUT_EN) #define TMR2_PWMEnable() (R8_TMR2_CTRL_MOD |= RB_TMR_OUT_EN)
/** /**
* @brief TMR2 * @brief TMR2
*/ */
#define TMR2_Disable() (R8_TMR2_CTRL_MOD &= ~RB_TMR_COUNT_EN) #define TMR2_Disable() (R8_TMR2_CTRL_MOD &= ~RB_TMR_COUNT_EN)
/** /**
* @brief TMR2 * @brief TMR2
*/ */
#define TMR2_Enable() (R8_TMR2_CTRL_MOD |= RB_TMR_COUNT_EN) #define TMR2_Enable() (R8_TMR2_CTRL_MOD |= RB_TMR_COUNT_EN)
/** /**
* @brief * @brief
* *
* @param s - 使/ * @param s - 使/
* @param f - refer to TMR interrupt bit define * @param f - refer to TMR interrupt bit define
*/ */
#define TMR2_ITCfg(s, f) ((s) ? (R8_TMR2_INTER_EN |= f) : (R8_TMR2_INTER_EN &= ~f)) #define TMR2_ITCfg(s, f) ((s) ? (R8_TMR2_INTER_EN |= f) : (R8_TMR2_INTER_EN &= ~f))
/** /**
* @brief * @brief
* *
* @param f - refer to TMR interrupt bit define * @param f - refer to TMR interrupt bit define
*/ */
#define TMR2_ClearITFlag(f) (R8_TMR2_INT_FLAG = f) #define TMR2_ClearITFlag(f) (R8_TMR2_INT_FLAG = f)
/** /**
* @brief * @brief
* *
* @param f - refer to TMR interrupt bit define * @param f - refer to TMR interrupt bit define
*/ */
#define TMR2_GetITFlag(f) (R8_TMR2_INT_FLAG & f) #define TMR2_GetITFlag(f) (R8_TMR2_INT_FLAG & f)
/** /**
* @brief * @brief
* *
* @param t - Tsys, 67108864 * @param t - Tsys, 67108864
*/ */
void TMR3_TimerInit(uint32_t t); void TMR3_TimerInit(uint32_t t);
/** /**
* @brief 67108864 * @brief 67108864
* *
* @return * @return
*/ */
#define TMR3_GetCurrentTimer() R32_TMR3_COUNT #define TMR3_GetCurrentTimer() R32_TMR3_COUNT
/** /**
* @brief 沿 * @brief 沿
* *
* @param cap - * @param cap -
*/ */
void TMR3_EXTSingleCounterInit(CapModeTypeDef cap); void TMR3_EXTSingleCounterInit(CapModeTypeDef cap);
/** /**
* @brief 67108862 * @brief 67108862
* *
* @param cyc - * @param cyc -
*/ */
#define TMR3_CountOverflowCfg(cyc) (R32_TMR3_CNT_END = (cyc + 2)) #define TMR3_CountOverflowCfg(cyc) (R32_TMR3_CNT_END = (cyc + 2))
/** /**
* @brief 67108862 * @brief 67108862
* *
* @return * @return
*/ */
#define TMR3_GetCurrentCount() R32_TMR3_COUNT #define TMR3_GetCurrentCount() R32_TMR3_COUNT
/** /**
* @brief PWM3 , 67108864 * @brief PWM3 , 67108864
* *
* @param cyc - * @param cyc -
*/ */
#define TMR3_PWMCycleCfg(cyc) (R32_TMR3_CNT_END = cyc) #define TMR3_PWMCycleCfg(cyc) (R32_TMR3_CNT_END = cyc)
/** /**
* @brief PWM * @brief PWM
* *
* @param pr - select wave polar, refer to PWMX_PolarTypeDef * @param pr - select wave polar, refer to PWMX_PolarTypeDef
* @param ts - set pwm repeat times, refer to PWM_RepeatTsTypeDef * @param ts - set pwm repeat times, refer to PWM_RepeatTsTypeDef
@@ -512,77 +512,77 @@ void TMR3_EXTSingleCounterInit(CapModeTypeDef cap);
void TMR3_PWMInit(PWMX_PolarTypeDef pr, PWM_RepeatTsTypeDef ts); void TMR3_PWMInit(PWMX_PolarTypeDef pr, PWM_RepeatTsTypeDef ts);
/** /**
* @brief PWM3 , 67108864 * @brief PWM3 , 67108864
* *
* @param d - * @param d -
*/ */
#define TMR3_PWMActDataWidth(d) (R32_TMR3_FIFO = d) #define TMR3_PWMActDataWidth(d) (R32_TMR3_FIFO = d)
/** /**
* @brief CAP3 , 33554432 * @brief CAP3 , 33554432
* *
* @param cyc - * @param cyc -
*/ */
#define TMR3_CAPTimeoutCfg(cyc) (R32_TMR3_CNT_END = cyc) #define TMR3_CAPTimeoutCfg(cyc) (R32_TMR3_CNT_END = cyc)
/** /**
* @brief * @brief
* *
* @param cap - select capture mode, refer to CapModeTypeDef * @param cap - select capture mode, refer to CapModeTypeDef
*/ */
void TMR3_CapInit(CapModeTypeDef cap); void TMR3_CapInit(CapModeTypeDef cap);
/** /**
* @brief * @brief
* *
* @return * @return
*/ */
#define TMR3_CAPGetData() R32_TMR3_FIFO #define TMR3_CAPGetData() R32_TMR3_FIFO
/** /**
* @brief * @brief
* *
* @return * @return
*/ */
#define TMR3_CAPDataCounter() R8_TMR3_FIFO_COUNT #define TMR3_CAPDataCounter() R8_TMR3_FIFO_COUNT
/** /**
* @brief TMR3 PWM输出 * @brief TMR3 PWM输出
*/ */
#define TMR3_PWMDisable() (R8_TMR3_CTRL_MOD &= ~RB_TMR_OUT_EN) #define TMR3_PWMDisable() (R8_TMR3_CTRL_MOD &= ~RB_TMR_OUT_EN)
/** /**
* @brief TMR3 PWM输出 * @brief TMR3 PWM输出
*/ */
#define TMR3_PWMEnable() (R8_TMR3_CTRL_MOD |= RB_TMR_OUT_EN) #define TMR3_PWMEnable() (R8_TMR3_CTRL_MOD |= RB_TMR_OUT_EN)
/** /**
* @brief TMR3 * @brief TMR3
*/ */
#define TMR3_Disable() (R8_TMR3_CTRL_MOD &= ~RB_TMR_COUNT_EN) #define TMR3_Disable() (R8_TMR3_CTRL_MOD &= ~RB_TMR_COUNT_EN)
/** /**
* @brief TMR3 * @brief TMR3
*/ */
#define TMR3_Enable() (R8_TMR3_CTRL_MOD |= RB_TMR_COUNT_EN) #define TMR3_Enable() (R8_TMR3_CTRL_MOD |= RB_TMR_COUNT_EN)
/** /**
* @brief * @brief
* *
* @param s - 使/ * @param s - 使/
* @param f - refer to TMR interrupt bit define * @param f - refer to TMR interrupt bit define
*/ */
#define TMR3_ITCfg(s, f) ((s) ? (R8_TMR3_INTER_EN |= f) : (R8_TMR3_INTER_EN &= ~f)) #define TMR3_ITCfg(s, f) ((s) ? (R8_TMR3_INTER_EN |= f) : (R8_TMR3_INTER_EN &= ~f))
/** /**
* @brief * @brief
* *
* @param f - refer to TMR interrupt bit define * @param f - refer to TMR interrupt bit define
*/ */
#define TMR3_ClearITFlag(f) (R8_TMR3_INT_FLAG = f) #define TMR3_ClearITFlag(f) (R8_TMR3_INT_FLAG = f)
/** /**
* @brief * @brief
* *
* @param f - refer to TMR interrupt bit define * @param f - refer to TMR interrupt bit define
*/ */
+123 -123
View File
@@ -20,388 +20,388 @@ extern "C" {
/** /**
* @brief LINE error and status define * @brief LINE error and status define
*/ */
#define STA_ERR_BREAK RB_LSR_BREAK_ERR // 数据间隔错误 #define STA_ERR_BREAK RB_LSR_BREAK_ERR // 数据间隔错误
#define STA_ERR_FRAME RB_LSR_FRAME_ERR // 数据帧错误 #define STA_ERR_FRAME RB_LSR_FRAME_ERR // 数据帧错误
#define STA_ERR_PAR RB_LSR_PAR_ERR // 奇偶校验位出错 #define STA_ERR_PAR RB_LSR_PAR_ERR // 奇偶校验位出错
#define STA_ERR_FIFOOV RB_LSR_OVER_ERR // 接收数据溢出 #define STA_ERR_FIFOOV RB_LSR_OVER_ERR // 接收数据溢出
#define STA_TXFIFO_EMP RB_LSR_TX_FIFO_EMP // 当前发送FIFO空,可以继续填充发送数据 #define STA_TXFIFO_EMP RB_LSR_TX_FIFO_EMP // 当前发送FIFO空,可以继续填充发送数据
#define STA_TXALL_EMP RB_LSR_TX_ALL_EMP // 当前所有发送数据都发送完成 #define STA_TXALL_EMP RB_LSR_TX_ALL_EMP // 当前所有发送数据都发送完成
#define STA_RECV_DATA RB_LSR_DATA_RDY // 当前有接收到数据 #define STA_RECV_DATA RB_LSR_DATA_RDY // 当前有接收到数据
/** /**
* @brief Configuration UART TrigByte num * @brief Configuration UART TrigByte num
*/ */
typedef enum typedef enum
{ {
UART_1BYTE_TRIG = 0, // 1字节触发 UART_1BYTE_TRIG = 0, // 1字节触发
UART_2BYTE_TRIG, // 2字节触发 UART_2BYTE_TRIG, // 2字节触发
UART_4BYTE_TRIG, // 4字节触发 UART_4BYTE_TRIG, // 4字节触发
UART_7BYTE_TRIG, // 7字节触发 UART_7BYTE_TRIG, // 7字节触发
} UARTByteTRIGTypeDef; } UARTByteTRIGTypeDef;
/** /**
* @brief * @brief
*/ */
void UART0_DefInit(void); void UART0_DefInit(void);
/** /**
* @brief * @brief
* *
* @param baudrate - * @param baudrate -
*/ */
void UART0_BaudRateCfg(uint32_t baudrate); void UART0_BaudRateCfg(uint32_t baudrate);
/** /**
* @brief * @brief
* *
* @param b - refer to UARTByteTRIGTypeDef * @param b - refer to UARTByteTRIGTypeDef
*/ */
void UART0_ByteTrigCfg(UARTByteTRIGTypeDef b); void UART0_ByteTrigCfg(UARTByteTRIGTypeDef b);
/** /**
* @brief * @brief
* *
* @param s - 使 * @param s - 使
* @param i - * @param i -
* RB_IER_MODEM_CHG - 使 UART0 * RB_IER_MODEM_CHG - 使 UART0
* RB_IER_LINE_STAT - 线 * RB_IER_LINE_STAT - 线
* RB_IER_THR_EMPTY - * RB_IER_THR_EMPTY -
* RB_IER_RECV_RDY - * RB_IER_RECV_RDY -
*/ */
void UART0_INTCfg(FunctionalState s, uint8_t i); void UART0_INTCfg(FunctionalState s, uint8_t i);
/** /**
* @brief * @brief
*/ */
void UART0_Reset(void); void UART0_Reset(void);
/** /**
* @brief FIFO * @brief FIFO
*/ */
#define UART0_CLR_RXFIFO() (R8_UART0_FCR |= RB_FCR_RX_FIFO_CLR) #define UART0_CLR_RXFIFO() (R8_UART0_FCR |= RB_FCR_RX_FIFO_CLR)
/** /**
* @brief FIFO * @brief FIFO
*/ */
#define UART0_CLR_TXFIFO() (R8_UART0_FCR |= RB_FCR_TX_FIFO_CLR) #define UART0_CLR_TXFIFO() (R8_UART0_FCR |= RB_FCR_TX_FIFO_CLR)
/** /**
* @brief * @brief
* *
* @return * @return
*/ */
#define UART0_GetITFlag() (R8_UART0_IIR & RB_IIR_INT_MASK) #define UART0_GetITFlag() (R8_UART0_IIR & RB_IIR_INT_MASK)
/** /**
* @brief * @brief
* *
* @return refer to LINE error and status define * @return refer to LINE error and status define
*/ */
#define UART0_GetLinSTA() (R8_UART0_LSR) #define UART0_GetLinSTA() (R8_UART0_LSR)
/** /**
* @brief * @brief
* *
* @param b * @param b
*/ */
#define UART0_SendByte(b) (R8_UART0_THR = b) #define UART0_SendByte(b) (R8_UART0_THR = b)
/** /**
* @brief * @brief
* *
* @param buf - * @param buf -
* @param l - * @param l -
*/ */
void UART0_SendString(uint8_t *buf, uint16_t l); void UART0_SendString(uint8_t *buf, uint16_t l);
/** /**
* @brief * @brief
* *
* @return * @return
*/ */
#define UART0_RecvByte() (R8_UART0_RBR) #define UART0_RecvByte() (R8_UART0_RBR)
/** /**
* @brief * @brief
* *
* @param buf - * @param buf -
* *
* @return * @return
*/ */
uint16_t UART0_RecvString(uint8_t *buf); uint16_t UART0_RecvString(uint8_t *buf);
/** /**
* @brief * @brief
*/ */
void UART1_DefInit(void); void UART1_DefInit(void);
/** /**
* @brief * @brief
* *
* @param baudrate - * @param baudrate -
*/ */
void UART1_BaudRateCfg(uint32_t baudrate); void UART1_BaudRateCfg(uint32_t baudrate);
/** /**
* @brief * @brief
* *
* @param b - refer to UARTByteTRIGTypeDef * @param b - refer to UARTByteTRIGTypeDef
*/ */
void UART1_ByteTrigCfg(UARTByteTRIGTypeDef b); void UART1_ByteTrigCfg(UARTByteTRIGTypeDef b);
/** /**
* @brief * @brief
* *
* @param s - 使 * @param s - 使
* @param i - * @param i -
* RB_IER_MODEM_CHG - 使 UART0 * RB_IER_MODEM_CHG - 使 UART0
* RB_IER_LINE_STAT - 线 * RB_IER_LINE_STAT - 线
* RB_IER_THR_EMPTY - * RB_IER_THR_EMPTY -
* RB_IER_RECV_RDY - * RB_IER_RECV_RDY -
*/ */
void UART1_INTCfg(FunctionalState s, uint8_t i); void UART1_INTCfg(FunctionalState s, uint8_t i);
/** /**
* @brief * @brief
*/ */
void UART1_Reset(void); void UART1_Reset(void);
/** /**
* @brief FIFO * @brief FIFO
*/ */
#define UART1_CLR_RXFIFO() (R8_UART1_FCR |= RB_FCR_RX_FIFO_CLR) #define UART1_CLR_RXFIFO() (R8_UART1_FCR |= RB_FCR_RX_FIFO_CLR)
/** /**
* @brief FIFO * @brief FIFO
*/ */
#define UART1_CLR_TXFIFO() (R8_UART1_FCR |= RB_FCR_TX_FIFO_CLR) #define UART1_CLR_TXFIFO() (R8_UART1_FCR |= RB_FCR_TX_FIFO_CLR)
/** /**
* @brief * @brief
* *
* @return * @return
*/ */
#define UART1_GetITFlag() (R8_UART1_IIR & RB_IIR_INT_MASK) #define UART1_GetITFlag() (R8_UART1_IIR & RB_IIR_INT_MASK)
/** /**
* @brief * @brief
* *
* @return refer to LINE error and status define * @return refer to LINE error and status define
*/ */
#define UART1_GetLinSTA() (R8_UART1_LSR) #define UART1_GetLinSTA() (R8_UART1_LSR)
/** /**
* @brief * @brief
* *
* @param b * @param b
*/ */
#define UART1_SendByte(b) (R8_UART1_THR = b) #define UART1_SendByte(b) (R8_UART1_THR = b)
/** /**
* @brief * @brief
* *
* @param buf - * @param buf -
* @param l - * @param l -
*/ */
void UART1_SendString(uint8_t *buf, uint16_t l); void UART1_SendString(uint8_t *buf, uint16_t l);
/** /**
* @brief * @brief
* *
* @return * @return
*/ */
#define UART1_RecvByte() (R8_UART1_RBR) #define UART1_RecvByte() (R8_UART1_RBR)
/** /**
* @brief * @brief
* *
* @param buf - * @param buf -
* *
* @return * @return
*/ */
uint16_t UART1_RecvString(uint8_t *buf); uint16_t UART1_RecvString(uint8_t *buf);
/** /**
* @brief * @brief
*/ */
void UART2_DefInit(void); void UART2_DefInit(void);
/** /**
* @brief * @brief
* *
* @param baudrate - * @param baudrate -
*/ */
void UART2_BaudRateCfg(uint32_t baudrate); void UART2_BaudRateCfg(uint32_t baudrate);
/** /**
* @brief * @brief
* *
* @param b - refer to UARTByteTRIGTypeDef * @param b - refer to UARTByteTRIGTypeDef
*/ */
void UART2_ByteTrigCfg(UARTByteTRIGTypeDef b); void UART2_ByteTrigCfg(UARTByteTRIGTypeDef b);
/** /**
* @brief * @brief
* *
* @param s - 使 * @param s - 使
* @param i - * @param i -
* RB_IER_MODEM_CHG - 使 UART0 * RB_IER_MODEM_CHG - 使 UART0
* RB_IER_LINE_STAT - 线 * RB_IER_LINE_STAT - 线
* RB_IER_THR_EMPTY - * RB_IER_THR_EMPTY -
* RB_IER_RECV_RDY - * RB_IER_RECV_RDY -
*/ */
void UART2_INTCfg(FunctionalState s, uint8_t i); void UART2_INTCfg(FunctionalState s, uint8_t i);
/** /**
* @brief * @brief
*/ */
void UART2_Reset(void); void UART2_Reset(void);
/** /**
* @brief FIFO * @brief FIFO
*/ */
#define UART2_CLR_RXFIFO() (R8_UART2_FCR |= RB_FCR_RX_FIFO_CLR) #define UART2_CLR_RXFIFO() (R8_UART2_FCR |= RB_FCR_RX_FIFO_CLR)
/** /**
* @brief FIFO * @brief FIFO
*/ */
#define UART2_CLR_TXFIFO() (R8_UART2_FCR |= RB_FCR_TX_FIFO_CLR) #define UART2_CLR_TXFIFO() (R8_UART2_FCR |= RB_FCR_TX_FIFO_CLR)
/** /**
* @brief * @brief
* *
* @return * @return
*/ */
#define UART2_GetITFlag() (R8_UART2_IIR & RB_IIR_INT_MASK) #define UART2_GetITFlag() (R8_UART2_IIR & RB_IIR_INT_MASK)
/** /**
* @brief * @brief
* *
* @return refer to LINE error and status define * @return refer to LINE error and status define
*/ */
#define UART2_GetLinSTA() (R8_UART2_LSR) #define UART2_GetLinSTA() (R8_UART2_LSR)
/** /**
* @brief * @brief
* *
* @param b * @param b
*/ */
#define UART2_SendByte(b) (R8_UART2_THR = b) #define UART2_SendByte(b) (R8_UART2_THR = b)
/** /**
* @brief * @brief
* *
* @param buf - * @param buf -
* @param l - * @param l -
*/ */
void UART2_SendString(uint8_t *buf, uint16_t l); void UART2_SendString(uint8_t *buf, uint16_t l);
/** /**
* @brief * @brief
* *
* @return * @return
*/ */
#define UART2_RecvByte() (R8_UART2_RBR) #define UART2_RecvByte() (R8_UART2_RBR)
/** /**
* @brief * @brief
* *
* @param buf - * @param buf -
* *
* @return * @return
*/ */
uint16_t UART2_RecvString(uint8_t *buf); uint16_t UART2_RecvString(uint8_t *buf);
/** /**
* @brief * @brief
*/ */
void UART3_DefInit(void); void UART3_DefInit(void);
/** /**
* @brief * @brief
* *
* @param baudrate - * @param baudrate -
*/ */
void UART3_BaudRateCfg(uint32_t baudrate); void UART3_BaudRateCfg(uint32_t baudrate);
/** /**
* @brief * @brief
* *
* @param b - refer to UARTByteTRIGTypeDef * @param b - refer to UARTByteTRIGTypeDef
*/ */
void UART3_ByteTrigCfg(UARTByteTRIGTypeDef b); void UART3_ByteTrigCfg(UARTByteTRIGTypeDef b);
/** /**
* @brief * @brief
* *
* @param s - 使 * @param s - 使
* @param i - * @param i -
* RB_IER_MODEM_CHG - 使 UART0 * RB_IER_MODEM_CHG - 使 UART0
* RB_IER_LINE_STAT - 线 * RB_IER_LINE_STAT - 线
* RB_IER_THR_EMPTY - * RB_IER_THR_EMPTY -
* RB_IER_RECV_RDY - * RB_IER_RECV_RDY -
*/ */
void UART3_INTCfg(FunctionalState s, uint8_t i); void UART3_INTCfg(FunctionalState s, uint8_t i);
/** /**
* @brief * @brief
*/ */
void UART3_Reset(void); void UART3_Reset(void);
/** /**
* @brief FIFO * @brief FIFO
*/ */
#define UART3_CLR_RXFIFO() (R8_UART3_FCR |= RB_FCR_RX_FIFO_CLR) #define UART3_CLR_RXFIFO() (R8_UART3_FCR |= RB_FCR_RX_FIFO_CLR)
/** /**
* @brief FIFO * @brief FIFO
*/ */
#define UART3_CLR_TXFIFO() (R8_UART3_FCR |= RB_FCR_TX_FIFO_CLR) #define UART3_CLR_TXFIFO() (R8_UART3_FCR |= RB_FCR_TX_FIFO_CLR)
/** /**
* @brief * @brief
* *
* @return * @return
*/ */
#define UART3_GetITFlag() (R8_UART3_IIR & RB_IIR_INT_MASK) #define UART3_GetITFlag() (R8_UART3_IIR & RB_IIR_INT_MASK)
/** /**
* @brief * @brief
* *
* @return refer to LINE error and status define * @return refer to LINE error and status define
*/ */
#define UART3_GetLinSTA() (R8_UART3_LSR) #define UART3_GetLinSTA() (R8_UART3_LSR)
/** /**
* @brief * @brief
* *
* @param b * @param b
*/ */
#define UART3_SendByte(b) (R8_UART3_THR = b) #define UART3_SendByte(b) (R8_UART3_THR = b)
/** /**
* @brief * @brief
* *
* @param buf - * @param buf -
* @param l - * @param l -
*/ */
void UART3_SendString(uint8_t *buf, uint16_t l); void UART3_SendString(uint8_t *buf, uint16_t l);
/** /**
* @brief * @brief
* *
* @return * @return
*/ */
#define UART3_RecvByte() (R8_UART3_RBR) #define UART3_RecvByte() (R8_UART3_RBR)
/** /**
* @brief * @brief
* *
* @param buf - * @param buf -
* *
* @return * @return
*/ */
uint16_t UART3_RecvString(uint8_t *buf); uint16_t UART3_RecvString(uint8_t *buf);
+30 -30
View File
@@ -17,14 +17,14 @@
extern "C" { extern "C" {
#endif #endif
/* HID类请求 */ /* HID类请求 */
#define DEF_USB_GET_IDLE 0x02 /* get idle for key or mouse */ #define DEF_USB_GET_IDLE 0x02 /* get idle for key or mouse */
#define DEF_USB_GET_PROTOCOL 0x03 /* get protocol for bios type */ #define DEF_USB_GET_PROTOCOL 0x03 /* get protocol for bios type */
#define DEF_USB_SET_REPORT 0x09 /* set report for key */ #define DEF_USB_SET_REPORT 0x09 /* set report for key */
#define DEF_USB_SET_IDLE 0x0A /* set idle for key or mouse */ #define DEF_USB_SET_IDLE 0x0A /* set idle for key or mouse */
#define DEF_USB_SET_PROTOCOL 0x0B /* set protocol for bios type */ #define DEF_USB_SET_PROTOCOL 0x0B /* set protocol for bios type */
/* 以下缓存区是USB模块收发使用的数据缓冲区,总共9个通道(9块缓存),用户可根据实际使用的通道数定义相应缓存区 */ /* 以下缓存区是USB模块收发使用的数据缓冲区,总共9个通道(9块缓存),用户可根据实际使用的通道数定义相应缓存区 */
extern uint8_t *pEP0_RAM_Addr; //ep0(64)+ep4_out(64)+ep4_in(64) extern uint8_t *pEP0_RAM_Addr; //ep0(64)+ep4_out(64)+ep4_in(64)
extern uint8_t *pEP1_RAM_Addr; //ep1_out(64)+ep1_in(64) extern uint8_t *pEP1_RAM_Addr; //ep1_out(64)+ep1_in(64)
extern uint8_t *pEP2_RAM_Addr; //ep2_out(64)+ep2_in(64) extern uint8_t *pEP2_RAM_Addr; //ep2_out(64)+ep2_in(64)
@@ -42,106 +42,106 @@ extern uint8_t *pEP3_RAM_Addr; //ep3_out(64)+ep3_in(64)
#define pEP4_IN_DataBuf (pEP0_RAM_Addr + 128) #define pEP4_IN_DataBuf (pEP0_RAM_Addr + 128)
/** /**
* @brief USB设备功能初始化48 * @brief USB设备功能初始化48
*/ */
void USB_DeviceInit(void); void USB_DeviceInit(void);
/** /**
* @brief USB设备应答传输处理 * @brief USB设备应答传输处理
*/ */
void USB_DevTransProcess(void); void USB_DevTransProcess(void);
/** /**
* @brief 1 * @brief 1
* *
* @param l - (<64B) * @param l - (<64B)
*/ */
void DevEP1_OUT_Deal(uint8_t l); void DevEP1_OUT_Deal(uint8_t l);
/** /**
* @brief 2 * @brief 2
* *
* @param l - (<64B) * @param l - (<64B)
*/ */
void DevEP2_OUT_Deal(uint8_t l); void DevEP2_OUT_Deal(uint8_t l);
/** /**
* @brief 3 * @brief 3
* *
* @param l - (<64B) * @param l - (<64B)
*/ */
void DevEP3_OUT_Deal(uint8_t l); void DevEP3_OUT_Deal(uint8_t l);
/** /**
* @brief 4 * @brief 4
* *
* @param l - (<64B) * @param l - (<64B)
*/ */
void DevEP4_OUT_Deal(uint8_t l); void DevEP4_OUT_Deal(uint8_t l);
/** /**
* @brief 1 * @brief 1
* *
* @param l - (<64B) * @param l - (<64B)
*/ */
void DevEP1_IN_Deal(uint8_t l); void DevEP1_IN_Deal(uint8_t l);
/** /**
* @brief 2 * @brief 2
* *
* @param l - (<64B) * @param l - (<64B)
*/ */
void DevEP2_IN_Deal(uint8_t l); void DevEP2_IN_Deal(uint8_t l);
/** /**
* @brief 3 * @brief 3
* *
* @param l - (<64B) * @param l - (<64B)
*/ */
void DevEP3_IN_Deal(uint8_t l); void DevEP3_IN_Deal(uint8_t l);
/** /**
* @brief 4 * @brief 4
* *
* @param l - (<64B) * @param l - (<64B)
*/ */
void DevEP4_IN_Deal(uint8_t l); void DevEP4_IN_Deal(uint8_t l);
/** /**
* @brief 1 * @brief 1
* *
* @return 0- (!0)- * @return 0- (!0)-
*/ */
#define EP1_GetINSta() (R8_UEP1_CTRL & UEP_T_RES_NAK) #define EP1_GetINSta() (R8_UEP1_CTRL & UEP_T_RES_NAK)
/** /**
* @brief 2 * @brief 2
* *
* @return 0- (!0)- * @return 0- (!0)-
*/ */
#define EP2_GetINSta() (R8_UEP2_CTRL & UEP_T_RES_NAK) #define EP2_GetINSta() (R8_UEP2_CTRL & UEP_T_RES_NAK)
/** /**
* @brief 3 * @brief 3
* *
* @return 0- (!0)- * @return 0- (!0)-
*/ */
#define EP3_GetINSta() (R8_UEP3_CTRL & UEP_T_RES_NAK) #define EP3_GetINSta() (R8_UEP3_CTRL & UEP_T_RES_NAK)
/** /**
* @brief 4 * @brief 4
* *
* @return 0- (!0)- * @return 0- (!0)-
*/ */
#define EP4_GetINSta() (R8_UEP4_CTRL & UEP_T_RES_NAK) #define EP4_GetINSta() (R8_UEP4_CTRL & UEP_T_RES_NAK)
/** /**
* @brief USB上拉电阻 * @brief USB上拉电阻
*/ */
#define USB_DisablePin() (R16_PIN_ANALOG_IE &= ~(RB_PIN_USB_IE | RB_PIN_USB_DP_PU)) #define USB_DisablePin() (R16_PIN_ANALOG_IE &= ~(RB_PIN_USB_IE | RB_PIN_USB_DP_PU))
/** /**
* @brief USB * @brief USB
*/ */
#define USB_Disable() (R32_USB_CONTROL = 0) #define USB_Disable() (R32_USB_CONTROL = 0)
+117 -117
View File
@@ -19,25 +19,25 @@ extern "C" {
#if DISK_LIB_ENABLE #if DISK_LIB_ENABLE
#if DISK_WITHOUT_USB_HUB #if DISK_WITHOUT_USB_HUB
/* 不使用U盘文件系统库或者U盘挂载USBhub下面,需要关闭下面定义 */ /* 不使用U盘文件系统库或者U盘挂载USBhub下面,需要关闭下面定义 */
#define FOR_ROOT_UDISK_ONLY #define FOR_ROOT_UDISK_ONLY
#endif #endif
/* 使用U盘文件系统库,需要开启下面定义, 不使用请关闭 */ /* 使用U盘文件系统库,需要开启下面定义, 不使用请关闭 */
#define DISK_BASE_BUF_LEN 512 /* 默认的磁盘数据缓冲区大小为512字节,建议选择为2048甚至4096以支持某些大扇区的U盘,为0则禁止在.H文件中定义缓冲区并由应用程序在pDISK_BASE_BUF中指定 */ #define DISK_BASE_BUF_LEN 512 /* 默认的磁盘数据缓冲区大小为512字节,建议选择为2048甚至4096以支持某些大扇区的U盘,为0则禁止在.H文件中定义缓冲区并由应用程序在pDISK_BASE_BUF中指定 */
#endif #endif
// 各子程序返回状态码 // 各子程序返回状态码
#define ERR_SUCCESS 0x00 // 操作成功 #define ERR_SUCCESS 0x00 // 操作成功
#define ERR_USB_CONNECT 0x15 /* 检测到USB设备连接事件,已经连接 */ #define ERR_USB_CONNECT 0x15 /* 检测到USB设备连接事件,已经连接 */
#define ERR_USB_DISCON 0x16 /* 检测到USB设备断开事件,已经断开 */ #define ERR_USB_DISCON 0x16 /* 检测到USB设备断开事件,已经断开 */
#define ERR_USB_BUF_OVER 0x17 /* USB传输的数据有误或者数据太多缓冲区溢出 */ #define ERR_USB_BUF_OVER 0x17 /* USB传输的数据有误或者数据太多缓冲区溢出 */
#define ERR_USB_DISK_ERR 0x1F /* USB存储器操作失败,在初始化时可能是USB存储器不支持,在读写操作中可能是磁盘损坏或者已经断开 */ #define ERR_USB_DISK_ERR 0x1F /* USB存储器操作失败,在初始化时可能是USB存储器不支持,在读写操作中可能是磁盘损坏或者已经断开 */
#define ERR_USB_TRANSFER 0x20 /* NAK/STALL等更多错误码在0x20~0x2F */ #define ERR_USB_TRANSFER 0x20 /* NAK/STALL等更多错误码在0x20~0x2F */
#define ERR_USB_UNSUPPORT 0xFB /* 不支持的USB设备*/ #define ERR_USB_UNSUPPORT 0xFB /* 不支持的USB设备*/
#define ERR_USB_UNKNOWN 0xFE /* 设备操作出错*/ #define ERR_USB_UNKNOWN 0xFE /* 设备操作出错*/
#define ERR_AOA_PROTOCOL 0x41 /* 协议版本出错 */ #define ERR_AOA_PROTOCOL 0x41 /* 协议版本出错 */
/*USB设备相关信息表,最多支持1个设备*/ /*USB设备相关信息表,最多支持1个设备*/
#define ROOT_DEV_DISCONNECT 0 #define ROOT_DEV_DISCONNECT 0
#define ROOT_DEV_CONNECTED 1 #define ROOT_DEV_CONNECTED 1
#define ROOT_DEV_FAILED 2 #define ROOT_DEV_FAILED 2
@@ -48,48 +48,48 @@ extern "C" {
#define DEV_TYPE_UNKNOW 0xFF #define DEV_TYPE_UNKNOW 0xFF
/* /*
: USB设备地址分配规则(USB_DEVICE_ADDR) : USB设备地址分配规则(USB_DEVICE_ADDR)
0x02 Root-HUB下的USB设备或外部HUB 0x02 Root-HUB下的USB设备或外部HUB
0x1x Root-HUB下的外部HUB的端口x下的USB设备,x为1~n 0x1x Root-HUB下的外部HUB的端口x下的USB设备,x为1~n
*/ */
#define HUB_MAX_PORTS 4 #define HUB_MAX_PORTS 4
#define WAIT_USB_TOUT_200US 800 // 等待USB中断超时时间 #define WAIT_USB_TOUT_200US 800 // 等待USB中断超时时间
typedef struct typedef struct
{ {
uint8_t DeviceStatus; // 设备状态,0-无设备,1-有设备但尚未初始化,2-有设备但初始化枚举失败,3-有设备且初始化枚举成功 uint8_t DeviceStatus; // 设备状态,0-无设备,1-有设备但尚未初始化,2-有设备但初始化枚举失败,3-有设备且初始化枚举成功
uint8_t DeviceAddress; // 设备被分配的USB地址 uint8_t DeviceAddress; // 设备被分配的USB地址
uint8_t DeviceSpeed; // 0为低速,非0为全速 uint8_t DeviceSpeed; // 0为低速,非0为全速
uint8_t DeviceType; // 设备类型 uint8_t DeviceType; // 设备类型
uint16_t DeviceVID; uint16_t DeviceVID;
uint16_t DevicePID; uint16_t DevicePID;
uint8_t GpVar[4]; // 通用变量,存放端点 uint8_t GpVar[4]; // 通用变量,存放端点
uint8_t GpHUBPortNum; // 通用变量,如果是HUB,表示HUB端口数 uint8_t GpHUBPortNum; // 通用变量,如果是HUB,表示HUB端口数
} _RootHubDev; } _RootHubDev;
typedef struct typedef struct
{ {
UINT8 DeviceStatus; // 设备状态,0-无设备,1-有设备但尚未初始化,2-有设备但初始化枚举失败,3-有设备且初始化枚举成功 UINT8 DeviceStatus; // 设备状态,0-无设备,1-有设备但尚未初始化,2-有设备但初始化枚举失败,3-有设备且初始化枚举成功
UINT8 DeviceAddress; // 设备被分配的USB地址 UINT8 DeviceAddress; // 设备被分配的USB地址
UINT8 DeviceSpeed; // 0为低速,非0为全速 UINT8 DeviceSpeed; // 0为低速,非0为全速
UINT8 DeviceType; // 设备类型 UINT8 DeviceType; // 设备类型
UINT16 DeviceVID; UINT16 DeviceVID;
UINT16 DevicePID; UINT16 DevicePID;
UINT8 GpVar[4]; // 通用变量 UINT8 GpVar[4]; // 通用变量
} _DevOnHubPort; // 假定:不超过1个外部HUB,每个外部HUB不超过HUB_MAX_PORTS个端口(多了不管) } _DevOnHubPort; // 假定:不超过1个外部HUB,每个外部HUB不超过HUB_MAX_PORTS个端口(多了不管)
extern _RootHubDev ThisUsbDev; extern _RootHubDev ThisUsbDev;
extern _DevOnHubPort DevOnHubPort[HUB_MAX_PORTS]; // 假定:不超过1个外部HUB,每个外部HUB不超过HUB_MAX_PORTS个端口(多了不管) extern _DevOnHubPort DevOnHubPort[HUB_MAX_PORTS]; // 假定:不超过1个外部HUB,每个外部HUB不超过HUB_MAX_PORTS个端口(多了不管)
extern uint8_t UsbDevEndp0Size; // USB设备的端点0的最大包尺寸 */ extern uint8_t UsbDevEndp0Size; // USB设备的端点0的最大包尺寸 */
extern uint8_t FoundNewDev; extern uint8_t FoundNewDev;
extern uint8_t *pHOST_RX_RAM_Addr; extern uint8_t *pHOST_RX_RAM_Addr;
extern uint8_t *pHOST_TX_RAM_Addr; extern uint8_t *pHOST_TX_RAM_Addr;
extern _RootHubDev ThisUsb2Dev; extern _RootHubDev ThisUsb2Dev;
extern _DevOnHubPort DevOnU2HubPort[HUB_MAX_PORTS]; // 假定:不超过1个外部HUB,每个外部HUB不超过HUB_MAX_PORTS个端口(多了不管) extern _DevOnHubPort DevOnU2HubPort[HUB_MAX_PORTS]; // 假定:不超过1个外部HUB,每个外部HUB不超过HUB_MAX_PORTS个端口(多了不管)
extern uint8_t Usb2DevEndp0Size; // USB设备的端点0的最大包尺寸 */ extern uint8_t Usb2DevEndp0Size; // USB设备的端点0的最大包尺寸 */
extern uint8_t FoundNewU2Dev; extern uint8_t FoundNewU2Dev;
extern uint8_t *pU2HOST_RX_RAM_Addr; extern uint8_t *pU2HOST_RX_RAM_Addr;
@@ -100,210 +100,210 @@ extern uint8_t *pU2HOST_TX_RAM_Addr;
extern uint8_t Com_Buffer[]; extern uint8_t Com_Buffer[];
extern uint8_t U2Com_Buffer[]; extern uint8_t U2Com_Buffer[];
/* 以下为USB主机请求包 */ /* 以下为USB主机请求包 */
extern const uint8_t SetupGetDevDescr[]; // 获取设备描述符*/ extern const uint8_t SetupGetDevDescr[]; // 获取设备描述符*/
extern const uint8_t SetupGetCfgDescr[]; // 获取配置描述符*/ extern const uint8_t SetupGetCfgDescr[]; // 获取配置描述符*/
extern const uint8_t SetupSetUsbAddr[]; // 设置USB地址*/ extern const uint8_t SetupSetUsbAddr[]; // 设置USB地址*/
extern const uint8_t SetupSetUsbConfig[]; // 设置USB配置*/ extern const uint8_t SetupSetUsbConfig[]; // 设置USB配置*/
extern const uint8_t SetupSetUsbInterface[]; // 设置USB接口配置*/ extern const uint8_t SetupSetUsbInterface[]; // 设置USB接口配置*/
extern const uint8_t SetupClrEndpStall[]; // 清除端点STALL*/ extern const uint8_t SetupClrEndpStall[]; // 清除端点STALL*/
extern const uint8_t SetupGetU2DevDescr[]; // 获取设备描述符*/ extern const uint8_t SetupGetU2DevDescr[]; // 获取设备描述符*/
extern const uint8_t SetupGetU2CfgDescr[]; // 获取配置描述符*/ extern const uint8_t SetupGetU2CfgDescr[]; // 获取配置描述符*/
extern const uint8_t SetupSetUsb2Addr[]; // 设置USB地址*/ extern const uint8_t SetupSetUsb2Addr[]; // 设置USB地址*/
extern const uint8_t SetupSetUsb2Config[]; // 设置USB配置*/ extern const uint8_t SetupSetUsb2Config[]; // 设置USB配置*/
extern const uint8_t SetupSetUsb2Interface[]; // 设置USB接口配置*/ extern const uint8_t SetupSetUsb2Interface[]; // 设置USB接口配置*/
extern const uint8_t SetupClrU2EndpStall[]; // 清除端点STALL*/ extern const uint8_t SetupClrU2EndpStall[]; // 清除端点STALL*/
/** /**
* @brief ROOT-HUB端口,, * @brief ROOT-HUB端口,,
*/ */
void DisableRootHubPort(void); void DisableRootHubPort(void);
/** /**
* @brief ROOT-HUB状态,ROOT-HUB端口的设备插拔事件 * @brief ROOT-HUB状态,ROOT-HUB端口的设备插拔事件
* ,DisableRootHubPort(),,, * ,DisableRootHubPort(),,,
* *
* @return ERR_SUCCESS为没有情况,ERR_USB_CONNECT为检测到新连接,ERR_USB_DISCON为检测到断开 * @return ERR_SUCCESS为没有情况,ERR_USB_CONNECT为检测到新连接,ERR_USB_DISCON为检测到断开
*/ */
uint8_t AnalyzeRootHub(void); uint8_t AnalyzeRootHub(void);
/** /**
* @brief USB主机当前操作的USB设备地址 * @brief USB主机当前操作的USB设备地址
* *
* @param addr - USB设备地址 * @param addr - USB设备地址
*/ */
void SetHostUsbAddr(uint8_t addr); void SetHostUsbAddr(uint8_t addr);
/** /**
* @brief USB速度 * @brief USB速度
* *
* @param FullSpeed - USB速度 * @param FullSpeed - USB速度
*/ */
void SetUsbSpeed(uint8_t FullSpeed); void SetUsbSpeed(uint8_t FullSpeed);
/** /**
* @brief ,线,, * @brief ,线,,
*/ */
void ResetRootHubPort(void); void ResetRootHubPort(void);
/** /**
* @brief 使ROOT-HUB端口,bUH_PORT_EN置1开启端口, * @brief 使ROOT-HUB端口,bUH_PORT_EN置1开启端口,
* *
* @return ERR_SUCCESS为检测到新连接,ERR_USB_DISCON为无连接 * @return ERR_SUCCESS为检测到新连接,ERR_USB_DISCON为无连接
*/ */
uint8_t EnableRootHubPort(void); uint8_t EnableRootHubPort(void);
/** /**
* @brief USB中断 * @brief USB中断
* *
* @return ERR_SUCCESS ,ERR_USB_UNKNOWN * @return ERR_SUCCESS ,ERR_USB_UNKNOWN
*/ */
uint8_t WaitUSB_Interrupt(void); uint8_t WaitUSB_Interrupt(void);
/** /**
* @brief ,/PID令牌,,20uS为单位的NAK重试总时间(0,0xFFFF),0,/ * @brief ,/PID令牌,,20uS为单位的NAK重试总时间(0,0xFFFF),0,/
* ,,, * ,,,
* *
* @param endp_pid - , 4token_pid令牌, 4 * @param endp_pid - , 4token_pid令牌, 4
* @param tog - * @param tog -
* @param timeout - * @param timeout -
* *
* @return ERR_USB_UNKNOWN * @return ERR_USB_UNKNOWN
* ERR_USB_DISCON * ERR_USB_DISCON
* ERR_USB_CONNECT * ERR_USB_CONNECT
* ERR_SUCCESS * ERR_SUCCESS
*/ */
uint8_t USBHostTransact(uint8_t endp_pid, uint8_t tog, uint32_t timeout); uint8_t USBHostTransact(uint8_t endp_pid, uint8_t tog, uint32_t timeout);
/** /**
* @brief ,8pSetupReq中,DataBuf为可选的收发缓冲区 * @brief ,8pSetupReq中,DataBuf为可选的收发缓冲区
* *
* @param DataBuf - ,DataBuf需指向有效缓冲区用于存放后续数据 * @param DataBuf - ,DataBuf需指向有效缓冲区用于存放后续数据
* @param RetLen - RetLen指向的字节变量中 * @param RetLen - RetLen指向的字节变量中
* *
* @return ERR_USB_BUF_OVER IN状态阶段出错 * @return ERR_USB_BUF_OVER IN状态阶段出错
* ERR_SUCCESS * ERR_SUCCESS
*/ */
uint8_t HostCtrlTransfer(uint8_t *DataBuf, uint8_t *RetLen); uint8_t HostCtrlTransfer(uint8_t *DataBuf, uint8_t *RetLen);
/** /**
* @brief * @brief
* *
* @param pReqPkt - * @param pReqPkt -
*/ */
void CopySetupReqPkg(const uint8_t *pReqPkt); void CopySetupReqPkg(const uint8_t *pReqPkt);
/** /**
* @brief , pHOST_TX_RAM_Addr * @brief , pHOST_TX_RAM_Addr
* *
* @return ERR_USB_BUF_OVER * @return ERR_USB_BUF_OVER
* ERR_SUCCESS * ERR_SUCCESS
*/ */
uint8_t CtrlGetDeviceDescr(void); uint8_t CtrlGetDeviceDescr(void);
/** /**
* @brief , pHOST_TX_RAM_Addr * @brief , pHOST_TX_RAM_Addr
* *
* @return ERR_USB_BUF_OVER * @return ERR_USB_BUF_OVER
* ERR_SUCCESS * ERR_SUCCESS
*/ */
uint8_t CtrlGetConfigDescr(void); uint8_t CtrlGetConfigDescr(void);
/** /**
* @brief USB设备地址 * @brief USB设备地址
* *
* @param addr - * @param addr -
* *
* @return ERR_SUCCESS * @return ERR_SUCCESS
*/ */
uint8_t CtrlSetUsbAddress(uint8_t addr); uint8_t CtrlSetUsbAddress(uint8_t addr);
/** /**
* @brief USB设备配置 * @brief USB设备配置
* *
* @param cfg - * @param cfg -
* *
* @return ERR_SUCCESS * @return ERR_SUCCESS
*/ */
uint8_t CtrlSetUsbConfig(uint8_t cfg); uint8_t CtrlSetUsbConfig(uint8_t cfg);
/** /**
* @brief STALL * @brief STALL
* *
* @param endp - * @param endp -
* *
* @return ERR_SUCCESS * @return ERR_SUCCESS
*/ */
uint8_t CtrlClearEndpStall(uint8_t endp); uint8_t CtrlClearEndpStall(uint8_t endp);
/** /**
* @brief USB设备接口 * @brief USB设备接口
* *
* @param cfg - * @param cfg -
* *
* @return ERR_SUCCESS * @return ERR_SUCCESS
*/ */
uint8_t CtrlSetUsbIntercace(uint8_t cfg); uint8_t CtrlSetUsbIntercace(uint8_t cfg);
/** /**
* @brief USB主机功能初始化 * @brief USB主机功能初始化
*/ */
void USB_HostInit(void); void USB_HostInit(void);
uint8_t EnumAllHubPort(void);// 枚举所有ROOT-HUB端口下外部HUB后的二级USB设备 uint8_t EnumAllHubPort(void);// 枚举所有ROOT-HUB端口下外部HUB后的二级USB设备
void SelectHubPort(uint8_t HubPortIndex); // HubPortIndex=0选择操作指定的ROOT-HUB端口,否则选择操作指定的ROOT-HUB端口的外部HUB的指定端口 void SelectHubPort(uint8_t HubPortIndex); // HubPortIndex=0选择操作指定的ROOT-HUB端口,否则选择操作指定的ROOT-HUB端口的外部HUB的指定端口
uint16_t SearchTypeDevice(uint8_t type); // 在ROOT-HUB以及外部HUB各端口上搜索指定类型的设备所在的端口号,输出端口号为0xFFFF则未搜索到. uint16_t SearchTypeDevice(uint8_t type); // 在ROOT-HUB以及外部HUB各端口上搜索指定类型的设备所在的端口号,输出端口号为0xFFFF则未搜索到.
uint8_t SETorOFFNumLock(uint8_t *buf); // NumLock的点灯判断 uint8_t SETorOFFNumLock(uint8_t *buf); // NumLock的点灯判断
/*************************************************************/ /*************************************************************/
/** /**
* @brief ROOT-HUB端口的USB设备 * @brief ROOT-HUB端口的USB设备
* *
* @return * @return
*/ */
uint8_t InitRootDevice(void); uint8_t InitRootDevice(void);
/** /**
* @brief HID设备报表描述符,TxBuffer中 * @brief HID设备报表描述符,TxBuffer中
* *
* @return * @return
*/ */
uint8_t CtrlGetHIDDeviceReport(uint8_t infc); uint8_t CtrlGetHIDDeviceReport(uint8_t infc);
/** /**
* @brief HUB描述符,Com_Buffer中 * @brief HUB描述符,Com_Buffer中
* *
* @return * @return
*/ */
uint8_t CtrlGetHubDescr(void); uint8_t CtrlGetHubDescr(void);
/** /**
* @brief HUB端口状态,Com_Buffer中 * @brief HUB端口状态,Com_Buffer中
* *
* @param HubPortIndex - * @param HubPortIndex -
* *
* @return * @return
*/ */
uint8_t HubGetPortStatus(uint8_t HubPortIndex); uint8_t HubGetPortStatus(uint8_t HubPortIndex);
/** /**
* @brief HUB端口特性 * @brief HUB端口特性
* *
* @param HubPortIndex - * @param HubPortIndex -
* @param FeatureSelt - * @param FeatureSelt -
* *
* @return * @return
*/ */
uint8_t HubSetPortFeature(uint8_t HubPortIndex, uint8_t FeatureSelt); uint8_t HubSetPortFeature(uint8_t HubPortIndex, uint8_t FeatureSelt);
/** /**
* @brief HUB端口特性 * @brief HUB端口特性
* *
* @param HubPortIndex - * @param HubPortIndex -
* @param FeatureSelt - * @param FeatureSelt -
* *
* @return * @return
*/ */
uint8_t HubClearPortFeature(uint8_t HubPortIndex, uint8_t FeatureSelt); uint8_t HubClearPortFeature(uint8_t HubPortIndex, uint8_t FeatureSelt);
+2 -2
View File
@@ -4,8 +4,8 @@
/* Author: W.ch 2020.06 */ /* Author: W.ch 2020.06 */
/* V1.0 FlashROM library for USER/BOOT */ /* V1.0 FlashROM library for USER/BOOT */
/* for the target in USER code area on the chip divided into USER code area and BOOT area */ /* for the target in USER code area on the chip divided into USER code area and BOOT area */
/* 用于具有用户代码区和引导区的芯片、操作目标为用户代码区的情况, /* 用于具有用户代码区和引导区的芯片、操作目标为用户代码区的情况,
IAP */ IAP */
/* Flash-ROM feature: /* Flash-ROM feature:
for store program code, support block erasing, dword and page writing, dword verifying, unit for Length is byte, for store program code, support block erasing, dword and page writing, dword verifying, unit for Length is byte,