202 lines
5.0 KiB
C
202 lines
5.0 KiB
C
/*
|
||
*Copyright ,2023 , NANOCHAP
|
||
*File name: MIAN.C
|
||
*Author:
|
||
*Version: V1.0
|
||
*Date: 2023-11-
|
||
*Description: 定时器电刺激综合测试(TIMER0 + 电刺激)
|
||
*Function List:
|
||
|
||
History:
|
||
1.V1.0
|
||
Date:
|
||
Author:
|
||
Modification: 初版
|
||
|
||
*/
|
||
#include "my_header.h"
|
||
#include "ENS1_MTP.h"
|
||
#include "ENS1_CLOCK.h"
|
||
#include "ENS1_UART.h"
|
||
#include "ENS1_TIMER.h"
|
||
#include "ENS1_GPIO.h"
|
||
#include "ENS1_WAVEGEN.h"
|
||
|
||
// CRC-16-CCITT-FALSE计算函数
|
||
uint16_t CalculateCRC16_CCITT_FALSE(uint8_t *data, uint16_t length)
|
||
{
|
||
uint16_t crc = 0xFFFF; // 初始值为0xFFFF
|
||
for(uint16_t i = 0; i < length; i++)
|
||
{
|
||
crc ^= (uint16_t)(data[i] << 8); // 高字节先处理
|
||
for(uint8_t j = 0; j < 8; j++)
|
||
{
|
||
if(crc & 0x8000)
|
||
{
|
||
crc = (crc << 1) ^ 0x1021; // 多项式0x1021
|
||
}
|
||
else
|
||
{
|
||
crc = crc << 1;
|
||
}
|
||
}
|
||
}
|
||
return crc;
|
||
}
|
||
|
||
|
||
// UART数据接收函数 - 轮询方式
|
||
void UART_ReceiveData(void)
|
||
{
|
||
// 检查接收FIFO并读取所有可用的数据
|
||
while(!UART_RX_FIFO_EMPTY(CMSDK_UART1))
|
||
{
|
||
uint8_t received_data = READ_UART_RCVBuff(CMSDK_UART1); // 读取接收数据
|
||
if(uart_rx_count < sizeof(uart_rx_buffer)) // 防止缓冲区溢出
|
||
{
|
||
uart_rx_buffer[uart_rx_count] = received_data;
|
||
uart_rx_count++;
|
||
uart_data_ready = 1; // 设置数据就绪标志
|
||
}
|
||
else
|
||
{
|
||
// 缓冲区溢出处理
|
||
uart_rx_count = 0; // 重置计数器
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
|
||
// 增强的中断接收函数
|
||
void UART_ReceiveDataFromISR(void)
|
||
{
|
||
if(!UART_RX_FIFO_EMPTY(CMSDK_UART1))
|
||
{
|
||
uint8_t received_data = READ_UART_RCVBuff(CMSDK_UART1);
|
||
if(uart_rx_count < sizeof(uart_rx_buffer))
|
||
{
|
||
uart_rx_buffer[uart_rx_count] = received_data;
|
||
uart_rx_count++;
|
||
// 注意:在中断中不建议使用printf,只设置标志
|
||
uart_data_ready = 1;
|
||
}
|
||
}
|
||
}
|
||
|
||
// UART数据发送函数(可选的)
|
||
void UART_SendData(uint8_t data)
|
||
{
|
||
if(!UART_TX_FIFO_FULL(CMSDK_UART1)) // 如果发送FIFO未满
|
||
{
|
||
WRITE_UART_THRBuff(CMSDK_UART1, data);
|
||
}
|
||
}
|
||
|
||
// UART数据包解析函数
|
||
uint8_t ParseUART_EMS_Packet(uint8_t *data, uint16_t length, UART_EMS_Packet_t *packet)
|
||
{
|
||
// 解析数据包(注意字节序)
|
||
packet->function_code = (data[1] << 8) | data[0]; // 小端序
|
||
packet->data_length = (data[3] << 8) | data[2];
|
||
packet->switch_type = data[4];
|
||
packet->intensity = data[5];
|
||
packet->frequency = (data[7] << 8) | data[6];
|
||
packet->duration = (data[9] << 8) | data[8];
|
||
packet->rest_time = (data[11] << 8) | data[10];
|
||
packet->silent_time = (data[13] << 8) | data[12];
|
||
packet->ramp_up_time = data[14];
|
||
packet->hold_time = data[15];
|
||
packet->ramp_down_time = data[16];
|
||
packet->crc16 = (data[18] << 8) | data[17];
|
||
|
||
// CRC-16-CCITT-FALSE校验(对前17字节进行校验,不包括CRC本身)
|
||
uint16_t calculated_crc = CalculateCRC16_CCITT_FALSE(data, 17);
|
||
/*if(calculated_crc != packet->crc16)
|
||
{
|
||
return 0;
|
||
}*/
|
||
|
||
// 功能码检查
|
||
|
||
return 1; // 解析成功
|
||
}
|
||
|
||
// 根据UART数据包更新电刺激配置
|
||
void UpdateEMS_ConfigFromUART(UART_EMS_Packet_t *packet)
|
||
{
|
||
// 检查开关状态
|
||
if(packet->switch_type == 0x00)
|
||
{
|
||
EMS_Stop();
|
||
return;
|
||
}
|
||
|
||
// 检查电刺激类型 (0x10~0x1F)
|
||
if(packet->switch_type < 0x10 || packet->switch_type > 0x1F)
|
||
{
|
||
return;
|
||
}
|
||
|
||
// 创建新的电刺激配置
|
||
EMS_Config_TypeDef new_config = {
|
||
.frequency = packet->frequency,
|
||
.duration = packet->duration,
|
||
.intensity = packet->intensity,
|
||
.rest_time = packet->rest_time,
|
||
.silent_time = packet->silent_time,
|
||
.ramp_up_time = packet->ramp_up_time,
|
||
.hold_time = packet->hold_time,
|
||
.ramp_down_time = packet->ramp_down_time,
|
||
.enable_ramp = 1 // 启用渐进控制
|
||
};
|
||
|
||
// 打印接收到的参数数据
|
||
printf("0x%02X\n", packet->switch_type);
|
||
printf("%d\n", packet->intensity);
|
||
printf("%d\n", packet->frequency);
|
||
printf("%d\n", packet->duration);
|
||
printf("%d\n", packet->rest_time);
|
||
printf("%d\n", packet->silent_time);
|
||
printf("%d\n", packet->ramp_up_time);
|
||
printf("%d\n", packet->hold_time);
|
||
printf("%d\n", packet->ramp_down_time);
|
||
|
||
// 应用新配置
|
||
EMS_Configure(&new_config);
|
||
|
||
// 启动电刺激
|
||
EMS_Start();
|
||
|
||
}
|
||
|
||
int main(){
|
||
// 初始化系统
|
||
MTP_init();
|
||
ClockInit();
|
||
|
||
// 初始化GPIO19用于定时器指示
|
||
GPIO_IO_Init(GPIO_19, OUTPUT, GPIO_OType_PP, GPIO_NOPULL, OUTPUT_FAST, PDRV_4mA, ENABLE);
|
||
GPIO_Output(GPIO_19, LOW_LEVEL);
|
||
|
||
// 初始化UART
|
||
UART_Init(CMSDK_UART1, &UART1_Init);
|
||
UART_ITConfig(CMSDK_UART1, &UART1_ITSet);
|
||
|
||
// 配置电刺激参数
|
||
EMS_Configure(&ems_config);
|
||
// 初始化时间管理器
|
||
Time_Manager_Init();
|
||
// 初始化定时器(在wavegen_Init之前)
|
||
TIMER0_Init(1);
|
||
|
||
// 初始化波形生成器(电刺激)- 必须先初始化
|
||
wavegen_Init();
|
||
// 启动电刺激
|
||
EMS_Start();
|
||
|
||
while(1)
|
||
{
|
||
}
|
||
|
||
}
|