stm32F4开发板搭载一个USB串口,2个RS232串口,博客内容介绍USB串口和电脑通信
步骤:
1、串口和IO口使能
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
2、设置引脚复用功能
GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);
GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);
3、GPIO初始化
GPIO_InitStru.GPIO_Mode=GPIO_Mode_AF;
GPIO_InitStru.GPIO_OType=GPIO_OType_PP;
GPIO_InitStru.GPIO_Pin=GPIO_Pin_9|GPIO_Pin_10;
GPIO_InitStru.GPIO_PuPd=GPIO_PuPd_UP;
GPIO_InitStru.GPIO_Speed=GPIO_High_Speed;
GPIO_Init(GPIOA,&GPIO_InitStru);
4、串口初始化(设置波特率,字长,停止位,奇偶校验位)
USART_InitTypeStru.USART_BaudRate=bound;
USART_InitTypeStru.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
USART_InitTypeStru.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;
USART_InitTypeStru.USART_Parity=USART_Parity_No;
USART_InitTypeStru.USART_StopBits=USART_StopBits_1;
USART_InitTypeStru.USART_WordLength=USART_WordLength_8b;
USART_Init(USART1,&USART_InitTypeStru);
5、使能串口(若使用到中断,则需开启中断并初始化NVIC)
开启中断并初始化NVIC
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//开启中断 串口的接收中断
NVIC_InitTypeStru.NVIC_IRQChannel=USART1_IRQn;
NVIC_InitTypeStru.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitTypeStru.NVIC_IRQChannelPreemptionPriority=2;//抢占优先级
NVIC_InitTypeStru.NVIC_IRQChannelSubPriority=2;//响应优先级
NVIC_Init(&NVIC_InitTypeStru);
//使能串口
USART_Cmd(USART1,ENABLE);
6、串口1的中断函数
void USART1_IRQHandler();//在文件stm32 startup XXx.s中,然后再重写
通过USART_RX_STA作为状态寄存器判断是否接收到数据。每次接收一个字节的数据,判断数据是否以回车换行结束(0X0D/0X0A),若是0X0D 0X0A结束则传送完成,若未结束,则将数据保存到USART_RX_BUFFER(200)中。
实现功能: 上位机控制LED灯亮与灭,上位机发送命令0,LED1灭,发送命令1,LED1亮
int main()
{
u8 t,i,len;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组
delay_init(168);
uart_init(115200);//初始化串口波特率为115200
LED_Init();
LED0=0;//先点亮红灯
while(1)
{
if(USART_RX_STA&0x8000)
{
len=USART_RX_STA&0x3FFF;//得到此次接受数据的长度
printf("\r\n发送的数据为:\r\n");
for(t=0;t
USART1->DR=USART_RX_BUF[t];
while((USART1->SR&0X40)==0);//等待发送结束
}
printf("\r\n");
printf("接收数据的值1为:%d ",USART_RX_BUF[0]);
printf("接收数据的值2为:%d ",USART_RX_BUF[1]);
printf("接收数据的值3为:%d ",USART_RX_BUF[2]);
if(USART_RX_BUF[0]=='0')
{
LED1=1;
}else if(USART_RX_BUF[0]=='1')
{
LED1=0;
}
for(i=0;i
USART_RX_BUF[i]=0;
}
USART_RX_STA=0;
}
//else
//{
// delay_ms(1000);
// printf("\r\n上位机还未发送数据到单片机\r\n");
//}
}
}
接下来实现:单片机定时发送数据到上位机功能