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

 
 
5 страниц V   1 2 3 > »   
Reply to this topicStart new topic
> SAM4S, Ничего не выходит
Грендайзер
сообщение Oct 14 2014, 18:01
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 368
Регистрация: 18-04-11
Из: Город-герой Москва
Пользователь №: 64 451



Здравствуйте всем! Попала в руки отлпдочная плата SAM4S-EK2 на базе контроллера ATSAM4SD32C. Ранее никогда не работал ни с ARM ни с Cortex ну и встрял. Немного работал с AVR так там всё элементарно... Надо что то - посмотрел в даташите необходимый регистр, записал в него что нужно и всё... А здесь.. смотрел в даташит, так там как будто Лев Толстой приложился столько букв sad.gif И хоть убей, не вижу как элементарно вывести единичку в порт?

Сообщение отредактировал Грендайзер - Oct 14 2014, 18:08
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Oct 14 2014, 18:26
Сообщение #2


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Вот посмотрите... Разберетесь?
CODE
void
arm_hardware_pioa_outputs(unsigned long opins, unsigned long initialstate)
{
#if CPUSTYLE_AT91SAM7S

AT91C_BASE_PMC->PMC_PCER = 1UL << AT91C_ID_PIOA; // разрешить тактированние этого блока

AT91C_BASE_PIOA->PIO_SODR = (opins & initialstate); // Установка единицы в регистре данных
AT91C_BASE_PIOA->PIO_CODR = (opins & ~ initialstate); // Установка нулей в регистре данных

AT91C_BASE_PIOA->PIO_OER = opins; // Разрешение выхода
AT91C_BASE_PIOA->PIO_PPUDR = opins; // disable pull-up resistors
AT91C_BASE_PIOA->PIO_MDDR = opins; // Disable open drain output

#elif CPUSTYLE_ATSAM3S || CPUSTYLE_ATSAM4S

PMC->PMC_PCER0 = (1UL << ID_PIOA);

PIOA->PIO_SODR = (opins & initialstate); // Установка единицы в регистре данных
PIOA->PIO_CODR = (opins & ~ initialstate); // Установка нулей в регистре данных

PIOA->PIO_OER = opins; // эти выводы на вывод - похоже, при работе с периферийными устройствами не требуется.
PIOA->PIO_PUDR = opins;
PIOA->PIO_MDDR = opins; // Disable open drain output

#elif CPUSTYLE_STM32F10X

RCC->APB2ENR |= RCC_APB2ENR_IOPAEN; /* I/O port A clock enable */
__DSB();
// Установка начального состояния битов
GPIOA->BSRR = (GPIO_BSRR_BS0 * (initialstate & opins)) | (GPIO_BSRR_BR0 * (~ initialstate & opins));
// Установка режима выводов
arm_stm32f10x_hardware_pio_prog(GPIOA, opins, 0, 1); /* Установить CNF=0 и MODE=1 для указанных битов */

#elif CPUSTYLE_STM32F4XX

RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN; /* I/O port A clock enable */
__DSB();
// Установка начального состояния битов
arm_stm32f4xx_hardware_pio_setstate(GPIOA, opins, initialstate);
// Установка режима выводов
arm_stm32f30x_hardware_pio_prog(GPIOA, opins, 1, 1, 0, 0); /* mode, speed, pupdr, typer */

#elif CPUSTYLE_STM32F30X || CPUSTYLE_STM32F0XX

RCC->AHBENR |= RCC_AHBENR_GPIOAEN; /* I/O port A clock enable */
// Установка начального состояния битов
GPIOA->BSRR = (GPIO_BSRR_BS_0 * (initialstate & opins)) | (GPIO_BSRR_BR_0 * (~ initialstate & opins));
// Установка режима выводов
arm_stm32f30x_hardware_pio_prog(GPIOA, opins, 1, 1, 0, 0); /* mode, speed, pupdr, typer */

#else
#error Undefined CPUSTYLE_XXX
#endif
}


Сообщение отредактировал IgorKossak - Oct 15 2014, 08:16
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
Go to the top of the page
 
+Quote Post
Leopoldius
сообщение Oct 14 2014, 18:29
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 78
Регистрация: 23-03-11
Из: Россия
Пользователь №: 63 824



Все зависит от того чем Вы предпочитаете пользоваться(среда разработки), общение напрямую при помощи регистров или используя библиотеку ASF.

В простейшемслучае
если используем ASF

добавить в файл conf_board.h:

Код
#define PIN_OUT   IOPORT_CREATE_PIN(PORTB, 0) // Смотря куда у вас там LED подключен или какую ногу хотите использовать


где то в board_init(void)
Код
...
ioport_configure_pin(PIN_OUT, IOPORT_DIR_OUTPUT | IOPORT_INIT_LOW);
...


где то в коде:
Код
...
ioport_set_pin_level(PIN_OUT, 1) для вЫсокого уровня (0 - для низкого уровня)
...


Если нужно просто перекидывать состояние одно из другой

Код
...
ioport_toggle_pin_level(PIN_OUT)
...



Если по поводу регистров - то велком в Skype: контакты в личке. По возможности раскажу, что да как
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Oct 14 2014, 19:04
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



А еще надо не путать даташит и рефернс мануал. В одном из них ответов не будетsm.gif
Go to the top of the page
 
+Quote Post
Leopoldius
сообщение Oct 14 2014, 19:09
Сообщение #5


Частый гость
**

Группа: Свой
Сообщений: 78
Регистрация: 23-03-11
Из: Россия
Пользователь №: 63 824



О да, особенно СТМ этим страдает. У АТМЕЛ в этом плане проще. Скачивем ПДФ с словом Complete и там все в куче. Что с одной стороны довольно удобно, а с другой: всем известная поговорка про фломастеры)
Go to the top of the page
 
+Quote Post
Грендайзер
сообщение Oct 14 2014, 19:15
Сообщение #6


Местный
***

Группа: Участник
Сообщений: 368
Регистрация: 18-04-11
Из: Город-герой Москва
Пользователь №: 64 451



Цитата
Вот посмотрите... Разберетесь?

Честно говоря сложновато... совсем сложновато...

Цитата
Все зависит от того чем Вы предпочитаете пользоваться(среда разработки), общение напрямую при помощи регистров или используя библиотеку ASF.

Использую Atmel studio 6.2.
Хотел использовать напрямую регистры, но теперь начинаю понимать, что наверное был не совсем прав.

Цитата
А еще надо не путать даташит и рефернс мануал. В одном из них ответов не будет

Столько мануалов уже пересмотрел-голова кругом + на работе выскачила проблема с установкой студий (они не хотели устанавливать какой то там компонент от вижуал студии, поэтому пришлось установить её отдельно) ну пока суть да дело весь день провозился...

А есть какая нибудь литература по этому поводу например книжка, наверняка америкосы написали что то, я пока нашёл только The Definitive Guide to ARM® Cortex®-M3 and Cortex®-M4, но не всматривался в неё.
Go to the top of the page
 
+Quote Post
Leopoldius
сообщение Oct 14 2014, 19:23
Сообщение #7


Частый гость
**

Группа: Свой
Сообщений: 78
Регистрация: 23-03-11
Из: Россия
Пользователь №: 63 824



Цитата(Грендайзер @ Oct 14 2014, 22:15) *
А есть какая нибудь литература по этому поводу например книжка, наверняка америкосы написали что то, я пока нашёл только The Definitive Guide to ARM® Cortex®-M3 and Cortex®-M4, но не всматривался в неё.


В данной книги описано ядро примеры работы с ним. Его структура. И т.д.

На самом деле Код, который вам дал Genadi Zawidowski чоень подробно и хорошо расписывает, как работать с регистрами. Я дал пример для студии с использованием ASF. Вам осталось выбрать, что больше по душе.

Если есть опыт работы с другими МК, то я бы советовал все же начать с регистров(но при условии что время не жмет и нет дедлайна) и вдумчивого разглядывания блок-схемы. А тогда уже будет понятно, как делать все остальное. Ну и естественно вопросы на форуме) + поиск

А если нужно быстро - то имхо ASF даст вам быстро работающий результат без мыслей как это работает. Хотя, без чтения примеров, все же не обойдетесь
Go to the top of the page
 
+Quote Post
Грендайзер
сообщение Oct 14 2014, 19:52
Сообщение #8


Местный
***

Группа: Участник
Сообщений: 368
Регистрация: 18-04-11
Из: Город-герой Москва
Пользователь №: 64 451



Цитата
Если есть опыт работы с другими МК, то я бы советовал все же начать с регистров

Я только за, только не могу адреса регистров найти... Правда на АЦП, ЦАП и пр. есть вроде, а вот адреса и названия регистров управления GPIO найти не могу 05.gif Куда там писать что без ф-ций, адреса так сказать явки))) И ещё вопросик, что такое io_id? На сайте атмела нашёл список ф-ций для управления портами, среди которых, к примеру, gpio_set_pin_high(io_id); Как я понял эта ф-ция должна задрать порт в 1, ну я и пишу

Код
#include <asf.h>
#include "conf_board.h"
#include "compiler.h"
#include "pio.h"

int main (void)
{    
    gpio_set_pin_high(PORTB);

}


А он говорит, что не знает что такое PORTB..

Сообщение отредактировал Грендайзер - Oct 14 2014, 20:05
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Oct 15 2014, 05:15
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



В АРМах не принято порты буквами называть. И на самом деле в АРМах все примерно также как и везде. ЗАпись по адресам регистров и все счастливы. В большом рефренс мануале есть адреса всех регистров. Но так как их реально много обычно адресами никто не пользуется. Практически во всех средах к процам есть заголовочный файл (его чуть ли не сам АРМ требует производителей проца делать). В этом файле собраны все адреса и им даны понятные названия. Стандарта правда нет.

LPC, например делает так
LPC_GPIO1 -> FIODIR |= (1 << 26);
LPC_GPIO1 -> FIOCLR = (1 << 26)
это обращение в 1 порт 26 ногу.

Так что вам надо найти идиологию как делает атмел, найти этот файлик и все поедет. Я собственно сейчас поймал себя на мысли что уже давно не думал над тем какой адрес и смещение имеет тот или иной регитср.

Попробуйте кстати еще поглядеть кейл. Не знаю есть у него поддержка этого проца или нет, если есть, то у них самый логичный и простой путь работы с процами. Заголовочные файлы что лежат у них в среде, мне кажутся самыми понятными по структуре и они делают базовый проект куда уже правильные файлы подключены.

Одно только надо учесть что АРМ сложнее АВР. У него порт не только на вход - выход настраивается. Бывают еще варианты что порт выбирает режим работы подтяжка к 0, к 1, свободный, повторитель. У стм еще бывает можно выбрать макс частоту шевеления ноги, на малой меньше тока жрет. Потом на ножки выводятся внутренние модули, причем иногда один модуль на разные ноги можно вывести, и потому обычно нога имеет несколько функций, GPIO, UART, ADC, SPI. И эти функции так же настраиваются.

Я не видел мануал от вашего проца, а в LPC прям есть глава GPIO и там подробно написано что надо настроить чтобы все было хорошо
Go to the top of the page
 
+Quote Post
Грендайзер
сообщение Oct 15 2014, 06:49
Сообщение #10


Местный
***

Группа: Участник
Сообщений: 368
Регистрация: 18-04-11
Из: Город-герой Москва
Пользователь №: 64 451



Нашёл в студии заголовочник "sam4sd32c.h", там дефайнами обозначены адреса регистров, как я понял, но за что регистр отвечает... хз... буду дальше копать... За совет с кейлом спасибо, попробую в нём порыться...

Фух, прозрел, нашёл таки в даташите, начиная с 577 странице. Приведены все имена и адреса регистров. Правда с использованием имён в студии проблемы почему то, ну да бог с ним... Впрочем конечно количество этих регистров и впрямь громадно, так что так вот с ходу разобраться не выйдет sad.gif
Go to the top of the page
 
+Quote Post
DmitryM
сообщение Oct 15 2014, 06:52
Сообщение #11


Знающий
****

Группа: Свой
Сообщений: 583
Регистрация: 7-06-06
Из: Таганрог
Пользователь №: 17 840



Цитата(Грендайзер @ Oct 15 2014, 10:01) *
Нашёл в студии заголовочник "sam4sd32c.h", там дефайнами обозначены адреса регистров, как я понял, но за что регистр отвечает... хз... буду дальше копать... За совет с кейлом спасибо, попробую в нём порыться...


PIOA->PIO_OWER = (PIO_OWER_P0); //Enable write ODSR PA0
PIOA->PIO_OER = (PIO_OER_P0); //Output Enable PA0
PIOA->PIO_PER = (PIO_PER_P0); //PIO Enable (default) PA0

int main(void)
while(1){
PIOA->PIO_ODSR ^= PIO_ODSR_P0;
}
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Oct 15 2014, 08:14
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



обычно хорошим тоном бывает давать в заголовочном файле имена по мануалу. То есть как в мануале регистр называется такой обычно дефайн и надо искатьsm.gif
А еще хорошим тоном бывает смотреть апликайшен ноты. Там прям по шагам написано что да как и куда, но это уже на периферию, на ноги там не будет...

Вообще в целом вам точно нужен именно этот проц? Атмел в рейтинге понятных мануалов далеко не на первых местах. В лидерах, тексас, филипс....

У филипса на NXP в начале главы про модуль, прям списком идет что надо настроить чтобы работало - очень удобно.
А СТМ идет по пути выдачи пользователю библиотеки с понятными функциями и непонятным функционалом.
У атмела же вроде тоже что-то подобное есть, функции должны быть открыты, можно в них залезть и понять как работают...
Go to the top of the page
 
+Quote Post
KnightIgor
сообщение Oct 15 2014, 09:46
Сообщение #13


Знающий
****

Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725



Цитата(Грендайзер @ Oct 15 2014, 08:49) *
Нашёл в студии заголовочник "sam4sd32c.h", там дефайнами обозначены адреса регистров, как я понял, но за что регистр отвечает... хз... буду дальше копать... За совет с кейлом спасибо, попробую в нём порыться...

Фух, прозрел, нашёл таки в даташите, начиная с 577 странице. Приведены все имена и адреса регистров. Правда с использованием имён в студии проблемы почему то, ну да бог с ним... Впрочем конечно количество этих регистров и впрямь громадно, так что так вот с ходу разобраться не выйдет sad.gif

У меня были похожие ощущения, когда после 8051 я пересаживался на Cortex.
Нужно понять две вещи, и тогда многое станет ясно (условие - Вы сечёте в языке C, из чего я исхожу).

1. Для Cortex фирма ARM попыталась с самого начала предотвратить разброд и шатание в части кода и выработала стандарт CMSIS. Суть его не только в том, что этот стандарт публикует функции доступа к ядру и базовой периферии Cortex, общие для всех, но и предписывает соглашения касаемо структуры заголовочных файлов, наименований переменных, регистров и функций. Производители начали придерживаться этого стандарта.

2. Для доступа к регистрам периферии синтаксически используются структуры (struct), а не "линейный" набор адресов каждого регистра. Для этого (см. CMSIS-совместимый "главный" заголовочный файл вашего процессора) определяется адрес базового регистра периферии, ему дается разумное имя (скажем, USART1, ADC2, и т.д.), а уже относительно него идут все регистры этой периферии. В результате практически для всех известных Cortex синтаксис идентичен. Например, доступ к регистру данных USART1 осуществляется как к полю структуры и будет выглядеть как:

USART1->DATA = 0x0D;

Ну, регистр данных может иметь несколько иное название, чем DATA, но принцип остается. По крайней мере уж USART1 точно так называется во всех пока мне бывших доступных Cortex. А названия "подчиненных" регистров USART1, как верно упомянул Golikov A, как правило совпадают с именами из мануала.

Остальное схоже с любым микроконтроллером: биты и поля в регистре, их действие, и т.п.
Go to the top of the page
 
+Quote Post
Грендайзер
сообщение Oct 15 2014, 11:55
Сообщение #14


Местный
***

Группа: Участник
Сообщений: 368
Регистрация: 18-04-11
Из: Город-герой Москва
Пользователь №: 64 451



Фух, запустил внутренний "медленный" кварцевый генератор, напрямую работая с регистрами. Лёд тронулся! Ещё каких нибудь 3 месяца и смогу уверенно моргать светодиодиком biggrin.gif
KnightIgor, спасибо, CMSIS обязательно изучу, т.к. обращение напрямую к регистрам конечно не самый красивый способ. Впрочем и работа с набором непонятных ф-ций то же не особо доставляет.
Go to the top of the page
 
+Quote Post
Leopoldius
сообщение Oct 15 2014, 12:17
Сообщение #15


Частый гость
**

Группа: Свой
Сообщений: 78
Регистрация: 23-03-11
Из: Россия
Пользователь №: 63 824



По поводу студии и почему не работает PORTB в вашем случае.

Я же писал - нужно вначале сделать #define PIN_OUT IOPORT_CREATE_PIN(PORTB, 0)
Что в результате, вашему определению PIN_OUT присвоит маску. А после этого данное определение можно использовать во всяких прелестях от ASF(ioport_set_pin_high,ioport_set_pin_low и т.д.) аналогично с модулем gpio(gpio_set_pin_high, gpio_set_pin_low и т.д.)

Как я уже писал выше, все зависит от наличия свободного времени и желания копаться вглубь.

Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 21:35
Рейтинг@Mail.ru


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