Перейти к содержанию
    

stm32 перевод команд HAL на cmsis или на LL

Насчёт функций по 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?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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, так они еще и не имеют отношения к теме вопроса.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 hours ago, EdgeAligned said:

CMSIS - Common Microcontroller Software Interface Standard.

О, вы заглянули в википедию? Похвально.

3 hours ago, EdgeAligned said:

Заголовочные файлы STM32 написаны в стандарте CMSIS. В обиходе это называется "писать на регистрах".

Какой бред. В викистатье про CMSIS вы усвоили только первый абзац? Прочитайте всю статью.

А лучше почитайте непосредственно документацию от CMSIS, например про CMSIS SPI Driver.

Изменено пользователем Intel4004

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Оффтопик удален. Продолжение оффтопика приведет к закрытию темы и раздаче предупреждений.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 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;
}

А где тут регистры?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Если же желания тратить пару месяцев на изучение у вас нет, то единственный правильный ответ на ваш вопрос - никак.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для тех, кто не дочитал до конца документацию, я просто оставлю это здесь: и не благодарите

  * @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));

Всё. И завязывайте с флудом не по теме вопроса.

Снимок экрана 2024-07-08 173644.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

8 hours ago, Intel4004 said:

А лучше почитайте непосредственно документацию от CMSIS, например про CMSIS SPI Driver.

У STM есть реализация CMSIS под её МК?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 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));

Всё. И завязывайте с флудом не по теме вопроса.

Снимок экрана 2024-07-08 173644.jpg

Меня интересует 1 строчка функции.Можно наверно по другому записать?.А по DMA как?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В исходной функции HAL_SPI_Transmit() изначально DMA в принципе нет. Есть просто отправка в цикле побайтно. Если нужна DMA-отправка, но конфигурируется канал DMA, связанный с SPIx TX, сконфигурированный канал включается, включаются у SPI запросы к DMA по TX. При этом произойдет запуск передачи, ну и после ожидается завершение передачи по DMA через отслеживание бита TCIF в DMA или по соответствующему прерыванию канала DMA, затем ожидается завершение передачи последнего отправленного через DMA байта по SPI. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 08.07.2024 в 14:42, EdgeAligned сказал:
int SPI_Transmit(SPI_TypeDef *spi, const uint8_t *buf, uint16_t size);

в файле SPI.h пишет ошибку так что наверное не так.Нет компиляции.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У меня всё компилируется и работает, вон сигналы с лог.анализатора показал. Эт у вас чето не так.

Можно убрать SPI_TypeDef *spi, а ниже везде spi заменить на SPI1 или SPI2, SPI3.

Изменено пользователем EdgeAligned

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А какую среду .Где пишите проекты.

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 осталось.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

  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 не использую. отправка по таймеру

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...