STM32 новичку в ARM что к чему
- Реклама
- Alexey_N
- Сверлит текстолит когтями
- Сообщения: 1273
- Зарегистрирован: Вт фев 01, 2011 17:56:40
- Откуда: г. Жуковка, Брянская обл.
Re: STM32 новичку в ARM что к чему
Подскажите, почему МК сваливается в hard fault на любой инструкции после push? (stm32f103)
Индукционный нагреватель - 20% (наладка). TIG сварка - 10% (детальки)
ВЧ генератор 150МГц - 80% (наладка). Мостовой ИИП - 40% (подкл. ОС).
ВЧ генератор 150МГц - 80% (наладка). Мостовой ИИП - 40% (подкл. ОС).
Re: STM32 новичку в ARM что к чему
Ну самое очевидное то что ?Alexey_N писал(а):Подскажите, почему МК сваливается в hard fault на любой инструкции после push? (stm32f103)
Посмотреть, куда SP показывает.
Очень вероятно, вообще за пределы SRAMа -))
- Alexey_N
- Сверлит текстолит когтями
- Сообщения: 1273
- Зарегистрирован: Вт фев 01, 2011 17:56:40
- Откуда: г. Жуковка, Брянская обл.
Re: STM32 новичку в ARM что к чему
А да, точно! Сглупил я, вместо вершины 0x20005000 указал 0x20050000, а там то всего 20Кб 
Возникла новая проблема с objdump при дизассемблировании, но исходник создается все же:
Возникла новая проблема с objdump при дизассемблировании, но исходник создается все же:
Код: Выделить всё
BFD: main103: invalid string offset 536870912 >= 548 for section `.strtab'Индукционный нагреватель - 20% (наладка). TIG сварка - 10% (детальки)
ВЧ генератор 150МГц - 80% (наладка). Мостовой ИИП - 40% (подкл. ОС).
ВЧ генератор 150МГц - 80% (наладка). Мостовой ИИП - 40% (подкл. ОС).
- Andrew Martin
- Вымогатель припоя
- Сообщения: 606
- Зарегистрирован: Вт июн 25, 2013 18:45:07
Re: STM32 новичку в ARM что к чему
Как показал опыт, нужно ковырять fasmarm.
Почему-то очень много багов в таблице символов.
Исходник и эльф в студию
Почему-то очень много багов в таблице символов.
Исходник и эльф в студию
- Реклама
- Andrew Martin
- Вымогатель припоя
- Сообщения: 606
- Зарегистрирован: Вт июн 25, 2013 18:45:07
Re: STM32 новичку в ARM что к чему
To dosikus
Спасибо за правильную подсказку, дошли руки и сделал наконец одиночные транзакции через SPI по вашему рецепту (с вычитыванием приёмного буфера). Теперь работает
Но появился новый вопрос.
Как в STM32F0F4P6 организовать SPI для посылки буфера с помощью DMA?
Нужно вручную и достаточно редко пинать DMA, чтобы выплёвывать N байт с заранее определённого буфера. Приём данных не нужен. Прерывания TC не нужны.
Сейчас сделано так (псевдокод):
CR1 = SPI_CR1_MSTR+SPI_CR1_BR_0+SPI_CR1_BR_1+SPI_CR1_BR_2+SPI_CR1_SSM+SPI_CR1_SSI
CR2 = SPI_CR2_DS_0+SPI_CR2_DS_1+SPI_CR2_DS_2+SPI_CR2_TXDMAEN+SPI_CR2_FRXTH
Включаю SPI:
CR1 = CR1 | SPI_CR1_SPE
При конфигурации DMA на канале 3 (SPI1_TX) выставляю в CPAR адрес SPI1 DR, в CMAR адрес буфера, CNDTR=0,
CCR = DMA_CCR_DIR+DMA_CCR_MINC
Передачу инициирую так:
- отключаю 3й канал DMA
- записываю в CNDTR нужное количество байт
- включаю 3й канал
Любопытно что передача данных получается нормально, но только первый раз. При последующих попытках отослать тот же буфер (с интервалом в 1 секунду) передача идёт, но такое впечатление что данных посылается больше чем нужно (непонятно откуда берутся лишние нулевые байты).
Спасибо за правильную подсказку, дошли руки и сделал наконец одиночные транзакции через SPI по вашему рецепту (с вычитыванием приёмного буфера). Теперь работает
Но появился новый вопрос.
Как в STM32F0F4P6 организовать SPI для посылки буфера с помощью DMA?
Нужно вручную и достаточно редко пинать DMA, чтобы выплёвывать N байт с заранее определённого буфера. Приём данных не нужен. Прерывания TC не нужны.
Сейчас сделано так (псевдокод):
CR1 = SPI_CR1_MSTR+SPI_CR1_BR_0+SPI_CR1_BR_1+SPI_CR1_BR_2+SPI_CR1_SSM+SPI_CR1_SSI
CR2 = SPI_CR2_DS_0+SPI_CR2_DS_1+SPI_CR2_DS_2+SPI_CR2_TXDMAEN+SPI_CR2_FRXTH
Включаю SPI:
CR1 = CR1 | SPI_CR1_SPE
При конфигурации DMA на канале 3 (SPI1_TX) выставляю в CPAR адрес SPI1 DR, в CMAR адрес буфера, CNDTR=0,
CCR = DMA_CCR_DIR+DMA_CCR_MINC
Передачу инициирую так:
- отключаю 3й канал DMA
- записываю в CNDTR нужное количество байт
- включаю 3й канал
Любопытно что передача данных получается нормально, но только первый раз. При последующих попытках отослать тот же буфер (с интервалом в 1 секунду) передача идёт, но такое впечатление что данных посылается больше чем нужно (непонятно откуда берутся лишние нулевые байты).
- Alexey_N
- Сверлит текстолит когтями
- Сообщения: 1273
- Зарегистрирован: Вт фев 01, 2011 17:56:40
- Откуда: г. Жуковка, Брянская обл.
Re: STM32 новичку в ARM что к чему
Вот все
- Вложения
-
- main103.zip
- (2.38 КБ) 157 скачиваний
Индукционный нагреватель - 20% (наладка). TIG сварка - 10% (детальки)
ВЧ генератор 150МГц - 80% (наладка). Мостовой ИИП - 40% (подкл. ОС).
ВЧ генератор 150МГц - 80% (наладка). Мостовой ИИП - 40% (подкл. ОС).
- Andrew Martin
- Вымогатель припоя
- Сообщения: 606
- Зарегистрирован: Вт июн 25, 2013 18:45:07
Re: STM32 новичку в ARM что к чему
1) Где директива processor?
2) Где stm32f10x.inc?
UPD:
Ошибок в эльфе миллиард!
2) Где stm32f10x.inc?
UPD:
Ошибок в эльфе миллиард!
- Alexey_N
- Сверлит текстолит когтями
- Сообщения: 1273
- Зарегистрирован: Вт фев 01, 2011 17:56:40
- Откуда: г. Жуковка, Брянская обл.
Re: STM32 новичку в ARM что к чему
А зачем эта директива? что она скажет компилятору?
Вот недостающий файл.
Еще какие-то есть ошибки в эльфе?
Вот недостающий файл.
Еще какие-то есть ошибки в эльфе?
- Вложения
-
- stm32f10x.zip
- (50.42 КБ) 136 скачиваний
Индукционный нагреватель - 20% (наладка). TIG сварка - 10% (детальки)
ВЧ генератор 150МГц - 80% (наладка). Мостовой ИИП - 40% (подкл. ОС).
ВЧ генератор 150МГц - 80% (наладка). Мостовой ИИП - 40% (подкл. ОС).
- Andrew Martin
- Вымогатель припоя
- Сообщения: 606
- Зарегистрирован: Вт июн 25, 2013 18:45:07
Re: STM32 новичку в ARM что к чему
По умолчанию этот ассемблер поддерживает все инструкции в режиме THUMB.Alexey_N писал(а):А зачем эта директива? что она скажет компилятору?
Но кортексы в зависимости от подсемейства поддерживает ограниченный набор. Эта директива разрешает только определённый набор инструкций и принимает в качестве аргумента набор бит. Смотрите readme.txt.
Эта фича позволяет отсекать неподдерживаемые варианты инструкций, режимы адресации и т.д. Ассемблер просто скажет, что данная инструкция на данном процессоре не поддерживается.
fasmarm напартачил в таблице символов и в line number program в нескольких местах. Всё ещё elf dwarf сыройAlexey_N писал(а):Еще какие-то есть ошибки в эльфе?
- Alexey_N
- Сверлит текстолит когтями
- Сообщения: 1273
- Зарегистрирован: Вт фев 01, 2011 17:56:40
- Откуда: г. Жуковка, Брянская обл.
Re: STM32 новичку в ARM что к чему
Да, вспомнил, читал про нее, но не понял какие биты надо выставлять для Cortex-M3? ARM7TDMI? processor 0xfe, coprocessor 0x0?
Индукционный нагреватель - 20% (наладка). TIG сварка - 10% (детальки)
ВЧ генератор 150МГц - 80% (наладка). Мостовой ИИП - 40% (подкл. ОС).
ВЧ генератор 150МГц - 80% (наладка). Мостовой ИИП - 40% (подкл. ОС).
Re: STM32 новичку в ARM что к чему
Andrew Martin Посылка буфера через промежутки.
В прерывании по окончанию трансфера :
Обрати внимание на ожидание освобождения FIFO.
И на то, что выключаем канала затем периферию...
Запуск передачи в прерывании от таймера :
Это на TIC55 . И извиняюсь -времени совершенно нет ...
В прерывании по окончанию трансфера :
Обрати внимание на ожидание освобождения FIFO.
И на то, что выключаем канала затем периферию...
Код: Выделить всё
void DMA1_Channel4_5_IRQHandler (void)
{
if(DMA1->ISR & DMA_ISR_TCIF5)
{
DMA1->IFCR |=DMA_IFCR_CTCIF5;
DMA1_Channel5->CCR&=~DMA_CCR_EN;
while(((SPI2->SR & SPI_SR_FTLVL_0))|| ((SPI2->SR & SPI_SR_FTLVL_1))){}
while((SPI2->SR & SPI_SR_BSY)){}
SPI2->CR1 &= ~SPI_CR1_SPE;
LOAD_ON;
LOAD_OFF;
}
}
Запуск передачи в прерывании от таймера :
Код: Выделить всё
void TIM3_IRQHandler(void)
{
static volatile uint32_t ulTim3Cnt;
static volatile uint32_t ulPtntCnt;
if (TIM3->SR & TIM_SR_UIF)
{
TIM3->SR &= ~TIM_SR_UIF;
if(ulCount)
{
ulCount--;
}
if(ulTim3Cnt<5)KEY_STB_ON;
else KEY_STB_OFF;
if(++ulTim3Cnt>=10)
{
ulTim3Cnt=0;
ucKeyFlag=1;
}
if(!ulPtntCnt--)
{
ulPtntCnt=PrintIntrv;
DMA1_Channel5->CNDTR=0x09;
DMA1_Channel5->CCR |=DMA_CCR_EN;
SPI2->CR1 |= SPI_CR1_SPE;
}
}
}
Это на TIC55 . И извиняюсь -времени совершенно нет ...
- Andrew Martin
- Вымогатель припоя
- Сообщения: 606
- Зарегистрирован: Вт июн 25, 2013 18:45:07
Re: STM32 новичку в ARM что к чему
И на том спасибоdosikus писал(а): Это на TIC55 . И извиняюсь -времени совершенно нет ...
Очень хотелось бы увидеть ещё инициализацию SPI и DMA к данному примеру.
А обязательно ли выключать SPI и DMA сразу после окончания трансфера в прерывании?
Можно ли отправить буфер, потом через большой промежуток времени выключить всё, сконфигурировать заново и запустить передачу?
- Andrew Martin
- Вымогатель припоя
- Сообщения: 606
- Зарегистрирован: Вт июн 25, 2013 18:45:07
Re: STM32 новичку в ARM что к чему
Посмотрите http://openefi.blogspot.com/2012/05/arm ... rrupt.htmlAlexey_N писал(а):Да, вспомнил, читал про нее, но не понял какие биты надо выставлять для Cortex-M3? ARM7TDMI? processor 0xfe, coprocessor 0x0?
Re: STM32 новичку в ARM что к чему
Код: Выделить всё
#define SPI1_DR_8b (*(__IO uint8_t *)((uint32_t)SPI1 + 0x0C))
#define SPI2_DR_8b (*(__IO uint8_t *)((uint32_t)SPI2 + 0x0C))
#define LOAD_OFF GPIOB->BSRR = GPIO_BSRR_BR_12
#define LOAD_ON GPIOB->BSRR = GPIO_BSRR_BS_12
Код: Выделить всё
void Tic55_init(void)
{
RCC->AHBENR |=RCC_AHBENR_GPIOBEN | RCC_AHBENR_DMA1EN;
RCC->APB1ENR |=RCC_APB1ENR_SPI2EN;
GPIOB->MODER &=~
GPIO_MODER_MODER12 |
GPIO_MODER_MODER13 |
GPIO_MODER_MODER14 |
GPIO_MODER_MODER15
;
GPIOB->MODER|=
GPIO_MODER_MODER13_1|
GPIO_MODER_MODER14_1|
GPIO_MODER_MODER15_1 ;
GPIOB->MODER|=GPIO_MODER_MODER12_0;
GPIOB->PUPDR |=
GPIO_PUPDR_PUPDR12_1|
GPIO_PUPDR_PUPDR13_1|
GPIO_PUPDR_PUPDR14_1|
GPIO_PUPDR_PUPDR15_1
;
SPI2->CR1 |=
SPI_CR1_BR_0 | //
SPI_CR1_BR_1 |
SPI_CR1_BR_2 |
SPI_CR1_MSTR |
SPI_CR1_SSI |
SPI_CR1_SSM
;
SPI2->CR2 = 0x700; // 8 bit
SPI2->CR2 |= SPI_CR2_TXDMAEN ;
DMA1_Channel5->CCR =
DMA_CCR_MINC |
DMA_CCR_DIR |
DMA_CCR_PL |
DMA_CCR_TCIE
;
DMA1_Channel5->CNDTR=0x09;
DMA1_Channel5->CPAR = (uint32_t)& SPI2_DR_8b;
DMA1_Channel5->CMAR =(uint32_t)Tic55_buf;
NVIC_SetPriority(DMA1_Channel4_5_IRQn, 14);
NVIC_EnableIRQ(DMA1_Channel4_5_IRQn);
}- Alexey_N
- Сверлит текстолит когтями
- Сообщения: 1273
- Зарегистрирован: Вт фев 01, 2011 17:56:40
- Откуда: г. Жуковка, Брянская обл.
Re: STM32 новичку в ARM что к чему
О, благодарю, нашел. Есть еще вопрос, в чем разница между movs и mov в fasm? по мануалу RM0056 читаю, что от этого суффикса зависит меняются ли флаги или нет, но по дизассемблеру получаются совсем разные коды, одна инструкция 16 битная (movs) вторая 32(mov.w)
Индукционный нагреватель - 20% (наладка). TIG сварка - 10% (детальки)
ВЧ генератор 150МГц - 80% (наладка). Мостовой ИИП - 40% (подкл. ОС).
ВЧ генератор 150МГц - 80% (наладка). Мостовой ИИП - 40% (подкл. ОС).
- Andrew Martin
- Вымогатель припоя
- Сообщения: 606
- Зарегистрирован: Вт июн 25, 2013 18:45:07
Re: STM32 новичку в ARM что к чему
Тут не в фасме дело.Alexey_N писал(а):О, благодарю, нашел. Есть еще вопрос, в чем разница между movs и mov в fasm? по мануалу RM0056 читаю, что от этого суффикса зависит меняются ли флаги или нет, но по дизассемблеру получаются совсем разные коды, одна инструкция 16 битная (movs) вторая 32(mov.w)
Читайте доки от ARM.
Разбирайте кодирование инструкций. Варианты кодирования инструкций зависят от операндов.
Например, на М0 movs кодируется как adds и работает только с r0-r7:
movs r0,1 = adds r0,r0,1
movs r0,r1 = adds r0,r1,0
А mov вообще не умеет работать с константами, только с регистрами, но со всеми 16ю
Re: STM32 новичку в ARM что к чему
В описании USARTa STM32F4, очень кратко описан IrDA SIR ENDEC block
Не совсем понятно, означает ли, что возможно использовать прием/передачу по ИК-каналу подключив только фото- и светодиод к ножкам RX/TX USARTa без использования таймеров?
Не совсем понятно, означает ли, что возможно использовать прием/передачу по ИК-каналу подключив только фото- и светодиод к ножкам RX/TX USARTa без использования таймеров?
- Andrew Martin
- Вымогатель припоя
- Сообщения: 606
- Зарегистрирован: Вт июн 25, 2013 18:45:07
Re: STM32 новичку в ARM что к чему
Alexey_N
Не используйте 4-байтное выравнивание для кода, используйте 2-байтное, в режиме THUMB это правильнее. А 4-байтное только для данных.
Не используйте 4-байтное выравнивание для кода, используйте 2-байтное, в режиме THUMB это правильнее. А 4-байтное только для данных.
Код: Выделить всё
align 2
proc:
ldr r0,[.data]
bx lr
align 4
.data dw 0x0
align 2
proc2:
.
.
.
- Alexey_N
- Сверлит текстолит когтями
- Сообщения: 1273
- Зарегистрирован: Вт фев 01, 2011 17:56:40
- Откуда: г. Жуковка, Брянская обл.
Re: STM32 новичку в ARM что к чему
Из-за этого эльф кривой получался? (по последней ошибке дизассемблирования)
А если я укажу в параметрах секции кода выравнивание 2, а потом по ходу кода выравнивание 4 для данных, то после данных надо опять указывать выравнивание 2 ? Я к тому, что на что влияет выравнивание в параметрах секции, если оно может явно задаваться для участков кода/данных.
А если я укажу в параметрах секции кода выравнивание 2, а потом по ходу кода выравнивание 4 для данных, то после данных надо опять указывать выравнивание 2 ? Я к тому, что на что влияет выравнивание в параметрах секции, если оно может явно задаваться для участков кода/данных.
Индукционный нагреватель - 20% (наладка). TIG сварка - 10% (детальки)
ВЧ генератор 150МГц - 80% (наладка). Мостовой ИИП - 40% (подкл. ОС).
ВЧ генератор 150МГц - 80% (наладка). Мостовой ИИП - 40% (подкл. ОС).


