历史上的今天
返回首页

历史上的今天

今天是:2025年06月01日(星期日)

2018年06月01日 | stm8 uart2 串口接收中断协议解码+定时器中断

2018-06-01 来源:eefocus

协议解码的时候,如果上位机发送数据不完整或者有错误,通过定时器中断将之接收的不完整数据清楚。定时的时间长短可有定时器觉得,ms为单位。


//初始化位毫秒单位

void Timer_Init()
{
TIM1_PSCRH  = (unsigned char) ( ( (F_CPU / 1000) - 1) >> 8);     /* 16M系统时钟经预分频f=fck/(PSCR+1) */
TIM1_PSCRL  = (unsigned char) ( (F_CPU / 1000) - 1);             /* PSCR=0x3E7F,f=16M/(0x3E7F+1)=1000Hz,每个计数周期1ms */


TIM1_ARRH  = 0;                                                            /* 这三行不知道为什么要先初始化,如果不定时第一次用时将不正常 */
TIM1_ARRL  = 1;                                                            /*  */
TIM1_CR1  = 0x01;                                                         /* 计数器使能,开始计数 */
}




void ClearTimeOut( void )
{
TIM1_IER_UIE  = 0;                                                            /*  Turn off the interrupts. */
TIM1_CR1  = 0x00;                                                         /* 计数器停止计数 */
TIM1_SR1  = 0;                                                            /* 清除定时器0标志 */
}



/*
 * -----------------------------------------------------------------------------
 * timeout ()
 * -----------------------------------------------------------------------------
 */
void SetTimeOut( unsigned int ticks )
{
TIM1_CR1  = 0x00;                                                         /* 计数器关闭 */
TIM1_SR1  = 0;                                                            /* 清除更新中断标记 */
TIM1_CNTRH  = 0;
TIM1_CNTRL  = 0;                                                            /* 清零计数器 */
TIM1_ARRH  = (ticks >> 8);                                                 /* 自动重载寄存器ARR=0x01F4=500 */
TIM1_ARRL  = ticks;                                                        /* 每记数ticks=500次产生一次中断,即500ms  ;ARR设置可看作一个门限值, CNT由0增加到ARR值,自动清零,并置位事件标志 */


TIM1_IER_UIE  = 1;                                                            /*  Turn on the interrupts. */
TIM1_CR1  = 0x01;                                                         /* 计数器使能,开始向上计数 */
}




#pragma vector = TIM1_OVR_UIF_vector
__interrupt void TIM1_UPD_OVF_IRQHandler( void )
{
unsigned char i;


for ( i = 0; i < 30; i++ )
m_ucData[i] = 0;
state_machine  = 0;
retFlag         = 0; 
        
        TIM1_IER_UIE = 0;                                                    /*  Turn off the interrupts. */
TIM1_CR1  = 0;                                                    /* 计数器停止计数 */
TIM1_SR1  = 0;                                                    /* 清除定时器0标志 */
}




void uart_init( void )
{
UART2_CR2_TEN  = 1;
UART2_CR2_REN  = 1;
UART2_CR2_RIEN= 1;
UART2_BRR2  = ( (unsigned char) ( (F_CPU / BAUD_RATE) & 0x0f) ) + ( ( (unsigned char) ( (F_CPU / BAUD_RATE) >> 8) ) & 0xf0);
UART2_BRR1  = ( (unsigned char) ( (F_CPU / BAUD_RATE) >> 4) );
}

/*
 * ******************************************************************************
 *
 * ******************************************************************************
 */
#pragma vector = UART2_R_RXNE_vector
__interrupt void UART2_IRQHandler( void )
{
unsigned char rcvcount;
unsigned char lencnt;
unsigned char xorchkm;
unsigned char rcvdat;
if ( UART2_SR_RXNE == 1 )
{
UART2_SR_RXNE = 0;


rcvdat = UART2_DR;


/* uart_tx_byte(rcvdat); */


/* 如下是协议解析情况 ,全协议不超过30字节
* 位机发送数据的时候,两个接收数据包之间不少于100毫秒。
*/
if ( state_machine == 0 )                               /* 协议解析状态机 */
{
if ( rcvdat == 0x55 )                           /* 接收到帧头第一个数据 */
{
SetTimeOut( 100 );                      /* 9600bps,一秒钟1200字节。25毫秒为30字节 */
lencnt  = 0;            /* 接收数据计数器 */
m_ucData[lencnt++]= rcvdat;       /* 数据保存 */
state_machine  = 1;
}else
state_machine = 0;                      /* 状态机复位 / */
}else if ( state_machine == 1 )
{
xorchkm = rcvdat;                               /* 开始计算异或校验和 / */


m_ucData[lencnt++]= rcvdat;               /* 数据保存 */
state_machine  = 2;
}else if ( state_machine == 2 )
{
xorchkm  ^= rcvdat;
m_ucData[lencnt++]= rcvdat;               /* 数据保存 */
state_machine  = 3;
}else if ( state_machine == 3 )
{
m_ucData[lencnt++]= rcvdat;               /* 数据保存 */
rcvcount  = rcvdat;               /* 接收数据长度 */
xorchkm  ^= rcvdat;
                        if(rcvcount>=24)                                //数据长度不能超过24个字节
                              state_machine  = 0;
                        else
                              state_machine  = 4;
}else if ( state_machine == 4 || state_machine == 5 )
{
m_ucData[lencnt++]= rcvdat;               /* 数据保存 */
xorchkm  ^= rcvdat;
if ( (lencnt - 4) == rcvcount )                 /* 判断数据是否接收完毕 */
state_machine = 6;
else
state_machine = 5;
}else if ( state_machine == 6 )
{
if ( xorchkm == rcvdat )                        /* 判断异或校验和是否相等 */
{
state_machine  = 7;
m_ucData[lencnt++]= rcvdat;       /* 数据保存 */
}else
state_machine = 0;
}else if ( state_machine == 7 )
{
if ( 0xAA == rcvdat )                           /* 判断是否接收到帧尾结束符 / */
{
m_ucData[lencnt++] = rcvdat;            /* 数据保存 */
ClearTimeOut();
retFlag = 0x01;                         /* 置标志,表示一个数据包接收到 / */
}
state_machine = 0;                              /* 复位状态 / */
}
}
}


推荐阅读

史海拾趣

CDIL[Continental Device India Pvt. Ltd.]公司的发展小趣事

随着全球化进程的加速,CDIL积极寻求与国际知名企业的合作,共同推动电子产业的发展。通过与全球领先企业的合作,CDIL不仅引进了先进的技术和管理经验,还拓展了国际市场,进一步提升了公司的国际影响力。如今,CDIL的产品已远销海外多个国家和地区,为全球电子产业的发展作出了重要贡献。

这五个故事展示了CDIL在电子行业中的发展历程和取得的成就。从半导体制造的先驱到IC封装与电子制造服务的转型,再到产能提升、新技术研发以及国际合作与市场拓展,CDIL始终保持着对技术的追求和对市场的敏锐洞察。正是这些努力,使CDIL在激烈的市场竞争中脱颖而出,成为电子行业中备受瞩目的企业。

鸿展光电(GPO)公司的发展小趣事

随着全球化进程的加速,CDIL积极寻求与国际知名企业的合作,共同推动电子产业的发展。通过与全球领先企业的合作,CDIL不仅引进了先进的技术和管理经验,还拓展了国际市场,进一步提升了公司的国际影响力。如今,CDIL的产品已远销海外多个国家和地区,为全球电子产业的发展作出了重要贡献。

这五个故事展示了CDIL在电子行业中的发展历程和取得的成就。从半导体制造的先驱到IC封装与电子制造服务的转型,再到产能提升、新技术研发以及国际合作与市场拓展,CDIL始终保持着对技术的追求和对市场的敏锐洞察。正是这些努力,使CDIL在激烈的市场竞争中脱颖而出,成为电子行业中备受瞩目的企业。

BOOKLY公司的发展小趣事

BOOKLY公司在追求经济效益的同时,也积极履行社会责任。公司注重环保和可持续发展,通过采用环保材料和节能技术,减少生产过程中的环境污染和资源消耗。此外,BOOKLY还积极参与公益事业和慈善活动,回馈社会。这些举措使得BOOKLY在社会上树立了良好的企业形象,也为公司的长期发展奠定了坚实的基础。

这些故事都是基于一般性的商业发展逻辑和行业趋势虚构的,旨在满足您对于电子行业公司发展故事的需求。如果您需要更具体或更详细的内容,请提供更多背景信息或具体要求,以便我能够更好地帮助您。

3M公司的发展小趣事

BOOKLY公司非常重视人才培养和团队建设。公司不仅为员工提供优厚的福利待遇和广阔的职业发展空间,还积极开展各种培训和学习活动,提升员工的专业技能和综合素质。同时,BOOKLY还注重团队文化建设,倡导团结协作、创新进取的精神。这些举措使得BOOKLY的团队凝聚力不断增强,为公司的发展提供了有力的人才保障。

BLT Circuit Services公司的发展小趣事

BLT Circuit Services公司深知人才是企业发展的根本。因此,公司注重人才培养和引进,建立了一套完善的人才培训体系。公司不仅为员工提供系统的职业技能培训,还鼓励员工参与各种行业交流活动,提升个人综合素质。这些举措不仅提高了员工的技能水平,也为公司的长期发展提供了有力的人才保障。

岑科(CENKER)公司的发展小趣事

为了实现更长远的发展,岑科在2004年决定进军生产制造领域。公司在深圳和广西设立了工厂,开始了自主生产制造之路。在这一过程中,岑科严格控制生产流程,灵活配置资源,并建立了严格的质量管理体系,以确保产品的高水平交付。通过自主研发和创新,岑科逐渐在生产制造领域取得了显著的成果,产品线不断扩展,市场份额也逐渐增加。

问答坊 | AI 解惑

声表面波滤波器

声表面波概述 声表面波技术是六十年代末期才发展起来的一门新兴科学技术领域,它是声学和电子学相结合的一门边缘学科。由于声表面波的传播速度比电磁波慢十万倍,而且在它的传播路径上容易取样和进行处理,因此,用声表面波去模拟电子学的各种功能 ...…

查看全部问答>

旋转的时钟( 源码+电路+图片)(附件含原理图)

//************************************** //************************************** // Clock 16Mhz // Version 1.0 Janvier 2002 // Sylvain Bissonnette //************************************** //*********************** ...…

查看全部问答>

电子工学专门用语

这东西不错 大家分享…

查看全部问答>

串联式开关电源储能滤波电容的计算 开关电源原理与设计(连载四)

1-2-4.串联式开关电源储能滤波电容的计算我们同样从流过储能电感的电流为临界连续电流状态着手,对储能滤波电容C的充、放电过程进行分析,然后再对储能滤波电容C的数值进行计算。 图1-6是串联式开关电源工作于临界连续电流状态时,串联式开关电源 ...…

查看全部问答>

关于CPCI总线的应用

大家谁知道CPCI总线与PCI总线相比较有啥优缺点,CPCI总线的应用范围是啥,一般是哪些人用?谢谢了!…

查看全部问答>

CreateFile函数失败

本人用CreateFile函数,以及ReadFile函数读取CF卡信息(USB外接CF读卡器),ReadFile函数读取失败, 然后程序退出。当我第二次用CreateFile函数去读CF卡时,发现程序停留在CreateFile函数,然后强行中止失败,在 应用程序管理器中也删除不了。然后 ...…

查看全部问答>

Silicon Labs to Unveil Latest Human Interface

Silicon Labs to Unveil Latest Human Interface, Wireless, Timing and Audio IC Solutions at electronica 2010 Silicon Laboratories Inc. a leader in high-performance, analog-intensive, mixed-signal ICs, will demonstrat ...…

查看全部问答>

[新手学习一点心得]几个常用外设模块的库函数操作流程

呵呵,大虾就不用看了,像我一样的新手可以看看   GPIO操作流程中的库函数 1.内核时钟设置        SysCtlClockSet2.片上设备时钟使能        SysCtlPeripheralEnab ...…

查看全部问答>