一、涉及I/O初始化
STM32F103,使用USART1,PA9->Tx, PA10->Rx;
void USART1_IO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO | RCC_APB2Periph_USART1, ENABLE);
/*Rx PA10 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/*Tx PA9 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
二、USART相关配置
void USART1_InitConfig(uint32_t BaudRate)
{
USART_InitTypeDef USART_InitStructure;
USART_InitStructure.USART_BaudRate = BaudRate;
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;
/* Configure USART1 */
USART_Init(USART1, &USART_InitStructure);
/* Enable the USART1 */
USART_Cmd(USART1, ENABLE);
}
三、重定向函数
#ifdef __GNUC__ //默认没有定义
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */
PUTCHAR_PROTOTYPE
{
while (!(USART1->SR & USART_FLAG_TXE));
USART1->DR = (ch & 0x1FF);
return ch;
}
这里通过宏定义__GNUC__ 来选择输出环境,在Linux编译环境下,printf函数调用的是 io_putchar 函数;在windows编译环境下,printf函数调用的是fputc函数;这里用一个宏定义来选择使用哪个环境。
注意:在使用printf函数时,需要包含标准IO库,即,<stdio.h>
四、遇到问题即解决方法
第一个问题:
问题:写好代码后,编译通过,但是串口不输出
解决:打开魔术棒,勾选Use MicroLIB
第二个问题:
问题:勾选Use MicroLIB后仍旧不输出
解决:
1、添加 #define GNUC ,选择Linux编译环境,此时可以打印输出,说明此时使用的时GCC编译环境。
2、打开魔术棒后发现GNU extensions勾选,此时使用的就是GCC编译环境,取消勾选,取消#define GNUC 后可以完美输出
以上是个人学习时遇到的问题,如有不妥,请大神指教!!!