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

Кто любит RISC в жизни, заходим, не стесняемся.
Аватара пользователя
RusikOk
Нашел транзистор. Понюхал.
Сообщения: 197
Зарегистрирован: Пн янв 24, 2011 01:51:48
Откуда: Украина, Киев
Контактная информация:

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

Сообщение RusikOk »

Реклама
Аватара пользователя
Alexey_N
Сверлит текстолит когтями
Сообщения: 1273
Зарегистрирован: Вт фев 01, 2011 17:56:40
Откуда: г. Жуковка, Брянская обл.

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

Сообщение Alexey_N »

Подскажите, почему МК сваливается в hard fault на любой инструкции после push? (stm32f103)
Индукционный нагреватель - 20% (наладка). TIG сварка - 10% (детальки)
ВЧ генератор 150МГц - 80% (наладка). Мостовой ИИП - 40% (подкл. ОС).
Реклама
Аватара пользователя
Satyr
Друг Кота
Сообщения: 7439
Зарегистрирован: Чт ноя 04, 2010 01:56:36
Откуда: г. Москва

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

Сообщение Satyr »

Alexey_N писал(а):Подскажите, почему МК сваливается в hard fault на любой инструкции после push? (stm32f103)
Ну самое очевидное то что ?
Посмотреть, куда SP показывает.
Очень вероятно, вообще за пределы SRAMа -))
Аватара пользователя
Alexey_N
Сверлит текстолит когтями
Сообщения: 1273
Зарегистрирован: Вт фев 01, 2011 17:56:40
Откуда: г. Жуковка, Брянская обл.

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

Сообщение Alexey_N »

А да, точно! Сглупил я, вместо вершины 0x20005000 указал 0x20050000, а там то всего 20Кб :oops:

Возникла новая проблема с objdump при дизассемблировании, но исходник создается все же:

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

BFD: main103: invalid string offset 536870912 >= 548 for section `.strtab'
Индукционный нагреватель - 20% (наладка). TIG сварка - 10% (детальки)
ВЧ генератор 150МГц - 80% (наладка). Мостовой ИИП - 40% (подкл. ОС).
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
Andrew Martin
Вымогатель припоя
Сообщения: 606
Зарегистрирован: Вт июн 25, 2013 18:45:07

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

Сообщение Andrew Martin »

Как показал опыт, нужно ковырять fasmarm.
Почему-то очень много багов в таблице символов.
Исходник и эльф в студию :kill:
Реклама
Аватара пользователя
Andrew Martin
Вымогатель припоя
Сообщения: 606
Зарегистрирован: Вт июн 25, 2013 18:45:07

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

Сообщение Andrew Martin »

To dosikus

Спасибо за правильную подсказку, дошли руки и сделал наконец одиночные транзакции через SPI по вашему рецепту (с вычитыванием приёмного буфера). Теперь работает :beer:

Но появился новый вопрос.

Как в 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 что к чему

Сообщение Alexey_N »

Вот все
Вложения
main103.zip
(2.38 КБ) 157 скачиваний
Индукционный нагреватель - 20% (наладка). TIG сварка - 10% (детальки)
ВЧ генератор 150МГц - 80% (наладка). Мостовой ИИП - 40% (подкл. ОС).
Аватара пользователя
Andrew Martin
Вымогатель припоя
Сообщения: 606
Зарегистрирован: Вт июн 25, 2013 18:45:07

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

Сообщение Andrew Martin »

1) Где директива processor?
2) Где stm32f10x.inc?

UPD:
Ошибок в эльфе миллиард! :o
Аватара пользователя
Alexey_N
Сверлит текстолит когтями
Сообщения: 1273
Зарегистрирован: Вт фев 01, 2011 17:56:40
Откуда: г. Жуковка, Брянская обл.

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

Сообщение Alexey_N »

А зачем эта директива? что она скажет компилятору?
Вот недостающий файл.
Еще какие-то есть ошибки в эльфе?
Вложения
stm32f10x.zip
(50.42 КБ) 136 скачиваний
Индукционный нагреватель - 20% (наладка). TIG сварка - 10% (детальки)
ВЧ генератор 150МГц - 80% (наладка). Мостовой ИИП - 40% (подкл. ОС).
Аватара пользователя
Andrew Martin
Вымогатель припоя
Сообщения: 606
Зарегистрирован: Вт июн 25, 2013 18:45:07

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

Сообщение Andrew Martin »

Alexey_N писал(а):А зачем эта директива? что она скажет компилятору?
По умолчанию этот ассемблер поддерживает все инструкции в режиме THUMB.
Но кортексы в зависимости от подсемейства поддерживает ограниченный набор. Эта директива разрешает только определённый набор инструкций и принимает в качестве аргумента набор бит. Смотрите readme.txt.
Эта фича позволяет отсекать неподдерживаемые варианты инструкций, режимы адресации и т.д. Ассемблер просто скажет, что данная инструкция на данном процессоре не поддерживается.
Alexey_N писал(а):Еще какие-то есть ошибки в эльфе?
fasmarm напартачил в таблице символов и в line number program в нескольких местах. Всё ещё elf dwarf сырой :(
Аватара пользователя
Alexey_N
Сверлит текстолит когтями
Сообщения: 1273
Зарегистрирован: Вт фев 01, 2011 17:56:40
Откуда: г. Жуковка, Брянская обл.

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

Сообщение Alexey_N »

Да, вспомнил, читал про нее, но не понял какие биты надо выставлять для Cortex-M3? ARM7TDMI? processor 0xfe, coprocessor 0x0?
Индукционный нагреватель - 20% (наладка). TIG сварка - 10% (детальки)
ВЧ генератор 150МГц - 80% (наладка). Мостовой ИИП - 40% (подкл. ОС).
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

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

Сообщение dosikus »

Andrew Martin Посылка буфера через промежутки.
В прерывании по окончанию трансфера :
Обрати внимание на ожидание освобождения 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 что к чему

Сообщение Andrew Martin »

dosikus писал(а): Это на TIC55 . И извиняюсь -времени совершенно нет ...
И на том спасибо :)

Очень хотелось бы увидеть ещё инициализацию SPI и DMA к данному примеру.

А обязательно ли выключать SPI и DMA сразу после окончания трансфера в прерывании?
Можно ли отправить буфер, потом через большой промежуток времени выключить всё, сконфигурировать заново и запустить передачу?
Аватара пользователя
Andrew Martin
Вымогатель припоя
Сообщения: 606
Зарегистрирован: Вт июн 25, 2013 18:45:07

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

Сообщение Andrew Martin »

Alexey_N писал(а):Да, вспомнил, читал про нее, но не понял какие биты надо выставлять для Cortex-M3? ARM7TDMI? processor 0xfe, coprocessor 0x0?
Посмотрите http://openefi.blogspot.com/2012/05/arm ... rrupt.html
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

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

Сообщение dosikus »

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

	#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 что к чему

Сообщение Alexey_N »

О, благодарю, нашел. Есть еще вопрос, в чем разница между movs и mov в fasm? по мануалу RM0056 читаю, что от этого суффикса зависит меняются ли флаги или нет, но по дизассемблеру получаются совсем разные коды, одна инструкция 16 битная (movs) вторая 32(mov.w)
Индукционный нагреватель - 20% (наладка). TIG сварка - 10% (детальки)
ВЧ генератор 150МГц - 80% (наладка). Мостовой ИИП - 40% (подкл. ОС).
Аватара пользователя
Andrew Martin
Вымогатель припоя
Сообщения: 606
Зарегистрирован: Вт июн 25, 2013 18:45:07

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

Сообщение Andrew Martin »

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ю :)
DimAnoiD
Родился
Сообщения: 7
Зарегистрирован: Чт янв 03, 2008 23:04:59
Контактная информация:

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

Сообщение DimAnoiD »

В описании USARTa STM32F4, очень кратко описан IrDA SIR ENDEC block
Не совсем понятно, означает ли, что возможно использовать прием/передачу по ИК-каналу подключив только фото- и светодиод к ножкам RX/TX USARTa без использования таймеров?
Аватара пользователя
Andrew Martin
Вымогатель припоя
Сообщения: 606
Зарегистрирован: Вт июн 25, 2013 18:45:07

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

Сообщение Andrew Martin »

Alexey_N

Не используйте 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 что к чему

Сообщение Alexey_N »

Из-за этого эльф кривой получался? (по последней ошибке дизассемблирования)
А если я укажу в параметрах секции кода выравнивание 2, а потом по ходу кода выравнивание 4 для данных, то после данных надо опять указывать выравнивание 2 ? Я к тому, что на что влияет выравнивание в параметрах секции, если оно может явно задаваться для участков кода/данных.
Индукционный нагреватель - 20% (наладка). TIG сварка - 10% (детальки)
ВЧ генератор 150МГц - 80% (наладка). Мостовой ИИП - 40% (подкл. ОС).
Ответить

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