OpenEdv-开源电子网

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

想直接32给上位机发送数据,不用中断,数据一直没有写入DR寄存器,在那里循环,怎么回事?在线等,挺急的!

[复制链接]

7

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2017-7-8
在线时间
13 小时
发表于 2017-7-8 09:12:51 | 显示全部楼层 |阅读模式
1金钱
#include "stm32f10x.h"


void My_USART1_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStrue;
    USART_InitTypeDef USART_InitStrue;
//    NVIC_InitTypeDef NVIC_InitStrue;
   
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能GPIO时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//使能串口时钟
//USART_TX PA.9
    GPIO_InitStrue.GPIO_Mode=GPIO_Mode_AF_PP;//推挽复用
    GPIO_InitStrue.GPIO_Pin=GPIO_Pin_9;
    GPIO_InitStrue.GPIO_Speed=GPIO_Speed_10MHz;
  GPIO_Init(GPIOA,&GPIO_InitStrue);//¢Ú
    //USART1_RX  PA.10 ¸¡¿ÕÊäÈë
    GPIO_InitStrue.GPIO_Mode=GPIO_Mode_IN_FLOATING;//¸浮空
    GPIO_InitStrue.GPIO_Pin=GPIO_Pin_10;
    GPIO_InitStrue.GPIO_Speed=GPIO_Speed_10MHz;
  GPIO_Init(GPIOA,&GPIO_InitStrue);//¢Ú
   
    USART_InitStrue.USART_BaudRate=115200;//设置波特率
    USART_InitStrue.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//无硬件流数据
    USART_InitStrue.USART_Mode=USART_Mode_Tx;//设置为发送模式
    USART_InitStrue.USART_Parity=USART_Parity_No;//无奇偶校验位
    USART_InitStrue.USART_StopBits=USART_StopBits_1;//一个停止位
    USART_InitStrue.USART_WordLength=USART_WordLength_8b;//字长为8位
   
    USART_Init(USART1,&USART_InitStrue);//串口设置
   
    USART_Cmd(USART1,ENABLE);//使能串口

   
}

void delay(u32 k)
{
        u32 a,b;
     for(a=3000;a>0;a--)
                for(b=k;b>0;b--);
}
int main(void)
{   
     u8 i,j[]={1,2,3,4,5};
   
   //USART_DeInit(USART1);
    My_USART1_Init();
   
     while(1)
         {
                for(i=0;i<5;i++)
                {    USART_SendData(USART1,j[i]);
                    while(USART_GetFlagStatus(USART1, USART_FLAG_TC));
                    delay(2);
                }
         }
     
}


最佳答案

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

错误找到了,是获取发送状态标志位那里出了问题,发送数据后状态位被置为1,为真,然后又会回来执行USART_GetFlagStatus(USART1, USART_FLAG_TC)函数,里面的函数会读取DR寄存器的值,因为第一次已经发送了,所以会读取到,因此状态位又为1.从而一直循环了。正确的做法应该为 while(USART_GetFlagStatus(USART1, USART_FLAG_TC!=SET));即状态为不为1的时候就循环,因为不为1的话说明数据没写入DR寄存器
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

7

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2017-7-8
在线时间
13 小时
 楼主| 发表于 2017-7-8 09:12:52 | 显示全部楼层
错误找到了,是获取发送状态标志位那里出了问题,发送数据后状态位被置为1,为真,然后又会回来执行USART_GetFlagStatus(USART1, USART_FLAG_TC)函数,里面的函数会读取DR寄存器的值,因为第一次已经发送了,所以会读取到,因此状态位又为1.从而一直循环了。正确的做法应该为 while(USART_GetFlagStatus(USART1, USART_FLAG_TC!=SET));即状态为不为1的时候就循环,因为不为1的话说明数据没写入DR寄存器
回复

使用道具 举报

1

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2016-10-12
在线时间
18 小时
发表于 2017-7-8 09:17:30 | 显示全部楼层
你确定程序能跑起来???连最基本的系统时钟初始化SystemInit();   都没有
回复

使用道具 举报

7

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2017-7-8
在线时间
13 小时
 楼主| 发表于 2017-7-8 10:00:14 | 显示全部楼层
异度世界 发表于 2017-7-8 09:17
你确定程序能跑起来???连最基本的系统时钟初始化SystemInit();   都没有

程序能跑,,系统时钟不是默认设置了的吗??8MHZ

回复

使用道具 举报

1

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2017-5-20
在线时间
15 小时
发表于 2017-7-8 10:02:11 | 显示全部楼层
建议先从LED灯开始
回复

使用道具 举报

7

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2017-7-8
在线时间
13 小时
 楼主| 发表于 2017-7-8 10:18:32 | 显示全部楼层
MagicianBoom 发表于 2017-7-8 10:02
建议先从LED灯开始

从LED灯学起 吗??前面的已经学过了,现在是学到那里来了,然后不懂,而且前面的LED例程也只是初始化GPIO时钟和IO口输出输入模式,再调用GPIO_SetBits函数和GPIO_ResetBits函数就可以了
回复

使用道具 举报

13

主题

175

帖子

0

精华

初级会员

Rank: 2

积分
182
金钱
182
注册时间
2016-4-30
在线时间
141 小时
发表于 2017-7-8 13:43:10 | 显示全部楼层
while(USART_GetFlagStatus(USART1, USART_FLAG_TC));是不是卡在这里了?
回复

使用道具 举报

7

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2017-7-8
在线时间
13 小时
 楼主| 发表于 2017-7-8 19:29:46 | 显示全部楼层
执迷 发表于 2017-7-8 13:43
while(USART_GetFlagStatus(USART1, USART_FLAG_TC));是不是卡在这里了?

恩,就是程序停在那里了,怎么破大佬
回复

使用道具 举报

7

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2017-7-8
在线时间
13 小时
 楼主| 发表于 2017-7-8 19:36:31 | 显示全部楼层
用的F103ZET6,没人吗,那我自己顶,来个大佬大佬解决下哇
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165359
金钱
165359
注册时间
2010-12-1
在线时间
2110 小时
发表于 2017-7-8 22:16:06 | 显示全部楼层
参考下我们的串口初始化代码,你这个感觉像是初始化有问题
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-12-18 12:51

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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