Electricity/USER/mian.c

202 lines
5.0 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
*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)
{
}
}