我如何仅使用寄存器在Arduino(SAM3x8E)上的C 中断
How do I make an external interrupt in c++ on arduino due (sam3x8e) using only the registers?
我试图在Arduino上创建NVIC中断。我需要按下按钮中的4个外部中断,并且使用NVIC中断以外的任何东西都遇到了麻烦。首先,我可以将PMC_PCER0用于所有4个中断吗?其次,我可以在同一端口上多次中断吗?我是否仅通过一个呼叫NVIC(PIOB_IRQN(启用所有中断?最后,是否有更好的方法和寄存器用于ARDUINO上的外部中断(SAM3X8E(。
void configure_ext_int_1(){
PMC->PMC_PCER0 |= 1 << ID_PIOB; // Enable Clock for PIOB - needed for sampling falling edge
PIOB->PIO_PER = PIO_PB27; // Enable IO pin control
PIOB->PIO_ODR = PIO_PB27;
PIOB->PIO_PUER = PIO_PB27; // Enable pull-up
PIOB->PIO_IFER = PIO_PB27; /
PIOB->PIO_DIFSR = PIO_PB27; // Select Debouncing filter
PIOB->PIO_SCDR = 0x4FF; // Set Debouncing clock divider
PIOB->PIO_AIMER = PIO_PB27;
PIOB->PIO_ESR = PIO_PB27;
PIOB->PIO_FELLSR = PIO_PB27;
PIOB->PIO_IER = PIO_PB27;
NVIC_EnableIRQ(PIOB_IRQn);
}
我选择使用可用于SAM3X8E的ASF函数。我不确定这是否会同时在所有4个端口上工作。
void enable_NVIC_interrupts(){
// PORT A NVIC
pmc_enable_periph_clk(ID_PIOA);
pio_set_input(PIOA, PIO_PA29, PIO_PULLUP;
pio_handler_set(PIOA, ID_PIOC, PIO_PA29, PIO_IT_EDGE, int_RINGMODULATOR);
pio_enable_interrupt(PIOA, PIO_PA29);
NVIC_EnableIRQ(PIOA_IRQn);
// PORT B NVIC
pmc_enable_periph_clk(ID_PIOB);
pio_set_input(PIOB, PIO_PB25, PIO_PULLUP;
pio_handler_set(PIOB, ID_PIOB, PIO_PB25, PIO_IT_EDGE, int_TREMOLO);
pio_enable_interrupt(PIOB, PIO_PB25);
NVIC_EnableIRQ(PIOB_IRQn);
// PORT C NVIC
pmc_enable_periph_clk(ID_PIOC);
pio_set_input(PIOC, PIO_PC22, PIO_PULLUP;
pio_handler_set(PIOC, ID_PIOC, PIO_PC22, PIO_IT_EDGE, int_DISTORTION);
pio_enable_interrupt(PIOC, PIO_PC22);
NVIC_EnableIRQ(PIOC_IRQn);
// PORT D NVIC
pmc_enable_periph_clk(ID_PIOD);
pio_set_input(PIOD, PIO_PD7, PIO_PULLUP;
pio_handler_set(PIOD, ID_PIOD, PIO_PD7, PIO_IT_EDGE, int_REVERB);
pio_enable_interrupt(PIOD, PIO_PD7);
NVIC_EnableIRQ(PIOD_IRQn);
相关文章:
- Linux的Cpp上的计时器
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 物理键盘上的触发器按键
- 如何加载(或映射)文件部分的最大大小,但适合在Windows上的RAM
- SSL上的`curl_easy_send`和`curl_asy_recv`:如何处理`CURLE_AGAIN`
- PowerPC ppc64le上的Gcc Woverloaded虚拟错误
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- 集合上的输出迭代器:assign和increment迭代器
- Cuda C++:设备上的Malloc类,并用来自主机的数据填充它
- 为什么我在leetcode上收到AddressSanitizer:地址0x602000000058上的堆缓冲区溢出错误
- 对于set上的循环-获取next元素迭代器
- 如何从棋盘上的箱号中找到行和列
- 为什么除非添加括号,否则构造函数上的模板替换会失败?
- if数组上的随机数
- 向量上的线性搜索
- 位阵列上的快速AND运算
- 无法将 GLFW 库与 Ubuntu 18.04 上的头文件链接
- 为什么一个向量上的多线程操作很慢
- 64位机器上的C++内存对齐
- 我如何仅使用寄存器在Arduino(SAM3x8E)上的C 中断