新手学习之路----使用STM32的USART与PC进行数据通信
时间:10-02
整理:3721RD
点击:
//题目:使用STM32的USART与PC进行数据通信,使用PC向STM32的USART发送一个字节,而后STM32将此数据传回给PC端,本程序算是成功了,但是有瑕疵
//问题1:..\user\main.c(95): warning: #177-D: variable "USART_ClockInitStructure" was declared but never referenced
//问题2:调试助手发送数据,但是调试助手窗口收不到数据,要关电源,再开启,调试助手窗口才收到数据
//问题3:..\user\main.c(107): warning: #1-D: last line of file ends without a newline
#include"stm32f10x_lib.h"
/*自定义同义关键字
自定义参数宏
自定义函数宏
自定义变量
自定义函数声明*/
void RCC_Configuration(void);
void GPIO_Configuration(void);
void USART_Configuration(void);
/***********************
*函数名 :main *输出参数:无
*函数描述 ;主函数 *返回值 ;无
输入参数 ;无
*************************/
int main(void)
{
vu16 i=0;
RCC_Configuration();//设置系统时钟
GPIO_Configuration();//设置GPIO端口
USART_Configuration();//设置USART
while(1)
{
/*等待USART1接收数据完毕*/
if(USART_GetFlagStatus(USART1,USART_IT_RXNE)==SET)
{
/*向串口发送接收到的数据*/
USART_SendData(USART1,USART_ReceiveData(USART1));
/*短暂延迟,保证首发稳定*/
for(i=0;i<500;i++);
}
}
}
/***********************************
*函数名 ;RCC_Configuration *输出结果;无
*函数描述 ;设置系统各部分时钟 *返回值 ;无
*输入参数 ;无
*********************************************/
void RCC_Configuration(void)
{
ErrorStatus HSEStartUpStatus; //定义枚举类型变量HSEStartUpStatus
RCC_DeInit(); //复位系统时钟设置
RCC_HSEConfig(RCC_HSE_ON); //开启HSE
HSEStartUpStatus = RCC_WaitForHSEStartUp(); //等待HSE起振并稳定
/*判断HSE起振是否成功,是则进入if()内部*/
if(HSEStartUpStatus==SUCCESS)
{
RCC_HCLKConfig(RCC_SYSCLK_Div1); //选择HCLK(AHB)时钟源为SYSCLK 1分频
RCC_PCLK2Config(RCC_HCLK_Div1); //选择PCLK2时钟源为HCLK(AHB)1分频
RCC_PCLK1Config(RCC_HCLK_Div2); //选择PCLK1时钟源为HCLK(AHB)2分频
FLASH_SetLatency(FLASH_Latency_2); //设置FLASH延时周期数为2
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);// 使能Flash预取缓存
//选择PLL时钟源为HSE 1分频,倍频数为9,则PLL=8MHZ*9=72MHZ
RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);
RCC_PLLCmd(ENABLE);/*使能PLL*/
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET);//等待PLL输出稳定
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //选着SYSCLK时钟为PLL
while(RCC_GetSYSCLKSource()!=0x08);
}
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA,ENABLE);
}
/***************************************
*函数名 ;GPIO_C onfiguration *输出结果;无
*函数描述 ;设置各GPIO端口功能 *返回值 ;无
*输入参数 ;无
********************/
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/*设置USART的TX脚(PA.9)为第二功能推挽输出模式*/
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);
/*设置USART1的RX脚PA.10为浮空输入脚*/
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA,&GPIO_InitStructure);
}
/**********************************
*函数名 ;USART_Configuration *输出结果;无
*函数描述 ;设置 USART1 *返回值 ;无
输入参数 ;无
*******************************/
void USART_Configuration(void)
{
/*定义USART初始化结构体 USART_ InitStructure*/
USART_InitTypeDef USART_InitStructure;
/*定义USART初始化结构体USART_ClockInitStructure*/
USART_ClockInitTypeDef USART_ClockInitStructure;
/*波特率为9600,8位数据长度,1个停止位,无校验禁用硬件流控制,禁止USART时钟*/
/*时钟极性低,在第二个边沿捕获数据,最后一位数据的时钟脉冲不重SCLK输出*/
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_Cmd(USART1,ENABLE);
/*使能USART1*/
}
//问题1:..\user\main.c(95): warning: #177-D: variable "USART_ClockInitStructure" was declared but never referenced
//问题2:调试助手发送数据,但是调试助手窗口收不到数据,要关电源,再开启,调试助手窗口才收到数据
//问题3:..\user\main.c(107): warning: #1-D: last line of file ends without a newline
#include"stm32f10x_lib.h"
/*自定义同义关键字
自定义参数宏
自定义函数宏
自定义变量
自定义函数声明*/
void RCC_Configuration(void);
void GPIO_Configuration(void);
void USART_Configuration(void);
/***********************
*函数名 :main *输出参数:无
*函数描述 ;主函数 *返回值 ;无
输入参数 ;无
*************************/
int main(void)
{
vu16 i=0;
RCC_Configuration();//设置系统时钟
GPIO_Configuration();//设置GPIO端口
USART_Configuration();//设置USART
while(1)
{
/*等待USART1接收数据完毕*/
if(USART_GetFlagStatus(USART1,USART_IT_RXNE)==SET)
{
/*向串口发送接收到的数据*/
USART_SendData(USART1,USART_ReceiveData(USART1));
/*短暂延迟,保证首发稳定*/
for(i=0;i<500;i++);
}
}
}
/***********************************
*函数名 ;RCC_Configuration *输出结果;无
*函数描述 ;设置系统各部分时钟 *返回值 ;无
*输入参数 ;无
*********************************************/
void RCC_Configuration(void)
{
ErrorStatus HSEStartUpStatus; //定义枚举类型变量HSEStartUpStatus
RCC_DeInit(); //复位系统时钟设置
RCC_HSEConfig(RCC_HSE_ON); //开启HSE
HSEStartUpStatus = RCC_WaitForHSEStartUp(); //等待HSE起振并稳定
/*判断HSE起振是否成功,是则进入if()内部*/
if(HSEStartUpStatus==SUCCESS)
{
RCC_HCLKConfig(RCC_SYSCLK_Div1); //选择HCLK(AHB)时钟源为SYSCLK 1分频
RCC_PCLK2Config(RCC_HCLK_Div1); //选择PCLK2时钟源为HCLK(AHB)1分频
RCC_PCLK1Config(RCC_HCLK_Div2); //选择PCLK1时钟源为HCLK(AHB)2分频
FLASH_SetLatency(FLASH_Latency_2); //设置FLASH延时周期数为2
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);// 使能Flash预取缓存
//选择PLL时钟源为HSE 1分频,倍频数为9,则PLL=8MHZ*9=72MHZ
RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);
RCC_PLLCmd(ENABLE);/*使能PLL*/
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET);//等待PLL输出稳定
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //选着SYSCLK时钟为PLL
while(RCC_GetSYSCLKSource()!=0x08);
}
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA,ENABLE);
}
/***************************************
*函数名 ;GPIO_C onfiguration *输出结果;无
*函数描述 ;设置各GPIO端口功能 *返回值 ;无
*输入参数 ;无
********************/
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/*设置USART的TX脚(PA.9)为第二功能推挽输出模式*/
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);
/*设置USART1的RX脚PA.10为浮空输入脚*/
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA,&GPIO_InitStructure);
}
/**********************************
*函数名 ;USART_Configuration *输出结果;无
*函数描述 ;设置 USART1 *返回值 ;无
输入参数 ;无
*******************************/
void USART_Configuration(void)
{
/*定义USART初始化结构体 USART_ InitStructure*/
USART_InitTypeDef USART_InitStructure;
/*定义USART初始化结构体USART_ClockInitStructure*/
USART_ClockInitTypeDef USART_ClockInitStructure;
/*波特率为9600,8位数据长度,1个停止位,无校验禁用硬件流控制,禁止USART时钟*/
/*时钟极性低,在第二个边沿捕获数据,最后一位数据的时钟脉冲不重SCLK输出*/
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_Cmd(USART1,ENABLE);
/*使能USART1*/
}
疯狂回帖 只为升级
问题一:声明了没有使用。
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA,ENABLE);这个不是设置时钟了么?那个结构体干嘛的?
问题三:最后一行敲个回车就好
大神。我是新手,我也是在模仿书的程序的,然后下载板子再调试修改一下的,,
书是 STM32自学笔记 2012 第131页。
谢谢了
不错的文件,值得收藏