stm32串口通信

//实现了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
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一枚努力的程序猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值