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
Опытный кот
Сообщения: 717
Зарегистрирован: Вт апр 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»