|
第五节: 永恒的串口和阶段感言
等说完串口,就要等一些天再和大家见面了,孩子总是和我捣乱,那是我的第一生命。
是我祖祖辈辈的延续。请原谅我的古老,我喜欢传统的,无论是京剧,大鼓还是快板。说起孩子,心情总是愉快的,有一天孩子感冒去医院,医生要验血,临近化验室时,孩子哭闹,妻子哄骗说是妻子验血,等抽完孩子的血孩子哇哇大哭并质问:“为什么你化验抽我的血”我和妻子苦笑。现在想来,孩子那时天真可爱,现在的孩子俨然一副大人麽样,他才4岁呀,是我做的不好吗?我从来不让他在家做和玩耍无关的事情,包括学习。别家的孩子大都报各种专长班,我从来都阻止妻子去给孩子增加负担。我要他的童年快快乐乐。我要让他童年充满童真,可是我做不到。孩子越来越聪明,越来越成熟,是我们老了吗?
又跑题了,串口,自从我开始开发产品从来没离开过串口。因为我总要和计算机或其他的mcu说话,而串口是最简单和经济的方式。
传统的也是最难舍弃,stm8的串口资源很丰厚,都有两个。好些年前,要用双串口除了使用专业芯片外只能选择华邦的芯片,说实话它那时真的很贵。Avr也有双串口的,所以我一见双串口的芯片,总是兴奋。大概得了串口恐惧症了。
看代码:
CLK_PCKENR1 |= 0X08; //开启时钟
LINUART_BRR2 = 0X1;
LINUART_BRR1 = 0X1A; //19200BPS
LINUART_CR2 = 0XAC; //8,n,1开启发送和接受中断
上面是初始化部分,很是简单自己看看吧。
我接下来要用串口中断做的事情很无聊,我要实现无论串口接收到一个什么数据,都要返回该数据并加发 0x55,0xaa。实时上这个协议一点用处都没有,我希望大家开发产品的时候有串口协议时,如果资源够用,又不愿自己写时,使用modobus协议吧,真的很好用。
下面是中断程序
@far @interrupt void USART_TX( void )
{
switch( status )
{
case 0:
LINUART_DR = 0X55;
status = 1;
break;
case 1:
LINUART_DR = 0XAA;
status = 2;
break;
case 2:
LINUART_CR2 = 0X2C; //数据空中断只能写dr清除,所以只能禁止它
status = 0;
break;
}
return;
}
@far @interrupt void USART_RX(void )
{
unsigned char x;
x = LINUART_DR ; //读数据自动清除中断标志
LINUART_DR = x; //同时清除发送空中断标志
LINUART_CR2 = 0XAC;//所以可以打开发送空中断了
status = 0;
return;
}
同样在向量表中改成这样
{0x82, USART_TX}, /* irq20 */
{0x82, USART_RX}, /* irq21 */
在这个简单的基础上,就可以开发自己的协议了。我用串口只使用这么多功能,别的如lin,idra,或是别的都是以后的事了。
和兄弟们说声再见,下次在写时就是正交编码和spi了。 |
|