經過調試在stm32F101CBT6中實現通信。注意還要配一個TTL轉usb接口,才能進行通信。實現字符串回發
#include"stm32f10x_it.h"
#include "stm32f10x_conf.h"
void RCC_Configuration(void); //時鐘配置
void USART_Configuration(void); //定義串口初始化函數
void NVIC_Configuration( void);
void Uart1_PutChar(u8 ch);
void Uart1_PutString(u8* buf , u8 len);
void GPIO1_Configuration(void);
void GPIO_Configuration(void);
int USART_RX_BUF[64]=0;
int USART_RX_STA=0;
void RCC_Configuration(void)
{
ErrorStatusHSEStartUpStatus;
//使能外部晶振
RCC_HSEConfig(RCC_HSE_ON);
//等待外部晶振穩定
HSEStartUpStatus =RCC_WaitForHSEStartUp();
//如果外部晶振啟動成功,則進行下一步操作
if(HSEStartUpStatus==SUCCESS)
{
//設置HCLK(AHB時鐘)=SYSCLK
RCC_HCLKConfig(RCC_SYSCLK_Div1);
//PCLK1(APB1) = HCLK/2
RCC_PCLK1Config(RCC_HCLK_Div2);
//PCLK2(APB2) = HCLK
RCC_PCLK2Config(RCC_HCLK_Div1);
RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_4);
//啟動PLL
RCC_PLLCmd(ENABLE);
//等待PLL穩定
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) ==RESET);
//系統時鐘SYSCLK來自PLL輸出
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
//切換時鐘后等待系統時鐘穩定
while(RCC_GetSYSCLKSource()!=0x08);
}
//RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
//RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2 ,ENABLE);
}
int main(void)
{
int i;
u8 len;
RCC_Configuration();
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA |
RCC_APB2Periph_AFIO, ENABLE);//使能各部分時鐘
//NVIC_Configuration(); //串口中斷配置
//RCC中打開相應串口
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2 ,ENABLE);
GPIO_Configuration();
//串口1的管腳初始化
GPIO1_Configuration();
NVIC_Configuration();
USART_Configuration();
while (1)
{
GPIO_SetBits(GPIOA,GPIO_Pin_8) ;
GPIO_SetBits(GPIOA,GPIO_Pin_11) ;
GPIO_SetBits(GPIOA,GPIO_Pin_15) ;
if(USART_RX_STA&0x80)
{
len=USART_RX_STA&0x3f;//得到此次接收到的數據長度
USART2->DR=len;
while(USART_GetFlagStatus(USART2,USART_FLAG_TC) == RESET);
for(i=0;i
{USART2->DR=USART_RX_BUF[i];
while(USART_GetFlagStatus(USART2,USART_FLAG_TC) == RESET);//等待發送結束}
}
USART_RX_STA=0;
}
for(i=0;i<1000000;i++);
GPIO_ResetBits(GPIOA,GPIO_Pin_11);
GPIO_ResetBits(GPIOA,GPIO_Pin_15);
for(i=0;i<1000000;i++);
}
}
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8|GPIO_Pin_11|GPIO_Pin_15;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_Init(GPIOA,&GPIO_InitStructure);
}
voidGPIO1_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //管腳2
GPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode =GPIO_Mode_AF_PP; //復用推挽輸出
GPIO_Init(GPIOA,&GPIO_InitStructure); //TX初始化
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; //管腳3
GPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IN_FLOATING; //浮空輸入
GPIO_Init(GPIOA,&GPIO_InitStructure); //RX初始化
}
void USART_Configuration(void)//串口初始化函數
{
USART_ClockInitTypeDefUSART_ClockInitStructure;
//串口參數初始化
USART_InitTypeDef USART_InitStructure;//串口設置恢復默認參數
//初始化參數設置
USART_InitStructure.USART_BaudRate = 9600;//波特率9600
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_None;//無流控制
USART_InitStructure.USART_Mode =USART_Mode_Rx | USART_Mode_Tx;//打開Rx接收和Tx發送功能
USART_Init(USART2,&USART_InitStructure); //初始化
//USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//使能接受中斷,在接受移位 寄存器中有數據是產生
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_ClockInit(USART2,&USART_ClockInitStructure);
USART_Cmd(USART2,ENABLE); //啟動串口
USART_ITConfig(USART2,USART_IT_RXNE, ENABLE);
}
void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);//選擇分組方式0
NVIC_InitStructure.NVIC_IRQChannel =USART2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd =ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
在stm32f10x_it.c
void USART2_IRQHandler(void); //放在頭文件里面也可以
extern intUSART_RX_BUF[64];//聲明全局變量,此處不能夠賦值
extern int USART_RX_STA;//聲明全局變量,此處不能夠賦值
void USART2_IRQHandler(void)
{
unsigned intres;
if(USART_GetFlagStatus(USART2,USART_IT_RXNE)==SET)
{
res =USART_ReceiveData(USART2);
if((USART_RX_STA&0x80)==0)//接收未完成
{
USART_RX_BUF[USART_RX_STA]=res;
USART_RX_STA++;
if(USART_RX_STA>63)
USART_RX_STA=0;
if(res=='#')
USART_RX_STA|=0x80;
}
}
if(USART_GetITStatus(USART2, USART_IT_RXNE) !=RESET)
{
USART_ClearITPendingBit(USART2,USART_IT_RXNE);
}
}
|