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

 
 
3 страниц V  < 1 2 3 >  
Reply to this topicStart new topic
> AT91SAM7S новичок
Lotor
сообщение Dec 20 2011, 06:50
Сообщение #16


Местный
***

Группа: Свой
Сообщений: 476
Регистрация: 3-07-07
Из: Санкт-Петербург
Пользователь №: 28 866



Цитата(Xeon @ Dec 20 2011, 10:28) *
Спасибо toweroff!
А как правильно в keil делать разделения на .c и .h? Делаю как обычно в .h прототипы в .c описываю сами функции, подключаю в main .h и в итоге ошибка: L6218E Undefine simbol "название функции"...

Скорее всего Вы просто не прицепили хидер к проекту.

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


--------------------
Ковырял чукча отверткой в ухе, звук в телевизоре и пропал.
Go to the top of the page
 
+Quote Post
Xeon
сообщение Dec 20 2011, 07:06
Сообщение #17


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

Группа: Участник
Сообщений: 140
Регистрация: 21-04-11
Пользователь №: 64 524



Цитата(Xeon @ Dec 20 2011, 09:28) *
Спасибо toweroff!
А как правильно в keil делать разделения на .c и .h? Делаю как обычно в .h прототипы в .c описываю сами функции, подключаю в main .h и в итоге ошибка: L6218E Undefine simbol "название функции"...


Ну с этим разобрался, сам затупил немного (где main вписал extern "C" {"подключаемые хедеры"}, а в хедерах перед прототипом extern)

Цитата(Lotor @ Dec 20 2011, 09:50) *
Скорее всего Вы просто не прицепили хидер к проекту.

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


Если это 32-16 битные микроконтроллеры ARM7 фирмы Atmel то полистал...книга-бякя...лучше даташит читать...с инглишом ещё немного дружу)

Сообщение отредактировал Xeon - Dec 20 2011, 07:07
Go to the top of the page
 
+Quote Post
Lotor
сообщение Dec 20 2011, 07:25
Сообщение #18


Местный
***

Группа: Свой
Сообщений: 476
Регистрация: 3-07-07
Из: Санкт-Петербург
Пользователь №: 28 866



Цитата(Xeon @ Dec 20 2011, 11:06) *
Если это 32-16 битные микроконтроллеры ARM7 фирмы Atmel то полистал...книга-бякя...лучше даташит читать...с инглишом ещё немного дружу)

Тем не менее в этой бяке есть все ответы на ранее заданные Вами вопросы. =)


--------------------
Ковырял чукча отверткой в ухе, звук в телевизоре и пропал.
Go to the top of the page
 
+Quote Post
Xeon
сообщение Dec 20 2011, 08:45
Сообщение #19


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

Группа: Участник
Сообщений: 140
Регистрация: 21-04-11
Пользователь №: 64 524



Цитата(Lotor @ Dec 20 2011, 10:25) *
Тем не менее в этой бяке есть все ответы на ранее заданные Вами вопросы. =)


Значит надо найти силы её ещё разок почитать sm.gif

Вроде чего-то добился) только вот незадача прерывание срабатывает только один раз...)
Привожу код (В Led.h две функции инициализировать ноги и помыргать светодиодами):
Код
#include <at91sam7s128.h>

extern "C" {
#include "Led.h"
}

unsigned char send_val = 0xA0;

void Usart_TX(void) //__irq
{
     unsigned int status;
        // Read USART status
        status = AT91C_BASE_US0->US_CSR;

    if(status & AT91C_US_TXEMPTY)
    {
        AT91C_BASE_US0->US_THR = (unsigned short) send_val;
        send_val++;
    }
}

int main(void)
{
    // Configure PIO
    AT91C_BASE_PIOA->PIO_ASR = AT91C_PIO_PA6;
        AT91C_BASE_PIOA->PIO_PDR = AT91C_PIO_PA6;
    AT91C_BASE_PIOA->PIO_OER |= AT91C_PIO_PA6;

    // Enable usart
    AT91C_BASE_PMC->PMC_PCER = 1 << AT91C_ID_US0;
    // Reset and disable receiver & transmitter
        AT91C_BASE_US0->US_CR = AT91C_US_RSTRX | AT91C_US_RSTTX | AT91C_US_RXDIS | AT91C_US_TXDIS;
        // Configure mode
    AT91C_BASE_US0->US_MR = AT91C_US_USMODE_NORMAL | AT91C_US_CHRL_8_BITS | AT91C_US_PAR_NONE;
        // Configure baudrate
        // Asynchronous, no oversampling
        AT91C_BASE_US0->US_BRGR = 104;

    // Enable interrupt
    AT91C_BASE_US0->US_IER                         = AT91C_US_TXEMPTY;
    AT91C_BASE_AIC->AIC_IDCR                     = 1 << AT91C_ID_US0;
    AT91C_BASE_AIC->AIC_SMR[AT91C_ID_US0]        = 0;
    AT91C_BASE_AIC->AIC_SVR[AT91C_ID_US0]         = (unsigned int) &Usart_TX;
    AT91C_BASE_AIC->AIC_IECR                     = 1 << AT91C_ID_US0;
    // Clear interrupt
        AT91C_BASE_AIC->AIC_ICCR = 1 << AT91C_ID_US0;

    // enable rx and tx
    AT91C_BASE_US0->US_CR = AT91C_US_TXEN | AT91C_US_RXEN;


    // Leds
    Led_Init();    


    while(1)
    {
        Blink();
    }
}


Сообщение отредактировал Xeon - Dec 20 2011, 08:47
Go to the top of the page
 
+Quote Post
toweroff
сообщение Dec 20 2011, 08:49
Сообщение #20


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



а зачем __irq закоментили?
и где сброс флага прерывания?
Go to the top of the page
 
+Quote Post
Xeon
сообщение Dec 20 2011, 09:11
Сообщение #21


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

Группа: Участник
Сообщений: 140
Регистрация: 21-04-11
Пользователь №: 64 524



Закоментил потому что в примерах нету __irq а вроде прерывание используется...
Сейчас ток запустил... к тому коду добавил следующее:
в конец обработчика прерывания строку
AT91C_BASE_AIC->AIC_EOICR = 0;
и раскоментил __irq
в сумме получил следующий код:

Код
#include <at91sam7s128.h>

extern "C" {
#include "Led.h"
}

unsigned char send_val = 0xA0;

void Usart_TX(void) __irq //!!!!!!!!!!!!!!!!!!! тут раскоментил !!!!!!!!!!!!!!!!!!!!!!!!!!!
{
     unsigned int status;
        // Read USART status
        status = AT91C_BASE_US0->US_CSR;

    if(status & AT91C_US_TXEMPTY)
    {
        AT91C_BASE_US0->US_THR = (unsigned short) send_val;
        send_val++;
    }
    AT91C_BASE_AIC->AIC_EOICR = 0; // !!!!!!!!! тут добавил !!!!!!!!!!!!!!!!!!!!!!!!!!
}

int main(void)
{
    // Configure PIO
    AT91C_BASE_PIOA->PIO_ASR = AT91C_PIO_PA6;
        AT91C_BASE_PIOA->PIO_PDR = AT91C_PIO_PA6;
    AT91C_BASE_PIOA->PIO_OER |= AT91C_PIO_PA6;

    // Enable usart
    AT91C_BASE_PMC->PMC_PCER = 1 << AT91C_ID_US0;
    // Reset and disable receiver & transmitter
        AT91C_BASE_US0->US_CR = AT91C_US_RSTRX | AT91C_US_RSTTX | AT91C_US_RXDIS | AT91C_US_TXDIS;
        // Configure mode
    AT91C_BASE_US0->US_MR = AT91C_US_USMODE_NORMAL | AT91C_US_CHRL_8_BITS | AT91C_US_PAR_NONE;
        // Configure baudrate
        // Asynchronous, no oversampling
        AT91C_BASE_US0->US_BRGR = 104;

    // Enable interrupt
    AT91C_BASE_US0->US_IER                         = AT91C_US_TXEMPTY;
    AT91C_BASE_AIC->AIC_IDCR                     = 1 << AT91C_ID_US0;
    AT91C_BASE_AIC->AIC_SMR[AT91C_ID_US0]        = 0;
    AT91C_BASE_AIC->AIC_SVR[AT91C_ID_US0]         = (unsigned int) &Usart_TX;
    AT91C_BASE_AIC->AIC_IECR                     = 1 << AT91C_ID_US0;
    // Clear interrupt
        AT91C_BASE_AIC->AIC_ICCR = 1 << AT91C_ID_US0;

    // enable rx and tx
    AT91C_BASE_US0->US_CR = AT91C_US_TXEN | AT91C_US_RXEN;


    // Leds
    Led_Init();    


    while(1)
    {
        Blink();
    }
}


И УРА заработало!))))

Я скинул пример который смотрел и свой проект, может кто посмотрит как они там делают...пользовался поиском по всему проекту в попытке найти __irq ничего подобного там нет (в примере).

Мой код: Прикрепленный файл  1.rar ( 131.89 килобайт ) Кол-во скачиваний: 75


Пример: Прикрепленный файл  basic_usart_hw_handshaking_project_at91sam7s_ek_keil.zip ( 266.9 килобайт ) Кол-во скачиваний: 79


В примере открывал проект: basic-usart-hw-handshaking-project-at91sam7s-ek\at91sam7s-ek\basic-usart-hw-handshaking-project\uv2\at91sam7s128.uvproj
Go to the top of the page
 
+Quote Post
kovigor
сообщение Dec 20 2011, 09:21
Сообщение #22


Гуру
******

Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295



Цитата(Xeon @ Dec 20 2011, 11:06) *
книга-бякя...лучше даташит читать...с инглишом ещё немного дружу)


Ложь ! Читаю даташиты почти без словаря, но Редькина прочитываю первым. Хотя бы потому, что это чтение позволяет быстро и качественно получить общую информацию. Ну а детали можно уже и в даташите уточнить ...
Go to the top of the page
 
+Quote Post
Xeon
сообщение Dec 20 2011, 09:29
Сообщение #23


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

Группа: Участник
Сообщений: 140
Регистрация: 21-04-11
Пользователь №: 64 524



Цитата(kovigor @ Dec 20 2011, 12:21) *
Ложь ! Читаю даташиты почти без словаря, но Редькина прочитываю первым. Хотя бы потому, что это чтение позволяет быстро и качественно получить общую информацию. Ну а детали можно уже и в даташите уточнить ...


А без деталек чет ничего работать не хочет sm.gif
Go to the top of the page
 
+Quote Post
Xeon
сообщение Dec 21 2011, 07:40
Сообщение #24


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

Группа: Участник
Сообщений: 140
Регистрация: 21-04-11
Пользователь №: 64 524



Возникла ещё одна проблема)...
Создас файлики Protocol.c и Protocol.h в хедере описал все нужные переменные как static прототипы функций как extern (иначе не компилится, может так нельзя в кейле?).
В main подключаю хедеры следующим образом:
extern "C" {
#include "Protoloc.h"
#include "Led.h"
}
Led.h - там две функции одна инициализирует порты другая моргает светодиодами (объявлены как extern). Так вот когда вызываю функцию из Led.h все норм. Когда же вызываю функция из Protocol.h то программа зависает на строке SWI_Handler B SWI_Handler (строка из файла SAM7.s где происходит начальная инициализация). Смотрел кейловским отладчиком. В чём причина...?


Забыл сказать...смотрел стандартным дебагом переход на строку SWI_Handler B SWI_Handlerс происходит при переходе на функцию main(), т.е. после команд:
ldr r0, =__main
bx r0

Нашел причину...у меня есть строка ParseBuf = (unsigned char*) malloc(size); если её коментю то все норм, если эта строка есть то происходит выше сказанное...
Может нужно переопределять какие-то определения или есть хитрость при работе с библиотекой stdlib?
Go to the top of the page
 
+Quote Post
Lotor
сообщение Dec 21 2011, 07:55
Сообщение #25


Местный
***

Группа: Свой
Сообщений: 476
Регистрация: 3-07-07
Из: Санкт-Петербург
Пользователь №: 28 866



Вы для кучи память выделили же?


--------------------
Ковырял чукча отверткой в ухе, звук в телевизоре и пропал.
Go to the top of the page
 
+Quote Post
Xeon
сообщение Dec 21 2011, 08:00
Сообщение #26


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

Группа: Участник
Сообщений: 140
Регистрация: 21-04-11
Пользователь №: 64 524



Опа...) нет...) а как это сделать?)
Go to the top of the page
 
+Quote Post
Lotor
сообщение Dec 21 2011, 08:11
Сообщение #27


Местный
***

Группа: Свой
Сообщений: 476
Регистрация: 3-07-07
Из: Санкт-Петербург
Пользователь №: 28 866



Цитата(Xeon @ Dec 21 2011, 12:00) *
Опа...) нет...) а как это сделать?)

Если у Вас Кеил, то к проекту должен быть подключен стартаповый файл (расширение .s), если перейдете на него, то внизу будет вкладка Config Wizard.


--------------------
Ковырял чукча отверткой в ухе, звук в телевизоре и пропал.
Go to the top of the page
 
+Quote Post
Xeon
сообщение Dec 21 2011, 08:15
Сообщение #28


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

Группа: Участник
Сообщений: 140
Регистрация: 21-04-11
Пользователь №: 64 524



Цитата(Lotor @ Dec 21 2011, 11:11) *
Если у Вас Кеил, то к проекту должен быть подключен стартаповый файл (расширение .s), если перейдете на него, то внизу будет вкладка Config Wizard.

А какой обьём лучше выставлять, есть тут ли какие либо правила... или главное чтоб ОЗУ хватило?
Go to the top of the page
 
+Quote Post
toweroff
сообщение Dec 21 2011, 08:18
Сообщение #29


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Цитата(Xeon @ Dec 21 2011, 12:15) *
А какой обьём лучше выставлять, есть тут ли какие либо правила... или главное чтоб ОЗУ хватило?

а это уж как будете кучу пользовать sm.gif
со стеками несколько проще, кейл может рассчитать глубину (максимальную) вызовов... однако, если используются указатели на функции или еще как-то, может не совсем корректно вычисляться. Самому нужно прикидывать размеры
Go to the top of the page
 
+Quote Post
Xeon
сообщение Dec 21 2011, 08:46
Сообщение #30


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

Группа: Участник
Сообщений: 140
Регистрация: 21-04-11
Пользователь №: 64 524



Цитата(toweroff @ Dec 21 2011, 11:18) *
а это уж как будете кучу пользовать sm.gif
со стеками несколько проще, кейл может рассчитать глубину (максимальную) вызовов... однако, если используются указатели на функции или еще как-то, может не совсем корректно вычисляться. Самому нужно прикидывать размеры

Прикинул...выделил... Всё понял!)
toweroff и Lotor БОЛЬШОЕ СПАСИБО!!!!!! rolleyes.gif

И снова вопрос)
Как я понял в ARM если ты под юзером то прерывание глобально отрубить не как... а если очень нужно то как это сделать?
Или можно чтоб программа всё время выполнялась под каким нить другим режимом, который имеет подобные права, например supervisor?

Сообщение отредактировал Xeon - Dec 21 2011, 08:23
Go to the top of the page
 
+Quote Post

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

 


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


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