OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3523|回复: 6

stm32f107串口4在UCOS系统下接收数据死机!!!

[复制链接]

28

主题

61

帖子

0

精华

初级会员

Rank: 2

积分
153
金钱
153
注册时间
2014-9-8
在线时间
23 小时
发表于 2016-4-11 23:27:16 | 显示全部楼层 |阅读模式
5金钱

我在裸机上运行好好的程序移植到UCOS ii系统下,发现串口4能正常发送数据,但是上位机给串口4发送数据的时候 马上就死机了,发送几个字节都死机,折腾检查初始化还是不行,把其他功能都屏蔽了  就只剩下串口4收发数据功能   还是串口4接收数据就马上死机     代码如下    求指点   谢谢
//USART4
  #define COM4                   UART4
  #define COM4_CLK               RCC_APB1Periph_UART4
  #define COM4_GPIO              GPIOC
  #define COM4_GPIO_CLK          RCC_APB2Periph_GPIOC
  #define COM4_PIN_CK            GPIO_Pin_9
  #define COM4_PIN_Tx            GPIO_Pin_10
  #define COM4_PIN_Rx            GPIO_Pin_1
  #define COM4_IRQn              UART4_IRQn


void USART4_485_Init(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;
  USART_InitTypeDef USART_InitStructure;
  GPIO_InitTypeDef GPIO_InitStructure;
  RCC_APB2PeriphClockCmd(COM4_GPIO_CLK | RCC_APB2Periph_AFIO, ENABLE);

  RCC_APB1PeriphClockCmd(COM4_CLK, ENABLE);/*Only USART1, no need to remap*/
  /* Configure the NVIC Preemption Priority Bits */  
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
  /* Enable the USART4 Interrupt */
  NVIC_InitStructure.NVIC_IRQChannel = COM4_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);  

  /*Configure Of USART*/


  USART_InitStructure.USART_BaudRate = 9600;

  USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  USART_InitStructure.USART_StopBits = USART_StopBits_1;
  USART_InitStructure.USART_Parity = USART_Parity_No;
  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

  /* Configure USART Tx as alternate function push-pull */
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_InitStructure.GPIO_Pin = COM4_PIN_Tx;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(COM4_GPIO, &GPIO_InitStructure);

  /* Configure USART Rx as input floating */
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_InitStructure.GPIO_Pin = COM4_PIN_Rx;
  GPIO_Init(COM4_GPIO, &GPIO_InitStructure);

  /* USART configuration */
  USART_Init(COM4, &USART_InitStructure);   

  /* Enable USART */
  USART_Cmd(COM4, ENABLE);      

  /***************Configure USART Contral for RS485 Mode to select ************/
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Pin = COM4_PIN_CK;
  GPIO_Init(COM4_GPIO, &GPIO_InitStructure);

//ÏDê±′|óúêÕêy×′ì¬
  GPIO_ResetBits(COM4_GPIO,COM4_PIN_CK);
  USART_ITConfig(COM4, USART_IT_RXNE, ENABLE);

}


void USART4_IRQHandler(void)
{
    uint8_t tmp;
       
   OS_CPU_SR  cpu_sr;
    OS_ENTER_CRITICAL();                                      
    OSIntNesting++;
    OS_EXIT_CRITICAL();  
    if (USART_GetITStatus(UART4, USART_IT_RXNE) != RESET)
    {
        tmp = USART_ReceiveData(UART4);
        /* Clear the USART1 Receive interrupt */
        USART_ClearITPendingBit(UART4, USART_IT_RXNE);
    }
   OSIntExit();
}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2016-4-12 09:51:27 | 显示全部楼层
回复

使用道具 举报

28

主题

61

帖子

0

精华

初级会员

Rank: 2

积分
153
金钱
153
注册时间
2014-9-8
在线时间
23 小时
 楼主| 发表于 2016-4-12 10:04:55 | 显示全部楼层
zuozhongkai 发表于 2016-4-12 09:51
把任务堆栈改大试试

任务堆栈已经改为1K了   堆栈空间肯定够
回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2016-4-12 10:06:21 | 显示全部楼层
zhu2006 发表于 2016-4-12 10:04
任务堆栈已经改为1K了   堆栈空间肯定够

那就硬件仿真,看看到哪里死机了,然后分析代码
开往春天的手扶拖拉机
回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2016-4-12 10:06:23 | 显示全部楼层
zhu2006 发表于 2016-4-12 10:04
任务堆栈已经改为1K了   堆栈空间肯定够

那就硬件仿真,看看到哪里死机了,然后分析代码
开往春天的手扶拖拉机
回复

使用道具 举报

70

主题

6768

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13151
金钱
13151
注册时间
2012-11-26
在线时间
3816 小时
发表于 2016-4-12 10:08:44 | 显示全部楼层
起码我看你的中断写的就有问题
学无止境
回复

使用道具 举报

28

主题

61

帖子

0

精华

初级会员

Rank: 2

积分
153
金钱
153
注册时间
2014-9-8
在线时间
23 小时
 楼主| 发表于 2016-4-12 12:47:16 | 显示全部楼层
jermy_z 发表于 2016-4-12 10:08
起码我看你的中断写的就有问题

中断函数修改成这样
void USART4_IRQHandler(void)
{
    uint8_t tmp;
       
    OSIntEnter();   
    if (USART_GetITStatus(UART4, USART_IT_RXNE) != RESET)
    {
        tmp = USART_ReceiveData(UART4);
        USART_ClearITPendingBit(UART4, USART_IT_RXNE);
    }
                 OSIntExit();
}

发现还是死机,在线仿真调试   没有运行到这句代码 OSIntEnter();   压根就没进中断来
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-10 21:30

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表