STM32的usart2串口调试

 先是参考 http://wenku.baidu.com/view/78f6b1350b4c2e3f572763e9.html调通了 usart1

然后将程序进行修改,对Usart2进行配置,配置完了之后,程序还是没有正确,然后在void GPIO_cfg();函数中添加一句 

GPIO_PinRemapConfig(GPIO_Remap_USART2, ENABLE);

最后程序如下,

#include "stm32f10x_lib.h"

 

FlagStatus RX_status;
FlagStatus Tx_status;

 

void RCC_cfg(void);

void GPIO_cfg(void);

void USART_cfg(void);

void NVIC_cfg(void);

unsigned char Rxbuf[20];

int index_send,index_rev;

u8 flag;

 

 

int main()

{

       int i;



       unsigned char TxBuf1[] = "Welcome to my STM32!I'm idiot!";

	   index_send = 0;
	   index_rev = 0;
	   flag = 0;

       RCC_cfg();

       GPIO_cfg();

       NVIC_cfg();

       USART_cfg();

 

       //清除标志位,否则第1位数据会丢失

       USART_ClearFlag(USART2,USART_FLAG_TC);

 

       //发送数据

       //PB5的作用是显示正在发送数据

       //当有数据在发送的时候,PB5会亮

       for( i=0;TxBuf1[i]!='\0';i++)

       {

              USART_SendData(USART2,TxBuf1[i]);

              GPIO_SetBits(GPIOB,GPIO_Pin_5);

              //等待数据发送完毕

              while(USART_GetFlagStatus(USART2, USART_FLAG_TC)==RESET);

              GPIO_ResetBits(GPIOB,GPIO_Pin_5);

       }

 
       while(1)
	   {
	       
	   }

 

}

 

 

//RCC时钟配置

void RCC_cfg()

{
      

       //将RCC寄存器重新设置为默认值

       RCC_DeInit();

         //打开GPIO时钟,复用功能,串口1的时钟

         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOD | RCC_APB2Periph_AFIO, ENABLE);
		 RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
}

 

//IO口配置

void GPIO_cfg()

{

       GPIO_InitTypeDef GPIO_InitStructure;

 

       //PAD5作为US2的TX端,打开复用,负责发送数据

       GPIO_PinRemapConfig(GPIO_Remap_USART2, ENABLE);
	   
	   GPIO_StructInit(&GPIO_InitStructure);

       GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;

       GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

       GPIO_Init(GPIOD , &GPIO_InitStructure);

 

       //PD6作为US2的RX端,负责接收数据

       GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;

       GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

       GPIO_Init(GPIOD, &GPIO_InitStructure);

 

       //LED显示串口正在发送/接收数据

       GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;

       GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

       GPIO_Init(GPIOB, &GPIO_InitStructure);

}

 

//串口初始化

void USART_cfg()

{

       USART_InitTypeDef USART_InitStructure;

       //将结构体设置为缺省状态

       USART_StructInit(&USART_InitStructure);

    //波特率设置为115200

       USART_InitStructure.USART_BaudRate = 115200;

       //一帧数据的宽度设置为8bits

       USART_InitStructure.USART_WordLength = USART_WordLength_8b;

       //在帧结尾传输1个停止位

       USART_InitStructure.USART_StopBits = USART_StopBits_1;

       //奇偶失能模式,无奇偶校验

       USART_InitStructure.USART_Parity = USART_Parity_No;

       //发送/接收使能

       USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

       //硬件流控制失能

       USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;

       //设置串口2

       USART_Init(USART2, &USART_InitStructure);

      

       //打开串口2的中断响应函数,接收中断

       USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);

       //打开串口2

       USART_Cmd(USART2, ENABLE);

}

 

//配置中断

void NVIC_cfg()

{

        NVIC_InitTypeDef NVIC_InitStructure;

        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);                                               //选择中断分组2

        

        

        NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQChannel;                              //选择串口2中断

        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;                                 //抢占式中断优先级设置为0

        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;                                            //响应式中断优先级设置为0

        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                                 //使能中断

        NVIC_Init(&NVIC_InitStructure);

}

 
void USART2_IRQHandler(void)

{
       GPIO_SetBits(GPIOB, GPIO_Pin_5);
       //确认是否接收到数据

       RX_status = USART_GetFlagStatus(USART2, USART_FLAG_RXNE);
      Tx_status = USART_GetFlagStatus(USART2, USART_FLAG_TC);

       //接收到数据
	  
      if(RX_status == SET)
	  {
              flag = 1;
	   //读出数据
	     Rxbuf[index_rev] = USART_ReceiveData(USART2);
	    index_rev = index_rev + 1;
	    if(index_rev == 20)
	       index_rev = 0;
	  }

}

以上程序,编译好,下载到芯片中,运行起来,在超级终端设置好波特率,位数等,可以看到Welcome to my STM32! I'm idiot!

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值