【STM32】常见问题解决2——串口printf无法打印数据,结构体如TIM_TimeBaseInitTypeDef无法找到

本文介绍了解决在使用printf函数时遇到的无法进入仿真问题的方法。通过对usart文件进行相应配置,包括添加与printf相关的函数和支持代码,可以有效解决该问题。此外,还讨论了在移植串口文件过程中遇到的问题及解决策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一. 问题描述

在使用仿真调试的时候,发现只要将printf函数添加上之后,就出现无法进入仿真的问题,程序即使下载到板子上,也无法更新程序
在这里插入图片描述

二.解决方法

在usart文件中,添加上与printf相关的函数,添加后编译烧录可正常进入仿真
在这里插入图片描述

#if 1
#pragma import(__use_no_semihosting)             
//标准库需要的支持函数                 
struct __FILE 
{ 
	int handle; 

}; 

FILE __stdout;       
//定义_sys_exit()以避免使用半主机模式    
void _sys_exit(int x) 
{ 
	x = x; 
} 
//重定义fputc函数 
int fputc(int ch, FILE *f)
{      
	while((USART1->SR&0X40)==0);//循环发送,直到发送完毕   
    USART1->DR = (u8) ch;      
	return ch;
}
#endif 

三.问题扩展

在移植串口文件时,由于usart 文件重名的原因,移除旧的串口文件,出现新的函数找不到的问题,USART1_Config进入不了定义,程序正常编译和烧录,但是无法进入仿真
在这里插入图片描述
最后通过修改文件名,重新添加源文件,重新包含文件路径,可成功进入USART1_Config定义,并且正常编译和烧录,与仿真。

在这里插入图片描述

第二个问题

比如结构体无法找到
TIM_TimeBaseInitTypeDef
在这里插入图片描述

第二个问题解决

在这里插入图片描述

``` void TIM4_Init_Encode(void) // PB7 PB6-TIM4 ch1 ch2 { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; TIM_ICInitTypeDef TIM_ICInitStructure; NVIC_InitTypeDef NVIC_InitStructure; TIM_TimeBaseStructInit(&TIM_TimeBaseInitStructure); //设置缺省值,这一步最好加上防止放到串口初始化后出问题 // TIM_OCStructInit(&TIM_OCInitStructure); //设置缺省值,这一步最好加上防止放到串口初始化后出问题 TIM_ICStructInit(&TIM_ICInitStructure); //设置缺省值,这一步最好加上防止放到串口初始化后出问题 //时钟设置TIM4 GPIOB RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //初始化 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输入 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); //定时器时基单元配置 TIM_DeInit(TIM4); if (TIM4_ENCODER_MODE<TIM_EncoderMode_TI12) TIM4_Encoder_Line_Multiple=2;//单相单边沿计数,2倍 else TIM4_Encoder_Line_Multiple=4;//双相双边沿计数,4倍 TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;//时钟分频 TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;//编码器模式下该参数没作用 TIM_TimeBaseInitStructure.TIM_Period = 10000-1; //最大计数值为编码器一圈最大输出脉冲 TIM_TimeBaseInitStructure.TIM_Prescaler = 1 - 1; //PSC 编码器信号不分频 TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0x00; //重复计数0 TIM_TimeBaseInit(TIM4, &TIM_TimeBaseInitStructure); //定时器4输入捕获通道设置 TIM_ICStructInit(&TIM_ICInitStructure);//定时器输入捕获结构体初始化 编码器模式结构体中部分参数没作用,调用初始化函数给默认值 TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;//通道1 TIM_ICInitStructure.TIM_ICFilter = 0xF;//滤波器 TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;//此处上升沿表示编码器信号不反向 高低不反转 TIM_ICInit(TIM4, &TIM_ICInitStructure); TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;//通道2 TIM_ICInitStructure.TIM_ICFilter = 0xF;//滤波器 TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;//此处上升沿表示编码器信号不反向 高低不反转 TIM_ICInit(TIM4, &TIM_ICInitStructure); NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); //编码器模式配置 TIM_EncoderInterfaceConfig(TIM4,TIM_EncoderMode_TI12,TIM_ICPolarity_Rising,TIM_ICPolarity_Rising);//后两个参数同为编码器信号反向设置此次配置会覆盖上面,所以上面不设置也行 /*开启编码器溢出中断*/ TIM_ClearITPendingBit(TIM4, TIM_IT_Update ); TIM_ClearFlag(TIM4, TIM_FLAG_Update); TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE); TIM4->CNT = 0; TIM_Cmd(TIM4,ENABLE);//定时器使能 } /************************************************************************** 函数功能:读取编码器的脉冲数据 入口参数:无 返回 值:无 **************************************************************************/ s32 TIM4_Get_Encode(void) { s32 count; float speed,position; speed = TIM4_Circle_Count*TIM4_Encoder_Line_Number*TIM4_Encoder_Line_Multiple+(short)TIM4->CNT; position +=speed; speed = speed*100/10000; position = position*0.036; Encode_Speed = speed; Encode_position = position; printf("speed:%lf position:%lf\r\n",speed,position); return count; } void TIM4_IRQHandler(void) { if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET) { TIM_ClearITPendingBit(TIM4, TIM_IT_Update ); if ((TIM4->CR1 & TIM_CR1_DIR) == 0) // 使用宏定义判断方向 TIM4_Circle_Count++; else TIM4_Circle_Count--; } TIM_ClearITPendingBit(TIM4, TIM_IT_Update ); }```分析代码
最新发布
03-15
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风雨同舟1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值