|
|
  |
Новый STM32F4 |
|
|
|
Nov 19 2013, 22:54
|
Участник

Группа: Участник
Сообщений: 58
Регистрация: 9-05-13
Из: Львов, Украина
Пользователь №: 76 782

|
Цитата(Genadi Zawidowski @ Nov 19 2013, 22:39)  Что было ДО, значение имеет. Замените на И не будет иметь значения. А вот про это Я скажу - "добро пожаловать в клуб" (хотя Вы и так уже в нём, судя по коду) тех, кто не читает документацию до конца. hint: не все биты в регистре MAPR доступны для чтения. У меня делается вообще вот такой функцией в F1X (напоролся в 107-м): Код /* установка битов в регистре AFIO_MAPR. Поддерживается режим переключения JTAG */ void cpu_stm32f1xx_setmapr( unsigned long bits ) { RCC->APB2ENR |= RCC_APB2ENR_AFIOEN; //включить тактирование альтернативных функций AFIO->MAPR = (AFIO->MAPR & ~ AFIO_MAPR_SWJ_CFG) | AFIO_MAPR_SWJ_CFG_JTAGDISABLE | bits; } Огромное преогромное спасибо, я |= не заметил. Привык выставлять биты в регистрах сохраняя их значение и не обратил внимание. Всё заработало! А по поводу STM32F1, я с ним не знаком и когда искал инфу на свой на каком-то из форумов нашёл этот код и принял его за истину, так как ребята отзывались что у них всё заработало, по этому и привёл здесь. Прошу прощения за ошибку, каюсь.
|
|
|
|
|
Nov 20 2013, 08:10
|
Участник

Группа: Участник
Сообщений: 58
Регистрация: 9-05-13
Из: Львов, Украина
Пользователь №: 76 782

|
Геннадий у меня к Вам как к знатоку ещё один вопросик по STM32F4. У меня не работает запись в бэкап регистры RTC. Делаю я это следующим образом:
RTC->WPR = 0xCA; //Разблокировка записи RTC->WPR = 0x53; RTC->BKP0R=date; //Запись в 0 регистр RTC->WPR = 0xFF; //Блокировка записи
Читаю соответственно: data=RTC->BKP0R; без разблокировки записи.
RTC работает от кварца, то есть от LSЕ. Часы завелись и работают. Что я делаю не так. PS: если надо, то код инициализации приведу.
Сообщение отредактировал glags - Nov 20 2013, 08:25
|
|
|
|
|
Nov 20 2013, 22:21
|
Участник

Группа: Участник
Сообщений: 58
Регистрация: 9-05-13
Из: Львов, Украина
Пользователь №: 76 782

|
Цитата(adnega @ Nov 20 2013, 15:49)  В RCC->APB1ENR.PWR единичка? В PWR->CR.DPB единичка? CODE // Инициализация модуля void rtc_Init(void) { // Если часы запущены, делать тут нечего. if(RTC->ISR & RTC_ISR_INITS) return; // Включим тактирование PWR RCC->APB1ENR |= RCC_APB1ENR_PWREN; // Разрешим доступ к управляющим регистрам энергонезависимого домена PWR->CR |= PWR_CR_DBP; // Сбросим состояние энергонезависимого домена RCC->BDCR |= RCC_BDCR_BDRST; RCC->BDCR &= ~RCC_BDCR_BDRST; // Выберем его как источник тактирования RTC: RCC->BDCR &= ~RCC_BDCR_RTCSEL; // сбросим RCC->BDCR |= RCC_BDCR_RTCSEL_0 | RCC_BDCR_LSEON; while (!(RCC->BDCR & RCC_BDCR_LSERDY)){} // Ждём, когда заведётся LSE // Включим тактирование RTC RCC->BDCR |= RCC_BDCR_RTCEN; // Снимем защиту от записи с регистров RTC rtc_Unlock(); { // Войдём в режим инициализации: RTC->ISR |= RTC_ISR_INIT; // Ждём, когда это произойдёт while(!(RTC->ISR & RTC_ISR_INITF)) {} // Часы остановлены. Режим инициализации // Настроим предделитель для получения частоты 1 Гц.
{ uint32_t Sync = 255; // 15 бит uint32_t Async = 127; // 7 бит // Сначала записываем величину для синхронного предделителя RTC->PRER = Sync; // Теперь добавим для асинхронного предделителя RTC->PRER = Sync | (Async << 16); } // Переведём часы в 24-часовой формат RTC->CR |= RTC_CR_FMT; // Инициализация закончилась RTC->ISR &= ~RTC_ISR_INIT; } rtc_Lock(); // Всё, часы запустились и считают время. }
// Выключить защиту от записи void rtc_Unlock(void) { // Запишем эти значения по очереди RTC->WPR = 0xCA; RTC->WPR = 0x53;}
// Включить защиту от записи void rtc_Lock(void) { // Запишем какую-нибудь фигню, главное, чтоб не правильную RTC->WPR = 0xFF;} Да всё установлено.
Сообщение отредактировал IgorKossak - Nov 21 2013, 08:22
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
|
|
|
|
|
Nov 21 2013, 06:31
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Цитата(glags @ Nov 21 2013, 02:21)  Код // Сбросим состояние энергонезависимого домена RCC->BDCR |= RCC_BDCR_BDRST; RCC->BDCR &= ~RCC_BDCR_BDRST; Вроде, все Ок. Попробуйте временно закомментировать эти строчки. Вопросик: а проц у Вас какой? А то эта тема про новый STM32F42x. Если это он - тоды ой - я с ним пока не работал.
|
|
|
|
|
Nov 21 2013, 07:27
|
Участник

Группа: Участник
Сообщений: 58
Регистрация: 9-05-13
Из: Львов, Украина
Пользователь №: 76 782

|
Цитата(adnega @ Nov 21 2013, 09:31)  Вроде, все Ок. Попробуйте временно закомментировать эти строчки. Вопросик: а проц у Вас какой? А то эта тема про новый STM32F42x. Если это он - тоды ой - я с ним пока не работал. У меня STM32F407. Эти строчки нет смысла убирать, они делают как бы ресет бэкап домену. А вся процедура инициализации, запускается только один раз. После того как часы затикали, то она игнорится. Это в первой строке инициализации.
|
|
|
|
|
Nov 21 2013, 11:39
|
Участник

Группа: Участник
Сообщений: 58
Регистрация: 9-05-13
Из: Львов, Украина
Пользователь №: 76 782

|
Цитата(adnega @ Nov 21 2013, 12:11)  Т.е. если часы настроены, то указанные мной битики не взводятся? Эти битики сбрасываются при ресете! Вопрос решён, надо было в самом начале инициализации разрешить доступ к регистрам PWR->CR |= PWR_CR_DBP;
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|