реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> STM32F100 16кБ флешь, Проблемы с портом
XGoblinX
сообщение Mar 26 2011, 10:46
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 43
Регистрация: 13-12-10
Пользователь №: 61 586



Всем привет.
Решил поиграться с процессором STM32F100R4 в иаре (дургих не пробовал).
Вот код взятый тут и немного модифицированный:
Код
#include "stm32f10x.h"

void InitAll( void);
void Delay( unsigned int Val);

int main()
{

        InitAll();

        while(1)
        {
                // Set PB.4 bit
                GPIOB->BSRR = GPIO_BSRR_BS4;
                Delay( 600000);

                // Reset PB.4 bit
                GPIOB->BSRR = GPIO_BSRR_BR4;
                Delay( 600000);
        }
}
  
  
//------------------------------------------------------------------------------

void InitAll(void)
{
        // Enable PORTB Periph clock  
        RCC->APB2ENR |= RCC_APB2ENR_IOPBEN;
        // Clear PB.4 control register bits
        GPIOB->CRL &= ~(GPIO_CRL_MODE4 | GPIO_CRL_CNF4);
        // Configure PB.4 as Push Pull output at max 2Mhz
        GPIOB->CRL |= GPIO_CRL_MODE4_1;
        return;
}

//------------------------------------------------------------------------------

void Delay( unsigned int Val) {
        for(; Val != 0; Val--)
        {
                __NOP();
        }
}

Разкоментировал в файле stm32f10x.h строку #define STM32F10X_LD_VL.
Пин висит всегда в состоянии подтянутом к высокому уровню.
Пробовал и другие порты. Результат тот же.

Порт PB4 после сброса занят JTAG-ом (NJTRST in PU).
Но я использую SWD.

С первого взгляда, кажется, что всё верно.
Чего я не понимаю?
Спасибо.

Код ниже работает прекрасно. Порт B Pin 12:

Код
#include "stm32f10x.h"

void InitAll( void);
void Delay( unsigned int Val);

int main()
{

        InitAll();

        while(1)
        {
                // Set PB.12 bit
                GPIOB->BSRR = GPIO_BSRR_BS12;
                Delay( 600000);

                // Reset PB.12 bit
                GPIOB->BSRR = GPIO_BSRR_BR12;
                Delay( 600000);
        }
}
  
  
//------------------------------------------------------------------------------

void InitAll(void)
{
        // Enable PORTB Periph clock  
        RCC->APB2ENR |= RCC_APB2ENR_IOPBEN;
        // Clear PB.12 control register bits
        GPIOB->CRH &= ~(GPIO_CRH_MODE12 | GPIO_CRH_CNF12);
        // Configure PB.12 as Push Pull output at max 2Mhz
        GPIOB->CRH |= GPIO_CRH_MODE12_1;
        return;
}

//------------------------------------------------------------------------------

void Delay( unsigned int Val) {
        for(; Val != 0; Val--)
        {
                __NOP();
        }
}




Вернул исходный код, но поправил строчку в инициализации:
Код
void InitAll(void)
{
        //JTAG-DP Disabled and SW-DP Enabled
        AFIO->MAPR |= AFIO_MAPR_SWJ_CFG_JTAGDISABLE;
        //PB4 released.
  
        // Enable PORTB Periph clock  
        RCC->APB2ENR |= RCC_APB2ENR_IOPBEN;
        // Clear PB.4 control register bits
        GPIOB->CRL &= ~(GPIO_CRL_MODE4 | GPIO_CRL_CNF4);
        // Configure PB.4 as Push Pull output at max 2Mhz
        GPIOB->CRL |= GPIO_CRL_MODE4_1;
        return;
}

Всё-равно не работает. Чего еще не хватает?

Сообщение отредактировал XGoblinX - Mar 26 2011, 10:46
Go to the top of the page
 
+Quote Post
skripach
сообщение Mar 26 2011, 10:56
Сообщение #2


■ ■ ■ ■
*****

Группа: Свой
Сообщений: 1 100
Регистрация: 9-08-06
Пользователь №: 19 443



GPIOB->BRR= GPIO_BSRR_BS4;

не?


--------------------
Делай что должен и будь что будет.
Go to the top of the page
 
+Quote Post
XGoblinX
сообщение Mar 26 2011, 11:19
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 43
Регистрация: 13-12-10
Пользователь №: 61 586



Цитата(skripach @ Mar 26 2011, 10:56) *
GPIOB->BRR= GPIO_BSRR_BS4;

не?

Похоже что нет.
У Вас бит резет регистр, а у меня используется сет резет регистр.
Т.е. ваш только сбрасывает, а у меня как сбрасывает так и ставит.
В любом случае я попробовал вариант. Не получилось...
Спасибо.

Еще заметил, что не в 3.3В пин, а в 1.75В.
У меня он через 1.5КОм светодиодом управлять должен. Светодиод анодом на землю сидит. Т.е. при сет должен загораться.

Сообщение отредактировал XGoblinX - Mar 26 2011, 11:56
Go to the top of the page
 
+Quote Post
skripach
сообщение Mar 26 2011, 13:02
Сообщение #4


■ ■ ■ ■
*****

Группа: Свой
Сообщений: 1 100
Регистрация: 9-08-06
Пользователь №: 19 443



Цитата
Светодиод анодом на землю сидит.

Катодом должен "седеть". Ну или анодом на питании, пожалуй лучше.


--------------------
Делай что должен и будь что будет.
Go to the top of the page
 
+Quote Post
XGoblinX
сообщение Mar 26 2011, 13:31
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 43
Регистрация: 13-12-10
Пользователь №: 61 586



Цитата(skripach @ Mar 26 2011, 13:02) *
Катодом должен "седеть". Ну или анодом на питании, пожалуй лучше.

Сори. У меня катод на земле. Анод через резюк на порт PB4.
Go to the top of the page
 
+Quote Post
XGoblinX
сообщение Mar 27 2011, 08:42
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 43
Регистрация: 13-12-10
Пользователь №: 61 586



Цитата(XGoblinX @ Mar 26 2011, 13:31) *
Сори. У меня катод на земле. Анод через резюк на порт PB4.

Всё-равно не тикает. Что может быть? Может кто-то всё же знает?
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Mar 27 2011, 19:15
Сообщение #7


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(XGoblinX @ Mar 27 2011, 14:42) *
Всё-равно не тикает. Что может быть? Может кто-то всё же знает?

Я правильно понял, что с ногой PB12 работает, а с PB4 - нет?
И при этом нога PB4 после резета является ногой NJTRST?
Видимо надо отключить её от JTAG, не? Например, так:
Код
AFIO->MAPR |= AFIO_MAPR_SWJ_CFG_NOJNTRST;



--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
XGoblinX
сообщение Mar 28 2011, 11:00
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 43
Регистрация: 13-12-10
Пользователь №: 61 586



Цитата(AHTOXA @ Mar 27 2011, 19:15) *
Я правильно понял, что с ногой PB12 работает, а с PB4 - нет?
И при этом нога PB4 после резета является ногой NJTRST?
Видимо надо отключить её от JTAG, не? Например, так:
Код
AFIO->MAPR |= AFIO_MAPR_SWJ_CFG_NOJNTRST;

Да. Я отключил его - Код. Я даже JTAG отрубил. Там не только PB4 Отрубил но еще 2 доп порта: PA15, PB3.
Хорошую идею подкинули.
Нужно посмотреть могут ли они управляться...
Спасибо.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Mar 28 2011, 14:59
Сообщение #9


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(XGoblinX @ Mar 28 2011, 17:00) *
Да. Я отключил его - Код. Я даже JTAG отрубил.

Пардон, не заметилsm.gif Попробуйте ещё включить тактирование AFIO, раз уж мы используем альтернативную функцию порта PB4:
Код
RCC->APB2ENR |=RCC_APB2ENR_AFIOEN;


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
XGoblinX
сообщение Mar 29 2011, 10:12
Сообщение #10


Участник
*

Группа: Участник
Сообщений: 43
Регистрация: 13-12-10
Пользователь №: 61 586



Цитата(AHTOXA @ Mar 28 2011, 15:59) *
Пардон, не заметилsm.gif Попробуйте ещё включить тактирование AFIO, раз уж мы используем альтернативную функцию порта PB4:
Код
RCC->APB2ENR |=RCC_APB2ENR_AFIOEN;

Заколдованный пин smile3046.gif
Попробовал и снова не получилось.
Я уже думаю проще плату переразвести и обойти эти грабли.

Код
#include "stm32f10x.h"

//STAT_LED_CTRL
#define STAT_LED_ON()  do {GPIOB->BSRR = GPIO_BSRR_BS4;} while(0)
#define STAT_LED_OFF() do {GPIOB->BSRR = GPIO_BSRR_BR4;} while(0)

//CA_POWER_CTRL
#define CA_ON()    do {GPIOC->BSRR = GPIO_BSRR_BR10;} while(0)
#define CA_OFF()   do {GPIOC->BSRR = GPIO_BSRR_BS10;} while(0)

void InitAll( void);
void Delay( unsigned int Val);

int main()
{
        InitAll();
        while(1)
        {
                STAT_LED_ON();
                CA_ON();
                Delay( 1200000);

                STAT_LED_OFF();
      CA_OFF();
                Delay( 1200000);
        }
}
  
  
//------------------------------------------------------------------------------

void InitAll(void)
{
    /*    
          JTAG-DP Disabled and SW-DP Enabled
          PB3 (PB3 only if not using asynchronous trace), PB4, PA15 released.
      */
    AFIO->MAPR |= AFIO_MAPR_SWJ_CFG_JTAGDISABLE;
        


      //Init PC10
      {
          // Enable PORTC Periph clock  
        RCC->APB2ENR |= RCC_APB2ENR_IOPCEN;
        // Clear PC.10 control register bits
        GPIOC->CRH &= ~(GPIO_CRH_MODE10 | GPIO_CRH_CNF10);
        // Configure PC.10 as Push Pull output at max 2Mhz
        GPIOC->CRH |= GPIO_CRH_MODE10_1;
    }
    
    //Init PB4:
    {
        // Enable PORTB Periph clock  
        RCC->APB2ENR |= RCC_APB2ENR_IOPBEN;
        // Clear PB.4 control register bits
        GPIOB->CRL &= ~(GPIO_CRL_MODE4 | GPIO_CRL_CNF4);
        // Configure PB.4 as Push Pull output at max 2Mhz
        GPIOB->CRL |= GPIO_CRL_MODE4_1;
    }
        
              RCC->APB2ENR |=RCC_APB2ENR_AFIOEN;
        
    return;
}

//------------------------------------------------------------------------------

void Delay( unsigned int Val) {
        for(; Val != 0; Val--)
        {
                __NOP();
        }
}


Сообщение отредактировал XGoblinX - Mar 29 2011, 14:52
Go to the top of the page
 
+Quote Post
skripach
сообщение Mar 29 2011, 11:25
Сообщение #11


■ ■ ■ ■
*****

Группа: Свой
Сообщений: 1 100
Регистрация: 9-08-06
Пользователь №: 19 443



Посмотрите пример из папки с иаром, там есть по ремапу JTAG.


--------------------
Делай что должен и будь что будет.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Mar 29 2011, 16:22
Сообщение #12


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Попробуйте строку
Код
    RCC->APB2ENR |=RCC_APB2ENR_AFIOEN;

поставить до строки
Код
    AFIO->MAPR |= AFIO_MAPR_SWJ_CFG_JTAGDISABLE;


------------
ЗЫ. Проверил живьём - так PB4 работает.
Только задержку перепишите, типа так:
Код
void Delay( unsigned int Val) {
    volatile int i;
    for(i = 0; i < Val; i++)
        __NOP();
}


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
XGoblinX
сообщение Apr 2 2011, 09:23
Сообщение #13


Участник
*

Группа: Участник
Сообщений: 43
Регистрация: 13-12-10
Пользователь №: 61 586



Цитата(AHTOXA @ Mar 29 2011, 17:22) *
Попробуйте строку
Код
    RCC->APB2ENR |=RCC_APB2ENR_AFIOEN;

поставить до строки
Код
    AFIO->MAPR |= AFIO_MAPR_SWJ_CFG_JTAGDISABLE;


------------
ЗЫ. Проверил живьём - так PB4 работает.
Только задержку перепишите, типа так:
Код
void Delay( unsigned int Val) {
    volatile int i;
    for(i = 0; i < Val; i++)
        __NOP();
}

Просто супер!!! sm.gif
Спасибо a14.gif


По поводу задержки согласен. С оптимизацией будет попа.

Спасибо!
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 19:33
Рейтинг@Mail.ru


Страница сгенерированна за 0.01506 секунд с 7
ELECTRONIX ©2004-2016