打印
[STM32F1]

STM32 串口突然坏了

[复制链接]
4961|22
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yuliang33|  楼主 | 2014-5-20 11:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
正在用电脑采集STM32串口1的数据,更新了下程序(其他芯片驱动),然后串口数据采集不上来,但电脑上发送的数据STM32能接受到,更新回原来的程序也不行,波特率是115200,STM32能接受到数据,单发送不了。
后在send_UART1_string( u8 *str, u16 strlen);函数后加延时,试了下大概100us,,数据能正常发送,
这个是什么原因?
//*******************************************************************************
// 函数名称    : UART1_PutChar()
// 功能描述    : 串口1发送数据函数.
// 输入        : u8 ch 要发送的数据
// 输出        : None
// 返回        : None
//******************************************************************************
void send_UART1_one(u8 ch)
{
  USART_SendData(USART1, ch);
  while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);//等待数据发送完毕
}

//***************************************************************************                  
// 函数原型    : void send_string_com( u8 *str, u16 strlen)            
// 功    能    : 串口1发送字符串函数。
// 输入        : u8 *str 要发送的数据 ,u16 strlen 数组长度
// 输出        : None
// 返回        : None                                         
//***************************************************************************
void send_UART1_string( u8 *str, u16 strlen)
{
        unsigned int k= 0 ;

        do
        {
                send_UART1_one(*str);
                str++;
                k++;
//                Delayus(100);
        } while (k < strlen);
}
沙发
mmuuss586| | 2014-5-20 12:42 | 只看该作者

看了这2段程序没啥问题啊;
要不你再焊块板子试下;

使用特权

评论回复
板凳
icecut| | 2014-5-20 13:14 | 只看该作者
示波器看波形

使用特权

评论回复
地板
yuliang33|  楼主 | 2014-5-20 13:39 | 只看该作者
mmuuss586 发表于 2014-5-20 12:42
看了这2段程序没啥问题啊;
要不你再焊块板子试下;

程序里我三个串口都初始化了,现在用电脑来采集数据,结果都有这种问题,”能接受,不能发送“,我猜测会不会是无意间程序里改了个参数,你看有没有这种可能?

使用特权

评论回复
5
mmuuss586| | 2014-5-20 13:48 | 只看该作者
yuliang33 发表于 2014-5-20 13:39
程序里我三个串口都初始化了,现在用电脑来采集数据,结果都有这种问题,”能接受,不能发送“,我猜测会 ...

有可能的;
用官方的程序,稍微改下,用串口调试助手测试下,有没有问题;
再仔细找哪里改了,看串口相关的寄存器;

使用特权

评论回复
6
yuliang33|  楼主 | 2014-5-20 13:50 | 只看该作者
icecut 发表于 2014-5-20 13:14
示波器看波形

STM32 比如实际发送“01 02 03 04 05” 我串口接收到的数据在是“01 05”,“02 05”,“03 05”,“04 05”,“05”,最后为数据必有,示波器显示也就这几位发送出来

使用特权

评论回复
7
airwill| | 2014-5-20 14:04 | 只看该作者
"在send_UART1_string( u8 *str, u16 strlen);函数后加延时,试了下大概100us,,数据能正常发送,"
这个是什么原因?

从现象看, 好象变成了半双工方式了. 我觉得串口没有坏, 是不是串口的设置有错误?

使用特权

评论回复
8
yuliang33|  楼主 | 2014-5-20 14:34 | 只看该作者
airwill 发表于 2014-5-20 14:04
"在send_UART1_string( u8 *str, u16 strlen);函数后加延时,试了下大概100us,,数据能正常发送,"
这 ...

从以前能用的程序上拷贝了个串口初始化程序,试了还是一样, 奇怪的是三个串口都有这问题

使用特权

评论回复
9
yuliang33|  楼主 | 2014-5-20 14:35 | 只看该作者
void UART_Init(void)
{
  USART_InitTypeDef USART_InitStructure;
  NVIC_InitTypeDef NVIC_InitStructure;
    //使能串口1时钟
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
  

//******************************************************************************
//    串口1参数初始化定义部分,串口1参数为115200 , 8 ,1 ,N  接收中断方式
//******************************************************************************  
  USART_InitStructure.USART_BaudRate = 115200; //设定传输速率
  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);  //初始化串口1
  
  USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);  //使能串口1接收中断
  
  USART_Cmd(USART1, ENABLE);  //使能串口1
  
   //使能串口1中断,
  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQChannel;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);

  
//******************************************************************************
//  串口1所使用管脚输出输入定义
//******************************************************************************
  
  // 定义UART1 TX (PA.09)脚为复用推挽输出
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;         //IO口的第九脚
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;   //IO口复用推挽输出
  GPIO_Init(GPIOA, &GPIO_InitStructure);            //初始化串口1输出IO口

  // 定义 USART1 Rx (PA.10)为悬空输入
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;           //IO口的第十脚
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//IO口悬空输入
  GPIO_Init(GPIOA, &GPIO_InitStructure);               //初始化串口1输入IO口


}

使用特权

评论回复
10
yuliang33|  楼主 | 2014-5-20 15:54 | 只看该作者
不是配置问题,有问题的程序中,注释所有其他调用函数、初始化函数,就剩下以下部分,不开任何中断
int main(void)
{
        u8 ab[8] = {1,2,3,4,5,6,7,8};
        RCC_Configuration();   //配置系统时钟,设置系统时钟为72M

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE); //打开外设A的时钟
        UART_Init();
        while (1)
        {
                send_UART1_string(ab,8);                                                                                                                                                      
                DelayMs(10);                                                                                               
        }
}
测试 问题依旧,
将这部分程序复制到新工程中,测试可以。

使用特权

评论回复
11
icecut| | 2014-5-20 16:05 | 只看该作者
本帖最后由 icecut 于 2014-5-20 16:07 编辑
yuliang33 发表于 2014-5-20 15:54
不是配置问题,有问题的程序中,注释所有其他调用函数、初始化函数,就剩下以下部分,不开任何中断
int mai ...

单步调试看汇编,看串口寄存器写一个数的时候,示波器测试出来啥

使用特权

评论回复
12
yuliang33|  楼主 | 2014-5-20 16:06 | 只看该作者
问题解决,粗心了,程序移植的时候多加了下面这条
#define RESET        0x1e   

使用特权

评论回复
13
icecut| | 2014-5-20 16:08 | 只看该作者
yuliang33 发表于 2014-5-20 16:06
问题解决,粗心了,程序移植的时候多加了下面这条
#define RESET        0x1e    ...

1e是啥意思?
要么死循环要么不循环...

使用特权

评论回复
14
jjjkkk00| | 2014-5-20 16:52 | 只看该作者
没看明白LZ的
#define RESET        0x1e
是怎么回事?

使用特权

评论回复
15
sfesdm| | 2014-5-20 17:12 | 只看该作者
路过。

使用特权

评论回复
16
guangbiao| | 2014-5-20 17:36 | 只看该作者

使用特权

评论回复
17
dzguang| | 2014-5-20 18:07 | 只看该作者
本帖最后由 dzguang 于 2014-5-20 18:10 编辑

算了,还是回复一下吧,将你的代码修改一下就应该OK了
void send_UART1_one(u8 ch)
{
  USART_SendData(USART1, ch);
  while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);//等待数据发送完毕
}

使用特权

评论回复
18
通宵敲代码| | 2014-5-20 19:24 | 只看该作者
贺电,希望楼主在点解决!

使用特权

评论回复
19
yuliang33|  楼主 | 2014-5-21 09:16 | 只看该作者
库函数中有定义这一条 typedef enum {RESET = 0, SET = !RESET} FlagStatus, ITStatus;
但我在驱动中又加了  #define RESET        0x1e   
重复定义了

使用特权

评论回复
20
飞言走笔| | 2014-5-21 09:30 | 只看该作者
yuliang33 发表于 2014-5-21 09:16
库函数中有定义这一条 typedef enum {RESET = 0, SET = !RESET} FlagStatus, ITStatus;
但我在驱动中又加了 ...

就是您的宏定义一不小心跟库里面的重复了呗?

使用特权

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

本版积分规则

11

主题

83

帖子

2

粉丝