实证明,我必须打印那本700多页的书,慢慢研究,一个个地攻破。串口我不太明白,学习时我先跳过去,先易后难嘛,后来发现空中楼阁,唉,回来再深究,因为串口是我调试中喜欢滥用的武器,必须突破,不可回避就努力克服,任何问题都应该搞懂,不管迟早。
作为新手的我使用原子的程序,逐步调试串口。搞了一个上午,分享快乐!在大家试验的过程中有错误欢迎指出交流,欢迎有其它的讨论。
首先要看懂原子的程序,第一必须理解原子所设的USART_RX_STA是什么,是原子设出来的变量,在程序中(必须自己认真看,虽说我浪费了好多时间在迷茫,都是泪。),它的第七位是用来标志接收完成,这意味着,当USART_RX_STA>0x80才能成功地串口打印,它的第六位是接收到0x0d的标志位,按原子的说法,回车是0x0d 0x0a才表示成功地回车并打印,所以要让USART_RX_STA>0x80,前提是要先要让USART_RX_STA>0x40。其余的第012345位都是用来存数据的多少,(2的六次方为64,所以不能大于64个数据量)
重新整理一下原理:
第一,进入串口中断,
第二,输出一系列要打印的数据
第三,模拟回车,输出“0x0d 0x0a”
打印成功。
逐步模拟仿真的教程(这是我的重点,如何正确设断点,这个好关键,分享给大家少走弯路,这是我多次失败后的成功,这算是一个参考答案。大家按照走一次后,成功了也多试试其它,失败才能获取更多风景,什么意外情况就自己处理吧,总不能说太多其它无关重要的东西。):
先要知道在串口肋手使用十六进制,一步只能串口输出一次。
其次要知道在watch1中可以设置显示变量的值。
还要知道,注意,这是逐步的,不是说你输出一大串数据,你就能慢慢RUN着看仿真。所以要走一步,输出一个,再走一步,看一步。(我用词不专业,大家理解着看吧)
好,开始。
void USART1_IRQHandler(void)中设
if(USART1->SR&(1<<5)) 第一个断点
if((USART_RX_STA&0x80)==0)第二个断点
这两个断点,好,
在Watch1显示USART_RX_STA与res,来观察它们
好,仿真,RUN,让程序跑起来
先在串口助手输出一个数据(63,在Watch1中示USART_RX_STA显示为0x00),这会把RXNE置位,进到USART1_IRQHandler中断函数中的第一个断点。(好像这第一个数据会被吞,好像哪里看到过这样的说明,反正我输出这个只能将RXNE置位,而不能成为要打印出来的数据。是不是什么起始位呀什么的,什么停止位呀这些我迟点再研究。)
注意,我们再输出一次63,再RUN,
进到第二个断点res显示0x63'c'
再RUN,返回第一个断点,此时,我们输出0d
RUN res显示0x0d
RUN 返回第一个断点,
(发现USART_RX_STA为0x4?表明收到0d)
再输出0a
RUN res显示0x0a
RUN USART_RX_STA此时已经>0x80,可以显示了!
RUN 好,成功地在串口助手中显示“你所发送的消息:c”
好,其它扩展呀或其它方式大家慢慢试。
今天终于发现,USMART移植不成功的地方了,可能了是因为在USART里是0x80而在那scan里是0x8000, 有可能是这里导致了我移植不成功。第二天,我发现,原来是因为USART.H升级了,所以要想移植成功,则必须把USART也要移过去。。。在那个USART.H有说明升级的内容,我才发现。。。在文件里的Readme也有提及,唉,发现得太迟了。。。。
|