stm32串口中断接收发送实验
{
u32i=0;
/*芯片配置初始化----------------------------------------------------------*/
RCC_Configuration();//复位和时钟控制配置
NVIC_Configuration();//嵌套中断向量控制器配置
GPIO_Configuration();//I/O配置
USART_Configuration();//串口配置
/*指示灯初始化------------------------------------------------------------*/
GPIO_SetBits(GPIOA,GPIO_Pin_12);//熄灭LED1
GPIO_SetBits(GPIOA,GPIO_Pin_15);//熄灭LED2
while(1)
{
i++;
if(500000==i)//LED1闪烁,表示正常。
{
GPIO_WriteBit(GPIOA,GPIO_Pin_12,(BitAction)(1-GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_12)));
i=0;
}
}
}
/******************************************************************************************
*函数名称:RCC_Configuration
*功能描述:
*参数:
*
*返回值:
*作者:
*创建日期:2013年5月2日
*全局变量:
*全局静态变量:
*局部静态变量:
******************************************************************************************/
voidRCC_Configuration(void)
{
/*RCCsystemreset(fordebugpurpose)*/
RCC_DeInit();//RCC系统初始化,设为默认值
/*EnableHSE*/
RCC_HSEConfig(RCC_HSE_ON);//使能外部晶振(8MHz),关闭旁路
/*WaittillHSEisready*/
HSEStartUpStatus=RCC_WaitForHSEStartUp();//等待外部高速时钟稳定
if(HSEStartUpStatus==SUCCESS)//时钟就绪成功
{
/*EnablePrefetchBuffer*/
/*AHB预分频系数不为1时,必须置预取缓冲区处于开启状态
应与闪存存储器的访问时间一起使用
激活和禁止预取模式时应该在禁止快速时钟时进行(关闭AHB的分频器)*/
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);//
/*HCLK=SYSCLK*/
RCC_HCLKConfig(RCC_SYSCLK_Div1);//SYSCLK不分频,作为AHB时钟(HCLK,闪存、SRAM等外设时钟设置):36M
/*PCLK2=HCLK*/
RCC_PCLK2Config(RCC_HCLK_Div1);//AHBCLK不分频,作为高速APB(APB2)时钟(PCLK2):36M
/*PCLK1=HCLK/2*/
RCC_PCLK1Config(RCC_HCLK_Div1);//AHBCLK二分频,作为低速APB(APB1)时钟(PCLK1):36M
/*ADCCLK=PCLK2/6*/
RCC_ADCCLKConfig(RCC_PCLK2_Div6);//PCLK26分频,作为ADC时钟(ADCCLK):6M
/*Flash2waitstate*/
/*(SYSCLK)频率与闪存访问时间的关系:
0等待周期,当0 1等待周期,当24MHz 2等待周期,当48MHz */ FLASH_SetLatency(FLASH_Latency_1);//设置1个等待周期 /*PLLCLK=8MHz/2*9=36MHz*/ RCC_PLLConfig(RCC_PLLSource_HSE_Div2,RCC_PLLMul_9);//外部时钟2分频后,9倍频(PLL),得36MHz /*EnablePLL*/ RCC_PLLCmd(ENABLE);//使能PLL电路 /*WaittillPLLisready*/ while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET)//等待PLL电路就绪 { } /*SelectPLLassystemclocksource*/ RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//选择PLL倍频时钟作为系统时钟(SYSCLK):36MHz /*WaittillPLLisusedassystemclocksource*/ while(RCC_GetSYSCLKSource()!=0x08)//等待PLL切换成系统时钟源 { } /*SelectHSEassystemclocksource*/ //RCC_SYSCLKConfig(RCC_SYSCLKSource_HSE);//选择外部晶振作为系统时钟源(SYSCLK) /*WaittillHSEisusedassystemclocksource*/ //while(RCC_GetSYSCLKSource()!=0x04)//等待HSE切换成系统时钟源,并作为输出时钟(该时钟可能会有毛刺,仅作调试) //{ //} } /*GPIOA、GPIOB、GPIOC、GPIOD、GPIOE、GPIOF、AFIO时钟使能*/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC |RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOE|RCC_APB2Periph_GPIOF|RCC_APB2Periph_AFIO,ENABLE); /*USART3Periphclockenable*/ RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);//USART3时钟使能(APB2) } /****************************************************************************************** *函数名称:NVIC_Configuraion *功能描述: *参数: * *返回值: *作者: *创建日期:2013年5月2日 *全局变量: *全局静态变量: *局部静态变量: ******************************************************************************************/ voidNVIC_Configuration(void) { NVIC_InitTypeDefNVIC_InitStructure; #ifdefVECT_TAB_RAM /*SettheVectorTablebaselocationat0x20000000*/ NVIC_SetVectorTable(NVIC_VectTab_RAM,0x0);//RAM #else/*VECT_TAB_FLASH*/ /*SettheVectorTablebaselocationat0x08000000*/ NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x0);//FLASH #endif NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//选择第2组为优先级分组方式:高2位指定抢占优先级,低2位指定响应优先级 /*enablinginterrupt*/ NVIC_InitStructure.NVIC_IRQChannel=USART3_IRQChannel;//USART中断 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;//占先级为0级,最高 NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;//响应级最高0 NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;//启动中断 NVIC_Init(&NVIC_InitStructure);//初始化嵌套向量中断控制器 } /****************************************************************************************** *函数名称:GPIO_Configuration *功能描述: *参数: * *返回值: *作者: *创建日期:2013年5月2日 *全局变量: *全局静态变量: *局部静态变量: ******************************************************************************************/ voidGPIO_Configuration(void) { GPIO_InitTypeDefGPIO_InitStructure; GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);//关掉JTAG,释放PA15,PB3,PB4 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_12|GPIO_Pin_15; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//推挽输出 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOA,&GPIO_InitStructure); /*ConfigureUSART3Tx(PB.10)asalternatefunctionpush-pull*/ GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOB,&GPIO_InitStructure); /*ConfigureUSART3Rx(PB.11)asinputfloating*/ GPIO_InitStructure.GPIO_Pin=GPIO_Pin_11; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOB,&GPIO_InitStructure);//RX初始化 } /****************************************************************************************** *函数名称:GPIO_Configuration *功能描述: *参数: * *返回值: *作者: *创建日期:2013年5月2日 *全局变量: *全局静态变量: *局部静态变量: ******************************************************************************************/ voidUSART_Configuration(void) { USART_InitTypeDefUSART_InitStructure; USART_InitStructure.USART_BaudRate=9600;//波特率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;//串口发送和接收模式 /*ConfigureUSART3basicandasynchronousparamters*/ USART_Init(USART3,&USART_InitStructure);//串口初始化 /*EnableUSART3*/ USART_Cmd(USART3,ENABLE);//指令打开 /*EnablesCOMtransmitinterrupt*/ USART_ITConfig(USART3,USART_IT_TC,ENABLE);//发送中断打开 /*EnablesCOMreceiveinterrupt*/ USART_ITConfig(USART3,USART_IT_RXNE,ENABLE);//接收中断打开 } voidDelay(vu32nCount) { for(;nCount!=0;nCount--); }
评论