好像搞ucos有一段时间了,哈哈,感觉自己是慢热型。很多问题后面才恍然大悟,我擦,原来这么简单。不过学习的乐趣就在于此。可能刚开始觉得很难得问题在后来你甚至觉得可能是个弱智问题,但是当初就是为难了你那么久。
前几天写工作报告,哈哈,觉得没做什么东西。没什么好总结的,老大说,你做了好些时间当然觉得简单,报告要让没有做过的人也能看懂你在做什么。断断续续也记录了一些自己从开始到现在的一些问题,当时做的时候阻难自己很久。现在分享出来,希望对刚入门的童鞋有些许帮助。
1.Ucos系统需要自己移植吗?
答: 可能很多人做项目都会自己移植,毕竟这个系统很简单,移植工作其实很简单。不过你要比较懒的话,那么ucos官方对于大多数板子都有对应的内核,
http://micrium.com/rtos/去这个地方找,只不过官方的系统屏蔽了一些STM自己的东西,这些个问题后面会提到。
2. 为什么下载了系统却跑不起来?(有可能会遇到这个问题,哈哈,好弱智的问题)
答: 先在编译器里检查是不是设置的对应的芯片型号。因为官网的系统都是某一类型号,比如说STM32LXX,我用到的是STM32L152RB类型的,那么就检查一下是不是这个类型的。这个问题彻底暴露了我的智商。。。哈哈哈哈哈
3. 为什么我的灯不亮?
答: 这个问题有点奇怪。哈哈,不过对于从来没有接触过硬件的同学来说极大的可能性会遇到这个问题。问题其实很简单,看看你的管脚配置是否正确,看看你的时钟是否使能。以后遇到的问题首先应该检查的就是对于相应外设的初始化,切记。
4. stm32+ucos的串口为什么不能进去中断?(这个问题其实应该注意一下)
答: 前面提到了ucos官网下载的系统会屏蔽STM32库自带的一些函数,其中一个就是开中断函数。Ucos里这样实现的:
BSP_IntVectSet(BSP_INT_ID_USART1,BSP_IntHandlerUSART1);
BSP_IntPrioSet (BSP_INT_ID_USART1, 1);
BSP_IntEn(BSP_INT_ID_USART1);
其中BSP_IntHandlerUSART1是中断函数名。必须得用它的函数才能实现,不然好像是不能开中断,这个问题大可以试试。
5. 中断开了,但是为什么一直进中断?
答: 去看看你的函数里到底有没有清中断。。。接收中断,发送中断,开了几个中断,关了几个中断。比如USART_ITConfig(USART1, USART_IT_RXNE, ENABLE)或者USART_ITConfig(USART1, USART_IT_TXE, ENABLE)不仅仅是开中断,还会产生相应的中断即置相应的中断位,处理器转向中断程序,如果中断程序中没有对中断位复位,就会一直中断,导致以为启动代码有问题等等。
还有就是有人说STM的板子其实是有bug的,不过我没有遇到这种情况,实际情况自己判断
6.串口中断函数里面改如何实现?
我的串口中断里面就是接收字节。中断函数里实现接收字符,因为中断时一个字符一个字符的接收。接受一个字节就进一次中断,可能对后期的接收问题有影响,比如说你的速率很快,那么就会导致数据丢失,当然这是后话。中断函数的实现:
void USART1_IRQHandler(void){
if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
{
BSP_LED_On(3); //进中断的标志
USART_ClearITPendingBit(USART1,USART_IT_RXNE);
rec_len
= USART_ReceiveData(USART1); //接收到的数据存入一个全局数组
i++;
if(i == (rec_len[0] + 1)){ //if判断的是后面接收到个个数是不是等于第一个字节,如果是那说明是对的
rec_len = 'L'; //给一个结束标志。这样接收完成的时候就会结束接收
i = 0; //继续把后来接收到的数据存入数组
OSMboxPost(MSGBOX,&rec_len);
}
}
}
这是用串口的时候,串口接收字符的实现,很简单,就是把接收到的字符存到一个数组里,等到接收结束再把它发出去。
7. 当波特率高的时候,比如说到921600或者更高的时候就会出错,为什么?
答: 当波特率比较高的时候,因为传输速率快,而串口是接收一个字符就进一次中断,怀疑是这种处理方式浪费了时间导致数据丢失,但是这仅仅是猜测。
哈哈,看了很久ucos,前面基本没有接触过硬件,至少编程没有直接和硬件打交道。现在一步一步慢慢的来,遇到了不少麻烦,不过好在开始知道怎么弄了。学习嘛,哈哈,快乐工作,快乐生活。祝诸位技术突飞猛进,当然工作顺利啦。
后面遇到问题在慢慢更新好了,哈哈,感觉进度好慢。什么时候才能完成一个完整的项目,这么久了项目才开了个头。哈哈。