第五节: 永恒的串口和阶段感言
等说完串口,就要等一些天再和大家见面了,孩子总是和我捣乱,那是我的第一生命。
是我祖祖辈辈的延续。请原谅我的古老,我喜欢传统的,无论是京剧,大鼓还是快板。说起孩子,心情总是愉快的,有一天孩子感冒去医院,医生要验血,临近化验室时,孩子哭闹,妻子哄骗说是妻子验血,等抽完孩子的血孩子哇哇大哭并质问:“为什么你化验抽我的血”我和妻子苦笑。现在想来,孩子那时天真可爱,现在的孩子俨然一副大人麽样,他才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了。
感谢坛子里的兄弟,你们在开拓大家的视野
感谢阿莫,买套件时居然有三个免费的芯片,虽然别人也有,但我买时不知道,算是惊喜
感谢我的孩子,经常给我捣乱,让我觉得我依然是个好父亲
感谢我的双眼,我今天见到了白里透着红的美女
第五节: 正交编码和疑惑
今天去公司,找遍了废品堆都没有找到一只编码器,没办法只好从半成品上 拆下来一个,大家不要说是我做的,不然老板会很生气。
正交计数方法很多,软件的,cpld的,芯片的都可以,但cpu上集成了我们为什么不用,我没理由不选带正交功能的stm8,因为他是8bit的,因为他价格据说很便宜,32bit的cpu大多是带这个功能的包括dsp,我总是说在我的产品里他是大马,我的产品是小车,其实是我不愿去啃32bit的大部头。写完这篇我下定决心要使用stm32了
到时候兄弟们一定要帮助我,就当是扶贫吧。
阿莫的三合一板使用的芯片是s207s8t6,44脚的,time1的两个输入段为pc1,和pc2,我将编码器的a,b相分别接在PC1,PC2上。接上VCC 和 gnd ,电路的工作
算是完成,接下来都是软件的工作。
在此之前看看stm32的正交编码接口应用笔记吧,上面对原理描述的很清楚,比我说的要有条理,我就不说了。看下面的代码
//下面是初始化部分
CLK_PCKENR1 |=0X80; //开启time1时钟
TIM1_SMCR |= 0X3; //工作在编码器模式3
TIM1_CCMR1 |= 0X1; //CC1 MAP TI1FP1 CH1
TIM1_CCMR2 |= 0X1; //CC2 MAP TI2FP2 CH2
TIM1_ARRH = 0XEA; // 60000产生溢出
TIM1_ARRL = 0X60;
TIM1_IER |=0X1; //开中断
TIM1_CNTR = cnt_start = 30000; //我要有个大的初始化值
//正好是满量程的一半
TIM1_CR1 =0X1; //启动计数
通过上面简单的配置,time1正是工作了,旋动编码器,可以看到TIM1_CNTR的数据变动,我的1000线编码每转一圈产生4000个数。
在我的中断和主程序里做了处理,可计数范围扩展到32bit,算是基本达到了我的要求。有一件事要说一下,读TIM1_CNTR时要先读高位,再读低位。
Stm8的工作告一段落,本来还要写spi的,可是还要搭外围电路,等一些天吧,我把ad7705接上,手中有十几片闲置的。
今天无意中在中断里做了long型数据加法,编译时居然出错,翻了翻编译器手册,没找到原因,希望知道的朋友告诉我一声。
没有使用意法的库,是因为我觉得使用它不利于入门,虽然它结构优美。做项目的时候再用吧。
从来没这么认真的写过东西,心里很是舒畅。
有错的地方,兄弟们一定要告诉我,不要闷声发大财。