x893 51 7 июля Опубликовано 7 июля · Жалоба Изучит https://arm-software.github.io/CMSIS_5/Driver/html/index.html Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimir 2 7 июля Опубликовано 7 июля · Жалоба Насчёт функций по USART _DMA вот так void Usart1_send( uint8_t*data, uint16_t len) { uint8_t i; DMA1_Channel4->CCR&=~DMA_CCR_EN ; for(i = 0; i < len; i++) { txData[i]= *data++; //copy data to buff // *data++; // i++; // i=len; } DMA1_Channel4->CNDTR= len; DMA1_Channel4->CCR|=DMA_CCR_EN ; } буфер extern uint16_t txData[255]; с main.c а как по spi_DMA? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
EdgeAligned 82 8 июля Опубликовано 8 июля · Жалоба 6 часов назад, Intel4004 сказал: Ну я же говорю - вы не знаете, что такое CMSIS. Мало ли че вы говорите. CMSIS - Common Microcontroller Software Interface Standard. Заголовочные файлы STM32 написаны в стандарте CMSIS. В обиходе это называется "писать на регистрах", то есть, непосредственное управление регистрами периферии микроконтроллера, без оберточных функций, посредством предоставленных в заголовочнике определений адресов регистров и номеров битов. Топикстартер спрашивал: как преобразовать функцию HAL_SPI_Transmit() в CMSIS? Вы ответили: SPI_Driver.Send(buff, buff_size); // <<<--- Вот это оно и есть, собственно HAL_SPI_Transmit Только надо сначала написать SPI драйвер. Так вопрос как раз и стоял в том, чтобы написать тот самый драйвер SPI. А вы, не поняв вопроса, вставили длиннющую портянку какой-то фигни, не имеющей отношения к вопросу. Вы сами то хоть понимаете, чего пишите то? Мало того, что показанные портянки, скорее всего, не от STM32, так они еще и не имеют отношения к теме вопроса. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Intel4004 1 8 июля Опубликовано 8 июля (изменено) · Жалоба 3 hours ago, EdgeAligned said: CMSIS - Common Microcontroller Software Interface Standard. О, вы заглянули в википедию? Похвально. 3 hours ago, EdgeAligned said: Заголовочные файлы STM32 написаны в стандарте CMSIS. В обиходе это называется "писать на регистрах". Какой бред. В викистатье про CMSIS вы усвоили только первый абзац? Прочитайте всю статью. А лучше почитайте непосредственно документацию от CMSIS, например про CMSIS SPI Driver. Изменено 8 июля пользователем Intel4004 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
makc 217 8 июля Опубликовано 8 июля · Жалоба Оффтопик удален. Продолжение оффтопика приведет к закрытию темы и раздаче предупреждений. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimir 2 8 июля Опубликовано 8 июля · Жалоба В 07.07.2024 в 08:42, Intel4004 сказал: bool ST7735_Transmit (const void *buff, uint32_t buff_size) { SPI_Driver.Send(buff, buff_size); // <<<--- Вот это оно и есть, собственно HAL_SPI_Transmit #if SPI_POLLING while(SPI_Driver.GetStatus().busy); #else Flags = osThreadFlagsWait(SPI_Flag_Done | SPI_Flag_Error, osFlagsWaitAny, osWaitForever); if (Flags & SPI_Flag_Error) return false; #endif return true; } А где тут регистры? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Intel4004 1 8 июля Опубликовано 8 июля · Жалоба 1 hour ago, dimir said: А где тут регистры? Регистры внутри SPI драйвера. CMSIS к регистрам никакого отношения не имеет. CMSIS - это сборник интерфейсов, которые позволяют отвязать основную программу от железа. Например драйвер SPI выглядит так: typedef struct _ARM_DRIVER_SPI { ARM_DRIVER_VERSION (*GetVersion) (void); ///< Pointer to \ref ARM_SPI_GetVersion : Get driver version. ARM_SPI_CAPABILITIES (*GetCapabilities) (void); ///< Pointer to \ref ARM_SPI_GetCapabilities : Get driver capabilities. int32_t (*Initialize) (ARM_SPI_SignalEvent_t cb_event); ///< Pointer to \ref ARM_SPI_Initialize : Initialize SPI Interface. int32_t (*Uninitialize) (void); ///< Pointer to \ref ARM_SPI_Uninitialize : De-initialize SPI Interface. int32_t (*PowerControl) (ARM_POWER_STATE state); ///< Pointer to \ref ARM_SPI_PowerControl : Control SPI Interface Power. int32_t (*Send) (const void *data, uint32_t num); ///< Pointer to \ref ARM_SPI_Send : Start sending data to SPI Interface. int32_t (*Receive) ( void *data, uint32_t num); ///< Pointer to \ref ARM_SPI_Receive : Start receiving data from SPI Interface. int32_t (*Transfer) (const void *data_out, void *data_in, uint32_t num); ///< Pointer to \ref ARM_SPI_Transfer : Start sending/receiving data to/from SPI. uint32_t (*GetDataCount) (void); ///< Pointer to \ref ARM_SPI_GetDataCount : Get transferred data count. int32_t (*Control) (uint32_t control, uint32_t arg); ///< Pointer to \ref ARM_SPI_Control : Control SPI Interface. ARM_SPI_STATUS (*GetStatus) (void); ///< Pointer to \ref ARM_SPI_GetStatus : Get SPI status. } const ARM_DRIVER_SPI; И при переходе на другой процессор вам надо написать только то, что находится по ту сторону интерфейса, т.е. собственно драйвер. Или даже не писать, а подключить DFP (Device Family Pack) от вашего процессора, который содержит уже готовый драйвер (не у всех процессоров DFP содержит драйвера, как оно у STM32 я не знаю, я с ними не работаю). Повторяю: CMSIS - это не готовый драйвер, это интерфейс драйвера. Стандартизованный интерфейс, не привязанный к железу. А как будут написаны потроха драйвера - это абсолютно не важно. Можно на регистрах, можно на SPL, можно даже на HAL. Не важно. Т.е. если вы написали библиотеку поддержки индикатора ST7735 через HAL SPI драйвер - то вы автоматом привязаны к железу, при переходе на другой процессор вам придется править и эту библиотеку тоже. Если же вы работаете с индикатором через CMSIS SPI драйвер - то при переходе на другой процессор (даже другого производителя, например на атмел или филипс) - вам в вашей библиотеке индикатора ничего править не придется. Надо будет просто подключить SPI драйвер от нужного процессора (или написать, если готового нет), интерфейс у него тот-же самый, и все, что выше драйвера, прекрасно соберется и будет работать. Мой первый комментарий содержит полный развернутый ответ на исходный вопрос, но ирония в том, что чтобы этот ответ понять надо уже обладать достаточной квалификацией, при которой исходный вопрос и не возник бы. Т.ч. x893 частично прав, мой ответ можно считать троллингом. В любом случае, если вы не знаете, что такое CMSIS, с наскоку, за пять минут ничего сделать не получится. В любом случае сначала придется долго читать и изучать что такое CMSIS. Вот тут, например: https://arm-software.github.io/CMSIS_6/latest/General/index.html Если же желания тратить пару месяцев на изучение у вас нет, то единственный правильный ответ на ваш вопрос - никак. 1 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
EdgeAligned 82 8 июля Опубликовано 8 июля · Жалоба Для тех, кто не дочитал до конца документацию, я просто оставлю это здесь: и не благодарите * @file stm32f103x6.h * @author MCD Application Team * @brief CMSIS Cortex-M3 Device Peripheral Access Layer Header File. * This file contains all the peripheral register's definitions, bits * definitions and memory mapping for STM32F1xx devices. * * This file contains: * - Data structures and the address mapping for all peripherals * - Peripheral's registers declarations and bits definition * - Macros to access peripheral’s registers hardware Надоел мне этот бессмысленный флуд и понты не по теме. HAL_SPI_Transmit() можно записать в простом и коротком виде int SPI_Transmit(SPI_TypeDef *spi, const uint8_t *buf, uint16_t size) { if(spi->SR & SPI_SR_BSY) return -1; while(size--) { while(!(spi->SR & SPI_SR_TXE)); spi->DR = *buf++; } while(!(spi->SR & SPI_SR_TXE)); while(spi->SR & SPI_SR_BSY); return 0; } uint8_t arr[10] = {1,2,3,4,5,6,7,8,9,10}; SPI_Transmit(SPI1, arr, sizeof(arr)); Всё. И завязывайте с флудом не по теме вопроса. 1 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tonyk_av 42 8 июля Опубликовано 8 июля · Жалоба 8 hours ago, Intel4004 said: А лучше почитайте непосредственно документацию от CMSIS, например про CMSIS SPI Driver. У STM есть реализация CMSIS под её МК? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimir 2 9 июля Опубликовано 9 июля · Жалоба В 08.07.2024 в 14:42, EdgeAligned сказал: Для тех, кто не дочитал до конца документацию, я просто оставлю это здесь: и не благодарите * @file stm32f103x6.h * @author MCD Application Team * @brief CMSIS Cortex-M3 Device Peripheral Access Layer Header File. * This file contains all the peripheral register's definitions, bits * definitions and memory mapping for STM32F1xx devices. * * This file contains: * - Data structures and the address mapping for all peripherals * - Peripheral's registers declarations and bits definition * - Macros to access peripheral’s registers hardware Надоел мне этот бессмысленный флуд и понты не по теме. HAL_SPI_Transmit() можно записать в простом и коротком виде int SPI_Transmit(SPI_TypeDef *spi, const uint8_t *buf, uint16_t size) { if(spi->SR & SPI_SR_BSY) return -1; while(size--) { while(!(spi->SR & SPI_SR_TXE)); spi->DR = *buf++; } while(!(spi->SR & SPI_SR_TXE)); while(spi->SR & SPI_SR_BSY); return 0; } uint8_t arr[10] = {1,2,3,4,5,6,7,8,9,10}; SPI_Transmit(SPI1, arr, sizeof(arr)); Всё. И завязывайте с флудом не по теме вопроса. Меня интересует 1 строчка функции.Можно наверно по другому записать?.А по DMA как? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
EdgeAligned 82 9 июля Опубликовано 9 июля · Жалоба В исходной функции HAL_SPI_Transmit() изначально DMA в принципе нет. Есть просто отправка в цикле побайтно. Если нужна DMA-отправка, но конфигурируется канал DMA, связанный с SPIx TX, сконфигурированный канал включается, включаются у SPI запросы к DMA по TX. При этом произойдет запуск передачи, ну и после ожидается завершение передачи по DMA через отслеживание бита TCIF в DMA или по соответствующему прерыванию канала DMA, затем ожидается завершение передачи последнего отправленного через DMA байта по SPI. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimir 2 9 июля Опубликовано 9 июля · Жалоба В 08.07.2024 в 14:42, EdgeAligned сказал: int SPI_Transmit(SPI_TypeDef *spi, const uint8_t *buf, uint16_t size); в файле SPI.h пишет ошибку так что наверное не так.Нет компиляции. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
EdgeAligned 82 9 июля Опубликовано 9 июля (изменено) · Жалоба У меня всё компилируется и работает, вон сигналы с лог.анализатора показал. Эт у вас чето не так. Можно убрать SPI_TypeDef *spi, а ниже везде spi заменить на SPI1 или SPI2, SPI3. Изменено 9 июля пользователем EdgeAligned Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimir 2 9 июля Опубликовано 9 июля · Жалоба А какую среду .Где пишите проекты. static void ST7735_WriteData(uint8_t* buff, size_t buff_size) { TFT_DC_D(); // SPI1_trasmit( buff_size); // buff++;buff_size=buff; /* DMA2_Stream2->CR&=~DMA_SxCR_EN; DMA2_Stream2->M0AR |=(uint32_t)& *buff; DMA2_Stream2->PAR |=(uint32_t)&SPI1->DR ; DMA2_Stream2->NDTR =buff_size; DMA2_Stream2->CR|= DMA_SxCR_DIR_0; DMA2_Stream2->CR|=DMA_SxCR_EN; */ //#ifdef USE_SPI_DMA //HAL_SPI_Transmit_DMA(&ST7735_SPI_PORT, buff, buff_size); //while(hspi1.State == HAL_SPI_STATE_BUSY_TX); //#else while(buff_size > 0) { uint16_t chunk_size = buff_size > 32768 ? 32768 : buff_size; for(int i=0; i<chunk_size; i++) { SPI1->DR=buff[i]; while(!(SPI1->SR &SPI_SR_TXE)); } buff += chunk_size; buff_size -= chunk_size; } //HAL_SPI_Transmit(&ST7735_SPI_PORT, buff, buff_size, HAL_MAX_DELAY); //#endif } Вот это не моё но работает.Запустил в регистрах .Портировал.в DMA осталось. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Andrey190 2 10 июля Опубликовано 10 июля · Жалоба SPI1->CR2 &= ~SPI_CR2_TXDMAEN; DMA2_Stream3->CR &= ~DMA_SxCR_EN; DMA2->LIFCR = DMA_LIFCR_CTCIF3 | DMA_LIFCR_CHTIF3 | DMA_LIFCR_CTEIF3 | DMA_LIFCR_CDMEIF3; DMA2_Stream3->NDTR = 48; DMA2_Stream3->M0AR = (uint32_t) &buf[(uint8_t)i][0]; DMA2_Stream3->PAR = (uint32_t)(&SPI1->DR); DMA2_Stream3->CR |= DMA_SxCR_EN; SPI1->CR2 |= SPI_CR2_TXDMAEN; прерывания от DMA не использую. отправка по таймеру Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться