|
大家来看看STM32的串口程序,不知道哪里错了,望高手指点一二、、、
[复制链接]
#include"stm32f10x.h"
#include"delay.h"
void RCC_config(void);
void USART_Config(void);
void USART_GPIOInit(void);
void Put_String(u8 *p);
int main()
{
RCC_config();
USART_GPIOInit();
USART_Config();
Put_String("String");
while(1)
{
while(1)
{
Put_String("String");
if(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == SET)
{
USART_SendData(USART1, USART_ReceiveData(USART1));
}
}
}
}
/**********************************
函数名称:RCC_config(void)
函数功能:实现系统时钟的初始化
入口参数:无
出口参数:无
时间 :11.12.20
***********************************/
//void RCC_config(void)
//{
// ErrorStatus HSEStartUpStatus;
//RCC_DeInit();
//RCC_HSEConfig(RCC_HSE_ON);
//HSEStartUpStatus=RCC_WaitForHSEStartUp();
//if(HSEStartUpStatus==SUCCESS)
// {
// RCC_HCLKConfig(RCC_SYSCLK_Div1);
// RCC_PCLK2Config(RCC_HCLK_Div1);
//RCC_PCLK1Config(RCC_HCLK_Div2);
//RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);
//RCC_PLLCmd(ENABLE);
//while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET);
// RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
// while(RCC_GetSYSCLKSource()!=0x08);
//}
//}
/*************************************************
函数: void RCC_Config(void)
功能: 配置系统时钟
参数: 无
返回: 无
**************************************************/
void RCC_config(void)
{
ErrorStatus HSEStartUpStatus;//定义外部高速晶体启动状态枚举变量
RCC_DeInit();//复位RCC外部设备寄存器到默认值
RCC_HSEConfig(RCC_HSE_ON); //打开外部高速晶振
HSEStartUpStatus = RCC_WaitForHSEStartUp();//等待外部高速时钟准备好
if(HSEStartUpStatus == SUCCESS)//外部高速时钟已经准别好
{
RCC_HCLKConfig(RCC_SYSCLK_Div1);//配置AHB(HCLK)时钟等于==SYSCLK
RCC_PCLK2Config(RCC_HCLK_Div1); //配置APB2(PCLK2)钟==AHB时钟
RCC_PCLK1Config(RCC_HCLK_Div2);//配置APB1(PCLK1)钟==AHB1/2时钟
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
//配置PLL时钟 == 外部高速晶体时钟*9
RCC_PLLCmd(ENABLE);//使能PLL时钟
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) //等待PLL时钟就绪
{
}
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//配置系统时钟 = PLL时钟
while(RCC_GetSYSCLKSource() != 0x08) //检查PLL时钟是否作为系统时钟
{
}
}
//RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
//打开GPIOD和AFIO时钟
//RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);//使能串口2时钟
}
/*************************************
函数名称:
函数功能:
入口参数:
出口参数:
时间:
**************************************/
void USART_Config(void)
{
USART_InitTypeDef USART_InitStructure;
USART_ClockInitTypeDef USART_ClockInitStructure;
//USART_DeInit(USART1);
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_Mode = USART_Mode_Tx|USART_Mode_Rx;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
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;
USART_Init(USART1,&USART_InitStructure);
USART_ClockInit(USART1, &USART_ClockInitStructure);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_AFIO,ENABLE);
USART_Cmd(USART1,ENABLE);
}
void USART_GPIOInit(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
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);
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_10;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA,&GPIO_InitStruct);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
}
void Put_String(u8 *p)
{
while(*p)
{
USART_SendData(USART1, *p++);
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET)
{
}
}
}
|
|