OpenEdv-开源电子网

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

USART3发送和接收数据的问题

[复制链接]

17

主题

46

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
262
金钱
262
注册时间
2016-9-9
在线时间
94 小时
发表于 2016-9-9 11:58:15 | 显示全部楼层 |阅读模式
本帖最后由 xmlhttp 于 2016-9-9 12:00 编辑

我用的是stm32F103芯片,想要的效果是用串口助手发个数据给USART3,然后让它把这个数据返回来,下面是代码帮我看看哪里有问题。
初始化:
[mw_shl_code=c,true]void usart_init(){
        //声明变量
        GPIO_InitTypeDef GPIO_struct;
        USART_InitTypeDef USART_struct;
        NVIC_InitTypeDef NVIC_struct;
        //时钟
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO,ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);

        //串口连接的GPIO设置
        GPIO_struct.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_struct.GPIO_Pin=GPIO_Pin_10;           //发送
        GPIO_struct.GPIO_Mode=GPIO_Mode_AF_PP;
        GPIO_Init(GPIOB,&GPIO_struct);

        GPIO_struct.GPIO_Pin=GPIO_Pin_11;           //接收
        GPIO_struct.GPIO_Mode=GPIO_Mode_IN_FLOATING;
        GPIO_Init(GPIOB,&GPIO_struct);
        //串口设置
        USART_struct.USART_BaudRate=9600;
        USART_struct.USART_WordLength=USART_WordLength_8b;
        USART_struct.USART_StopBits=USART_StopBits_1;
        USART_struct.USART_Parity= USART_Parity_No;
        USART_struct.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
        USART_struct.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;
        USART_Init(USART3,&USART_struct);

        //串口使能
        USART_Cmd(USART3,ENABLE);
        USART_ITConfig(USART3,USART_IT_RXNE,ENABLE);
        USART_ClearFlag(USART3,USART_FLAG_TC);
        //中断设置
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
        NVIC_struct.NVIC_IRQChannel=USART3_IRQn;
        NVIC_struct.NVIC_IRQChannelPreemptionPriority=0;
        NVIC_struct.NVIC_IRQChannelSubPriority=0;
        NVIC_struct.NVIC_IRQChannelCmd=ENABLE;
        NVIC_Init(&NVIC_struct);
}
[/mw_shl_code]
中断代码:
[mw_shl_code=c,true]//串口3中断
void USART3_IRQHandler(void){
        static u32 k;
        USART_ClearFlag(USART3,USART_FLAG_TC);
        if(USART_GetITStatus(USART3,USART_IT_RXNE)!=Bit_RESET){
                   k=USART_ReceiveData(USART3);
                USART_SendData(USART3,k);
                while(USART_GetFlagStatus(USART3,USART_FLAG_TXE)==Bit_RESET);
   }
}[/mw_shl_code]
测试图片:
QQ图片20160909115950.png


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

9

主题

108

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1136
金钱
1136
注册时间
2013-7-16
在线时间
80 小时
发表于 2016-9-9 15:01:57 | 显示全部楼层
中断函数设个断点调试下看有没有收到数据。
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
7
金钱
7
注册时间
2016-9-9
在线时间
0 小时
发表于 2016-9-9 15:05:29 | 显示全部楼层
建议吧GPIO_Pin_11 设置成跟Pin_10一样的GPIO_Mode_AF_PP,试试看。
回复 支持 反对

使用道具 举报

1

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
68
金钱
68
注册时间
2016-9-24
在线时间
16 小时
发表于 2016-10-4 20:57:22 | 显示全部楼层
中断服务函数中不要有while。。。
回复 支持 反对

使用道具 举报

10

主题

84

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
338
金钱
338
注册时间
2015-1-24
在线时间
55 小时
发表于 2016-10-5 10:50:38 | 显示全部楼层
标志位在recev,之后就自动被清零了,中断代码建议先等待发送队列为空,然后再send        ,例如
while((USART1->SR&0X40)==0);//等待发送为空
    USART1->DR = (u8) ch;   


void USART2_IRQHandler(void)                        //′®¿ú2ÖD¶Ï·tÎñ3ìDò
{
        u8 Res = 0;
        if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)  //
        {
                Res = USART_ReceiveData(USART2);//(USART1->DR);        //
                //等待发送为空
               //发送
       }
}
学无止境
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-25 21:14

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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