不得不说串口是个好东西,协议简单,使用方便.是下位机与上位机通讯一个很好的选择.今天就讲讲在stm32下的串口调试.
开发环境: UBUNTU LINUX 13.10 ARM GCC(具体搭建请见我前面的博客文章)
芯片: stm32f103zet6
库: 官方库
个人原创,版权所以,转载请注明原文出处:
http://www.embbnux.com/2014/03/20/stm32_send_string_on_usart/
一 配置串口,打开串口
初始化程序:
//初始化 USAR1
void usart_init( void ){
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
//PA9作为US1的TX端,打开复用,负责发送数据
//GPIO_StructInit(&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
//GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA , &GPIO_InitStructure);
//PA10作为US1的RX端,负责接收数据
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
USART_InitStructure.USART_BaudRate = BAUD;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART1,&USART_InitStructure) ;
USART_Cmd(USART1, ENABLE);
}
使用USART1,主要是配置波特率,GPIO等,记得要打开串口时钟;
二 发送接收数据
发送单字节数据
//发送
void usart_transmit( unsigned char data ){
USART_ClearFlag(USART1,USART_FLAG_TC);
USART_SendData(USART1,data);
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);
USART_ClearFlag(USART1,USART_FLAG_TC);
}
特别要说一下这里的while等待,这里是等待一个字节发送成功.如果没有这句的话,在连续发送过个字节,也就是字符串的时候,会发生丢失数据.
发送字符串:
void usart_send_string(char *str){
while(*str)
{
usart_transmit(*str) ;
str++;
}
}
接收数据:
这里比较简单的配置了一下,其实应该用中断的:
//接收信息
unsigned char usart_receive( void ){
unsigned char data;
data =USART_ReceiveData(USART1);
return data;
}
串口配合sprintf使用,可以很好的打印整型数浮点数等,但是在我现在这个环境下用sprintf编译不通过,挺奇怪的,我用avr-gcc倒是好好的.
楼主,问下你在你这个工程上用起sprintf或者是printf了吗?
我现在是编译通过,通过重写_write函数,printf字符串可以,但是printf(“%d”, i)类似这种带%d %s 的输出,程序就卡死了,我想请教下楼主的使用情况,多谢!