OpenEdv-开源电子网

 找回密码
 立即注册

扫一扫,访问微社区

正点原子全套STM32开发资料,上千讲STM32视频教程,RT1052教程免费下载啦...
查看: 293|回复: 7

STM32串口转485通信问题 通信不了编译通过

[复制链接]

  离线 

8

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
82
金钱
82
注册时间
2018-7-12
在线时间
14 小时
发表于 2018-7-12 15:56:06 | 显示全部楼层 |阅读模式
本帖最后由 rmwhite 于 2018-7-12 15:57 编辑

#include "stm32f10x.h"
void My_USART2_Init(void)
{
        GPIO_InitTypeDef GPIO_InitStrue;//定义IO接口结构体
        USART_InitTypeDef USART_InitStrue;//定义串口相关结构体
        NVIC_InitTypeDef NVIC_InitStrue;//定义中断相关结构体

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//初始化GPIOA时钟
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);//初始化串口USART时钟
        RCC_APB1PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//功能复用IO时钟使能
                                
        
        GPIO_InitStrue.GPIO_Mode=GPIO_Mode_AF_PP;//推挽复用输出
        GPIO_InitStrue.GPIO_Pin=GPIO_Pin_2;//开启2号IO口
        GPIO_InitStrue.GPIO_Speed=GPIO_Speed_10MHz;//端口速度10MHz
                                GPIO_Init(GPIOA,&GPIO_InitStrue);//GPIOA9初始化

        GPIO_InitStrue.GPIO_Mode=GPIO_Mode_IN_FLOATING;//浮空输入
        GPIO_InitStrue.GPIO_Pin=GPIO_Pin_3;//开启3号IO口
        GPIO_InitStrue.GPIO_Speed=GPIO_Speed_10MHz;//端口速度10MHz
                                GPIO_Init(GPIOA,&GPIO_InitStrue);//GPIO10初始化

        USART_InitStrue.USART_BaudRate=9600;//串口波特率设置
        USART_InitStrue.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//无硬件流
        USART_InitStrue.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;//发送,接收使能
        USART_InitStrue.USART_Parity=USART_Parity_No;//无奇偶校验
        USART_InitStrue.USART_StopBits=USART_StopBits_1;//停止位为1
        USART_InitStrue.USART_WordLength=USART_WordLength_8b;//字长8位

                                USART_Init(USART2,&USART_InitStrue);//USART2初始化
        USART_Cmd(USART2,ENABLE);//使能串口2

        USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);//中断配置:开启接收中断(接受缓存器非空使能,ENABLE)
        NVIC_InitStrue.NVIC_IRQChannel=USART2_IRQn;//定义中断通道
        NVIC_InitStrue.NVIC_IRQChannelCmd=ENABLE;//开启中断通道
        NVIC_InitStrue.NVIC_IRQChannelPreemptionPriority=1;//设定抢占优先级为1
        NVIC_InitStrue.NVIC_IRQChannelSubPriority=1;//设定子优先级为1
        NVIC_Init(&NVIC_InitStrue);//中断初始化
}

void delay_ms(u16 nms)
{
                u32 temp;
                SysTick->LOAD=9000*nms;
                SysTick->VAL=0x00;
                SysTick->CTRL=0x01;
                do
                {
                                temp=SysTick->CTRL;
                }while((temp&0x01)&&(!temp&(1<<16)));
                SysTick->CTRL=0x00;
                SysTick->VAL=0x00;
}
void USART2_IRQHandler(void)//编写中断处理函数
{
                                u8 res;//无符号字符res        
                                if(USART_GetITStatus(USART2,USART_IT_RXNE))//接收数据进入中断,判断串口2接收缓存器非空使能为1与否
                                {
                                         res= USART_ReceiveData(USART2); //为1,则将串口2的数据给变量
                                         GPIO_SetBits(GPIOA,GPIO_Pin_11);
                                         delay_ms(1);
                                         USART_SendData(USART2,res);   //继续将此数据从USART2发送出去
                                         while(USART_GetFlagStatus(USART2,USART_FLAG_TXE)==RESET);
                                         delay_ms(2);
                                         GPIO_SetBits(GPIOA,GPIO_Pin_11);
                                }
}



int main(void)
{        

        My_USART2_Init();//调用串口函数
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设定优先级分组为2,2位抢占2位响应

         while(1)//无数据时死循环,有数据时进中断收数据发数据完了再读主程序
        {
               
        }                                                
}

1531382225(1).png
回复

使用道具 举报

  离线 

8

主题

140

帖子

0

精华

高级会员

Rank: 4

积分
969
金钱
969
注册时间
2017-4-12
在线时间
204 小时
发表于 2018-7-13 08:53:00 | 显示全部楼层
RCC_APB1PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//功能复用IO时钟使能  

好好看看程序吧,这个有什么问题
回复 支持 1 反对 0

使用道具 举报

  离线 

0

主题

440

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1113
金钱
1113
注册时间
2018-2-7
在线时间
123 小时
发表于 2018-7-12 17:22:01 | 显示全部楼层
先用串口通信,调通了在加485芯片。
回复 支持 反对

使用道具 举报

  离线 

24

主题

1180

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
1962
金钱
1962
注册时间
2018-5-11
在线时间
369 小时
发表于 2018-7-13 09:03:50 | 显示全部楼层
245925587 发表于 2018-7-13 08:53
RCC_APB1PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//功能复用IO时钟使能  

好好看看程序吧,这个有 ...

神眼,比编译器还强。
https://github.com/ShuifaHe/STM32.git
回复 支持 反对

使用道具 举报

  离线 

8

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
82
金钱
82
注册时间
2018-7-12
在线时间
14 小时
 楼主| 发表于 2018-7-13 10:11:53 | 显示全部楼层
HXYDJ 发表于 2018-7-12 17:22
先用串口通信,调通了在加485芯片。

先试了串口通信可以传送数据到pc,就是串口中断出问题了,仔细对比前辈们的程序都没发现什么错误
回复 支持 反对

使用道具 举报

  离线 

8

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
82
金钱
82
注册时间
2018-7-12
在线时间
14 小时
 楼主| 发表于 2018-7-13 10:12:55 | 显示全部楼层
warship 发表于 2018-7-13 09:03
神眼,比编译器还强。

这个不太懂,删掉吗
回复 支持 反对

使用道具 举报

  离线 

24

主题

1180

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
1962
金钱
1962
注册时间
2018-5-11
在线时间
369 小时
发表于 2018-7-13 10:19:14 | 显示全部楼层
rmwhite 发表于 2018-7-13 10:12
这个不太懂,删掉吗

APB1和APB2是两条分开的时钟总线,
互不相干,
你用APB1开时钟的命令去开启挂在APB2总线上的外设的时钟,
是让瞎子读报纸给你听吗?
https://github.com/ShuifaHe/STM32.git
回复 支持 反对

使用道具 举报

  离线 

8

主题

140

帖子

0

精华

高级会员

Rank: 4

积分
969
金钱
969
注册时间
2017-4-12
在线时间
204 小时
发表于 2018-7-13 17:45:25 | 显示全部楼层
My_USART2_Init();//调用串口函数
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设定优先级分组为2,2位抢占2位响应

改为
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设定优先级分组为2,2位抢占2位响应
My_USART2_Init();//调用串口函数


//在配置中断之前要先调用NVIC_PriorityGroupConfig这个函数
回复 支持 反对

使用道具 举报

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

本版积分规则




关闭

必看,必学:"原子哥”力荐上一条 /1 下一条

正点原子公众号

QQ|联系我们|手机版|官方淘宝店|微信公众平台|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2018-9-22 03:28

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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