OpenEdv-开源电子网

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

新手刚学stm32,串口那里卡住了,望原子哥指教!

[复制链接]

1

主题

11

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2013-2-3
在线时间
4 小时
发表于 2014-2-14 02:00:03 | 显示全部楼层 |阅读模式
这是我的源代码,V3.5的库函数;不知道哪里出了问题,串口助手打印出来的都是乱码。求指教

#include"stm32f10x.h"
#include"stdio.h"


GPIO_InitTypeDef  GPIO_InitStruct;
USART_InitTypeDef USART_InitStruct;
USART_ClockInitTypeDef USART_ClockInitStruct;

#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)


int main()
{

GPIO_DeInit(GPIOA);
USART_DeInit(USART1);
//Pin9 发送
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA,&GPIO_InitStruct);
//Pin10 接收
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA,&GPIO_InitStruct);

USART_InitStruct.USART_BaudRate = 115200;
  USART_InitStruct.USART_WordLength = USART_WordLength_8b;
  USART_InitStruct.USART_StopBits = USART_StopBits_1;
  USART_InitStruct.USART_Parity = USART_Parity_No ;
  USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_Init(USART1, &USART_InitStruct);
USART_ClockInitStruct.USART_Clock = USART_Clock_Disable;
  USART_ClockInitStruct.USART_CPOL = USART_CPOL_Low;
  USART_ClockInitStruct.USART_CPHA = USART_CPHA_1Edge;
  USART_ClockInitStruct.USART_LastBit = USART_LastBit_Disable;
USART_ClockInit(USART1,&USART_ClockInitStruct);
USART_Cmd(USART1,ENABLE);
while(1)
{
printf("\n\r USART\n\r");

}
}

PUTCHAR_PROTOTYPE
{
/* Place your implementation of fputc here */
/* e.g. write a character to the USART */
USART_SendData(USART1, (uint8_t) ch);
 
/* Loop until the end of transmission */
while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)
{}

return ch;
}


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

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-2-14 08:45:36 | 显示全部楼层
回复【楼主位】kevin:
---------------------------------
1、你的波特率设置USART_InitStruct.USART_BaudRate = 115200;
2、你串口助手上的波特率也要设置成115200
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

39

主题

2026

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2020
金钱
2020
注册时间
2013-5-1
在线时间
87 小时
发表于 2014-2-14 10:35:17 | 显示全部楼层
USART1时钟没开吧
博观而约取,厚积而薄发。
回复 支持 反对

使用道具 举报

12

主题

77

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
352
金钱
352
注册时间
2014-1-22
在线时间
43 小时
发表于 2014-2-14 14:54:26 | 显示全部楼层
串口助手里面在编码的时候可能出现问题的,以前我连续发送0x54等数字显示出来的全是乱码,但是 事实上是正确的
任何一件事情,只要心甘情愿,总是能够变得简单。
回复 支持 反对

使用道具 举报

1

主题

11

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2013-2-3
在线时间
4 小时
 楼主| 发表于 2014-2-14 16:42:06 | 显示全部楼层
回复【2楼】Badu_Space:
---------------------------------
这个设置是对的,单步调试停在printf那里不走了,串口助手上也不显示,不知何故。
回复 支持 反对

使用道具 举报

1

主题

11

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2013-2-3
在线时间
4 小时
 楼主| 发表于 2014-2-14 16:47:21 | 显示全部楼层
回复【3楼】745021926:
---------------------------------
开了的,现在是直接没有发送任何数据了,郁闷啊。。。。
回复 支持 反对

使用道具 举报

1

主题

11

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2013-2-3
在线时间
4 小时
 楼主| 发表于 2014-2-14 16:49:09 | 显示全部楼层
回复【4楼】爱不孤单:

串口助手里面在编码的时候可能出现问题的,以前我连续发送0x54等数字显示出来的全是乱码,但是 事实上是正确的

---------------------------------
现在都打印不出来了,不知道哪里出来问题
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-2-14 16:53:55 | 显示全部楼层
回复【7楼】kevin:
---------------------------------
这是我的串口初始化代码,没有开接收功能,可以参考一下
void USARTx_Init(uint32_t bound)
{
    GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;

#ifdef EN_USART1_RX //如果使能了接收中断

USART1->CR1 |= 1 << 8; //PE中断使能
USART1->CR1 |= 1 << 5; //接收缓冲区非空中断使能

MY_NVIC_Init(3, 3, USART1_IRQn, NVIC_PriorityGroup_2); //中断分组2,最低优先级

#endif
 
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE); //使能USART1,GPIOA时钟

  USART_DeInit(USART1);  //复位串口1

 //USART1_TX   A.9
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
    GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化PA9
   
    //USART1_RX   A.10
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
    GPIO_Init(GPIOA, &GPIO_InitStructure);  //初始化PA10
  
//USART 初始化设置
USART_InitStructure.USART_BaudRate = bound; //设置波特率,一般设置为9600;
USART_InitStructure.USART_WordLength = USART_WordLength_8b; //字长为8位数据格式
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_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启中断
    USART_Cmd(USART1, ENABLE);                    //使能串口 
}
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

1

主题

11

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2013-2-3
在线时间
4 小时
 楼主| 发表于 2014-2-14 17:16:12 | 显示全部楼层
回复【楼主位】kevin:
--------------------------问题已解决,是硬件的问题。谢谢各位的好心帮忙!
回复 支持 反对

使用道具 举报

1

主题

11

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2013-2-3
在线时间
4 小时
 楼主| 发表于 2014-2-14 17:18:00 | 显示全部楼层
回复【8楼】Badu_Space:

回复【7楼】kevin:
---------------------------------
这是我的串口初始化代码,没有开接收功能,可以参考一下
void USARTx_Init(uint32_t bound)
{
    GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;

#ifdef EN_USART1_RX //如果使能了接收中断

USART1->CR1 |= 1 << 8; //PE中断使能
USART1->CR1 |= 1 << 5; //接收缓冲区非空中断使能

MY_NVIC_Init(3, 3, USART1_IRQn, NVIC_PriorityGroup_2); //中断分组2,最低优先级

......
---------------------------------
问题已解决,硬件问题。总之谢谢您!之前只是做的是串口打印,马上做串口中断。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-11 05:18

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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