Jump to content

    

zemlemer

Участник
  • Content Count

    73
  • Joined

  • Last visited

Community Reputation

0 Обычный

About zemlemer

  • Rank
    Участник

Recent Profile Visitors

1945 profile views
  1. прерывания с CMSIS-RTOS

    На исполнении osSemaphoreRelease
  2. прерывания с CMSIS-RTOS

    Понятно что так оставлять нельзя....
  3. прерывания с CMSIS-RTOS

    CMSIS-RTOS. - Это STM-овская надстройка над FreeRTOS. Согласно CMSIS osStatus osSemaphoreRelease ( osSemaphoreId semaphore_id ) Parameters [in] semaphore_id semaphore object referenced with osSemaphoreCreate. Returns status code that indicates the execution status of the function. Release a Semaphore token. This increments the count of available semaphore tokens. Note Interrupt Service Routines can call this function. Что интересно - комментирование configASSERT помогло.
  4. прерывания с CMSIS-RTOS

    Добрый день. У меня произошла неудачная попытка подружиться с CMSIS-RTOS. Что было сделано: Запустил Cube, указал использование cmsis-rtos v1, сделал инициализацию пинов и одного таймера. В программе 2 треда и один семафор. Проверил корректность переключения между задачами — работает. Запустил таймер и прерывание таймера, указав приоритет — работает. /* USER CODE BEGIN TIM3_Init 2 */ HAL_NVIC_SetPriority(TIM3_IRQn, (configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY + 1), 0); HAL_TIM_Base_Start_IT(&htim3); /* USER CODE END TIM3_Init 2 */ В таймере лампочки моргают. Но как только в обработчике прерывания появляется строчка //osSemaphoreRelease(myBinarySemHandle), (согласно документации эта функция имеет право вызываться из прерывания) все намертво встает. Вроде делаю все правильно. В чем может быть причина?
  5. Добрый день. У меня возникли некоторые сложности при использовании Code Composer Studio 8.1. Есть плата от Spectrum Digital. На ней стоит OMAPL137. По проекту нужно будет использовать только DSP часть. Если в настройках проекта поставить EVM6747 - Gel файл грузится, правда не тот что хотелось, но хоть что-то. Попытка выставить в натроойках Device - TMS320C6747 и прописать в Debug Configuration ->Initialization script тот-же gel (evmc6747_dsp.gel) - не грузится и ругается на памать (что не удивительно). Похоже, что та же ситуация с линкером. В опциях проекта прописывается линкеровский cmd, п при полной пересброрке он автоматом генерит новый и пытается подключить оба.
  6. STM32F4: SPI2 через DMA

    Цитата(AHTOXA @ Nov 10 2016, 18:51) И от этого все FF-ы превращаются в нули? От лишнего клока вначале? Естественно. Вместо команды на чтение идет неизвестно что. Цитата(k155la3 @ Nov 11 2016, 18:09) У Вас Код. . . SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Rx, ENABLE); SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Tx, ENABLE); . . . Попробуйте оставить только один канал DMA для проверки - который работает с флеш. Если не секрет, что за флеш используется ? M25P80.
  7. STM32F4: SPI2 через DMA

    Цитата(AHTOXA @ Nov 9 2016, 08:09) Для побайтового доступа надо установить MBURST в 16 (не знаю, чему это соответствует в терминах StdPeriphLib). Вот топик, где я с этим разбирался: ссылка (читать до конца, там есть тонкие моменты с выравниванием). Оказалось все гораздо проще. Если выставить chip select до старта spi, то ловится лишний клок.
  8. STM32F4: SPI2 через DMA

    Цитата(rtfcnf @ Nov 8 2016, 08:57) Попробуйте определить массивы для DMA, с атрибутом __attribute__((aligned(32))) мой массив uint8_t spi1_rx[ADS131_DATA_SIZE] __attribute__((aligned(32))); Без изменений, к сожалению.
  9. STM32F4: SPI2 через DMA

    Добрый день. Вроде не первый раз пишу для STM и вроде по букварю, но нарвался. Есть STM32F405. К нему через SPI2 присоединена флеша на spi. Читаю из порта данные флеши вручную - корректно. Как только читаю по DMA - в приемном буфере нули. Код инициализации порта: CODE // 1. Clock setup: spi port and pins RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1, ENABLE); // 2. Pins setup GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; // SCK GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_Init(GPIOB, &GPIO_InitStructure); // MISO GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; GPIO_Init(GPIOC, &GPIO_InitStructure); // MOSI GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; GPIO_Init(GPIOC, &GPIO_InitStructure); GPIO_PinAFConfig(GPIOB, GPIO_PinSource10, GPIO_AF_SPI2); // SCK GPIO_PinAFConfig(GPIOC, GPIO_PinSource2, GPIO_AF_SPI2); // MISO GPIO_PinAFConfig(GPIOC, GPIO_PinSource3, GPIO_AF_SPI2); // MOSI // NSS GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_SetBits(GPIOB, GPIO_Pin_12); // 3. SPI setup setFlashNssHigh(); SPI_InitTypeDef SPI_InitStructure; SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; SPI_InitStructure.SPI_Mode = SPI_Mode_Master; SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; // SPI_CPOL_Low SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; //SPI_CPHA_1Edge SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16; // SPI_BaudRatePrescaler_2 SPI_BaudRatePrescaler_4;// SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; SPI_InitStructure.SPI_CRCPolynomial = 7; SPI_Init(SPI2, &SPI_InitStructure); while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET); SPI_Cmd(SPI2, ENABLE); Читаю данные: CODE setTerminalMessage(info, "Reading data"); setFlashNssLow(); spiByteExchange(READ_DATA); // command spiByteExchange(0x00); // address spiByteExchange(0x00); // address spiByteExchange(0x00); // address for(i = 0; i < 20; i++){ rcvByte = spiByteExchange(0x00); setTerminalMessage(info, "Data[%02d] - %02x", i, rcvByte); } setFlashNssHigh(); Получаю FF на выходе, что корректно. Также корректно читается ID flash памяти. Пытаюсь инициализировать DMA CODE DMA_Cmd(DMA1_Stream3, DISABLE); DMA_Cmd(DMA1_Stream4, DISABLE); SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Rx, DISABLE); SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Tx, DISABLE); SPI_Cmd(SPI2, DISABLE); DMA_DeInit(DMA1_Stream4); while (DMA_GetCmdStatus(DMA1_Stream4) != DISABLE); DMA_DeInit(DMA1_Stream3); while (DMA_GetCmdStatus(DMA1_Stream3) != DISABLE); memset((void *)gl_rcvFlashBuffer, 0, DMA_BUFF_SZ); memset((void *)gl_trnFlashBuffer, 0, DMA_BUFF_SZ); gl_trnFlashBuffer[0] = READ_DATA; // PAGE_PROGRAM; // 1. DMA Clock RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1, ENABLE); // 2. Interrupt NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = DMA1_Stream3_IRQn; // Only rx interrupt NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); // 2. DMA Structure // DMA_InitTypeDef DMA_InitStructure; // 2.2. Common DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable; DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_1QuarterFull; DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single; DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; DMA_InitStructure.DMA_Priority = DMA_Priority_High; DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_Channel = DMA_Channel_0; DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&(SPI2->DR)); // 2.3. TX DMA DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)gl_trnFlashBuffer; DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral; DMA_InitStructure.DMA_BufferSize = DMA_BUFF_SZ; DMA_Init(DMA1_Stream4, &DMA_InitStructure); // 2.3. RX DMA DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)gl_rcvFlashBuffer; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory; DMA_InitStructure.DMA_BufferSize = DMA_BUFF_SZ; DMA_Init(DMA1_Stream3, &DMA_InitStructure); // 2.4. Enabling only rx interrupt DMA_ITConfig(DMA1_Stream3, DMA_IT_TC , ENABLE); DMA_ClearFlag(DMA1_Stream3, DMA_FLAG_TCIF3); DMA_ClearFlag(DMA1_Stream4, DMA_FLAG_TCIF4); DMA_Cmd(DMA1_Stream3, ENABLE); // Enable the DMA SPI RX Stream DMA_Cmd(DMA1_Stream4, ENABLE); // Enable the DMA SPI TX Stream SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Rx, ENABLE); SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Tx, ENABLE); setTerminalMessage(info, "Starting"); setFlashNssLow(); gl_FlashDmaOn = true; SPI_Cmd(SPI2, ENABLE); while(true == gl_FlashDmaOn); setTerminalMessage(info, "Done"); setTerminalMessage(info, "DMA read data"); for(i = 0; i < 50; i++){ setTerminalMessage(info, "Data[%02d] - %02x", i, gl_rcvFlashBuffer[i]); } Код прерывания: CODE void DMA1_Stream3_IRQHandler(void) { if(DMA_GetITStatus(DMA1_Stream3, DMA_IT_TCIF3)!= RESET){ DMA_ClearITPendingBit(DMA1_Stream3, DMA_IT_TCIF3); // Clear NSS gl_FlashDmaOn = false; setFlashNssHigh(); } } Буфера объявлены как #define DMA_BUFF_SZ (256 + 4) static uint8_t gl_trnFlashBuffer[DMA_BUFF_SZ]; static uint8_t gl_rcvFlashBuffer[DMA_BUFF_SZ]; volatile bool_t gl_FlashDmaOn = false; По осциллогафу на chip select DMA отрабатывает корректно, в приемном буфере - нули. Есть ли мысли? Может надо как-то выравнивать буфер? Или забыл что?
  10. Вывод float в arm-none-eabi-gcc для stmf4

    Цитата(demiurg_spb @ Oct 23 2016, 00:21) Я каждый раз задаюсь вопросом: в чём был смысл такого решения при создании сишной библиотеки? Смыслов несколько. У меня статически выделен массив для передачи строки в терминал, а стандартные работают с динамическим перераспределением памяти. Использовать malloc или realloc нужно когда совсем припрет. Мне не нужны все возможности printf или sprintf (кто-нить использовал \b или \v или ..... ), но все лишнее намертво прилепится к выходному бинарнику.
  11. Вывод float в arm-none-eabi-gcc для stmf4

    Цитата(iiv @ Oct 21 2016, 22:03) если у вас одинарная точность, sprintf хочет %f или %e или %g, а если двойная, то да, с "l" надо писать. Знаю. Просто va_arg не работает с float, поэтому перед передачей я преобразовывал в double а после - обратно во float.
  12. Вывод float в arm-none-eabi-gcc для stmf4

    Цитата(scifi @ Oct 20 2016, 20:22) Я невнимательно посмотрел. Если линкуется целочисленная версия, не будет вот этих странных чисел. Обратите внимание на выравнивание стека по границе 8 байт. Помню, это приводило к чудесам в плавучке. Вроде к линковщике секция с правильным ALIGN, или я не правильно понял. Код  ._user_heap_stack :   {     . = ALIGN(4);     PROVIDE ( end = . );     PROVIDE ( _end = . );     PROVIDE ( __end__ = . );     . = . + _Min_Heap_Size;     . = . + _Min_Stack_Size;     . = ALIGN(4);   } >RAM Вообще ситуация еще более печальна. Задавая вопрос, я просто упростил сложившуюся ситуацию. На самом деле я пишу небольшую библиотеку для отладочного вывода. Парсер разбора форматной строки - va_arg - корректно работает с целочисленными переменными. Т.е. intarg = va_arg(ap, int32_t); отрабатывает корректно. Как только речи идет о передаче плавучки - doublearg = va_arg(ap, double); - передается мусор. Если передать float через *((int32_t*)&floatarg и передать через va_arg(ap, int32_t); - передается правильно.
  13. Вывод float в arm-none-eabi-gcc для stmf4

    Цитата(scifi @ Oct 20 2016, 18:26) В командную строку линкера нужно добавить "-u _printf_float". Первоисточник. На самом деле пробовал с -u _printf_float и с -u _sprintf_float с одинаковым результатом.
  14. Добрый день. Я меня возникли некоторые проблемы с выводом в терминал значений с плавающей точкой. Самый обычный sprintf прекрасно работает с целыми числами и отказывается работать с float. Например CODE float flttest = 123.45678; sprintf(TestArray, "-= %lf =-", flttest); Terminal("Test1: STR %s", TestArray); uint16_t integer= 12345; sprintf(TestArray, "*- %d -*", integer); Terminal("Test2: STR %s", TestArray); При этот вывод: 003 INFO: Test1: STR -= 403099659660755.687500 =- 004 INFO: Test2: STR *- 12345 -* Основные ключи компилятора: arm-none-eabi-gcc -c -mthumb -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16 -mlittle-endian -mthumb-interwork -ffunction-sections -fdata-sections -Wl,--gc-sections Основные ключи линкера: arm-none-eabi-gcc -mthumb -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16 -Xlinker -Map="project.map" -L/opt/gcc-arm-none-eabi-5_4/arm-none-eabi/lib/armv7e-m/fpu/ --specs=rdimon.specs -T/Core/STM32F4XX_FLASH.ld Кто-либо сталкивался с подобным?
  15. STM32F103 и I2S

    Добрый день. Возникла следующая проблема: I2S в режиме slave не работает. Вроде пишу все по правилам: CODE I2S_InitTypeDef I2S_InitStructure; #define I2S_CODEC SPI2 // 1. Clock RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE); // 2. Pins GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_15; // wclk | bclk | sd GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); // 4. I2S setup SPI_I2S_DeInit(I2S_CODEC); I2S_InitStructure.I2S_Mode = I2S_Mode_SlaveRx; //I2S_Mode_SlaveTx; I2S_InitStructure.I2S_Standard = I2S_Standard_Phillips; I2S_InitStructure.I2S_DataFormat = I2S_DataFormat_16b; // I2S_DataFormat_16bextended I2S_InitStructure.I2S_MCLKOutput = I2S_MCLKOutput_Disable; I2S_InitStructure.I2S_AudioFreq = I2S_AudioFreq_Default; I2S_InitStructure.I2S_CPOL = I2S_CPOL_Low; I2S_Init(I2S_CODEC, &I2S_InitStructure); I2S_Cmd(I2S_CODEC, ENABLE); setTerminalMessage(info, "Starting test DAC"); SPI_I2S_ReceiveData(I2S_CODEC); for(;;) { setTerminalMessage(info, "Tp0"); while (SPI_I2S_GetFlagStatus(I2S_CODEC, SPI_I2S_FLAG_RXNE) == RESET); setTerminalMessage(info, "Tp1"); setTerminalMessage(info, "Data received - %04x", SPI_I2S_ReceiveData(I2S_CODEC)); } Программа взвисает на приеме: SPI_I2S_FLAG_RXNE не выставляется. При этом кодек испавно подает WCLK и BCLK и выглядят они как phillips прописал: ровно 16 BCLK на каждый перепад WCLK. Никто с подобным не сталкивался?