上一篇:STM32-(09):USART库函数方式编程 | 下一篇:STM32-(11):STM32硬件设计方法 |
---|
此时我们只需将printf重定向,原来是输出到屏幕,我们只需要重定向输出到串口。 串口只需要一个串口助手就能看到打印。
printf 是 标准的输入输出库 stdio.lib 内实现的, 这个 lib 库赖以支持的基础是一个文件流 FILE,文件流内有很多的底层函数,比如:_sys_exit _sys_open ,其中有一个底层函数是 int fputc(int ch,FILE*f),我们只需要修改 fputc 函数进行重定向就能将打印输出到串口。
//----------------头文件声明--------------------
#include"stm32f10x_lib.h"//包含所有的头文件
#include
//----------------函数声明--------------------
void Delay_MS(u16 dly);
void RCC_Configuration(void);
void GPIO_Configuration(void);
void USART_Configuration(u32 BaudRate);
/*******************************************************************************
* Function Name: fputc
* Description: 重定向这个C库(stdio)printf函数文件流——》串口USART1
* Input: ch,*f
* Output: None
* Return: None
*******************************************************************************/
int fputc(int ch,FILE *f)
{
//ch送给USART1
USART_SendData(USART1, ch);
//等待发送完毕
while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET) ;
//返回ch
return(ch);
}/*******************************************************************************
* Function Name: main
* Description: Main program.
* Input: None
* Output: None
* Return: None
*******************************************************************************/
int main(void)
{
u8 i,data;
RCC_Configuration();
GPIO_Configuration();
USART_Configuration(19600);
data='https://www.it610.com/article/A';
for(i=0;
i<30;
i++)
{
USART_SendData(USART1, data);
data++;
while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET) ;
}
printf("\n\twww.yxarm.net");
printf("\n\ti value is%d",i);
printf("\n\ti value is%o",i);
printf("\n\ti value is%d,%d",i+i,i*i);
printf("\n\t-----------------------------");
}/*******************************************************************************
* Function Name: Delay_Ms
* Description: delay 1 ms.
* Input: dly (ms)
* Output: None
* Return: None
*******************************************************************************/
void Delay_MS(u16 dly)
{
u16 i,j;
for(i=0;
i0;
j--);
}/*******************************************************************************
* Function Name: RCC_Configuration
* Description: Configures the different system clocks.
* Input: None
* Output: None
* Return: None
*******************************************************************************/
void RCC_Configuration(void)
{
//----------使用外部RC晶振-----------
RCC_DeInit();
//初始化为缺省值
RCC_HSEConfig(RCC_HSE_ON);
//使能外部的高速时钟
while(RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET);
//等待外部高速时钟使能就绪
//FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
//Enable Prefetch Buffer
//FLASH_SetLatency(FLASH_Latency_2);
//Flash 2 wait state
RCC_HCLKConfig(RCC_SYSCLK_Div1);
//HCLK = SYSCLK
RCC_PCLK2Config(RCC_HCLK_Div1);
//PCLK2 =HCLK
RCC_PCLK1Config(RCC_HCLK_Div2);
//PCLK1 = HCLK/2
RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);
//PLLCLK = 8MHZ * 9 =72MHZ
RCC_PLLCmd(ENABLE);
//Enable PLLCLK while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
//Wait till PLLCLK is ready
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
//Select PLL as system clock
while(RCC_GetSYSCLKSource()!=0x08);
//Wait till PLL is used as system clock source
//---------打开相应外设时钟--------------------
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
//使能APB2外设的GPIOA的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
//使能APB2外设的GPIOC的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
//GPIO_PinRemapConfig(GPIO_Remap_USART1,ENABLE);
}/*******************************************************************************
* Function Name: GPIO_Configuration
* Description: 初始化GPIO外设
* Input: None
* Output: None
* Return: None
*******************************************************************************/
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* Configure USARTx_Tx as alternate function push-pull */
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);
/* Configure USARTx_Rx as input floating */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}void USART_Configuration(u32 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_Tx | USART_Mode_Rx;
USART_Init(USART1, &USART_InitStructure);
USART_Cmd(USART1, ENABLE);
}
上一篇:STM32-(09):USART库函数方式编程 | 下一篇:STM32-(11):STM32硬件设计方法 |
---|