搜索
bottom↓
回复: 26

[交流][Beta]AVR32 UC3专题学习:Interrupt Controller[2008-12-03]【恢复】

[复制链接]

出0入296汤圆

发表于 2008-11-28 14:43:20 | 显示全部楼层 |阅读模式

[章节概述]


    对不起大家,因为一些事情,所以耽搁了一天多。现在进入正题。今天开始给大家讲解

AVR32里面的中断系统。讲解仍然沿袭过去的习惯,分为理论讲解、寄存器概述、Software

Frame work 的使用、应用实例四大部分。中断控制其本身并不复杂,但是对32位系统来说

操作系统、复杂通讯系统、极限工程的等应用环境的存在,中断系统显得异常复杂。特别是

AVR32提供了4个等级的可屏蔽中断以及一个不可屏蔽中断,在实际应用中,可能会存在很多

隐性的问题。我们预留了3个位置,除了其中一个用于基本的中断控制器讲解以外,剩下的

2个都将预留给未来的专题。大家如果有什么疑问,遇到什么关于中断的有意思的内容,都可

以通过跟贴的方式参与到讨论中来。理不辩不明,学不用不会。



<font color=blue>

&nbsp;&nbsp;&nbsp;&nbsp;感谢大家的关注,希望更多的朋友就Interrupt&nbsp;Controller的使用进行讨论。谢谢。&nbsp;



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Snail&nbsp;Studio&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2008年11月29日
&nbsp;


[章节索引]


&nbsp;&nbsp;&nbsp;&nbsp;A、AVR32&nbsp;UC3&nbsp;中断系统的幻象&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[本贴1楼]

&nbsp;&nbsp;&nbsp;&nbsp;B、AVR32&nbsp;UC3&nbsp;中断系统的内幕&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[本贴4楼]




[相关下载]




&nbsp;&nbsp;&nbsp;&nbsp;<font color=red>点击此处下载
ourdev_522096.rar(文件大小:101K)&nbsp;(原文件名:INTC.rar)&nbsp;

本贴被 Gorgon Meducer 编辑过,最后修改时间:2008-12-03,18:06:35.

出0入296汤圆

 楼主| 发表于 2008-11-28 14:43:24 | 显示全部楼层

>>AVR32&nbsp;UC3&nbsp;中断系统的幻象


<font color=red>[说在前面的话]

&nbsp;&nbsp;&nbsp;&nbsp;很多事情,不知道其实是幸福的。我发誓,我下面所说的关于AVR32中断系统的内容都是某种

意义上的幻象——你可以理解为虚假的繁荣。真相是什么?你有知情权。但是如果你坚信自己不会

离开AVR32&nbsp;Software&nbsp;Framework的襁褓,那么所谓的真相对你来说也许是灾难性的。幻象有它存在

的意义——很多时候它能让事情显得简单和谐——事实上隐藏在幻象背后的内幕也只对少部分人有

意义。&nbsp;&nbsp;&nbsp;&nbsp;





&nbsp;&nbsp;&nbsp;&nbsp;问题一:你知道AVR32&nbsp;UC3在理论上最多能支持多少路中断么?

&nbsp;&nbsp;&nbsp;&nbsp;答案:&nbsp;AVR32&nbsp;UC3系列对于中断是分组管理的,理论上每个组可以容纳最大32个中断请求,同

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;时AVR32&nbsp;UC3支持最大64个组。显然AVR32&nbsp;UC3在理论上支持最多64&nbsp;*&nbsp;32&nbsp;=&nbsp;2048路中断。



&nbsp;&nbsp;&nbsp;&nbsp;问题二:你知道AVR32&nbsp;UC3有几个中断优先级么?

&nbsp;&nbsp;&nbsp;&nbsp;答案:&nbsp;4个。分别时INT0~INT3,其中INT0中断优先级最低。高等级中断可以打断低等级中断,

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;低等级中断不能打断高等级中断。



&nbsp;&nbsp;&nbsp;&nbsp;问题三:编写中断处理程序有什么特殊要求么?

&nbsp;&nbsp;&nbsp;&nbsp;答案:&nbsp;除了多个中断使用同一个中断向量号的情况以外,没有什么特殊要求。中断处理程序

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;不能带任何参数,也不能带任何返回值。记得在中断处理程序前加以下的代码:

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#if&nbsp;__GNUC__

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;__attribute__((__interrupt__))

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#elif&nbsp;__ICCAVR32__

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;__interrupt

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#endif

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;记得一定要加,否则出了问题我不负责。



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;问题四:如何声明一个中断向量?

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;答案:&nbsp;用一个Software&nbsp;Framework提供的函数,可以动态的注册中断向量。声明一个中断向量

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;只需要传递一个中断处理函数的函数指针,外加用于描述中断源的IRQ编号,再指定一个

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;中断优先级就可以了。



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;问题五:还有其他什么注意事项么?

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;答案:&nbsp;如果你奉公守法,那么没有了。




[寄存器概述]


&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;大体看一下这个图,知道差不多是那么回事就OK了。寄存器什么的与你无关……





&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;从图上的内容我们很容易知道,AVR32将所有的中断请求都是分组存放的,每个组中最多容纳32个

中断。实际应用中,有的组是满满当当的32个中断,有的组里只有1个中断。具体情况请参考对应型号

的器件手册。又因为AVR32有4个中断优先级,所以我们可以将64个组任意分配到4个中断优先级的门下。

对于每个组,有一个IPR寄存器,用于保存当前这个组中断优先级是多少,当这个组发生中断时,执行

哪个中断处理程序(保存了中断处理程序的函数地址)。当一个组发生中断时,我们需要知道是组内

具体哪个中断源闯得祸,因此有一个专门的寄存器IRR用于用于记录组内各个成员的是否发出了中断请

求。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;当一个中断发生的时候,系统如何知道是哪个组发出的中断呢?有一个专门的寄存器ICR记录了发

出中断请求,并且优先级最高的那个组的编号。根据这个编号,我们可以找到这个组,在根据组内的寄

存器IRR知道是组内哪个具体的中断源发出了请求。如果一个组内同时有多个中断请求怎么办?编号最

大的优先。当同时有多个相同优先级的组发出中断请求怎么办呢?也是编号最大的那个组获胜。




[Software&nbsp;Framework&nbsp;的使用]


&nbsp;&nbsp;&nbsp;&nbsp;当我们通过AVR32&nbsp;Studio的Software&nbsp;Framework添加向导增加了Power&nbsp;Manager驱动模块以后,系统

会自动在DRIVERS模块下增加一个INTC文件夹,其中包含了操作AVR32&nbsp;UC3&nbsp;INTC模块的底层API,我们只需

要在工程中增加一个&nbsp;#inludeINTC.h&nbsp;语句,就可以获得以下函数的使用权限:




extern&nbsp;void&nbsp;INTC_init_interrupts(void);

函数说明:没啥好说的,初始化整个中断系统,芯片初始化的时候调用一次即可。

输入参数:无


extern&nbsp;void&nbsp;INTC_register_interrupt(__int_handler&nbsp;handler,&nbsp;unsigned&nbsp;int&nbsp;irq,&nbsp;unsigned&nbsp;int&nbsp;int_lev);

函数说明:注册一个中断向量。也就是告诉系统当某个由IRQ描述的中断源发生了中断时,调用指定的中断

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;处理程序。同时该函数还给这个中断分配了一个优先级。

输入参数:指向中断处理函数的指针,

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;用于描述中断源的IRQ

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;该中断的优先级,注意,当同一个组内存在多个不同优先级的中断源时,改组最后一个调用该函

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;数注册的中断所指定的优先级对整个组的中断源都有效。




[应用实例]






#include&nbsp;&lt;avr32/io.h>

#include&nbsp;compiler.h

#include&nbsp;board.h

#include&nbsp;print_funcs.h

#include&nbsp;intc.h

#include&nbsp;pm.h

#include&nbsp;gpio.h

#include&nbsp;usart.h





/*!&nbsp;\name&nbsp;USART&nbsp;Settings

&nbsp;*/

//!&nbsp;@{

#if&nbsp;BOARD&nbsp;==&nbsp;EVK1100

#&nbsp;&nbsp;define&nbsp;EXAMPLE_USART&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(&AVR32_USART0)

#&nbsp;&nbsp;define&nbsp;EXAMPLE_USART_RX_PIN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AVR32_USART0_RXD_0_0_PIN

#&nbsp;&nbsp;define&nbsp;EXAMPLE_USART_RX_FUNCTION&nbsp;&nbsp;&nbsp;AVR32_USART0_RXD_0_0_FUNCTION

#&nbsp;&nbsp;define&nbsp;EXAMPLE_USART_TX_PIN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AVR32_USART0_TXD_0_0_PIN

#&nbsp;&nbsp;define&nbsp;EXAMPLE_USART_TX_FUNCTION&nbsp;&nbsp;&nbsp;AVR32_USART0_TXD_0_0_FUNCTION

#&nbsp;&nbsp;define&nbsp;EXAMPLE_USART_IRQ&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AVR32_USART0_IRQ

#&nbsp;&nbsp;define&nbsp;EXAMPLE_USART_BAUDRATE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;57600

#elif&nbsp;BOARD&nbsp;==&nbsp;EVK1101

#&nbsp;&nbsp;define&nbsp;EXAMPLE_USART&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(&AVR32_USART1)

#&nbsp;&nbsp;define&nbsp;EXAMPLE_USART_RX_PIN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AVR32_USART1_RXD_0_0_PIN

#&nbsp;&nbsp;define&nbsp;EXAMPLE_USART_RX_FUNCTION&nbsp;&nbsp;&nbsp;AVR32_USART1_RXD_0_0_FUNCTION

#&nbsp;&nbsp;define&nbsp;EXAMPLE_USART_TX_PIN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AVR32_USART1_TXD_0_0_PIN

#&nbsp;&nbsp;define&nbsp;EXAMPLE_USART_TX_FUNCTION&nbsp;&nbsp;&nbsp;AVR32_USART1_TXD_0_0_FUNCTION

#&nbsp;&nbsp;define&nbsp;EXAMPLE_USART_IRQ&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AVR32_USART1_IRQ

#&nbsp;&nbsp;define&nbsp;EXAMPLE_USART_BAUDRATE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;57600

#elif&nbsp;BOARD&nbsp;==&nbsp;STK1000

#&nbsp;&nbsp;define&nbsp;EXAMPLE_USART&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(&AVR32_USART1)

#&nbsp;&nbsp;define&nbsp;EXAMPLE_USART_RX_PIN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AVR32_USART1_RXD_0_PIN

#&nbsp;&nbsp;define&nbsp;EXAMPLE_USART_RX_FUNCTION&nbsp;&nbsp;&nbsp;AVR32_USART1_RXD_0_FUNCTION

#&nbsp;&nbsp;define&nbsp;EXAMPLE_USART_TX_PIN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AVR32_USART1_TXD_0_PIN

#&nbsp;&nbsp;define&nbsp;EXAMPLE_USART_TX_FUNCTION&nbsp;&nbsp;&nbsp;AVR32_USART1_TXD_0_FUNCTION

#&nbsp;&nbsp;define&nbsp;EXAMPLE_USART_IRQ&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AVR32_USART1_IRQ

#&nbsp;&nbsp;define&nbsp;EXAMPLE_USART_BAUDRATE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;115200

#elif&nbsp;BOARD&nbsp;==&nbsp;NGW100

#&nbsp;&nbsp;define&nbsp;EXAMPLE_USART&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(&AVR32_USART1)

#&nbsp;&nbsp;define&nbsp;EXAMPLE_USART_RX_PIN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AVR32_USART1_RXD_0_PIN

#&nbsp;&nbsp;define&nbsp;EXAMPLE_USART_RX_FUNCTION&nbsp;&nbsp;&nbsp;AVR32_USART1_RXD_0_FUNCTION

#&nbsp;&nbsp;define&nbsp;EXAMPLE_USART_TX_PIN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AVR32_USART1_TXD_0_PIN

#&nbsp;&nbsp;define&nbsp;EXAMPLE_USART_TX_FUNCTION&nbsp;&nbsp;&nbsp;AVR32_USART1_TXD_0_FUNCTION

#&nbsp;&nbsp;define&nbsp;EXAMPLE_USART_IRQ&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AVR32_USART1_IRQ

#&nbsp;&nbsp;define&nbsp;EXAMPLE_USART_BAUDRATE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;115200

#endif

//!&nbsp;@}





/*!&nbsp;\brief&nbsp;The&nbsp;USART&nbsp;interrupt&nbsp;handler.

&nbsp;*

&nbsp;*&nbsp;\note&nbsp;The&nbsp;~__attribute__((__interrupt__))'&nbsp;(under&nbsp;GNU&nbsp;GCC&nbsp;for&nbsp;AVR32)&nbsp;and

&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;~__interrupt'&nbsp;(under&nbsp;IAR&nbsp;Embedded&nbsp;Workbench&nbsp;for&nbsp;Atmel&nbsp;AVR32)&nbsp;C&nbsp;function

&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;attributes&nbsp;are&nbsp;used&nbsp;to&nbsp;manage&nbsp;the&nbsp;~rete'&nbsp;instruction.

&nbsp;*/

#if&nbsp;__GNUC__

__attribute__((__interrupt__))

#elif&nbsp;__ICCAVR32__

__interrupt

#endif

static&nbsp;void&nbsp;usart_int_handler(void)

{

&nbsp;&nbsp;int&nbsp;c;



&nbsp;&nbsp;//&nbsp;In&nbsp;the&nbsp;code&nbsp;line&nbsp;below,&nbsp;the&nbsp;interrupt&nbsp;priority&nbsp;level&nbsp;does&nbsp;not&nbsp;need&nbsp;to&nbsp;be

&nbsp;&nbsp;//&nbsp;explicitly&nbsp;masked&nbsp;as&nbsp;it&nbsp;is&nbsp;already&nbsp;because&nbsp;we&nbsp;are&nbsp;within&nbsp;the&nbsp;interrupt

&nbsp;&nbsp;//&nbsp;handler.

&nbsp;&nbsp;//&nbsp;The&nbsp;USART&nbsp;Rx&nbsp;interrupt&nbsp;flag&nbsp;is&nbsp;cleared&nbsp;by&nbsp;side&nbsp;effect&nbsp;when&nbsp;reading&nbsp;the

&nbsp;&nbsp;//&nbsp;received&nbsp;character.

&nbsp;&nbsp;//&nbsp;Waiting&nbsp;until&nbsp;the&nbsp;interrupt&nbsp;has&nbsp;actually&nbsp;been&nbsp;cleared&nbsp;is&nbsp;here&nbsp;useless&nbsp;as

&nbsp;&nbsp;//&nbsp;the&nbsp;call&nbsp;to&nbsp;usart_write_char&nbsp;will&nbsp;take&nbsp;enough&nbsp;time&nbsp;for&nbsp;this&nbsp;before&nbsp;the

&nbsp;&nbsp;//&nbsp;interrupt&nbsp;handler&nbsp;is&nbsp;leaved&nbsp;and&nbsp;the&nbsp;interrupt&nbsp;priority&nbsp;level&nbsp;is&nbsp;unmasked&nbsp;by

&nbsp;&nbsp;//&nbsp;the&nbsp;CPU.

&nbsp;&nbsp;usart_read_char(EXAMPLE_USART,&nbsp;&c);



&nbsp;&nbsp;//&nbsp;Print&nbsp;the&nbsp;received&nbsp;character&nbsp;to&nbsp;USART.

&nbsp;&nbsp;//&nbsp;It&nbsp;is&nbsp;a&nbsp;simple&nbsp;echo,&nbsp;so&nbsp;there&nbsp;will&nbsp;be&nbsp;no&nbsp;translation&nbsp;of&nbsp;'\r'&nbsp;to&nbsp;\r\n.&nbsp;The

&nbsp;&nbsp;//&nbsp;connected&nbsp;terminal&nbsp;has&nbsp;to&nbsp;be&nbsp;configured&nbsp;accordingly&nbsp;to&nbsp;send&nbsp;'\n'&nbsp;after

&nbsp;&nbsp;//&nbsp;'\r'.

&nbsp;&nbsp;usart_write_char(EXAMPLE_USART,&nbsp;c);

}





/*!&nbsp;\brief&nbsp;The&nbsp;main&nbsp;function.

&nbsp;*

&nbsp;*&nbsp;It&nbsp;sets&nbsp;up&nbsp;the&nbsp;USART&nbsp;module&nbsp;on&nbsp;EXAMPLE_USART.&nbsp;The&nbsp;terminal&nbsp;settings&nbsp;are&nbsp;57600

&nbsp;*&nbsp;8N1.

&nbsp;*&nbsp;Then&nbsp;it&nbsp;sets&nbsp;up&nbsp;the&nbsp;interrupt&nbsp;handler&nbsp;and&nbsp;waits&nbsp;for&nbsp;a&nbsp;USART&nbsp;interrupt&nbsp;to

&nbsp;*&nbsp;trigger.

&nbsp;*/

int&nbsp;main(void)

{

&nbsp;&nbsp;static&nbsp;const&nbsp;gpio_map_t&nbsp;USART_GPIO_MAP&nbsp;=

&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;{EXAMPLE_USART_RX_PIN,&nbsp;EXAMPLE_USART_RX_FUNCTION},

&nbsp;&nbsp;&nbsp;&nbsp;{EXAMPLE_USART_TX_PIN,&nbsp;EXAMPLE_USART_TX_FUNCTION}

&nbsp;&nbsp;};



&nbsp;&nbsp;//&nbsp;USART&nbsp;options.

&nbsp;&nbsp;static&nbsp;const&nbsp;usart_options_t&nbsp;USART_OPTIONS&nbsp;=

&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;.baudrate&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;EXAMPLE_USART_BAUDRATE,

&nbsp;&nbsp;&nbsp;&nbsp;.charlength&nbsp;&nbsp;&nbsp;=&nbsp;8,

&nbsp;&nbsp;&nbsp;&nbsp;.paritytype&nbsp;&nbsp;&nbsp;=&nbsp;USART_NO_PARITY,

&nbsp;&nbsp;&nbsp;&nbsp;.stopbits&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;USART_1_STOPBIT,

&nbsp;&nbsp;&nbsp;&nbsp;.channelmode&nbsp;&nbsp;=&nbsp;USART_NORMAL_CHMODE

&nbsp;&nbsp;};



#if&nbsp;BOARD&nbsp;==&nbsp;EVK1100&nbsp;||&nbsp;BOARD&nbsp;==&nbsp;EVK1101



&nbsp;&nbsp;//&nbsp;Switch&nbsp;main&nbsp;clock&nbsp;to&nbsp;external&nbsp;oscillator&nbsp;0&nbsp;(crystal).

&nbsp;&nbsp;pm_switch_to_osc0(&AVR32_PM,&nbsp;FOSC0,&nbsp;OSC0_STARTUP);



#endif



&nbsp;&nbsp;//&nbsp;Assign&nbsp;GPIO&nbsp;to&nbsp;USART.

&nbsp;&nbsp;gpio_enable_module(USART_GPIO_MAP,

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sizeof(USART_GPIO_MAP)&nbsp;/&nbsp;sizeof(USART_GPIO_MAP[0]));



&nbsp;&nbsp;//&nbsp;Initialize&nbsp;USART&nbsp;in&nbsp;RS232&nbsp;mode.

&nbsp;&nbsp;usart_init_rs232(EXAMPLE_USART,&nbsp;&USART_OPTIONS,&nbsp;FOSC0);

&nbsp;&nbsp;print(EXAMPLE_USART,&nbsp;.:&nbsp;Using&nbsp;interrupts&nbsp;with&nbsp;the&nbsp;USART&nbsp;:.\n\n);

&nbsp;&nbsp;

&nbsp;&nbsp;//关闭AVR32的全局中断响应,类似AVR系列的CLI();.

&nbsp;&nbsp;Disable_global_interrupt();

&nbsp;&nbsp;

&nbsp;&nbsp;//初始化中断系统

&nbsp;&nbsp;INTC_init_interrupts();

&nbsp;&nbsp;


&nbsp;&nbsp;//&nbsp;Register&nbsp;the&nbsp;USART&nbsp;interrupt&nbsp;handler&nbsp;to&nbsp;the&nbsp;interrupt&nbsp;controller.

&nbsp;&nbsp;//&nbsp;usart_int_handler&nbsp;is&nbsp;the&nbsp;interrupt&nbsp;handler&nbsp;to&nbsp;register.

&nbsp;&nbsp;//&nbsp;EXAMPLE_USART_IRQ&nbsp;is&nbsp;the&nbsp;IRQ&nbsp;of&nbsp;the&nbsp;interrupt&nbsp;handler&nbsp;to&nbsp;register.

&nbsp;&nbsp;//&nbsp;AVR32_INTC_INT0&nbsp;is&nbsp;the&nbsp;interrupt&nbsp;priority&nbsp;level&nbsp;to&nbsp;assign&nbsp;to&nbsp;the&nbsp;group&nbsp;of

&nbsp;&nbsp;//&nbsp;this&nbsp;IRQ.

&nbsp;&nbsp;//&nbsp;void&nbsp;INTC_register_interrupt(__int_handler&nbsp;handler,&nbsp;unsigned&nbsp;int&nbsp;irq,&nbsp;unsigned&nbsp;int&nbsp;int_lev);

&nbsp;&nbsp;

&nbsp;&nbsp;//注册USART中断,中断处理函数是usart_int_handler,优先级是INT0

&nbsp;&nbsp;//需要强调的是,USART的发送和接收使用的都是同一个中断IRQ,详细情形请参阅

&nbsp;&nbsp;//后面的讲座,或者直接参考官方Datasheet。

&nbsp;&nbsp;INTC_register_interrupt(&usart_int_handler,&nbsp;EXAMPLE_USART_IRQ,&nbsp;AVR32_INTC_INT0);

&nbsp;&nbsp;


&nbsp;&nbsp;//&nbsp;Enable&nbsp;USART&nbsp;Rx&nbsp;interrupt.

&nbsp;&nbsp;EXAMPLE_USART->ier&nbsp;=&nbsp;AVR32_USART_IER_RXRDY_MASK;

&nbsp;&nbsp;print(EXAMPLE_USART,&nbsp;Type&nbsp;a&nbsp;character&nbsp;to&nbsp;use&nbsp;the&nbsp;interrupt&nbsp;handler.\n

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;It&nbsp;will&nbsp;show&nbsp;up&nbsp;on&nbsp;your&nbsp;screen.\n\n);



&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;//&nbsp;开启AVR32的全局中断响应,类似AVR的SEI()

&nbsp;&nbsp;Enable_global_interrupt();

&nbsp;&nbsp;


&nbsp;&nbsp;while&nbsp;(TRUE);

}



本贴被 Gorgon Meducer 编辑过,最后修改时间:2008-12-03,23:52:51.

出0入296汤圆

 楼主| 发表于 2008-11-28 14:43:31 | 显示全部楼层

>>AVR32&nbsp;UC3系统伪中断的处理


敬请期待



本贴被 Gorgon Meducer 编辑过,最后修改时间:2008-11-29,20:47:41.

出0入296汤圆

 楼主| 发表于 2008-11-28 14:43:36 | 显示全部楼层

>>中断临界区保护与uc/osII中断系统移植


敬请期待

本贴被 Gorgon Meducer 编辑过,最后修改时间:2008-11-29,20:49:16.

出0入296汤圆

 楼主| 发表于 2008-11-29 23:51:55 | 显示全部楼层

>>AVR32&nbsp;UC3&nbsp;中断系统的内幕




<font color=red>[说在前面的话]

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;内幕不一定是黑幕。很多情况往往事出有因,不可一概而论。




&nbsp;&nbsp;&nbsp;&nbsp;真相一:AVR32&nbsp;UC3系统只有64个硬件中断。所谓的分组中断系统,其实只是一种辅助了寄存器

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;的软件实现手段。除了基本的64个中断以外,其他所有的组内中断系统其实都是依靠

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;软件手段配合查询相关寄存器来实现的。

&nbsp;&nbsp;&nbsp;&nbsp;真相二:AVR32&nbsp;有4个中断优先级,但这4个中断优先级的实质却并不简单,使用方法也并非那

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;么死板——高优先级中断打断低优先级中断、低优先级中断不能打断高优先级中断。

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;除了默认的中断处理方式以外,通过额外的手段可以获得功能强大的中断优先级管理。

&nbsp;&nbsp;&nbsp;&nbsp;真相三:编写AVR32中断处理程序需要用户自己处理汇编指令“rete”。当然实现的方法有很多。

&nbsp;&nbsp;&nbsp;&nbsp;真相四:因为AVR32实际上只有64个硬件中断,所以只需要设置64个中断中断向量,这些内容是可

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;以通过修改寄存器来实现的,具体内容在后面为你展开。

&nbsp;&nbsp;&nbsp;&nbsp;真相五:即便知道了上面4个真相,对你来说仍然只是看到了冰山的一角。真正的内幕还没有为

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;你敞开。我们将在随后的章节中为你一一揭秘。




>>&nbsp;AVR32&nbsp;UC3的事件处理系统




一、认识幕后黑手——事件系统(Events&nbsp;system)&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;AVR32&nbsp;UC3系列有一个事件处理系统,根据这个系统的设定,来自系统内核的事件被称为异常

(Exception);来自内核外部的外设以及芯片外部的事件被称为中断。异常的种类很多,比如PC

指针遇到了一个不支持的机器指令,寻址错误,无效的MMU指令等等。正常情况下,我们很少需要

去关心这些异常的处理。在AVR32&nbsp;UC3系统中,中断有两种——普通中断(又称可屏蔽中断)和不可

屏蔽中断(None&nbsp;Maskable&nbsp;Interrupt)。AVR32的事件处理系统根据体系构架的不同分为A、B两个

种类,我们使用的UC3属于A类。



二、非常唬弄人的事件优先级&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;当因为某个原因触发了事件(中断和异常都属于事件),首先存在一个相应的优先级问题。

对于下面的说明,希望大家仔细斟酌:



&nbsp;&nbsp;&nbsp;&nbsp;1、当系统执行一条汇编指令触发多个事件的时候,这些事件按照下表所示的优先级依次处理

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;所有的事件。

&nbsp;&nbsp;&nbsp;&nbsp;



&nbsp;&nbsp;&nbsp;&nbsp;2、当系统中存在多条由不同指令触发的事件时,这些事件将按照发生的顺被处理,并不会因为

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;事件队列(系统硬件中存在一个未处理事件队列)后来者的优先级高而首先执行高优先级者,

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;理解这个问题的时候,请和中断中高优先级能打断低优先级执行这个问题进行对比。虽然中

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;断中,高优先级可以打断低优先级,但是这里隐藏的意思就是,先来的低优先级的处理程序

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;已经先被处理了,只不过后来的优先级高的中断打断了前面的处理,而并不是完全取代前面

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;的低优先级中断。假设敌优先级的程序在执行中断处理程序的时候人为的将高优先级的中断

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;屏蔽位写了1,那么高优先级的中断将永远没有机会打断正在执行的低优先级的中断。



&nbsp;&nbsp;&nbsp;&nbsp;这种优先级安排方式,实际上保证了程序的正常运行时序,并不是什么糟糕的事情,事实上通

过事件屏蔽机制,系统为我们提供了灵活的事件处理方案。关于事件屏蔽机制的详细内容,将在随

后的内容中详细介绍。



三、如何在系统中加入自己的事件处理程序&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;在AVR&nbsp;8-bit系统中,当某一中断发生时,系统会自动跳转到固定的地址执行代码,通常这些

地址上会保留一个软件的跳转语句,以实现中断处理程序的调用。在AVR32的事件系统中,对于某

一事件的处理实际上存在3种不同的方法,对于不同的方法,我们有3种不同的方法以加入自己的

事件处理程序。



&nbsp;&nbsp;&nbsp;&nbsp;A、固定地址立即寻址

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;例如,当发生外部复位时,Reset事件发生,系统自动进入0x80000000地址执行程序。

&nbsp;&nbsp;&nbsp;&nbsp;B、相对地址立即寻址

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;对于很多异常来说,一旦发生,系统就会自动跳转到一个相对于_EVBA所在地址的一个固定

&nbsp;&nbsp;&nbsp;&nbsp;偏移量去执行。这种方式有点类似AVR&nbsp;8-bit的中断向量。这里需要注意的是,普通的异常处理

&nbsp;&nbsp;&nbsp;&nbsp;地址之间彼此相隔4个字节,刚好可以加入一个跳转语句;而有的异常处理地址之间却相隔更多

&nbsp;&nbsp;&nbsp;&nbsp;的字节,可以直接放下一小段汇编代码——这种设计显然是为了节省二次跳转所占用的时间,

&nbsp;&nbsp;&nbsp;&nbsp;提高事件的响应速度。除了异常以外,非可屏蔽中断采用的也是这种寻址方式。

&nbsp;&nbsp;&nbsp;&nbsp;C、相对地址间接寻址

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AVR32&nbsp;UC3的中断系统使用的就是这种方式。AVR32&nbsp;UC3支持4个中断,分别是INT0、INT1、

&nbsp;&nbsp;&nbsp;&nbsp;INT2和INT3。这4个中断的优先级是逐渐升高的,从前面的表格中也可以看出来。对于这些

&nbsp;&nbsp;&nbsp;&nbsp;中断,系统会自动将_EVBA的地址与INTC对应寄存器IPR里面的Autovector相加获得对应的中断

&nbsp;&nbsp;&nbsp;&nbsp;处理程序地址。这种方法省略了中间的二次跳转,能够达到普通方法无法达到的中断响应速度。



&nbsp;&nbsp;&nbsp;&nbsp;如果我们想为指定的事件处理加入自己的处理程序,就需要借助汇编程序,建立一个_EVBA段

&nbsp;&nbsp;&nbsp;&nbsp;并按照前面表格的内容编写汇编代码。好在Software&nbsp;Framework已经为我们做好了这样一个汇

&nbsp;&nbsp;&nbsp;&nbsp;编程序。补充说明:_EVBA是一个汇编段落,专门用来存放事件系统处理程序。



四、当一个事件发生的时候&nbsp;



&nbsp;&nbsp;&nbsp;&nbsp;当一个事件发生的时候,CPU首先会首先检查检查发生的事件是否时可屏蔽的,如果是可屏蔽的

比如可屏蔽异常,可屏蔽中断等,系统会自动监测对应的屏蔽标志。比如,对于可屏蔽异常来说,

系统会自动检测内核状态寄存器SR中的EM标志是否被置位,如果置位则无视本次事件。对于可屏蔽

中断来说,系统会根据发生中断的等级查询对应的中断屏蔽位InM是否被设置,如果被置位,则无视

本次中断。

&nbsp;&nbsp;&nbsp;&nbsp;无论是可屏蔽事件还是不可屏蔽事件,系统会首先设定对应优先级及以下优先级的事件屏蔽位,

比如发生了OCD&nbsp;Stop&nbsp;CPU事件,那么EM&nbsp;I3M&nbsp;I2M&nbsp;I1M&nbsp;I0M&nbsp;都会被设置;比如发生了I2M中断,那么

I2M、I1M、I0M都将被设置。对于系统这种默认行为,我们可以通过软件的方法在事件处理程序中

人为的清除一些希望开启的屏蔽标志。这将获得非常灵活的中断管理方式。如果发生的事一个异常

GM和EM都会被设置,如果发生的事一个中断,那么只有InM会被置位。

&nbsp;&nbsp;&nbsp;&nbsp;完成了事件屏蔽位的处理,CPU会将当前的PC指针SR寄存器压栈。如果该事件是一个中断,包括

不可屏蔽中断,系统还会额外的将R8~R12以及LR寄存器压入栈中。在每一个程序的最后,用户需要

自己通过汇编语句rete将这些寄存器出栈,以恢复此前的运行状态。



五、当一个中断发生的时候

&nbsp;&nbsp;&nbsp;&nbsp;当一个中断发生的时候,事情要更为复杂一点,硬件会替我们完成一部分,剩下一段路还需要

我们编写额外的软件来实现。如果你使用Software&nbsp;Framework,那么这些额外的软件大部分都已经

是现成的,你可以视其为AVR32&nbsp;UC3系统的一个部分——当然,对于类似USART发送和接收完成中断

使用同一个中断请求的情况,可能还需要你自己编写一个小程序来处理这个问题。(参考&nbsp;AVR32&nbsp;UC3

&nbsp;中断系统的幻象中,使用USART中断模式来实现发送和接收程序的例子)



&nbsp;&nbsp;&nbsp;&nbsp;首先,CPU会检查同时发生的事件中有没有高优先级的事件,如果有就去执行那个高优先级的事

件。注意,这里所谓的同时是指由同一个汇编指令同时引发的多个事件。接下来,CPU会根据发生中

断的组,找到该组的寄存器IPR,根据IPR中Interrupt&nbsp;Level信息设置对应的InM标志;根据IPR中

AutoVector信息结合_EVBA地址计算出中断处理程序的实际地址。这里需要注意,AutoVector只有14

位,也就是说,单凭AutoVector的地址偏移信息,我们的中断处理程序只能存在于_EVBA开始16K字节

的范围内,这显然是存在问题的。好在Software&nbsp;Framework为我们提供了完善的解决反感,这个后面

章节再提。有了AutoVector,系统就可以跳转到中断处理程序去执行了,不过在跳转之前,CPU会例

行公事,将PC和SR指针连同R8~R12、LR寄存器一同压入栈中。用户的中断处理程序需要在每次推出

函数前,调用rete指令,将这些寄存器信息出栈,以回到原来的运行状态。



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如何在C语言中加入对rete的支持呢?Software&nbsp;Framework给出了两个方案,一个是通过在线

汇编的方式:比如&nbsp;__asm__(rete);一个是通过使用专门的扩展关键字

(__attribute__((__interrupt__)))在中断处理程序声明时进行修饰——完成修饰后的函数,会在

退出函数时,自动加入rete语句。&nbsp;比如:



#if&nbsp;__GNUC__

__attribute__((__interrupt__))

#elif&nbsp;__ICCAVR32__

__interrupt

#endif

static&nbsp;void&nbsp;_unhandled_interrupt(void)

{

&nbsp;&nbsp;//&nbsp;Catch&nbsp;unregistered&nbsp;interrupts.

&nbsp;&nbsp;while&nbsp;(TRUE);

}



六、Software&nbsp;Framework为我们作了些什么&nbsp;&nbsp;

(正在更新)

&nbsp;


[寄存器概述]


(正在更新)




[Software&nbsp;Framework&nbsp;的使用]


(参考&nbsp;AVR32&nbsp;UC3&nbsp;中断系统的幻象&nbsp;)




[应用实例]


(None)

本贴被 Gorgon Meducer 编辑过,最后修改时间:2008-12-03,23:37:14.

出0入296汤圆

 楼主| 发表于 2008-11-30 00:33:41 | 显示全部楼层
完成&nbsp;>>AVR32&nbsp;UC3&nbsp;中断系统的幻象&nbsp;的更新哈。

呼呼~~

本贴被 Gorgon Meducer 编辑过,最后修改时间:2008-12-01,12:19:54.

出0入0汤圆

发表于 2008-12-3 17:11:41 | 显示全部楼层
学习,关注傻孩子,期待有更多文章!

出0入296汤圆

 楼主| 发表于 2008-12-3 18:08:39 | 显示全部楼层
更新&nbsp;>>AVR32&nbsp;UC3&nbsp;中断系统的内幕&nbsp;

自己顶一下。

出0入296汤圆

 楼主| 发表于 2008-12-3 22:30:29 | 显示全部楼层
更新>>AVR32&nbsp;UC3&nbsp;中断系统的内幕&nbsp;一个错误

正确内容是:AVR32&nbsp;UC3有64个硬件中断。而不是之前的笔误4个。特此道歉。

出0入0汤圆

发表于 2008-12-3 23:54:23 | 显示全部楼层
学习中

出0入0汤圆

发表于 2008-12-19 22:21:16 | 显示全部楼层
请教傻孩子一个问题哈,我是新手,对很多东西都是刚上手,目前做的一个项目是从USB读进来一些从天线上下来的音频数据流,然后稍作处理后从网络通过UDP转发出去。USB工作在OTG&nbsp;host&nbsp;mode。在我的应用程序中是首先去读usb&nbsp;pipe&nbsp;in&nbsp;中64字节中的数据,然后处理后存入发送UDP&nbsp;包的buffer中,当到一个UDP包长(1500)个字节的时候发送UDP包,这个过程中还会从网络接收UDP包进行处理,然后再重复之前的过程。目前的问题是如果我在网络处理着快花的时间过长的话(即两次读usb&nbsp;pipe&nbsp;in之间的时间过长,就会出现音频数据丢失的现象。为了保证音频数据的连续,我想用usb的中断模式,我对USB协议的理解以及应用都是通过FRAMEWORK中关于USB的历程得来的,那些例子中好像没有用中断方式的。还有就是我分配给pipe&nbsp;in&nbsp;一个bank,能不能像网络那部分一样,分配较大的一个缓冲区,USB进来的数据先存在缓冲区中。

你有没有类似这样的例子可以让我参考一下

先谢了

&nbsp;

我用的开发板是EVK1100&nbsp;片子是uc3a0512-0ES

本贴被 jinni2003 编辑过,最后修改时间:2008-12-19,22:26:51.

出0入0汤圆

发表于 2008-12-20 17:06:52 | 显示全部楼层
【10楼】&nbsp;jinni2003&nbsp;

……用中断就能保证数据流不断?

感觉比较实际的是用USB用MSC比较好

首先你要评估好网络最长会有多少的时间要处理,然后通过MSC把足够网络处理花费时间的数据拿出来放在缓冲区内

出0入0汤圆

发表于 2008-12-20 18:13:16 | 显示全部楼层
回楼上,可能我没有说清楚,USB进来的数据是从天线下来的原始数据,首先我得保证从USB读进来的音频数据是连续的,所以在两次读pipe&nbsp;in之间花的时间长的话,就会出现后面从天线上下来的音频数据覆盖USB&nbsp;bank中的数据,导致音频数据丢失

出0入0汤圆

发表于 2009-4-9 14:15:11 | 显示全部楼层
#if __GNUC__
__attribute__((__interrupt__))
#elif __ICCAVR32__
__interrupt
#endif
void handle_key_interrupt(void)
{
        if (gpio_get_pin_value(GPIO_PUSH_BUTTON_0) == 0)
                gpio_clr_gpio_pin(LED0_GPIO);
        else
                gpio_set_gpio_pin(LED0_GPIO);
        if (gpio_get_pin_value(GPIO_PUSH_BUTTON_1) == 0)
                gpio_clr_gpio_pin(LED1_GPIO);
        else
                gpio_set_gpio_pin(LED1_GPIO);
}

void key_task_init(void)
{
        //step1: init gpio
        gpio_enable_pin_glitch_filter(GPIO_PUSH_BUTTON_0);
        gpio_enable_pin_glitch_filter(GPIO_PUSH_BUTTON_1);
        //print(EXAMPLE_USART, ".: Using interrupts with the key :.\n\n");
        // Disable all interrupts.
        Disable_global_interrupt();
#if __GNUC__
        // Initialize interrupt vectors.
        INTC_init_interrupts();
        INTC_register_interrupt(&handle_key_interrupt, AVR32_GPIO_IRQ_1, AVR32_INTC_INT1);
#endif
        //gpio_clear_pin_interrupt_flag(GPIO_PUSH_BUTTON_0);
        //gpio_clear_pin_interrupt_flag(GPIO_PUSH_BUTTON_1);
        // Enable GPIO interrupt.
        gpio_enable_pin_interrupt(GPIO_PUSH_BUTTON_0,GPIO_PIN_CHANGE);
        gpio_enable_pin_interrupt(GPIO_PUSH_BUTTON_1,GPIO_PIN_CHANGE);

        // Enable all interrupts.
        Enable_global_interrupt();
        return ;
}

出0入0汤圆

发表于 2009-4-9 14:16:08 | 显示全部楼层
请问一下,为什么我以上的代码按键进不了中断,我是在EVK1101板上作测试。

出0入0汤圆

发表于 2009-4-13 22:39:37 | 显示全部楼层
嘿嘿,我弄错了.这两个按键是连的外部中断

出0入0汤圆

发表于 2009-7-7 13:44:56 | 显示全部楼层
关于Interrupt Controller这个专题的内容,我想与《AVR32 UC3工程师快入门指南》是有关系的,觉得写得很好,但是有两处笔误,虽然不影响阅读,既然要出书用,不妨就提出来吧。

&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
笔误1:
假设敌优先级的程序在执行中断处理程序的时候人为的将高优先级的中断
       屏蔽位写了1,那么高优先级的中断将永远没有机会打断正在执行的低优先级的中断。

[敌]优先级我想是[低]优先级

笔误2:
五、当一个中断发生的时候
好在Software Framework为我们提供了完善的解决反感.

[反感]我想应该是[方案]

&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

出0入0汤圆

发表于 2009-10-12 23:11:23 | 显示全部楼层
请问傻孩子__int_handler handler除了usart_int_handler还有什么啊?我应该在什么地方查呢?数据手册上好像没有写到哦, 那四个组里的中断应该在什么地方查呢?谢谢

出0入296汤圆

 楼主| 发表于 2009-10-13 23:01:18 | 显示全部楼层
这些handler应该是我们自己来写。四个组的中断信息在数据手册Peripherals里面
12.3 Interrupt Request Signal Map小节内。

出0入0汤圆

发表于 2009-10-14 20:45:53 | 显示全部楼层
谢谢傻孩子~

出0入0汤圆

发表于 2009-10-14 22:29:29 | 显示全部楼层
傻孩子 我改了14楼的程序但是编译器报错(IAR5.3KS)  

(原文件名:错误.jpg)

可以帮我看看是什么地方错了么?


#include"uc3b0256.h"
#include "compiler.h"
#include "gpio.h"
#include "intc.h"
#if __GNUC__
__attribute__((__interrupt__))
#elif __ICCAVR32__
__interrupt
#endif

void handle_key_interrupt(void)
{
U32 i;
U32 state = 0;
  //gpio_enable_pin_glitch_filter(AVR32_PIN_PA20);
  //gpio_set_gpio_pin(AVR32_PIN_PA25);
  //gpio_set_gpio_pin(AVR32_PIN_PA05);
  while (1)
  {
    switch (state)
    {
    case 0:
      // Access with GPIO driver gpio.c with clear and set access.
      gpio_clr_gpio_pin(AVR32_PIN_PA07);
      gpio_set_gpio_pin(AVR32_PIN_PA08);
      state++;
      break;
      default:
      gpio_clr_gpio_pin(AVR32_PIN_PA08);
      gpio_set_gpio_pin(AVR32_PIN_PA07);
      state = 0;
      break;
    }

    // Poll push button value.
    for (i = 0; i < 1000; i += 1)
    {
     i++;
    }
}
}
int main(void)
{
  //step1: init gpio
gpio_enable_pin_glitch_filter(AVR32_PIN_PA09);
//print(EXAMPLE_USART, ".: Using interrupts with the key :.\n\n");
// Disable all interrupts.
Disable_global_interrupt();
// Initialize interrupt vectors.
INTC_init_interrupts();
INTC_register_interrupt(&handle_key_interrupt, AVR32_GPIO_IRQ_1, AVR32_INTC_INT1);
//gpio_clear_pin_interrupt_flag(GPIO_PUSH_BUTTON_0);
//gpio_clear_pin_interrupt_flag(GPIO_PUSH_BUTTON_1);
// Enable GPIO interrupt.
gpio_enable_pin_interrupt(AVR32_PIN_PA09,0);
//gpio_enable_pin_interrupt(GPIO_PUSH_BUTTON_1,GPIO_PIN_CHANGE);

// Enable all interrupts.
Enable_global_interrupt();
}

出0入296汤圆

 楼主| 发表于 2009-10-15 10:22:17 | 显示全部楼层
少了一个汇编程序文件,exception.s90,在AVR32 Software Framework/Driver/INTC/目录下面有……

出0入0汤圆

发表于 2009-10-15 10:56:20 | 显示全部楼层
应该是exception.s82吧。可是我加入以后仍然报错。是不是我编译器没有设置好呢?

(原文件名:错误2.jpg)

出0入0汤圆

发表于 2010-6-24 19:17:00 | 显示全部楼层
楼主英明!UART0或UART1单串口中断接收调试成功!参考[应用实例]解决了我的串口接收大难题!

出0入0汤圆

发表于 2011-8-16 13:01:37 | 显示全部楼层
哈哈,真不错啊,果然是cool!!!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-8 04:50

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表