OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 1647|回复: 3

通过原子探索者开发板串口1接收数据,串口2发送所接收的数据。不知道为啥,无法实现这个功能。

[复制链接]

7

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
152
金钱
152
注册时间
2015-7-20
在线时间
19 小时
发表于 2017-3-19 21:01:46 | 显示全部楼层 |阅读模式
1金钱
[mw_shl_code=c,true]#include "stm32f4xx.h"
#include "usart.h"
#include "delay.h"
#include "led.h"


//接收缓存区        
u8 USART1_RX_BUF[64];          //接收缓冲,最大64个字节.


//接收到的数据长度
u8 USART1_RX_CNT=0;

//标志位,标志串口1是否接收到数据
u8 USART1_RX_Flag = 0;



void My_USART1_Init(void)
{
        GPIO_InitTypeDef  GPIO_InitStructure;
        USART_InitTypeDef USART_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//使能USART1时钟
       
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);//使能USART2时钟,特别注意,USART2时钟的不同。
       
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
       
       
        //串口2引脚复用映射
        GPIO_PinAFConfig(GPIOA,GPIO_PinSource2,GPIO_AF_USART2); //GPIOA2复用为USART2
        GPIO_PinAFConfig(GPIOA,GPIO_PinSource3,GPIO_AF_USART2); //GPIOA3复用为USART2
        GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);
        GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);

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

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3; //GPIOA2与GPIOA3
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;       //复用功能
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;        //速度100MHz
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
        GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化PA2,PA3

        USART_InitStructure.USART_BaudRate=9600;
        USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
        USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;
        USART_InitStructure.USART_Parity=USART_Parity_No;
        USART_InitStructure.USART_StopBits=USART_StopBits_1;
        USART_InitStructure.USART_WordLength=USART_WordLength_8b;

        USART_Init(USART1,&USART_InitStructure);
        USART_Cmd(USART1 ,ENABLE);
       
        USART_Init(USART2,&USART_InitStructure);
        USART_Cmd(USART2 ,ENABLE);


        //使能相关中断
        USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);

        NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;
        NVIC_Init(&NVIC_InitStructure);
       
}


void USART1_IRQHandler(void)              
{
        u8 res;            
        if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)//接收到数据
        {                
          res =USART_ReceiveData(USART1);//字节一一接收;读取接收到的数据USART2->DR
                if(USART1_RX_CNT<64)
                {
                        USART1_RX_BUF[USART1_RX_CNT]=res;                //记录接收到的值
                        USART1_RX_CNT++;                                                //接收数据增加1
                }
        }
        USART1_RX_Flag = 1;
        LED0 = 0;
}


void USART2_Send_Data(u8 *buf,u8 len)
{
        u8 t;
          for(t=0;t<len;t++)                //循环发送数据
        {
                //获取标志位信息,表示数据已经被接收并且可以读出。
          while(USART_GetFlagStatus(USART2,USART_FLAG_TC)==RESET);                  //获取状态标志位,检测是否完成数据。等待发送结束               
      USART_SendData(USART2,buf[t]); //通过串口2发送数据
        }         
        while(USART_GetFlagStatus(USART2,USART_FLAG_TC)==RESET); //等待发送结束               
       
        USART1_RX_CNT=0;
        USART1_RX_Flag = 0;
       
}

int main(void)
{
        delay_init(168);
       
        LED_Init();
       
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
        My_USART1_Init();
       
        if(USART1_RX_Flag)
        {
                USART2_Send_Data(USART1_RX_BUF,USART1_RX_CNT);
        }
       
       
        while(1)
        {
                LED1=!LED1;
                delay_ms(1000);
                LED1=LED1;
               
//                LED0 = 0;
        }
}
[/mw_shl_code]

最佳答案

查看完整内容[请看2#楼]

问题已解决,谢谢大家。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

7

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
152
金钱
152
注册时间
2015-7-20
在线时间
19 小时
 楼主| 发表于 2017-3-19 21:01:47 | 显示全部楼层
问题已解决,谢谢大家。
回复

使用道具 举报

7

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
152
金钱
152
注册时间
2015-7-20
在线时间
19 小时
 楼主| 发表于 2017-3-19 21:02:39 | 显示全部楼层
求解答,谢谢大家!
回复

使用道具 举报

210

主题

773

帖子

0

精华

初级会员

Rank: 2

积分
124
金钱
124
注册时间
2018-3-26
在线时间
288 小时
发表于 2018-8-14 14:13:28 | 显示全部楼层
王智 发表于 2017-3-19 21:01
问题已解决,谢谢大家。

您是怎么解决的啊,我现在也遇到这个问题,希望能帮帮我
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-19 01:47

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表