打印
[Kinetis]

请帮忙看下关于LPTMR中断代码

[复制链接]
2681|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
各位好!本人在KL02下调试LCD显示屏,需要一个时钟脉冲输给LCD,然而使用LPTMR做一个定时翻转某个IO口电平作为时钟输到LCD,下面是我写的代码,遇到的问题是,我把 frameBuffer 变量全部注释调,LPTMR中断运行正常,可以把frameBuffer 变量用上,程序不能正常运行。请大侠们帮忙看看,问题出在那?
感激不尽!
LCD.C中的代码:

#include "ls013b7dh03.h"
#include "font.h"
#include "lptm.h"
#include "spi.h"
#define MAX_CHAR_POSX 122
#define MAX_CHAR_POSY 122  

volatile uint8_t frameBuffer[MLCD_BUF_SIZE];


void VCOM_Init(void)
{
          NVIC_SetPriority(LPTimer_IRQn,3);                                 
          Lptmr_Init(500,1);                                                
          NVIC_EnableIRQ(LPTimer_IRQn);                                    
}

void LS013B7DH03_DelayUs(uint16_t count)
{
        count = count*100;
                while(count--);
}

void LS013B7DH03_Init(void)
{
  init_SPI0(SPI_Master);
        VCOM_Init();
        CS_LO;
        DISP_LO;
        LS013B7DH03_DelayUs(6);
        DISP_HI;
        LS013B7DH03_Clear();
       
}

void LS013B7DH03_SendData(uint8_t data)
{

        SPI0_SendData8(data);

}
//addr  µØÖ·
//count ÐÐÊý
//data  Êý¾ÝÖ¸Õë
void LS013B7DH03_WriteLine(uint8_t addr, uint8_t count,uint8_t *data)
{
        uint8_t i;
                CS_HI;
        LS013B7DH03_DelayUs(6);
        LS013B7DH03_SendData(MLCD_WR);
       
        if(count<=1)               
        {
                LS013B7DH03_SendData(addr);
                for(i=0;i<MLCD_BYTES_LINE; i++)
                {
                        LS013B7DH03_SendData(*data);                       
                }
                LS013B7DH03_SendData(0);
               
        }
        else
        {
                while(count--)
                {
                        LS013B7DH03_SendData(addr++);
                        for(i=0;i<MLCD_BYTES_LINE; i++)
                {
                        LS013B7DH03_SendData(*data);
                        data++;                       
                }
                LS013B7DH03_SendData(0);
                       
                }
        }
       
        LS013B7DH03_SendData(0);
        LS013B7DH03_DelayUs(2);
        CS_LO;
        LS013B7DH03_DelayUs(2);
}

void LS013B7DH03_Clear(void)
{
        CS_HI;
        LS013B7DH03_DelayUs(6);
        LS013B7DH03_SendData(MLCD_CM);
        LS013B7DH03_SendData(0);
        LS013B7DH03_DelayUs(2);
        CS_LO;
        LS013B7DH03_DelayUs(2);
}


void LS013B7DH03_WriteBuffer(volatile uint16_t x, volatile uint16_t y, volatile uint8_t data)
{
        volatile uint8_t temp;
        if(x>MLCD_XRES)return;
        if(y>MLCD_YRES)return;
        //temp = frameBuffer[MLCD_BYTES_LINE*y + x/8];
        if(data)
        {
                temp |= 1<<((x%8));
        }
        else
        {
                temp &= ~(1<<((x%8)));
        }
       
//        frameBuffer[MLCD_BYTES_LINE*y + (x/8)] = temp;
       
       
}

void LS013B7DH03_ShowChar(volatile uint16_t x, volatile uint16_t y, volatile uint8_t mode,volatile uint8_t data)
{
        volatile uint16_t i,j;
        volatile uint8_t temp;
        data = data-' ';
        if(mode==0)
        {
                for(i=0;i<16;i++)
                {
                        temp=ascii_8x16[data*16+i];
                        for(j=0;j<8;j++)
                        {
                                if((temp<<j)&0x80)
                                        LS013B7DH03_WriteBuffer(x+j,y+i,0);
                                else
                                        LS013B7DH03_WriteBuffer(x+j,y+i,1);       

                        }
                }
        }
        else
        {
                                for(i=0;i<16;i++)
                {
                        temp=ascii_8x16[data*16+i];
                        for(j=0;j<8;j++)
                        {
                                if((temp<<j)&0x80)
                                        LS013B7DH03_WriteBuffer(x+j,y+i,1);
                                else
                                        LS013B7DH03_WriteBuffer(x+j,y+i,0);       

                        }
                }
        }
       
}

void LS013B7DH03_ShowString(volatile uint16_t x, volatile uint16_t y, volatile uint8_t mode,volatile uint8_t *data)
{

mode= !mode;       
    while(*data!='\0')
    {      
        if(x>MAX_CHAR_POSX){x=0;y+=16;}
        if(y>MAX_CHAR_POSY){y=x=0;}
        LS013B7DH03_ShowChar(x,y,mode,*data);         
        x+=8;
        data++;
    }  
}          

void LS013B7DH03_ShowPic(volatile uint16_t x, volatile uint16_t y, volatile uint16_t width,volatile uint16_t height, volatile uint8_t mode,uint8_t *data)
{
        volatile uint16_t i,j;
        volatile uint8_t temp;        
        volatile uint16_t count;
        volatile uint16_t xpos,ypos;
        width = width/8;
        count=height*width;//????
        if(mode==0)
        {
                for(i=0;i<count;i++)
                {
                        temp= data;
                       
                        ypos=y+i/width;
                        xpos=(i%width)*8 + x;
                        for(j=0;j<8;j++)
                        {
                                if((temp<<j)&0x80)
                                        LS013B7DH03_WriteBuffer(xpos+j,ypos,1);
                                else
                                        LS013B7DH03_WriteBuffer(xpos+j,ypos,0);       
                                       
                       
                        }

                }
        }
        else
        {
                for(i=0;i<count;i++)
                {
                        temp= data;
                       
                        ypos=y+i/width;
                        xpos=(i%width)*8 + x;
                        for(j=0;j<8;j++)
                        {
                                if((temp<<j)&0x80)
                                        LS013B7DH03_WriteBuffer(xpos+j,ypos,0);
                                else
                                        LS013B7DH03_WriteBuffer(xpos+j,ypos,1);       
                                       
                       
                        }

                }
        }
       

}

//¸üÐÂlcdÄÚÈÝ
void LS013B7DH03_Update(void)
{
        //LS013B7DH03_WriteLine(1, 128,(uint8_t*)frameBuffer);

}
//Çå¿Õ»º³åÇøÄÚÈÝ
void LS013B7DH03_flash(void)
{
        uint16_t i;
        for(i=0;i<2048;i++)
        {
        //        frameBuffer=0xff;
        }

}

/***************************************** E N D *********************************************/


相关帖子

沙发
FSL_TICS_A| | 2014-5-30 16:23 | 只看该作者
你好,楼主!
从你的填出的程序,没看出LPTMR与frameBuffer有什么交集的地方啊,
麻烦你介绍一下!

使用特权

评论回复
板凳
FSL_TICS_Robin| | 2014-6-3 09:54 | 只看该作者
楼主你好
请问你的程序里除了LPTMR中断,还有其他中断函数不?
如果还有其他中断函数,建议检查下中断优先级和中断函数执行时间是否过长。

使用特权

评论回复
地板
smiel_xll|  楼主 | 2014-6-3 16:23 | 只看该作者
FSL_TICS_A 发表于 2014-5-30 16:23
你好,楼主!
从你的填出的程序,没看出LPTMR与frameBuffer有什么交集的地方啊,
麻烦你介绍一下! ...

版主您好,这个问题有应该不是中断问题,应该是frameBuffer数组定义的问题,我把它的长度MLCD_BUF_SIZE设置为128*128/8就会出问题,程序进不了主函数,如果把他设置为96*128/8后,程序又正常运行了,问题出在哪呢?我把frameBuffer定义为uint16_t位依然会出现问题,请帮忙分析下,谢谢

使用特权

评论回复
5
smiel_xll|  楼主 | 2014-6-3 16:24 | 只看该作者
FSL_TICS_Robin 发表于 2014-6-3 09:54
楼主你好
请问你的程序里除了LPTMR中断,还有其他中断函数不?
如果还有其他中断函数,建议检查下中断优先 ...

您好,这个问题应该不是中断问题,应该是frameBuffer数组定义有问题,我把它的长度MLCD_BUF_SIZE设置为128*128/8就会出问题,程序进不了主函数,如果把他设置为96*128/8后,程序又正常运行了,问题出在哪呢?我把frameBuffer定义为uint16_t位依然会出现问题,请帮忙分析下,谢谢

使用特权

评论回复
6
FSL_TICS_Robin| | 2014-6-4 10:10 | 只看该作者
请问楼主你的KL02具体型号是什么,SRAM大小多少?

使用特权

评论回复
7
smiel_xll|  楼主 | 2014-6-4 11:21 | 只看该作者
FSL_TICS_Robin 发表于 2014-6-4 10:10
请问楼主你的KL02具体型号是什么,SRAM大小多少?

KL02Z32VFK4,SRAM大小为2K,难道是SRAM太小了,数组是存放在哪的?如果要修改需要怎么弄

使用特权

评论回复
8
FSL_TICS_Robin| | 2014-6-4 11:38 | 只看该作者
smiel_xll 发表于 2014-6-4 11:21
KL02Z32VFK4,SRAM大小为2K,难道是SRAM太小了,数组是存放在哪的?如果要修改需要怎么弄 ...

你总共也就2KB的SRAM,但你的其中一个数组就占用了2KB。 你这个数组必须这么大吗?

使用特权

评论回复
9
smiel_xll|  楼主 | 2014-6-4 13:41 | 只看该作者
FSL_TICS_Robin 发表于 2014-6-4 11:38
你总共也就2KB的SRAM,但你的其中一个数组就占用了2KB。 你这个数组必须这么大吗? ...

我这个数组是用来写LCD点的,点阵为128*128,在除以8就为2048了

使用特权

评论回复
10
FSL_TICS_Robin| | 2014-6-6 14:10 | 只看该作者
smiel_xll 发表于 2014-6-4 13:41
我这个数组是用来写LCD点的,点阵为128*128,在除以8就为2048了

请问楼主的问题解决了吗?
你所选的型号芯片SRAM比较小

使用特权

评论回复
11
smiel_xll|  楼主 | 2014-6-13 00:05 | 只看该作者
FSL_TICS_Robin 发表于 2014-6-6 14:10
请问楼主的问题解决了吗?
你所选的型号芯片SRAM比较小

目前也还没解决问题,还得花时间去想想,谢谢版主关心

使用特权

评论回复
12
FSL_TICS_Robin| | 2014-6-13 10:14 | 只看该作者
smiel_xll 发表于 2014-6-13 00:05
目前也还没解决问题,还得花时间去想想,谢谢版主关心

你的那个数组大小2K,而你的芯片SRAM总共也就2K,另外你其他变量所需的堆、栈就没地方放了。
换大些SRAM的芯片吧,KL02从手册上看最大SRAM也就是4KB。



另外你需要注意数组、堆、栈都不要跨SRAM_L\SRAM_U的分界,比如你的2K数组编译器会放到SRAM_U里,那么剩下的堆、栈大小就别定义太大了,因为SRAM_U只剩下1K,SRAM_L也剩下1K。


使用特权

评论回复
13
smiel_xll|  楼主 | 2014-6-13 11:51 | 只看该作者
FSL_TICS_Robin 发表于 2014-6-13 10:14
你的那个数组大小2K,而你的芯片SRAM总共也就2K,另外你其他变量所需的堆、栈就没地方放了。
换大些SRAM ...

好的,谢谢!

使用特权

评论回复
14
jd972594| | 2014-6-13 13:32 | 只看该作者
这个数组定义过大的问题好像在智能车论坛里见过。
玩摄像头组的一般会把摄像头数据整个采集到数组中,有的摄像头线数较多就会导致存的数组过大了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

58

帖子

0

粉丝