This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TM4C1294NCPDT:TM4C1294在执行系统复位时行为不正确

Guru**** 2455420 points
Other Parts Discussed in Thread: SYSBIOS, ADS1298R

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1129320/tm4c1294ncpdt-tm4c1294-behaves-incorrectly-when-system-reset-is-performed

器件型号:TM4C1294NCPDT
Thread 中讨论的其他器件:SYSBIOSADS1298R

大家好、我的系统复位有问题

问题:

通过移除传感器触发系统复位后、TM4C1294的行为与上电时的行为不同。 当传感器重新插入时、会发生这种情况。  

系统进入空闲循环。 是否有任何解决方案?

详细信息:

-系统使用 RTOS
-传感器连接到设备,可以断开并重新连接,这将触发系统重置
-信号量和任务用于控制函数

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

     您能回答几个问题、因为我对问题描述不清楚。

     -这是定制板吗?

     -当您说正在发出系统复位时,这是通过器件的 RSTN 输入还是软件复位来实现的?

     -传感器是否控制 MCU 的 RSTN 输入?

     -断开并重新连接传感器时,RSTN 的行为是什么?

     -您能否在 LaunchPad 上重现问题?

     -您能在不同的定制板上重复该问题吗?

     -当您说系统进入空闲循环时,请详细说明。 您是说系统复位后、处理器只执行一个空闲任务、所有其他任务都不运行? 空闲循环意味着什么?  

     您能检查 RESBEHAVCTL 寄存器中的 EXTRES 位吗? 默认情况下、RSTN 应生成模拟 POR。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    1 -是的、这是我们制造的定制板、它使用 ADS 和外部数字传感器

    2- 我正在使用 SysCtlReset(); 软件复位。

    3 -外部传感器仅以软件方式对其进行控制、
    我检查外部传感器是否可用、使用 SPI 读取传感器的指示符寄存 器、如果不可用、则我放置一个超时时间将数据发送到 PC、然后在 MCU 上执行软件复位。

    5-我们只有定制板。 它们具有用于连接外部传感器和 ADS 的硬件  

    6 - 是的、我们可以在我们的定制板上重复该操作

    7-空闲循环可能不同的命名空闲任务与 RTOS 一同提供 (idle.c - idle_loop 和 idle_run 函 数)、它也会进入 ti_SYSBIOS_hal_Hwi_checkStack 函数(位于(Hwi_stack.c 文件)中)。 当处理器空闲时间可用时、中间循环被 RTOS 使用。

    8 -当我复制它时、这个空闲循环问题有3种行为、它们相互连接。 我想补充一点

    8.1当我拔下传感器时、复位的延迟超过了它必须的延迟、因为它被延迟、代码进入空闲任务、但随后它以某种方式恢复并执行复位。

    8.2当我重新插入传感器时、它在 ADS 被配置并且数据接收开始后进入空闲循环、 在这种情况下、处理器只执行一个空闲任务并且所有其它任务都没有运行。

    8.3移除传感器并插回、 代码进入永无休止的循环、在此循环中执行以下操作:

    (配置器件、读取数据广告和数字、 执行复位)  

    --------------------------------------

    程序流:

    主:

    设置引脚->设置 SPI 外围设备->配置数字传感器->配置 USB 寄存器->配置流数据包->

    启动 BIOS

    ->信标开始配置 ADS->
    在 ADS 配置任务内部(停止 ADS 数据流->延迟->配置 ADS 2x 以确保已配置寄存器->延迟-> ADS cs 引脚0 ->延迟->信标后启动 ADS 流)->任务启动 ADS 数据流(向 ADS 发送寄存器设置以流式传输数据-> Task_sleep 1)  

    -- 这之后,控制转到中断引脚  

    常量环路:

    ADS drdy->读取数据 AD 和 digi->附加到 USB 缓冲区->将数据发送到 PC

     

    -ADS DRDY 启动信号量后从传感器读取数据:

    Void task_ads1298r_drdy(UArg arg0, UArg arg1) {
    
    	SPI_Transaction ads1298rTransaction;
    	bool transferOK;
    	Uint8 txData[ALL_ADS_FRAME_SIZE];
    	Uint8 rxData[ALL_ADS_FRAME_SIZE + DIGI_SENSx4_DATA_SIZE];
    
    	while(true){
    
    		system_tracker(status_feedback_log);
    
    		status_feedback_log = 10;
    
    		memset(txData, 0xFF, sizeof(txData));
    		memset(rxData, 0, sizeof(rxData));
    
    		// Send address to ADS1298r
    		ads1298rTransaction.count = ALL_ADS_FRAME_SIZE;
    		ads1298rTransaction.txBuf = (Ptr)&txData[0];
    		ads1298rTransaction.rxBuf = (Ptr)&rxData[0];
    
    
    		Semaphore_pend(ads1298r_drdy_sem_handle, BIOS_WAIT_FOREVER);
    
    		transferOK = SPI_transfer(ads1298rSpi, &ads1298rTransaction);
    
    		if (transferOK){
    			GPIO_write(Board_LEDS4, 0);
    		}else{
    			GPIO_write(Board_LEDS4, 1);
    		}
    
    
    		ads_bitshift(&rxData[2*ADS_FRAME_SIZE],2);
    
    		//GPIO_toggle(Board_LEDS4);
    		if((++icm_counter % RAT_4KHZ_1KHZ) == 0){
    			read_icm20602x4_device( &rxData[ALL_ADS_FRAME_SIZE] );
    			GPIO_toggle(Board_LEDS5);
    		}  
    		//GPIO_toggle(Board_LEDS4);
    
    		Mailbox_post(ecg_mailbox_handle, rxData, BIOS_WAIT_FOREVER);
    
    		status_feedback_log = 11;
    
    	}
    
    }

    在该代码中 、调用函数来读取数字传感器、这是它的完整 c 文件:

    // Variables for the restart function
    volatile uint16_t restart_timeout = 0;
    
    // Digital sensors current states are stored in the following variables
    volatile uint8_t digi_sensor_status = 0;
    
    volatile uint8_t digi_sensor_status1 = 0 ;
    volatile uint8_t digi_sensor_status2 = 0 ;
    volatile uint8_t digi_sensor_status3 = 0 ;
    volatile uint8_t digi_sensor_status4 = 0 ;
    
    
    // this is the sensor status after the sensors were initialised
    volatile uint8_t sensors_frozen_stats = 0;
    // this is the sensors status which shows the required sensors
    uint8_t digi_sensors_required = 0;
    
    volatile uint8_t current_state = 0;
    
    
    // reconfiguration variables
    volatile uint8_t current_digi_sensor_id = 0;
    volatile uint8_t digi_sensor_current = 0;
    
    
    #define DIGI_SENSOR_AUTO_RESET 1
    #define DIGI_SENSOR_WARNING_LIGHTS 1
    
    
    // debug function to check which tasks goes after which 
    volatile uint8_t system_tracker_pointer = 0;
    volatile uint8_t system_status[260];
    
    void system_tracker(uint8_t input_state){
    
    	if(system_tracker_pointer >= 0 && system_tracker_pointer <= 254){
    
    		uint8_t buf = system_tracker_pointer +1;
    		system_status[system_tracker_pointer] = input_state;
    		system_status[buf] = 1;
    
    		system_tracker_pointer++;
    	}else{
    		system_tracker_pointer = 0;
    	}
    
    }
    
    
    void configure_digital_sensors(){
    
    	restart_timeout = 0;
    
    	// Current status of the digital sensor
    	digi_sensor_status = 0;
        // warning lights
    	GPIO_write(Board_LED1,1); // turn on yellow LED
    
    	// configure the SPI interface for the DIGITAL Sensors
    	set_SSI1_device(DESIRED_SSI1_CLOCK);
    
    	// Disable all digital sensors
    	disable_digital_sensors();
    
    	delayUs(10);
    	// This initializes the digital sensors
    	main_sensor_init();
    }
    
    void disable_digital_sensors(){
    
    	// Disable all the DIGITAL sensors
    	SSI1_set_cs(DIGI_CS_PORT,DIGI1_CS_PIN);
    	SSI1_cs_off();
    
    	SSI1_set_cs(DIGI_CS_PORT,DIGI2_CS_PIN);
    	SSI1_cs_off();
    
    	SSI1_set_cs(DIGI_CS_PORT,DIGI3_CS_PIN);
    	SSI1_cs_off();
    
    	SSI1_set_cs(DIGI_CS_PORT,DIGI4_CS_PIN);
    	SSI1_cs_off();
    
    }
    
    //SENSOR_ACTIVE_  is a define which hold the place in the byte 0x1,0x2,0x4,0x8
    //SENSOR_ID_ is  a define which represents a number 1,2,3,4 sensors
    
    // Main initialization sequence
    void main_sensor_init(){
    
    	uint8_t curent_digi_sens_state = 0;
    
    	system_tracker(status_feedback_log);
    	status_feedback_log = 20;
    
    	// Simplified status sett
    	digi_sensor_status = 0;
    	digi_sensor_current = 0;
    
    	// ICM1
    	if(initialize_icm20602_sensor(SENSOR_ID_1, INIT_TIMEOUT)){
    		curent_digi_sens_state |=  SENSOR_ACTIVE_1;
    	}
    
    	// ICM2
    	if(initialize_icm20602_sensor(SENSOR_ID_2, INIT_TIMEOUT)){
    		curent_digi_sens_state |= SENSOR_ACTIVE_2;
    	}
    
    	// ICM3
    	if(initialize_icm20602_sensor(SENSOR_ID_3, INIT_TIMEOUT)){
    		curent_digi_sens_state |= SENSOR_ACTIVE_3;
    	}
    
    	// ICM4
    	if(initialize_icm20602_sensor(SENSOR_ID_4, INIT_TIMEOUT)){
    		curent_digi_sens_state |= SENSOR_ACTIVE_4;
    	}
    
    	// Simplified status sett
    	digi_sensor_status = curent_digi_sens_state & 0x0f;
    	digi_sensor_current = digi_sensor_status & 0x0f;
    
    	// Digital sensors status freezing
    	digi_sensor_status1 = (digi_sensor_status >> DIGI_SENSOR_INDEX_1) & 0x01;
    	digi_sensor_status2 = (digi_sensor_status >> DIGI_SENSOR_INDEX_2) & 0x01;
    	digi_sensor_status3 = (digi_sensor_status >> DIGI_SENSOR_INDEX_3) & 0x01;
    	digi_sensor_status4 = (digi_sensor_status >> DIGI_SENSOR_INDEX_4) & 0x01;
    
    	set_sensor_status();
    
    	//	Just clean the DS3 LED after config if sensors good
    	if(sensors_frozen_stats == digi_sensor_status){
    		GPIO_write(Board_LEDS4, 0);
    	}
    	if(sensors_frozen_stats != digi_sensor_status){
    		GPIO_write(Board_LEDS4, 1);
    	}
    
    	status_feedback_log = 21;
    
    }
    
    
    void set_sensor_status(){
    
    	uint8_t stat;
    	stat = digi_sensor_status & 0x0f;
    	
    	GPIO_write(Board_LED1,0); // turn off
    
    	if(stat == 0x0f){		// 1111
    		digi_sensors_required = FOUR_SENSOR_CONFIGURATION; // variable mnot used
    		sensors_frozen_stats = 0x0f;
    		return;
    
    	}else if(stat == 0x03){		// 0011
    		digi_sensors_required = TWO_SENSOR_CONFIGURATION_A;  // variable mnot used
    		sensors_frozen_stats = 0x03;
    		return;
    
    	}else if(stat == 0x0c){		// 1100
    		digi_sensors_required = TWO_SENSOR_CONFIGURATION_B;  // variable mnot used
    		sensors_frozen_stats = 0x0c;
    		return;
    
    	}else if(stat == 0){		// 0000
    
    		GPIO_write(Board_LED1,1);
    
    		sensors_frozen_stats = 0x0f;
    		return;
    
    	}else{
    
    		if(stat == TWO_SENSOR_C_FIRST_PLUGED ||  stat == TWO_SENSOR_C_SECOND_PLUGED){
    
    			digi_sensors_required = TWO_SENSOR_CONFIGURATION_A;  // variable mnot used
    
    			GPIO_write(Board_LED1,1);
    
    			sensors_frozen_stats = 0x03;
    			return; //
    
    
    		} else if(stat == TWO_SENSOR_C_THIRD_PLUGED ||  stat == TWO_SENSOR_C_FOURTH_PLUGED){
    
    			digi_sensors_required = TWO_SENSOR_CONFIGURATION_B;  // variable mnot used
    
    			GPIO_write(Board_LED1,1);
    			
    			sensors_frozen_stats = 0x0c;
    			return;
    		}
    
    		digi_sensors_required = FOUR_SENSOR_CONFIGURATION;  // variable mnot used
    
    		GPIO_write(Board_LED1,1);
    
    		sensors_frozen_stats = 0x0f;
    		return;
    	}
    
    }
    
    //SENSOR_ID_ Defines which sensor will be used   1,2,3,4
    
    // Read all the four sensors
    void read_icm20602x4_device(uint8_t *buffer) {
    
    	status_feedback_log = 14;
    
    	// sensor 1 if device is available read data from it
    	if (digi_sensor_status1){
    		digi_sensor_status1 = read_icm20602_sensor(SENSOR_ID_1, READ_TIMEOUT, buffer);
    	}
    	else{
    		if(isavailable_icm20602(SENSOR_ID_1)){
    			if (check_digi_byte() == 1){
    				digi_sensor_status1 = 1;
    				// no restart
    			}else{
    				// restart indicated
    				digi_sensor_current |= SENSOR_ACTIVE_1;
    			}
    		}
    		else{
    			digi_sensor_current &= ~SENSOR_ACTIVE_1;
    		}
    
    	}
    
    	// sensor 2 if device is available read data from it
    	if (digi_sensor_status2){
    		digi_sensor_status2 = read_icm20602_sensor(SENSOR_ID_2, READ_TIMEOUT, buffer);
    	}
    	else{
    		if(isavailable_icm20602(SENSOR_ID_2)){
    			if (check_digi_byte() == 1){
    				digi_sensor_status2 = 1;
    				// no restart
    			}else{
    				// restart indicated
    				digi_sensor_current |= SENSOR_ACTIVE_2;
    			}
    		}
    		else{
    			digi_sensor_current &= ~SENSOR_ACTIVE_2;
    		}
    
    	}
    
    	// sensor 3 if device is available read data from it
    	if (digi_sensor_status3){
    		digi_sensor_status3 = read_icm20602_sensor(SENSOR_ID_3, READ_TIMEOUT, buffer);
    	}
    	else{
    		if(isavailable_icm20602(SENSOR_ID_3)){
    			if (check_digi_byte() == 1){
    				digi_sensor_status3 = 1;
    				// no restart
    			}else{
    				// restart indicated
    				digi_sensor_current |= SENSOR_ACTIVE_3;
    			}
    		}
    		else{
    			digi_sensor_current &= ~SENSOR_ACTIVE_3;
    		}
    	}
    
    	// sensor 4 if device is available read data from it
    	if (digi_sensor_status4){
    		digi_sensor_status4 = read_icm20602_sensor(SENSOR_ID_4, READ_TIMEOUT, buffer);
    	}
    	else{
    		if(isavailable_icm20602(SENSOR_ID_4)){
    			if (check_digi_byte() == 1){
    				digi_sensor_status4 = 1;
    				//				 no restart/
    			}else{
    				// restart indicated
    				digi_sensor_current |= SENSOR_ACTIVE_4;
    			}
    
    		}
    		else{
    			digi_sensor_current &= ~SENSOR_ACTIVE_4;
    		}
    	}
    
    
    	digi_sensor_status &= 0x00;
    	digi_sensor_status = digi_sensor_status1 << DIGI_SENSOR_INDEX_1 | digi_sensor_status2 << DIGI_SENSOR_INDEX_2 | digi_sensor_status3<< DIGI_SENSOR_INDEX_3 | digi_sensor_status4 << DIGI_SENSOR_INDEX_4;
    
    	//	to debug the status of teh sensors
    	current_state = digi_sensor_status;
    
    
    	if(DIGI_SENSOR_AUTO_RESET){
    
    		if(digi_sensor_status != digi_sensor_current && restart_timeout < 2){
    			// LEDs
    			GPIO_write(Board_LED1,1);
    			GPIO_write(Board_LEDS5,1);
    
    			restart_timeout = 1; // start counter - Enable the resetting variable and function
    		}
    		if (restart_timeout>0) // increment after once the restart_timeout=1
    			restart_timeout++;
    
    		if (restart_timeout>RESTART_TIMEOUT){
    			// Delay and then restart the system
    			restart_system();
    
    			// Maybe to send the restart sequence as a semaphore 
    			// I added this to check if this could fix the problem
    			//Semaphore_post(ads1298r_reset_sem_handle);
    
    		}
    
    	}else{
    		if( digi_sensor_status != sensors_frozen_stats){ // Default frozen state  removed
    
    			// start reconfiguration procedure
    			hot_digi_reconfigure(); // update: digi_sensor_status
    
    			if(digi_sensor_status == sensors_frozen_stats){
    				GPIO_write(Board_LED1, 0);
    				GPIO_write(Board_LEDS5,0);
    			}
    			else{
    				GPIO_write(Board_LED1, 1);
    				GPIO_write(Board_LEDS5,1);
    			}
    		}
    		else{
    			GPIO_write(Board_LED1,0);
    			GPIO_write(Board_LEDS5,0);		// DS4 LED
    		}
    	}
    
    	status_feedback_log = 15;
    
    }
    
    // Restart System
    void restart_system(){
    
    	SysCtlReset();
    
    }

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Robert、

    您是否知道 SW 复位仅执行仿真内部复位? 发现导致复位问题的原因的最佳方法是 CCS 调试。 在传感器代码中设置几个断点、首先在编译之前禁用任何和所有项目优化。 除空闲循环任务或信标之外、在 RTOS 中单步执行存储库函数。 您可能会要求过多的 RTOS 来正确处理软件仿真复位?   

    [引用 userid="448168" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum 1129320/tm4c1294ncppdt-tm4c1294-Beats-corrected-when-system-reset-is-performed"]传感器连接到设备,可以断开连接并重新连接,这会触发系统重置

    为什么在拔下或插入传感器时需要仿真 MCU 复位? 在空闲循环任务期间轮询 SPI 端口或变量值以确定传感器连接状态似乎是有益的。 也许 Charles 可以提供有关如何检查 SPI 外设或传感器连接状态的软件复位以外的选项的见解。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

     我不知道 ADS1298r。 我假设您的代码依赖于 DRDY 来生成中断、以便 可以解除阻止 Task_ads1298r_drdy。 DRDY 是否变为低电平? 它是否会生成中断? 我建议您探测 MCU 和 ADS 之间的信号、并在代码中放置断点、以了解为何不执行某些任务。 对我来说、对于 MCU 上的数字逻辑、POR 和系统复位之间不应有太大的差异。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    大家好、GI、Charles

    我实际上不知道模拟复位意味着什么,我只知道它会复位寄存器并从开始启动固件,如果我不正确,请更正。

    -在我遇到另一个问题的平均时间内,当我尝试在数字读取序列中添加另一行时,在检查来自数字传感器的数据是否就绪之前,我检查传感器 ID 是否正确。

    当我添加此行时、我发送到 PC 的数据损坏。

    后来发现信标和任务的计时相互干扰、现在我很疲惫地去整理执行的任务。

    复位函数看起来没有任何除表外的其他性能、如有其他问题、请予以纠正。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    在针对复位问题测试固件后、发现复位没有问题、但任务的时间和任务执行所需的时间存在问题、 这使得复位问题比现在更加明显。

    对于已执行任务的任务和时间安排、将关闭此帖子并打开另一个帖子。