Initial commit: TC264 smart car project with IPS200 menu system

- IPS200 display menu with real-time status and parameter settings
- Camera image processing and line tracking
- IMU attitude solution and PID control
- WiFi SPI oscilloscope data transmission
This commit is contained in:
32343 committed 2026-05-10 21:38:49 +08:00
commit 843447835d
660 files changed
+443632

No files matched your search

+216
View File
@@ -0,0 +1,216 @@
/*********************************************************************************************************************
* TC264 Opensourec Library (TC264开源库)是一个基于官方 SDK 接口的底层开源库
* Copyright (c) 2022 SEEKFREE 逐飞科技
*
* 本文件是 TC264开源库的一部分
*
* TC264开源库 是免费软件
* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,GNU通用公共许可证)的条款
* 即 GPL 的第3版(或 GPL3.0),或(根据您的选择)任何更高的版本,重新发布和/或修改它
*
* 本开源库的发布是希望它能有所帮助,但不提供任何保证
* 甚至没有默示的适销性或适用于特定用途的保证
* 有关更多详情,请参阅 GPL
*
* 您应该已经与本开源库一起收到一份 GPL 的副本
* 如果没有,请访问 <https://www.gnu.org/licenses/>
*
* 文件名称 cpu0_main
* 公司名称 成都逐飞科技有限公司
* 版本信息 查看 libraries/doc 文件夹下的 version 文件 版本说明
* 开发环境 ADS v1.10.2
* 目标平台 TC264D
* 购买地址 https://seekfree.taobao.com/
*
* 修改记录
* 日期 作者 备注
* 2022-09-15 pudding first version
* 2025-05-01 移植 整合摄像头+电机+编码器+IMU+显示菜单+电池检测
********************************************************************************************************************/
#include "zf_common_headfile.h"
#include "attitude_solution.h"
#include "user_menu.h"
#include "user_menu_device.h"
#include "user_image_process.h"
#include "user_line_process.h"
#include "pid_control.h"
#pragma section all "cpu0_dsram"
// *************************** 硬件引脚定义 ***************************
// 编码器定义 (直接使用驱动库中的枚举值)
// TIM4编码器 — 硬件固定引脚, 仅支持方向模式
#define ENCODER_1_A (TIM4_ENCODER_CH1_P02_8)
#define ENCODER_1_B (TIM4_ENCODER_CH2_P00_9)
// TIM6编码器 — 硬件固定引脚, 仅支持方向模式
#define ENCODER_2_A (TIM6_ENCODER_CH1_P20_3)
#define ENCODER_2_B (TIM6_ENCODER_CH2_P20_0)
// 电机驱动定义 (宏定义在 pid_control.h 中, 此处不再重复)
#define MOTOR_PWM_FREQ (17000)
// 编码器数据
volatile int16 encoder_data_1 = 0;
volatile int16 encoder_data_2 = 0;
// IMU校准标志 (定义在 isr.c)
extern volatile uint8 gyro_calib_ok;
// LED
#define LED (P21_5)
// 系统运行标志
bool car_running = FALSE;
// **************************** 主函数 ****************************
int core0_main(void)
{
clock_init();
debug_init();
// cpu0_dsram 段不会被启动代码自动清零,必须手动初始化
encoder_data_1 = 0;
encoder_data_2 = 0;
car_running = FALSE;
// ==================== 硬件初始化 ====================
// 1. 电池电压检测ADC初始化
adc_init(VOLTAGE_PORT, ADC_12BIT);
// 2. 摄像头初始化 (MT9V03X 单摄像头模式)
// 初始化前清零摄像头状态与缓冲区,避免 cpu0_dsram 段中的随机值干扰
mt9v03x_finish_flag_1 = 0;
mt9v03x_finish_flag_2 = 0;
memset(mt9v03x_image_1, 0, sizeof(mt9v03x_image_1));
memset(mt9v03x_image_2, 0, sizeof(mt9v03x_image_2));
system_delay_ms(800);
if(mt9v03x_double_init(mt9v03x_1))
{
printf("\r\n MT9V03X init failed, retrying...");
for(int retry = 0; retry < 3; retry++)
{
system_delay_ms(800);
if(mt9v03x_double_init(mt9v03x_1) == 0)
break;
printf("\r\n MT9V03X retry %d/3 failed", retry + 1);
}
}
// 关闭 EXTI CH5 (P15_8),该引脚同时连接摄像头2 PCLK 和 WiFi INT,
// 在单摄像头模式下关闭此中断,避免 WiFi 通信产生虚假中断导致画面撕裂
exti_disable(ERU_CH5_REQ1_P15_8);
// 3. 电机驱动GPIO与PWM初始化
gpio_init(MOTOR_DIR1, GPO, GPIO_HIGH, GPO_PUSH_PULL);
gpio_init(MOTOR_DIR2, GPO, GPIO_HIGH, GPO_PUSH_PULL);
pwm_init(MOTOR_PWM1, MOTOR_PWM_FREQ, 0);
pwm_init(MOTOR_PWM2, MOTOR_PWM_FREQ, 0);
pwm_init(VACUUM_PWM, MOTOR_PWM_FREQ, 0); /* 真空泵 */
// 4. 编码器初始化 (方向模式: A相计数 + B相判向)
encoder_dir_init(TIM4_ENCODER, ENCODER_1_A, ENCODER_1_B);
encoder_dir_init(TIM6_ENCODER, ENCODER_2_A, ENCODER_2_B);
encoder_clear_count(TIM4_ENCODER);
encoder_clear_count(TIM6_ENCODER);
// 5. IMU初始化 (IMU660RB,单次初始化)
gpio_init(LED, GPO, GPIO_HIGH, GPO_PUSH_PULL);
if(imu660rb_init() != 0)
{
printf("\r\n IMU660RB init failed.");
}
// 6. 蜂鸣器初始化
gpio_init(BEEP_PIN, GPO, GPIO_LOW, GPO_PUSH_PULL);
// 7. 按键初始化
key_init(20);
// 7.5. 姿态解算初始化 (四元数复位, 须在PIT定时器启动前完成)
attitude_init();
// 7.6. 四轮车速度环与转向环PID初始化
//
// 左/右速度环 (内环, 100ms): 各自编码器速度 → 各自PWM基础值
// 输出限幅为死区之外的调节余量,最终输出会叠加 MOTOR_PWM_DEADBAND
pid_init(&g_pid_speed_left, 0.0f, 1.0f, 0.0f, SPEED_PID_OUT_MAX, -SPEED_PID_OUT_MAX, 100.0f, 1); /* 增量式 */
pid_init(&g_pid_speed_right, 0.0f, 1.0f, 0.0f, SPEED_PID_OUT_MAX, -SPEED_PID_OUT_MAX, 100.0f, 1); /* 增量式 */
// 转向环 (并行, 帧周期): 摄像头中线偏差 → PWM差速
// P项: 中线偏差驱动转向, D项: gyro_z 阻尼抑制过冲
// 输出限幅 ±2000 (差速PWM)
pid_init(&g_pid_steering, 0.0f, 0.0f, 0.0f, 2000.0f, -2000.0f, 0.0f, 0); /* 位置式 */
// 8. PIT定时器初始化
// CCU60_CH0: IMU数据采集 (5ms周期)
// CCU61_CH0: 编码器读取 (100ms周期)
pit_ms_init(CCU60_CH0, 5);
pit_ms_init(CCU61_CH0, 100);
// 9. 显示菜单初始化
user_menu_init();
// ==================== 主循环 ====================
cpu_wait_event_ready();
while (TRUE)
{
/* 陀螺仪校准完成后自动启用速度环与转向环控制 */
if(gyro_calib_ok == 1 && !g_control_enabled)
{
g_control_enabled = TRUE;
printf("\r\n PID control enabled.");
}
// 摄像头帧同步触发
if(mt9v03x_finish_flag_1)
{
uint32 t_frame_start; /* 帧处理起始时刻 (us) */
mt9v03x_finish_flag_1 = 0;
t_frame_start = system_getval_us();
/* 复制帧到共享内存, 并在 CPU0 内完成图像处理 (二值化+边界+中线) */
memcpy(camera_frame_buffer, (const uint8 *)mt9v03x_image_1,
(uint32)(MT9V03X_1_H * MT9V03X_1_W));
/* 大津法二值化 */
int otsu_thr = user_otsu_threshold(camera_frame_buffer, MT9V03X_1_W, MT9V03X_1_H);
user_image_binarize(camera_frame_buffer, image_binary_1,
MT9V03X_1_W, MT9V03X_1_H, otsu_thr);
/* 二值化图像降噪 */
user_image_denoise(image_binary_1, MT9V03X_1_W, MT9V03X_1_H);
/* 边界追踪 + 中线提取 */
line_process_run((uint8 *)image_binary_1);
/* 转向环: 下半部分加权中线偏差 + 陀螺仪 yaw rate → PWM差速 */
if(g_control_enabled && center_line_num > 0)
{
float line_dev = line_compute_weighted_deviation(
(uint16)(MT9V03X_1_W * 0.5f),
(uint16)(MT9V03X_1_H / 2));
cascade_steering_loop(line_dev, g_gyro_z_dps);
}
// 运行菜单循环 (含按键处理、数据显示、图像显示)
user_menu_loop();
// 低电量蜂鸣报警
//low_battery_alarm_check();
// CPU占用率监测: 记录本帧处理耗时
cpu_usage_record_frame(system_getval_us() - t_frame_start);
}
}
}
#pragma section all restore
+85
View File
@@ -0,0 +1,85 @@
/**
* \file Cpu0_Main.h
* \brief System initialization and main program implementation.
*
* \version iLLD_Demos_1_0_1_11_0
* \copyright Copyright (c) 2014 Infineon Technologies AG. All rights reserved.
*
*
* IMPORTANT NOTICE
*
*
* Use of this file is subject to the terms of use agreed between (i) you or
* the company in which ordinary course of business you are acting and (ii)
* Infineon Technologies AG or its licensees. If and as long as no such
* terms of use are agreed, use of this file is subject to following:
* Boost Software License - Version 1.0 - August 17th, 2003
* Permission is hereby granted, free of charge, to any person or
* organization obtaining a copy of the software and accompanying
* documentation covered by this license (the "Software") to use, reproduce,
* display, distribute, execute, and transmit the Software, and to prepare
* derivative works of the Software, and to permit third-parties to whom the
* Software is furnished to do so, all subject to the following:
* The copyright notices in the Software and this entire statement, including
* the above license grant, this restriction and the following disclaimer, must
* be included in all copies of the Software, in whole or in part, and all
* derivative works of the Software, unless such copies or derivative works are
* solely in the form of machine-executable object code generated by a source
* language processor.
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
* SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
* FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*
* \defgroup IfxLld_Demo_STMDemo_SrcDoc Source code documentation
* \ingroup IfxLld_Demo_STMDemo
*
*/
#ifndef CPU0_MAIN_H
#define CPU0_MAIN_H
/******************************************************************************/
/*----------------------------------Includes----------------------------------*/
/******************************************************************************/
#include "Cpu/Std/Ifx_Types.h"
/******************************************************************************/
/*-----------------------------------Macros-----------------------------------*/
/******************************************************************************/
/******************************************************************************/
/*------------------------------Type Definitions------------------------------*/
/******************************************************************************/
typedef struct
{
float32 sysFreq; /**< \brief Actual SPB frequency */
float32 cpuFreq; /**< \brief Actual CPU frequency */
float32 pllFreq; /**< \brief Actual PLL frequency */
float32 stmFreq; /**< \brief Actual STM frequency */
} AppInfo;
/** \brief Application information */
typedef struct
{
AppInfo info; /**< \brief Info object */
} App_Cpu0;
/******************************************************************************/
/*------------------------------Global variables------------------------------*/
/******************************************************************************/
IFX_EXTERN App_Cpu0 g_AppCpu0;
#endif
+52
View File
@@ -0,0 +1,52 @@
/*********************************************************************************************************************
* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库
* Copyright (c) 2022 SEEKFREE 逐飞科技
*
* 本文件是 TC264 开源库的一部分
*
* TC264 开源库 是免费软件
* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款
* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它
*
* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证
* 甚至没有隐含的适销性或适合特定用途的保证
* 更多细节请参见 GPL
*
* 您应该在收到本开源库的同时收到一份 GPL 的副本
* 如果没有,请参阅<https://www.gnu.org/licenses/>
*
* 额外注明:
* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本
* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中
* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件
* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明)
*
* 文件名称 cpu1_main
* 公司名称 成都逐飞科技有限公司
* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明
* 开发环境 ADS v1.10.2
* 适用平台 TC264D
* 店铺链接 https://seekfree.taobao.com/
*
* 修改记录
* 日期 作者 备注
* 2022-09-15 pudding first version
* 2025-05-05 移植 图像处理管线: 自适应二值化+边界中线提取
********************************************************************************************************************/
#include "zf_common_headfile.h"
#pragma section all "cpu1_dsram"
// 将本语句与#pragma section all restore语句之间的全局变量都放在CPU1的RAM中
void core1_main(void)
{
disable_Watchdog(); // 关闭看门狗
interrupt_global_enable(0); // 打开全局中断
cpu_wait_event_ready(); // 等待所有核心初始化完毕
while (TRUE)
{
/* 图像处理已移回 CPU0,CPU1 当前空闲 */
}
}
#pragma section all restore
+393
View File
@@ -0,0 +1,393 @@
/*********************************************************************************************************************
* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库
* Copyright (c) 2022 SEEKFREE 逐飞科技
*
* 本文件是 TC264 开源库的一部分
*
* TC264 开源库 是免费软件
* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款
* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它
*
* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证
* 甚至没有隐含的适销性或适合特定用途的保证
* 更多细节请参见 GPL
*
* 您应该在收到本开源库的同时收到一份 GPL 的副本
* 如果没有,请参阅<https://www.gnu.org/licenses/>
*
* 额外注明:
* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本
* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中
* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件
* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明)
*
* 文件名称 isr
* 公司名称 成都逐飞科技有限公司
* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明
* 开发环境 ADS v1.10.2
* 适用平台 TC264D
* 店铺链接 https://seekfree.taobao.com/
*
* 修改记录
* 日期 作者 备注
* 2022-09-15 pudding first version
********************************************************************************************************************/
#include "isr_config.h"
#include "isr.h"
#include "attitude_solution.h"
#include "pid_control.h"
#include "pid_tuning.h"
// 关于TC系列默认是不支持中断嵌套的,希望支持中断嵌套需要在中断中使用 interrupt_global_enable(0); 来开启中断嵌套
// 简单的说实际上进入中断后TC系列的硬件会自动调用 interrupt_global_disable(); 就不能响应任何的中断,所以需要我们自行手动调用 interrupt_global_enable(0); 来开启中断的响应
// 陀螺仪自动校准状态
// gyro_off 使用 Q8 定点格式 (存储值 = 真实偏移 × 256)
// 避免 EMA 修正量因 int16 截断而丢失 (<1LSB 的修正会累积在定点小数中)
volatile uint16 gyro_calib_cnt = 0;
volatile int32 gyro_sum_x = 0, gyro_sum_y = 0, gyro_sum_z = 0;
volatile int32 gyro_off_x = 0, gyro_off_y = 0, gyro_off_z = 0; // Q8 定点
volatile uint8 gyro_calib_ok = 0;
// CCU60_CH0: 5ms定时中断 - IMU数据采集
IFX_INTERRUPT(cc60_pit_ch0_isr, 0, CCU6_0_CH0_ISR_PRIORITY)
{
interrupt_global_enable(0);
pit_clear_flag(CCU60_CH0);
imu660rb_get_acc();
imu660rb_get_gyro();
// ---------------------------------------------------------------
// 阶段0: 预稳定 (前30次=150ms) — 丢弃数据, 等待传感器内部稳定
// 阶段1: 校准累加 (接下来250次=1.25s) — 求平均零偏
// 阶段2: 运行 — 减零偏 + 漂移跟踪 + Mahony
// ---------------------------------------------------------------
if(gyro_calib_ok == 0)
{
gyro_calib_cnt++;
if(gyro_calib_cnt <= 30)
{
// 阶段0: 丢弃, 传感器上电后需要时间稳定
}
else
{
// 阶段1: 累加
gyro_sum_x += imu660rb_gyro_x;
gyro_sum_y += imu660rb_gyro_y;
gyro_sum_z += imu660rb_gyro_z;
if(gyro_calib_cnt >= 280) // 30预稳定 + 250校准 = 1.4秒
{
gyro_off_x = ((int32)(gyro_sum_x / 250)) << 8; // Q8定点
gyro_off_y = ((int32)(gyro_sum_y / 250)) << 8;
gyro_off_z = ((int32)(gyro_sum_z / 250)) << 8;
gyro_calib_ok = 1;
}
}
}
// 阶段2: 扣除零偏 (Q8定点取整数部分)
{
int16 off_x = (int16)(gyro_off_x >> 8);
int16 off_y = (int16)(gyro_off_y >> 8);
int16 off_z = (int16)(gyro_off_z >> 8);
imu660rb_gyro_x -= off_x;
imu660rb_gyro_y -= off_y;
imu660rb_gyro_z -= off_z;
}
// 阶段3: 静止时跟踪温漂 (Q8定点EMA, 无截断问题)
// 阈值 100LSB≈7°/s, >>7 时间常数 0.64s
if(gyro_calib_ok == 1)
{
int16 cx = imu660rb_gyro_x;
int16 cy = imu660rb_gyro_y;
int16 cz = imu660rb_gyro_z;
int16 ax = cx, ay = cy, az = cz;
if(ax < 0) ax = -ax;
if(ay < 0) ay = -ay;
if(az < 0) az = -az;
if(ax < 100 && ay < 100 && az < 100)
{
// Q8定点EMA: offset_q8 += (raw - offset_int) * 2
// 等效于 >>7 但不会因 int16 截断丢失小修正
int32 raw_x = (int32)cx + (gyro_off_x >> 8);
int32 raw_y = (int32)cy + (gyro_off_y >> 8);
int32 raw_z = (int32)cz + (gyro_off_z >> 8);
gyro_off_x += (raw_x - (gyro_off_x >> 8)) << 1;
gyro_off_y += (raw_y - (gyro_off_y >> 8)) << 1;
gyro_off_z += (raw_z - (gyro_off_z >> 8)) << 1;
}
}
// Mahony互补滤波姿态解算 (校准完成后立即启动)
if(gyro_calib_ok == 1)
{
attitude_update();
/* 四轮车无需直立, 只更新陀螺仪 z 轴角速度 (°/s) 供转向环 D 项使用 */
g_gyro_z_dps = imu660rb_gyro_transition(imu660rb_gyro_z);
}
}
IFX_INTERRUPT(cc60_pit_ch1_isr, 0, CCU6_0_CH1_ISR_PRIORITY)
{
interrupt_global_enable(0);
pit_clear_flag(CCU60_CH1);
/* 此通道暂未使用, 编码器读取已移至 CCU61_CH0 */
}
IFX_INTERRUPT(cc61_pit_ch0_isr, 0, CCU6_1_CH0_ISR_PRIORITY)
{
interrupt_global_enable(0);
pit_clear_flag(CCU61_CH0);
extern volatile int16 encoder_data_1, encoder_data_2;
encoder_data_1 = -encoder_get_count(TIM4_ENCODER);
encoder_clear_count(TIM4_ENCODER);
encoder_data_2 = encoder_get_count(TIM6_ENCODER);
encoder_clear_count(TIM6_ENCODER);
/* 同步菜单参数 → 真实PID (按键调参生效) */
pid_tuning_sync();
/* 四轮车速度环控制: 左/右编码器速度 → 左/右PWM */
cascade_speed_loop(encoder_data_1, encoder_data_2);
/* 发送关键变量到虚拟示波器 (上位机波形显示) */
pid_tuning_scope_output();
}
IFX_INTERRUPT(cc61_pit_ch1_isr, 0, CCU6_1_CH1_ISR_PRIORITY)
{
interrupt_global_enable(0); // 开启中断嵌套
pit_clear_flag(CCU61_CH1);
}
// **************************** PIT中断函数 ****************************
// **************************** 外部中断函数 ****************************
IFX_INTERRUPT(exti_ch0_ch4_isr, 0, EXTI_CH0_CH4_INT_PRIO)
{
interrupt_global_enable(0); // 开启中断嵌套
if(exti_flag_get(ERU_CH4_REQ8_P33_7)) // 通道4中断
{
exti_flag_clear(ERU_CH4_REQ8_P33_7);
camera_vsync_handler_1(); // 摄像头1 场采集统一回调函数
}
if(exti_flag_get(ERU_CH0_REQ0_P15_4)) // 通道0中断
{
exti_flag_clear(ERU_CH0_REQ0_P15_4);
// 注意: 该外部中断为摄像头X中断 请勿使用摄像头 请不要删除该中断函数
// 注意: 该外部中断为摄像头X中断 请勿使用摄像头 请不要删除该中断函数
// 注意: 该外部中断为摄像头X中断 请勿使用摄像头 请不要删除该中断函数
// IMU660RB 不使用外部中断引脚,imu660rc_callback 已移除
}
}
// 关于摄像头pclk引脚默认占用了 1通道用于给DMA提供时钟 这里不再定义中断函数
IFX_INTERRUPT(exti_ch1_ch5_isr, 0, EXTI_CH1_CH5_INT_PRIO)
{
interrupt_global_enable(0); // 开启中断嵌套
if(exti_flag_get(ERU_CH1_REQ10_P14_3)) // 通道1中断
{
exti_flag_clear(ERU_CH1_REQ10_P14_3);
// 注意: 该外部中断为摄像头PCLK 请勿使用摄像头 请不要删除该中断函数
// 注意: 该外部中断为摄像头PCLK 请勿使用摄像头 请不要删除该中断函数
// 注意: 该外部中断为摄像头PCLK 请勿使用摄像头 请不要删除该中断函数
}
if(exti_flag_get(ERU_CH5_REQ1_P15_8)) // 通道5中断
{
exti_flag_clear(ERU_CH5_REQ1_P15_8);
// 注意: 该外部中断为摄像头PCLK 请勿使用摄像头 请不要删除该中断函数
// 注意: 该外部中断为摄像头PCLK 请勿使用摄像头 请不要删除该中断函数
// 注意: 该外部中断为摄像头PCLK 请勿使用摄像头 请不要删除该中断函数
}
}
IFX_INTERRUPT(exti_ch2_ch6_isr, 0, EXTI_CH2_CH6_INT_PRIO)
{
interrupt_global_enable(0); // 开启中断嵌套
if(exti_flag_get(ERU_CH2_REQ7_P00_4)) // 通道2中断
{
exti_flag_clear(ERU_CH2_REQ7_P00_4);
// 注意: 该外部中断为摄像头PCLK 请勿使用摄像头 请不要删除该中断函数
// 注意: 该外部中断为摄像头PCLK 请勿使用摄像头 请不要删除该中断函数
// 注意: 该外部中断为摄像头PCLK 请勿使用摄像头 请不要删除该中断函数
}
if(exti_flag_get(ERU_CH6_REQ9_P20_0)) // 通道6中断
{
exti_flag_clear(ERU_CH6_REQ9_P20_0);
// 注意: 该外部中断为摄像头PCLK 请勿使用摄像头 请不要删除该中断函数
// 注意: 该外部中断为摄像头PCLK 请勿使用摄像头 请不要删除该中断函数
// 注意: 该外部中断为摄像头PCLK 请勿使用摄像头 请不要删除该中断函数
}
}
IFX_INTERRUPT(exti_ch3_ch7_isr, 0, EXTI_CH3_CH7_INT_PRIO)
{
interrupt_global_enable(0); // 开启中断嵌套
if(exti_flag_get(ERU_CH3_REQ3_P10_3)) // 通道3中断
{
exti_flag_clear(ERU_CH3_REQ3_P10_3);
camera_vsync_handler_2(); // 摄像头2场采集统一回调函数
}
if(exti_flag_get(ERU_CH7_REQ16_P15_1)) // 通道7中断
{
exti_flag_clear(ERU_CH7_REQ16_P15_1);
// 注意: 该外部中断为摄像头X中断 请勿使用摄像头 请不要删除该中断函数
// 注意: 该外部中断为摄像头X中断 请勿使用摄像头 请不要删除该中断函数
// 注意: 该外部中断为摄像头X中断 请勿使用摄像头 请不要删除该中断函数
}
}
// **************************** 外部中断函数 ****************************
// **************************** DMA中断函数 ****************************
IFX_INTERRUPT(dma_ch6_isr, 0, DMA_INT_PRIO_1)
{
interrupt_global_enable(0); // 开启中断嵌套
camera_dma_handler_1(); // 摄像头1 采集完成统一回调函数
}
IFX_INTERRUPT(dma_ch7_isr, 0, DMA_INT_PRIO_2)
{
interrupt_global_enable(0); // 开启中断嵌套
camera_dma_handler_2(); // 摄像头2 采集完成统一回调函数
}
// **************************** DMA中断函数 ****************************
// **************************** 串口中断函数 ****************************
// 串口0默认为调试串口
IFX_INTERRUPT(uart0_tx_isr, 0, UART0_TX_INT_PRIO)
{
interrupt_global_enable(0); // 开启中断嵌套
}
IFX_INTERRUPT(uart0_rx_isr, 0, UART0_RX_INT_PRIO)
{
interrupt_global_enable(0); // 开启中断嵌套
#if DEBUG_UART_USE_INTERRUPT // 如果使能了 debug 串口中断
debug_interrupr_handler(); // 处理 debug 串口接收处理函数 数据会被 debug 串口缓存区获取
#endif // 如果修改了 DEBUG_UART_INDEX 这里的代码需要放到对应的串口中断去
}
// 串口1默认连接到摄像头配置串口
IFX_INTERRUPT(uart1_tx_isr, 0, UART1_TX_INT_PRIO)
{
interrupt_global_enable(0); // 开启中断嵌套
}
IFX_INTERRUPT(uart1_rx_isr, 0, UART1_RX_INT_PRIO)
{
interrupt_global_enable(0); // 开启中断嵌套
camera_uart_handler_1(); // 摄像头配置串口统一回调函数
}
// 串口2默认连接到无线转串口模块
IFX_INTERRUPT(uart2_tx_isr, 0, UART2_TX_INT_PRIO)
{
interrupt_global_enable(0); // 开启中断嵌套
}
IFX_INTERRUPT(uart2_rx_isr, 0, UART2_RX_INT_PRIO)
{
interrupt_global_enable(0); // 开启中断嵌套
wireless_module_uart_handler(); // 无线模块统一回调函数
}
// 串口3默认连接到GPS定位模块
IFX_INTERRUPT(uart3_tx_isr, 0, UART3_TX_INT_PRIO)
{
interrupt_global_enable(0); // 开启中断嵌套
}
IFX_INTERRUPT(uart3_rx_isr, 0, UART3_RX_INT_PRIO)
{
interrupt_global_enable(0); // 开启中断嵌套
gnss_uart_callback(); // GNSS串口回调函数
}
// 串口通讯错误中断
IFX_INTERRUPT(uart0_er_isr, 0, UART0_ER_INT_PRIO)
{
interrupt_global_enable(0); // 开启中断嵌套
IfxAsclin_Asc_isrError(&uart0_handle);
}
IFX_INTERRUPT(uart1_er_isr, 0, UART1_ER_INT_PRIO)
{
interrupt_global_enable(0); // 开启中断嵌套
IfxAsclin_Asc_isrError(&uart1_handle);
}
IFX_INTERRUPT(uart2_er_isr, 0, UART2_ER_INT_PRIO)
{
interrupt_global_enable(0); // 开启中断嵌套
IfxAsclin_Asc_isrError(&uart2_handle);
}
IFX_INTERRUPT(uart3_er_isr, 0, UART3_ER_INT_PRIO)
{
interrupt_global_enable(0); // 开启中断嵌套
IfxAsclin_Asc_isrError(&uart3_handle);
}
+52
View File
@@ -0,0 +1,52 @@
/*********************************************************************************************************************
* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库
* Copyright (c) 2022 SEEKFREE 逐飞科技
*
* 本文件是 TC264 开源库的一部分
*
* TC264 开源库 是免费软件
* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款
* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它
*
* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证
* 甚至没有隐含的适销性或适合特定用途的保证
* 更多细节请参见 GPL
*
* 您应该在收到本开源库的同时收到一份 GPL 的副本
* 如果没有,请参阅<https://www.gnu.org/licenses/>
*
* 额外注明:
* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本
* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中
* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件
* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明)
*
* 文件名称 isr
* 公司名称 成都逐飞科技有限公司
* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明
* 开发环境 ADS v1.10.2
* 适用平台 TC264D
* 店铺链接 https://seekfree.taobao.com/
*
* 修改记录
* 日期 作者 备注
* 2022-09-15 pudding first version
********************************************************************************************************************/
#ifndef _isr_h
#define _isr_h
#include "zf_common_headfile.h"
#endif
+117
View File
@@ -0,0 +1,117 @@
/*********************************************************************************************************************
* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库
* Copyright (c) 2022 SEEKFREE 逐飞科技
*
* 本文件是 TC264 开源库的一部分
*
* TC264 开源库 是免费软件
* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款
* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它
*
* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证
* 甚至没有隐含的适销性或适合特定用途的保证
* 更多细节请参见 GPL
*
* 您应该在收到本开源库的同时收到一份 GPL 的副本
* 如果没有,请参阅<https://www.gnu.org/licenses/>
*
* 额外注明:
* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本
* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中
* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件
* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明)
*
* 文件名称 isr_config
* 公司名称 成都逐飞科技有限公司
* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明
* 开发环境 ADS v1.10.2
* 适用平台 TC264D
* 店铺链接 https://seekfree.taobao.com/
*
* 修改记录
* 日期 作者 备注
* 2022-09-15 pudding first version
********************************************************************************************************************/
#ifndef _isr_config_h
#define _isr_config_h
//======================================================特别注意====================================================
// 中断优先级不能设置为相同值,所有中断优先级都必须设置为不一样的值
//======================================================特别注意====================================================
//======================================================特别注意====================================================
// 中断优先级不能设置为相同值,所有中断优先级都必须设置为不一样的值
//======================================================特别注意====================================================
//======================================================特别注意====================================================
// 中断优先级不能设置为相同值,所有中断优先级都必须设置为不一样的值
//======================================================特别注意====================================================
// ISR_PRIORITY: TC264具有255个中断优先级可以设置 1-255,0优先级表示不开启中断,255为最高优先级
// INT_SERVICE: 宏定义决定中断由谁处理,也称为服务提供者(在TC264中,中断被叫做服务),可设置范围IfxSrc_Tos_cpu0 IfxSrc_Tos_cpu1 IfxSrc_Tos_dma 不可设置为其他值
// 如果INT_SERVICE设置为IfxSrc_Tos_dma的话,ISR_PRIORITY的可设置范围则是0-47。
//================================================PIT中断参数相关定义===============================================
#define CCU6_0_CH0_INT_SERVICE IfxSrc_Tos_cpu0 // 定义CCU6_0 PIT通道0中断服务类型,即中断是由谁响应处理 IfxSrc_Tos_cpu0 IfxSrc_Tos_cpu1 IfxSrc_Tos_dma 不可设置为其他值
#define CCU6_0_CH0_ISR_PRIORITY 30 // 定义CCU6_0 PIT通道0中断优先级 优先级范围1-255 越大优先级越高 与平时使用的单片机不一样
#define CCU6_0_CH1_INT_SERVICE IfxSrc_Tos_cpu0
#define CCU6_0_CH1_ISR_PRIORITY 31
#define CCU6_1_CH0_INT_SERVICE IfxSrc_Tos_cpu0
#define CCU6_1_CH0_ISR_PRIORITY 32
#define CCU6_1_CH1_INT_SERVICE IfxSrc_Tos_cpu0
#define CCU6_1_CH1_ISR_PRIORITY 33
//================================================GPIO中断参数相关定义===============================================
// 通道0与通道4是公用一个中断函数 在中断内部通过标志位判断是谁触发的中断
#define EXTI_CH0_CH4_INT_SERVICE IfxSrc_Tos_cpu0 // 定义ERU通道0和通道4中断服务类型,即中断是由谁响应处理 IfxSrc_Tos_cpu0 IfxSrc_Tos_cpu1 IfxSrc_Tos_dma 不可设置为其他值
#define EXTI_CH0_CH4_INT_PRIO 255 // 定义ERU通道0和通道4中断优先级 优先级范围1-255 越大优先级越高 与平时使用的单片机不一样
// 通道1与通道5是公用一个中断函数 在中断内部通过标志位 判断是谁触发的中断
#define EXTI_CH1_CH5_INT_SERVICE IfxSrc_Tos_dma // 定义ERU通道1和通道5中断服务类型,同上
#define EXTI_CH1_CH5_INT_PRIO 7 // 定义ERU通道1和通道5中断优先级 同上
// 通道2与通道6是公用一个中断函数 在中断内部通过标志位 判断是谁触发的中断
#define EXTI_CH2_CH6_INT_SERVICE IfxSrc_Tos_dma // 定义ERU通道2和通道6中断服务类型,同上
#define EXTI_CH2_CH6_INT_PRIO 6 // 定义ERU通道2和通道6中断优先级 可设置范围为0-47
// 通道3与通道7是公用一个中断函数 在中断内部通过标志位 判断是谁触发的中断
#define EXTI_CH3_CH7_INT_SERVICE IfxSrc_Tos_cpu0 // 定义ERU通道3和通道7中断服务类型,同上
#define EXTI_CH3_CH7_INT_PRIO 254 // 定义ERU通道3和通道7中断优先级 同上
//===================================================DMA中断参数相关定义===============================================
#define DMA_INT_SERVICE_1 IfxSrc_Tos_cpu0 // ERU触发DMA中断服务类型,即中断是由谁响应处理 IfxSrc_Tos_cpu0 IfxSrc_Tos_cpu1 IfxSrc_Tos_dma 不可设置为其他值
#define DMA_INT_PRIO_1 0 // ERU触发DMA中断优先级 优先级范围1-255 越大优先级越高 与平时使用的单片机不一样
//===================================================DMA中断参数相关定义===============================================
#define DMA_INT_SERVICE_2 IfxSrc_Tos_cpu0 // ERU触发DMA中断服务类型,即中断是由谁响应处理 IfxSrc_Tos_cpu0 IfxSrc_Tos_cpu1 IfxSrc_Tos_dma 不可设置为其他值
#define DMA_INT_PRIO_2 0 // ERU触发DMA中断优先级 优先级范围1-255 越大优先级越高 与平时使用的单片机不一样
//===================================================串口中断参数相关定义===============================================
#define UART0_INT_SERVICE IfxSrc_Tos_cpu0 // 定义串口0中断服务类型,即中断是由谁响应处理 IfxSrc_Tos_cpu0 IfxSrc_Tos_cpu1 IfxSrc_Tos_dma 不可设置为其他值
#define UART0_TX_INT_PRIO 11 // 定义串口0发送中断优先级 优先级范围1-255 越大优先级越高 与平时使用的单片机不一样
#define UART0_RX_INT_PRIO 10 // 定义串口0接收中断优先级 优先级范围1-255 越大优先级越高 与平时使用的单片机不一样
#define UART0_ER_INT_PRIO 12 // 定义串口0错误中断优先级 优先级范围1-255 越大优先级越高 与平时使用的单片机不一样
#define UART1_INT_SERVICE IfxSrc_Tos_cpu0
#define UART1_TX_INT_PRIO 13
#define UART1_RX_INT_PRIO 14
#define UART1_ER_INT_PRIO 15
#define UART2_INT_SERVICE IfxSrc_Tos_cpu0
#define UART2_TX_INT_PRIO 16
#define UART2_RX_INT_PRIO 17
#define UART2_ER_INT_PRIO 18
#define UART3_INT_SERVICE IfxSrc_Tos_cpu0
#define UART3_TX_INT_PRIO 19
#define UART3_RX_INT_PRIO 20
#define UART3_ER_INT_PRIO 21
#endif