Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту


 
Опции темы
Непрочитано 19.06.2017, 10:00  
kampri
Частый гость
 
Регистрация: 05.10.2007
Сообщений: 19
Сказал спасибо: 0
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
kampri на пути к лучшему
По умолчанию STM32L053 HardFault

В целом или лыжи не едут, или лето настало.
Компилятор KEIL 5.23.
При приеме данных по UART получаю регистры uint16 или uint32 и перед записью в EEPROM вынужден переворачивать их. И тут начинается странное.
void flip_reg(uint16_t* ptr_reg, uint8_t len, uint8_t size)
{uint8_t cnt2;
uint32_t* ptr1, ptr2;
if(size == 2)
{cnt2=len››1;
do
{ptr1 = (uint32_t*)(ptr_reg+(cnt2‹‹1));
*(unsigned short*)ptr1 = swap16(*(unsigned short*)ptr1);
}while(cnt2--);
}
и здесь крашиться в HardFault причем даже в асме подозрений нет.
273: *(unsigned short*)ptr1 = swap16(*(unsigned short*)ptr1);
LDRH r0,[r3,#0x00]
BL.W swap16 (0x08004334)
STRH r0,[r3,#0x00]
274: }while(cnt2--);}
поиск пока ничего не дал. Подскажите куда пинать.
Причем заметил, что ЛЮБОЕ преобразование типа вызывает это прерывание.
Реклама:
kampri вне форума  
Непрочитано 19.06.2017, 14:35  
pambaru
Почётный гражданин KAZUS.RU
 
Регистрация: 24.03.2007
Сообщений: 1,329
Сказал спасибо: 85
Сказали Спасибо 595 раз(а) в 361 сообщении(ях)
pambaru на пути к лучшему
По умолчанию Re: STM32L053 HardFault

Возможно из-за преобразования uint16_t* в uint32_t*.
Если адрес в ptr_reg не кратен 4.
Попробуйте преобразовать в (__packed uint32_t*).
pambaru вне форума  
Непрочитано 19.06.2017, 14:46  
pambaru
Почётный гражданин KAZUS.RU
 
Регистрация: 24.03.2007
Сообщений: 1,329
Сказал спасибо: 85
Сказали Спасибо 595 раз(а) в 361 сообщении(ях)
pambaru на пути к лучшему
По умолчанию Re: STM32L053 HardFault

Ну, разумеется, при этом ptr1 должна быть объявлена как
__packed uint32_t *ptr1;

Кстати, а ptr2 без знака "*".
Так и надо, или ошибка?
pambaru вне форума  
Непрочитано 19.06.2017, 14:59  
dgrishin
Почётный гражданин KAZUS.RU
 
Регистрация: 12.02.2013
Сообщений: 1,008
Сказал спасибо: 43
Сказали Спасибо 271 раз(а) в 212 сообщении(ях)
dgrishin на пути к лучшему
По умолчанию Re: STM32L053 HardFault

Сообщение от kampri Посмотреть сообщение
Подскажите куда пинать.
ИМХО вы очень сильно злоупотребляете работой с указателями. Самое простое - считать данные по указателю в локальную переменную функции. Поменять байты местами (в локальной переменной) а потом сохранить новое значение по указателю.
dgrishin вне форума  
Непрочитано 19.06.2017, 15:35  
STM32F0
Заблокирован
 
Регистрация: 22.04.2014
Сообщений: 0
Сказал спасибо: 15
Сказали Спасибо 366 раз(а) в 284 сообщении(ях)
STM32F0 на пути к лучшему
По умолчанию Re: STM32L053 HardFault

Сообщение от kampri Посмотреть сообщение
Компилятор KEIL 5.23.
При приеме данных по UART получаю регистры uint16 или uint32 и перед записью в EEPROM вынужден переворачивать их. И тут начинается странное.
В Ф0 есть причуды при работе с невыравненными данными. В Ф1 может и прокатить, но тоже не всегда. Поэтому меняйте подход в целом.
В кортексах есть команды реверса, но в Ф0 они слегка укошенные. Смотрите в систему команд Ф0 для уточнения.
STM32F0 вне форума  
Непрочитано 19.06.2017, 23:12  
j-Roger
Гражданин KAZUS.RU
 
Регистрация: 17.06.2008
Адрес: Украина
Сообщений: 664
Сказал спасибо: 360
Сказали Спасибо 743 раз(а) в 353 сообщении(ях)
j-Roger на пути к лучшему
По умолчанию Re: STM32L053 HardFault

Вот на всякий случай ссылка на STM32F0xxx Cortex-M0 programming manual;

Раздел 3.4.2 LDR and STR, immediate offset
Раздел 3.3.4 Address alignment
j-Roger вне форума  
Непрочитано 19.06.2017, 23:25  
NewWriter
Почётный гражданин KAZUS.RU
 
Аватар для NewWriter
 
Регистрация: 07.09.2014
Сообщений: 4,418
Сказал спасибо: 395
Сказали Спасибо 2,205 раз(а) в 1,306 сообщении(ях)
NewWriter на пути к лучшему
По умолчанию Re: STM32L053 HardFault

Экую чухню вы наворотили. Начиная с того, что ptr2 не является указателем, он просто переменная.
Ну и сам обмен байтов в 4-байтной переменной выполяется вот так: (для наглядности пишу пошагово)
Код:
  uint32_t abcd = 0x12345678, dcba = 0;
  uint8_t tmp;

  uint8_t *ptr_abcd, *ptr_dcba;

  ptr_abcd = (uint8_t*)&abcd;
  ptr_dcba = (uint8_t*)&dcba;
  ptr_dcba +=3;

  tmp = *(uint8_t*)ptr_abcd++;
  *(uint8_t*)ptr_dcba-- = tmp;

  tmp = *(uint8_t*)ptr_abcd++;
  *(uint8_t*)ptr_dcba-- = tmp;

  tmp = *(uint8_t*)ptr_abcd++;
  *(uint8_t*)ptr_dcba-- = tmp;

  tmp = *(uint8_t*)ptr_abcd;
  *(uint8_t*)ptr_dcba = tmp;


В цикл лучше не заключать - нафик нужна лишняя переменная и работа с ней, если и так всё понятно

Да, если надо определить размерность переменной для "переворота", используем sizeof(), дополнительного параметра размера не надо:
Код:
  if (sizeof(abcd) == 4)
  {
	 // ....
  }
  if (sizeof(abcd) == 2)
  {
	 // ....
  }

Последний раз редактировалось NewWriter; 20.06.2017 в 01:23.
NewWriter вне форума  
Сказали "Спасибо" NewWriter
j-Roger (19.06.2017)
Непрочитано 20.06.2017, 00:35  
H4LF
Вид на жительство
 
Аватар для H4LF
 
Регистрация: 10.06.2007
Сообщений: 429
Сказал спасибо: 34
Сказали Спасибо 51 раз(а) в 47 сообщении(ях)
H4LF на пути к лучшему
По умолчанию Re: STM32L053 HardFault

kampri, а разве соответствующую инструкцию (rev) нельзя использовать? Или просто нужно чтоб посложнее...?
Раздел 3.5.7 REV, REV16, and REVSH
http://www.st.com/content/ccc/resour...DM00104451.pdf
И есть соответствующие функции в CMSIS:
PHP код:
uint32_t __REV(uint32_t value)
uint32_t __REV16(uint32_t value)
int32_t __REVSH(int32_t value
для gcc. И для armcc конечно тоже есть __REV
И вероятность сделать баг на указателях поменьше станет...
H4LF вне форума  
Непрочитано 20.06.2017, 00:58  
dgrishin
Почётный гражданин KAZUS.RU
 
Регистрация: 12.02.2013
Сообщений: 1,008
Сказал спасибо: 43
Сказали Спасибо 271 раз(а) в 212 сообщении(ях)
dgrishin на пути к лучшему
По умолчанию Re: STM32L053 HardFault

uint8_t temp;

union swap{
uint32_t temp32;
uint8_t temp8[4];
} var;

var.temp32 = чего_хотим_посвопить;

temp = var.temp8[0];
var.temp8[0] = var.temp8[3];
var.temp8[3] = temp;

temp = var.temp8[1];
var.temp8[1] = var.temp8[2];
var.temp8[2] = temp;
dgrishin вне форума  
Непрочитано 20.06.2017, 01:04  
STM32F0
Заблокирован
 
Регистрация: 22.04.2014
Сообщений: 0
Сказал спасибо: 15
Сказали Спасибо 366 раз(а) в 284 сообщении(ях)
STM32F0 на пути к лучшему
По умолчанию Re: STM32L053 HardFault

Сообщение от NewWriter Посмотреть сообщение
Экую чухню вы наворотили.
А сам? "Отпусти меня Микрочип, отпусти!"(с)?

Сообщение от H4LF Посмотреть сообщение
для gcc. И для armcc конечно тоже есть __REV
А что... CMSIS для разных компилей может быть разным? Это обёртка для асмовых инструкций, не более.
Сообщение от dgrishin Посмотреть сообщение
uint8_t temp;
Еще лучше и веселее.

Последний раз редактировалось STM32F0; 20.06.2017 в 01:07.
STM32F0 вне форума  
 

Закладки
Опции темы

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программа уходит в HardFault (STM32) valic Песочница (вопросы новичков) 9 26.05.2013 09:15


Часовой пояс GMT +4, время: 10:52.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot