F103 关于UART2的问题 求助朋友们 急!!!

2019-07-21 05:08发布

现使用战舰开发板和GPRS-DTU做一个采集数据加通讯的实验
DTU的例程Slave中是使用的 UART3来做串口的数据接收和发送的,我使用例程并改了下main.c的程序可以将 战舰开发板采集到的温湿度数据通过DTU发送到原子云上,但是由于后面要加上MPU6050占用了UART3的引脚,就打算使用UART2来做通讯,但是将例程中串口的所有配置都改为UART2后,原子云接收不到数据,查了一天了也没弄通,把简单的代码发一下,各位大神朋友能帮忙指点一下么?  
是不是UART2有特殊的配置之类的?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
追忆moon
1楼-- · 2019-07-21 09:22
这是uart2.c文件


#include "sys.h"
#include "uart2.h"
#include "ringbuffer.h"

RingBuffer *pUart2RxBuf;


void uart2_init(u32 bound)
{
    //GPIO端口设置
    GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);        //使能USART2时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);        //使能GPIOA时钟

    //USART2_TX   GPIOA.2
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;          //PA.2
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;        //复用推挽输出
    GPIO_Init(GPIOA, &GPIO_InitStructure);                 //初始化GPIOA.2

    //USART2_RX          GPIOA.3
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;        //PA3
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;         //浮空输入
    GPIO_Init(GPIOA, &GPIO_InitStructure);               //初始化GPIOA.3

    //Usart2 NVIC配置
    NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3 ;     //抢占优先级3
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;                //子优先级3
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                        //IRQ通道使能
    NVIC_Init(&NVIC_InitStructure);       

    //USART 初始化设置
    USART_InitStructure.USART_BaudRate = bound;              
    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(USART2, &USART_InitStructure);                 //初始化串口2
    USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);        //开启串口接受中断
    USART_Cmd(USART2, ENABLE);                            //使能串口2
}


void USART2_IRQHandler(void)                                //串口2中断服务程序
{
    u8 Res;

    if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)        //接收中断
    {
        Res = USART_ReceiveData(USART2);                        //读取接收到的数据
                       

        RingBuffer_In(pUart2RxBuf, &Res, 1);                        //放入缓存
    }
}

void USART2_Send_Data(u8 *data, u32 size)
{
    for(u32 i = 0; i < size; i++)
    {
        while((USART2->SR & 0X40) == 0);

        USART2->DR = data[i];
    }
}










追忆moon
2楼-- · 2019-07-21 10:27
 精彩回答 2  元偷偷看……
追忆moon
3楼-- · 2019-07-21 13:38
这是main.c文件   

#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "lcd.h"
#include "usart.h"
#include "RingBuffer.h"
#include "protocol.h"
#include "adc.h"
#include "lsens.h"
#include "dht11.h"
#include "uart2.h"


int main(void)
{         
        u8 aa = 15;
        u8 bb = 01;         
//温湿度定义
        u8 t=0;                            
        u8 temperature1;              
        u8 humidity1;   
        u8 temperature2;
        u8 humidity2;
//光敏传感器定义
        u8 adcx;          
       
        delay_init();                     
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);         
        uart_init(115200);                        
        uart2_init(115200);
       
        LED_Init();                                    
        Lsens_Init();                        
        DHT11_Init();                               
         
        my_mem_init(SRAMIN);                //初始化内存池
        pUart2RxBuf = RingBuffer_Malloc(1024);        //在内存池中分配串口2接收缓存1K

        while(DHT11_Init())         //DHT11初始化
        {

        }       

        while(1)
        {       
                if(t%10==0)                        //每100ms读取一次
                {                                                                          
                        DHT11_D_Read_Data(&temperature1,&humidity1);        //读取温湿度
                        DHT11_G_Read_Data(&temperature2,&humidity2);                       
                        adcx=Lsens_Get_Val();                //读取光照
               
                   //向DTU发送温湿度+光照数据
                        USART_SendData(USART2,temperature2);
                        while(USART_GetFlagStatus(USART2,USART_FLAG_TC)!=SET);

                        USART_SendData(USART2,humidity2);
                        while(USART_GetFlagStatus(USART2,USART_FLAG_TC)!=SET);

                        USART_SendData(USART2,adcx);
                        while(USART_GetFlagStatus(USART2,USART_FLAG_TC)!=SET);

                }
                          delay_ms(100);
               
                           t++;
               
                           if(t==20)
                           {
                                t=0;
                                LED0=!LED0;
                           }
               }
}
追忆moon
4楼-- · 2019-07-21 18:38
我用上面的代码   之前都是UART3  可以通讯成功,原子云接收到正常数据
把代码UART3改为UART2配置后    , 通讯失败  
请教!!!

一周热门 更多>