Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
 
1 / 1 / 1
Регистрация: 12.12.2014
Сообщений: 35
1

STM32F407IE работает только в дебаге! Как так?!

02.06.2020, 17:47. Просмотров 344. Ответов 11
Метки нет (Все метки)

Добрый день. Сижу тут уже плачу практически

Есть прошивка для STM32F407IE. Там с внешнего АЦП читаются данные по SPI по 8kSps (по прерыванию EXIT data ready с ноги АЦП на МК), складываются в буфер и отправляются по USART с частотой 64Гц (то бишь 124-125 пачек данных за один цикл в пакет собирается, данные 3х байтовые, т.е. 3000 байт в пакете всего+4 байта допинфы).

Два месяца назад всё было ок, приходило 124-125 пакетов, потом плата была отложена. Через два месяца та же прошивка начала собирать рандомное количество данных в пакет, от 90 до 115 где-то пачек на пакет вместо 124-125 стабильных без видимой закономерности. Причем, кажется по анализатору, что data ready выставляется, а прерывание просто перестает срабатывать на какое-то время (прерывания отправки по USART в этот момент еще нет, и никаких других тоже, ничто не должно мешать).

Более того! Сегодня всё стало еще хуже! При дебаге всё работает, данные отправляются и приходят в терминал, с breakpointами и без останова, часы заводятся внешние без ошибок, с питанием точно всё ок. Данных всё еще неверное количество, но они хотя бы есть.
Но! если отключить плату от программатора и переподключить, сама по себе она перестает работать, сигналов нет ни на SPI, ни на USART никаких. Причем периодически при подключении платы к терминалу начинает вылезать ошибка на рисуночке прикрепленном.

Когда это ошибки нет, порт открывается, но данные не идут и сигналов нигде нет.
Подскажите пожалуйста, в чем может быть причина?
0
Миниатюры
STM32F407IE работает только в дебаге! Как так?!  
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.06.2020, 17:47
Ответы с готовыми решениями:

запрос ajax работает только в дебаге
ajax передает пару параметров которые надо сохранить в бд , но сохраняет только при остановке в...

как сравнить элементы двух массивов, но только так, чтобы первый сравнивался только с первым, второй только со вторым и т.д.?
Подскажите пожалуйста, как сравнить элементы двух массивов, но только так, чтобы первый сравнивался...

Программа работает в дебаге, но не работает в релизе
Программа должна отключать пк, через заданое время, командой консоли shutdown. public...

Как сделать так чтобы выводились только те элементы, которые встречаются только 2 раза?
Как сделать так чтобы выводились только те элементы, которые встречаются только 2 раза? ...

11
2573 / 1165 / 152
Регистрация: 28.10.2011
Сообщений: 4,113
Записей в блоге: 6
02.06.2020, 18:37 2
Цитата Сообщение от ouchouch Посмотреть сообщение
Подскажите пожалуйста, в чем может быть причина?
В коде, в железе, в компе и т. д.

Цитата Сообщение от ouchouch Посмотреть сообщение
При дебаге всё работает, данные отправляются и приходят в терминал, с breakpointами и без останова, часы заводятся внешние без ошибок, с питанием точно всё ок. Данных всё еще неверное количество, но они хотя бы есть.
Вот и разбирайтесь в чем причина. Отладчик должен помочь ее найти.
0
1 / 1 / 1
Регистрация: 12.12.2014
Сообщений: 35
02.06.2020, 18:41  [ТС] 3
Как найти эту причину с помощью отладчика, если в нем всё работает?
0
2573 / 1165 / 152
Регистрация: 28.10.2011
Сообщений: 4,113
Записей в блоге: 6
02.06.2020, 18:58 4
Вы же написали
Цитата Сообщение от ouchouch Посмотреть сообщение
Данных всё еще неверное количество, но они хотя бы есть.
В первую очередь решите эту проблему и возможно поймете в чем основная.
0
Эксперт .NET
6844 / 4452 / 1067
Регистрация: 25.05.2015
Сообщений: 13,613
Записей в блоге: 13
02.06.2020, 19:48 5
ouchouch, самые заметные отличия дебага от релиза - скорость выполнения (в дебаге ниже) и инициализация всех явно не инициализируемых переменных нулями (в релизе нету).
0
Модератор
8195 / 6067 / 809
Регистрация: 14.02.2011
Сообщений: 21,034
02.06.2020, 23:31 6
я бы для начала отключил оптимизацию
потом проверил бы проверку всех задействованных флагов
по симптомам похоже что периферия не успевает за портом
такое было у меня при работе с SPI
Stm32f407 и SPI
0
1 / 1 / 1
Регистрация: 12.12.2014
Сообщений: 35
03.06.2020, 11:47  [ТС] 7
Цитата Сообщение от ValeryS Посмотреть сообщение
я бы для начала отключил оптимизацию
потом проверил бы проверку всех задействованных флагов
по симптомам похоже что периферия не успевает за портом
такое было у меня при работе с SPI
Stm32f407 и SPI
Вот то, что у вас там в теме - очень похоже на правду. Вот кусок моего кода с комментами (на текущий момент это применимо только к работе через отладчик, без него данные не идут никак):
C
1
2
3
4
5
6
7
8
9
10
11
12
13
//!!! Вот тут проверка while (!(SPI1->SR & SPI_SR_RXNE)) не срабатывает, как будто ничего не приходит. Даже при чтении id, который на самом деле приходит,
//причем корректный. Поэтому заменила отправку регистром на HAL-функцию, так - работает, но кушает много времени?
uint8_t UsSPI1_Exchange (uint8_t _data)
{
//  GPIOI->BSRR = GPIO_BSRR_BS7;
    while (!(SPI1->SR & SPI_SR_TXE));
//  SPI1->DR=_data;
//  while (!(SPI1->SR & SPI_SR_TXE));
    HAL_SPI_Transmit(&hspi1,&_data,1,100);
//  while (!(SPI1->SR & SPI_SR_RXNE));
//  GPIOI->BSRR = GPIO_BSRR_BR7;
    return SPI1->DR;
}
Оптимизацию пробовала отрубать, ничего не дает. Вставка строки проверки флага TXE после отправки тоже. Он на ней как раз и провисает вместо RXNE.
0
Модератор
8195 / 6067 / 809
Регистрация: 14.02.2011
Сообщений: 21,034
03.06.2020, 13:06 8
Цитата Сообщение от ouchouch Посмотреть сообщение
Вставка строки проверки флага TXE после отправки тоже.
флаг TXE выставляется когда пуст буфер передатчика но передача вполне себе еще может идти
RXNE выставляется когда закончен прием тюе буфер приемника не пуст
вполне может быть заменен флагом занятости Bysy
исходя из этого вижу вот такую функцию
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
uint8_t UsSPI1_Exchange (uint8_t _data)
{
  GPIOI->BSRR = GPIO_BSRR_BS7;  // выставить ножку CS иначе приемник не среагирует
    while (!(SPI1->SR & SPI_SR_TXE))// ;ждем когда освободится буфер передатчика
    {
      __nop();// необходимо чтобы оптимизатор не выкинул цикл
    };
  SPI1->DR=_data;// закинули данные тем самым начали передачу 
 
 while (!(SPI1->SR & SPI_SR_RXNE))// ждем пока не заполнится буфер приемника 
  {
      __nop();// необходимо чтобы оптимизатор не выкинул цикл
    };
   GPIOI->BSRR = GPIO_BSRR_BR7;// убрать сигнал CS
    return SPI1->DR;// считать принятые данные и вывести их из функции 
}
0
1 / 1 / 1
Регистрация: 12.12.2014
Сообщений: 35
03.06.2020, 17:02  [ТС] 9
Цитата Сообщение от ValeryS Посмотреть сообщение
флаг TXE выставляется когда пуст буфер передатчика но передача вполне себе еще может идти
RXNE выставляется когда закончен прием тюе буфер приемника не пуст
вполне может быть заменен флагом занятости Bysy
исходя из этого вижу вот такую функцию
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
uint8_t UsSPI1_Exchange (uint8_t _data)
{
  GPIOI->BSRR = GPIO_BSRR_BS7;  // выставить ножку CS иначе приемник не среагирует
    while (!(SPI1->SR & SPI_SR_TXE))// ;ждем когда освободится буфер передатчика
    {
      __nop();// необходимо чтобы оптимизатор не выкинул цикл
    };
  SPI1->DR=_data;// закинули данные тем самым начали передачу 
 
 while (!(SPI1->SR & SPI_SR_RXNE))// ждем пока не заполнится буфер приемника 
  {
      __nop();// необходимо чтобы оптимизатор не выкинул цикл
    };
   GPIOI->BSRR = GPIO_BSRR_BR7;// убрать сигнал CS
    return SPI1->DR;// считать принятые данные и вывести их из функции 
}
Продолжает зависать на проверке RXNE.
Работа без отладчика, кстати, возобновилась, после того как снизила объем пересылаемых по USART данных с 3000 байт до 1500 (если использовать в этой функции HALовсикй Transmit и не проверять RXNE)
0
Модератор
8195 / 6067 / 809
Регистрация: 14.02.2011
Сообщений: 21,034
03.06.2020, 17:08 10
Цитата Сообщение от ouchouch Посмотреть сообщение
Продолжает зависать на проверке RXNE.
Работа без отладчика, кстати, возобновилась, после того как снизила объем пересылаемых по USART
мы говорили про spi при чем здесь usart? у него другой механизм работы

Цитата Сообщение от ouchouch Посмотреть сообщение
объем пересылаемых по USART данных с 3000 байт до 1500 (если использовать в этой функции HALовсикй Transmit и не проверять RXNE)
у HAL трансмита для usart выделен буфер, и пока он не заполнится ничего не будет
и им никогда не пользовался, мороки больше чем обработать прерывание
0
1 / 1 / 1
Регистрация: 12.12.2014
Сообщений: 35
03.06.2020, 17:10  [ТС] 11
Цитата Сообщение от ValeryS Посмотреть сообщение
мы говорили про spi при чем здесь usart? у него другой механизм работы


у HAL трансмита для usart выделен буфер, и пока он не заполнится ничего не будет
и им никогда не пользовался, мороки больше чем обработать прерывание
Ну эт я к тому, что проблему получения данных не только через отладчик, но и через терминал без дебага можно отложить.
Сейчас именно вот эта проблема с флагами основная.

Transmit я SPI имела ввиду. Если вот так писать, то всё работает: (но это ж не правильно)
C
1
2
3
4
5
6
7
8
9
10
    ADS129x_CS_ON();
    while (!(SPI1->SR & SPI_SR_TXE))
  {  }
//  SPI1->DR=_data;
//  while (!(SPI1->SR & SPI_SR_TXE));
    HAL_SPI_Transmit(&hspi1,&_data,1,100);
    //while (!(SPI1->SR & SPI_SR_RXNE))
 // {  }
    ADS129x_CS_OFF();
    return SPI1->DR;
0
Модератор
8195 / 6067 / 809
Регистрация: 14.02.2011
Сообщений: 21,034
03.06.2020, 18:08 12
Цитата Сообщение от ouchouch Посмотреть сообщение
но это ж не правильно
конечно же неправильно
если уж так писать то
используй функцию HAL_SPI_TransmitReceive
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.06.2020, 18:08

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

В проекте 4 кнопки, работает только одна. Что делаю не так?
Доброго времени суток! есть проект unit Unit1; interface uses Winapi.Windows,...

Программа при релизе не работает, а при дебаге работает
#include<iostream>; #include <iomanip> #include<fstream> using namespace std; void printMatrix...

Что в коде ни так? while не работает так, как ожидаю
Написанный код, как я думаю, должен выдавать цифры от 0 до 1000, столбиком. Но выдает начиная от...

STM32F407IE, внешний АЦП отрабатывает 72 цикла оцифровки и останавливается)
Дратути) Была плата с STM32F407IET6 и внешним АЦП ADS8411, который по таймеру с частотой 200кГц...

Include не работает так как хочется или как работает инклуд
Доброго времени суток. Имею структуру папок: basic/ libs/ /sumLib.php ...

SelText в textBox'e отчёта не работает или работает не так как в форме?
Пробовал всяко-разно выудить выделенный текст - не выходит. Пишет: "Введенное выражение содержит...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.