经过不断摸索,我发现USB虚拟串口可以不经stm32f10x_usart.c外设,直接通过USB收发数据。
也就是说,不必引入stm32f10x_usart.c外设即可实现与上位机通讯。
但有些疑问。
下了几个参考程序,发现主要有2种写法
一种较为简单,代码如下
void USB_Send_Data(u8* data_buffer)
{
count_in=18;
UserToPMABufferCopy(data_buffer, ENDP1_TXADDR, count_in);
SetEPTxCount(ENDP1, count_in);
SetEPTxValid(ENDP1);
}
直接把数据用UserToPMABufferCopy函数,把数据复制到相应的USB端点上,数据就经USB送走了。
原子的写法是设一个中间变量,把数据放到中断变量里,
void EP1_IN_Callback (void)
{
处理中间变量
...
UserToPMABufferCopy(&uu_txfifo.buffer[USB_Tx_ptr], ENDP1_TXADDR, USB_Tx_length);
SetEPTxCount(ENDP1, USB_Tx_length);
SetEPTxValid(ENDP1);
}
通过上述代码发现UserToPMABufferCopy函数是写在 void EP1_IN_Callback (void)里面的,
经过追踪,EP1_IN_Callback函数是被SOF_Callback函数调用的,而SOF_Callback又是被USB_Istr()函数调用的,
而USB_Istr()函数是在USB中断函数USB_LP_CAN1_RX0_IRQHandler里调用的
void USB_LP_CAN1_RX0_IRQHandler(void)
{
USB_Istr();
}
第1种很好理解,第2种,产生一个问题是,USB_LP_CAN1_RX0_IRQHandler 中断函数是如何产生中断的呢?
|