企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
[TOC] > # 说明 mcu的灵魂--中断,用周末的时间将它添加进去了,目前只有一个中断输入口,但是我们可以通过设置外部中断标志寄存器对其进行扩展,单个中断和多个中断在项目中我都给了例子。 处理器处理一条命令需要两个时钟,为了能响应中断信号只有一个高电平的最极限情况,mcu内部通过打两排,将中断信号扩展成两个时钟的高电平,这样以来,中断响应的时间大概在1 - 2.5个时钟之间,保证了中断一定会响应。 > # 特别注意 设计的中断,在写程序的时候,要让中断服务程序从`0x3ff`的地址作为其入口地址,这是因为,我写的脚本,也就是将编译后的机器编码转成存储在`rom`上的文件时,当检测到程序中使用了中断的时候,将会直接跳到`0x3ff`的地址搜索中断服务程序,并将中断服务程序的指令动态的拼接到前面非中断程序的后面。中断服务程序写法示例: ![](https://img.kancloud.cn/ba/c8/bac8b6cbb926cafc02b04b5ad42f30d8_896x539.png) > # 1位中断程序实例 ``` ;系统时钟为12MHz ;目标硬件为 小脚丫FPGA step-maxo2-c,这个型号是U盘模式,流文件会下载到mcu,每次上电由mcu配置FPGA constant var_a,00 ; 定义变量a,存储地址为 00 start: load s1,05 load s0,01 add s0,01 load s0,01 enable interrupt wait: add s1,01 jump wait ;循环等待 ;中断入口地址 -- 此处必须这样写,我写的脚本如果检测到你使能了中断会默认去这个地址找 ;找到后将地址动态连接到前面程序的地址后面 ADDRESS 3FF ISR: disable interrupt ;关闭中断响应,准备处理中断的事情 add s0,01 ;中断中让寄存器0数值加1 returni enable ``` > # 8通道中断程序 ``` ;系统时钟为12MHz ;目标硬件为 小脚丫FPGA step-maxo2-c,这个型号是U盘模式,流文件会下载到mcu,每次上电由mcu配置FPGA ;功能 : 对应中断来了,与其对应的寄存器值加1 constant var_a,00 ; 定义变量a,存储地址为 00 constant isr_port, ff; 定义用于区分中断的io地址 start: load s1,05 load s0,00 load s1,00 load s2,00 load s3,00 load s4,00 load s5,00 load s6,00 load s7,00 load sA,00 output sA,isr_port ; 初始化时所有中断标志清零 enable interrupt ;使能中断 wait: jump wait isr0: add s0,01 load sC,sB and sC,11111110'b ;' output sC,isr_port ;清除中断0的标志 return isr1: add s1,01 load sC,sB and sC,11111101'b ;' output sC,isr_port ;清除中断1的标志 return isr2: add s2,01 load sC,sB and sC,11111011'b ;' output sC,isr_port ;清除中断2的标志 return isr3: add s3,01 load sC,sB and sC,11110111'b ;' output sC,isr_port ;清除中断3的标志 return isr4: add s4,01 load sC,sB and sC,11101111'b ;' output sC,isr_port ;清除中断4的标志 return isr5: add s5,01 load sC,sB and sC,11011111'b ;' output sC,isr_port ;清除中断5的标志 return isr6: add s6,01 load sC,sB and sC,10111111'b ;' output sC,isr_port ;清除中断6的标志 return isr7: add s7,01 load sC,sB and sC,01111111'b ;' output sC,isr_port ;清除中断7的标志 return ;中断入口地址 -- 此处必须这样写,我写的脚本如果检测到你使能了中断会默认去这个地址找 ;找到后将地址动态连接到前面程序的地址后面 ADDRESS 3FF ISR: disable interrupt ;关闭中断响应,准备处理中断的事情 input sB,isr_port ;读取中断标志 load sC,sB and sC,00000001'b ;' compare sC,01 call z ,isr0 ;中断0来临 load sC,sB and sC,00000010'b ;' compare sC,00000010'b ;' call z ,isr1 ;中断1来临 load sC,sB and sC,00000100'b ;' compare sC,00000100'b ;' call z ,isr2 ;中断2来临 load sC,sB and sC,00001000'b ;' compare sC,00001000'b ;' call z ,isr3 ;中断3来临 load sC,sB and sC,00010000'b ;' compare sC,00010000'b ;' call z ,isr4 ;中断4来临 load sC,sB and sC,00100000'b ;' compare sC,00100000'b ;' call z ,isr5 ;中断5来临 load sC,sB and sC,01000000'b ;' compare sC,01000000'b ;' call z ,isr6 ;中断6来临 load sC,sB and sC,10000000'b ;' compare sC,10000000'b ;' call z ,isr7 ;中断7来临 returni enable ``` ![](https://img.kancloud.cn/a8/24/a824b17507ccfd8523d94fb05d97414c_1133x702.png)