Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

Непознат код
http://mcu-bg.com/mcu_site/viewtopic.php?f=7&t=15009
Страница 1 от 1

Автор:  RM [ Съб Яну 21, 2017 2:23 pm ]
Заглавие:  Непознат код

Здравейте
Преправям едни И2Ц софтурни драйвери, за АМ2321. Причината е че с хардуерните такива не ще да работи, иска едни неща за събуждане дето няма как да му ги дам и едни времена ... не мога да се справя.
Код:
#define SDA_IN()  {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=4<<28;}
#define SDA_OUT() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=3<<28;}

Това ми трябва на нормален C.
Това CRL може да е дефинирано в друг ххх.H фаил дето го нямам (sys.h)

Да добавя проца е ST32F103

Автор:  miro_atc [ Съб Яну 21, 2017 3:36 pm ]
Заглавие:  Re: Непознат код

Не разбирам какво ти трябва...

GPIOB е порт B, т.е. става дума за пинове PB0-PB15

CRLH е Port configuration register low, т.е. в него са настройките на PB0-PB7 като за всеки пин има по 4 бита.

Младшите 2 бита определят режима:
MODEy[1:0]: Port x mode bits (y= 0 .. 7)
00: Input mode (reset state)
01: Output mode, max speed 10 MHz.
10: Output mode, max speed 2 MHz.
11: Output mode, max speed 50 MHz.

Старшите 2 са CNFy[1:0]: Port x configuration bits (y= 0 .. 7)
In input mode (MODE[1:0]=00):
00: Analog mode
01: Floating input (reset state)
10: Input with pull-up / pull-down
11: Reserved
In output mode (MODE[1:0] > 00):
00: General purpose output push-pull
01: General purpose output Open-drain
10: Alternate function output Push-pull
11: Alternate function output Open-drain

В твоя пример имаш:
Код:
#define SDA_IN()  {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=4<<28;}
#define SDA_OUT() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=3<<28;}


GPIOB->CRL&=0X0FFFFFFF - сваля старшите 4 бита, а GPIOB->CRL|=4<<28 им слага стойност. Идеята вероятно е да конфигурират пин PB7 като Input mode + Floating input
във втория макрос идеята им сигурно е Output mode, max speed 50 MHz + General purpose output push-pull

С две думи сетват най-старшите 4 бите на CRL за да програмират PB7 в един или друг режим. Само като забележка, въпросният регистър има не 4 а общо 32 бита. И ако не дай си Боже решиш да ползваш и някой друг пин от PB0-PB6 то трябва да си много внимателен двете конфигурирания да не се застъпват. Т.е. да не би в прекъсване някъде да програмираш един пин, а в друг контекст да програмираш друг пин. Резултатът може и да не ти хареса ;-)

Автор:  ToHu [ Съб Яну 21, 2017 6:26 pm ]
Заглавие:  Re: Непознат код

па то това си е номрално C :) ...

Автор:  Zdrav [ Съб Яну 21, 2017 7:07 pm ]
Заглавие:  Re: Непознат код

Това заклинание е по-добро:
Код:
#define SDA_IN()  {GPIOB->CRL = (GPIOB->CRL & ~(0x0FuL<<28)) | (4uL<<28);}
#define SDA_OUT() {GPIOB->CRL = (GPIOB->CRL & ~(0x0FuL<<28)) | (3uL<<28);}

Избягва междинното превключване, за кратко, на пина в "Analog mode".

Автор:  Zdrav [ Съб Яну 21, 2017 7:21 pm ]
Заглавие:  Re: Непознат код

Ето и един примерен хедър, където да видиш как е деклариран регистъра CRL.

Прикачени файлове:
stm32f10x.h [16.54 KiB]
260 пъти

Автор:  RM [ Съб Яну 21, 2017 7:53 pm ]
Заглавие:  Re: Непознат код

Да благодаря
В даташеита регистрите са GPIOB_CRL ,GPIOB_CRH , GPIOB_IDR ...
Някъде трябва да има нещо подобно
на структура GPIOB {CRL,CRH,IDR...}
За да става така
GPOIB->CRL

Иначе не мога да го разбера това.

Автор:  RM [ Съб Яну 21, 2017 7:56 pm ]
Заглавие:  Re: Непознат код

Zdrav написа:
Ето и един примерен хедър, където да видиш как е деклариран регистъра CRL.


Да благодаря писал съм по бавно от теб.

Автор:  RM [ Нед Яну 22, 2017 6:45 pm ]
Заглавие:  Re: Непознат код

Заработи на mikroC PRO for ARM. Това е първия вариант в който тръгна, без оптимизиране.
Бъдете снизходителни, това е аматьорска работа, и преправен чужд код, с триста зора. :oops: .
На някой непрофесионалист може да му е от полза.

Прикачени файлове:
AM2321.rar [1.62 MiB]
199 пъти

Страница 1 от 1 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/