完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
上一篇中已经实现基本的USB和USART2相互传输数据了,但是在实际应用中,我们并不需要库中提供的实现方案,所以本篇要实现的是将上篇移植完的工程进行精简。第一部分:去除有关评估板的内容;第二部分:去掉串口2部分。
第一部分: 1、USB部分中文件u***d_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和u***d_cdc_vcp.c文件中调用的函数,在文件u***d_cdc_vcp.c中调用了STM_EVAL_COMInit函数初始化串口2,将这个函数拷贝过来,同时做小修改,把该文件中用到的宏定义都替换掉,宏定义在stm3210c_eval.h中。函数STM_EVAL_COMInit参数有改变,在几个调用的地方修改一下。(图2)编译去掉各个文件中可能包含的相关头文件。另外要注意一个问题是,串口2的中断函数在u***d_cdc_vcp.c文件中被定义成了EVAL_COM_IRQHandler,需要修改为原来的USART2_IRQHandler,要不然这个时候测试会发现不通,另外把stm32_eval_legacy.h文件也去掉; 到此,第一部分已经完成。 第二部分: 之所以去掉串口2是为了达到利用USB口收发数据。 1、从u***d_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的调用关系,然后可以发现在文件u***d_cdc_core.c中函数u***d_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。将u***d_cdc_vcp.c文件中的函数内容屏蔽,保留函数名和饭后备调用。函数VCP_COMConfig只被本文件中的某个函数调用,所以直接都屏蔽掉,而串口2的中断函数USART2_IRQHandler也没有留的必要了,也直接屏蔽掉。头文件u***d_cdc_vcp.h中也只保留包含的头文件,其他的内容都屏蔽(图4); 5、利用APP_Rx_Buffer、APP_Rx_ptr_in、USB_Rx_Buffer在main.c文件中新建USB收发函数(图5),定义几个 用于收发的全局变量; 6、在u***d_cdc_core.c文件中找到函数u***d_cdc_DataOut,在该函数之前引用变量extern u8 U***RxBuff[64];extern u8 U***RxFlag;函数内部屏蔽APP_FOPS.pIf_DataRx(USB_Rx_Buffer, USB_Rx_Cnt),将接收缓冲中的数据直接复制给U***RxBuff,同时每次接收到将U***RxFlag置一(图6) 7、main.c文件中定义了一个U***TxDataBuff变量,用于将要发送的数据先放到这里,然后函数U***_TxData通过for循环将要发送的数据发送出去,U***_RxCmd_Split函数将收到的数据拆分之后做处理,这里直接拆分之后发送要发送的数据,主函数中直接调用U***_RxCmd_Split完成(图5); 到此,一个独立的USB口就可以被用来发送和接收数据了,下一篇将会对我第一次移植的时候遇到的一个问题做一个简单的介绍,且必须说明的是这个问题目前从原理上来讲还没解决。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1771 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1619 浏览 1 评论
1070 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
724 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1673 浏览 2 评论
1936浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
729浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
569浏览 3评论
594浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
552浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 16:39 , Processed in 0.882510 second(s), Total 77, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号