STM32 новичку в ARM что к чему

Кто любит RISC в жизни, заходим, не стесняемся.
jcxz
Мудрый кот
Сообщения: 1717
Зарегистрирован: Вт авг 15, 2017 10:51:13

Re: STM32 новичку в ARM что к чему

Сообщение jcxz »

[uquote="Reflector",url="/forum/viewtopic.php?p=3456760#p3456760"]В кортексах есть PendSV - это как раз прерывание генерируемое программно[/uquote]
Да - оптимально использовать его. Но можно и любой другой свободный вектор.
Можно вообще для каждого флага свой диспетчер сделать со своим вектором прерывания, возбуждаемым программно из аппаратного ISR.

[uquote="Reflector",url="/forum/viewtopic.php?p=3456760#p3456760"]Фактически можно в основном цикле проверять низкоприоритетные флаги, обработчики которых могут занимать длительное время, при этом периодически в прерывании таймера(и/или в обработчиках других прерываний) генерить PendSV и в нем запускать более приоритетные задачи, причем в самом прерывании таймера можно обрабатывать задачи с приоритетов выше тех, которые выполняются в PendSV, т.е. уже получилось 3 приоритета, если не считать полтора десятка приоритетов всех остальных прерываний.[/uquote]
Это уже эмуляция подобия РТОС. 8) Лучше тогда уж автору освоить любую готовую РТОС.
А фоновый процесс лучше использовать для измерения загрузки CPU.
Реклама
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: STM32 новичку в ARM что к чему

Сообщение dosikus »

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

HAL_TIM_Base_Start_DMA - эта хрень только конфигурирует реквесты UP к DMA.
Все остальное - источник и приемник , размер данных, источник реквестов и счетчик конфигурируется в канале DMA , это если F1 в F4 -потоки.

Все делается просто и прозрачно.
Непонятно только зачем BSSR , для него надо специально подготавливать буфер.

Для чипов с каналами DMA:
Конфигурим таймер как счетчик вверх с включением реквеста DMA.
Конфигурим канал DMA .

Код: Выделить всё

void Init_TIM3(void)
{
RCC->APB1ENR |= RCC_APB1ENR_TIM3EN;   // TIM3 clock enable

TIM3->PSC  = (SystemCoreClock/(DIGITS * 50 * 1000)) - 1;  //240 
TIM3->ARR  = 1000 - 1;

              
        
TIM3->DIER  |= TIM_DIER_UDE;                    // Upload DMA Enable

        
TIM3->CR1   |= TIM_CR1_CEN | TIM_CR1_ARPE;      // Counter Enable

}


void Init_DMA(void)
{    
RCC->AHBENR |= RCC_AHBENR_DMA1EN;
    
DMA1_Channel3->CPAR = (uint32_t)&GPIOA->BSSR;     // DMA channel x peripheral address register
DMA1_Channel3->CMAR = (uint32_t)Data_Buffer;     // DMA channel x memory address register    
DMA1_Channel3->CNDTR = DIGITS;                   // DMA channel x number of data register

DMA1_Channel3->CCR  |=  DMA_CCR_MSIZE_0;         // Memory size 16 bit
DMA1_Channel3->CCR  |=  DMA_CCR_PSIZE_0;         // Peripheral size 16 bit

DMA1_Channel3->CCR  |=  DMA_CCR_PL_1;            // Channel Priority level High 
DMA1_Channel3->CCR  |=  DMA_CCR_MINC;            // Memory increment mode 
DMA1_Channel3->CCR  |=  DMA_CCR_CIRC;            // Circular mode
DMA1_Channel3->CCR  |=  DMA_CCR_DIR;             // Data transfer direction Memory -> Peripheral

DMA1_Channel3->CCR  |=  DMA_CCR_EN;              // Channel enable
}

Реклама
Аватара пользователя
Oxford
Опытный кот
Сообщения: 819
Зарегистрирован: Вт окт 23, 2012 13:17:25
Откуда: Прокопьевск
Контактная информация:

Re: STM32 новичку в ARM что к чему

Сообщение Oxford »

В калокубе учить не надо ничего типо. Их манит это как мух на гавно.
Инженер R@D

Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Re: STM32 новичку в ARM что к чему

Сообщение a5021 »

Учить там надо все равно. Только изучать придется не железо и техники обращения с ним, а весьма необычные представления индусов о прекрасном (HAL).
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

Re: STM32 новичку в ARM что к чему

Сообщение WiseLord »

Я с STM32 только начал активно знакомиться. И как по мне - CubeMX достаточно хорош для того, чтобы в сторонке от основного проекта сгенерировать код инициализации какой-нибудь периферии, чтобы можно было подсмотреть некоторые приёмы использования.

В частности, в интернете везде кругом используют либо устаревший SPL, либо тяжеловесный HAL. А такая альтернатива, как LL (low-level library), как-то мало описана. И CubeMX, позволяющий сгенерировать код с ней, является достаточно неплохим подспорьем.

Но, опять же повторю - в моём случае - только как генератор кода, который можно подсмотреть, но не тащить весь генерированный код в свой проект.
Реклама
jcxz
Мудрый кот
Сообщения: 1717
Зарегистрирован: Вт авг 15, 2017 10:51:13

Re: STM32 новичку в ARM что к чему

Сообщение jcxz »

[uquote="WiseLord",url="/forum/viewtopic.php?p=3457280#p3457280"]в интернете везде кругом[/uquote]
Не говорите за всех! Нигде и никогда не использовал никаких библиотек для общения с периферией. Исключительно - даташит и юзермануал.
В "библиотеках" обычно нуждаются те, кто не в состоянии сам понять по мануалу как работает периферия.
Реклама
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: STM32 новичку в ARM что к чему

Сообщение dosikus »

WiseLord, любители гоуту выбирают калокуб? Это уже диагноз...

Что помешало лично вам изучить железо? Тоскливое наследство avr или догмы вашего гуру ARV?
Без калокубов и прочей визуальной хрени , используя только документацию от вендора, вменяемо изучается любой камень.

На данный момент - STM32, NXP, NRF от нордика, на подходе GD32 и HC32...

Но вы продолжайте тыкать в калокубе...

[uquote="WiseLord",url="/forum/viewtopic.php?p=3457280#p3457280"]Но, опять же повторю - в моём случае - только как генератор кода, который можно подсмотреть, но не тащить весь генерированный код в свой проект.[/uquote]

С калокубом не получиться быть частично беременной, или вы юзаете г.код, либо нет. Ничего полезного из него не взять...
Последний раз редактировалось dosikus Сб сен 15, 2018 10:34:18, всего редактировалось 1 раз.
Аватара пользователя
uldemir
Друг Кота
Сообщения: 7359
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Re: STM32 новичку в ARM что к чему

Сообщение uldemir »

Ага, сейчас модераторы и эту тему почистят от срача "гото" и я не буду знать, что хоть кто-то что-то дельное ответил.

Для совершенно невменяемых - мне нужно сделать совместимыми с кубовским инитом сие строчки:

Код: Выделить всё

	// TIM4 - PWM for display.
		// Настроить ARR - коэффициент деления частоты сканирования индикации.
		TIM4->CR1 &= ~TIM_CR1_CEN ; // disable timer
		TIM4->PSC = 0;
		TIM4->ARR = 10928-1; // 8MHz / 10928 = 732Hz / 5 = 146 Hz
		TIM4->CR1 |= TIM_CR1_URS |  TIM_CR1_ARPE ; // only overfow generate UEV
		TIM4->DIER |= TIM_DIER_UDE | TIM_DIER_UIE; // Update DMA enable.
		TIM4->CR1  |= TIM_CR1_CEN   ; //enable timer
	}
	if (phase == 2) {
		// Канал 7 ПДП для динамической индикации (из ОЗУ в GPIO)
		// Настроить CPAR, если используется другой GPIO
		DMA1_Channel7->CPAR = (uint32_t) (&(GPIOA->BSRR)); // (3)
		DMA1_Channel7->CMAR = (uint32_t)(videobuff); // (4)
		DMA1_Channel7->CNDTR = MAXGRID; // (5) 
		DMA1_Channel7->CCR |= DMA_CCR7_MINC | DMA_CCR7_MSIZE_1 | DMA_CCR7_PSIZE_1 | DMA_CCR7_CIRC | DMA_CCR7_DIR | DMA_CCR7_TCIE; // (6)  
		DMA1_Channel7->CCR |= DMA_CCR7_EN; // (7) 
	}
Вопрос как, так как особо вкуриваться в HAL мне не охота.
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: STM32 новичку в ARM что к чему

Сообщение dosikus »

uldemir , лучше описать что нужно в итоге ...
Если нужна аппаратная динамическая индикация на LED , то все уже сляпано -см. пост №8 http://kazus.ru/forums/showthread.php?t=107109
С городками и официантками...

[uquote="uldemir",url="/forum/viewtopic.php?p=3457305#p3457305"]Для совершенно невменяемых - мне нужно сделать совместимыми с кубовским инитом сие строчки:[/uquote]

Там где вы взяли этот код нет инита?
И невменяемого скрещивать адекватный код с калокубом...
jcxz
Мудрый кот
Сообщения: 1717
Зарегистрирован: Вт авг 15, 2017 10:51:13

Re: STM32 новичку в ARM что к чему

Сообщение jcxz »

[uquote="dosikus",url="/forum/viewtopic.php?p=3457299#p3457299"]WiseLord, любители гоуту выбирают калокуб? Это уже диагноз...
На данный момент - STM32, NXP, NRF от нордика, на подходе GD32 и HC32...[/uquote]
Хех!:
NXP (LPC17xx, LPC43xx), Tiva (TM4C129), OMAP-L137 (ARM9+DSP+PRUSS), TMS320VC5502, MSP430FR5xx, STM32F4xxx/STM32F103, STM8S, XMC4500/4700 - и везде только мануал и даташит. 8)
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: STM32 новичку в ARM что к чему

Сообщение dosikus »

jcxz, ну вот же. А тут тыркаются болезные в калокубе ...
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Re: STM32 новичку в ARM что к чему

Сообщение a5021 »

[uquote="WiseLord",url="/forum/viewtopic.php?p=3457280#p3457280"]Я с STM32 только начал активно знакомиться. И как по мне - CubeMX достаточно хорош для того, чтобы в сторонке от основного проекта сгенерировать код инициализации какой-нибудь периферии, чтобы можно было подсмотреть некоторые приёмы использования.[/uquote]
Посмотреть можно, но вот увидеть что-либо полезное довольно затруднительно. Куб сначала генерирует инициализацию неких объемных структур, универсальных, по замыслу индусов, для всей линейки и всех семейств, а затем, крайне непрозрачным способом переваливает данные из этих структур, собственно, в регистры МК. Получается каша и какая-то жуткая дребедень, где дефолтные значения регистров переписываются точно такими же значениями, а бывает, что и по нескольку раз. Глядя на структуры инициализации, нет никакой возможности понять, какие из полей для конкретного МК надо заполнять, т.к. структуры универсальные и полей там на все случаи жизни. И получается полная хрень -- для того, чтобы полноценно использовать HAL, по хорошему, надо и сам HAL знать хорошо и знание железа никак не обойти. По факту, нужно изучать два разных представления одного и того же. Очевидно, что это избыточно и совершенно ни к чему.

Куб был бы хорош, если бы генерировал регистровые инициализации. Компактные, с комментариями, похожие на то, что мог бы написать квалифицированный программист. Это был бы отличный иллюстратор к референсу и замечательное подспорье для обучения. К сожалению, на данный момент даже с учетом внедрения LL, куб еще слишком далек от этой цели.
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3383
Зарегистрирован: Пн окт 11, 2010 19:00:08

Re: STM32 новичку в ARM что к чему

Сообщение Мурик »

Не все же такие задроты как вы. :)))
Кроме МК есть другие дела. :)
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: STM32 новичку в ARM что к чему

Сообщение dosikus »

Мурик, изучаю время от времени или в обеденный перерыв либо когда есть время в выходные.
Насчет задротов- проще и действенней изучить матчасть чем над**чивать в калокубе.
А любовь к барсикам и визуальным тыкалкам тебя всегда подводит...
Аватара пользователя
uldemir
Друг Кота
Сообщения: 7359
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Re: STM32 новичку в ARM что к чему

Сообщение uldemir »

Я хочу в этот сгенерённый кубом код добавить, скажем свою функцию или в какую-то из существующих, которая установит адреса source, destination, сколько слов слать и установит DMA->CCR бит EN7 в единицу. Ну и хотелось бы, чтобы при смене канала ПДП мои вмешательства тут были минимальными.
Спойлер

Код: Выделить всё

/**
  ******************************************************************************
  * File Name          : TIM.c
  * Description        : This file provides code for the configuration
  *                      of the TIM instances.
  ******************************************************************************
  * This notice applies to any and all portions of this file
  * that are not between comment pairs USER CODE BEGIN and
  * USER CODE END. Other portions of this file, whether 
  * inserted by the user or by software development tools
  * are owned by their respective copyright owners.
  *
  * Copyright (c) 2018 STMicroelectronics International N.V. 
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without 
  * modification, are permitted, provided that the following conditions are met:
  *
  * 1. Redistribution of source code must retain the above copyright notice, 
  *    this list of conditions and the following disclaimer.
  * 2. Redistributions in binary form must reproduce the above copyright notice,
  *    this list of conditions and the following disclaimer in the documentation
  *    and/or other materials provided with the distribution.
  * 3. Neither the name of STMicroelectronics nor the names of other 
  *    contributors to this software may be used to endorse or promote products 
  *    derived from this software without specific written permission.
  * 4. This software, including modifications and/or derivative works of this 
  *    software, must execute solely and exclusively on microcontroller or
  *    microprocessor devices manufactured by or for STMicroelectronics.
  * 5. Redistribution and use of this software other than as permitted under 
  *    this license is void and will automatically terminate your rights under 
  *    this license. 
  *
  * THIS SOFTWARE IS PROVIDED BY STMICROELECTRONICS AND CONTRIBUTORS "AS IS" 
  * AND ANY EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING, BUT NOT 
  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A 
  * PARTICULAR PURPOSE AND NON-INFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY
  * RIGHTS ARE DISCLAIMED TO THE FULLEST EXTENT PERMITTED BY LAW. IN NO EVENT 
  * SHALL STMICROELECTRONICS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, 
  * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 
  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 
  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  ******************************************************************************
  */

/* Includes ------------------------------------------------------------------*/
#include "tim.h"

#include "dma.h"

/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

TIM_HandleTypeDef htim4;
DMA_HandleTypeDef hdma_tim4_up;

/* TIM4 init function */
void MX_TIM4_Init(void)
{
  TIM_ClockConfigTypeDef sClockSourceConfig;
  TIM_MasterConfigTypeDef sMasterConfig;

  htim4.Instance = TIM4;
  htim4.Init.Prescaler = 9;
  htim4.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim4.Init.Period = 20000;
  htim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim4.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  if (HAL_TIM_Base_Init(&htim4) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  if (HAL_TIM_ConfigClockSource(&htim4, &sClockSourceConfig) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

  sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim4, &sMasterConfig) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

}

void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle)
{

  if(tim_baseHandle->Instance==TIM4)
  {
  /* USER CODE BEGIN TIM4_MspInit 0 */

  /* USER CODE END TIM4_MspInit 0 */
    /* TIM4 clock enable */
    __HAL_RCC_TIM4_CLK_ENABLE();
  
    /* TIM4 DMA Init */
    /* TIM4_UP Init */
    hdma_tim4_up.Instance = DMA1_Channel7;
    hdma_tim4_up.Init.Direction = DMA_MEMORY_TO_PERIPH;
    hdma_tim4_up.Init.PeriphInc = DMA_PINC_DISABLE;
    hdma_tim4_up.Init.MemInc = DMA_MINC_ENABLE;
    hdma_tim4_up.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
    hdma_tim4_up.Init.MemDataAlignment = DMA_MDATAALIGN_WORD;
    hdma_tim4_up.Init.Mode = DMA_CIRCULAR;
    hdma_tim4_up.Init.Priority = DMA_PRIORITY_LOW;
    if (HAL_DMA_Init(&hdma_tim4_up) != HAL_OK)
    {
      _Error_Handler(__FILE__, __LINE__);
    }

    __HAL_LINKDMA(tim_baseHandle,hdma[TIM_DMA_ID_UPDATE],hdma_tim4_up);

    /* TIM4 interrupt Init */
    HAL_NVIC_SetPriority(TIM4_IRQn, 0, 0);
    HAL_NVIC_EnableIRQ(TIM4_IRQn);
  /* USER CODE BEGIN TIM4_MspInit 1 */

  /* USER CODE END TIM4_MspInit 1 */
  }
}

void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* tim_baseHandle)
{

  if(tim_baseHandle->Instance==TIM4)
  {
  /* USER CODE BEGIN TIM4_MspDeInit 0 */

  /* USER CODE END TIM4_MspDeInit 0 */
    /* Peripheral clock disable */
    __HAL_RCC_TIM4_CLK_DISABLE();

    /* TIM4 DMA DeInit */
    HAL_DMA_DeInit(tim_baseHandle->hdma[TIM_DMA_ID_UPDATE]);

    /* TIM4 interrupt Deinit */
    HAL_NVIC_DisableIRQ(TIM4_IRQn);
  /* USER CODE BEGIN TIM4_MspDeInit 1 */

  /* USER CODE END TIM4_MspDeInit 1 */
  }
} 

/* USER CODE BEGIN 1 */

/* USER CODE END 1 */

/**
  * @}
  */

/**
  * @}
  */

/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
 
единственное отличие, тут я включил PLL поэтому таймеру включил немного предделитель
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: STM32 новичку в ARM что к чему

Сообщение dosikus »

uldemir, в вашем же коде :

Код: Выделить всё

    
      DMA1_Channel7->CCR |= DMA_CCR7_MINC | DMA_CCR7_MSIZE_1 | DMA_CCR7_PSIZE_1 | DMA_CCR7_CIRC | DMA_CCR7_DIR | 
      DMA_CCR7_TCIE; // (6)  
      DMA1_Channel7->CCR |= DMA_CCR7_EN; // (7)

Откуда взялся индекс в определении бит ?


DMA_CCR7_MINC


Здесь меняем DMA1_Channel3 на DMA1_Channel_X
В хэдере пишем

Код: Выделить всё

#define  DMA1_Channel_X DMA1_Channel3 
Вот только что в калокубе, что в любом случае, следить за соответствие реквестов каналам придется самому...

Код: Выделить всё

DMA1_Channel_X->CPAR = (uint32_t)&GPIOA->BSSR;     // DMA channel x peripheral address register
DMA1_Channel_X->CMAR = (uint32_t)Data_Buffer;     // DMA channel x memory address register    
DMA1_Channel_X->CNDTR = DIGITS;                   // DMA channel x number of data register

DMA1_Channel_X->CCR  |=  DMA_CCR_MSIZE_0;         // Memory size 16 bit
DMA1_Channel_X->CCR  |=  DMA_CCR_PSIZE_0;         // Peripheral size 16 bit

DMA1_Channel_X->CCR  |=  DMA_CCR_PL_1;            // Channel Priority level High 
DMA1_Channel_X->CCR  |=  DMA_CCR_MINC;            // Memory increment mode 
DMA1_Channel_X->CCR  |=  DMA_CCR_CIRC;            // Circular mode
DMA1_Channel_X->CCR  |=  DMA_CCR_DIR;             // Data transfer direction Memory -> Peripheral

DMA1_Channel_X->CCR  |=  DMA_CCR_EN;              // Channel enable
Аватара пользователя
uldemir
Друг Кота
Сообщения: 7359
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Re: STM32 новичку в ARM что к чему

Сообщение uldemir »

[uquote="dosikus",url="/forum/viewtopic.php?p=3457339#p3457339"]uldemir, в вашем же коде :
Откуда взялся индекс в определении бит ?
DMA_CCR7_MINC[/uquote]
из хидеров, вестимо: stm32f10x.h

Код: Выделить всё

/*******************  Bit definition for DMA_CCR7 register  *******************/
#define  DMA_CCR7_EN                         ((uint16_t)0x0001)            /*!< Channel enable */
Что поделать, если структура регистров такая. В stm32f030 всё было проще и логичнее:

Код: Выделить всё

	DMA1_Channel1->CPAR = (uint32_t) (&(ADC1->DR)); /* (3) */
	DMA1_Channel1->CMAR = (uint32_t)(photo_sensor); /* (4) */
	DMA1_Channel1->CNDTR = 8; // NUMBER_OF_ADC_CHANNEL; /* (5) */
	DMA1_Channel1->CCR |= DMA_CCR_MINC | DMA_CCR_CIRC;
	DMA1_Channel1->CCR |= DMA_CCR_TCIE; /* (6) */
	DMA1_Channel1->CCR |= DMA_CCR_EN; /* (7) */
Вот хотелось бы обойтись без дефайнов. Нельзя ли где в структуре DMA_HandleTypeDef hdma_tim4_up найти место куда вставить требуеиое и вызвать какую функцию для запуска? На казусовском примере используется какая-то строктура DMA_InitTypeDef, которую здесь я не наблюдаю или не могу понять где оно и как связано со сгенерённым.

Нашел в структуре hdma_tim4_up.DmaBaseAddress, но не могу сделать присваивание - он имеет какой-то странный тип (DMA_typedef *) - кто это такой и как?
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: STM32 новичку в ARM что к чему

Сообщение dosikus »

[uquote="uldemir",url="/forum/viewtopic.php?p=3457351#p3457351"]На казусовском примере используется какая-то строктура DMA_InitTypeDef[/uquote]

Где? По моей ссылке нет SPL хрени.


[uquote="uldemir",url="/forum/viewtopic.php?p=3457351#p3457351"]Что поделать, если структура регистров такая. В stm32f030 всё было проще и логичнее:[/uquote]

Для расширения кругозора внимательно изучаем stm32f10x.h,...

Код: Выделить всё

/*******************  Bit definition for DMA_CCR1 register  *******************/
#define  DMA_CCR1_EN                         ((uint16_t)0x0001)            /*!< Channel enable*/
#define  DMA_CCR1_TCIE                       ((uint16_t)0x0002)            /*!< Transfer complete interrupt enable */
#define  DMA_CCR1_HTIE                       ((uint16_t)0x0004)            /*!< Half Transfer interrupt enable */
#define  DMA_CCR1_TEIE                       ((uint16_t)0x0008)            /*!< Transfer error interrupt enable */
#define  DMA_CCR1_DIR                        ((uint16_t)0x0010)            /*!< Data transfer direction */
#define  DMA_CCR1_CIRC                       ((uint16_t)0x0020)            /*!< Circular mode */
#define  DMA_CCR1_PINC                       ((uint16_t)0x0040)            /*!< Peripheral increment mode */
#define  DMA_CCR1_MINC                       ((uint16_t)0x0080)            /*!< Memory increment mode */

#define  DMA_CCR1_PSIZE                      ((uint16_t)0x0300)            /*!< PSIZE[1:0] bits (Peripheral size) */
#define  DMA_CCR1_PSIZE_0                    ((uint16_t)0x0100)            /*!< Bit 0 */
#define  DMA_CCR1_PSIZE_1                    ((uint16_t)0x0200)            /*!< Bit 1 */

#define  DMA_CCR1_MSIZE                      ((uint16_t)0x0C00)            /*!< MSIZE[1:0] bits (Memory size) */
#define  DMA_CCR1_MSIZE_0                    ((uint16_t)0x0400)            /*!< Bit 0 */
#define  DMA_CCR1_MSIZE_1                    ((uint16_t)0x0800)            /*!< Bit 1 */

#define  DMA_CCR1_PL                         ((uint16_t)0x3000)            /*!< PL[1:0] bits(Channel Priority level) */
#define  DMA_CCR1_PL_0                       ((uint16_t)0x1000)            /*!< Bit 0 */
#define  DMA_CCR1_PL_1                       ((uint16_t)0x2000)            /*!< Bit 1 */

#define  DMA_CCR1_MEM2MEM                    ((uint16_t)0x4000)            /*!< Memory to memory mode */



/*******************  Bit definition for DMA_CCR7 register  *******************/
#define  DMA_CCR7_EN                         ((uint16_t)0x0001)            /*!< Channel enable */
#define  DMA_CCR7_TCIE                       ((uint16_t)0x0002)            /*!< Transfer complete interrupt enable */
#define  DMA_CCR7_HTIE                       ((uint16_t)0x0004)            /*!< Half Transfer interrupt enable */
#define  DMA_CCR7_TEIE                       ((uint16_t)0x0008)            /*!< Transfer error interrupt enable */
#define  DMA_CCR7_DIR                        ((uint16_t)0x0010)            /*!< Data transfer direction */
#define  DMA_CCR7_CIRC                       ((uint16_t)0x0020)            /*!< Circular mode */
#define  DMA_CCR7_PINC                       ((uint16_t)0x0040)            /*!< Peripheral increment mode */
#define  DMA_CCR7_MINC                       ((uint16_t)0x0080)            /*!< Memory increment mode */

#define  DMA_CCR7_PSIZE                      ((uint16_t)0x0300)            /*!< PSIZE[1:0] bits (Peripheral size) */
#define  DMA_CCR7_PSIZE_0                    ((uint16_t)0x0100)            /*!< Bit 0 */
#define  DMA_CCR7_PSIZE_1                    ((uint16_t)0x0200)            /*!< Bit 1 */

#define  DMA_CCR7_MSIZE                      ((uint16_t)0x0C00)            /*!< MSIZE[1:0] bits (Memory size) */
#define  DMA_CCR7_MSIZE_0                    ((uint16_t)0x0400)            /*!< Bit 0 */
#define  DMA_CCR7_MSIZE_1                    ((uint16_t)0x0800)            /*!< Bit 1 */

#define  DMA_CCR7_PL                         ((uint16_t)0x3000)            /*!< PL[1:0] bits (Channel Priority level) */
#define  DMA_CCR7_PL_0                       ((uint16_t)0x1000)            /*!< Bit 0 */
#define  DMA_CCR7_PL_1                       ((uint16_t)0x2000)            /*!< Bit 1 */

#define  DMA_CCR7_MEM2MEM                    ((uint16_t)0x4000)            /*!< Memory to memory mode enable */

И изучаем картинко из RM :

Изображение


И заодно думаем - что полезней калокуб или умение читать документацию.
Последний раз редактировалось dosikus Сб сен 15, 2018 12:31:06, всего редактировалось 1 раз.
Аватара пользователя
Oxford
Опытный кот
Сообщения: 819
Зарегистрирован: Вт окт 23, 2012 13:17:25
Откуда: Прокопьевск
Контактная информация:

Re: STM32 новичку в ARM что к чему

Сообщение Oxford »

все правильно он писал DMA1_Channel7->CCR |= DMA_CCR7_MINC
Че ему надо не пойму?
Инженер R@D

Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: STM32 новичку в ARM что к чему

Сообщение dosikus »

Oxford,
и ты туда же.
Снимаем розовые очки и сравниваем строчки:

Код: Выделить всё

#define  DMA_CCR1_MINC                       ((uint16_t)0x0080)            /*!< Memory increment mode */
#define  DMA_CCR7_MINC                       ((uint16_t)0x0080)            /*!< Memory increment mode */

А теперь, вуаля бит дефинишн из F0 :

Код: Выделить всё

/*******************  Bit definition for DMA_CCR register  ********************/
#define  DMA_CCR_EN                          ((uint32_t)0x00000001)        /*!< Channel enable                      */
#define  DMA_CCR_TCIE                        ((uint32_t)0x00000002)        /*!< Transfer complete interrupt enable  */
#define  DMA_CCR_HTIE                        ((uint32_t)0x00000004)        /*!< Half Transfer interrupt enable      */
#define  DMA_CCR_TEIE                        ((uint32_t)0x00000008)        /*!< Transfer error interrupt enable     */
#define  DMA_CCR_DIR                         ((uint32_t)0x00000010)        /*!< Data transfer direction             */
#define  DMA_CCR_CIRC                        ((uint32_t)0x00000020)        /*!< Circular mode                       */
#define  DMA_CCR_PINC                        ((uint32_t)0x00000040)        /*!< Peripheral increment mode           */
#define  DMA_CCR_MINC                        ((uint32_t)0x00000080)        /*!< Memory increment mode               */

#define  DMA_CCR_PSIZE                       ((uint32_t)0x00000300)        /*!< PSIZE[1:0] bits (Peripheral size)   */
#define  DMA_CCR_PSIZE_0                     ((uint32_t)0x00000100)        /*!< Bit 0                               */
#define  DMA_CCR_PSIZE_1                     ((uint32_t)0x00000200)        /*!< Bit 1                               */

#define  DMA_CCR_MSIZE                       ((uint32_t)0x00000C00)        /*!< MSIZE[1:0] bits (Memory size)       */
#define  DMA_CCR_MSIZE_0                     ((uint32_t)0x00000400)        /*!< Bit 0                               */
#define  DMA_CCR_MSIZE_1                     ((uint32_t)0x00000800)        /*!< Bit 1                               */

#define  DMA_CCR_PL                          ((uint32_t)0x00003000)        /*!< PL[1:0] bits(Channel Priority level)*/
#define  DMA_CCR_PL_0                        ((uint32_t)0x00001000)        /*!< Bit 0                               */
#define  DMA_CCR_PL_1                        ((uint32_t)0x00002000)        /*!< Bit 1                               */

#define  DMA_CCR_MEM2MEM                     ((uint32_t)0x00004000)        /*!< Memory to memory mode               */
Бинго!
Последний раз редактировалось dosikus Сб сен 15, 2018 12:35:49, всего редактировалось 1 раз.
Ответить

Вернуться в «ARM»