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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Мелкие вопросы
data_stack
сообщение Nov 27 2015, 11:48
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 28
Регистрация: 16-10-15
Пользователь №: 88 891



Идет процесс бурного изучения, возникает много вопросов, все вопросы мелкие, плодить темы не хочется
1. Вопрос по отладчику Keil. Есть массив указателей, который указывает на другие массивы:
Код
unt8_t const* const strings[]
{
string1,
string2...
}

и где то объявлены сами массивы, в некоторый момент передается номер массива, который нужно прочитать. Возможно ли в этот момент посмотреть содержимое этого массива в отладчике?
2. Имеется 1 АЦП и несколько ног, с одной нужно снимать 12битные значения, со другой 8битные. Пересчитывать пропорцией?
3. Делаю библиотеку. Где по правильному хранить платформозависимые дефайны в h или в c файле
4. Дефайны пишем заглавными буквами, а на макросы это распространяется или нет? По сути это тоже дефайны?
5. Перед некоторыми функциями ставят знак нижнего подчеркивания, что это значит?
6. Почему в библиотеках не используют структуры? Например вместо
Код
lcd_drawLine(x0, y0, x1, y1)

не написать
Код
typedef struct
{
uint8_t x;
uint8_t y;
}point_t;
lcd_drawLine(pont_t start_point, pont_t end_point)

это же нагляднее?
Go to the top of the page
 
+Quote Post
slavokhire5
сообщение Nov 27 2015, 14:11
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 50
Регистрация: 31-03-14
Из: Харьков
Пользователь №: 81 165



1. да, можете посмотреть содержимое памяти по адресу вашего массива. Одно из отладочных окошек должно называться "Memory", или как-то так. я не спец в кейлеsm.gif
2. считайте так, чтобы было понятно тем, кто будет в будущем ваш код читать
3. в большинстве случаев платформозависимые дефайны хранятся в *.h
4. на макросы распространяется тоже
5. нижнее подчеркивание обычно обозначает, что ф-ция зарезервирована какой-то стандартной либой. старайтесь в своих ф-циях не использовать нижнее подчеркивание в начале названия
6. возможно потому, что поля структуры придется заполнять перед вызовом ф-ции. итого n лишних строк кода
Go to the top of the page
 
+Quote Post
=L.A.=
сообщение Nov 29 2015, 08:00
Сообщение #3


Знающий
****

Группа: Участник
Сообщений: 794
Регистрация: 4-09-06
Из: Москва(ЗелАО), РФ
Пользователь №: 20 055



Добавлю еще один мелкий ( но при этом большой ) вопрос.

Изучал функцию GPIO_Init из стандартной библиотеки STM32F0xx_StdPeriph_Driver.

Правильно ли я понимаю, что при помощи этой функции можно сделать только такие настройки:

1) По умолчанию все ноги - входы General-purpose
2) Ноги, перечисленные в строке структуры GPIO_InitStructure.GPIO_Pin становятся выходами
с одинаковыми параметрами, которые указаны в следующих строках структуры.

Если так, то вопрос, как сконфигурировать ноги порта, если там и входы разного типа ( General-purpose, аналоговые, с подтяжкой или без) и еще и выходы тоже разного типа?

Видел в англоязычных форумах более ручной способ конфигурирования, типа:

GPIOC-> MODER |= (GPIO_MODER_MODER8_0 | GPIO_MODER_MODER9_0) ;

Есть ли более подробные примеры? Среда - IAR 6.40

Сообщение отредактировал =L.A.= - Nov 29 2015, 08:01


--------------------
-Кто-то работает на совесть, а кто-то на других заказчиков.-
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Nov 29 2015, 08:12
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(=L.A.= @ Nov 29 2015, 11:00) *
Если так, то вопрос, как сконфигурировать ноги порта, если там и входы разного типа ( General-purpose, аналоговые, с подтяжкой или без) и еще и выходы тоже разного типа?

Написать свой конфигуратор, например:
CODE

typedef enum
{
GPM_INPUT = 0,
GPM_OUTPUT = 1,
GPM_AF = 2,
GPM_ANALOG = 3,
} GPIO_MODE;

typedef enum
{
GPF_AF0 = 0,
GPF_AF1 = 1,
GPF_AF2 = 2,
GPF_AF3 = 3,
GPF_AF4 = 4,
GPF_AF5 = 5,
GPF_AF6 = 6,
GPF_AF7 = 7,
GPF_AF8 = 8,
GPF_AF9 = 9,
GPF_AF10 = 10,
GPF_AF11 = 11,
GPF_AF12 = 12,
GPF_AF13 = 13,
GPF_AF14 = 14,
GPF_AF15 = 15,
} GPIO_AF;

typedef enum
{
GPT_PP = 0,
GPT_OD = 1,
} GPIO_TYPE;

typedef enum
{
SPD_2M = 0,
SPD_25M = 1,
SPD_50M = 2,
SPD_100M = 3,
} GPIO_SPD;

struct pin_mode
{
void *port;
char pin;
GPIO_MODE mode;
GPIO_AF af;
GPIO_TYPE type;
GPIO_SPD speed;
};

void gpio_setup(const struct pin_mode *setup)
{
while(setup->port)
{
GPIO_TypeDef *port = (GPIO_TypeDef *)setup->port;

port->MODER = (port->MODER & ~(3UL << setup->pin * 2)) |
(setup->mode << setup->pin * 2);
if(setup->mode == 2) // Alternate function
{
int p = (setup->pin > 7) ? 1 : 0, n = setup->pin & 7;

port->AFR[p] = (port->AFR[p] & ~(15UL << n * 4)) |
(setup->af << n * 4);
}
if(setup->type)
port->OTYPER |= 1UL << setup->pin;
else
port->OTYPER &= ~(1UL << setup->pin);
port->OSPEEDR = (port->OSPEEDR & ~(3UL << setup->pin * 2)) |
(setup->speed << setup->pin * 2);
setup++;
}
}

Вызов:
Код
const struct pin_mode ui_pins[] =
{
     {LED1, GPM_OUTPUT, GPF_AF0, GPT_PP},
     {LED2, GPM_OUTPUT, GPF_AF0, GPT_PP},

     {KEY, GPM_INPUT},

     NULL
};

gpio_setup(ui_pins);

Подтяжки добавить по аналогии с остальным.
Go to the top of the page
 
+Quote Post
=L.A.=
сообщение Nov 29 2015, 08:18
Сообщение #5


Знающий
****

Группа: Участник
Сообщений: 794
Регистрация: 4-09-06
Из: Москва(ЗелАО), РФ
Пользователь №: 20 055



Цитата(=L.A.= @ Nov 29 2015, 12:00) *
Есть ли более подробные примеры? Среда - IAR 6.40


Сам нашел пример: Удобная настройка GPIO портов

http://we.easyelectronics.ru/STM32/udobnay...pio-portov.html

Не указан только тип микроконтроллера.

Цитата(aaarrr @ Nov 29 2015, 12:12) *
Написать свой конфигуратор, например:
CODE

typedef enum
{
GPM_INPUT = 0,
GPM_OUTPUT = 1,
GPM_AF = 2,
GPM_ANALOG = 3,
} GPIO_MODE;

typedef enum
{
GPF_AF0 = 0,
GPF_AF1 = 1,
GPF_AF2 = 2,
GPF_AF3 = 3,
GPF_AF4 = 4,
GPF_AF5 = 5,
GPF_AF6 = 6,
GPF_AF7 = 7,
GPF_AF8 = 8,
GPF_AF9 = 9,
GPF_AF10 = 10,
GPF_AF11 = 11,
GPF_AF12 = 12,
GPF_AF13 = 13,
GPF_AF14 = 14,
GPF_AF15 = 15,
} GPIO_AF;

typedef enum
{
GPT_PP = 0,
GPT_OD = 1,
} GPIO_TYPE;

typedef enum
{
SPD_2M = 0,
SPD_25M = 1,
SPD_50M = 2,
SPD_100M = 3,
} GPIO_SPD;

struct pin_mode
{
void *port;
char pin;
GPIO_MODE mode;
GPIO_AF af;
GPIO_TYPE type;
GPIO_SPD speed;
};

void gpio_setup(const struct pin_mode *setup)
{
while(setup->port)
{
GPIO_TypeDef *port = (GPIO_TypeDef *)setup->port;

port->MODER = (port->MODER & ~(3UL << setup->pin * 2)) |
(setup->mode << setup->pin * 2);
if(setup->mode == 2) // Alternate function
{
int p = (setup->pin > 7) ? 1 : 0, n = setup->pin & 7;

port->AFR[p] = (port->AFR[p] & ~(15UL << n * 4)) |
(setup->af << n * 4);
}
if(setup->type)
port->OTYPER |= 1UL << setup->pin;
else
port->OTYPER &= ~(1UL << setup->pin);
port->OSPEEDR = (port->OSPEEDR & ~(3UL << setup->pin * 2)) |
(setup->speed << setup->pin * 2);
setup++;
}
}

Вызов:
Код
const struct pin_mode ui_pins[] =
{
     {LED1, GPM_OUTPUT, GPF_AF0, GPT_PP},
     {LED2, GPM_OUTPUT, GPF_AF0, GPT_PP},

     {KEY, GPM_INPUT},

     NULL
};

gpio_setup(ui_pins);

Подтяжки добавить по аналогии с остальным.



Я так понимаю, это всё для отдельного вход/выхода? Выходит громоздко. К тому же в хидерах стандартной библиотеки многое уже объявлено и определено, зачем придумывать целиком свой код?


--------------------
-Кто-то работает на совесть, а кто-то на других заказчиков.-
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Nov 29 2015, 08:40
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(=L.A.= @ Nov 29 2015, 11:18) *
Я так понимаю, это всё для отдельного вход/выхода? Выходит громоздко. К тому же в хидерах стандартной библиотеки многое уже объявлено и определено, зачем придумывать целиком свой код?

Да, для каждого отдельного пина, затем они собираются в группы.
Громоздко? Не вижу смысла в современных реалиях экономить флеш, это не ATtiny.
Стандартную библиотеку не использую и никому не рекомендую.
Go to the top of the page
 
+Quote Post
Herz
сообщение Nov 29 2015, 09:48
Сообщение #7


Гуру
******

Группа: Модераторы
Сообщений: 10 983
Регистрация: 23-11-05
Пользователь №: 11 287



Цитата(data_stack @ Nov 27 2015, 13:48) *
Идет процесс бурного изучения, возникает много вопросов, все вопросы мелкие, плодить темы не хочется

Однако потрудитесь назвать тему более информативно, иначе она будет удалена.
Но если вопросов слишком много, то не лучше ли обратиться к литературе?
Go to the top of the page
 
+Quote Post
slavokhire5
сообщение Nov 29 2015, 15:35
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 50
Регистрация: 31-03-14
Из: Харьков
Пользователь №: 81 165



Я за стандартные либы. Да, местами криво. Да, жрут. Но представьте, что вам достался чужой глючный проект с десятками тысяч строк кода, и все либы - велосипед...
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Nov 29 2015, 15:50
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(slavokhire5 @ Nov 29 2015, 18:35) *
Но представьте, что вам достался чужой глючный проект с десятками тысяч строк кода, и все либы - велосипед...

Если уж прямо десятки тысяч строк, то и доля "либ" в них будет невелика. И Вы не допускаете мысли, что "велосипед" может быть построен аккуратно и грамотно, в отличие от?
Go to the top of the page
 
+Quote Post
slavokhire5
сообщение Nov 29 2015, 20:56
Сообщение #10


Участник
*

Группа: Участник
Сообщений: 50
Регистрация: 31-03-14
Из: Харьков
Пользователь №: 81 165



Если написать свои библиотеки на всю переферию какого-то жирного стм32, то кода там будет ого-го. Велосипед может быть весьма хорош. А может и не быть. Допускаю переписывание части библиотек, только если не будет хватать производительности.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Nov 29 2015, 21:23
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Вся ли периферия "жирного" STM32 используется в каждом изделии? Да и вообще она большей частью примитивна, за исключением USB, EMAC и, возможно, чего-нибудь еще. Зато посмотрите, сколько на этом форуме тем типа "стандартная USB CDC либа не отправляет пакеты с размером, кратным 64 байтам"! Куда уж тут говорить о производительности.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Nov 30 2015, 04:49
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(slavokhire5 @ Nov 29 2015, 21:35) *
Я за стандартные либы. Да, местами криво. Да, жрут. Но представьте, что вам достался чужой глючный проект с десятками тысяч строк кода, и все либы - велосипед...

Какие либы на десятки тысяч строк? Для периферии??? Чушь несёте.
Что там можно писать десятками тысяч строк? Вы мануал на периферию хоть раз открывали или только "либами" пользуетесь?
Работа практически с любой широкораспространённой периферией типа UART-ов, SPI, I2C, таймеров ... - десятки строк аппаратно-зависимого кода.
USB, Ethernet и некоторая другая - чуть побольше (к примеру в моём текущем проекте на LPC43xx в драйвере USB-device уровень работы с железом чуть больше 500строк).

PS: Ну если только "кодом" называть все дефайны определяющие регистры периферии и битовые поля в них, только тогда можно раздуть на десятки тысяч строк. Только это не код.
Go to the top of the page
 
+Quote Post
data_stack
сообщение Nov 30 2015, 09:17
Сообщение #13


Участник
*

Группа: Участник
Сообщений: 28
Регистрация: 16-10-15
Пользователь №: 88 891



Цитата(Herz @ Nov 29 2015, 10:48) *
Однако потрудитесь назвать тему более информативно, иначе она будет удалена.
Но если вопросов слишком много, то не лучше ли обратиться к литературе?


offtop mode = true
На вашем форуме не хватает такой темы, где можно сгрузить мелкие вопросы по STM32, работе с отладчиком, вопросам по оформлению кода. Этого нет в книгах. Я задал несколько не связанных вопросов, получил на них ответы, не понимаю что здесь необычного. Поверьте нигде больше я бы не нашел на них ответ. А вот нытье по поводу выбора инструментария и прочий флуд не нужен, дайте мне полномочия только на эту тему, я буду следить и чистить только ее, все будут довольны. Если я не прав, можно удалять тему, буду на каждый вопрос создавать отдельную тему.
offtop mode = false


Go to the top of the page
 
+Quote Post
=L.A.=
сообщение Dec 14 2015, 06:46
Сообщение #14


Знающий
****

Группа: Участник
Сообщений: 794
Регистрация: 4-09-06
Из: Москва(ЗелАО), РФ
Пользователь №: 20 055



Еще небольшой вопросец. Есть такая штука "SysTick_Handler". Я проштудировал доки и не нашел ответа, какой таймер использует эта функция ? Это один из периферийных ( TIM1 ... TIM17 ) или дополнительный таймер из ядра?


--------------------
-Кто-то работает на совесть, а кто-то на других заказчиков.-
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 14 2015, 06:58
Сообщение #15


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(=L.A.= @ Dec 14 2015, 09:46) *
SysTick timer и использует. Из ядра. И его описание, соответственно, в описании ядра. Кстати, и вектор SysTick_Handler находится среди векторов ядра (всяких xxxAbort_Handler и т.п.).


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post

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

 


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


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