OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4959|回复: 7

TIM定时器时printf函数无法打印

[复制链接]

19

主题

122

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
218
金钱
218
注册时间
2014-8-20
在线时间
0 小时
发表于 2014-12-15 11:26:54 | 显示全部楼层 |阅读模式
5金钱
[mw_shl_code=c,true]#include "stm32f10x_lib.h" #include "stdio.h" #include "stdlib.h" #include <string.h> /* 自定义同义关键字 --------------------------------------------------------*/ /* 自定义参数宏 --------------------------------------------------------*/ /* 自定义函数宏 --------------------------------------------------------*/ /* 自定义全局变量 ----------------------------------------------------*/ vu16 CCR1_Val = 40000; /* 初始化输出比较通道1计数周期变量*/ vu16 CCR2_Val = 20000; /* 初始化输出比较通道2计数周期变量*/ vu16 CCR3_Val = 10000; /* 初始化输出比较通道3计数周期变量*/ vu16 CCR4_Val = 5000; /* 初始化输出比较通道4计数周期变量*/ vu16 countersecond; /* 自定义函数声明 --------------------------------------------------------*/ void RCC_Configuration(void); void GPIO_Configuration(void); void NVIC_Configuration(void); void TIM_Configuration(void); void USART_Configuration(void); void USART_Printf(USART_TypeDef* USARTx,char *pch); void Delay_us(vu32 n); void Delay_s(vu32 n); void Delay_ms(vu32 n); int fputc(int ch, FILE *f); /******************************************************************************* * 函数名 : main * 函数描述 : main 函数 * 输入参数 : 无 * 输出结果 : 无 * 返回值 : 无 *******************************************************************************/ int main(void) { /* 设置系统时钟 */ RCC_Configuration(); /* 设置 NVIC */ GPIO_Configuration(); USART_Configuration(); NVIC_Configuration(); /* 设置 GPIO 端口 */ /* 设置 TIM */ TIM_Configuration(); while (1) { if(countersecond==0x08) { GPIO_WriteBit(GPIOA, GPIO_Pin_4, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_4))); // printf("2014年12月15日 星期一 阴天\r\n"); // USART_Printf(USART1,"2014年12月15日 星期一 阴天\r\n"); countersecond=0; } } } /****************************************************************************** * 函数名 : Delay_us 、Delay_s * 函数描述 : Systick延时程序 * 输入参数 : 无 * 输出结果 : 无 * 返回值 : 无 ******************************************************************************/ void Delay_us(vu32 n) { SysTick->LOAD=72*n; //装载计数值,,因为时钟为72M,72次计时1us SysTick->CTRL=0x00000005; //时钟来源为HCLK(72M),打开定时器 while(!(SysTick->CTRL&0x00010000)); //等待计数到0 SysTick->CTRL=0x00000004; //关闭定时器 } void Delay_s(vu32 n) { vu16 i; for (i=0;i<5*n;i++) Delay_us(200000); } void Delay_ms(vu32 n) { vu16 i; for (i=0;i<5*n;i++) Delay_us(200); } /****************************************************************************** * 函数名 : RCC_Configuration * 函数描述 : 设置系统各部分时钟 * 输入参数 : 无 * 输出结果 : 无 * 返回值 : 无 ******************************************************************************/ void RCC_Configuration(void) { /* 定义枚举类型变量 HSEStartUpStatus */ ErrorStatus HSEStartUpStatus; /* 复位系统时钟设置 */ RCC_DeInit(); /* 开启 HSE */ RCC_HSEConfig(RCC_HSE_ON); /* 等待 HSE 起振并稳定 */ HSEStartUpStatus = RCC_WaitForHSEStartUp(); /* 判断 HSE 起是否振成功,是则进入if()内部 */ if(HSEStartUpStatus == SUCCESS) { /* 选择 HCLK(AHB)时钟源为SYSCLK 1分频 */ RCC_HCLKConfig(RCC_SYSCLK_Div1); /* 选择 PCLK2 时钟源为 HCLK(AHB) 1分频 */ RCC_PCLK2Config(RCC_HCLK_Div1); /* 选择 PCLK1 时钟源为 HCLK(AHB) 2分频 */ RCC_PCLK1Config(RCC_HCLK_Div2); /* 设置 FLASH 延时周期数为2 */ FLASH_SetLatency(FLASH_Latency_2); /* 使能 FLASH 预取缓存 */ FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); /* 选择锁相环(PLL)时钟源为HSE 1分频,倍频数为9,则输出频率为72MHz */ RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); /* 使能 PLL */ RCC_PLLCmd(ENABLE); /* 等待 PLL 输出稳定 */ while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); /* 选择 SYSCLK 时钟源为 PLL */ RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); /* 等待 PLL 成为 SYSCLK 时钟源 */ while(RCC_GetSYSCLKSource() != 0x08); } /* 打开 TIM2 时钟 */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); /* 打开 APB 总线上的 GPIOA,USART1 时钟 */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE); } /******************************************************************************* * 函数名 : GPIO_Configuration * 函数描述 : 设置各GPIO端口功能 * 输入参数 : 无 * 输出结果 : 无 * 返回值 : 无 *******************************************************************************/ void GPIO_Configuration(void) { /* 定义 GPIO 初始化结构体 GPIO_InitStructure */ GPIO_InitTypeDef GPIO_InitStructure; /* 配置 GPIOA.4, GPIOA.5, GPIOA.6, GPIOA.7 为推挽输出 */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3|GPIO_Pin_4; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); /* 设置USART1的Tx脚(PA.9)为第二功能推挽输出模式 */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA , &GPIO_InitStructure); /* 设置USART1的Rx脚(PA.10)为浮空输入脚 */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA , &GPIO_InitStructure); } /******************************************************************************* * 函数名 : TIM_Configuration * 函数描述 : 设置TIM各通道 * 输入参数 : 无 * 输出结果 : 无 * 返回值 : 无 *******************************************************************************/ void TIM_Configuration(void) { /* 定义 TIM_TimeBase 初始化结构体 TIM_TimeBaseStructure */ TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; /* 定义 TIM_OCInit 初始化结构体 TIM_OCInitStructure */ TIM_OCInitTypeDef TIM_OCInitStructure; /* * 计数重载值为65535 * 预分频值为(7199 + 1 = 7200) * 时钟分割0 * 向上计数模式 */ TIM_TimeBaseStructure.TIM_Period = 65535; TIM_TimeBaseStructure.TIM_Prescaler = 0; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2 , &TIM_TimeBaseStructure); /* 设置预分频值,且立即装入 */ TIM_PrescalerConfig(TIM2 , 7199 , TIM_PSCReloadMode_Immediate); /* * 设置 OC1,OC2,OC3,OC4 通道 * 工作模式为计数器模式 * 使能比较匹配输出极性 * 时钟分割0 * 向上计数模式 */ TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Timing; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OCInitStructure.TIM_Pulse = CCR1_Val; TIM_OC1Init(TIM2, &TIM_OCInitStructure); TIM_OCInitStructure.TIM_Pulse = CCR2_Val; TIM_OC2Init(TIM2, &TIM_OCInitStructure); TIM_OCInitStructure.TIM_Pulse = CCR3_Val; TIM_OC3Init(TIM2, &TIM_OCInitStructure); TIM_OCInitStructure.TIM_Pulse = CCR4_Val; TIM_OC4Init(TIM2, &TIM_OCInitStructure); /* 禁止预装载寄存器 */ TIM_OC1PreloadConfig(TIM2 , TIM_OCPreload_Disable); TIM_OC2PreloadConfig(TIM2 , TIM_OCPreload_Disable); TIM_OC3PreloadConfig(TIM2 , TIM_OCPreload_Disable); TIM_OC4PreloadConfig(TIM2 , TIM_OCPreload_Disable); /* 使能 TIM 中断 */ TIM_ITConfig(TIM2 , TIM_IT_CC1 | TIM_IT_CC2 | TIM_IT_CC3 | TIM_IT_CC4 , ENABLE); /* 启动 TIM 计数 */ TIM_Cmd(TIM2 , ENABLE); } /******************************************************************************* * 函数名 : NVIC_Configuration * 函数描述 : 设置NVIC参数 * 输入参数 : 无 * 输出结果 : 无 * 返回值 : 无 *******************************************************************************/ void NVIC_Configuration(void) { /* 定义 NVIC 初始化结构体 */ NVIC_InitTypeDef NVIC_InitStructure; /* #ifdef...#else...#endif结构的作用是根据预编译条件决定中断向量表起始地址*/ #ifdef VECT_TAB_RAM /* 中断向量表起始地址从 0x20000000 开始 */ NVIC_SetVectorTable(NVIC_VectTab_RAM , 0x0); #else /* VECT_TAB_FLASH */ /* 中断向量表起始地址从 0x80000000 开始 */ NVIC_SetVectorTable(NVIC_VectTab_FLASH , 0x0); #endif /* 选择优先级分组0 */ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); /* 开启 TIM2 中断, 0级先占优先级,0级后占优先级 */ NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQChannel; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQChannel; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } /******************************************************************************* * 函数名 : USART_Configuration * 函数描述 : 设置USART1 * 输入参数 : None * 输出结果 : None * 返回值 : None *******************************************************************************/ void USART_Configuration(void) { /* 定义USART初始化结构体 USART_InitStructure */ USART_InitTypeDef USART_InitStructure; /* 配置串口5、串口2、串口3未使用硬件流 * 波特率为9600bps * 8位数据长度 * 1个停止位,无校验 * 禁用硬件流控制 * 禁止USART时钟 * 时钟极性低 * 在第2个边沿捕获数据 * 最后一位数据的时钟脉冲不从 SCLK 输出 */ USART_InitStructure.USART_BaudRate = 9600; 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; USART_Init(USART1, &USART_InitStructure); USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启串口2接收中断 USART_Cmd(USART1, ENABLE); } void USART_Printf(USART_TypeDef* USARTx,char *pch) { while(*pch != '\0') { USART_SendData(USARTx,*pch); while(USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET); USART_ClearFlag(USARTx, USART_FLAG_TXE); pch++; } } /*int fputc(int ch, FILE *f) { USART_SendData(USART1, (unsigned char) ch);// USART1 可以换成 USART2 等 while (!(USART1->SR & USART_FLAG_TC)); return (ch); } */ [/mw_shl_code] [mw_shl_code=c,true] [/mw_shl_code] [mw_shl_code=c,true]这是Timer定时器中断函数[/mw_shl_code] [mw_shl_code=c,true]void TIM2_IRQHandler(void) { vu16  capture = 0; /* 当前捕获计数值局部变量 */ /*  * TIM2 时钟 = 72 MHz, 分频数 = 7299 + 1, TIM2 counter clock = 10KHz * CC1 更新率 = TIM2 counter clock / CCRx_Val */ if (TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESET) { GPIO_WriteBit(GPIOA, GPIO_Pin_0, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_0))); /* 读出当前计数值 */ capture = TIM_GetCapture1(TIM2); /* 根据当前计数值更新输出捕获寄存器 */ TIM_SetCompare1(TIM2, capture + CCR1_Val); TIM_ClearITPendingBit(TIM2, TIM_IT_CC1); } else if (TIM_GetITStatus(TIM2, TIM_IT_CC2) != RESET) { GPIO_WriteBit(GPIOA, GPIO_Pin_1, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_1))); capture = TIM_GetCapture2(TIM2); TIM_SetCompare2(TIM2, capture + CCR2_Val); TIM_ClearITPendingBit(TIM2, TIM_IT_CC2); } else if (TIM_GetITStatus(TIM2, TIM_IT_CC3) != RESET) { GPIO_WriteBit(GPIOA, GPIO_Pin_2, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_2))); capture = TIM_GetCapture3(TIM2); TIM_SetCompare3(TIM2, capture + CCR3_Val); TIM_ClearITPendingBit(TIM2, TIM_IT_CC3); countersecond++; } else { GPIO_WriteBit(GPIOA, GPIO_Pin_3, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_3))); capture = TIM_GetCapture4(TIM2); TIM_SetCompare4(TIM2, capture + CCR4_Val); TIM_ClearITPendingBit(TIM2, TIM_IT_CC4); } } [/mw_shl_code] [mw_shl_code=c,true] [/mw_shl_code]
就是一个死循环,这个打印函数,我在其他地方用都是好的,就是这个地方有问题。。。这是一个timer定时器。 在里面屏蔽掉打印,直接让灯亮灯灭,是对的。就是加入打印函数的时候,就在打印函数那个地方死循环。该配置的地方我都配置了的。 求指导。。

最佳答案

查看完整内容[请看2#楼]

擦,没初始化串口1。。。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

19

主题

122

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
218
金钱
218
注册时间
2014-8-20
在线时间
0 小时
 楼主| 发表于 2014-12-15 11:26:55 | 显示全部楼层
擦,没初始化串口1。。。
回复

使用道具 举报

1

主题

10

帖子

0

精华

新手上路

积分
20
金钱
20
注册时间
2015-12-27
在线时间
2 小时
发表于 2016-6-16 10:49:40 | 显示全部楼层
也遇到了类似的问题,初始化都完成了,在定时器函数里面打印就是不行,其它的都可以!
回复

使用道具 举报

1

主题

10

帖子

0

精华

新手上路

积分
20
金钱
20
注册时间
2015-12-27
在线时间
2 小时
发表于 2016-6-16 10:50:39 | 显示全部楼层
[mw_shl_code=cpp,true]#include "tim.h"
#include "usart.h"

/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

TIM_HandleTypeDef htim2;

/* TIM2 init function */
void MX_TIM2_Init(void)
{
  TIM_ClockConfigTypeDef sClockSourceConfig;
  TIM_MasterConfigTypeDef sMasterConfig;

  htim2.Instance = TIM2;
  htim2.Init.Prescaler = 8399;
  htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim2.Init.Period = 10000;
  htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  HAL_TIM_Base_Init(&htim2);

  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig);

  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig);
       
        //printf("3&#245;ê&#188;&#187;ˉ&#182;¨ê±&#198;÷oˉêy\r\n");//′&#203;′|&#212;&#203;DD2&#187;í¨
        //HAL_TIM_Base_Start_IT(&htim2);

}

void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base)
{

  if(htim_base->Instance==TIM2)
  {
  /* USER CODE BEGIN TIM2_MspInit 0 */

  /* USER CODE END TIM2_MspInit 0 */
    /* Peripheral clock enable */
    __TIM2_CLK_ENABLE();

    /* Peripheral interrupt init*/
    HAL_NVIC_SetPriority(TIM2_IRQn, 0, 0);
    HAL_NVIC_EnableIRQ(TIM2_IRQn);
  /* USER CODE BEGIN TIM2_MspInit 1 */

  /* USER CODE END TIM2_MspInit 1 */
  }
}

void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* htim_base)
{

  if(htim_base->Instance==TIM2)
  {
  /* USER CODE BEGIN TIM2_MspDeInit 0 */

  /* USER CODE END TIM2_MspDeInit 0 */
    /* Peripheral clock disable */
    __TIM2_CLK_DISABLE();

    /* Peripheral interrupt Deinit*/
    HAL_NVIC_DisableIRQ(TIM2_IRQn);

  }
  /* USER CODE BEGIN TIM2_MspDeInit 1 */

  /* USER CODE END TIM2_MspDeInit 1 */
}

/* USER CODE BEGIN 1 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
        if(htim->Instance==TIM2)
        {
                printf("ehhe\r\n");
                HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_4);
        }
}[/mw_shl_code]
回复

使用道具 举报

1

主题

10

帖子

0

精华

新手上路

积分
20
金钱
20
注册时间
2015-12-27
在线时间
2 小时
发表于 2016-6-16 10:51:49 | 显示全部楼层
两个printf函数都不可以!初始化里面一个,中断函数里面一个
回复

使用道具 举报

1

主题

10

帖子

0

精华

新手上路

积分
20
金钱
20
注册时间
2015-12-27
在线时间
2 小时
发表于 2016-6-16 10:52:11 | 显示全部楼层
void MX_USART1_UART_Init(void)
{

  huart1.Instance = USART1;
  huart1.Init.BaudRate = 115200;
  huart1.Init.WordLength = UART_WORDLENGTH_8B;
  huart1.Init.StopBits = UART_STOPBITS_1;
  huart1.Init.Parity = UART_PARITY_NONE;
  huart1.Init.Mode = UART_MODE_TX_RX;
  huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart1.Init.OverSampling = UART_OVERSAMPLING_16;
  HAL_UART_Init(&huart1);

}

void HAL_UART_MspInit(UART_HandleTypeDef* huart)
{

  GPIO_InitTypeDef GPIO_InitStruct;
  if(huart->Instance==USART1)
  {
  /* USER CODE BEGIN USART1_MspInit 0 */

  /* USER CODE END USART1_MspInit 0 */
    /* Peripheral clock enable */
    __USART1_CLK_ENABLE();
  
    /**USART1 GPIO Configuration   
    PA9     ------> USART1_TX
    PA10     ------> USART1_RX
    */
    GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  /* USER CODE BEGIN USART1_MspInit 1 */

  /* USER CODE END USART1_MspInit 1 */
  }
}

void HAL_UART_MspDeInit(UART_HandleTypeDef* huart)
{

  if(huart->Instance==USART1)
  {
  /* USER CODE BEGIN USART1_MspDeInit 0 */

  /* USER CODE END USART1_MspDeInit 0 */
    /* Peripheral clock disable */
    __USART1_CLK_DISABLE();
  
    /**USART1 GPIO Configuration   
    PA9     ------> USART1_TX
    PA10     ------> USART1_RX
    */
    HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9|GPIO_PIN_10);

  }
  /* USER CODE BEGIN USART1_MspDeInit 1 */

  /* USER CODE END USART1_MspDeInit 1 */
}

/* USER CODE BEGIN 1 */
int fputc(int ch,FILE* f)
{
        while((USART1->SR&0x40)==0);
        USART1->DR=(uint8_t)ch;
        return ch;
}
回复

使用道具 举报

1

主题

10

帖子

0

精华

新手上路

积分
20
金钱
20
注册时间
2015-12-27
在线时间
2 小时
发表于 2016-6-16 10:52:47 | 显示全部楼层
这个是串口函数! 其它地方都可以打印,除了定时器!
回复

使用道具 举报

1

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
90
金钱
90
注册时间
2016-6-1
在线时间
27 小时
发表于 2016-10-20 14:15:06 | 显示全部楼层
fly0000 发表于 2014-12-15 11:26
擦,没初始化串口1。。。

楼主,用了你的代码,怎么也没办法打印啊
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-24 08:57

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表