Уважаемые форумчане подкажите пожалуйста,что не так в программе. Почему не работает 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);
};
}