Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: AVR32 Studio на AT32UC3B0256
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Все остальные микроконтроллеры > AVR32
dinar21
Помогите пожалуйста создать проект на AVR32 Studio на AT32UC3B0256. По возможности обучить/объяснить, желательно в живую при встрече.Есть схема проекта и идея работы. С С++ сталкиваться не приходилось. Сам я в башкирии, могу добраться до любого города в Республике Башкортостан и Татарстан. Как смогу отблагодарю.
jasper
Дело нехитрое. wink.gif

Запускаем AVR32 Studio. Идем File->New->Other...,
Нажмите для просмотра прикрепленного файла
там выбираем AVR C Project
Обзываем проект, как надо, допустим "my_project".
Нажмите для просмотра прикрепленного файла
Нажимаем кнопочку с тремя точками в Target Device, там выбираем AT32UC3B0256.
Нажмите для просмотра прикрепленного файла
Нажимаем OK и Finish.
Нажмите для просмотра прикрепленного файла
Все. Пустой проект создан! sm.gif

Потом можно пойти во Framework->Select Drivers/Components/Services добавить нужные компоненты из Фрэйворка.

ЗЫ: Еще бывает полезно в начале, вместо AVR C Project, выбрать AVR Example Project. Потом выбрать наиболее близкий к вашей задаче пример для данного процессора.
Тогда нужные компоненты из Фрэймворка добавятся автоматически и код сразу билдится будет без ошибок. А потом, отталкиваясь от примера уже добавлять свое.
dinar21
Ну это понятно,мне надо вот именно то что дальше сделать помочь. Контроллер тактируется от внешнего кварца 12 МГц , как сделать чтоб он работал на 60 МГц?
jasper
Вот так всегда, спрашивает человек одно, а надо ему совсем другое. sad.gif

Изучаем пример: "EVK1101 - DRIVERS - Power Manager (PM) example 2"
Там есть функция local_start_highfreq_clock.
Она запускает PLL и включает тактирование на 48МГц. Ее чуток подправить в соответствии с даташитом, чтобы было 60.
dinar21
У меня был один большой вопрос, точнее просьба помочь или же куча мелких.
dinar21
Как вывести на одну из ножек тактовый сигнал 8 МГц для работы с АЦП при всех тех же остальных условиях (т.е. внеш.кварц 12 МГц и внутреннее тактирование 60МГц) ?
jasper
Для этой задачи существует специальный Generic clock для которого можно задавать разные источники клока и делитель.
Функции для работы с ним находятся в pm.h (pm_gc_setup, pm_gc_enable).
Выходы Generic clock (GCLK0, GCLK1, GCLK2) можно подключить к некоторым ножкам.
dinar21
почему у меня выскакивает предупреждение The user program and the bootloader overlap! Я загружаю программу через встроенный в конроллер Bootloader начиная с 0x080002000? В чем причина?
jasper
Это нормально, так должно быть.
Там в начале кода стоит трамплин на 2000 адрес, он перекрывается с бутлоадером. Бутлоадер защищен от перезаписи.
dinar21
Т.е часть моей программы не записывается,которая перекрывается с bootloader'ом? Причем эта ошибка иногда выскакивает,а иногда нет.

В примере pm поменял частоту синхронизации. После заливки где можно осциллографом посмотреть,что он действительно стал 60 МГц?
dinar21
Подскажите пожалуйста что конкретно надо поменять в примере PM, чтобы CPU тактировался 60 МГц и выдавал на одну ношку 8 МГц и где можно увидеть результат???
jasper
Исправленный пример PM 2 для 60МГц. Выход 60МГц смотреть на ножке PA30 (для EVK1101).

Нажмите для просмотра прикрепленного файла
dinar21
Спасибо, уже сам сделал и вывел на PA30 7,5 МГц (8 МГц не получилосьделит на 2 в степени),сейчас скачаю и сверю для большего понимания, С пока еще далек для меня. Теперь хочу то же самое на PWM сделать. Каким образом это осуществить не подскажете?
jasper
Здесь не подскажу, смотрите пример на PWM.
Можно еще использовать второй осциллятор, если туда прицепить кварц на 8МГц.
dinar21
Что осуществляет функция flashc_set_wait_state(1) в примере PM ?
jasper
В даташите написано:
Цитата
Internal High-Speed Flash
-Single Cycle Access up to 30 MHz


Т.е. если процессор работает на частоте свыше 30МГц для работы с флэш-памятью необходимо вставлять цикл ожидания.
dinar21
Понятно теперь. Спасибо
dinar21
У меня в проекте программа ставит "?" знак напротив строки #include <avr32/io.h> ,говоря что это не разрешенное включение. Как включить в Includes путь на io.h ?
jasper
В AVR32 Studio в свойствах проекта: Project->Properties->C/C++ General->Paths and Symbols, вкладка Includes, там GNU C и добавить путь.
У меня, например, H:\Program Files\Atmel\AVR Tools\AVR32 Studio\plugins\com.atmel.avr.toolchains.win32.x86_3.1.0.201012011657\os\win32\x86\avr32\include
dinar21
То что надо! sm.gif
dinar21
Никто не может подсказать нельзя ли реализовать тактирование PWM =60 МГц, а USART=12 МГц?
dinar21
Подскажите пожалуйста как сделать параллельные порт из ножек с PB1 по PB9 ?
Maximm
Цитата(dinar21 @ Apr 14 2011, 14:24) *
Подскажите пожалуйста как сделать параллельные порт из ножек с PB1 по PB9 ?


Вам порт ввода или вывода нужен или ввода/вывода?
И именно 9-битный?
dinar21
Мне нужно эти ножки на вывод. Они будут подключаться к 12 разрядному ЦАП к старшим 9 разрядам. Младшие 3 будут всегда повешены на 1.
Maximm
Цитата(dinar21 @ Apr 15 2011, 06:32) *
Мне нужно эти ножки на вывод. Они будут подключаться к 12 разрядному ЦАП к старшим 9 разрядам. Младшие 3 будут всегда повешены на 1.


Ну например так:
Код
AVR32_GPIO.port[1].oders = 0x000003FE;    \\ Конфигурируем соответствующие ножки на выход
AVR32_GPIO.port[1].gpers = 0x000003FE;    \\ Включаем эти ножки порта

AVR32_GPIO.port[1].ovr = 0x0000....            \\ Устанавливает состояние на этих выводах



dinar21
Цитата(Maximm @ Apr 15 2011, 09:47) *
Ну например так:
Код
AVR32_GPIO.port[1].oders = 0x000003FE;    \\ Конфигурируем соответствующие ножки на выход
AVR32_GPIO.port[1].gpers = 0x000003FE;    \\ Включаем эти ножки порта

AVR32_GPIO.port[1].ovr = 0x0000....            \\ Устанавливает состояние на этих выводах

О,точно!!! Совсем уже голова не работает.
Осталось разобраться с прерываниями. wacko.gif
dinar21
Не подскажете как сделать прерывание от PWM ?
dinar21
И что за регистр irq? найти не могу нигде
jasper
irq - общее обозначение запроса на прерывание. Такого регистра действительно нет.
Все необходимо для работы с прерываниями находится в драйвере контроллера прерываний INTC (intc.c и intc.h). Смотрите примеры для этого драйвера.
dinar21
Объясните пожалуйста как пользоваться режимом отладки через JTAG II .
dinar21
Уважаемые форумчане подкажите пожалуйста,что не так в программе. Почему не работает USART ? Без части программы прерывания от PWM работает. А так GCLK0, PWM работает,а USART -нет

CODE

#include <avr32/io.h>
#include "compiler.h"
#include "board.h"
#include "power_clocks_lib.h"
#include "gpio.h"
#include "usart.h"
#include "pm.h"
#include "pwm.h"
#include "intc.h"

/* задается какой из универсальных генераторов синхросигналов будет использоваться
* в данном случае 0 .т.е. порт PA3
*/
# define EXAMPLE_GCLK_ID 0
# define EXAMPLE_GCLK_PIN AVR32_PM_GCLK_0_PIN
# define EXAMPLE_GCLK_FUNCTION AVR32_PM_GCLK_0_FUNCTION


# define EXAMPLE_TARGET_PBACLK_FREQ_HZ FOSC0 // PBA clock target frequency, in Hz
# define EXAMPLE_USART (&AVR32_USART1)
# define EXAMPLE_USART_RX_PIN AVR32_USART1_RXD_0_0_PIN
# define EXAMPLE_USART_RX_FUNCTION AVR32_USART1_RXD_0_0_FUNCTION
# define EXAMPLE_USART_TX_PIN AVR32_USART1_TXD_0_0_PIN
# define EXAMPLE_USART_TX_FUNCTION AVR32_USART1_TXD_0_0_FUNCTION
# define EXAMPLE_USART_CLOCK_MASK AVR32_USART1_CLK_PBA
# define EXAMPLE_PDCA_CLOCK_HSB AVR32_PDCA_CLK_HSB
# define EXAMPLE_PDCA_CLOCK_PB AVR32_PDCA_CLK_PBA

//# define EXAMPLE_PWM_PIN AVR32_PWM_0_0_PIN
//# define EXAMPLE_PWM_FUNCTION AVR32_PWM_0_0_FUNCTION
# define EXAMPLE_PWM_CHANNEL_ID 0

# define EXAMPLE_PWM (&AVR32_PWM)
# define EXAMPLE_PWM_IRQ AVR32_PWM_IRQ


bool front;
int shet;

/*! \ краткое USART обработчик прерывания.
*
* \ к сведению `__attribute__ ((__interrupt__)) '(под GNU GCC для AVR32) и
* `__interrupt" (под IAR Embedded Workbench для Atmel AVR32) с функцией
* атрибуты используются для управления `Rete 'инструкции.
*/
#if defined (__GNUC__)
__attribute__((__interrupt__))
#elif defined(__ICCAVR32__)
__interrupt
#endif



static void pwm_int_handler(void) // п/п формирования пилы
{
if (front==true) // признак спадающего фронта
{if (shet!=0x00000000) AVR32_GPIO.port[1].ovr = shet-- ; // уменьшаем с на 1 до тех пор пока оно не 0
else {front=false;
AVR32_GPIO.port[1].ovr = shet;
}
}
else // иначе признак возрастающего фронта
{if (shet!=0x00000200) AVR32_GPIO.port[1].ovr = shet++ ; // увеличиваем с на 1 до тех пор пока оно не 512
else {front=true;
AVR32_GPIO.port[1].ovr = shet;
}
}

}


static void local_start_highfreq_clock(void)
{
volatile avr32_pm_t* pm = &AVR32_PM;
/* \Примечание во всех расчетах предположить, что Osc0 частота 12 МГц. */

pm_switch_to_osc0(pm, FOSC0, OSC0_STARTUP); // переключение тактирования на Osc0.

/* Установка ФАПЧ0 на Osc0, Mul = 9, делитель на 1, lockcount = , то есть. 12Mhzx10 = 120MHz/2=60МГц выходной */

pm_pll_setup(pm,
0, // разрешение использования ФАПЧ0
9, // MUL=10 умножение частоты кварца на 10
1, // DIV=1 деление частоты на 1
0, // Выбираем Osc0/PLL0 или Osc1/PLL1
16); // lockcount in main clock for the PLL wait lock

/*
Эта функция устанавливает опции ФАПЧ.
*pm Base address of the Power Manager (i.e. &AVR32_PM)
pll PLL number 0
pll_freq Set to 1 for VCO frequency range 80-180MHz, set to 0 for VCO frequency range 160-240Mhz.
pll_div2 Divide the PLL output frequency by 2 (this settings does not change the FVCO value)
pll_wbwdisable 1 Disable the Wide-Bandith Mode (Wide-Bandwith mode allow a faster startup time and out-of-lock time). 0 to enable the Wide-Bandith Mode.
*/
/* Выходная VCO частта ФАПЧ 120 MHz. Мы делим ее на 2 с pll_div2=1. Это позволяет разрешить дальше тактировать CPU на 60 MHz */
pm_pll_set_option(pm, 0, 1, 1, 0);

/* Разрешение ФАПЧ0 */
/*
void pm_pll_enable(volatile avr32_pm_t* pm,
unsigned int pll) {
*/
pm_pll_enable(pm,0);

pm_switch_to_clock(pm, AVR32_PM_MCSEL_PLL0); /* Переключение тактовой частоты процессора на 60 MHz */

}
static void local_enable_gclk_on_gpio(volatile avr32_pm_t* pm)
{
int gc = EXAMPLE_GCLK_ID;
/* установка на gc (вданном случае PA03) на прием от ФАПЧ и деление на 2^3=8 */
pm_gc_setup(pm, gc, 1, 0, 1, 3);

/* разрешение gc */
pm_gc_enable(pm,gc);
/* Назначение gc на выход GPIO PA3 */
gpio_enable_module_pin(EXAMPLE_GCLK_PIN, EXAMPLE_GCLK_FUNCTION);
}



int main(void)
{
static const gpio_map_t USART_GPIO_MAP =
{
{EXAMPLE_USART_RX_PIN, EXAMPLE_USART_RX_FUNCTION},
{EXAMPLE_USART_TX_PIN, EXAMPLE_USART_TX_FUNCTION}
};

// USART options.
static const usart_options_t USART_OPTIONS =
{ .baudrate = 172800,
.charlength = 8,
.paritytype = USART_NO_PARITY,
.stopbits = USART_1_STOPBIT,
.channelmode = USART_NORMAL_CHMODE
};


volatile avr32_pm_t* pm = &AVR32_PM;

// Настройка Osc0 в кристалле режиме (т.е. использование внешнего источника кристалла, с
// частота FOSC0) с соответствующим время запуска затем переключиться Главные часы
// источник Osc0.
pcl_switch_to_osc(PCL_OSC0, FOSC0, OSC0_STARTUP);

// Отключить все прерывания
Disable_global_interrupt();

pwm_opt_t pwm_opt; // PWM option config.
avr32_pwm_channel_t pwm_channel = { .ccnt = 0 }; // к.
// номер канала и, например, используется в ряде функций.
// Это определяется как локальная переменная для простоты использования.
unsigned int channel_id;

channel_id = EXAMPLE_PWM_CHANNEL_ID;
//gpio_enable_module_pin(EXAMPLE_PWM_PIN, EXAMPLE_PWM_FUNCTION);

// Назначение GPIO для USART.
gpio_enable_module(USART_GPIO_MAP,
sizeof(USART_GPIO_MAP) / sizeof(USART_GPIO_MAP[0]));
// Инициализация USART в режиме RS232.
usart_init_rs232(EXAMPLE_USART, &USART_OPTIONS, EXAMPLE_TARGET_PBACLK_FREQ_HZ);

// конфигурация PWM controller .
pwm_opt.diva = AVR32_PWM_DIVA_CLK_OFF;
pwm_opt.divb = AVR32_PWM_DIVB_CLK_OFF;
pwm_opt.prea = AVR32_PWM_PREA_MCK;
pwm_opt.preb = AVR32_PWM_PREB_MCK;

pwm_init(&pwm_opt);

pwm_channel.CMR.calg = PWM_MODE_LEFT_ALIGNED; // режим канала.
pwm_channel.CMR.cpol = PWM_POLARITY_LOW; // полярность канала.
pwm_channel.CMR.cpd = PWM_UPDATE_DUTY; // не используется в начальное время.
pwm_channel.CMR.cpre = AVR32_PWM_CPRE_MCK_DIV_32; // канальный предделитель.
pwm_channel.cdty = 6; // рабочий цикл канала, должен быть < CPRD.
pwm_channel.cprd = 12; // период канала.
pwm_channel.cupd = 0; // обновление канала здесь не используется.
// С такими настройками, период выходного сигнала будет :
// (12000000/32)/12 == 31250 Hz ==32 мкс
// prescaler == 32, period == 12.

// Инициализация векторов прерываний.
INTC_init_interrupts();
// Регистрация USART обработчик прерывания на контроллер прерываний.
// usart_int_handler является обработчик прерывания для регистров
// EXAMPLE_USART_IRQ является IRQ из обработчика прерывания для регистров
// AVR32_INTC_INT0 является прерывание уровень приоритета назначить группу
// это IRQ.
// недействительными INTC_register_interrupt (__int_handler обработчик, неподписанные IRQ Int, неподписанные int_level Int);
INTC_register_interrupt(&pwm_int_handler, EXAMPLE_PWM_IRQ, AVR32_INTC_INT0);

// Включить PWM прерывания.
EXAMPLE_PWM->ier = 1;

AVR32_GPIO.port[1].oders =0x000003FE; // Конфигурируем соответствующие ножки на выход
AVR32_GPIO.port[1].gpers =0x000003FE; // Включаем эти ножки порта

/* Начало высокой тактовой частоте и переключаться Main Clock с этой высокой тактовой частоты */
local_start_highfreq_clock();
/* Настройка общих часы с высокой тактовой частотой и выхода его на GPIO PIN */
//local_start_gc();
local_enable_gclk_on_gpio(pm);// включение внешнего тактирования 7,5 МГц на ножку

Enable_global_interrupt(); //разрешение прерываний

pwm_channel_init(channel_id, &pwm_channel); // Установить конфигурацию каналов 0.

pwm_start_channels(1 << channel_id); // стартовать канал 0.


// **AT32UC3B_USART**
while(1){
int c=0;
usart_read_char(EXAMPLE_USART, &c);
// Опрос канала 1
if( c == 0x30 )
usart_write_char(EXAMPLE_USART, 0x2B);
if( c == 0x31 )
usart_write_char(EXAMPLE_USART, 0x02);
// Опрос канала 2
if( c == 0x32 )
usart_write_char(EXAMPLE_USART, 0x09);
if( c == 0x33 )
usart_write_char(EXAMPLE_USART, 0x03);
};
}

Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.