野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 15592|回复: 1

【求助帖】霸道V2串口通信不正常

[复制链接]
发表于 2021-10-5 23:31:01 | 显示全部楼层 |阅读模式
板子是霸道V2,用USB转USART1进行串口通信,我在不配置使能串口中断时程序工作正常,也就是向电脑发送数据正常;但是串口接受中断就很不正常,一开始是怎么都进不了中断,现在变成一使能中断后,单片机直接就跟失了智一样猛发消息。。如附件里视频所示我用Debug调试程序时虚拟串口通信是正常的,但程序下载到板子里就工作不正常。。
板子跳线帽没变过,之前尝试过把CH340的读写口接到USART2,然而也不成功
附件里有完整程序,我基本就是移植教学的程序。这里就只粘贴主程序,串口接受中断程序和串口的.c.h文件
主程序:
#include "stm32f10x.h"
#include "usart.h"

int main(void)
{
        USART_Config();
       
        Usart_SendString(DEBUG_USARTx,"我爱你\n");
        while(1);
}

--------------------------------------------------------------------------------------
USART.C:
#include "usart.h"

/**
  * @brief  配置嵌套向量中断控制器NVIC
  * @param  无
  * @retval 无
  */
static void NVIC_Configuration(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;

  /* 嵌套向量中断控制器组选择 */
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);

  /* 配置USART为中断源 */
  NVIC_InitStructure.NVIC_IRQChannel = DEBUG_USART_IRQ;
  /* 主优先级*/
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  /* 子优先级 */
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  /* 使能中断 */
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  /* 初始化配置NVIC */
  NVIC_Init(&NVIC_InitStructure);
}

/**
  * @brief  USART GPIO 配置,工作参数配置
  * @param  无
  * @retval 无
  */
void USART_Config(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        USART_InitTypeDef USART_InitStructure;

        // 打开串口GPIO的时钟
        DEBUG_USART_GPIO_APBxClkCmd(DEBUG_USART_GPIO_CLK, ENABLE);
       
        // 打开串口外设的时钟
        DEBUG_USART_APBxClkCmd(DEBUG_USART_CLK, ENABLE);

        // 将USART Tx的GPIO配置为推挽输出模式
        GPIO_InitStructure.GPIO_Pin = DEBUG_USART_TX_GPIO_PIN;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(DEBUG_USART_TX_GPIO_PORT, &GPIO_InitStructure);

  // 将USART Rx的GPIO配置为浮空输入模式
        GPIO_InitStructure.GPIO_Pin = DEBUG_USART_RX_GPIO_PIN;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_Init(DEBUG_USART_RX_GPIO_PORT, &GPIO_InitStructure);
       
        // 配置串口的工作参数
        // 配置波特率
        USART_InitStructure.USART_BaudRate = DEBUG_USART_BAUDRATE;
        // 配置 帧数据字长
        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(DEBUG_USARTx, &USART_InitStructure);       
       
        //串口中断优先级配置
        NVIC_Configuration();
        //使能串口接受中断
        USART_ITConfig(DEBUG_USARTx, USART_IT_RXNE, ENABLE);
       
        // 使能串口
        USART_Cmd(DEBUG_USARTx, ENABLE);       
}

/*****************  发送一个字符 **********************/
void Usart_SendByte( USART_TypeDef * pUSARTx, uint8_t ch)
{
        /* 发送一个字节数据到USART */
        USART_SendData(pUSARTx,ch);
               
        /* 等待发送数据寄存器为空 */
        while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET);       
        /* 等待发送完成 */
  while(USART_GetFlagStatus(pUSARTx,USART_FLAG_TC)==RESET);
}

/*****************  发送字符串 **********************/
void Usart_SendString( USART_TypeDef * pUSARTx, char *str)
{
        uint8_t k=0;
  do
  {
                Usart_SendByte( pUSARTx, *(str + k) );
                k++;
  } while(*(str + k)!='\0');
}

/*****************  发送一个16位数 **********************/
void Usart_SendHalfWord( USART_TypeDef * pUSARTx, uint16_t ch)
{
        uint8_t temp_h, temp_l;
       
        /* 取出高八位 */
        temp_h = (ch&0XFF00)>>8;
        /* 取出低八位 */
        temp_l = ch&0XFF;
       
        /* 发送高八位 */
        USART_SendData(pUSARTx,temp_h);       
        /* 等待发送数据寄存器为空 */
        while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET);
        /* 等待发送完成 */
  while(USART_GetFlagStatus(pUSARTx,USART_FLAG_TC)==RESET);
       
        /* 发送低八位 */
        USART_SendData(pUSARTx,temp_l);       
        /* 等待发送数据寄存器为空 */
        while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET);       
        /* 等待发送完成 */
  while(USART_GetFlagStatus(pUSARTx,USART_FLAG_TC)==RESET);
}

/*****************  发送一个数组 **********************/
void Usart_SendArray( USART_TypeDef * pUSARTx, uint8_t *array, uint8_t num) //array为数组名,num为元素个数
{
        uint8_t i;
        for(i=0;i<num;i++)
        {
                        USART_SendData(pUSARTx, array);
                        /* 等待发送数据寄存器为空 */
                        while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_TXE) == RESET);       
                        /* 等待发送完成 */
                        while( USART_GetFlagStatus(pUSARTx, USART_FLAG_TC) == RESET);
        }
}
----------------------------------------------------------------------------------------------------------------
USART.H:
#ifndef __USART_H
#define        __USART_H


#include "stm32f10x.h"
#include <stdio.h>

/**
  * 串口宏定义
  */
       
// 串口1-USART1
#define  DEBUG_USARTx                   USART1
#define  DEBUG_USART_CLK                RCC_APB2Periph_USART1
#define  DEBUG_USART_APBxClkCmd         RCC_APB2PeriphClockCmd
#define  DEBUG_USART_BAUDRATE           115200

// USART GPIO 引脚宏定义
#define  DEBUG_USART_GPIO_CLK           (RCC_APB2Periph_GPIOA)
#define  DEBUG_USART_GPIO_APBxClkCmd    RCC_APB2PeriphClockCmd

#define  DEBUG_USART_TX_GPIO_PORT       GPIOA   
#define  DEBUG_USART_TX_GPIO_PIN        GPIO_Pin_9
#define  DEBUG_USART_RX_GPIO_PORT       GPIOA
#define  DEBUG_USART_RX_GPIO_PIN        GPIO_Pin_10

#define  DEBUG_USART_IRQ                USART1_IRQn
#define  DEBUG_USART_IRQHandler         USART1_IRQHandler

void USART_Config(void);                                                                                          //配置串口
void Usart_SendByte( USART_TypeDef * pUSARTx, uint8_t ch);                               //发送一个字符
void Usart_SendString( USART_TypeDef * pUSARTx, char *str);                                //发送字符串
void Usart_SendHalfWord( USART_TypeDef * pUSARTx, uint16_t ch);                        //发送一个16位数
void Usart_SendArray( USART_TypeDef * pUSARTx, uint8_t *array, uint8_t num);        //发送一个数组


#endif /* __USART_H */

------------------------------------------------------------------------------------------------------------------------------

串口接受中断程序:
void DEBUG_USART_IRQHandler(void)
{
  uint8_t ucTemp;
        if(USART_GetITStatus(DEBUG_USARTx,USART_IT_RXNE)!=RESET)
        {               
                ucTemp = USART_ReceiveData(DEBUG_USARTx);
    USART_SendData(DEBUG_USARTx,ucTemp);   
        }         
}

USART.zip

5.98 MB, 下载次数: 8

完整程序

演示视频1.zip

6.71 MB, 下载次数: 8

视频1

演示视频2.zip

7.33 MB, 下载次数: 6

视频2

回复

使用道具 举报

 楼主| 发表于 2021-10-6 01:44:28 | 显示全部楼层
我刚刚换了个法子,因为我想知道是不是USB转TTL模块坏了,我就把RS232与USART1连一起了,相当于我电脑USB->RS232->串口1,结果现在接受正常了,能控制灯颜色了,但发送又不正常了。。搞不懂,求大佬指教
微信截图_20211006013807.png
2006014400.jpg
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-28 04:45 , Processed in 0.027084 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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