打印
[STM32F1]

STM32 System tick 和SPI冲突?

[复制链接]
3680|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wilson970|  楼主 | 2014-2-28 15:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
设置好STM32 system tick为1ms中断,如果同时启动SPI传输数据,发现SPI没输出了。
去掉中断处理函数后,SPI有数据输出。
沙发
ilovezeno| | 2014-2-28 15:23 | 只看该作者
其实是你的大脑和spi冲突,不是system tick中断。。。。。
开个玩笑 ,你到底在system tick中断里干了什么逆天的事情把cpu都阻塞了?你应该贴你的程序上来的。system tick是绝对不会和spi冲突的,真的冲突了这芯片肯定已经退市了。。。

使用特权

评论回复
板凳
soso| | 2014-2-28 15:25 | 只看该作者
提示: 该帖被管理员或版主屏蔽
地板
mmuuss586| | 2014-2-28 16:06 | 只看该作者
ilovezeno 发表于 2014-2-28 15:23
其实是你的大脑和spi冲突,不是system tick中断。。。。。
开个玩笑 ,你到底在system tick中断里 ...


正解。
我中断里最多加个指示灯,闪闪。

使用特权

评论回复
5
wilson970|  楼主 | 2014-2-28 16:10 | 只看该作者
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);
SysTick_Configuration();  //1ms

void SysTick_Configuration(void)
{
  /* Setup SysTick Timer for 1 msec interrupts  */

      if (SysTick_Config(9000))
  {
    /* Capture error */
   // while (1);
  }
/* Configure the SysTick handler priority */
    NVIC_SetPriority(SysTick_IRQn, 0x4);
}

void SysTick_Handler(void)
{
    Interrupt_Slot++;
}

请分析,这里面肯定是抢占资源导致,但是不知道什么问题。 我定时1ms中断不算过分吧。

使用特权

评论回复
6
wilson970|  楼主 | 2014-2-28 16:25 | 只看该作者
ilovezeno 发表于 2014-2-28 15:23
其实是你的大脑和spi冲突,不是system tick中断。。。。。
开个玩笑 ,你到底在system tick中断里 ...

我虽然STM32才开始弄,但其他芯片也用不少,请不要回答得太业余;况且,就算是中断里面进行很多动作,只要不涉及到大数据处理,也不会有问题,不至于繁忙到数据没输出。这肯定是设置的问题,只是我不知道哪里设置错了。

使用特权

评论回复
7
mmuuss586| | 2014-2-28 16:31 | 只看该作者
wilson970 发表于 2014-2-28 16:10
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);
SysTick_Configuration();  //1ms

Interrupt_Slot这个变量干啥用的?
另外你的同时启动啥意思啊
SPI的输出怎么输出的,发段程序看下。
我开了8个定时器,挂了10多个SPI外设都没啥问题(通过片选)

使用特权

评论回复
8
wilson970|  楼主 | 2014-2-28 16:52 | 只看该作者
mmuuss586 发表于 2014-2-28 16:31
Interrupt_Slot这个变量干啥用的?
另外你的同时启动啥意思啊
SPI的输出怎么输出的,发段程序看下。

谢谢你的热心回复,
Interrupt_Slot 是我准备用来计时5ms用的,这里用来观察中断是否响应了。
system tick 用来执行多任务计时, SPI在主任务中和TF LCD通信。
我一旦启动了tick, SPI 就没输出了,我尝试过将tick 时间调大,但没用。
SPI的代码如下:
void SPI1_WriteByte(u8 Data)
    {
      /* Wait until the transmit buffer is empty */
      while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
      /* Send the byte */
      SPI_I2S_SendData(SPI1, Data);
      // wait for send complete
      while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == RESET);
    }

不知道哪个地方设置错误,
STM32 才弄半天,还不算很清楚,请高手指教。

使用特权

评论回复
9
mmuuss586| | 2014-2-28 16:54 | 只看该作者
wilson970 发表于 2014-2-28 16:52
谢谢你的热心回复,
Interrupt_Slot 是我准备用来计时5ms用的,这里用来观察中断是否响应了。
system tic ...

你这2个程序都没问题。
不过我是跑裸机的,你看看任务调度吧
或者先去掉任务调度看看

使用特权

评论回复
10
wilson970|  楼主 | 2014-2-28 17:05 | 只看该作者
mmuuss586 发表于 2014-2-28 16:54
你这2个程序都没问题。
不过我是跑裸机的,你看看任务调度吧
或者先去掉任务调度看看 ...

谢谢,只能慢慢检查下了。

使用特权

评论回复
11
wilson970|  楼主 | 2014-2-28 17:40 | 只看该作者
搞定了!

使用特权

评论回复
12
mmuuss586| | 2014-2-28 20:31 | 只看该作者
wilson970 发表于 2014-2-28 17:40
搞定了!

那就分享下经验啊

使用特权

评论回复
13
klffnj| | 2014-3-3 00:33 | 只看该作者
wilson970 发表于 2014-2-28 17:40
搞定了!

楼主分享一下吗,我也碰到类似问题,是usb,不是spi

使用特权

评论回复
14
wilson970|  楼主 | 2014-5-9 16:25 | 只看该作者
我当时用了一个while循环测试SPI,让SPI一直发送数据,就出现了上述问题,后来不这样一直发送就好了。
不知道结贴在哪里弄,老是说给分,但没看到在哪里填分。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

13

帖子

0

粉丝