Модераторы: PILOT, ManiaK, Mazzi
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> мигание светодиодом на STM32F100RET6B 
:(
    Опции темы
supercelt
Дата 20.2.2016, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 658
Регистрация: 25.8.2005

Репутация: нет
Всего: 1



Добрый!
Вопрос наверное для вас простой, а у меня затык. Начал учить stm32. Пробую мигать.  

Код

#include "stm32f10x.h" 
#define F_CPU 8000000


int main(void){
    uint32_t i; 
    RCC->APB2ENR |= RCC_APB2ENR_IOPAEN; 
    GPIOA->CRL |= 0x00000020; 
    GPIOA->CRH = 0; 

    
    while(1){
        GPIOA->ODR = 0x2; 
        for(i = 0; i<2000000; i++){}
        GPIOA->ODR = 0; 
        for(i = 0; i<2000000; i++){} 
    }
}



Этот код выполняется норм. Но вот я прочитал, что если выставлять ODR напрямую, то он занимает слишком много тактов и лучше работать через регистр BSRR

Код

#include "stm32f10x.h" 
#define F_CPU 8000000


int main(void){
    uint32_t i; 
    RCC->APB2ENR |= RCC_APB2ENR_IOPAEN; 
    GPIOA->CRL |= 0x00000020; 
    GPIOA->CRH = 0; 

    
    while(1){
        GPIOA->BSRR = 0x2; 
        for(i = 0; i<2000000; i++){}
        GPIOA->BSRR = 0; 
        for(i = 0; i<2000000; i++){} 
    }
}



Вот так не работает. В чём тут дело?
PM   Вверх
baldman88
Дата 24.2.2016, 08:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 210
Регистрация: 18.1.2009

Репутация: 1
Всего: 7



В BSRR за сброс отвечают старшие 16 бит (именно их нужно выставлять в единицу). То есть нужно что-то вроде:
Код

while(1){
        GPIOA->BSRR = 0x2; 
        for(i = 0; i<2000000; i++){}
        GPIOA->BSRR = (0x2 << 16); 
        for(i = 0; i<2000000; i++){} 
}

Либо с помощью BRR:
Код

while(1){
        GPIOA->BSRR = 0x2; 
        for(i = 0; i<2000000; i++){}
        GPIOA->BRR = 0x2; 
        for(i = 0; i<2000000; i++){} 
}

PM MAIL   Вверх
supercelt
Дата 26.2.2016, 17:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 658
Регистрация: 25.8.2005

Репутация: нет
Всего: 1



не работает(( регистр bsrr не устанавливается и odr соответственно
PM   Вверх
baldman88
Дата 26.2.2016, 19:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 210
Регистрация: 18.1.2009

Репутация: 1
Всего: 7



На платке, что под рукой, светодиод как раз подключен к PA1.
Код

#include <stm32f10x.h>

int main(void)
{
    RCC->APB2ENR |= RCC_APB2Periph_GPIOA;
    GPIOA->CRL |= 0x20;
    uint32_t i;
    while (1) {
        GPIOA->BSRR = GPIO_BSRR_BS1;
        for (i = 0; i < 2000000; i++);
        GPIOA->BSRR = GPIO_BSRR_BR1;
        for (i = 0; i < 2000000; i++);
    }
}

Все работает -- светодиод мигает.
PM MAIL   Вверх
supercelt
Дата 26.2.2016, 20:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 658
Регистрация: 25.8.2005

Репутация: нет
Всего: 1



Уважаемый baldman88 , спасибо за ответ)
У меня нет платки. У  меня только визуальный отладчик в кейле. Я копернул ваш код и он ну как бы тоже не работает. Хотя я вот не знаю должен ли визуальный отладчик показывать забивание регистра BSRR. Я прилепляю картинку, там справа обвёл. Если я прописываю  GPIOA->ODR = 0x2; то при отладке видно как бит ставится (справа), но я не хочу записывать в ODR, хочу работать через BSRR. если прописываю  GPIOA->BSRR = 0x2; то справа ничего не видно. И я не понимаю работает ли выход или нет


Присоединённый файл ( Кол-во скачиваний: 4 )
Присоединённый файл  Безымянный.png 104,28 Kb
PM   Вверх
baldman88
Дата 26.2.2016, 21:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 210
Регистрация: 18.1.2009

Репутация: 1
Всего: 7



Кейла нет, поэтому сказать ничего не могу. Возможно его эмулятор не реализует такой функционал. Лучше все же сразу брать маленькую плату и программатор, тем более, что у китайцев стоят они сущие копейки. Да и впечатления, когда оно работает в живую, причем так, как нужно, ни в кокое сравнение не идут с впечатлениями от эмуляторов.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Микроконтроллеры (MCU) и микропроцессоры (MPU)"
PILOT ManiaK
UniBomb Mazzi

На данный раздел помимо Правил форума распространяются текже следующие правила:


  • Прежде чем создать тему воспользуйтесь поиском или посмотрите в faq. Возможно на форуме уже есть ответ на ваш или близкий к вашему вопрос.
  • В заголовке темы в квадратных скобках обозначьте используемое семейство микроконтроллера: [avr],[pic],[arm].
  • При создании темы с вопросом указывайте участок кода с ошибкой, версию компилятора, схемы подключения, fuse биты и прочие данные, которые помогут найти правильный ответ. Для форматирования текста программ используйте кнопку код.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Для флуда, просьб выполнить задание, поиска партнёров или исполнителей существуют свои разделы.
  • Если вы заметили несовместимое с правилами сообщение, то можете уведомить об этом модератора раздела нажав кнопку Репорт у соответствующего сообщения.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, PILOT, ManiaK, UniBomb, Mazzi.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Микроконтроллеры (MCU) и микропроцессоры (MPU) | Следующая тема »


 




[ Время генерации скрипта: 0.1198 ]   [ Использовано запросов: 20 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.