上一篇中已经实现基本的USB和USART2相互传输数据了,但是在实际应用中,我们并不需要库中提供的实现方案,所以本篇要实现的是将上篇移植完的工程进行精简。第一部分:去除有关评估板的内容;第二部分:去掉串口2部分。
第一部分:
1、USB部分中文件usbd_usr.c文件是有关屏幕的,因为文件中定义了一个关于显示屏的结构体会被其他地方调用,为了释放显示屏相关的资源,尝试把该文件中所有函数中的内容都屏蔽掉,只保留函数名(图1);
2、从文件管理中去掉stm3210c_eval_lcd.c,然后编译发现lcd_log.c文件中调用了stm3210c_eval_lcd.c文件中的内容,那就把lcd_log.c文件也从文件系统中去掉,再次编译是没有错误的,说明stm3210c_eval_lcd.c和stm3210c_eval_lcd.h,lcd_log.c和lcd_log.h四个文件是可以直接去掉了,再次编译,会发现有写地方包含了对应的头文件,找到它们,删除就好了;
3、开始删除stm3210c_eval_ioe.c和stm3210c_eval_ioe.h,fonts.c和fonts.h文件,然后编译,找到需要删除的包含头文件的地方;
4、开始去除stm3210c_eval.c文件,编译后根据错误,去掉main.c和usbd_cdc_vcp.c文件中调用的函数,在文件usbd_cdc_vcp.c中调用了STM_EVAL_COMInit函数初始化串口2,将这个函数拷贝过来,同时做小修改,把该文件中用到的宏定义都替换掉,宏定义在stm3210c_eval.h中。函数STM_EVAL_COMInit参数有改变,在几个调用的地方修改一下。(图2)编译去掉各个文件中可能包含的相关头文件。另外要注意一个问题是,串口2的中断函数在usbd_cdc_vcp.c文件中被定义成了EVAL_COM_IRQHandler,需要修改为原来的USART2_IRQHandler,要不然这个时候测试会发现不通,另外把stm32_eval_legacy.h文件也去掉;
到此,第一部分已经完成。
第二部分:
之所以去掉串口2是为了达到利用USB口收发数据。
1、从usbd_cdc_vcp.c文件中可以找到VCP_DataTx()和VCP_DataRx()两个函数是操作数据的,然后分析这两个函数,可以得知,函数VCP_DataTx是将串口2接收到的数据直接放到了APP_Rx_Buffer缓存中,然后这个函数也只有在串口2中断接收函数中被调用了一次,所以可以判断,如果想要用USB口发送数据,就需要往APP_Rx_Buffer缓存中发送,并且要递加APP_Rx_ptr_in计数器;
2、利用MDK的查询功能(shift+ctrl+F),查找VCP_DataRx的调用关系,然后可以发现在文件usbd_cdc_core.c中函数usbd_cdc_DataOut()调用了VCP_DataRx(图3),同时也可以看出,当USB收到数据的时候,USB底层会把收到的数据放到USB_Rx_Buffer缓存中,同时可以通过USB_Rx_Cnt知道这次USB口收到数据的长度;
3、通过1和2知道了调用关系,那接下来就可以去掉串口2,直接利用USB口实现数据收到,达到直接控制USB口的目的,而且串口2也可以释放出来做别的通信。作为调试,就把USB口收发的接口函数直接写到main.c中,后期为了美观,可以新建文件调整;
4、释放串口2。将usbd_cdc_vcp.c文件中的函数内容屏蔽,保留函数名和饭后备调用。函数VCP_COMConfig只被本文件中的某个函数调用,所以直接都屏蔽掉,而串口2的中断函数USART2_IRQHandler也没有留的必要了,也直接屏蔽掉。头文件usbd_cdc_vcp.h中也只保留包含的头文件,其他的内容都屏蔽(图4);
5、利用APP_Rx_Buffer、APP_Rx_ptr_in、USB_Rx_Buffer在main.c文件中新建USB收发函数(图5),定义几个
用于收发的全局变量;
6、在usbd_cdc_core.c文件中找到函数usbd_cdc_DataOut,在该函数之前引用变量extern u8 UsbRxBuff[64];extern u8 UsbRxFlag;函数内部屏蔽APP_FOPS.pIf_DataRx(USB_Rx_Buffer, USB_Rx_Cnt),将接收缓冲中的数据直接复制给UsbRxBuff,同时每次接收到将UsbRxFlag置一(图6)
7、main.c文件中定义了一个UsbTxDataBuff变量,用于将要发送的数据先放到这里,然后函数Usb_TxData通过for循环将要发送的数据发送出去,Usb_RxCmd_Split函数将收到的数据拆分之后做处理,这里直接拆分之后发送要发送的数据,主函数中直接调用Usb_RxCmd_Split完成(图5);
到此,一个独立的USB口就可以被用来发送和接收数据了,下一篇将会对我第一次移植的时候遇到的一个问题做一个简单的介绍,且必须说明的是这个问题目前从原理上来讲还没解决。