Thread 中讨论的其他器件:SYSBIOS、 ADS1298R
大家好、我的系统复位有问题
问题:
通过移除传感器触发系统复位后、TM4C1294的行为与上电时的行为不同。 当传感器重新插入时、会发生这种情况。
系统进入空闲循环。 是否有任何解决方案?
详细信息:
-系统使用 RTOS
-传感器连接到设备,可以断开并重新连接,这将触发系统重置
-信号量和任务用于控制函数
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.
大家好、我的系统复位有问题
问题:
通过移除传感器触发系统复位后、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 外设或传感器连接状态的软件复位以外的选项的见解。
大家好、GI、Charles
我实际上不知道模拟复位意味着什么,我只知道它会复位寄存器并从开始启动固件,如果我不正确,请更正。
-在我遇到另一个问题的平均时间内,当我尝试在数字读取序列中添加另一行时,在检查来自数字传感器的数据是否就绪之前,我检查传感器 ID 是否正确。
当我添加此行时、我发送到 PC 的数据损坏。
后来发现信标和任务的计时相互干扰、现在我很疲惫地去整理执行的任务。
复位函数看起来没有任何除表外的其他性能、如有其他问题、请予以纠正。