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

2019-08-17 02:25发布

#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);
                }
         }
     
}


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
9条回答
Passenger123
1楼-- · 2019-08-17 04:19
错误找到了,是获取发送状态标志位那里出了问题,发送数据后状态位被置为1,为真,然后又会回来执行USART_GetFlagStatus(USART1, USART_FLAG_TC)函数,里面的函数会读取DR寄存器的值,因为第一次已经发送了,所以会读取到,因此状态位又为1.从而一直循环了。正确的做法应该为 while(USART_GetFlagStatus(USART1, USART_FLAG_TC!=SET));即状态为不为1的时候就循环,因为不为1的话说明数据没写入DR寄存器
异度世界
2楼-- · 2019-08-17 10:18
 精彩回答 2  元偷偷看……
Passenger123
3楼-- · 2019-08-17 12:56
异度世界 发表于 2017-7-8 09:17
你确定程序能跑起来???连最基本的系统时钟初始化SystemInit();   都没有

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

MagicianBoom
4楼-- · 2019-08-17 17:23
建议先从LED灯开始
Passenger123
5楼-- · 2019-08-17 23:18
MagicianBoom 发表于 2017-7-8 10:02
建议先从LED灯开始

从LED灯学起 吗??前面的已经学过了,现在是学到那里来了,然后不懂,而且前面的LED例程也只是初始化GPIO时钟和IO口输出输入模式,再调用GPIO_SetBits函数和GPIO_ResetBits函数就可以了
执迷
6楼-- · 2019-08-17 23:29
while(USART_GetFlagStatus(USART1, USART_FLAG_TC));是不是卡在这里了?

一周热门 更多>