2025-08-13 16:43:29 +08:00
|
|
|
|
/*
|
|
|
|
|
|
*Copyright ,2023 , NANOCHAP
|
|
|
|
|
|
*File name: MIAN.C
|
|
|
|
|
|
*Author:
|
|
|
|
|
|
*Version: V1.0
|
2025-08-20 11:03:53 +08:00
|
|
|
|
*Date: 2023-11-
|
2025-08-29 11:30:52 +08:00
|
|
|
|
*Description: 定时器电刺激综合测试(TIMER0 + 电刺激)
|
2025-08-13 16:43:29 +08:00
|
|
|
|
*Function List:
|
|
|
|
|
|
|
|
|
|
|
|
History:
|
|
|
|
|
|
1.V1.0
|
|
|
|
|
|
Date:
|
|
|
|
|
|
Author:
|
2025-08-29 11:30:52 +08:00
|
|
|
|
Modification: 初版
|
2025-08-13 16:43:29 +08:00
|
|
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
#include "my_header.h"
|
|
|
|
|
|
#include "ENS1_MTP.h"
|
|
|
|
|
|
#include "ENS1_CLOCK.h"
|
|
|
|
|
|
#include "ENS1_UART.h"
|
|
|
|
|
|
#include "ENS1_TIMER.h"
|
|
|
|
|
|
#include "ENS1_GPIO.h"
|
2025-08-20 11:03:53 +08:00
|
|
|
|
#include "ENS1_WAVEGEN.h"
|
|
|
|
|
|
|
2025-08-13 16:43:29 +08:00
|
|
|
|
int main(){
|
2025-08-29 11:30:52 +08:00
|
|
|
|
// 初始化系统
|
2025-08-13 16:43:29 +08:00
|
|
|
|
MTP_init();
|
|
|
|
|
|
ClockInit();
|
2025-08-20 11:03:53 +08:00
|
|
|
|
|
2025-08-29 11:30:52 +08:00
|
|
|
|
// 初始化GPIO19用于定时器指示
|
|
|
|
|
|
GPIO_IO_Init(GPIO_19, OUTPUT, GPIO_OType_PP, GPIO_NOPULL, OUTPUT_FAST, PDRV_4mA, ENABLE);
|
2025-08-13 16:43:29 +08:00
|
|
|
|
GPIO_Output(GPIO_19, LOW_LEVEL);
|
2025-08-20 11:03:53 +08:00
|
|
|
|
|
2025-08-29 11:30:52 +08:00
|
|
|
|
// 初始化UART
|
2025-08-13 16:43:29 +08:00
|
|
|
|
UART_Init(CMSDK_UART1, &UART1_Init);
|
|
|
|
|
|
UART_ITConfig(CMSDK_UART1, &UART1_ITSet);
|
2025-08-20 11:03:53 +08:00
|
|
|
|
|
2025-08-29 11:30:52 +08:00
|
|
|
|
// 初始化定时器(在wavegen_Init之前)
|
2025-08-20 11:03:53 +08:00
|
|
|
|
TIMER0_Init(1);
|
|
|
|
|
|
|
2025-08-29 11:30:52 +08:00
|
|
|
|
// 初始化时间管理器
|
2025-08-20 11:03:53 +08:00
|
|
|
|
Time_Manager_Init();
|
2025-08-29 11:30:52 +08:00
|
|
|
|
|
|
|
|
|
|
// 初始化波形生成器(电刺激)
|
2025-08-20 11:03:53 +08:00
|
|
|
|
wavegen_Init();
|
|
|
|
|
|
|
2025-08-29 11:30:52 +08:00
|
|
|
|
// 配置电刺激参数
|
2025-08-20 11:03:53 +08:00
|
|
|
|
EMS_Config_TypeDef ems_config = {
|
|
|
|
|
|
.frequency = 100, // 100Hz
|
|
|
|
|
|
.duration = 1000, // 1000ms
|
2025-08-29 11:30:52 +08:00
|
|
|
|
.intensity = 128, // 中等强度
|
|
|
|
|
|
.rest_time = 100, // 100ms休息时间
|
|
|
|
|
|
.silent_time = 50, // 50ms静默时间
|
|
|
|
|
|
|
|
|
|
|
|
// 缓进缓出控制参数
|
|
|
|
|
|
.ramp_up_time = 2, // 缓进时间:2秒
|
|
|
|
|
|
.hold_time = 6, // 保持时间:6秒
|
|
|
|
|
|
.ramp_down_time = 2, // 缓出时间:2秒
|
|
|
|
|
|
.enable_ramp = 1 // 启用渐进控制
|
2025-08-20 11:03:53 +08:00
|
|
|
|
};
|
|
|
|
|
|
EMS_Configure(&ems_config);
|
|
|
|
|
|
|
2025-08-29 11:30:52 +08:00
|
|
|
|
// 启动电刺激
|
2025-08-20 11:03:53 +08:00
|
|
|
|
EMS_Start();
|
2025-08-29 11:30:52 +08:00
|
|
|
|
|
2025-08-20 11:03:53 +08:00
|
|
|
|
|
2025-08-29 11:30:52 +08:00
|
|
|
|
static uint8_t ems_control_count = 0; // 电刺激控制计数器
|
|
|
|
|
|
static uint8_t ems_state = 0; // 电刺激状态:0=关闭,1=开启
|
2025-08-20 11:03:53 +08:00
|
|
|
|
|
2025-08-13 16:43:29 +08:00
|
|
|
|
while(1)
|
2025-08-29 11:30:52 +08:00
|
|
|
|
{
|
|
|
|
|
|
// 获取时间标志位
|
2025-08-20 11:03:53 +08:00
|
|
|
|
Time_Flag_TypeDef* time_flags = Time_Manager_GetFlags();
|
|
|
|
|
|
|
2025-08-29 11:30:52 +08:00
|
|
|
|
// 处理电刺激(在主循环中运行)
|
|
|
|
|
|
// 注意:这里不再直接调用EMS_Process(),而是通过状态控制
|
2025-08-20 11:03:53 +08:00
|
|
|
|
|
2025-08-29 11:30:52 +08:00
|
|
|
|
// 基于时间标志位执行不同周期的任务
|
2025-08-20 11:03:53 +08:00
|
|
|
|
if (time_flags->T_2ms) {
|
2025-08-29 11:30:52 +08:00
|
|
|
|
// 2ms周期任务 - 高频控制任务
|
|
|
|
|
|
time_flags->T_2ms = 0; // 清除标志位
|
2025-08-20 11:03:53 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (time_flags->T_10ms) {
|
2025-08-29 11:30:52 +08:00
|
|
|
|
// 10ms周期任务 - 中频控制任务
|
|
|
|
|
|
time_flags->T_10ms = 0; // 清除标志位
|
2025-08-20 11:03:53 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (time_flags->T_100ms) {
|
2025-08-29 11:30:52 +08:00
|
|
|
|
// 100ms周期任务 - 低频控制任务
|
|
|
|
|
|
time_flags->T_100ms = 0; // 清除标志位
|
2025-08-20 11:03:53 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (time_flags->T_1s) {
|
2025-08-29 11:30:52 +08:00
|
|
|
|
// 1s周期任务 - 超低频任务
|
|
|
|
|
|
ems_control_count++; // 每秒递增计数器
|
|
|
|
|
|
|
2025-08-20 11:03:53 +08:00
|
|
|
|
|
2025-08-29 11:30:52 +08:00
|
|
|
|
// 间断性放电控制逻辑
|
2025-08-20 11:03:53 +08:00
|
|
|
|
if (ems_control_count <= 10) {
|
2025-08-29 11:30:52 +08:00
|
|
|
|
// 前10秒:开启电刺激
|
2025-08-20 11:03:53 +08:00
|
|
|
|
if (ems_state == 0) {
|
|
|
|
|
|
ems_state = 1;
|
2025-08-29 11:30:52 +08:00
|
|
|
|
EMS_Start(); // 启动电刺激
|
2025-08-20 11:03:53 +08:00
|
|
|
|
}
|
2025-08-29 11:30:52 +08:00
|
|
|
|
// 处理电刺激
|
2025-08-20 11:03:53 +08:00
|
|
|
|
EMS_Process();
|
|
|
|
|
|
} else if (ems_control_count <= 20) {
|
2025-08-29 11:30:52 +08:00
|
|
|
|
// 后10秒:关闭电刺激
|
2025-08-20 11:03:53 +08:00
|
|
|
|
if (ems_state == 1) {
|
|
|
|
|
|
ems_state = 0;
|
2025-08-29 11:30:52 +08:00
|
|
|
|
EMS_Stop(); // 停止电刺激
|
2025-08-20 11:03:53 +08:00
|
|
|
|
}
|
|
|
|
|
|
} else {
|
2025-08-29 11:30:52 +08:00
|
|
|
|
// 重置计数器,开始新的周期
|
|
|
|
|
|
ems_control_count = 0;
|
2025-08-20 11:03:53 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-08-29 11:30:52 +08:00
|
|
|
|
GPIO_Overturn(GPIO_19); // GPIO19翻转
|
|
|
|
|
|
time_flags->T_1s = 0; // 清除标志位
|
2025-08-20 11:03:53 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-08-29 11:30:52 +08:00
|
|
|
|
// 定时器中断处理在 TIMER0_Handler() 中
|
2025-08-13 16:43:29 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|