作者
QQ群:852283276
微信:arm80x86
微信公众号:青儿创客基地
B站:主页 https://space.bilibili.com/208826118
STC从STC8A8K64D4单片机开始才有DMA,STC8A4K64S2A12就没有DMA。为什么要用DMA?项目里单片机需要串口通信,通信数据量很大,不采用DMA,导致CPU被串口通信占用,无法实时控制IO,所以需要用DMA来控制串口,这样CPU读取和输出IO可以做到1ms以内,满足实时性的要求。
参考
使用
主要是处理中断问题,默认keil的编译器,不支持超过32的中断号,所以,DMA的中断需要使用特殊方法来实现,一个是打补丁,一个是自建汇编文件处理中断,这里还有多种方法,我选用占用未使用中断号的地址空间来处理DMA中断,比如,0~31号中断中,第13号是保留中断号(或者未使用的中断,如INT0),我们可以借用此中断号,新建一个汇编语言文件,比如isr.asm
,加入到项目,并在地址0103H
的地方添加一条LJMP 006BH
,官方提供的ism文件,最后面那句LJMP 006BH
就是为interrupt 13
服务的,如果是interrupt 0
,则是LJMP 0003H
,
CSEG AT 012BH ;P0INT_VECTOR
JMP P0INT_ISR
CSEG AT 0133H ;P1INT_VECTOR
JMP P1INT_ISR
CSEG AT 013BH ;P2INT_VECTOR
JMP P2INT_ISR
CSEG AT 0143H ;P3INT_VECTOR
JMP P3INT_ISR
CSEG AT 014BH ;P4INT_VECTOR
JMP P4INT_ISR
CSEG AT 0153H ;P5INT_VECTOR
JMP P5INT_ISR
CSEG AT 015BH ;P6INT_VECTOR
JMP P6INT_ISR
CSEG AT 0163H ;P7INT_VECTOR
JMP P7INT_ISR
CSEG AT 016BH ;P8INT_VECTOR
JMP P8INT_ISR
CSEG AT 0173H ;P9INT_VECTOR
JMP P9INT_ISR
CSEG AT 017BH ;M2MBMM_VECTOR
JMP M2MBMM_ISR
CSEG AT 0183H ;ADCBMM_VECTOR
JMP ADCBMM_ISR
CSEG AT 018BH ;SPIBMM_VECTOR
JMP SPIBMM_ISR
CSEG AT 0193H ;U1TXBMM_VECTOR
JMP U1TXBMM_ISR
CSEG AT 019BH ;U1RXBMM_VECTOR
JMP U1RXBMM_ISR
CSEG AT 01A3H ;U2TXBMM_VECTOR
JMP U2TXBMM_ISR
CSEG AT 01ABH ;U2RXBMM_VECTOR
JMP U2RXBMM_ISR
CSEG AT 01B3H ;U3TXBMM_VECTOR
JMP U3TXBMM_ISR
CSEG AT 01BBH ;U3RXBMM_VECTOR
JMP U3RXBMM_ISR
CSEG AT 01C3H ;U4TXBMM_VECTOR
JMP U4TXBMM_ISR
CSEG AT 01CBH ;U4RXBMM_VECTOR
JMP U4RXBMM_ISR
CSEG AT 01D3H ;LCMBMM_VECTOR
JMP LCMBMM_ISR
CSEG AT 01DBH ;LCMIF_VECTOR
JMP LCMIF_ISR
P0INT_ISR:
P1INT_ISR:
P2INT_ISR:
P3INT_ISR:
P4INT_ISR:
P5INT_ISR:
P6INT_ISR:
P7INT_ISR:
P8INT_ISR:
P9INT_ISR:
M2MBMM_ISR:
ADCBMM_ISR:
SPIBMM_ISR:
U1TXBMM_ISR:
U1RXBMM_ISR:
U2TXBMM_ISR:
U2RXBMM_ISR:
U3TXBMM_ISR:
U3RXBMM_ISR:
U4TXBMM_ISR:
U4RXBMM_ISR:
LCMBMM_ISR:
LCMIF_ISR:
JMP 006BH
END