本帖最后由 tczdon 于 2013-6-1 16:20 编辑
#include "stm32f10x.h"
u8 TxData[] = "The string is transmit from STM32!";
u8 RxData[5];
u8 Rx_Counter=0; //对接收到得字符计数
/* 函数声明 */
void RCC_Configuration(void);
void NVIC_Configuration(void);
void USART_Configuration(void);
/**************************************** 主函数 *********************************************/
int main(void)
{
u8 i=0;
/* 初始化STM32:系统时钟配置(使用外部8MHz晶振,系统时钟倍频至72MHz等)*/
SystemInit();
RCC_Configuration(); //使能USART1的时钟、设置USART1复用端口
NVIC_Configuration(); //配置中断向量和优先级
USART_Configuration(); // 初始化USART1
/*启动时发送缓冲区中的预设数据*/
USART_ClearFlag(USART1, USART_FLAG_TC);
for(i=0;TxData!='\0';i++)//这里的发送字符串是正确的
{
USART_SendData(USART1, TxData);
while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);
}
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); //使能接收中断
while(Rx_Counter<5)
{
for(i=0; i<5; i++)//这里发送接收到的5个字符却有时正常有时乱码,不知是接收的问题还是发送的问题,望哪位大侠给个指示
{
USART_ClearFlag(USART1, USART_FLAG_TC);
USART_SendData(USART1 , RxData);
while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);
}
}
while(1);
}
/********************************GPIO初始化配置 **************************************/
void RCC_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/*分配时钟*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);
/*初始化GPIOA(PA10==RXD, PA9==TXD)*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 复用推挽输出模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; // 浮空输入模式
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
/***************************************** NVIC初始化 **************************************/
void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; //中断通道USART1中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //响应优先级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能USART1全局中断
NVIC_Init(&NVIC_InitStructure);
}
/******************************** USART1初始化配置 **************************************/
void USART_Configuration(void)
{
USART_InitTypeDef USART_InitStructure;
USART_ClockInitTypeDef USART_ClockInitStructure;
USART_StructInit(&USART_InitStructure);
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_Init(USART1, &USART_InitStructure);
USART_ClockStructInit(&USART_ClockInitStructure);
USART_ClockInit(USART1, &USART_ClockInitStructure);
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); //使能接收中断
USART_ClearFlag(USART1, USART_FLAG_TC); //清除发送完成标志位
USART_Cmd(USART1, ENABLE); //使能USART1
}
/********************************接收数据中断处理**************************************/
void USART1_IRQHandler(void)
{
u8 tmp;
if(USART_GetITStatus(USART1, USART_IT_RXNE)!=RESET)
{
tmp=USART_ReceiveData(USART1);
if((tmp==0x0d)||(tmp==0x0a))//去掉前面无用的字符
{
Rx_Counter=0;
USART_ClearITPendingBit(USART1,USART_IT_RXNE);
}
else
{
USART_ClearITPendingBit(USART1, USART_IT_RXNE); //清除接收中断标志位
RxData[Rx_Counter]=tmp; //接收字节送缓冲区
Rx_Counter++;
}
}
}
|