Easyelectronics.ru

Электроника для всех
Текущее время: 23 окт 2019, 03:13

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/10pcs (Любой цвет!)
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 8 ] 
Автор Сообщение
 Заголовок сообщения: Компилятор самовольно предзаполняет регистры посылок bxCan
СообщениеДобавлено: 29 июн 2019, 20:27 
Здравствуйте!

Зарегистрирован: 29 июн 2019, 19:03
Сообщения: 3
Откуда: Красноярск
Друзья! STM32F103C8T после резета в функции main должны отправиться 50шт посылок CAN. То есть, сначала обнуляются все мейлбоксы, а затем по порядку от 1-го до 50-го посылки устанавливаются значениями, а затем отправляются. Каждая по порядку. По факту первой посылки не вижу вообще, зато последняя в двойном экземпляре. Вторая приходит с неправильным 7-м байтом. Все остальные 47 посылок приходят такими, какими я их ждал ))

Посмотрел значения регистров периферии CAN_TDLxR CAN_TDLxR в загруженной прошивке. Пришёл к выводу, что компилятор как бы предугадывая, что предстоит отправлять, заранее прописывает значения посылок в регистры периферии мэйлбоксов. То есть, в регистрах периферии ещё до того, как контроллер запустить, уже какая-то фигня лежит. Причём компилятор делает это начиная с конца очереди, то есть 48, 49 и 50, а даже не 1, 2 и 3. Я подозреваю, что причина вот где-то здесь, так как если не слать никаких посылок из main() ( то есть, не использовать заготовленные константы для содержимого посылок), а принимать значения, например, по USART, а затем отправлять по CAN - то всё работает хорошо. Если кнопкой F10 пробежаться по дебаггеру, то тоже всё выполнится, как я хотел,

но если сделать Run-Stop, то те же косяки никуда не исчезнут.

Функции и команды очистить регистры мэйлбокса типа этой - вообще не сработают.

Код:
for(int i=0; i<3; i++){
   CAN1->sTxMailBox[i].TIR    = 0;
   CAN1->sTxMailBox[i].TDTR =0;       
   CAN1->sTxMailBox[i].TDLR = 0; 
   CAN1->sTxMailBox[i].TDHR = 0;
   
   CAN1->sTxMailBox[i].TIR    &= ~ 0xFFFFFFFF;
   CAN1->sTxMailBox[i].TDTR &= ~ 0xFFFFFFFF;      
   CAN1->sTxMailBox[i].TDLR &= ~ 0xFFFFFFFF;
   CAN1->sTxMailBox[i].TDHR &= ~ 0xFFFFFFFF;
}


Как можно принудительно заставить компилятор ничем не заполнять регистры CAN_TDLxR CAN_TDLxR, сбросить их, а дальше брать значения в соответствии с порядком программы? Перепробовал уже всякое: отключал оптимизацию, инициализацию значений TDLxR TDLxR TIR TDTR через структуры и функции, указатели, использовать только один мэйлбокс. Всё равно компилятор значения того, что предстоит посылать, записывает в периферию заранее... Спасибо за любой совет. Пользуюсь Keil, пробовал компиляторы V5 и V6. STM32F103C8T


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Компилятор самовольно предзаполняет регистры посылок bxCan
СообщениеДобавлено: 29 июн 2019, 23:25 
Старожил
Аватара пользователя

Зарегистрирован: 13 янв 2018, 21:36
Сообщения: 1022
SvetlAlex, чудес не бывает. Компилятор делает ровно то что вы ему написали. Ничего он предугадывать не может, не валите с больной головы на здоровую. Ищите ошибку в коде.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Компилятор самовольно предзаполняет регистры посылок bxCan
СообщениеДобавлено: 30 июн 2019, 14:38 
Здравствуйте!

Зарегистрирован: 29 июн 2019, 19:03
Сообщения: 3
Откуда: Красноярск
VladislavS писал(а):
SvetlAlex, чудес не бывает. Компилятор делает ровно то что вы ему написали. Ничего он предугадывать не может, не валите с больной головы на здоровую. Ищите ошибку в коде.

Ну а что ещё остаётся делать :)) Переделал функцию поиска свободного мэйлбокса. Так, чтобы каждую отправку bxCan по возможности пытался использовать мэйлбокс следующий по счёту, а не текущий. Первая посылка - mailbox0, вторая - mailbox2 и т д... Всё заработало, но это похоже на какой-то костыль (кажется, это так называется).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Компилятор самовольно предзаполняет регистры посылок bxCan
СообщениеДобавлено: 30 июн 2019, 18:50 
Старожил

Зарегистрирован: 26 ноя 2012, 10:28
Сообщения: 4013
Откуда: КЧР, поселок Нижний Архыз
Вот здесь я использую CAN на STM32F042. Косяков никаких не замечено.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Компилятор самовольно предзаполняет регистры посылок bxCan
СообщениеДобавлено: 30 июн 2019, 21:23 
Здравствуйте!

Зарегистрирован: 29 июн 2019, 19:03
Сообщения: 3
Откуда: Красноярск
Eddy_Em писал(а):
Вот здесь я использую CAN на STM32F042. Косяков никаких не замечено.

Спасибо! Помогло.

Код:
CAN_status can_send(uint8_t *msg, uint8_t len, uint16_t target_id){
    if(!noLED) LED_on(LED1); // turn ON LED1 at first data sent/receive
    uint8_t mailbox = 0;
    // check first free mailbox
    if(CAN->TSR & (CAN_TSR_TME)){
        mailbox = (CAN->TSR & CAN_TSR_CODE) >> 24;
    }else{ // no free mailboxes
        return CAN_BUSY;
    }


Вот эта проверка криво срабатывала, если на высокой скорости слать сообщения сплошным потоком :(( Переписал так, чтобы каждую новую посылку старалось сначала класть в последующий мэйлбокс. Так заработало. Костыль?! :(((


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Компилятор самовольно предзаполняет регистры посылок bxCan
СообщениеДобавлено: 01 июл 2019, 13:50 
Заглядывает иногда

Зарегистрирован: 05 дек 2017, 18:17
Сообщения: 162
SvetlAlex, так переделайте как вам надо. Если вы шлете быстрее, чем сообщения физически уходят, ну подождите свободный mailbox, а не уходите с "return CAN_BUSY;"
Подождать, это не обязательно в while() стоять, можно организовать отправку через прерывания. У CAN есть прерывание по свободному mailbox:

The transmit interrupt can be generated by the following events:
– Transmit mailbox 0 becomes empty, RQCP0 bit in the CAN_TSR register set.
– Transmit mailbox 1 becomes empty, RQCP1 bit in the CAN_TSR register set.
– Transmit mailbox 2 becomes empty, RQCP2 bit in the CAN_TSR register set.

Можно его и использовать. В прерывании отправляете очередное сообщение и смотрите, есть ли еще. Как отправили последнее, прерывание отключаете.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Компилятор самовольно предзаполняет регистры посылок bxCan
СообщениеДобавлено: 01 июл 2019, 13:57 
Старожил

Зарегистрирован: 26 ноя 2012, 10:28
Сообщения: 4013
Откуда: КЧР, поселок Нижний Архыз
Можно создать простенькую очередь и заполнять ее сообщениями, а как mailbox освободится, передавать очередное сообщение (это можно делать либо по прерыванию, либо в основном цикле периодически запускать can_send и продвигать указатель на следующее неотосланное сообщение, если возвращает OK.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Компилятор самовольно предзаполняет регистры посылок bxCan
СообщениеДобавлено: 01 июл 2019, 14:01 
Старожил
Аватара пользователя

Зарегистрирован: 13 янв 2018, 21:36
Сообщения: 1022
Ну вот, а то компилятор, компилятор.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 8 ] 

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB