Arduino Due是如何进入串口中断的呢?
今天在移植Arduino的时候,一直不明白Due是如何进入串口中断的。Due是在串口中断中接收字符,并将其存储。有下面的代码:void USARTClass::IrqHandler( void )
{
uint32_t status = _pUsart->US_CSR;
// Did we receive data ?
if ((status & US_CSR_RXRDY) == US_CSR_RXRDY)
_rx_buffer->store_char( _pUsart->US_RHR ) ;
// Acknowledge errors
if ((status & US_CSR_OVRE) == US_CSR_OVRE ||
(status & US_CSR_FRAME) == US_CSR_FRAME)
{
// TODO: error reporting outside ISR
_pUsart->US_CR |= US_CR_RSTSTA;
}
}
这个代码到时不难,能看懂,但是不知道这个中断是如何进入的。
希望了解的能够给点提示。
哈哈哈,问题应经找到:
// IT handlers
void USART0_Handler(void)
{
Serial1.IrqHandler();
}
void USART1_Handler(void)
{
Serial2.IrqHandler();
}
void USART3_Handler(void)
{
Serial3.IrqHandler();
}
但是不明白的是,在启动代码中,写的那些中断处理函数,能不能调用C++的函数呢? 噗。。你这自问自答解决的还蛮快的。。哈。。。
可以c调c++,得注意两点:
(1)中断函数单独做成xxx.c文件,并重命名为xxx.cpp,让编译器用C++的方式进行编译,从而include C++ 的头文件不会报错。
(2)加 extern "C" 功能,告诉编译器不对根据形参类型重新命令函数名,使之与C函数名一致。
extern "C"{
// IT handlers
void USART0_Handler(void)
{
Serial1.IrqHandler();
}
void USART1_Handler(void)
{
Serial2.IrqHandler();
}
void USART3_Handler(void)
{
Serial3.IrqHandler();
}
}
STM32中断向量在START.S中可以查到,在工程中搜索对应的中断函数就可以查到代码了。 奔跑小蜗牛 发表于 2014-12-16 14:18
噗。。你这自问自答解决的还蛮快的。。哈。。。
可以c调c++,得注意两点:
(1)中断函数单独做成xxx.c文件 ...
不明白的地方就在这里,之前都是C++调用C,这次是C调用C++,感觉有点奇葩。在汇编的启动文件中,那些函数是C的还是C++的呢?我觉得是C的。。。 #include "mbed.h"
DigitalOut led1(LED1);
DigitalOut led2(LED2);
Serial pc(USBTX, USBRX);
void callback() {
// Note: you need to actually read from the serial to clear the RX interrupt
printf("%c\n", pc.getc());
led2 = !led2;
}
int main() {
pc.attach(&callback);
while (1) {
led1 = !led1;
wait(0.5);
}
}
看这个例子,这是一个串口中断的,主函数使能中断 pc.attach(&callback);
callback就是中断服务函数,这是直接调用mbed API操作。 pc.getc()可以直接截取接收到的内容十分方便,建议去看看mbed 的库函数! STM32可以用C语言,C++是C的超级,肯定可以用,兼容性等待你去探索了:D 启动代码是汇编的
例如Default_Handler PROC
EXPORTWWDG_IRQHandler //这一句就是连接到了外部你编写的函数名了 小贾-370388 发表于 2014-12-16 22:18
启动代码是汇编的
例如Default_Handler PROC
这个外部函数是C语言的还是C++得呢?
页:
[1]