你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

F030通讯一直中断

[复制链接]
fansanderen 提问时间:2018-5-11 16:33 /
我用的STM32F030C8T6做通讯,TTL主动发送数据采集室内空气参数模块数据,但是用了好几个达人的例程都是一直死在中断,望请协助!万分感谢
//初始化函数
void initUart(void)
{
        USART_InitTypeDef  USART_InitStructure;
        GPIO_InitTypeDef    GPIO_InitStructure;
        NVIC_InitTypeDef    NVIC_InitStructure;

        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA,ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);

        /* USART2 Pins configuration ******/  
        /* Connect pin to Periph */
        GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_1);
        GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_1);  

        /* Configure pins as AF pushpull */
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
        GPIO_Init(GPIOA, &GPIO_InitStructure);

        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;
       USART_Init(USART1,&USART_InitStructure);        


       USART_ClearFlag(USART1,USART_FLAG_TC);
        USART_ITConfig(USART1,USART_IT_TC,ENABLE);
        //USART_ITConfig(USART1,USART_IT_TXE,ENABLE);
        USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
        USART_Cmd(USART1,ENABLE);      //使能串口


        NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPriority = 1;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);     //使能串口中断
}
//网上下的例程
void Usart_TxByte(uint8_t dat)
{
  USART_SendData(USART1,dat);
  while (USART_GetFlagStatus(USART1, USART_FLAG_TC) != SET);
}

/**
  * @brief  send string
  * @param  string ->  pointer string will be send
  * @retval None
  */
void Usart_TxString(uint8_t *string)
{
  while(*string != '\0')
    Usart_TxByte(*string++);
}

/**
  * @brief  interrupt server function
  * @param  None
  * @retval None
  */
void USART1_IRQHandler(void)
{
  static uint8_t n = 0;
  //一直可以进入
  if(USART_GetFlagStatus(USART1,USART_FLAG_ORE))        //溢出中断
    USART1->ICR |= 1 << 3;// USART_ReceiveData(USART1);                                        //空读清除ORE位
   //一直可以进入
  if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
  {
    Usart_TxByte(USART_ReceiveData(USART1));
  }
   //一直可以进入
  if(USART_GetITStatus(USART1, USART_IT_TC) != RESET)
  {
    if(TestString[n] == '\0')
    {
      USART_ClearFlag(USART1,USART_FLAG_TC);
      Tx_BusyFlag = 0;n = 0;
    }
        else
        {
      Tx_BusyFlag = 1;
      USART_SendData(USART1,TestString[n++]);
        }
  }
}




收藏 评论4 发布时间:2018-5-11 16:33

举报

4个回答
黑皮男 回答时间:2018-5-11 17:18:03
接收数据后清除一下中断标志位试试

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

wenyangzeng 回答时间:2018-5-11 17:39:36
楼主的发送既有查询发送又有中断发送,貌似冲突。
而:
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
  {
    Usart_TxByte(USART_ReceiveData(USART1));
  }
按理应该接收完成后再发送,否则当然要无限死循环了。

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

fansanderen 回答时间:2018-5-12 19:14:18
感谢回复,是晶振选择错误,实际板上安装的是8M,但是程序里默认是48M。换过来就OK了,uint32_t SystemCoreClock    = 8000000;十足搞了3天才搞定,就快崩溃了,下次引以为戒

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2 结贴奖励

查看全部评分

xmshao 回答时间:2018-5-14 13:48:57
fansanderen 发表于 2018-5-12 19:14
感谢回复,是晶振选择错误,实际板上安装的是8M,但是程序里默认是48M。换过来就OK了,uint32_t SystemCore ...

谢谢反馈!
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版