stm32串口通信

来源:互联网 发布:sql语句修改数据类型 编辑:程序博客网 时间:2024/06/05 22:24

//实现了stm32的串口通信,向stm32中发送数据,或者利用串口发送数据到stm32,其中应用了中断,到接收的数据完成了,发生中断,将数据发出!以回车为结束,每次接收一个字节,放到全局变量USART_RX_BUF中。

#include "stm32f4xx.h"

#include "stdio.h"

#define USART_REC_LEN   200       
#define EN_USART1_RX  1        
 

 u8  USART_RX_BUF[USART_REC_LEN];       

 u16 USART_RX_STA;                


void delay(void){
int i,j;
for(i=0;i<1000;i++)
for(j=0;j<10000;j++)
        {}
}
void uart1_init(u32 bound);
void NVIC_init(void );
void USART1_IRQHandler(void );

int main(void)

u8 len,i;
u16 times=0;
USART_RX_STA=0;
delay();
                                                                   
uart1_init(115200); 
  NVIC_init();          
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);                  


while(1){
if((USART_RX_STA&0X8000)){           

  delay( );
len=USART_RX_STA&0x3fff;
for(i=0;i<len;i++){
USART_SendData( USART1, USART_RX_BUF[i]);
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);
}
USART_RX_STA=0;
}else{

USART_SendData( USART1, 'a ');  // 在没有数据接受到时,一直发送,表明程序在运行
delay( );

times++;
if(times%5000==0)
delay();
delay();
}
}
}


void uart1_init(u32 bound){

GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;


RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); 
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
 
GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1); 
GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1); 

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10; 
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; 
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; 
GPIO_Init(GPIOA,&GPIO_InitStructure); 




USART_InitStructure.USART_BaudRate = 115200;
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);  
}




void NVIC_init(void){
NVIC_InitTypeDef NVIC_InitStruct;

USART_ITConfig( USART1, USART_IT_RXNE, ENABLE);  

NVIC_InitStruct.NVIC_IRQChannel=USART1_IRQn;
NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=2;
NVIC_InitStruct.NVIC_IRQChannelSubPriority=2;


NVIC_Init(&NVIC_InitStruct);
}



void USART1_IRQHandler(void ){  
   u8 Res;
if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)
{
Res=USART_ReceiveData(USART1);
if((USART_RX_STA&0x8000)==0){ 
if(USART_RX_STA&0x4000){
if(Res!=0x0a)USART_RX_STA=0;
else USART_RX_STA|=0x8000;
}else{
if(Res==0x0d)USART_RX_STA|=0X4000;
else{

USART_RX_BUF[USART_RX_STA&0x3FFF]=Res;
USART_RX_STA++;
if(USART_RX_STA>(USART_REC_LEN-1)) USART_RX_STA=0;
}
}
}
}
}

0 0
原创粉丝点击