STM32 новичку в ARM что к чему
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: STM32 новичку в ARM что к чему
Ярослав555, КЭП! Вы снова с нами?
- Реклама
Re: STM32 новичку в ARM что к чему
Еще раз, медленно и печально. Макроопределение
не порождает write-only конструкции, хоть вы мне еще десять раз подряд опишите, каково назначение volatile. И минусуете вы не разобравшись тоже неизвестно с какого перепугу.
Код: Выделить всё
#define __O volatile /*!< Defines 'write only' permissions */- bezzabotna
- Встал на лапы
- Сообщения: 134
- Зарегистрирован: Пн ноя 07, 2016 12:14:14
Re: STM32 новичку в ARM что к чему
Добрый день. Не работает SD карта. Не хочет работать даже f_mount библиотеки FATFS.
Вылетает в HardFault_Handler.
Если в последнем аргументе 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 так же вылетает ошибка
Вылетает в 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;
}
Пример стандартный. Периферию настраивал куб. Все компилируется нормально. В чем может быть проблема? Схема подключения во вложении. Ноги соответствуют мк конфигурации 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 что к чему
Стек с запасом? HardFault на кортекс-м подругому трудно получить.
Re: STM32 новичку в ARM что к чему
[uquote="a5021",url="/forum/viewtopic.php?p=3432936#p3432936"]Армы наворотили вот таких макросов, только непонятно, с какой целью?[/uquote]
да просто в целях самодокументирования кода, чтобы из объявления переменной сразу было видно, какое оно, без лазания в даташит. Можно бы было сделать и типа вот так, я такое видел - с пустыми макросами
но один фиг все будет volatile, так почему бы и не запихать и его тоже в макрос?
да просто в целях самодокументирования кода, чтобы из объявления переменной сразу было видно, какое оно, без лазания в даташит. Можно бы было сделать и типа вот так, я такое видел - с пустыми макросами
Код: Выделить всё
#define __I
#define __IO
#define __O
...
__I volatile uint16_t *FOO_register;
__IO volatile uint16_t *BAR_register;- Реклама
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: STM32 новичку в ARM что к чему
a5021, касательно утреннего |= сегодняшний пример с дружественного форума.
Явление повсеместное, я его даже у настоящих Гуру ловил. Странно ещё, что CCR минула сия чаша.

Код: Выделить всё
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; //
- Ярослав555
- Поставщик валерьянки для Кота
- Сообщения: 2081
- Зарегистрирован: Пт май 31, 2013 17:14:38
- Откуда: Украина, Винница
Re: STM32 новичку в ARM что к чему
[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]
+ потом, если появятся какие опции для ридонли/врайтонлди регистров, можно просто поправить макрос.
хард фаулт получается если выйти за рамки массива, обратиться по неиницированому указателю и т.д.
Добавлено after 16 minutes 28 seconds:
[uquote="arkhnchul",url="/forum/viewtopic.php?p=3433041#p3433041"]да просто в целях самодокументирования кода, чтобы из объявления переменной сразу было видно, какое оно, без лазания в даташит.[/uquote]
+ потом, если появятся какие опции для ридонли/врайтонлди регистров, можно просто поправить макрос.
Re: STM32 новичку в ARM что к чему
Здравствуйте, может кто знает при использовании HAL_FLASHEx_Erase при попытки стереть страницу FLASH_WaitForLastOperation впадает в бесконечный цикл, пробовал
работает нормально, интересно почему контроллер не отпускает флаг __HAL_FLASH_GET_FLAG(FLASH_FLAG_BSY) ?
прошивку точно не задеваю.
ошибся вместо VOLTAGE_RANGE_3 поставил VOLTAGE_RANGE_4 ...
Код: Выделить всё
FLASH_Erase_Sector(FLASH_SECTOR_4, VOLTAGE_RANGE_3);
HAL_Delay(100);
прошивку точно не задеваю.
Спойлер
Код: Выделить всё
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|
- bezzabotna
- Встал на лапы
- Сообщения: 134
- Зарегистрирован: Пн ноя 07, 2016 12:14:14
Re: STM32 новичку в ARM что к чему
Проблема решилась. Всему виной переполнение стека. Просто нужно было увеличить его размер.
Я конечно все понимаю, но этого я не понимаю.
-
uk8amk
- Поставщик валерьянки для Кота
- Сообщения: 2222
- Зарегистрирован: Вт ноя 27, 2007 11:32:06
- Откуда: Tashkent
Re: STM32 новичку в ARM что к чему
Обычно запуск процесса отладки кода включает в себя прошивку памяти, сброс, пуск программы. Таким образом программа всегда начинается с Startup или функции main.
Бывают моменты когда желательно подключиться к странно работающему устройству и посмотреть что там не так. То есть присоединиться без сброса программы.
Недавно слышал что IAR такое позволяет.
Я работаю в Keil 4.74(можно и 5 версию). Пробовал разные настройки ST-link, но что-то не получилось.
Есть ли решение?
Бывают моменты когда желательно подключиться к странно работающему устройству и посмотреть что там не так. То есть присоединиться без сброса программы.
Недавно слышал что IAR такое позволяет.
Я работаю в Keil 4.74(можно и 5 версию). Пробовал разные настройки ST-link, но что-то не получилось.
Есть ли решение?
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: STM32 новичку в ARM что к чему
Я не работаю в Keil, но с ходу вижу два места где это можно сделать. 1. На вкладке Debug есть галка загружать образ. 2. В настройках ST-Link на вкладке Flash Download есть всё что касается прошивки.
- Ярослав555
- Поставщик валерьянки для Кота
- Сообщения: 2081
- Зарегистрирован: Пт май 31, 2013 17:14:38
- Откуда: Украина, Винница
Re: STM32 новичку в ARM что к чему
[uquote="uk8amk",url="/forum/viewtopic.php?p=3436375#p3436375"]Недавно слышал что IAR такое позволяет.[/uquote]
Есть такое дело. На картинке авр-проект, но уверяю Вас - с STM тоже самое, дома через ST-link пользую. Есть нюанс, что при таком подключении деактивируются все установленные брекпоинты - нужно стать на паузу и проставить их заново, ну или просто поставить в случае стмки.
Добавлено after 8 minutes 1 second:
Кстати, не думал что для этого что-то надо настраивать - всегда работало сразу из коробки.
Есть такое дело. На картинке авр-проект, но уверяю Вас - с STM тоже самое, дома через ST-link пользую. Есть нюанс, что при таком подключении деактивируются все установленные брекпоинты - нужно стать на паузу и проставить их заново, ну или просто поставить в случае стмки.
Добавлено after 8 minutes 1 second:
Кстати, не думал что для этого что-то надо настраивать - всегда работало сразу из коробки.
- Вложения
-
- debug.png
- (52.05 КБ) 243 скачивания
-
uk8amk
- Поставщик валерьянки для Кота
- Сообщения: 2222
- Зарегистрирован: Вт ноя 27, 2007 11:32:06
- Откуда: Tashkent
Re: STM32 новичку в ARM что к чему
Вот с такими настройками Keil подключается и шагает только по дизасм коду. Breakpoints не работает.
Если ставлю галочку Load Application at Startup, то отладка по коду СИ тоже работает, но происходит сброс и программа начинается с Startup.
Если ставлю галочку 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 что к чему
Ярослав555, если бы вы были хоть немного внимательней... Вопрос не про IAR, в нём прямо кнопка есть для этого, а про Keil.
- Ярослав555
- Поставщик валерьянки для Кота
- Сообщения: 2081
- Зарегистрирован: Пт май 31, 2013 17:14:38
- Откуда: Украина, Винница
Re: STM32 новичку в ARM что к чему
я внимательно прочитал, и совершенно точно понял суть вопроса, только ответа у меня на него нет. Автор написал что "слышал" что такое есть, ну я подтвердил эту информацию.
- DX168B
- Друг Кота
- Сообщения: 4468
- Зарегистрирован: Вс янв 24, 2010 19:19:52
- Откуда: Главный Улей России (Moscow)
- Контактная информация:
Re: STM32 новичку в ARM что к чему
Задавал этот вопрос в другой ветке, но там пару дней никто не отвечает. Продублирую тут.
Вопрос по таймеру TIM1 на STM32F407
В даташите (REF. MAN) говорится, что в режиме One Pulse таймер по триггеру запускается и останавливается
как только произойдет событие Update.
Там же (в даташите) говорится, что если в Repetition Counter задать значение больше нуля, то событие Update сгенерируется
только после того, как таймер "прокрутится" N-ное количество раз.
Означает ли это, что если я настрою таймер в One Pulse режим, задам в Repetition Counter к примеру, значение '1',
то таймер "прокрутится" два раза и остановится? (выдав мне два импульса, если я еще буду использовать PWM или Output Compare
для вывода этих импульсов за пределы кристалла)
Задача состоит в том, чтобы таймер выдал два-три (или более) одинаковых по длине импульса и остановился,
при этом дернув DMA для обновления данных в compare регистрах (как их обновить за один пинок DMA - я знаю)
При этом, запуск должен быть по внешнему импульсу, только по фронту, а спад должен игнорироваться,
так как он может произойти в любой момент.
Просто свободная плата с STM32F407 у меня будет только в понедельник следующей недели (может и раньше, но это не точно)
проверил бы сам, однако я делаю схему и печатку и из-за этого момента у меня останавливаются работы со схемой,
пока я не выясню этот момент с таймером. От него зависит схема, причем существенно.
Вопрос по таймеру 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!
Re: STM32 новичку в ARM что к чему
Не кеил, но может наведет на какие-то мысли. http://purebasic.mybb.ru/viewtopic.php?id=564#p7600uk8amk писал(а):Обычно запуск процесса отладки кода включает в себя прошивку памяти, сброс, пуск программы. Таким образом программа всегда начинается с Startup или функции main. Бывают моменты когда желательно подключиться к странно работающему устройству и посмотреть что там не так. То есть присоединиться без сброса программы.
Re: STM32 новичку в ARM что к чему
Нет Мурик, ответ неверный. Для этого есть одно решение-Ozone, естественно с Jlink.
-
uk8amk
- Поставщик валерьянки для Кота
- Сообщения: 2222
- Зарегистрирован: Вт ноя 27, 2007 11:32:06
- Откуда: Tashkent
Re: STM32 новичку в ARM что к чему
Нашёл описание решения для кейла на примере ULINK
Немного заморочено выглядит правда.
http://www.keil.com/support/docs/3697.htmµVISION DEBUGGER: Connect to a running target without hardware reset
Немного заморочено выглядит правда.
Re: STM32 новичку в ARM что к чему
Теоретически, это может и для ст-линка сработать. В документации на ст-линк описывается режим HOTPLUG, который позволяет подключиться к цели на ходу, без сброса оной.


