- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我遇到了一些麻烦,我不知道这是我对 Atmel 语法、Atmel Studio 6.0 还是程序本身的理解。我似乎无法让中断处理程序接收一个简单的字符串然后做一些事情。当 USART 接收到一个字符时,它会打开 LED,然后如果它接收到不同的字符,它会关闭 LED,我成功地实现了一个单个字符打开 LED。顺便说一句,我有一个设计板,该程序在进入接收子例程时遇到了一些麻烦,因为主程序中的发送代码太大了,所以有人建议我利用中断来解决这个问题。顺便说一下,我正在 EVK1100 AVR32 板 MCU:AT32UC3A0512-U 上试用这个程序,不确定你们之前是否玩过这些,但它们非常棒。虽然不确定我喜欢 Atmel 语法。无论如何,您可以看到在接收部分开始工作之前,我目前在主体中什么也没做。
我对 Atmel 世界的中断还很陌生。
任何帮助将不胜感激。我对内置的 ASF USART 中断“INTC”项目示例进行了一些修改。
谢谢,
#include <string.h>
#include <avr32/io.h>
#include "compiler.h"
#include "board.h"
#include "print_funcs.h"
#include "intc.h"
#if defined (__GNUC__)
# if defined (__AVR32_AP7000__)
# include "pm_at32ap7000.h"
# else
# include "power_clocks_lib.h"
# endif
#elif defined (__ICCAVR32__) || defined (__AAVR32__)
# if defined (__AT32AP7000__)
# include "pm_at32ap7000.h"
# else
# include "power_clocks_lib.h"
# endif
#endif
#include "gpio.h"
#include "usart.h"
//#include "conf_example.h"
# define EXAMPLE_TARGET_PBACLK_FREQ_HZ FOSC0 // PBA clock target frequency, in Hz
#if BOARD == EVK1100
# 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_USART_IRQ AVR32_USART1_IRQ
# define EXAMPLE_USART_BAUDRATE 57600
#endif
/**
* \brief The USART interrupt handler.
*
* \note The `__attribute__((__interrupt__))' (under GNU GCC for AVR32) and
* `__interrupt' (under IAR Embedded Workbench for Atmel AVR32) C function
* attributes are used to manage the `rete' instruction.
*/
#if defined (__GNUC__)
__attribute__((__interrupt__))
#elif defined(__ICCAVR32__)
__interrupt
#endif
static void usart_int_handler(void)
{
static char Cmnd[30];
int index = 0;
int c;
usart_read_char(EXAMPLE_USART, &c);
Cmnd[index++] = c;
if (c = '\r')
{
Cmnd[index] = '\0';
usart_write_line(EXAMPLE_USART, Cmnd);
}
}
/**
* \brief The main function.
*
* It sets up the USART module on EXAMPLE_USART. The terminal settings are 57600
* 8N1.
* Then it sets up the interrupt handler and waits for a USART interrupt to
* trigger.
*/
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 = 57600,
.charlength = 8,
.paritytype = USART_NO_PARITY,
.stopbits = USART_1_STOPBIT,
.channelmode = USART_NORMAL_CHMODE
};
#if BOARD == EVK1100 || BOARD == EVK1101 || BOARD == UC3C_EK \
|| BOARD == EVK1104 || BOARD == EVK1105 || BOARD == STK600_RCUC3L0 \
|| BOARD == STK600_RCUC3D
/*
* Configure Osc0 in crystal mode (i.e. use of an external crystal
* source, with frequency FOSC0) with an appropriate startup time then
* switch the main clock source to Osc0.
*/
pcl_switch_to_osc(PCL_OSC0, FOSC0, OSC0_STARTUP);
#elif BOARD == STK1000
pm_reset();
#elif BOARD == UC3L_EK
/*
* Note: on the AT32UC3L-EK board, there is no crystal/external clock
* connected to the OSC0 pinout XIN0/XOUT0. We shall then program the
* DFLL and switch the main clock source to the DFLL.
*/
pcl_configure_clocks(&pcl_dfll_freq_param);
/*
* Note: since it is dynamically computing the appropriate field values
* of the configuration registers from the parameters structure, this
* function is not optimal in terms of code size. For a code size
* optimal solution, it is better to create a new function from
* pcl_configure_clocks_dfll0() and modify it to use preprocessor
* computation from pre-defined target frequencies.
*/
#end if
// Assign GPIO to USART.
gpio_enable_module(USART_GPIO_MAP,
sizeof(USART_GPIO_MAP) / sizeof(USART_GPIO_MAP[0]));
// Initialize USART in RS232 mode.
usart_init_rs232(EXAMPLE_USART, &USART_OPTIONS,
EXAMPLE_TARGET_PBACLK_FREQ_HZ);
print(EXAMPLE_USART, ".: Using interrupts with the USART :.\r\n\r\n");
// Disable all interrupts.
Disable_global_interrupt();
// Initialize interrupt vectors.
INTC_init_interrupts();
/*
* Register the USART interrupt handler to the interrupt controller.
* usart_int_handler is the interrupt handler to register.
* EXAMPLE_USART_IRQ is the IRQ of the interrupt handler to register.
* AVR32_INTC_INT0 is the interrupt priority level to assign to the
* group of this IRQ.
*/
INTC_register_interrupt(&usart_int_handler, EXAMPLE_USART_IRQ, AVR32_INTC_INT0);
// Enable USART Rx interrupt.
EXAMPLE_USART->ier = AVR32_USART_IER_RXRDY_MASK;
print(EXAMPLE_USART, "Type a character to use the interrupt handler."
"\r\nIt will show up on your screen.\r\n\r\n");
// Enable all interrupts.
Enable_global_interrupt();
/**
* We have nothing left to do in the main, so we may switch to a device
* sleep mode: we just need to be sure that the USART module will be
* still be active in the chosen sleep mode. The sleep mode to use is
* the FROZEN sleep mode: in this mode the PB clocks are still active
* (so the USART module which is on the Peripheral Bus will still be
* active while the CPU and HSB will be stopped).
* --
* Modules communicating with external circuits should normally be
* disabled before entering a sleep mode that will stop the module
* operation: this is not the case for the FROZEN sleep mode.
* --
* When the USART interrupt occurs, this will wake the CPU up which will
* then execute the interrupt handler code then come back to the
* while(1) loop below to execute the sleep instruction again.
*/
while(1)
{
/*
* If there is a chance that any PB write operations are
* incomplete, the CPU should perform a read operation from any
* register on the PB bus before executing the sleep
* instruction.
*/
AVR32_INTC.ipr[0]; // Dummy read
/*
* When the device wakes up due to an interrupt, once the
* interrupt has been serviced, go back into FROZEN sleep mode.
*/
}
}
最佳答案
尽量让您的中断处理程序简短。中断处理程序或 ISR 通常在禁用中断的情况下执行。他们的目标是进入,做点什么,然后迅速离开。如果您有其他中断正在运行(例如实时时钟),当您在 ISR 中时它们会被阻止,这可能会导致中断丢失等问题。
这里最好的做法是将输入缓冲区声明为全局静态。还定义一个 static uchar_t have_line
或类似的,并在 ISR 中保存每个字符,直到缓冲区已满(一项重要的检查!),或者您收到一个 CR (\r)。还要检查换行符 (\n)。保存零以空终止缓冲区,然后设置 have_line = 1
。
在您的主循环中,等待have_line
为非零,然后处理输入缓冲区中的内容。最后,将 have_line 设置回零。
这样,您的 ISR 就会简短且相当可靠。
在您的示例代码中,usart_write_line
函数是否需要启用中断?
糟糕!抱歉,我刚刚注意到您的索引不是静态变量。这意味着每次调用例程时它都会被初始化为零。在 int index 前面添加一个静态声明符,应该可以解决问题。
关于c - AVR32 UC3A0 如何利用 USART 中断示例并接收字符串然后做一些事情,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15691293/
我在通过 USART 接收数据时遇到了一些麻烦。我真正想要实现的是,我可以通过 USART 接收没有特定长度(只有最大可能长度)的命令。所以我使用中断例程来检查接收到的每个字符,但不知何故我仍然无法实
我有一个问题,我必须用 USART 按下我电脑上的键来控制 ATMEGA 1280 的 PWM。我可以使用 ASCII 键和控制 PWM 来控制它。问题是他们要求使用箭头键,现在问题是箭头键没有 AS
我目前正在开展一个项目,我们必须使用 AVR ATMEGA328 微 Controller (特别是 USART 外设)来控制 8 个 LED。我们必须向微 Controller 发送命令,以不同的速
我正在使用具有 16kb 闪存和 1kb Sram 的 AVR Controller atmega16。我已将数据存储在静态数组中,即 static char raw_data[15361]; 并尝试
我试图在同一个全局数组上发送 2 个不同的字符串,并通过 UART 传输 DMA,作为我的终端日志。然而,发生的情况是它发送了第一个字符串,无论我尝试什么(重新初始化整个 DMA 和 UART),它都
我有一个使用 tx 中断传输数据的 USART 类。现在我想创建一个使用 DMA 传输数据的变体。你想要什么: 使用继承来创建两个 USART 子类,例如ISRUSART 和 DMAUSART? 或
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 5 年前。 Improve this qu
我正在为 ARM Cortex M3 编程。我有在 USART 端口上运行的标准输出功能。我应该如何在我的 Windows 7 计算机上监控我的开发板通过 USART 发送的数据?我应该使用标准的“U
我正在尝试将 HC-05 与我的 STM32F3 DISCOVERY 结合使用,但我无法让 USART 正常工作。 无论我手动从 HC-05 读取数据还是使用中断,它都不起作用。 我尝试在 ardui
在 STM32F2 上使用两个以 115200 波特运行的 USART,一个用于与 radio 模块通信,一个用于从 PC 进行串行通信。时钟速度为 120MHz。 当同时从两个 USART 接收数据
我正在为内置 PIC18F25K80 的板编写一些库。现在我正在尝试对 UART 库进行编程,并且我已经尝试了所有方法,但在发送字符串时我无法使其工作。 我正在使用 XC8 编译器,并且库中有以下代码
我的 USART 正在从“黑匣子”接收一个字符串,该字符串包含两个 double 值和几个十六进制值。该字符串放置在我的缓冲区 rbuf.buf 中,总大小为 32 个字符。通常我会收到 19 个字符
使用下面的测试代码,我尝试使用 中的 simulator 通过 xmega128a3u 的 USART 发送数据Atmel Studio. 观察 I/O 查看数据寄存器从未设置,即使我正在设置它。是我
您好,我目前正在研究 USART 通信,试图从任何 GPIO 引脚传输和接收数据。 我成功地以任何波特率传输数据,但在接收时卡住了。 我一次能收到一个角色。引脚设置为使用 RX 引脚的外部下降沿中断。
我正在尝试使用 USART 通信接收和发送数据,我使用的是 atmega16。我在 PC 中创建了一个程序来将字符串发送到 micro,如果字符串匹配,micro 将激活 adc 并将 adc 数据发
我在尝试读取完整的字符串时遇到了一些问题和奇怪的行为。我正在使用配备 atxmega32a4u 的自制演示板,基本上我想做的是通过串行通信设置一个参数(输出电压设定点),而 MCU 做他的事情(控制降
这是我在 stm8l 中使用 usart 的代码。我面临的主要问题是,无论我为 USART_DR 寄存器分配什么值,它始终采用值 0xff 而不会随着我增加 char 变量而改变。只有 USART_S
我正在研究一个名为 TSL2301 的线扫描 ccd 传感器。我想通过 stm32f103 的 USART 读取像素,但我总是只能收到 0xFF,有人使用这个传感器来帮助我吗?我使用了 STM32f1
我使用带有 AVR Studio 5 的 EVK1105 开发板作为我的 AVR 项目的开发 IDE。我在其中使用 FreeRTOS。我在这个板上有 3 个 USART 端口。一个外部模块通过 USA
我是在 Atmel studio 环境中开发嵌入式系统的新手,我使用 Atxmega128a1 和 32MHz 系统时钟。我试图在每次定时器中断溢出(0.05s)时通过RS232模块向PC发送一些字符
我是一名优秀的程序员,十分优秀!