Реклама на сайте DatasheetsDatasheets

KAZUS.RUN - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Книги и журналы
FAQ по электронике

  Datasheets
Поиск SMD
Онлайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Схемы и проекты
Принципиальные схемы
  Программы
Каталог сайтов
Калькуляторы
  Форумы по электронике
Помощь проекту


 
Опции темы

DMA запретить прерывание HTIE

Непрочитано 22.04.2018, 09:07  
фёдорыч
Временная регистрация
 
Регистрация: 20.05.2015
Адрес: Бишкек, Киргизия
Сообщений: 59
Сказал спасибо: 22
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
фёдорыч на пути к лучшему
По умолчанию DMA запретить прерывание HTIE

Доброго дня всем! Прошу прощения за элементарный вопрос, но у меня не получается.
Ковыряюсь с STM32 в Keil. С Keil очень на Вы. Как установить бит HTIE в "0" в DMA2 регистр S0CR?
Реклама:
фёдорыч вне форума  
Непрочитано 22.04.2018, 10:19  
Исбанни
Прописка
 
Регистрация: 21.04.2018
Сообщений: 174
Сказал спасибо: 1
Сказали Спасибо 66 раз(а) в 53 сообщении(ях)
Исбанни на пути к лучшему
По умолчанию Re: DMA запретить прерывание HTIE

В языке Си нет непосредственных операций с битами. Поэтому установку и снятие отдельных битов приходится выполнять с целым байтом (или полным регистром) в виде операций побитового OR (установка в 1) или побитового AND c инверсией (сброс в 0).
Вот так:
DMA2_Stream0-›CR &= ~DMA_SxCR_HTIE;

Если развернуть эту сокращенную запись и рассмотреть детально по битам (у бита DMA_SxCR_HTIE позиция =3), то она равноценна вот такой записи:
DMA2_Stream0-›CR = DMA2_Stream0-›CR & ~(1 ‹‹ 3);
регистр читается, с ним проводится операция побитового AND со значением, 0xFFFFFFF7, которое получилось в результате сдвига 1 на три позиции влево (0x00000008 ) и побитовой инверсии. Причем, число 0xFFFFFFF7 получается на этапе компиляции, а не в результате работы МК.

Кароче говоря, установка в 1 отдельного бита:
DMA2_Stream0-›CR |= DMA_SxCR_HTIE;
сброс отдельного бита в 0:
DMA2_Stream0-›CR &= ~DMA_SxCR_HTIE;

Последний раз редактировалось Исбанни; 22.04.2018 в 10:21.
Исбанни вне форума  
Сказали "Спасибо" Исбанни
фёдорыч (22.04.2018)
Непрочитано 22.04.2018, 10:39  
фёдорыч
Временная регистрация
 
Регистрация: 20.05.2015
Адрес: Бишкек, Киргизия
Сообщений: 59
Сказал спасибо: 22
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
фёдорыч на пути к лучшему
По умолчанию Re: DMA запретить прерывание HTIE

А я пытался писАть:
DMA2 -› S0CR и тд.
Большое спасибо за подсказку. Где бы почитать про дефайны файла stm32f407xx.h?
Чтобы было разжевано для начинающих про DMA_SxCR_HTIE_Pos, DMA_SxCR_HTIE_Msk и DMA_SxCR_HTIE.
фёдорыч вне форума  
Непрочитано 22.04.2018, 11:11  
индюк
Гуру портала
 
Аватар для индюк
 
Регистрация: 17.07.2010
Адрес: мурмурляндия
Сообщений: 11,130
Сказал спасибо: 202
Сказали Спасибо 3,285 раз(а) в 2,151 сообщении(ях)
индюк на пути к лучшему
По умолчанию Re: DMA запретить прерывание HTIE

Сообщение от фёдорыч Посмотреть сообщение
Где бы почитать про дефайны файла stm32f407xx.h?
а что про них читать? их просто надо изучить, просто читая их, вот и все.
__________________
кагмаподэ магмаподэ
индюк вне форума  
Сказали "Спасибо" индюк
фёдорыч (22.04.2018)
Непрочитано 22.04.2018, 11:42  
фёдорыч
Временная регистрация
 
Регистрация: 20.05.2015
Адрес: Бишкек, Киргизия
Сообщений: 59
Сказал спасибо: 22
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
фёдорыч на пути к лучшему
По умолчанию Re: DMA запретить прерывание HTIE

Сообщение от индюк Посмотреть сообщение
их просто надо изучить, просто читая их
Просто читал. А как коснулось дела, оказалось что простого смотрения недостаточно, для закрепления теории нужна практика, которой, увы, ничтожно мало.
фёдорыч вне форума  
Непрочитано 22.04.2018, 11:54  
Исбанни
Прописка
 
Регистрация: 21.04.2018
Сообщений: 174
Сказал спасибо: 1
Сказали Спасибо 66 раз(а) в 53 сообщении(ях)
Исбанни на пути к лучшему
По умолчанию Re: DMA запретить прерывание HTIE

Про дефайны там и прочитать, в этом файле. Для этого надо немного глубже знать язык Си, в частности, структуры и указатели.
С дефайнами битов там всё просто.

#define DMA_SxCR_HTIE ((uint32_t)0x00000008 )
присваивает тексту DMA_SxCR_HTIE значение 0x00000008 с конкретным указанием типа uint32_t. И далее текст DMA_SxCR_HTIE будет соответствовать тексту ((uint32_t)0x00000008 ). Тут всё просто.

HAL-оподобный заголовочник (в отличие от кейло-подобного чистого CMSIS) может иметь дефайны битов в виде сумасшедшего громоздкого будерброда через определение сначала позиции бита:
#define DMA_SxCR_HTIE_Pos (3U) ,
затем сдвига 1 на число позиций:
#define DMA_SxCR_HTIE_Msk (0x1U ‹‹ DMA_SxCR_HTIE_Pos)
в результате которой как раз и получается число 0x00000008.
и затем определяется непосредственно
#define DMA_SxCR_HTIE DMA_SxCR_HTIE_Msk
который и есть то, что я писал на абзац выше. То есть, через жопу дошли, написав лишние строки.
..._Pos и равен численно номеру позиции бита. _Msk - битовая маска. А без суффикса - непосредственное значение.
По большому счету, нас будет интересовать только конечный дефайн DMA_SxCR_HTIE. В некоторых выражениях пригодятся значения позиции бита или битовой маски.
Типа
GPIOA-›MODER |= (0x02 ‹‹ 2 * 3), где числа можно заменить текстом
GPIOA-›MODER |= GPIO_MODER_MODE3_1
Это, пожалуй, единственная польза от раздутой конструкции. Ну это лично мое мнение.

Касательно структур с названиями регистров дело обстоит куда сложнее.
Изначально, так же в виде текстовых дефайнов определены численные значения сперва базовых адресов шин согласно карте памяти, вот так:
#define FLASH_BASE ((uint32_t)0x08000000) /*!‹ FLASH(up to 1 MB) base address
....
#define PERIPH_BASE ((uint32_t)0x40000000) /*!‹ Peripheral base address
...

это базовые адреса, от которых все ноги и растут, а затем постепенно друг через друга начинают определяться адреса шин и периферии, сидящей на шинах. Определяются через приращение адреса.
Вначале адрес шины через определенный ранее базовый адрес периферии, плюс смещение адреса шины относительно начала адресов периферии:
/*!‹ Peripheral memory map */
#define APB1PERIPH_BASE PERIPH_BASE
#define APB2PERIPH_BASE (PERIPH_BASE + 0x00010000)
...


затем адрес первого регистра (базовый адрес) периферии на шине, так же через предыдущее определение адреса шины и плюс смещение адреса конкретной периферии относительно адреса шины:
/*!‹ APB1 peripherals */
#define TIM2_BASE (APB1PERIPH_BASE + 0x0000)
#define TIM3_BASE (APB1PERIPH_BASE + 0x0400)
...


После прописывания базовых адресов у всей периферии определяются дефайнами указатели, имеющие тип структуры (о которой позже):
/** @addtogroup Peripheral_declaration */
#define TIM2 ((TIM_TypeDef *) TIM2_BASE)
#define TIM3 ((TIM_TypeDef *) TIM3_BASE)
...


по этим указателям как раз и происходит обращение к структуре, когда вы пишете TIM2-›CR1.

Затем для каждой периферии пишутся структуры, то есть тупо порядок и названия регистров, начиная от первого:
typedef struct
{
__IO uint16_t CR1; /*!‹ TIM control register 1, Address offset: 0x00 */
uint16_t RESERVED0; /*!‹ Reserved, 0x02 */
__IO uint16_t CR2; /*!‹ TIM control register 2, Address offset: 0x04 */
uint16_t RESERVED1; /*!‹ Reserved, 0x06 */
__IO uint16_t SMCR; /*!‹ TIM slave mode control register, Address offset: 0x08 */
....
} TIM_TypeDef;

вот оно и есть, имя типа TIM_TypeDef для регистров таймеров.
Суть структур в том, что например у всех таймеров или у всех портов порядок и состав регистров - в принципе то одинаковый. Значит, можно существенно сократить описательный текст, создав как бы один шаблон с названиями, а конкретный таймер или порт выбирать через обращение к адресу структуры. Конечно не у всех таймеров в железе будут все регистры (TIM6 отличается по составу от TIM1), но это не такая уж беда для чисто текстового описания.

Таким образом, запись
TIM2-›CR1 = TIM_CR1_CEN;
если её расшифровать полностью до самого начала, вычислив конкретный адрес и убрав структуру, получится
*(uint16_t *)0x40000000 = 0x001;

а запись
GPIOA-›ODR = 2;
обращается в
*(uint16_t *)0x40020014 = 0x0002;

Такие вот дела. По большому счету, в качестве особо изощренного извращения, вы можете игнорировать текстовые имена в заголовочнике и прямо так и писать цифрами:
*(uint16_t *)0x40020014 = 0x0002; результат будет тот же )))) Языку Си это не противоречит, ибо это есть "обращение по адресу и присвоение значения".

Ну и еще там в заголовочнике примерно аналогично прописаны номера прерываний, через энумератор enum. Аналогично типу структур регистров, только вместо порядка регистров идут текстовые имена и численные номера прерываний. Так же, аналогично, через тип IRQn_Type, который используется в другом файле, для функций подобных NVIC_EnableIRQ(DMA1_Stream0_IRQn). То есть, в эту функцию передается просто число 11, соответствующее значению DMA1_Stream0_IRQn в структуре. Энумераторы отличаются от структуры тем, что тексту можно присвоить численное значение. Близко к понятию #define, но немного отличается.

Вот вобщем то и всё, весь заголовочник и разобран.

Последний раз редактировалось Исбанни; 22.04.2018 в 12:36.
Исбанни вне форума  
Сказали "Спасибо" Исбанни
фёдорыч (22.04.2018)
Непрочитано 22.04.2018, 12:44  
ptr
Прописка
 
Регистрация: 24.11.2016
Адрес: Moscow
Сообщений: 287
Сказал спасибо: 57
Сказали Спасибо 54 раз(а) в 39 сообщении(ях)
ptr на пути к лучшему
По умолчанию Re: DMA запретить прерывание HTIE

Сообщение от фёдорыч Посмотреть сообщение
А я пытался писАть:
DMA2 -› S0CR и тд.
А так тоже можно на большинстве STM32, за исключением младших, не поддерживающих bitbang.

Например:

Код:
#define BB_PERI(a,b) *((volatile uint32_t *) \
    ((PERIPH_BB_BASE + (uint32_t)( &( a ) - \
    PERIPH_BASE)*32 + ( b*4 ))))
...
BB_PERI(DMA2_Stream0-›CR, 3) = 0; // DMA_SxCR_HTIE
ptr вне форума  
Непрочитано 22.04.2018, 12:53  
STM32F0
Заблокирован
 
Регистрация: 22.04.2014
Сообщений: 0
Сказал спасибо: 15
Сказали Спасибо 366 раз(а) в 284 сообщении(ях)
STM32F0 на пути к лучшему
По умолчанию Re: DMA запретить прерывание HTIE

Сообщение от ptr Посмотреть сообщение
так тоже можно на большинстве STM32
Даффай-даффай!
Для тебя DMA2 -› S0CR и DMA2_Stream0-›CR одинаковы?
А магическое "3"... это ты считаешь нормально?
STM32F0 вне форума  
Сказали "Спасибо" STM32F0
фёдорыч (22.04.2018)
 
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
STM32 - Tips 'N Tricks nahimovv ARM 28 14.10.2024 06:42
stm32F030f4 + ADC + DMA miwutka ARM 40 05.11.2016 12:42
Прерывание по совпадению таймера 1 gruffi AVR 38 21.10.2016 22:58
STM32F103, непонятки с DMA eddy ARM 124 18.11.2014 15:24
Tim19 -> DMA -> значение ADC в memory kvark85 ARM 6 03.06.2014 15:00


Часовой пояс GMT +4, время: 21:20.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.