将下载好的固件库添加到工程目录中,并在工程中添加相应的文件,以闪烁LED灯为例子。
新建user、proj文件夹。
复制 STM32Cube_FW_F1_V1.4.0\Drivers\STM32F1xx_HAL_Driver\Inc 里的 stm32f1xx_hal_conf_template.h 到user目录中,并重命名为stm32f1xx_hal_conf.h。
复制 STM32Cube_FW_F1_V1.4.0\Projects\STM32F103RB-Nucleo\Templates\Src 文件夹里面的 stm32f1xx_it.c 以及 STM32Cube_FW_F1_V1.4.0\Projects\STM32F103RB-Nucleo\Templates\Inc 文件夹里面的 stm32f1xx_it.h 到user文件夹中。如果stm32f1xx_it.c 中SysTick_Handler 为空的话,请在该文件的放置头文件的地方添加#include "stm32f1xx.h" 如下图所示:
,
并在SysTick_Handler 函数中添加HAL_IncTick(); ,如下图所示:
。
新建一个C文件,输入例程。
添加程序代码, STM32Cube_FW_F1_V1.4.0\Drivers\STM32F1xx_HAL_Driver\Src文件夹里面的单片机驱动程序(根据需要添加)、 STM32Cube_FW_F1_V1.4.0\Drivers\CMSIS\Device\ST\STM32F1xx\Source\Templates 文件夹里面的 system_stm32f1xx.c 、 STM32Cube_FW_F1_V1.4.0\Drivers\CMSIS\Device\ST\STM32F1xx\Source\Templates\arm 文件夹里面的启动文件(根据实际情况添加)、 user 文件夹里面的 stm32f1xx_it.c 和 gpio_demo.c 添加到工程的程序文件如下图所示:
添加的头文件路径如下图所示:
在c/c++编译器选项宏定义一栏中添加STM32F103xE,USE_HAL_DRIVER (查看stm32f1xx.h),如下图所示:
编译
当使用HAL库中断式串口接收,除了在NVIC中使能全部串口中断,我们还需要使用 HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size) 来使能串口接收中断。
该函数请求UART句柄 huart ,接收数据缓存区 pData ,以及期望接收的数据个数 size 。
进入到该函数中,首先会确保huart处于空闲状态,否则返回 HAL_BUSY ,同时校验参数 pData 和 size 的合法性,视情况返回 HAL_ERROR
随后使用宏 __HAL_LOCK() 锁死huart,这样huart在释放前被调用时,返回 HAL_BUSY
后面是关于接收模式,接收超时中断的一些设置,并不重要,在程序最后return时调用了 UART_Start_Receive_IT(huart, pData, Size) ,进入下一层,该函数是整个中断注册的关键。
进入 UART_Start_Receive_IT(); ,首先是把接收数据缓存区以及接收个数传递给句柄huart, 清除掉接收中断服务函数指针 ,以及进行一些必要的设置。
随后会根据USART的设置来选择不同的中断服务函数
得到4个中断函数,我们研究相对简单的8倍过采样RxISR
在接收ISR中,配置好Mask后,如果UART有数据,则会读 RDR 数据接收寄存器,反之直接清掉 RXNE 标记位.
重点在于后面的判断语句,这也是整个HAL库中断式串口接收的阴间之处
在确定读取到预期数量的数据后,会直接 失能RXNE串口接收中断 ,同时 也清理RxISR函数指针 ,回调 接收事件函数 HAL_UARTEx_RxEventCallback(huart, huart-RxXferSize); 和 接收完毕函数 HAL_UART_RxCpltCallback(huart);
那么这个RxISR是在哪里被调用的呢?答案在 void USART1_IRQHandler(void) 中的 HAL_UART_IRQHandler() 中
解决方案1:1mS之内可以多个64B的包,要看总线负载情况,最好的情况可以1mS可以Bulk传输10个以上包出来,这样有可能到600KBps解决方案2:我也觉得超过64KKB可能性比较小,那些声称很大的人的测试,都是哗众取宠,没见有完整源码。解决方案3:印象里,1ms查询一次是HID方式,虚拟串口也是这样吗?如果也是,是否可以把时间缩短?解决方案4:全速bulk传输时,理论上1帧最多传输19个64B的包,但是受总线调度影响,达不到这么高的负载率,640KBs的速率应该还是可以达到的 解决方案5:bulk方式下可以达到600k,我的产品已经使用2年了,一直稳定。如果用32f207,有时能够达到1M.但是操作系统要在系统空闲的时候才可以达到1M.很多时候操作系统不允许。不过降到600K的速度,操作系统能够保证的。 解决方案7:主机每隔1ms就会查询端点的中断...适当处理后,间隔可以降到100uS一下。
那那就重新启动机器一次,也有可能是越狱吧,你的你的电脑需要越狱才能保证数据传输不错误,用上越狱软件,我给忘了有可能是手机中病毒了,需要越狱越狱删除一些病毒文件,然后就会好了。就
本文标签:stm32bulk传输hal