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

查看: 4643|回复: 5

STM32F103RET6串口收发一个字符,一直调不通,请教!急!谢谢!

[复制链接]

2

主题

6

回帖

0

蝴蝶豆

新手上路

最后登录
1970-1-1
发表于 2012-9-20 21:28:35 | 显示全部楼层 |阅读模式
 
/********************串口收发一个字符******************************/

/*******************************************************************************
* 文件名          : main.c
* 作者            : Losingamong
* 时间     : 08/08/2008
* 文件描述        : 主函数
********************************************************************************/
/* 头文件    ------------------------------------------------------------------*/
#include "stm32f10x_lib.h"
/* 自定义同义关键字    --------------------------------------------------------*/
/* 自定义参数宏        --------------------------------------------------------*/
#define Delay(n) while((n)--)
/* 自定义函数宏        --------------------------------------------------------*/
/* 自定义变量          --------------------------------------------------------*/
unsigned char c;

/* 自定义函数声明      --------------------------------------------------------*/
void RCC_Configuration(void);
void GPIO_Configuration(void);
void USART_Configuration(void);

/*******************************************************************************
* 函数名   : main
* 函数描述       : Main 函数
* 输入参数       : 无
* 输出结果       : 无
* 返回值         : 无
*******************************************************************************/
int main(void)
{
 vu32 n = 2000000;       //定义延时参数
   /* 设置系统时钟 */
   RCC_Configuration();   
   /* 设置GPIO端口 */
   GPIO_Configuration();
    
 /* 设置串口通讯 */
 USART_Configuration();
 USART_SendData(USART1, 1); //发送一位数据
 while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET){} //等待发送完毕
 while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET){} //等待接收完毕
 c= (USART_ReceiveData(USART1)); //接受一个字节
  while(1);
}

/*******************************************************************************
* 函数名 : RCC_Configuration
* 函数描述  : 设置系统各部分时钟
* 输入参数  : 无
* 输出结果  : 无
* 返回值    : 无
*******************************************************************************/
void RCC_Configuration(void)
{
 /* 定义枚举类型变量 HSEStartUpStatus */
 ErrorStatus HSEStartUpStatus;
   /* 复位系统时钟设置 */
   RCC_DeInit();
   /* 开启HSE */
   RCC_HSEConfig(RCC_HSE_ON);
   /* 等待HSE起振并稳定 */
   HSEStartUpStatus = RCC_WaitForHSEStartUp();
 
 /* 判断HSE起是否振成功,是则进入if()内部 */
   if(HSEStartUpStatus == SUCCESS)
   {
     /* 选择HCLK(AHB)时钟源为SYSCLK 1分频 */
     RCC_HCLKConfig(RCC_SYSCLK_Div1);
 
     /* 选择PCLK2时钟源为 HCLK(AHB) 1分频 */
     RCC_PCLK2Config(RCC_HCLK_Div1);
     /* 选择PCLK1时钟源为 HCLK(AHB) 2分频 */
     RCC_PCLK1Config(RCC_HCLK_Div2);
     /* 设置FLASH延时周期数为2 */
     FLASH_SetLatency(FLASH_Latency_2);
     /* 使能FLASH预取缓存 */
     FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
     /* 选择锁相环(PLL)时钟源为HSE 1分频,倍频数为9,则PLL输出频率为 8MHz * 9 = 72MHz */
     RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
     /* 使能PLL */
     RCC_PLLCmd(ENABLE);
     /* 等待PLL输出稳定 */
     while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
     /* 选择SYSCLK时钟源为PLL */
     RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
     /* 等待PLL成为SYSCLK时钟源 */
     while(RCC_GetSYSCLKSource() != 0x08);
   }
  
   /* 打开APB2总线上的GPIOA时钟 */
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);
}

/*******************************************************************************
* 函数名    : GPIO_Configuration
* 函数描述     : 设置各GPIO端口功能
* 输入参数      : 无
* 输出结果      : 无
* 返回值        : 无
*******************************************************************************/
void GPIO_Configuration(void)
{
   GPIO_InitTypeDef GPIO_InitStructure;
 
   /* 设置PA.2,PA.3为推挽输出,最大翻转频率为50MHz */
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3;
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
   GPIO_Init(GPIOA , &GPIO_InitStructure);  
      /* Configure Pb.8-11 as output push-pull */
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11;//选择PX.8-11
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //管脚频率为50MHZ
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //模式为推挽输出
   GPIO_Init(GPIOB, &GPIO_InitStructure);   //初始化GPIOB寄存器
   /* Configure USART1 Tx (PA.09) as alternate function push-pull */
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
   GPIO_Init(GPIOA, &GPIO_InitStructure);
   /* Configure USART1 Rx (PA.10) as input floating */
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
   GPIO_Init(GPIOA, &GPIO_InitStructure);
}

void USART_Configuration(void)
{
/* USART1 configuration ------------------------------------------------------*/
  /* 串口定义及通讯
      USART1 configured as follow:
        - BaudRate = 9600 baud 
        - Word Length = 8 Bits
        - Two Stop Bit
        - Odd parity
        - Hardware flow control disabled (RTS and CTS signals)
        - Receive and transmit enabled
        - USART Clock disabled
        - USART CPOL: Clock is active low
        - USART CPHA: Data is captured on the second edge
        - USART LastBit: The clock pulse of the last data bit is not output to
                         the SCLK pin
*/   
 
 USART_InitTypeDef USART_InitStructure;
 USART_ClockInitTypeDef USART_ClockInitStructure;
   USART_InitStructure.USART_BaudRate = 9600; // 设置了USART传输的波特率 ;
   USART_InitStructure.USART_WordLength = USART_WordLength_8b; // 8位数据 ;
   USART_InitStructure.USART_StopBits = USART_StopBits_1; // 在帧结尾传输1个停止位 ;
   USART_InitStructure.USART_Parity = USART_Parity_No;  // 无奇偶模式 ;
   USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_RTS_CTS;//USART_HardwareFlowControl_None; // 硬件流控制失能 ;
   USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;  // 接收发送使能 ;
   
 USART_ClockInitStructure.USART_Clock = USART_Clock_Disable; // 时钟低电平活动 ;
   USART_ClockInitStructure.USART_CPOL = USART_CPOL_Low;  // 时钟低电平 ;
   USART_ClockInitStructure.USART_CPHA = USART_CPHA_2Edge; // 时钟第二个边沿进行数据捕获 ;
  USART_ClockInitStructure.USART_LastBit = USART_LastBit_Disable; // 最后一位数据的时钟脉冲不从SCLK输出 ;

   USART_Init(USART1, &USART_InitStructure); // 初始化外设USART1寄存器 ;
 USART_ClockInit(USART1, &USART_ClockInitStructure);
 
   USART_ITConfig(USART1, USART_IT_TXE, ENABLE);  // 使能指定的USART1发送中断 ;
   USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); // 使能指定的USART1接收中断 ;
   USART_Cmd(USART1, ENABLE); // 使能USART1外设 ;
}
 
回复

使用道具 举报

134

主题

4489

回帖

239

蝴蝶豆

版主

最后登录
2020-12-9
发表于 2012-9-21 09:30:07 | 显示全部楼层

RE:STM32F103RET6串口收发一个字符,一直调不通,请教!急!谢谢!

没有开启串口的时钟。类似下面这一句。
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);
回复 支持 反对

使用道具 举报

2

主题

6

回帖

0

蝴蝶豆

新手上路

最后登录
1970-1-1
 楼主| 发表于 2012-9-21 09:35:31 | 显示全部楼层

回复:STM32F103RET6串口收发一个字符,一直调不通,请教!急!谢谢!

回复第 2 楼 于2012-09-21 09:30:07发表:
没有开启串口的时钟。类似下面这一句。
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);
 

开启了的呀,
上面有这一句的
   RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
     /* 等待PLL成为SYSCLK时钟源 */
     while(RCC_GetSYSCLKSource() != 0x08);
   }
  
   /* 打开APB2总线上的GPIOA时钟 */
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);
}

 
回复 支持 反对

使用道具 举报

2

主题

6

回帖

0

蝴蝶豆

新手上路

最后登录
1970-1-1
 楼主| 发表于 2012-9-21 11:37:49 | 显示全部楼层

回复:STM32F103RET6串口收发一个字符,一直调不通,请教!急!谢谢!

回复第 2 楼 于2012-09-21 09:30:07发表:
没有开启串口的时钟。类似下面这一句。
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);
 

   /* 打开APB2总线上的GPIOA时钟和串口时钟 */
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);
 
请问是改成这样吗?早上那个没有注意看的,但是开启了时钟中断好像还是一样不可以,不知道怎么回事的?
麻烦帮忙解答一下,谢谢!比较急的!!!
回复 支持 反对

使用道具 举报

134

主题

4489

回帖

239

蝴蝶豆

版主

最后登录
2020-12-9
发表于 2012-9-21 14:14:37 | 显示全部楼层

RE:STM32F103RET6串口收发一个字符,一直调不通,请教!急!谢谢!

先确认一下硬件,是否需要将串口的RX和TX交叉。再确认串口1用的是PD还是PA的引脚。
回复 支持 反对

使用道具 举报

2

主题

6

回帖

0

蝴蝶豆

新手上路

最后登录
1970-1-1
 楼主| 发表于 2012-9-21 14:36:35 | 显示全部楼层

回复:STM32F103RET6串口收发一个字符,一直调不通,请教!急!谢谢!

回复第 5 楼 于2012-09-21 14:14:37发表:
先确认一下硬件,是否需要将串口的RX和TX交叉。再确认串口1用的是PD还是PA的引脚。 

恩,之前确认了是PA9和PA10,也就是USART1的收和发,我用的串口下载了,串口收发两脚的电压也都是对的,说明硬件是没有问题的,只是我还没有搞懂这个收发一个字符,怎么写?但是按照网上的例程,还有看了一下固件函数库的说明,应该是没有错了的。至今还不清楚什么问题的???
不过还是很谢谢你!!!硬件都查了没有问题的。
回复 支持 反对

使用道具 举报

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