不得不说串口是个好东西,协议简单,使用方便.是下位机与上位机通讯一个很好的选择.今天就讲讲在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 的输出,程序就卡死了,我想请教下楼主的使用情况,多谢!