STM32 новичку в ARM что к чему
- Реклама
Подскажите, почему МК сваливается в hard fault на любой инструкции после push? (stm32f103)
Индукционный нагреватель - 20% (наладка). TIG сварка - 10% (детальки)
ВЧ генератор 150МГц - 80% (наладка). Мостовой ИИП - 40% (подкл. ОС).
ВЧ генератор 150МГц - 80% (наладка). Мостовой ИИП - 40% (подкл. ОС).
Ну самое очевидное то что ?Alexey_N писал(а):Подскажите, почему МК сваливается в hard fault на любой инструкции после push? (stm32f103)
Посмотреть, куда SP показывает.
Очень вероятно, вообще за пределы SRAMа -))
А да, точно! Сглупил я, вместо вершины 0x20005000 указал 0x20050000, а там то всего 20Кб 
Возникла новая проблема с objdump при дизассемблировании, но исходник создается все же:
Возникла новая проблема с objdump при дизассемблировании, но исходник создается все же:
Код: Выделить всё
BFD: main103: invalid string offset 536870912 >= 548 for section `.strtab'Индукционный нагреватель - 20% (наладка). TIG сварка - 10% (детальки)
ВЧ генератор 150МГц - 80% (наладка). Мостовой ИИП - 40% (подкл. ОС).
ВЧ генератор 150МГц - 80% (наладка). Мостовой ИИП - 40% (подкл. ОС).
- Сообщения: 606
- Зарегистрирован: Вт июн 25, 2013 18:45:07
Как показал опыт, нужно ковырять fasmarm.
Почему-то очень много багов в таблице символов.
Исходник и эльф в студию
Почему-то очень много багов в таблице символов.
Исходник и эльф в студию
- Реклама
- Сообщения: 606
- Зарегистрирован: Вт июн 25, 2013 18:45:07
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 секунду) передача идёт, но такое впечатление что данных посылается больше чем нужно (непонятно откуда берутся лишние нулевые байты).
Вот все
- Вложения
-
- main103.zip
- (2.38 КБ) 159 скачиваний
Индукционный нагреватель - 20% (наладка). TIG сварка - 10% (детальки)
ВЧ генератор 150МГц - 80% (наладка). Мостовой ИИП - 40% (подкл. ОС).
ВЧ генератор 150МГц - 80% (наладка). Мостовой ИИП - 40% (подкл. ОС).
- Сообщения: 606
- Зарегистрирован: Вт июн 25, 2013 18:45:07
1) Где директива processor?
2) Где stm32f10x.inc?
UPD:
Ошибок в эльфе миллиард!
2) Где stm32f10x.inc?
UPD:
Ошибок в эльфе миллиард!
А зачем эта директива? что она скажет компилятору?
Вот недостающий файл.
Еще какие-то есть ошибки в эльфе?
Вот недостающий файл.
Еще какие-то есть ошибки в эльфе?
- Вложения
-
- stm32f10x.zip
- (50.42 КБ) 137 скачиваний
Индукционный нагреватель - 20% (наладка). TIG сварка - 10% (детальки)
ВЧ генератор 150МГц - 80% (наладка). Мостовой ИИП - 40% (подкл. ОС).
ВЧ генератор 150МГц - 80% (наладка). Мостовой ИИП - 40% (подкл. ОС).
- Сообщения: 606
- Зарегистрирован: Вт июн 25, 2013 18:45:07
По умолчанию этот ассемблер поддерживает все инструкции в режиме THUMB.Alexey_N писал(а):А зачем эта директива? что она скажет компилятору?
Но кортексы в зависимости от подсемейства поддерживает ограниченный набор. Эта директива разрешает только определённый набор инструкций и принимает в качестве аргумента набор бит. Смотрите readme.txt.
Эта фича позволяет отсекать неподдерживаемые варианты инструкций, режимы адресации и т.д. Ассемблер просто скажет, что данная инструкция на данном процессоре не поддерживается.
fasmarm напартачил в таблице символов и в line number program в нескольких местах. Всё ещё elf dwarf сыройAlexey_N писал(а):Еще какие-то есть ошибки в эльфе?
Да, вспомнил, читал про нее, но не понял какие биты надо выставлять для Cortex-M3? ARM7TDMI? processor 0xfe, coprocessor 0x0?
Индукционный нагреватель - 20% (наладка). TIG сварка - 10% (детальки)
ВЧ генератор 150МГц - 80% (наладка). Мостовой ИИП - 40% (подкл. ОС).
ВЧ генератор 150МГц - 80% (наладка). Мостовой ИИП - 40% (подкл. ОС).
- Сообщения: 3604
- Зарегистрирован: Пн июл 28, 2008 22:12:01
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 . И извиняюсь -времени совершенно нет ...
- Сообщения: 606
- Зарегистрирован: Вт июн 25, 2013 18:45:07
И на том спасибоdosikus писал(а): Это на TIC55 . И извиняюсь -времени совершенно нет ...
Очень хотелось бы увидеть ещё инициализацию SPI и DMA к данному примеру.
А обязательно ли выключать SPI и DMA сразу после окончания трансфера в прерывании?
Можно ли отправить буфер, потом через большой промежуток времени выключить всё, сконфигурировать заново и запустить передачу?
- Сообщения: 606
- Зарегистрирован: Вт июн 25, 2013 18:45:07
Посмотрите http://openefi.blogspot.com/2012/05/arm ... rrupt.htmlAlexey_N писал(а):Да, вспомнил, читал про нее, но не понял какие биты надо выставлять для Cortex-M3? ARM7TDMI? processor 0xfe, coprocessor 0x0?
- Сообщения: 3604
- Зарегистрирован: Пн июл 28, 2008 22:12:01
Код: Выделить всё
#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);
}О, благодарю, нашел. Есть еще вопрос, в чем разница между movs и mov в fasm? по мануалу RM0056 читаю, что от этого суффикса зависит меняются ли флаги или нет, но по дизассемблеру получаются совсем разные коды, одна инструкция 16 битная (movs) вторая 32(mov.w)
Индукционный нагреватель - 20% (наладка). TIG сварка - 10% (детальки)
ВЧ генератор 150МГц - 80% (наладка). Мостовой ИИП - 40% (подкл. ОС).
ВЧ генератор 150МГц - 80% (наладка). Мостовой ИИП - 40% (подкл. ОС).
- Сообщения: 606
- Зарегистрирован: Вт июн 25, 2013 18:45:07
Тут не в фасме дело.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ю
- Сообщения: 7
- Зарегистрирован: Чт янв 03, 2008 23:04:59
В описании USARTa STM32F4, очень кратко описан IrDA SIR ENDEC block
Не совсем понятно, означает ли, что возможно использовать прием/передачу по ИК-каналу подключив только фото- и светодиод к ножкам RX/TX USARTa без использования таймеров?
Не совсем понятно, означает ли, что возможно использовать прием/передачу по ИК-каналу подключив только фото- и светодиод к ножкам RX/TX USARTa без использования таймеров?
- Сообщения: 606
- Зарегистрирован: Вт июн 25, 2013 18:45:07
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:
.
.
.
Из-за этого эльф кривой получался? (по последней ошибке дизассемблирования)
А если я укажу в параметрах секции кода выравнивание 2, а потом по ходу кода выравнивание 4 для данных, то после данных надо опять указывать выравнивание 2 ? Я к тому, что на что влияет выравнивание в параметрах секции, если оно может явно задаваться для участков кода/данных.
А если я укажу в параметрах секции кода выравнивание 2, а потом по ходу кода выравнивание 4 для данных, то после данных надо опять указывать выравнивание 2 ? Я к тому, что на что влияет выравнивание в параметрах секции, если оно может явно задаваться для участков кода/данных.
Индукционный нагреватель - 20% (наладка). TIG сварка - 10% (детальки)
ВЧ генератор 150МГц - 80% (наладка). Мостовой ИИП - 40% (подкл. ОС).
ВЧ генератор 150МГц - 80% (наладка). Мостовой ИИП - 40% (подкл. ОС).


