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

Кто любит RISC в жизни, заходим, не стесняемся.
Аватара пользователя
Леонид Иванович
Друг Кота
Сообщения: 4779
Зарегистрирован: Сб апр 02, 2011 12:40:46
Откуда: Минск
Контактная информация:

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

Сообщение Леонид Иванович »

Чтобы переопределить его.
Реклама
Аватара пользователя
balmer
Это не хвост, это антенна
Сообщения: 1433
Зарегистрирован: Вс дек 02, 2012 03:13:48
Откуда: Калининград

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

Сообщение balmer »

menzoda писал(а):Так что еще раз: зачем библиотеки времени исполнения указатель на стек, если он и так уже правильно инициализирован и всем известен?
Ну вот захочешь ты сделать многопоточное приложение. У каждого потока должен быть свой стек. Врядли есть другое разумное применение.
Реклама
Аватара пользователя
Гуня
Первый раз сказал Мяу!
Сообщения: 36
Зарегистрирован: Сб мар 21, 2009 23:46:25

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

Сообщение Гуня »

Всем доброго времени суток! Запустил ДМА на стм32, но почемуто отправляется ровно на 2 байта меньше чем я задаю. Вот код

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

void USART1_TX_DMA_Init(void)
{
	if ((RCC->AHBENR & RCC_AHBENR_DMA1EN) != RCC_AHBENR_DMA1EN)
		                            RCC->AHBENR |= RCC_AHBENR_DMA1EN;

		  DMA1_Channel4->CPAR  =  (uint32_t) &USART1->DR;
		  DMA1_Channel4->CMAR  =  (uint32_t) &transmit_buffer[0];
		  DMA1_Channel4->CNDTR =  16;

		  DMA1_Channel4->CCR   =  0;
		  DMA1_Channel4->CCR  &= ~DMA_CCR4_CIRC;
		  DMA1_Channel4->CCR  |=  DMA_CCR4_DIR;

		  DMA1_Channel4->CCR  &= ~DMA_CCR4_PSIZE;
		  DMA1_Channel4->CCR  &= ~DMA_CCR4_PINC;

		  DMA1_Channel4->CCR  &= ~DMA_CCR4_MSIZE;
		  DMA1_Channel4->CCR  |=  DMA_CCR4_MINC;

		  DMA1_Channel4->CCR  &= ~DMA_CCR4_PL;

		  DMA1_Channel4->CCR  |=  DMA_CCR4_TEIE;
		  DMA1_Channel4->CCR  |=  DMA_CCR4_TCIE;
		  NVIC_EnableIRQ (DMA1_Channel4_IRQn);

		  USART1->CR3  |=  USART_CR3_DMAT;
}

void StartDMAChannel4(unsigned int LengthBufer)
{
	DMA1_Channel4->CCR  &= ~DMA_CCR4_EN;
	  DMA1_Channel4->CNDTR =  LengthBufer;
	  DMA1->IFCR          |= DMA_IFCR_CTCIF4;
	  DMA1_Channel4->CCR  |=  DMA_CCR4_EN;
}

void DMA1_Channel4_IRQHandler(void)
{
	if(DMA1->ISR & DMA_ISR_TCIF4) {
		RS485->BRR = RS485_RXTX;
		USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
	}
	DMA1->IFCR |= DMA_IFCR_CGIF4; //очистка флагов
}
собственно я использую дма для отправки буфера в RS485. когда данные готовы, запускаю функцию StartDMAChannel4 и передаю ей кол-во байт которые нужно передать, и всегда передается на 2 байта меньше чем я указываю.. я конечно могу просто прибавить 2 к кол-ву, но хочется разобраться))
Аватара пользователя
menzoda
Вымогатель припоя
Сообщения: 535
Зарегистрирован: Вт авг 28, 2012 22:21:33

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

Сообщение menzoda »

Леонид Иванович писал(а):Чтобы переопределить его.
В смысле переопределить? По идее я его могу задать каким мне нужно и без этой функции (кстати надо проверить), а задавать его одним и потом в этом же стартап-файле переопределять другим - ерунда получается.
balmer писал(а):Ну вот захочешь ты сделать многопоточное приложение. У каждого потока должен быть свой стек. Вряд ли есть другое разумное применение.
В том то и дело, что функция всего одна! Она возвращает всегда одни и те же жестко заданные значения. Скорей всего вызывается один раз при инициализации библиотеки (тоже надо проверить). Несколько разных указателей стека через нее не передашь.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
balmer
Это не хвост, это антенна
Сообщения: 1433
Зарегистрирован: Вс дек 02, 2012 03:13:48
Откуда: Калининград

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

Сообщение balmer »

menzoda писал(а): В том то и дело, что функция всего одна! Она возвращает всегда одни и те же жестко заданные значения.
Эк, глянул. Нигде эта функция не вызывается в стандартных примерах. Действительно возвращает одни и те-же значения. Причем не те, что заданы в файле STM32_FLASH.ld от сэмплика стандартного. Что-то устаревшее/ненужное.
Реклама
Аватара пользователя
Леонид Иванович
Друг Кота
Сообщения: 4779
Зарегистрирован: Сб апр 02, 2011 12:40:46
Откуда: Минск
Контактная информация:

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

Сообщение Леонид Иванович »

menzoda писал(а):В смысле переопределить?
Функция __user_setup_stackheap() нужна лишь для того, чтобы пользователь мог ее переопределить и получить другой способ задания кучи и стека, например, с помощью scatter-файла.
Реклама
Аватара пользователя
Гуня
Первый раз сказал Мяу!
Сообщения: 36
Зарегистрирован: Сб мар 21, 2009 23:46:25

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

Сообщение Гуня »

Народ, помогите пожалуйста, кто работал с ДМА :oops: Проблему предыдущего моего сообщения я решил. Оказывается прерывание по от ДМА срабатывает не тогда когда последний байт передан, а тогда когда он положен в регистр юарта, поэтому я слишком рано переключался на прием RS485, и не все байты отправлялись в шину. Но вот засада, теперь тот же код для 7-го канала дма и 2 юарта не работает также как предыдущий код для юарт 1. Вернулся в тот проект где используется 4-й канал и 1-й юарт - обнаружил следующую особенность, прерывание от ДМА не срабатывает если в инициализации не включить прерывание при ошибке передачи

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

DMA1_Channel4->CCR  |=  DMA_CCR4_TÑIE;               //событие ошибка обмена
а включить только при завершении передачи данных

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

DMA1_Channel4->CCR  |=  DMA_CCR4_TEIE;               //событие конец обмена
. Но если включаю прерывания при ошибке передачи, то при возникновении прерывания ДМА всегда срабатывает именно событие конец обмена

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

DMA1_Channel4->CCR  |=  DMA_CCR4_TEIE;               //событие конец обмена
. Какая тут связь я что-то не понимаю.
вот обработчик прерывания

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

//передача завершена
void DMA1_Channel4_IRQHandler(void)
{

	//событие конец обмена
        if(DMA1->ISR & DMA_ISR_TCIF4) {
		USART_ITConfig(USART1, USART_IT_TC, ENABLE);
	}

	DMA1->IFCR |= DMA_IFCR_CGIF4; //очистка флагов
}
Аватара пользователя
Гуня
Первый раз сказал Мяу!
Сообщения: 36
Зарегистрирован: Сб мар 21, 2009 23:46:25

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

Сообщение Гуня »

Сори, я перепутал флаги местами. все работает как надо.
Аватара пользователя
rus084
Друг Кота
Сообщения: 3443
Зарегистрирован: Вт июн 28, 2011 12:11:50
Откуда: Россия,Ставропольский край, ст.Бекешевская
Контактная информация:

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

Сообщение rus084 »

если порт stm32f4 перевести в режим входа с подтяжкой к питанию , какого номинала резистор подтяжки там используется?
Меня зовут Димон .
Изображение
Изображение
Аватара пользователя
Леонид Иванович
Друг Кота
Сообщения: 4779
Зарегистрирован: Сб апр 02, 2011 12:40:46
Откуда: Минск
Контактная информация:

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

Сообщение Леонид Иванович »

Интересно, а почему Вы это спрашиваете на форуме, а не читаете в datasheet? А там написано, что типовое 11 кОм для PA10, PB12 и 40 кОм для остальных.
Аватара пользователя
rus084
Друг Кота
Сообщения: 3443
Зарегистрирован: Вт июн 28, 2011 12:11:50
Откуда: Россия,Ставропольский край, ст.Бекешевская
Контактная информация:

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

Сообщение rus084 »

спасибо !
Меня зовут Димон .
Изображение
Изображение
anber
Родился
Сообщения: 3
Зарегистрирован: Вс янв 12, 2014 01:11:13

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

Сообщение anber »

Подскажите, решил разобраться с STM32 приобрел плату такую с STM32F103VET6.
В начале была установлена базовая прошивка - мигание 2 диодами, она работала.
Начал по этой инструкции: http://radiokot.ru/articles/56/
На моей плате диоды подписаны как PE5 и PE6, соответственно написал такую программку, задумка была чтоб они зажглись и горели:

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

#include <stm32f10x.h>
#include <stm32f10x_conf.h>
#include <stm32f10x_rcc.h>
#include <stm32f10x_gpio.h>

int main(void) {
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);
GPIO_InitTypeDef gpio;
gpio.GPIO_Mode = GPIO_Mode_Out_PP;
gpio.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_6;
gpio.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOE, &gpio);
GPIO_SetBits(GPIOE, GPIO_Pin_5|GPIO_Pin_6);
do __NOP(); while (1);
}
успешно залил через flash loader, вернул boot0 на место, запустил, но диоды не замигали.
Пробовал разные примеры и комбинации но так ни разу мигнуть диодом не получилось, подскажите, в чем проблема?
Аватара пользователя
coredumped
Опытный кот
Сообщения: 838
Зарегистрирован: Вт апр 12, 2011 18:38:19
Откуда: с Земли

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

Сообщение coredumped »

1. Светодиоды как подключены? Обычно подключают анодом к питанию, а катодом к порту МК - в таком случае включать нужно подачей "0" на порт: GPIO_ResetBits(GPIOE, GPIO_Pin_5|GPIO_Pin_6);
2. Вы в проекте все файлики включили, я имею ввиду startup?
Все будет только лучше, в крайнем случае - хуже.
Аватара пользователя
amv2000
Опытный кот
Сообщения: 722
Зарегистрирован: Вт апр 26, 2011 13:58:36
Откуда: Ростовская область

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

Сообщение amv2000 »

А мне честно говоря этот момент не ясен
anber писал(а):задумка была чтоб они зажглись и горели:
и тут же
anber писал(а):запустил, но диоды не замигали.
У Вас светодиоды горят или нет?
anber
Родился
Сообщения: 3
Зарегистрирован: Вс янв 12, 2014 01:11:13

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

Сообщение anber »

coredumped писал(а):1. Светодиоды как подключены? Обычно подключают анодом к питанию, а катодом к порту МК - в таком случае включать нужно подачей "0" на порт: GPIO_ResetBits(GPIOE, GPIO_Pin_5|GPIO_Pin_6);
Спасибо, заработало, теперь отправная точка есть :))
pokk
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

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

Сообщение pokk »

Здравствуйте, начал разбираться с DMA. Надо отправить/принять по SPI некий массив.
С отправкой как бы более менее понятно забиваем откуда куда отправлять и всё.
А вот с приёмом совсем туго. Там же что бы принять надо сначала отправить :dont_know: и как это сделать ?
А что происходит с CS он сам дрыгается после отправки каждого байта ? или вообще не как ?
Мне надо его переключать в начале и в конце приёма массива.

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


RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1, ENABLE);

DMA_DeInit(DMA_Channel_0);
DMA_InitTypeDef DMA_InitStructure;

DMA_InitStructure.DMA_Channel = DMA_Channel_0;
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&SPI2->DR);
DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)text;
DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;
DMA_InitStructure.DMA_BufferSize = 2;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
DMA_InitStructure.DMA_Priority = DMA_Priority_Low;
DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;
DMA_Init(DMA1_Stream4, &DMA_InitStructure);

SPI_I2S_DMACmd(SPI2,SPI_I2S_DMAReq_Tx,ENABLE);
DMA_ITConfig(DMA_Channel_0, DMA_IT_TC, ENABLE);
NVIC_EnableIRQ(DMA1_Stream4_IRQn);

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

void DMA1_Stream4_IRQHandler(void)
{
    TEST12[0]=DMA_GetFlagStatus(DMA1_Stream4,DMA_FLAG_TCIF4);
    TEST12[1]=DMA_GetFlagStatus(DMA1_Stream4,DMA_FLAG_HTIF4);
    TEST12[2]=DMA_GetFlagStatus(DMA1_Stream4,DMA_FLAG_TEIF4);
    TEST12[3]=DMA_GetFlagStatus(DMA1_Stream4,DMA_FLAG_DMEIF4);
    TEST12[4]=DMA_GetFlagStatus(DMA1_Stream4,DMA_FLAG_FEIF4);  //  Streamx FIFO error flag
}
DMA_FLAG_FEIF4 флаг в состоянии set получаю. (Streamx FIFO error flag) чего я не правильно сделал?
pokk
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

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

Сообщение pokk »

С вопросом почему не работает разобрался. Флаг прерывания криво разрешал

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

DMA_ITConfig([b]DMA_Channel_0[/b], DMA_IT_TC, ENABLE);
Решил померить как быстро(в тактах) предается массив по SPI
нашёл где-то дефайны

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

// DWT (Data Watchpoint Trigger) - high-resolution counter for precise timing ------------------------------
#define DWT_CYCCNT   *(volatile uint32_t *)0xE0001004  //counter of CPU ticks; at 168MHz, it overflows in 25.6 seconds
#define DWT_CONTROL  *(volatile uint32_t *)0xE0001000  //the LS bit is CYCCNTENA - enabler of DWT_CYCCNT
#define SCB_DEMCR    *(volatile uint32_t *)0xE000EDFC  //Debug Exception and Monitor Control Register;
   //DWT initialization:
    SCB_DEMCR |= 0x01000000;
    //DWT_CYCCNT = 0;  //if need to start from zero
    DWT_CONTROL |= 1; // enable the counter

Функция Send отправляет 2-3 раза по 8кб file_len=22кб maxlen=8кб
И теперь смотрю что запишется в dwt_timestamp[9]
ставлю точку остановки на content += send_len;
первый запуск 12 824 234 вторая итерация цикла 136 408 третья 106 806
Как так ??????????? одна и также функция выполняет передачу одинакового количества байтов.
Если поставить ещё одну точку остановки на DWT_CYCCNT = 0; и потом пошагово дойти до второй точке, то никаких 12 824 234 тактов нету.

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

			while (file_len)
			{
                          if (file_len >= maxlen){
					send_len =maxlen;
                          }
                          else{send_len = file_len;}
DWT_CYCCNT = 0;  
				send(s, content, send_len);
dwt_timestamp[9] = DWT_CYCCNT;   
				content += send_len; 
				file_len -= send_len;
                         counter_test++;
			}

Как правильно измерить за сколько тактов выполняется функция send(s, content, send_len); ?????
pokk
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

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

Сообщение pokk »

С предыдущим постом разобрался всё дело было в функции send при первом запуске она зависала на 12 млн.
Начал дальше с DMA разбиратся сделал функцию чтения.

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

uint8_t  WIZCHIP_READ_DMA(uint32_t AddrSel){
  unsigned char buff[4];
  unsigned char read[4];
  GPIO_ResetBits(GPIOB, GPIO_Pin_12);
//-------------------Собираем масив---------------------------------------
  AddrSel |= (_W5500_SPI_READ_ | _W5500_SPI_FDM_OP_LEN1_);
  buff[0]=((AddrSel & 0x00FF0000) >> 16);
  buff[1]=((AddrSel & 0x0000FF00) >>  8);
  buff[2]=((AddrSel & 0x000000FF) >>  0);
  buff[3]=0xFF;
//------------------------------------------------------------------------------
    dmaSEND_TX(DMA1_Stream4,buff,4); // отправляем собранный массив
    dmaRESIVE(DMA1_Stream3,read,4);

  while(DMA_GetFlagStatus(DMA1_Stream4,DMA_FLAG_TCIF4)!=SET){};

  while(DMA_GetFlagStatus(DMA1_Stream3,DMA_FLAG_TCIF3)!=SET){};

  DMA_ClearFlag(DMA1_Stream4,DMA_FLAG_TCIF4);
  DMA_ClearFlag(DMA1_Stream3,DMA_FLAG_TCIF3);

  GPIO_SetBits(GPIOB, GPIO_Pin_12);
  return read[3];
}

dmaSEND_TX и dmaRESIVE одинаковы. Прерывания от DMA выключены.

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

void dmaSEND_TX(DMA_Stream_TypeDef* DMAy_Streamx,unsigned char * buf,unsigned int len){
  DMAy_Streamx->CR &= ~(uint32_t)DMA_SxCR_EN;// Запрет DMA

  DMAy_Streamx->PAR= (uint32_t)(&SPI2->DR);
  DMAy_Streamx->NDTR = len;
  DMAy_Streamx->M0AR =  (uint32_t)buf;

  DMAy_Streamx->CR |= (uint32_t)DMA_SxCR_EN; // STArt  DMA
}
Это всё работало , пока не запустил SysTick . В обработчике прерываний нечего нету просто инкремент одной переменной.
После этого через пару вызовов функций WIZCHIP_READ_DMA она зависает на приёмнике

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

   while(DMA_GetFlagStatus(DMA1_Stream3,DMA_FLAG_TCIF3)!=SET){};
Читал где-то что DMA_FLAG выставляется за ранее как только байт положили в регистр.Но как прерывание то может влияет на опрос флага ?


Что происходит с флагами SPI(Приём/передача) после инициализации DMA Они постоянно дёргаются или после того как весь массив передастся они выставятся ? Это вопрос к тому можно ли SPI флага сделать подобную задержку.

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

   while(DMA_GetFlagStatus(DMA1_Stream3,DMA_FLAG_TCIF3)!=SET){};
HHIMERA
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

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

Сообщение HHIMERA »

pokk писал(а): Читал где-то что DMA_FLAG выставляется за ранее как только байт положили в регистр.
Как только началась передача очередных данных периферией...
Но как прерывание то может влияет на опрос флага ?
Никак!!! Это говорит о неправильности кода...
Что происходит с флагами SPI(Приём/передача) после инициализации DMA Они постоянно дёргаются или после того как весь массив
А что говорит даташит??? Вы что... без чтения даташита и без ЛА работаете... наобум??? Флаг BSY для чего существует???
"Я не даю готовых решений, я заставляю думать!"(С)
ut1wpr
Вымогатель припоя
Сообщения: 581
Зарегистрирован: Ср янв 05, 2011 10:03:18

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

Сообщение ut1wpr »

HHIMERA писал(а):А что говорит даташит??? Вы что... без чтения даташита и без ЛА работаете... наобум??? Флаг BSY для чего существует???
Похоже на метод перебора... "Так не получается, а если мы вот так?.."
С уважением,
Виктор.
Ответить

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