m0_57531254 2021-10-16 21:30 采纳率: 18.8%
浏览 84
已结题

定时器定时一秒后,进入中断服务函数,通过SCI串口通信发送外部中断Xint1Count的次数到上位机,不知上位机不能正确显示次数值?

volatile Uint32 Xint1Count;//全局定义中断计数值

void jianxieWAIBU_Init(void)
{
    EALLOW;
    SysCtrlRegs.PCLKCR3.bit.GPIOINENCLK = 1;    // GPIO input clock
    EDIS;

    EALLOW;
    //KEY端口配置
    GpioCtrlRegs.GPAMUX1.bit.GPIO12=0;
    GpioCtrlRegs.GPADIR.bit.GPIO12=0;
    GpioCtrlRegs.GPAPUD.bit.GPIO12=0;
    GpioCtrlRegs.GPAQSEL1.bit.GPIO12 = 0;        // 外部中断1(XINT1)与系统时钟SYSCLKOUT同步
    EDIS;

    EALLOW;
    GpioIntRegs.GPIOXINT1SEL.bit.GPIOSEL = 12;   // XINT1是GPIO12
    EDIS;

    EALLOW;    // 修改被保护的寄存器,修改前应添加EALLOW语句
    PieVectTable.XINT1 = &EXTI1_jianxie;
    EDIS;   // EDIS的意思是不允许修改被保护的寄存器
    Xint1Count = 0;//为计数器赋初值
    PieCtrlRegs.PIECTRL.bit.ENPIE = 1;
    PieCtrlRegs.PIEIER1.bit.INTx4 = 1;          // 使能PIE组1的INT4

    XIntruptRegs.XINT1CR.bit.POLARITY = 1;      // 上降沿触发中断
    XIntruptRegs.XINT1CR.bit.ENABLE= 1;        // 使能XINT1

    IER |= M_INT1;                              // 使能CPU中断1(INT1)
    EINT;                                       // 开全局中断
    ERTM;
}

interrupt void EXTI1_jianxie(void)
{
    Xint1Count++;
    PieCtrlRegs.PIEACK.bit.ACK1=1;
}

void jianxieTIM0_Init(float Freq, float Period,Uint32 baud)
{
    EALLOW;
    SysCtrlRegs.PCLKCR3.bit.CPUTIMER0ENCLK = 1; // CPU Timer 0
    EDIS;
    //指向定时器0的寄存器地址
    CpuTimer0.RegsAddr = &CpuTimer0Regs;
    //设置定时器0的周期寄存器值
    CpuTimer0Regs.PRD.all  = 0xFFFFFFFF;
    //设置定时器预定标计数器值为0
    CpuTimer0Regs.TPR.all  = 0;
    CpuTimer0Regs.TPRH.all = 0;
    //确保定时器0为停止状态
    CpuTimer0Regs.TCR.bit.TSS = 1;
    //重载使能
    CpuTimer0Regs.TCR.bit.TRB = 1;
    // Reset interrupt counters:
    CpuTimer0.InterruptCount = 0;

    ConfigCpuTimer(&CpuTimer0, Freq, Period);

    EALLOW;
    PieVectTable.TINT0 = &TIM0_jianxie;
    EDIS;
    //开始定时器功能
    CpuTimer0Regs.TCR.bit.TSS=0;
    //开启CPU第一组中断并使能第一组中断的第7个小中断,即定时器0
    PieCtrlRegs.PIEIER1.bit.INTx7 = 1;
    IER |= M_INT1;
    //使能总中断
    EINT;
    ERTM;

        unsigned char scihbaud=0;
        unsigned char scilbaud=0;
        Uint16 scibaud=0;

        scibaud=37500000/(8*baud)-1;
        scihbaud=scibaud>>8;
        scilbaud=scibaud&0xff;


        EALLOW;
        SysCtrlRegs.PCLKCR0.bit.SCIAENCLK = 1;   // SCI-A
        EDIS;

        InitSciaGpio();

        //Initalize the SCI FIFO
        SciaRegs.SCIFFTX.all=0xE040;
        SciaRegs.SCIFFRX.all=0x204f;
        SciaRegs.SCIFFCT.all=0x0;

        // Note: Clocks were turned on to the SCIA peripheral
        // in the InitSysCtrl() function
        SciaRegs.SCICCR.all =0x0007;   // 1 stop bit,  No loopback
                                       // No parity,8 char bits,
                                       // async mode, idle-line protocol
        SciaRegs.SCICTL1.all =0x0003;  // enable TX, RX, internal SCICLK,
                                       // Disable RX ERR, SLEEP, TXWAKE
        SciaRegs.SCICTL2.all =0x0003;
        SciaRegs.SCICTL2.bit.TXINTENA =1;
        SciaRegs.SCICTL2.bit.RXBKINTENA =1;
        SciaRegs.SCIHBAUD    =scihbaud;  // 9600 baud @LSPCLK = 37.5MHz.
        SciaRegs.SCILBAUD    =scilbaud;
        //    SciaRegs.SCICCR.bit.LOOPBKENA =1; // Enable loop back
        SciaRegs.SCICTL1.all =0x0023;     // Relinquish SCI from Reset

}

// Transmit a character from the SCI'
void jianxie_SendByte(int a)
{
    while (SciaRegs.SCIFFTX.bit.TXFFST != 0);
    SciaRegs.SCITXBUF=a;
}

void jianxie_SendString(char *cishu)
{
    int i=0;

    while(cishu[i] != '\0')
    {
        jianxie_SendByte(cishu[i]);
        i++;
    }
}

interrupt void TIM0_jianxie(void)
{
    EALLOW;
    LED4_TOGGLE;
//    jianxie_SendString(Xint1Count);

    jianxie_SendByte(Xint1Count);
    PieCtrlRegs.PIEACK.bit.ACK1=1;
    EDIS;
}


次数值已经超过255了,但是上位机只能显示两位

  • 写回答

1条回答 默认 最新

  • 胸毛男 2021-10-17 23:42
    关注

    jianxie_SendByte 参数是 int 它会把整数 当成ASCII码发送到上位机 需要转化成char字符
    比如你发 1,它被解读成 SOH 串口助手接到的是乱码 你需要发0x31 它会被解析成 '1';

    你在空白处添加个函数,这个函数要在 TIM0_jianxie函数,上边

    void itoa_mf(int num,char str[])
    {
        int sign = num;
        int i = 0;
        int j = 0;
        char temp[100];
        //如果是负数就去掉符号,将-1234转成1234
        if(sign < 0)
        {
            num = -num;
        }
        //转成字符串,1234转成"4321"
        do
        {
            temp[i] = num % 10 + '0';
            num /= 10;
            i++;
        }while(num > 0);
        //如果是负数的话,加个符号在末尾,如:"4321-"
        if(sign < 0)
        {
            temp[i++] = '-';
        }
        temp[i] = '\0';
        i--;
        //将temp数组中逆序输入到str数组中
        //将"4321-" ====> "-1234"
        while(i >= 0)
        {
            str[j] = temp[i];
            j++;
            i--;
        }
        //字符串结束标识
        str[j] = '\0';
    }
    
    

    这个函数改一下

    interrupt void TIM0_jianxie(void)
    {
        EALLOW;
        LED4_TOGGLE;
        char sstring[16] = {0};
        itoa_mf(Xint1Count,sstring);
        jianxie_SendString(sstring);
     
        PieCtrlRegs.PIEACK.bit.ACK1=1;
        EDIS;
    }
    
    

    应该可以收到数字了

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 10月26日
  • 已采纳回答 10月18日
  • 创建了问题 10月16日

悬赏问题

  • ¥60 不懂得怎么运行下载来的代码
  • ¥15 CST导出3D模型图为什么和软件显示不一样?
  • ¥15 加热反应炉PLC控制系统设计(相关搜索:梯形图)
  • ¥15 python 用Dorc包报错,我的写法和网上教的是一样的但是它显示无效参数,是什么问题
  • ¥15 经过滑动平均后的一维信号还原用什么结构好呢?
  • ¥15 指定IP电脑的访问设置
  • ¥30 matlab ode45 未发现警告,但是运行出错
  • ¥15 为什么devc++编译项目会失败啊
  • ¥15 vscode platformio
  • ¥15 代写uni代码,app唤醒