打印
[STM32]

求助关于STM32与485通信

[复制链接]
736|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
技术小白|  楼主 | 2017-3-24 12:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我想用485通信程序这样写#include "usart.h"
#include "delay.h"
                                       /*485测试程序*/

void usart_init(u32 bound)
{
                                /*打开RCC复位时钟*/     
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);       //打开USART2的时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO ,ENABLE);       //开启GPIOA的时钟


                                 /*串口配置*/
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_4;                  //485使能控制引脚
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;           //推挽输出
    GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;

    GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_2;                  //PA2  TX
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP ;            //复用推挽输出
    GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;

    GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_3;                  //PA3   RX
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU ;              //上拉输入
    GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);


                              /*中断嵌套配置*/
    NVIC_InitTypeDef  NVIC_InitStructure;
    NVIC_InitStructure.NVIC_IRQChannel      = USART2_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelCmd   = ENABLE;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority =  1;
    NVIC_Init(&NVIC_InitStructure);


                                     /*串口配置*/
    USART_DeInit(USART2);                                                  //进行串口初始化
    USART_InitTypeDef USART_InitStructure;
    USART_InitStructure.USART_BaudRate  = bound ;                          //波特率设置为输入一般为9600
    USART_InitStructure.USART_HardwareFlowControl =USART_HardwareFlowControl_None;     //无硬件流控制
    USART_InitStructure.USART_Mode      = USART_Mode_Rx;                   //使能为接收
    USART_InitStructure.USART_Parity    = USART_Parity_No ;                //奇偶失能
    USART_InitStructure.USART_StopBits  = USART_StopBits_1;                //停止位为1位
    USART_InitStructure.USART_WordLength= USART_WordLength_8b;             //8位数据位
    USART_Init(USART2,&USART_InitStructure);


                                    /*打开串口中断*/
    USART_Cmd(USART2, ENABLE);                              //使能串口2
    USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);                  //使能接收中断
    USART_ClearITPendingBit(USART2,USART_IT_RXNE);          //清空接收中断标志位
    USART_ClearITPendingBit(USART2,USART_IT_TXE);           //清空发送中断标志位
    USART_ITConfig(USART2, USART_IT_TXE, DISABLE);          //失能发送中断

                                   /*打开485的接收端口*/
    GPIO_ResetBits(GPIOA,GPIO_Pin_4);     //(低电平使能接收)
    //GPIO_SetBits(GPIOA,GPIO_Pin_4);
}

void USART2_IRQHandler()
{
    u16 rev_data;
    if(USART_GetFlagStatus(USART2,USART_IT_RXNE)!=RESET)
    {
        rev_data=USART_ReceiveData(USART2);
//        GPIO_SetBits(GPIOA,GPIO_Pin_4);
//        delay_ms(1);
//        USART_SendData(USART2,rev_data);
//        while(USART_GetFlagStatus(USART2,USART_FLAG_TXE)==RESET);
//        delay_ms(2);
//        GPIO_ResetBits(GPIOA,GPIO_Pin_4);
        USART_ClearITPendingBit(USART2,USART_IT_RXNE);
    }

    if(rev_data==0x00)
    {
        GPIO_SetBits(GPIOB, GPIO_Pin_5);

    }  
    else
    {
        GPIO_ResetBits(GPIOB, GPIO_Pin_5);

    }



}

这样写的话,从串口给数据0X00板子没有任何反应

相关帖子

沙发
crystal1987| | 2017-4-6 15:02 | 只看该作者
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);         //设置NVIC中断分组1:3位抢占优先级,3位响应优先级

使用特权

评论回复
板凳
crystal1987| | 2017-4-6 15:09 | 只看该作者
本帖最后由 crystal1987 于 2017-4-6 15:10 编辑

void USART1_IRQHandler(void)
{
                u8 kk=0;
                if(USART_GetFlagStatus(USART1, USART_FLAG_ORE) != RESET)//注意!不能使用if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)来判断
                {
                               kk = USART_ReceiveData(USART1);
                }
                if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //USART_GetFlagStatus
                {               
                                kk = (USART_ReceiveData(USART1) & 0xFF);
                                USART_ClearITPendingBit(USART1, USART_IT_RXNE); //清USART接收中断标志位
                }}






使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

1

帖子

0

粉丝