Страница 1 из 10
Буфер данных Stm32f103c8
Добавлено: Пн авг 06, 2018 21:12:36
khch
Бобры вечер, люди.
Изучаю, только начал. И мне нужна помощь (не такая типа "мля, вот нагугли, кури даташиты...", крили гуглили).
У меня такой вопрос.
Вот есть в библиотеке HAL такой код
Код: Выделить всё
#define RCC ((uint8_t *) 0xcccccccc) // неважен смысл и где это все
typedef struct
{
....
uint8_t GRH;
.....
} SPI_TypedefChto_totam;
RCC->GRH =.....
И вот я делую точно так же, создаю такую структуру, но внутри массив
typedef struct
{
int Data_buff[512];
}SPI_Data_BuffType;
Дефаню пойнтер с адресом в области SRAM 0x30000000
и хрен там. Мой пойнтер ни видно!!!
С чего бы?
Re: Буфер данных Stm32f103c8
Добавлено: Пн авг 06, 2018 21:44:34
Аlex
Вы сами поняли, что написали ?

Хоть бы кусок кода, чтоли прилепили ...
Кстати, в коде, который Вы показали из библиотеки, ошибка.
RCC - указатель на
uint8_t, а не на структуру.
Re: Буфер данных Stm32f103c8
Добавлено: Пн авг 06, 2018 21:48:44
arkhnchul
что значит "не видно"?
Re: Буфер данных Stm32f103c8
Добавлено: Пн авг 06, 2018 21:56:54
khch
Я заставил все заработать...
Почти все.
Но у меня в заголовочном файле не распознает тип uint8_t.
С чего бы...
Добавлено after 5 minutes 19 seconds:
[uquote="Аlex",url="/forum/viewtopic.php?p=3433193#p3433193"]RCC - указатель на uint8_t, а не на структуру.[/uquote]
Разве это не первый элемент структуры?
Re: Буфер данных Stm32f103c8
Добавлено: Пн авг 06, 2018 22:03:27
Аlex
khch писал(а):Разве это не первый элемент структуры?
С чего бы ? Где Вы тут видите хоть одно упоминание о структуре :
?
Я вижу указатель на
uint8_t с адресом
0xcccccccc.
Re: Буфер данных Stm32f103c8
Добавлено: Пн авг 06, 2018 22:03:49
arkhnchul
в приведенном фрагменте кода - нет. Компилятор на такое ругнется типа "человек, что ты мне втираешь, у uint8_t нет поля GRH"
Re: Буфер данных Stm32f103c8
Добавлено: Пн авг 06, 2018 22:06:14
Oxford
Я не понимаю ваш подход к программированию. Что вы хотите сделать?
Скриншот или текст что компилятор говорит.
Re: Буфер данных Stm32f103c8
Добавлено: Пн авг 06, 2018 22:07:05
arkhnchul
кстати, в чем конечная цель вот этого телодвижения -
[uquote="khch",url="/forum/viewtopic.php?p=3433187#p3433187"]Дефаню пойнтер с адресом в области SRAM 0x30000000[/uquote]
во что бы то ни стало разместить массив по определенному адресу? По-хорошему это делается не так. Раскидывать переменные по памяти - дело линкера, и пинать надо именно его.
Re: Буфер данных Stm32f103c8
Добавлено: Пн авг 06, 2018 22:08:16
Аlex
khch писал(а):крили гуглили
По всей видимости - плохо курили и гуглили. Так что :
khch писал(а):"мля, вот нагугли, кури даташиты..."
Вы задаёте вопросы, ответы на которые гуглятся за секунды. Это всё азы языка Си ...
Re: Буфер данных Stm32f103c8
Добавлено: Пн авг 06, 2018 22:11:17
khch
Код: Выделить всё
typedef struct
{
uint8_t Data_buff[512];
}SPI_Data_BuffType;
void DMA_ACCUM ()
{
uint8_t Data;
HAL_SPI_Receive_DMA (&hspi1, &Data, 1);
Pointer->Data_buff[0] = Data; // pointer задан дефайном, как указал ранее.
}
Компилятор доволен. Что настораживает. Впрочем это так, только понимание работы.
пытаюсь принять черех SPI непрерывный поток данных, отправить это все в буфер и так дальше....
Добавлено after 1 minute 25 seconds:
[uquote="Аlex",url="/forum/viewtopic.php?p=3433208#p3433208"]
khch писал(а):крили гуглили
По всей видимости - плохо курили и гуглили. Так что :
khch писал(а):"мля, вот нагугли, кури даташиты..."
Вы задаёте вопросы, ответы на которые гуглятся за секунды. Это всё азы языка Си ...[/uquote]
Видимо плохо, да.
Конечно за секунды. Все нормально, спасибо. Я не знал про гугл, наврал просто. Вы мне глаза открыли...
Re: Буфер данных Stm32f103c8
Добавлено: Пн авг 06, 2018 22:16:22
Аlex
khch писал(а):Pointer->Data_buff[0] = Data; // pointer задан дефайном, как указал ранее
Если так :
то компилятор просто обязан Вас отругать.
Re: Буфер данных Stm32f103c8
Добавлено: Пн авг 06, 2018 22:25:23
khch
Извините, он не ругает. Может работать не будет, но не ругает.
Добавлено after 1 minute 5 seconds:
Но почему должен?
Добавлено after 3 minutes 58 seconds:
Блин... Дошло... Там же вместо uint должно быть название структуры... Мать её.
Re: Буфер данных Stm32f103c8
Добавлено: Вт авг 07, 2018 11:04:15
khch
Я, кстати, в коде правильно написал

Это тут набрал неверно. Потому и не ругался компайлер
Добавлено after 2 minutes 10 seconds:
Слушайте, а куда DMA укладывает данные с регистра данных SPI ?
HAL_SPI_Receive_DMA -- вот функция
Я принудительно написал адрес SRAM. Но ведь
Добавлено after 38 minutes 2 seconds:
Люди, обьясните как по этому коду найти куда функция пересылает данные?
Код: Выделить всё
HAL_SPI_Receive_DMA(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size)
{
HAL_StatusTypeDef errorcode = HAL_OK;
if((hspi->Init.Direction == SPI_DIRECTION_2LINES)&&(hspi->Init.Mode == SPI_MODE_MASTER))
{
hspi->State = HAL_SPI_STATE_BUSY_RX;
/* Call transmit-receive function to send Dummy data on Tx line and generate clock on CLK line */
return HAL_SPI_TransmitReceive_DMA(hspi, pData, pData, Size);
}
/* Process Locked */
__HAL_LOCK(hspi);
if(hspi->State != HAL_SPI_STATE_READY)
{
errorcode = HAL_BUSY;
goto error;
}
if((pData == NULL) || (Size == 0U))
{
errorcode = HAL_ERROR;
goto error;
}
/* Set the transaction information */
hspi->State = HAL_SPI_STATE_BUSY_RX;
hspi->ErrorCode = HAL_SPI_ERROR_NONE;
hspi->pRxBuffPtr = (uint8_t *)pData;
hspi->RxXferSize = Size;
hspi->RxXferCount = Size;
/*Init field not used in handle to zero */
hspi->RxISR = NULL;
hspi->TxISR = NULL;
hspi->TxXferSize = 0U;
hspi->TxXferCount = 0U;
/* Configure communication direction : 1Line */
if(hspi->Init.Direction == SPI_DIRECTION_1LINE)
{
SPI_1LINE_RX(hspi);
}
#if (USE_SPI_CRC != 0U)
/* Reset CRC Calculation */
if(hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)
{
SPI_RESET_CRC(hspi);
}
#endif /* USE_SPI_CRC */
/* Set the SPI RxDMA Half transfer complete callback */
hspi->hdmarx->XferHalfCpltCallback = SPI_DMAHalfReceiveCplt;
/* Set the SPI Rx DMA transfer complete callback */
hspi->hdmarx->XferCpltCallback = SPI_DMAReceiveCplt;
/* Set the DMA error callback */
hspi->hdmarx->XferErrorCallback = SPI_DMAError;
/* Set the DMA AbortCpltCallback */
hspi->hdmarx->XferAbortCallback = NULL;
/* Enable the Rx DMA Stream */
HAL_DMA_Start_IT(hspi->hdmarx, (uint32_t)&hspi->Instance->DR, (uint32_t)hspi->pRxBuffPtr, hspi->RxXferCount);
/* Check if the SPI is already enabled */
if((hspi->Instance->CR1 &SPI_CR1_SPE) != SPI_CR1_SPE)
{
/* Enable SPI peripheral */
__HAL_SPI_ENABLE(hspi);
}
/* Enable the SPI Error Interrupt Bit */
SET_BIT(hspi->Instance->CR2, SPI_CR2_ERRIE);
/* Enable Rx DMA Request */
SET_BIT(hspi->Instance->CR2, SPI_CR2_RXDMAEN);
error:
/* Process Unlocked */
__HAL_UNLOCK(hspi);
return errorcode;
}
Re: Буфер данных Stm32f103c8
Добавлено: Вт авг 07, 2018 11:11:30
ARV
(uint32_t)hspi->pRxBuffPtr - это не оно?
Re: Буфер данных Stm32f103c8
Добавлено: Вт авг 07, 2018 11:23:36
khch
Код: Выделить всё
typedef struct __SPI_HandleTypeDef
{
SPI_TypeDef *Instance; /*!< SPI registers base address */
SPI_InitTypeDef Init; /*!< SPI communication parameters */
uint8_t *pTxBuffPtr; /*!< Pointer to SPI Tx transfer Buffer */
uint16_t TxXferSize; /*!< SPI Tx Transfer size */
__IO uint16_t TxXferCount; /*!< SPI Tx Transfer Counter */
uint8_t *pRxBuffPtr; /*!< Pointer to SPI Rx transfer Buffer */
uint16_t RxXferSize; /*!< SPI Rx Transfer size */
__IO uint16_t RxXferCount; /*!< SPI Rx Transfer Counter */
void (*RxISR)(struct __SPI_HandleTypeDef * hspi); /*!< function pointer on Rx ISR */
void (*TxISR)(struct __SPI_HandleTypeDef * hspi); /*!< function pointer on Tx ISR */
DMA_HandleTypeDef *hdmatx; /*!< SPI Tx DMA Handle parameters */
DMA_HandleTypeDef *hdmarx; /*!< SPI Rx DMA Handle parameters */
HAL_LockTypeDef Lock; /*!< Locking object */
__IO HAL_SPI_StateTypeDef State; /*!< SPI communication state */
__IO uint32_t ErrorCode; /*!< SPI Error code */
}SPI_HandleTypeDef;
Это все, что я могу о нем сказать.
Re: Буфер данных Stm32f103c8
Добавлено: Вт авг 07, 2018 11:30:54
ARV
комментарии к коду не пробовали читать, если уж документацию на HAL лень?
Pointer to SPI Rx transfer Buffer
Re: Буфер данных Stm32f103c8
Добавлено: Вт авг 07, 2018 14:30:33
khch
[uquote="ARV",url="/forum/viewtopic.php?p=3433435#p3433435"]комментарии к коду не пробовали читать, если уж документацию на HAL лень?
Pointer to SPI Rx transfer Buffer[/uquote]
Изучаю. Не могу найти.
Подозреваю, что нет.Думаю это пойнтер на регистр данных в SPI. А мне нужно место, куда ДМА записывает поступившие данные
Re: Буфер данных Stm32f103c8
Добавлено: Вт авг 07, 2018 14:52:34
VladislavS
Вы чё, прикалываетесь?
Код: Выделить всё
/* Enable the Rx DMA Stream */
HAL_DMA_Start_IT(hspi->hdmarx, (uint32_t)&hspi->Instance->DR, (uint32_t)hspi->pRxBuffPtr, hspi->RxXferCount);
Re: Буфер данных Stm32f103c8
Добавлено: Вт авг 07, 2018 15:09:27
ARV
khch писал(а):Думаю это пойнтер на регистр данных в SPI
разве РЕГИСТР теперь называется БУФФЕР?
ARV писал(а):Pointer to SPI Rx transfer Buffer
вы это можете прочесть и перевести?
Re: Буфер данных Stm32f103c8
Добавлено: Вт авг 07, 2018 15:17:50
khch
[uquote="ARV",url="/forum/viewtopic.php?p=3433517#p3433517"]
khch писал(а):разве РЕГИСТР теперь называется БУФФЕР?
ARV писал(а):Pointer to SPI Rx transfer Buffer
вы это можете прочесть и перевести?[/uquote]
Давайте постараемся быть сдержанее. Мне очень полезен ваш ответ. Но если он будет сопровождаться хамством по отношению ко мне - воздержитесь.
Да, я не плачУ за знания, а вы мне не обязаны отвечать.
Я в этом деле совсем новичок. Ничего не понимаю. Зачастую люди используют одному и тому же процессу\явлению разные названия, используют сленг и я пытаюсь защититься от этих ошибок.
И потом мне бы хотелось знать где именно этот буфер.