STM32 новичку в ARM что к чему

Кто любит RISC в жизни, заходим, не стесняемся.
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: STM32 новичку в ARM что к чему

Сообщение VladislavS »

Ярослав555, КЭП! Вы снова с нами?
Реклама
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Re: STM32 новичку в ARM что к чему

Сообщение a5021 »

Еще раз, медленно и печально. Макроопределение

Код: Выделить всё

#define     __O     volatile             /*!< Defines 'write only' permissions */
не порождает write-only конструкции, хоть вы мне еще десять раз подряд опишите, каково назначение volatile. И минусуете вы не разобравшись тоже неизвестно с какого перепугу.
Реклама
Аватара пользователя
bezzabotna
Встал на лапы
Сообщения: 134
Зарегистрирован: Пн ноя 07, 2016 12:14:14

Re: STM32 новичку в ARM что к чему

Сообщение bezzabotna »

Добрый день. Не работает SD карта. Не хочет работать даже f_mount библиотеки FATFS.
Вылетает в HardFault_Handler.

Код: Выделить всё

int main(void)
{

FRESULT res; 
  FATFS fileSystem;
  FIL testFile;
  uint8_t testBuffer[16] = "SD write success";
  UINT testBytes;

  HAL_Init();

  SystemClock_Config();

  MX_GPIO_Init();
  MX_SDIO_SD_Init();
  MX_FATFS_Init();



if(f_mount(&fileSystem, SDPath, 1) != FR_OK)
  {

  Error_Handler();
  }
    uint8_t path[13] = "testfile.txt";
    path[12] = '\0';
 
    res = f_open(&testFile, (char*)path, FA_WRITE | FA_CREATE_ALWAYS);
 
    res = f_write(&testFile, testBuffer, 16, &testBytes);
 
    res = f_close(&testFile);    
  while (1)
  {
    temp++;
  }
}


void MX_SDIO_SD_Init(void)
{

  hsd.Instance = SDIO;
  hsd.Init.ClockEdge = SDIO_CLOCK_EDGE_RISING;
  hsd.Init.ClockBypass = SDIO_CLOCK_BYPASS_DISABLE;
  hsd.Init.ClockPowerSave = SDIO_CLOCK_POWER_SAVE_DISABLE;
  hsd.Init.BusWide = SDIO_BUS_WIDE_1B;
  hsd.Init.HardwareFlowControl = SDIO_HARDWARE_FLOW_CONTROL_DISABLE;
  hsd.Init.ClockDiv = 3;

}
Если в последнем аргументе f_mount выставить 0(отложенное монтирование), то функция конечно выполнится, но следующая выкинет в тот же HardFault_Handler.
Пример стандартный. Периферию настраивал куб. Все компилируется нормально. В чем может быть проблема? Схема подключения во вложении. Ноги соответствуют мк конфигурации CUBE. Внешний кварц на 8 МГЦ даст 30МГц на шину APB1. Контроллер STM32f207

Странно, что куб выставил hsd.Init.BusWide = SDIO_BUS_WIDE_1B для 4 битной шины, но и с hsd.Init.BusWide = SDIO_BUS_WIDE_4B так же вылетает ошибка
Вложения
Без имени.png
(45.97 КБ) 622 скачивания
Я конечно все понимаю, но этого я не понимаю.
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: STM32 новичку в ARM что к чему

Сообщение VladislavS »

Стек с запасом? HardFault на кортекс-м подругому трудно получить.
Реклама
Эиком - электронные компоненты и радиодетали
arkhnchul
Друг Кота
Сообщения: 3092
Зарегистрирован: Пн апр 06, 2015 11:01:53
Откуда: москва, уфа

Re: STM32 новичку в ARM что к чему

Сообщение arkhnchul »

[uquote="a5021",url="/forum/viewtopic.php?p=3432936#p3432936"]Армы наворотили вот таких макросов, только непонятно, с какой целью?[/uquote]
да просто в целях самодокументирования кода, чтобы из объявления переменной сразу было видно, какое оно, без лазания в даташит. Можно бы было сделать и типа вот так, я такое видел - с пустыми макросами

Код: Выделить всё

#define __I 
#define __IO
#define __O
...

__I volatile uint16_t *FOO_register;
__IO volatile uint16_t *BAR_register;
но один фиг все будет volatile, так почему бы и не запихать и его тоже в макрос?
Реклама
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: STM32 новичку в ARM что к чему

Сообщение VladislavS »

a5021, касательно утреннего |= сегодняшний пример с дружественного форума.

Код: Выделить всё

I2C1->CR1 |= I2C_CR1_SWRST; 
I2C1->CR2 &= ~I2C_CR2_FREQ;
I2C1->TRISE =3;
I2C1->CR2 |= 2; 
I2C1->CCR  = 80;   //Clock_Speed   100 000
I2C1->CR1 |= I2C_CR1_PE;
I2C1->CR1 |= I2C_CR1_ACK;
//I2C1->CR1 |= I2C_CR1_SMBTYPE; // 
//I2C1->CR1 |= I2C_CR1_SMBUS;     //
Явление повсеместное, я его даже у настоящих Гуру ловил. Странно ещё, что CCR минула сия чаша.
:cry:
Реклама
Аватара пользователя
Ярослав555
Поставщик валерьянки для Кота
Сообщения: 2081
Зарегистрирован: Пт май 31, 2013 17:14:38
Откуда: Украина, Винница

Re: STM32 новичку в ARM что к чему

Сообщение Ярослав555 »

[uquote="VladislavS",url="/forum/viewtopic.php?p=3433032#p3433032"]Стек с запасом? HardFault на кортекс-м подругому трудно получить.[/uquote]
хард фаулт получается если выйти за рамки массива, обратиться по неиницированому указателю и т.д.

Добавлено after 16 minutes 28 seconds:
[uquote="arkhnchul",url="/forum/viewtopic.php?p=3433041#p3433041"]да просто в целях самодокументирования кода, чтобы из объявления переменной сразу было видно, какое оно, без лазания в даташит.[/uquote]
+ потом, если появятся какие опции для ридонли/врайтонлди регистров, можно просто поправить макрос.
xVekx
Встал на лапы
Сообщения: 125
Зарегистрирован: Вс мар 01, 2009 20:41:19

Re: STM32 новичку в ARM что к чему

Сообщение xVekx »

Здравствуйте, может кто знает при использовании HAL_FLASHEx_Erase при попытки стереть страницу FLASH_WaitForLastOperation впадает в бесконечный цикл, пробовал

Код: Выделить всё

FLASH_Erase_Sector(FLASH_SECTOR_4, VOLTAGE_RANGE_3);
HAL_Delay(100);
работает нормально, интересно почему контроллер не отпускает флаг __HAL_FLASH_GET_FLAG(FLASH_FLAG_BSY) ?
прошивку точно не задеваю.
Спойлер

Код: Выделить всё

HAL_StatusTypeDef STM32_FlashWrite(void *src,void *dst,size_t n)
{
	HAL_StatusTypeDef status;
	//HAL_FLASH_Unlock();
	//if(status != HAL_OK)
	//	goto error;

	for(size_t addr = 0; addr<n; addr++) {
		if(HAL_FLASH_Program(TYPEPROGRAM_BYTE, dst,*(uint8_t *) src) != HAL_OK) {
			goto error;
		}
		dst++;
		src++;
	}

error:
	//HAL_FLASH_Lock();
	return status;
}

HAL_StatusTypeDef STM32_FlashErase1(uint32_t begin,uint32_t count)
{

	HAL_StatusTypeDef status = HAL_FLASH_Unlock();
	if(status != HAL_OK) {
		printf_dbg("STM32_FlashErase Unlock error\n");
		goto error;
	}

	uint32_t PageError = 0;

	FLASH_EraseInitTypeDef EraseInitStruct;

	EraseInitStruct.TypeErase		= TYPEERASE_SECTORS;
	EraseInitStruct.Sector			= FLASH_SECTOR_5;
	EraseInitStruct.NbSectors		= 1;
	EraseInitStruct.VoltageRange	= FLASH_VOLTAGE_RANGE_4;

	status = HAL_FLASHEx_Erase(&EraseInitStruct, &PageError);

	FLASH_Erase_Sector(FLASH_SECTOR_5, VOLTAGE_RANGE_3);
	HAL_Delay(100);

	void *addr = (void*)0x08020000;
	char text[] = "Test Write MEM\n";
	STM32_FlashWrite(text,addr,strlen(text));

error:
	HAL_FLASH_Lock();
	return status;
}

(char*)0x08000000
00|00|03|20|b5|53|00|08|39|53|
(char*)0x08004000
c1|e7|20|46|01|aa|21|49|ff|f7|
(char*)0x08008000
00|00|00|00|00|00|00|00|00|00|
(char*)0x0800C000
6d|65|2f|69|76|61|6e|2f|53|54|
(char*)0x08010000
54|65|73|74|20|57|72|69|74|65|
(char*)0x08020000
54|65|73|74|20|57|72|69|74|65|
(char*)0x08040000
ff|ff|ff|ff|ff|ff|ff|ff|ff|ff|
(char*)0x08060000
ff|ff|ff|ff|ff|ff|ff|ff|ff|ff|

ошибся вместо VOLTAGE_RANGE_3 поставил VOLTAGE_RANGE_4 ...
Аватара пользователя
bezzabotna
Встал на лапы
Сообщения: 134
Зарегистрирован: Пн ноя 07, 2016 12:14:14

Re: STM32 новичку в ARM что к чему

Сообщение bezzabotna »

Проблема решилась. Всему виной переполнение стека. Просто нужно было увеличить его размер.
Я конечно все понимаю, но этого я не понимаю.
uk8amk
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

Re: STM32 новичку в ARM что к чему

Сообщение uk8amk »

Обычно запуск процесса отладки кода включает в себя прошивку памяти, сброс, пуск программы. Таким образом программа всегда начинается с Startup или функции main.
Бывают моменты когда желательно подключиться к странно работающему устройству и посмотреть что там не так. То есть присоединиться без сброса программы.
Недавно слышал что IAR такое позволяет.
Я работаю в Keil 4.74(можно и 5 версию). Пробовал разные настройки ST-link, но что-то не получилось.
Есть ли решение?
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: STM32 новичку в ARM что к чему

Сообщение VladislavS »

Я не работаю в Keil, но с ходу вижу два места где это можно сделать. 1. На вкладке Debug есть галка загружать образ. 2. В настройках ST-Link на вкладке Flash Download есть всё что касается прошивки.
Аватара пользователя
Ярослав555
Поставщик валерьянки для Кота
Сообщения: 2081
Зарегистрирован: Пт май 31, 2013 17:14:38
Откуда: Украина, Винница

Re: STM32 новичку в ARM что к чему

Сообщение Ярослав555 »

[uquote="uk8amk",url="/forum/viewtopic.php?p=3436375#p3436375"]Недавно слышал что IAR такое позволяет.[/uquote]
Есть такое дело. На картинке авр-проект, но уверяю Вас - с STM тоже самое, дома через ST-link пользую. Есть нюанс, что при таком подключении деактивируются все установленные брекпоинты - нужно стать на паузу и проставить их заново, ну или просто поставить в случае стмки.

Добавлено after 8 minutes 1 second:
Кстати, не думал что для этого что-то надо настраивать - всегда работало сразу из коробки.
Вложения
debug.png
(52.05 КБ) 243 скачивания
uk8amk
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

Re: STM32 новичку в ARM что к чему

Сообщение uk8amk »

Вот с такими настройками Keil подключается и шагает только по дизасм коду. Breakpoints не работает.
Если ставлю галочку Load Application at Startup, то отладка по коду СИ тоже работает, но происходит сброс и программа начинается с Startup.
Вложения
settings-debug.PNG
(22.01 КБ) 547 скачиваний
debug.PNG
(15.49 КБ) 231 скачивание
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: STM32 новичку в ARM что к чему

Сообщение VladislavS »

Ярослав555, если бы вы были хоть немного внимательней... Вопрос не про IAR, в нём прямо кнопка есть для этого, а про Keil.
Аватара пользователя
Ярослав555
Поставщик валерьянки для Кота
Сообщения: 2081
Зарегистрирован: Пт май 31, 2013 17:14:38
Откуда: Украина, Винница

Re: STM32 новичку в ARM что к чему

Сообщение Ярослав555 »

я внимательно прочитал, и совершенно точно понял суть вопроса, только ответа у меня на него нет. Автор написал что "слышал" что такое есть, ну я подтвердил эту информацию.
Аватара пользователя
DX168B
Друг Кота
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)
Контактная информация:

Re: STM32 новичку в ARM что к чему

Сообщение DX168B »

Задавал этот вопрос в другой ветке, но там пару дней никто не отвечает. Продублирую тут.

Вопрос по таймеру TIM1 на STM32F407
В даташите (REF. MAN) говорится, что в режиме One Pulse таймер по триггеру запускается и останавливается
как только произойдет событие Update.
Там же (в даташите) говорится, что если в Repetition Counter задать значение больше нуля, то событие Update сгенерируется
только после того, как таймер "прокрутится" N-ное количество раз.
Означает ли это, что если я настрою таймер в One Pulse режим, задам в Repetition Counter к примеру, значение '1',
то таймер "прокрутится" два раза и остановится? (выдав мне два импульса, если я еще буду использовать PWM или Output Compare
для вывода этих импульсов за пределы кристалла)
Задача состоит в том, чтобы таймер выдал два-три (или более) одинаковых по длине импульса и остановился,
при этом дернув DMA для обновления данных в compare регистрах (как их обновить за один пинок DMA - я знаю)
При этом, запуск должен быть по внешнему импульсу, только по фронту, а спад должен игнорироваться,
так как он может произойти в любой момент.

Просто свободная плата с STM32F407 у меня будет только в понедельник следующей недели (может и раньше, но это не точно)
проверил бы сам, однако я делаю схему и печатку и из-за этого момента у меня останавливаются работы со схемой,
пока я не выясню этот момент с таймером. От него зависит схема, причем существенно.
I am DX168B and this is my favourite forum on internet!
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3383
Зарегистрирован: Пн окт 11, 2010 19:00:08

Re: STM32 новичку в ARM что к чему

Сообщение Мурик »

uk8amk писал(а):Обычно запуск процесса отладки кода включает в себя прошивку памяти, сброс, пуск программы. Таким образом программа всегда начинается с Startup или функции main. Бывают моменты когда желательно подключиться к странно работающему устройству и посмотреть что там не так. То есть присоединиться без сброса программы.
Не кеил, но может наведет на какие-то мысли. http://purebasic.mybb.ru/viewtopic.php?id=564#p7600
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: STM32 новичку в ARM что к чему

Сообщение dosikus »

Нет Мурик, ответ неверный. Для этого есть одно решение-Ozone, естественно с Jlink.
uk8amk
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

Re: STM32 новичку в ARM что к чему

Сообщение uk8amk »

Нашёл описание решения для кейла на примере ULINK
µVISION DEBUGGER: Connect to a running target without hardware reset
http://www.keil.com/support/docs/3697.htm
Немного заморочено выглядит правда.
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Re: STM32 новичку в ARM что к чему

Сообщение a5021 »

Теоретически, это может и для ст-линка сработать. В документации на ст-линк описывается режим HOTPLUG, который позволяет подключиться к цели на ходу, без сброса оной.
Ответить

Вернуться в «ARM»