Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Микроконтроллеры (MCU) и микропроцессоры (MPU) > мигание светодиодом на STM32F100RET6B


Автор: supercelt 20.2.2016, 21:58
Добрый!
Вопрос наверное для вас простой, а у меня затык. Начал учить 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++){} 
    }
}



Вот так не работает. В чём тут дело?

Автор: baldman88 24.2.2016, 08:31
В 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++){} 
}

Автор: supercelt 26.2.2016, 17:44
не работает(( регистр bsrr не устанавливается и odr соответственно

Автор: baldman88 26.2.2016, 19:53
На платке, что под рукой, светодиод как раз подключен к 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++);
    }
}

Все работает -- светодиод мигает.

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

Автор: baldman88 26.2.2016, 21:39
Кейла нет, поэтому сказать ничего не могу. Возможно его эмулятор не реализует такой функционал. Лучше все же сразу брать маленькую плату и программатор, тем более, что у китайцев стоят они сущие копейки. Да и впечатления, когда оно работает в живую, причем так, как нужно, ни в кокое сравнение не идут с впечатлениями от эмуляторов.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)