这里需要考虑多个任务的问题,类似PC上的操作系统,stm32单片机可以用调度器。重要的就是用一个定时器产生中断来作为时标,一个时标完成一个任务,任务运行时间不宜超过时标间隔,且避免同时进行多个任务。长时间的任务可以通过DMA来实现。22.
22. 8.15 (还没放暑假 (|| ~ , ~|| )
现在主要就是USB HID通信与SPI写读以及LCD的问题,这几个之间有冲突,一边写/读SPI,一边响应USB,会造成stm32不知道进入哪里死循环,哎。上位机有时候可以识别USB,有时候PC直接无法识别。(有一个bug,就是USB插入后,我有一个初始值为0的变量会改变,很奇怪?)
现在想在进行SPI写和读的时候将USB的中断全部禁止,SPI写完后在使能USB中断,但貌似不行,还是有错误。打算用定时器TIM1来做个时标,然后根据这个时标分配任务。
CubeMX配置定时器1中断,update interrupte 与break interrupt 的区别???
void TIM3_IRQHandler(void) 首先进入中断函数
HAL_TIM_IRQHandler(&htim2);之后进入定时器中断处理函数
判断产生的是哪一类定时器中断(溢出中断/PWM中断.....) 和定时器通道
void HAL_TIM_PeriodElapsedCallback(&htim2); 进入相对应中断回调函数
在中断回调函数中添加用户代码。
设计代码架构,用时标的方法。
问题:添加定时器TIM1中断,USB HID连不上了。
可能是USB中断与定时器中断有冲突导致。
在默认的模板工程里,一般使用如下的方式实现延迟函数。
参考 STM32 USB无法连接电脑_cyang812的博客-CSDN博客https://blog.csdn.net/u011303443/article/details/78735808
__weak uint32_t HAL_GetTick(void)
{
return uwTick;
}
__weak void HAL_Delay(__IO uint32_t Delay)
{
uint32_t tickstart = 0U;
tickstart = HAL_GetTick();
while((HAL_GetTick() - tickstart) < Delay)
{
}
}
而在 USB 项目中,需要使用如下的方式实现延时函数。
void HAL_Delay(__IO uint32_t Delay)
{
while(Delay)
{
if (SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk)
{