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

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

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

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

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

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


 
Опции темы
Непрочитано 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
Адрес: мурмурляндия
Сообщений: 10,383
Сказал спасибо: 176
Сказали Спасибо 3,128 раз(а) в 2,017 сообщении(ях)
индюк на пути к лучшему
По умолчанию 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 код Выкл.

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

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


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


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot