STM32F103 & Arduino IDE

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

mag155 пишет:
Дак как все же работать с stm32 через ардуино чтоб настроить таймеры ???
Поройтесь в разделе "Проекты", там можно найти ответы на многие вопросы.

mag155
Offline
Зарегистрирован: 21.12.2017

Ок.

MacSim
Offline
Зарегистрирован: 28.11.2012

mag155 пишет:
Дак как все же работать с stm32 через ардуино чтоб настроить таймеры ???

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

mag155
Offline
Зарегистрирован: 21.12.2017

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

nik182
Онлайн
Зарегистрирован: 04.05.2015

Почитайте тему отсюда http://arduino.ru/forum/programmirovanie/sinkhronizatsiya-vyvoda-i-obrabotki#comment-409345

и дальше. Как и что делать расписано подробно. Человек с нуля смог сделать что хотел. 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

nik182, с нуля? Да вы ему 90% программы написали :) 

nik182
Онлайн
Зарегистрирован: 04.05.2015

Конечный вариант вариант от моего существенно отличался. Даже в плане логики работы таймеров. Так что да, начальный импульс был, а дальше  уже сам автор смог всё освоить. Именно с нуля.

mag155
Offline
Зарегистрирован: 21.12.2017

Здвиг получается на delay?

xsimax
Offline
Зарегистрирован: 29.07.2019

Всем привет, А есть ли возможность инвертировать один канал таймера в STM?

чтобы один канаг таймера был в обычном режиме а 2-й инвертированный?

nik182
Онлайн
Зарегистрирован: 04.05.2015

Уточни что значит инвертированный? Сдвиг по фазе на 180 градусов? Вообще слабо мануал почитать? Станица 380 : OCx polarity is software programmable using the CCxP bit in the TIMx_CCER register. It can be programmed as active high or active low. OCx output is enabled by the CCxE bit in the TIMx_CCER register. Refer to the TIMx_CCERx register description for more details.

xsimax
Offline
Зарегистрирован: 29.07.2019

воуу  воу, зачем сразу мануалами кидаться, я не спец,

решил сделать пуш-пул покопал немного  инфы, например вот эту статью https://istarik.ru/blog/arduino/105.html

понял что  инфы тут мало и то что я хочу сделать не получится, копал в инете, ничего под ArduinoIDE для STM  не  нашел, думал может кто подскажет.

 

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

nik182 пишет:
Уточни что значит инвертированный?

Вот добрый ты! Я уже начал писать долгий глум на тему "какой STM?" и "какой таймер?". Не везет мне сегодня поглумиццо!

======================

Если речь идет о SMT32f10х "малоногом", то там есть Т1 - он специально имет сразу два комплиментарных выхода на каждый канал, меж ними даже дедтайм можно сделать аппаратно. Это для мостового управления чем-нить.

На остальных таймерах можно установить полярность каждого канала, как и написал коллега ник182.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

xsimax пишет:

воуу  воу, зачем сразу мануалами кидаться, я не спец,

Если ты не спец, то что тебе тут надо?

Если ты собираешься что-то разрабатывать, то мануалы читают ПЕРЕД обращением к живым людям, даже на форуме. Странно, да?

xsimax
Offline
Зарегистрирован: 29.07.2019

Прощу прощения, тема как бы STM32f103 поэтому я и не стал уточнять.

Я же говорю я искал, гуглил, но много инфы ссылается на HAL и другие среды разработки. Доков для новичков раз-два и обчелся, а всякие OCx, CCxP, TIMx_CCER, это хорошо нно не понятно как применить. Думал кто что-то подскажет, а тут сразу накинулись. Никого не хотел обидеть.

Probelzaelo
Offline
Зарегистрирован: 15.04.2011

xsimax пишет:
Думал кто что-то подскажет, а тут сразу накинулись. 

Дак ты и слушай тех кто подскажет, а кому хочется просто так поглумиться, дак их можно и проигнорить, это стиль общения такой, придется привыкать )) Освайвайся и осваивай.

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

3dmax, поздно удалять сообщение... Уже спалил свой левый аккаунт xsimax. Пиши уже с основного ;-) 

xsimax
Offline
Зарегистрирован: 29.07.2019

Jeka_M пишет:

3dmax, поздно удалять сообщение... Уже спалил свой левый аккаунт xsimax. Пиши уже с основного ;-) 

та просто на на домашнем компе был старый аккаунт со старой почтой,которой не пользуюсь давно и пароль забыл. Вот поэтому на работе и создал новый.  Пришел домой и .. забыл  выйти))

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

xsimax пишет:

Прощу прощения, тема как бы STM32f103 поэтому я и не стал уточнять.

Я же говорю я искал, гуглил, но много инфы ссылается на HAL и другие среды разработки. Доков для новичков раз-два и обчелся, а всякие OCx, CCxP, TIMx_CCER, это хорошо нно не понятно как применить. Думал кто что-то подскажет, а тут сразу накинулись. Никого не хотел обидеть.

Подсказываю: STM32-ардуино  сделано на основе CMSIS, наследуя именно этот синтаксис. Все обращения к регистрам делаются через интерфейсы CMSIS.

 

xsimax
Offline
Зарегистрирован: 29.07.2019

Вот нашел какой то макрос  CLEAR_BIT(REG, BIT) для операции (REG) &= ~(BIT)

может ли он инвертировать значение  бита канала таймера?  или это волобще не то ?

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

это не о том :))

Komandir
Offline
Зарегистрирован: 18.08.2018

А кто где по чем недавно покупал платы на STM32F103CB ?

xsimax
Offline
Зарегистрирован: 29.07.2019

Komandir пишет:

А кто где по чем недавно покупал платы на STM32F103CB ?

нуу смотря где вы живете,  я покупал в магазине (не инетрнет)  за 100гр уже прошитые под Adruino IDE

xsimax
Offline
Зарегистрирован: 29.07.2019

Короче возникла идея. 1-й генератор будет задавть фазу для двух других через setCompare.

и те запускаться через прерывание. Надо будет вечером проверить..

int ch=99;

void setup()
{
 pinMode(PA8, OUTPUT); //TIM1_CH1 
 pinMode(PA0, PWM); //TIM2_CH1
 pinMode(PA6, PWM); //TIM3_CH1

Timer1.setMode(TIMER_CH1, TIMER_OUTPUT_COMPARE);

Timer1.pause();
Timer2.pause();
Timer3.pause();

Timer1.setPrescaleFactor(1);
Timer2.setPrescaleFactor(1);
Timer3.setPrescaleFactor(1);

Timer1.setOverflow(ch); 
Timer2.setOverflow(ch); 
Timer3.setOverflow(ch); 



Timer1.setCompare(TIMER_CH1, 0);
Timer1.attachInterrupt(TIMER_CH1, zapusk_1);
Timer1.setCompare(TIMER_CH2, 50); 
Timer1.attachInterrupt(TIMER_CH2, zapusk_2);

Timer2.setCompare(TIMER_CH1, 20); //скважность
Timer3.setCompare(TIMER_CH1, 20);//скважность

Timer1.resume();
}

void zapusk_1(void) 
{ Timer2.resume(); }

void zapusk_2(void) 
{ Timer3.resume(); }

void loop() 
{ //тут буду менять частоту  и как то скважность.
}

 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

xsimax, это можно сделать на одном таймере с тремя выходами (TIM1) и без прерываний. Но вообще пробуйте, нужно до всего самостоятельно дойти :)

xsimax
Offline
Зарегистрирован: 29.07.2019

dimax пишет:

xsimax, это можно сделать на одном таймере с тремя выходами (TIM1) и без прерываний. Но вообще пробуйте, нужно до всего самостоятельно дойти :)

я догадываюсь что можно, но увы моих знаний мало, а то то что есть в инете либо под другие IDE либо какие то дебри  без примеров и нормальных объяснений.

nik182
Онлайн
Зарегистрирован: 04.05.2015

От ИДЕ работа с таймером и другой периферией МК ни как не зависит. Если представляешь себе как работает таймер, какие биты в регистрах таймера нужно установить, то в любой ИДЕ найдёшь команды сделать инициализацию и управление. Есть книги и статьи на русском с описаниями, есть мануал на английском в котором расписаны все возможности и даже описаны процедуры в какой последовательности проводить инициализацию регистров. Надо просто прочитать один раз. Спрашивать на форуме нужно после прочтения, если остались вопросы. Иначе просто не понять, что отвечают. Получается что говорим мы на разных языках, если даже термины для Вас темный лес.

xsimax
Offline
Зарегистрирован: 29.07.2019

Мда, что-то получилось не очень, при смене честоты с фазами происходит что попало. ладно.

Нашел пример dimax-a пытаюсь разобраться. почти все понятно кроме 2-х вещей.

void setup() {
pinMode(PA8,PWM); 
pinMode(PA9,PWM); 
TIMER1_BASE->CCER=(1<<4)|(1<<0);//   вот тут не понятно
TIMER1_BASE->CCMR1=(1<<13)|(1<<12)|(1<<5)|(1<<4);// и тут не понятно
TIMER1_BASE->PSC=0;
TIMER1_BASE->ARR=2879;
TIMER1_BASE->CCR1=0 ;
TIMER1_BASE->CCR2=1439 ;
TIMER1_BASE->CR1=1;}
void loop() {}

как работают эти битовые сдвиги, не понимаю(точнее что такое битовый сдвиг понимаю но как он взаимодействует с регистром не понятно). и еще вот нашел то что искал в самом первом  вопросе но не знаю как это записать? "Можно задать полярность сигнала, для этого предусмотрен разряд CCxP регистра TIMx_CCER." По идее достаточно 2-х каналов одного таймера просто 2-й инвертировать и изменить его длительность  --CCR.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

xsimax, Поиском пользоваться умеете, это отлично :) Осталось изучить битовые операции и затем  с помощью даташита разобраться, какой бит в регистрах CCER и CCMRx за что отвечает. Про фазу и частоту -таймер не знает что это такое. Поэтому нужно его программировать на то, что он умеет.  А он умеет считать такты от ноля и до значения, указанного в регистре автоперезагрузки. Потом сброс , и снова считает с ноля.  А при совпадении в значением указанным в регистре сравнения умеет дёргать своей аппаратной ногой. Этого достаточно что-бы аппаратно сделать хоть 4 фазы сигнала одинаковой частоты.

xsimax
Offline
Зарегистрирован: 29.07.2019

dimax.  спасибо за  советы. про регистр автоперезагрузки ARR я уже знаю,  и про регистр сравнения ССR. И я даже нашел CCER и CCMRx. Я не понимаю  эти записи (1<<4)|(1<<0)  и (1<<13)|(1<<12)|(1<<5)|(1<<4);     это вроеде как регистровый сдвиг или регистр сдвига, я запутался. (((

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

xsimax, ну я же и пишу вам, что нужно изучить битовые операции. Обучающих материалов в сети полным полно. ВОт например

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

(1<<4) это читаемая запись для 0b00010000, если байт, если число 16 разрядов, то еще 8 нолей спереди.

Читается как "1" на месте номер 4. Нужно помнитьт, что самое правое место - имеет номер 0.

----------------

проверка: что такое (1<< 12)? - Единица на месте №12, то еасть 1 и 12 нолей: 0b0001000000000000.

===========================================

Для того, чтобы понимать, что обозначают те или иные биты исползуется симолическое обозначение:

например:

//писать не так
TIMER1_BASE->CCER=(1<<4)|(1<<0);
//а так
TIMER1_BASE->CCER=(1<<TIMER_CCER_CC2E_BIT)|(1<<TIMER_CCER_CC1E_BIT);

Тогда сразу видно, что в регистре устанавливаются биты разрешения первого и второго каналов.

Инструкция по всему этому называется RM0008 вот так прямо и ищется в сети. Это референс мануал по програмированию STM32.  Там примерно 1000 страниц.

===============================

Вообще вынужден напомнить, что форум - не учебное заведение. Понять, что такое сдвиги можно просто спросив у гугла.

dosikus
Offline
Зарегистрирован: 11.03.2017

xsimax пишет:

Мда, что-то получилось не очень, при смене честоты с фазами происходит что попало. ладно.

 

 

Сделать сдвиг фаз у каналов таймера не получится.

Инверсный выход  делается выключением комплементарного выхода 

Для включения комплементарного выхода TIMxCHxN нужно сконфигурировать выход и включить его в

TIMxCCER . См биты ССxNE .

Комплементарные выходы в 103ьих у TIM1 и TIM8 ... 

 

dosikus
Offline
Зарегистрирован: 11.03.2017

wdrakula пишет:

(

например:

//писать не так
TIMER1_BASE->CCER=(1<<4)|(1<<0);
//а так
TIMER1_BASE->CCER=(1<<TIMER_CCER_CC2E_BIT)|(1<<TIMER_CCER_CC1E_BIT);

 

По стандарту :

TIM1->CCER |=TIM_CCER_CC3E | TIM_CCER_CC3NE;

 

 

 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

dosikus, это дефайны от CMSIS?  У нас её аналог - LibMaple. Хотя в нём тоже расписаны дефайны со сдвигом, но ленюсь их выписывать.

dosikus
Offline
Зарегистрирован: 11.03.2017

dimax пишет:

dosikus, это дефайны от CMSIS?  

Да, ибо CMSIS это в первую очередь стандарт , стандарт описания и работы с периферией, а не что там некоторые себе воображают.

И не так уж и страшно если знаешь как формируются имена бит .

DOMEN_REGISTR_BIT   - TIM_CCER_CС3NE 

>>У нас её аналог - LibMaple. 

А что мешает писать сразу нормально? Потом легче переход будет...

Тем более что в LibMaple сие присутствует изначально.

См. https://github.com/leaflabs/libmaple/blob/master/libmaple/include/libmaple/timer.h

#define TIMER_CCER_CC4P                 (1U << TIMER_CCER_CC4P_BIT)
#define TIMER_CCER_CC4E                 (1U << TIMER_CCER_CC4E_BIT)
#define TIMER_CCER_CC3NP                (1U << TIMER_CCER_CC3NP_BIT)
#define TIMER_CCER_CC3NE                (1U << TIMER_CCER_CC3NE_BIT)
#define TIMER_CCER_CC3P                 (1U << TIMER_CCER_CC3P_BIT)
#define TIMER_CCER_CC3E                 (1U << TIMER_CCER_CC3E_BIT)
#define TIMER_CCER_CC2NP                (1U << TIMER_CCER_CC2NP_BIT)
#define TIMER_CCER_CC2NE                (1U << TIMER_CCER_CC2NE_BIT)
#define TIMER_CCER_CC2P                 (1U << TIMER_CCER_CC2P_BIT)
#define TIMER_CCER_CC2E                 (1U << TIMER_CCER_CC2E_BIT)
#define TIMER_CCER_CC1NP                (1U << TIMER_CCER_CC1NP_BIT)
#define TIMER_CCER_CC1NE                (1U << TIMER_CCER_CC1NE_BIT)
#define TIMER_CCER_CC1P                 (1U << TIMER_CCER_CC1P_BIT)
#define TIMER_CCER_CC1E                 (1U << TIMER_CCER_CC1E_BIT)

 

 

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

dosikus пишет:

Комплементарные выходы в 103ьих у TIM1 и TIM8 ... 

Тут речь про 103х8 и 103хВ, в них 7 таймеров.

Arduino addon для STM32  основан, но не равен CMSIS.

Макросы типа TIM1 отсутствуют. Есть так, как написал Димах. Макросы для бит на позициях есть.

пример: (кусочек из ~/Arduino/hardware/Arduino_STM32/STM32F1/system/libmaple/include/libmaple/timer.h)

#define TIMER_CCER_CC1NP                (1U << TIMER_CCER_CC1NP_BIT)
#define TIMER_CCER_CC1NE                (1U << TIMER_CCER_CC1NE_BIT)
#define TIMER_CCER_CC1P                 (1U << TIMER_CCER_CC1P_BIT)
#define TIMER_CCER_CC1E                 (1U << TIMER_CCER_CC1E_BIT)

=================

сорри, ты уж и сам справился найти! малацца!

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Там ещё не все комбинации прописаны. Вот к примеру мне нужно в OC1M записать  4 и 5 биты, а дефайн только один на 4,5,6 биты  вместе.  #define TIMER_CCMR1_OC1M                (0x7 << 4)  . В общем легче писать цифрами, чем гадать не выйдет ли косяка.

dosikus
Offline
Зарегистрирован: 11.03.2017

wdrakula пишет:

[

Тут речь про 103х8 и 103хВ, в них 7 таймеров.

 

 

Ключевое слово - комплементарные выходы. А они в 103ьих только у TIM1 и TIM8 .

dosikus
Offline
Зарегистрирован: 11.03.2017

dimax пишет:

Там ещё не все комбинации прописаны. Вот к примеру мне нужно в OC1M записать  4 и 5 биты, а дефайн только один на 4,5,6 биты  вместе.  #define TIMER_CCMR1_OC1M                (0x7 << 4)  . В общем легче писать цифрами, чем гадать не выйдет ли косяка.

 

Магические числа есть зло .

Проще дефайны перетащить в свой хэдер.

 

#define  TIM_CCMR2_OC3M                      ((uint32_t)0x00000070U)            /*!<OC3M[2:0]  */
#define  TIM_CCMR2_OC3M_0                    ((uint32_t)0x00000010U)            /*!<Bit 0 */
#define  TIM_CCMR2_OC3M_1                    ((uint32_t)0x00000020U)            /*!<Bit 1 */
#define  TIM_CCMR2_OC3M_2                    ((uint32_t)0x00000040U)            /*!<Bit 2 */

 

dosikus
Offline
Зарегистрирован: 11.03.2017

Только как пример. Bluepill.

PWM с выхлопом на комплементарные выводы .

TIM1 PA7 PA8 

RCC->APB2ENR = RCC_APB2ENR_AFIOEN | RCC_APB2ENR_IOPAEN | RCC_APB2ENR_TIM1EN ;
GPIOA->CRL &= ~( GPIO_CRL_CNF7|GPIO_CRL_MODE7);
GPIOA->CRL |= ( GPIO_CRL_CNF7_1|GPIO_CRL_MODE7);
GPIOA->CRH &= ~(GPIO_CRH_CNF8|GPIO_CRH_MODE8 );
GPIOA->CRH |= (GPIO_CRH_CNF8_1|GPIO_CRH_MODE8);
AFIO->MAPR |= AFIO_MAPR_TIM1_REMAP_0;  
TIM1->PSC=720-1;
TIM1->ARR=100-1;
TIM1->CCR1=50;
 TIM1->CCMR1|=TIM_CCMR1_OC1M_2 |TIM_CCMR1_OC1M_1;
 TIM1->CCER |= TIM_CCER_CC1E |	 TIM_CCER_CC1NE;
 TIM1->BDTR |= TIM_BDTR_MOE ;
TIM1->CR1|=TIM_CR1_CEN;

Последний скрин с PWM с включенным DTG( Dead Time Generator)

dosikus
Offline
Зарегистрирован: 11.03.2017

wdrakula пишет:

Инструкция по всему этому называется RM0008 вот так прямо и ищется в сети. Это референс мануал по програмированию STM32.  Там примерно 1000 страниц.

 

Можно ускорить обучение выкачав сей документ https://www.st.com/content/ccc/resource/technical/document/application_note/group0/91/01/84/3f/7c/67/41/3f/DM00236305/files/DM00236305.pdf/jcr:content/translations/en.DM00236305.pdf

Это именно по таймерам.

А если учесть также что таймеры у всех линеек одинаковы то отличным подспорьем к обучению будут сниппетсы на F0 https://www.st.com/en/embedded-software/stm32snippetsf0.html

Сниппетсы это минимальные необходимые  примеры работы с периферией.

А также в референсе мануале на F0 и L0 есть аппендикс с примерами кода...

 

xsimax
Offline
Зарегистрирован: 29.07.2019

dosikus пишет:

Только как пример. Bluepill.

PWM с выхлопом на комплементарные выводы .

TIM1 PA7 PA8 

RCC->APB2ENR = RCC_APB2ENR_AFIOEN | RCC_APB2ENR_IOPAEN | RCC_APB2ENR_TIM1EN ;
GPIOA->CRL &= ~( GPIO_CRL_CNF7|GPIO_CRL_MODE7);
GPIOA->CRL |= ( GPIO_CRL_CNF7_1|GPIO_CRL_MODE7);
GPIOA->CRH &= ~(GPIO_CRH_CNF8|GPIO_CRH_MODE8 );
GPIOA->CRH |= (GPIO_CRH_CNF8_1|GPIO_CRH_MODE8);
AFIO->MAPR |= AFIO_MAPR_TIM1_REMAP_0;  
TIM1->PSC=720-1;
TIM1->ARR=100-1;
TIM1->CCR1=50;
 TIM1->CCMR1|=TIM_CCMR1_OC1M_2 |TIM_CCMR1_OC1M_1;
 TIM1->CCER |= TIM_CCER_CC1E |	 TIM_CCER_CC1NE;
 TIM1->BDTR |= TIM_BDTR_MOE ;
TIM1->CR1|=TIM_CR1_CEN;

Последний скрин с PWM с включенным DTG( Dead Time Generator)

а можете показать весь скетч ? (желательно с дедтаймом:) )

dosikus
Offline
Зарегистрирован: 11.03.2017

Могу выложить проект в Keil или SES .

Настройки DTG определяют биты 7-0 регистра  BDTR .

 

 

xsimax
Offline
Зарегистрирован: 29.07.2019

та не,  я под ардуиноИДЕ.

dosikus
Offline
Зарегистрирован: 11.03.2017

Могу расписать что делает каждая строка.

dosikus
Offline
Зарегистрирован: 11.03.2017

dosikus пишет:

Сделать сдвиг фаз у каналов таймера не получится.

 

Немного поправлю.

Есть один вариант  с меандром , реализуется на Toggle mode.

xsimax
Offline
Зарегистрирован: 29.07.2019

dosikus пишет:

Могу расписать что делает каждая строка.

наверно нет смысла в ардуиноИДЕ  оно будет писаться несколько по другому.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

xsimax пишет:

dosikus пишет:

Могу расписать что делает каждая строка.

наверно нет смысла в ардуиноИДЕ  оно будет писаться несколько по другому.

??????

xsimax
Offline
Зарегистрирован: 29.07.2019

wdrakula пишет:

xsimax пишет:

dosikus пишет:

Могу расписать что делает каждая строка.

наверно нет смысла в ардуиноИДЕ  оно будет писаться несколько по другому.

??????

что не понятно, я  проверил,  оно не работает.  всмысле ошибки выдает.

dosikus
Offline
Зарегистрирован: 11.03.2017

xsimax,  если начать просто-напросто думать то ни чего сложного и нет.

Открываем хэдеры на LibMaple и заменяем.

К примеру 

 

AFIO->MAPR |=AFIO_MAPR_TIM1_REMAP_0;

AFIO_BASE->MAPR|=AFIO_MAPR_TIM1_REMAP_PARTIAL;

или 


#define  TIM_CCMR2_OC3M                      ((uint32_t)0x00000070U)            /*!<OC3M[2:0]  */
#define  TIM_CCMR2_OC3M_0                    ((uint32_t)0x00000010U)            /*!<Bit 0 */
#define  TIM_CCMR2_OC3M_1                    ((uint32_t)0x00000020U)            /*!<Bit 1 */
#define  TIM_CCMR2_OC3M_2                    ((uint32_t)0x00000040U)            /*!<Bit 2 */
 

TIMER1_BASE->CCMR1|=TIM_CCMR1_OC1M_2 |TIM_CCMR1_OC1M_1;