STM32使用printf函数给串口打印信息的执行步骤为:
1.重定向printf函数
给uart.c文件中增加如下函数:
int fputc(int ch, FILE *f)
{
USART_SendData(USART2, (unsigned char) ch);// USART1 可以换成 USART2 等
while (!(USART2->SR & USART_FLAG_TXE));
return (ch);
}
2.增加头文件stdio
#include "stdio.h"
3.添加宏
在IAR中使用printf应在Options->C/C++Compler->Preprocessor中的Defined中添加_DLIB_FILE_DESCRIPTOR。
以前在变成调试的时候,一直不知道\r和\n有什么区别,觉得差不多,今天使用的时候就被坑了一把。
这里首先要理解:\n是换行,就是光标移动到下一行,\r是讲光标移动到本行的开始处。
printf("hello %d\r\n",NoPressKeyTime);这样就可以在串口软件上自动换行了。
关键字:STM32 IAR printf函数
引用地址:
STM32在IAR中如何使用printf函数
推荐阅读最新更新时间:2024-03-16 16:22
STM32 启动过程简述
根据启动模式分析的结论: 1、 通过boot引脚设置可以将中断向量表定位于SRAM区,即起始地址为0x02000000,同时复位后PC指针位于0x02000000处; 2、 通过boot引脚设置可以将中断向量表定位于FLASH区,即起始地址为0x08000000,同时复位后PC指针位于0x08000000处; 3、 通过boot引脚设置可以将中断向量表定位于内置Bootloader区,本文不对这种情况做论述; STM32 将0x8000000 映射到 0x00000000,即如果从内部FLASH启动,会从 0x08000004 处进行取指令 (CM3定义的 0x08000000 用于存放SP指针),故,0x00000000 与
[单片机]
IAR for AVR 学习笔记(3)--位操作
3.1.在c语言里对位的操作如一般如下: PORTB|=(1 2);//置PORTB的第2位=1 PORTB&=~(1 2);//置PORTB的第2位=0 PORTB^|=(1 2);//取反PORTB的第2位 While(PORTB&(1 2));//判断1 While(!(PORTB&(1 2)));//判断为0 3.2.IAR编译器对位的支持更强大,除了上面的方法外还有以下更简单的操作方法: PORTB_ Bit2=1; //置PORTB的第2位=1 PORTB_ Bit2=0; //置PORTB的第2位=0 PORTB_ Bit2=~ PORTB_ Bit2;//取反PORTB的第2位 While(PORTB_ Bit2)
[单片机]
stm32 freertos 之串口中断
一、中断处理函数 void USART1_IRQHandler(void) { BaseType_t xHigherPriorityTaskWoken; xHigherPriorityTaskWoken = pdFALSE; u8 cChar; if(USART_GetITStatus (USART1,USART_IT_RXNE)!=RESET) { cChar=USART_ReceiveData(USART1); xQueueSendToBackFromISR (xQueueRx,&cChar,&xHigherPriorityTaskWoken); portYIELD_FROM_ISR(xHigherPri
[单片机]
STM32基础设计(7)---时钟中断(控制LED灯)
本文将介绍STM32的基础时钟,通过时钟中断来控制LED灯的亮灭。 本文的大致思路如下: 1,LED的GPIO口初始化 2,中断初始化 3,时钟初始化 4,编写中断函数 5,编写主函数 首先讲下笔者在做这个设计时得到的教训: 笔者最初是用TIM6基础时钟来实现设计功能,在编写完代码后发现,灯不亮,于是笔者就开始整问题了。先看看代码有没有编写错误,检查一遍后,中断通道使用正确,TIM6配置正确,LED灯的串口也没有问题,中断函数也正常编写了。然后笔者纠结了,他妈代码全对了怎么就运行失败?(原谅笔者爆粗口,因为当时心情的确很不好,可以想象一下,辛辛苦苦桥的代码,没什么毛病,结果到了板子上还运行不
[单片机]
STM32 UART(接收 ,发送数据)
UART接收发送数据: 平台:STM32F401 discovery版 此代码用的UART6,TX,RX对应的PIN脚是PC6,PC7 如图: 代码如下: 步骤一:初始化串口的GPIO,USART,并且配置上UART的RX中断 void USART6_Config(void) { USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; /* Enable GPIO clock */ RCC_AHB1Per
[单片机]
STM32 用RS485进行半双工通信出现的问题
最近接了一个项目,需要用到RS485总线同时和多台机器通信,方式是半双工,但是当向总线一次发送大量数据的时候,STM32就会像出现死机一样,经过调试发现串口在既不是接收数据中断,也不是发送数据中断的情况下不断进入串口中断,当时瞬间怀疑的是:串口产生了什么错误导致一直进入中断。 经过调试和查找资料得出如下解决办法: 在串口中断中添加如下语句: if(USART_GetFlagStatus(USART1,USART_FLAG_ORE!=RESET)) { USART_ClearFlag(USART1,USART_FLAG_ORE); USART_ReceiveData(USART1); }
[单片机]
STM32 八路AD转换用DMA传输调试成功,DMA传输不错位
// // #include stm32f10x_conf.h //把DMA.h和ADC.h 的注释去掉 #include stm32f10x.h #include stm32_eval.h #include #define N 50 //每通道采50次 #define M 8 //为8个通道 #define ADC1_DR_Address ((u32)0x4001244C) vu16 After_filter ; //用来存放求平均值之后的结果 vu16 AD_Value ; //用来存放ADC转换结果,也是DMA的目标地址
[单片机]
STM32 SysTick中断使用方法
SysTick中断属于核内外设中断器,中断号为-1。想要使用SysTick中断,只需在SysTick查询定时上进行稍微的修改。需要添加开启中断,直接用中断函数对计数标志位进行清零,不再使用查询方式判断计数是否结束去清零。中断函数接口SysTick_Handler在汇编文件中已经给出定义,直接到文件中查找即可。 本来NVIC提供了中断使能的函数,但是要求中断号要大于0(Value cannot be negative.),所以就不能调用NVIC中断使能函数了,直接在操作寄存器开启中断就可以了。 修改如下: #include delay.h #include led.h void Systick_Delayus
[单片机]