SCI中断方式
阅读原文时间:2021年04月20日阅读:1
  1. //===========================================================================   

  2. //   

  3. // 文件名称:    SCI_interrupt.c   

  4. //   

  5. // 功能描述:   DSP28 SCI - 同计算机通信,采用超级中断接受数据   

  6. //             间隔2秒DSP向计算机发送字符"2812-UART is fine !"   

  7. // SCI配置 :   波特率 9600 ,数据长度 8 Bit , 无极性 , 1位停止位   

  8. //             TX缓冲空触发SCI-TX INT 中断   

  9. //             CPU CORE 定时器0中断出发第一次传输   

  10. //===========================================================================   

  11. #include "DSP281x_Device.h"   

  12. // 使用的函数原型声明   

  13. void Gpio_select(void);   

  14. void InitSystem(void);     

  15. void SCI_Init(void);     

  16. interrupt void cpu_timer0_isr(void);     

  17. interrupt void SCI_TX_isr(void);    

  18. // 全局变量   

  19. char message[]={"The F2812-UART is fine !/n/r"};   

  20. int index =0;           // 字符串指针   

  21. void main(void)   

  22. {   

  23.     InitSystem();       // 初始化DSP内核寄存器   

  24.     Gpio_select();      // 配置GPIO复用功能寄存器   

  25.     InitPieCtrl();      // 调用外设中断扩展初始化单元 PIE-unit ( 代码 : DSP281x_PieCtrl.c)   

  26.     InitPieVectTable(); // 初始化 PIE vector向量表  ( 代码 : DSP281x_PieVect.c )   

  27.     // 重新映射 PIE -  Timer 0的中断   

  28.     EALLOW;  // 解除寄存器保护   

  29.     PieVectTable.TINT0 = &cpu_timer0_isr;   

  30.     EDIS;    // 使能寄存器保护   

  31.     InitCpuTimers();   

  32.     // 配置 CPU-Timer 0 周期50 ms:   

  33.     // 150MHz CPU 频率, 50000 微妙中断周期   

  34.     ConfigCpuTimer(&CpuTimer0, 150, 50000);   

  35.     // 使能PIE内的 TINT0 : Group 1 interrupt 7   

  36.     PieCtrlRegs.PIEIER1.bit.INTx7 = 1;   

  37.     // 使能 CPU INT1 (连接到CPU-Timer 0中断)   

  38.     IER = 1;   

  39.     EALLOW; // 解除寄存器保护   

  40.     PieVectTable.TXAINT = &SCI_TX_isr;   

  41.     EDIS;       // 使能寄存器保护   

  42.     // 使能PIE内的 SCI_A_TX_INT中断   

  43.     PieCtrlRegs.PIEIER9.bit.INTx2 = 1;   

  44.     // 使能 CPU INT 9   

  45.     IER |= 0x100;          

  46.     // 全局中断使能和更高优先级的实时调试事件   

  47.     EINT;   // 全局中断使能INTM   

  48.     ERTM;   // 使能实时调试中断DBGM   

  49.     CpuTimer0Regs.TCR.bit.TSS = 0;  // 启动定时器0   

  50.     SCI_Init();   

  51.     while(1)   

  52.     {       

  53.         while(CpuTimer0.InterruptCount < 40)  // 等待50ms * 40   

  54.         {    

  55.         EALLOW;   

  56.         SysCtrlRegs.WDKEY = 0xAA;       // 看门狗控制   

  57.         EDIS;   

  58.         }        

  59.         CpuTimer0.InterruptCount = 0;   // 复位计数器   

  60.         index = 0;   

  61.         SciaRegs.SCITXBUF= message[index++];    

  62.     }   

  63. }      

  64. void Gpio_select(void)   

  65. {   

  66.     EALLOW;   

  67.     GpioMuxRegs.GPAMUX.all = 0x0;   // 所有 GPIO 端口配置为I/O   

  68.     GpioMuxRegs.GPBMUX.all = 0x0;      

  69.     GpioMuxRegs.GPDMUX.all = 0x0;   

  70.     GpioMuxRegs.GPFMUX.all = 0x0;           

  71.     GpioMuxRegs.GPFMUX.bit.SCIRXDA_GPIOF5 = 1; //配置  SCI-RX   

  72.     GpioMuxRegs.GPFMUX.bit.SCITXDA_GPIOF4 = 1; //配置  SCI-TX   

  73.     GpioMuxRegs.GPEMUX.all = 0x0;    

  74.     GpioMuxRegs.GPGMUX.all = 0x0;              

  75.     GpioMuxRegs.GPADIR.all = 0x0;     // GPIO PORT 配置为输入   

  76.     GpioMuxRegs.GPBDIR.all = 0x00FF;  // GPIO Port B15-B8  配置为输入 , B7-B0  配置为输出   

  77.     GpioMuxRegs.GPDDIR.all = 0x0;     // GPIO PORT   配置为输入   

  78.     GpioMuxRegs.GPEDIR.all = 0x0;     // GPIO PORT   配置为输入   

  79.     GpioMuxRegs.GPFDIR.all = 0x0;     // GPIO PORT   配置为输入   

  80.     GpioMuxRegs.GPGDIR.all = 0x0;     // GPIO PORT   配置为输入   

  81.     GpioMuxRegs.GPAQUAL.all = 0x0;    // 设置所有 GPIO 输入的量化值等于0   

  82.     GpioMuxRegs.GPBQUAL.all = 0x0;   

  83.     GpioMuxRegs.GPDQUAL.all = 0x0;   

  84.     GpioMuxRegs.GPEQUAL.all = 0x0;   

  85.     EDIS;   

  86. }        

  87. void InitSystem(void)   

  88. {   

  89.     EALLOW;   

  90.     SysCtrlRegs.WDCR= 0x00AF;       // 配置看门狗   

  91.                                     // 0x00E8  禁止看门狗,预定标系数Prescaler = 1   

  92.                                     // 0x00AF  不禁止看门狗, 预定标系数Prescaler = 64   

  93.     SysCtrlRegs.SCSR = 0;           // 看门狗产生复位   

  94.     SysCtrlRegs.PLLCR.bit.DIV = 10; // 配置处理器锁相环,倍频系数为5   

  95.     SysCtrlRegs.HISPCP.all = 0x1;   // 配置高速外设时钟分频系数: 2   

  96.     SysCtrlRegs.LOSPCP.all = 0x2;   // 配置低速外设时钟分频系数: 4   

  97.     // 使用的外设时钟时钟设置:   

  98.     // 一般不使用的外设的时钟禁止,降低系统功耗   

  99.     SysCtrlRegs.PCLKCR.bit.EVAENCLK=0;   

  100.     SysCtrlRegs.PCLKCR.bit.EVBENCLK=0;   

  101.     SysCtrlRegs.PCLKCR.bit.SCIAENCLK=1; // 使能SCI模块的时钟   

  102.     SysCtrlRegs.PCLKCR.bit.SCIBENCLK=0;   

  103.     SysCtrlRegs.PCLKCR.bit.MCBSPENCLK=0;   

  104.     SysCtrlRegs.PCLKCR.bit.SPIENCLK=0;   

  105.     SysCtrlRegs.PCLKCR.bit.ECANENCLK=0;   

  106.     SysCtrlRegs.PCLKCR.bit.ADCENCLK=0;   

  107.     EDIS;   

  108. }   

  109. void SCI_Init(void)   

  110. {   

  111.     SciaRegs.SCICCR.all =0x0007;    // 1bit 停止位    无循环模式   

  112.                                     // 无极性,       字符长度:8 bits,   

  113.                                     // 异步模式,     空闲线协议   

  114.     SciaRegs.SCICTL1.all =0x0003;   // 使能 TX, RX, 内部 SCICLK,   

  115.                                     // 禁止 RX ERR, SLEEP, TXWAKE   

  116.     SciaRegs.SCIHBAUD = 487 >> 8 ;  // 波特率:9600(LSPCLK = 37.5MHz) ;   

  117.     SciaRegs.SCILBAUD = 487 & 0x00FF;   

  118.     SciaRegs.SCICTL2.bit.TXINTENA = 1;  // 使能SCI发送中断   

  119.     SciaRegs.SCICTL1.all =0x0023;       // 使SCI退出复位   

  120. }     

  121. interrupt void cpu_timer0_isr(void)   

  122. {   

  123.     CpuTimer0.InterruptCount++;   

  124.     // 每个定时器中断清除一次看门狗计数器   

  125.     EALLOW;   

  126.     SysCtrlRegs.WDKEY = 0x55;       // 看门狗控制   

  127.     EDIS;   

  128.    // 响应中断并允许系统接收更多的中断   

  129.    PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;   

  130. }                

  131. //===========================================================================   

  132. // SCI_A 发送中断服务程序   

  133. // 发送字符串 message[]   

  134. //===========================================================================   

  135. interrupt void SCI_TX_isr(void)   

  136. {   

  137.     if (index < 26) SciaRegs.SCITXBUF=message[index++];   

  138.     // 重新初始化PIE为下一次 SCI-A TX准备接收下一次中断   

  139.     PieCtrlRegs.PIEACK.all = 0x0100;   //响应中断   

  140. }   

  141. //===========================================================================   

  142. // 代码结束.   

  143. //===========================================================================

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章