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

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

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

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

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

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


 
Опции темы

STM32L053 HardFault

Непрочитано 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.RUN
 
Регистрация: 24.03.2007
Сообщений: 1,394
Сказал спасибо: 85
Сказали Спасибо 672 раз(а) в 392 сообщении(ях)
pambaru на пути к лучшему
По умолчанию Re: STM32L053 HardFault

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

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

Кстати, а ptr2 без знака "*".
Так и надо, или ошибка?
pambaru вне форума  
Непрочитано 19.06.2017, 14:59  
dgrishin
Почётный гражданин KAZUS.RUN
 
Регистрация: 12.02.2013
Адрес: На болотах
Сообщений: 1,162
Сказал спасибо: 46
Сказали Спасибо 315 раз(а) в 244 сообщении(ях)
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.RUN
 
Регистрация: 17.06.2008
Адрес: Украина
Сообщений: 839
Сказал спасибо: 379
Сказали Спасибо 942 раз(а) в 451 сообщении(ях)
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.RUN
 
Аватар для NewWriter
 
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,481
Сказал спасибо: 396
Сказали Спасибо 2,222 раз(а) в 1,317 сообщении(ях)
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.RUN
 
Регистрация: 12.02.2013
Адрес: На болотах
Сообщений: 1,162
Сказал спасибо: 46
Сказали Спасибо 315 раз(а) в 244 сообщении(ях)
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, время: 20:02.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.