STM32+Keil 中使用printf函数

发布者:DazzlingGaze最新更新时间:2016-09-23 来源: eefocus关键字:STM32  Keil  printf函数 手机看文章 扫描二维码
随时随地手机看文章
Keil不支持Host-semi机制,即不支持直接在IDE打印字符串。

那么只能通过程序向硬件串口发数据了,这样调用的时候用自定义的函数即可,也很方便,例如:

void send_char_to_usart(unsigned char c){}

但是可否直接使用printf函数呢?毕竟人家都做好了,我们给他定一个打印输出的接口就可以了,答案是肯定的,看ST的官方源码:

/** 
****************************************************************************** 
* @file Lib_DEBUG/Lib_DEBUG_Example/main.c 
* @author MCD Application Team 
* @version V1.1.1 
* @date 13-April-2012 
* @brief Main program body 
****************************************************************************** 
* @attention 

*

? COPYRIGHT 2012 STMicroelectronics

 

* Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); 
* You may not use this file except in compliance with the License. 
* You may obtain a copy of the License at: 

* http://www.st.com/software_license_agreement_liberty_v2 

* Unless required by applicable law or agreed to in writing, software 
* distributed under the License is distributed on an "AS IS" BASIS, 
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
* See the License for the specific language governing permissions and 
* limitations under the License. 

****************************************************************************** 
*/ 
/* Includes ------------------------------------------------------------------*/ 
#include "stm32l1xx.h" 
#include "stm32l1xx_ip_dbg.h" 
#include  
#ifdef USE_STM32L152D_EVAL 
#include "stm32l152d_eval.h" 
#else 
#include "stm32l152_eval.h" 
#endif 
/** @addtogroup STM32L1xx_StdPeriph_Examples 
* @{ 
*/ 
/** @addtogroup Lib_DEBUG_Example 
* @{ 
*/ 
/* Private typedef -----------------------------------------------------------*/ 
/* Private define ------------------------------------------------------------*/ 
/* Private macro -------------------------------------------------------------*/ 
/* Private variables ---------------------------------------------------------*/ 
USART_InitTypeDef USART_InitStructure; 
/* Private function prototypes -----------------------------------------------*/ 
#ifdef __GNUC__ 
/* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf 
set to 'Yes') calls __io_putchar() */ 
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch) 
#else 
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f) 
#endif /* __GNUC__ */ 
/* Private functions ---------------------------------------------------------*/ 
/** 
* @brief Main program 
* @param None 
* @retval None 
*/ 
int main(void) 

/*!< At this stage the microcontroller clock setting is already configured, 
this is done through SystemInit() function which is called from startup 
file (startup_stm32l1xx_xx.s) before to branch to application main. 
To reconfigure the default setting of SystemInit() function, refer to 
system_stm32l1xx.c file 
*/ 
GPIO_InitTypeDef GPIOA_InitStructure; 
/* USARTx configured as follow: 
- BaudRate = 115200 baud 
- Word Length = 8 Bits 
- One Stop Bit 
- No parity 
- Hardware flow control disabled (RTS and CTS signals) 
- Receive and transmit enabled 
*/ 
USART_InitStructure.USART_BaudRate = 115200; 
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; 
STM_EVAL_COMInit(COM1, &USART_InitStructure); 
/* Initialize all peripherals pointers */ 
IP_Debug(); 
printf("\r\n STM32l1xx Firmware Library compiled with FULL ASSERT function... \n\r"); 
printf("...Run-time checking enabled \n\r"); 
/* Simulate wrong parameter passed to library function ---------------------*/ 
/* To enable SPI1 clock, RCC_APB2PeriphClockCmd function must be used and 
not RCC_APB1PeriphClockCmd */ 
RCC_APB1PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE); 
/* Some member of GPIOA_InitStructure structure are not initialized */ 
GPIOA_InitStructure.GPIO_Pin = GPIO_Pin_6; 
GPIOA_InitStructure.GPIO_Mode = GPIO_Mode_OUT; 
/*GPIOA_InitStructure.GPIO_Speed = GPIO_Speed_40MHz;*/ 
GPIOA_InitStructure.GPIO_OType = GPIO_OType_PP; 
GPIOA_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; 
GPIO_Init(GPIOA, &GPIOA_InitStructure); 
while (1) 



#ifdef USE_FULL_ASSERT 
/** 
* @brief Reports the name of the source file and the source line number 
* where the assert_param error has occurred. 
* @param file: pointer to the source file name 
* @param line: assert_param error line source number 
* @retval None 
*/ 
void assert_failed(uint8_t* file, uint32_t line) 

/* User can add his own implementation to report the file name and line number */ 
printf("\n\r Wrong parameter value detected on\r\n"); 
printf(" file %s\r\n", file); 
printf(" line %d\r\n", line); 
/* Infinite loop */ 
/* while (1) 

} */ 

#endif 
/** 
* @brief Retargets the C library printf function to the USART. 
* @param None 
* @retval None 
*/ 
PUTCHAR_PROTOTYPE 

/* Place your implementation of fputc here */ 
/* e.g. write a character to the USART */ 
USART_SendData(EVAL_COM1, (uint8_t) ch); 
/* Loop until the end of transmission */ 
while(USART_GetFlagStatus(EVAL_COM1, USART_FLAG_TC) == RESET) 


return ch; 

/** 
* @} 
*/ 
/** 
* @} 
*/ 
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ 

关键字:STM32  Keil  printf函数 引用地址:STM32+Keil 中使用printf函数

上一篇:STM32固件库V3.4移值到Keil MDK v4.12 图文详解
下一篇:STM32 用ST-Link V2下载程序、仿真

推荐阅读最新更新时间:2024-03-16 15:11

STM32的优先级NVIC_PriorityGroupConfig的理解
STM32的优先级NVIC_PriorityGroupConfig的理解及其使用M3定义8位STM32只使用4位 写作原由:因为之前有对stm32 优先级做过研究,但是没时间把整理的东西发表,最近项目需要2个串口,但是不是两个串口同时使用,只是随机使用其中一个,程序对2个串口的优先级需要配置; 此文思路:“中断优先级”思维导图-- 关键要点--- 结合图和要点相关程序应用例程讲解; 我们先来看ST公司的一张图: 我自己依据此图理解,应用思维导图画了一张方便理解:(如果看不清可通过ctrl+鼠标滑轮 放大看;) 前提条件1:组别优先顺序(第0组优先级最强,第4组优先级最弱):NVIC_PriorityGroup_0 N
[单片机]
<font color='red'>STM32</font>的优先级NVIC_PriorityGroupConfig的理解
STM32----ADC进行信号(跳变沿、PWM)的捕获
一般情况下进行信号的捕获,如上升沿或者下降沿。均可采用外部触发进行捕获。这是基于信号比较稳定的情况,如信号出现较大的纹波或者易受到干扰。会出现“误触”的现象,此时用外部中断难以捕获到正确的信号。 这种情况的解决办法,可以采用以下办法: (1)使用定时器进行捕获,并开启定时器的滤波功能。在库函数结构体中,为: TIM_ICInitStruct.TIM_ICFilter = 0x0f;(滤波系数可填0x00~0x0f) 当系数开到最大(0x0f)可有效过滤大部分纹波以及干扰信号,但对于持续时间较长的干扰无法过滤。 (2)使用ADC模拟看门狗功能。 比如当前信号为高电平,触发信号为下降沿,存在着一定
[单片机]
STM32——高级定时器的应用
/定时器1的配置 输出两路PWM信号 PA8 PA11,计数时钟为400KHZ 计数溢出大小为40000 / void Tim1Init(void) { GPIO_InitTypeDef GPIO_InitStruct; TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct; TIM_OCInitTypeDef TIM_OCInitStruct; u16 LeftMotor_CCR; u16 RightMotor_CCR; RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1|RCC_APB2Periph_GPIOA|RCC_APB2P
[单片机]
让Ultra Edit和Keil结合的更紧密
搞单片机的工程人员一般都喜欢用Ultra Edit编辑器,因为它可以把编程的语言关键字能够高亮彩色显示,还能够很好的支持中文。虽然keil也可以把关键字高亮彩色显示,但对中文的支持不是很好。另外,Ultra Edit编辑器与keil编辑器还有 感知 能力,当我们在其中的一个编辑器改变了编辑的内容再打开另一个编辑器的时候,就会出现一个提示窗口,提示我们编辑的内容已经被别的程序更改,是不是要重新加载?点击 是 后就会把被改变的内容重新加载上来。但是我们要打开两个窗口,要来回的切换,有时候感到很不方便,其实我们可以让它们更紧密的结合起来。 让Ultra Edi也具有编译能力 打开Ultra Edit,选择菜单 高级 的 项目工具配置 ,
[单片机]
STM32 ST-LINK Utility工具使用
下载 STM32 ST-LINK Utility v4.3.0 Jlink接口的Jtag和SWD接口定义 安装 双击默认安装(一直点下一步)即可,若没有安装下载器驱动,则会弹出安装下载器驱动的窗口,也是按照默认安装。 下载固件 (1)连接将下载器连接板卡,连接关系如下, 正版ST-link/V2引脚定义和注意事项 下图是从淘宝上买的ST-LINK, 但是这种下载器只有SWD下载接口,没有JTAG接口,官方的下载器,两种都支持,SWD和JTAG共用管脚,管脚的对应关系如下,对应关系通过第三列和第四列对比出来,SWD连接4根线,GND,SWDIO,SWCLK,NRST,VDD可以不用接,板卡采用外部供电。 引脚
[单片机]
<font color='red'>STM32</font> ST-LINK Utility工具使用
stm32以太网LWIP学习笔记之UDP通信
初始化配置步骤 第一:硬件底层DMA缓存以及以太网内存初始化 if(ETH_Mem_Malloc())return 1; //内存申请失败 if(lwip_comm_mem_malloc())return 1; //内存申请失败 u8 ETH_Mem_Malloc(void) { DMARxDscrTab=mymalloc(SRAMIN,ETH_RXBUFNB*sizeof(ETH_DMADESCTypeDef));//申请内存 DMATxDscrTab=mymalloc(SRAMIN,ETH_TXBUFNB*sizeof(ETH_DMADESCTypeDef));//申请内存 Rx_Buff=m
[单片机]
STM32学习之使用库函数编写串口通信
注:使用的芯片是STM32F103ZET6 一、串口初始化部分的程序 1.初始化时钟   因为要使用串口1这个外设,因此在使用之前就需要开启串口1的时钟,并且之后还需要设置IO输入输出的模式,在这里我们也需要开启GPIO的时钟。程序如下: //初始化串口时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); //初始化GPIO时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);   可是为什么要初始化时钟呢在《STM32中文参考手册_V10》的RCC中有这样一句话“当外设时钟没有启用时,软件不能读出
[单片机]
<font color='red'>STM32</font>学习之使用库<font color='red'>函数</font>编写串口通信
从滴答时钟了解STM32库操作
STM32的库函数操作给设计开发人员带来了诸多的便利,开发人员不必十分了解STM32的内部寄存器及硬件机制,只要有C语言基础,即可完成单片机的开发,缩短了开发周期,降低了开发难度,因而备受工程师喜爱。 基于库函数的开发模式,与基于API(Application Programming Interface)的软件开发有着异曲同工之处,程序员通过调用 API 函数对应用程序进行开发,而又无需访问源码,或理解内部工作机制的细节,可以减轻编程任务。STM32的基于函数库的开发模式也是一样的道理,因此对于有单片机开发经验的工程师来说,学习STM32,很容易就可以上手。 虽然可以不考虑库函数内部的细节,不考虑如何实现硬件寄存器的配置,但是
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved