初级会员
- 积分
- 66
- 金钱
- 66
- 注册时间
- 2017-7-8
- 在线时间
- 13 小时
|
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寄存器
|