OpenEdv-开源电子网

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

stm32 串口初始化后,无法使用tim8

[复制链接]

5

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2013-5-13
在线时间
0 小时
发表于 2013-8-15 10:15:28 | 显示全部楼层 |阅读模式
使用正点原子的串口初始程序,然后tim8在pwm2模式下运行,无法输出波形,同时tim1,也在工作,正常输出,就是tim8不行,求解?代码如下
u16 TIM1_FLAG,TIM8_FLAG;
void stepper_motor57or42_init_l(u32 PulseFrequency)
{
NVIC_InitTypeDef          NVIC_InitStructure;
GPIO_InitTypeDef          GPIO_InitStructure;
TIM_TimeBaseInitTypeDef   TIM_BaseInitStructure;
TIM_OCInitTypeDef         TIM_OCInitStructure;
u16 nPDTemp ;
nPDTemp = 72000UL/PulseFrequency;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1|RCC_APB2Periph_GPIOA, ENABLE);
NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn;          /*?¨?±?÷????????*/
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;   /*??????????0*/
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;          /*?ì????????1*/
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;             /*???í????*/
NVIC_Init(&NVIC_InitStructure);
GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF_PP; //???ì????
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP; //???ì????
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
TIM_BaseInitStructure.TIM_Period = nPDTemp-1;
TIM_BaseInitStructure.TIM_Prescaler = 999;
TIM_BaseInitStructure.TIM_ClockDivision = 0;
TIM_BaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_BaseInitStructure.TIM_RepetitionCounter = 0;        /*?????¨?±?÷????????*/
TIM_TimeBaseInit(TIM1, &TIM_BaseInitStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; 
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; 
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; 
TIM_OCInitStructure.TIM_Pulse = nPDTemp>>1;//50% 
TIM_OC4Init(TIM1, &TIM_OCInitStructure); 
TIM_ClearFlag(TIM1, TIM_FLAG_Update);
TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE);
TIM_Cmd(TIM1, DISABLE);  //????TIMx???è
TIM_CtrlPWMOutputs(TIM1,DISABLE);
}
///////////////////////////////////////////////////////////////////////////////////

void stepper_motor57or42_init_r(u32 PulseFrequency)
{
NVIC_InitTypeDef          NVIC_InitStructure;
GPIO_InitTypeDef          GPIO_InitStructure;
TIM_TimeBaseInitTypeDef   TIM_BaseInitStructure;
TIM_OCInitTypeDef         TIM_OCInitStructure;
u16 nPDTemp ;
nPDTemp = 72000UL/PulseFrequency;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8|RCC_APB2Periph_GPIOC, ENABLE);
NVIC_InitStructure.NVIC_IRQChannel = TIM8_UP_IRQn;          /*?¨?±?÷????????*/
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;   /*??????????0*/
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;          /*?ì????????1*/
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;             /*???í????*/
NVIC_Init(&NVIC_InitStructure);
GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF_PP; //???ì????
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP; //???ì????
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
TIM_BaseInitStructure.TIM_Period = nPDTemp-1;
TIM_BaseInitStructure.TIM_Prescaler = 999;
TIM_BaseInitStructure.TIM_ClockDivision = 0;
TIM_BaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_BaseInitStructure.TIM_RepetitionCounter = 0;        /*?????¨?±?÷????????*/
TIM_TimeBaseInit(TIM8, &TIM_BaseInitStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; 
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; 
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; 
TIM_OCInitStructure.TIM_Pulse = nPDTemp>>1;//50% 
TIM_OC3Init(TIM8, &TIM_OCInitStructure); 
TIM_ClearFlag(TIM8, TIM_FLAG_Update);
TIM_ITConfig(TIM8, TIM_IT_Update, ENABLE);
TIM_Cmd(TIM8, DISABLE);  //????TIMx???è
TIM_CtrlPWMOutputs(TIM8,DISABLE);
}
/////////////////////////////////////////////////////////

void  TIM1_UP_IRQHandler(void)
{
if(TIM1_FLAG>0)
{
TIM1->RCR=255;
TIM1_FLAG--;
}
else if(TIM1_FLAG==0)
{
TIM_Cmd(TIM1, DISABLE);  //????TIMx???è
TIM_CtrlPWMOutputs(TIM1,DISABLE);
}
TIM_ClearITPendingBit(TIM1,  TIM_FLAG_Update); 
}
//////////////////////////////////////////////////////////////

void  TIM8_UP_IRQHandler(void)

if(TIM8_FLAG>0)
{
TIM8->RCR=255;
TIM8_FLAG--;
}
else if(TIM1_FLAG==0)
{
TIM_Cmd(TIM8, DISABLE);  
TIM_CtrlPWMOutputs(TIM8,DISABLE);
}
TIM_ClearITPendingBit(TIM8,  TIM_FLAG_Update); 
}
//////////////////////////////////////////////////////////
void revolution_l(u16 angle,u8 direction)
{
u8 bb;
while(TIM1_FLAG);
TIM1_FLAG=angle/256;
bb=(angle%256)-1;
cw_l=direction;
TIM1->RCR=bb;
TIM_Cmd(TIM1, ENABLE);  //????TIMx???è
TIM_CtrlPWMOutputs(TIM1,ENABLE);
}

void revolution_r(u16 angle,u8 direction)
{
u8 bb;
while(TIM8_FLAG);
TIM8_FLAG=angle/256;
bb=(angle%256)-1;
cw_r=direction;
TIM8->RCR=bb;
TIM_Cmd(TIM8, ENABLE);  
TIM_CtrlPWMOutputs(TIM8,ENABLE);
}
int angle(float angle)
{
float pulse=(float)angle*subsection/1.8;
if((pulse-(int)pulse)>=0.5)
{
pulse+=1;
return pulse;
}
else
{
return pulse;
}
}


///////////////////////////主函数/////////////////////////////////////////////


#include "led.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
//#include "lcd.h"
#include "57or42.h"


int main(void)
{
SystemInit();
uart_init(9600);
//LED_Init();
//LCD_Init();
//LCD_Clear(BLACK);
//POINT_COLOR=WHITE;
//BACK_COLOR=BLACK;
stepper_motor57or42_init_l(1000);
stepper_motor57or42_init_r(1000);
while(1)
{
revolution_r(angle(50),forward);
revolution_l(angle(60),forward);
delay_ms(2500);
}
}
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

5

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2013-5-13
在线时间
0 小时
 楼主| 发表于 2013-8-15 10:18:52 | 显示全部楼层
回复 支持 反对

使用道具 举报

5

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2013-5-13
在线时间
0 小时
 楼主| 发表于 2013-8-15 10:19:06 | 显示全部楼层
求大神指点
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-15 10:59:49 | 显示全部楼层
把串口初始化屏蔽掉就可以TIM8输出PWM了?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

5

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2013-5-13
在线时间
0 小时
 楼主| 发表于 2013-8-15 11:00:32 | 显示全部楼层
回复 支持 反对

使用道具 举报

5

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2013-5-13
在线时间
0 小时
 楼主| 发表于 2013-8-15 11:02:24 | 显示全部楼层
刚试过tim8的ch3的反通道,在pb1,串口初始化的情况下,成功输出波形,
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-15 11:11:47 | 显示全部楼层
不应该哇,TIM8的CH3,CH4在PC8,PC9上,我们的串口初始化没去初始化这两个IO口的哦。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

5

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2013-5-13
在线时间
0 小时
 楼主| 发表于 2013-8-15 11:12:16 | 显示全部楼层
还没搞懂pc6为什么不行
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-15 11:20:01 | 显示全部楼层
仿真看看寄存器状态吧。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2012-10-9
在线时间
0 小时
发表于 2014-1-22 18:46:34 | 显示全部楼层
哥们找到问题了吗?我也遇到了一模一样的问题……
回复 支持 反对

使用道具 举报

83

主题

217

帖子

0

精华

初级会员

Rank: 2

积分
197
金钱
197
注册时间
2016-4-8
在线时间
116 小时
发表于 2016-12-8 11:44:18 | 显示全部楼层
我也遇到一样的问题,屏蔽掉
        USART_InitStructure.USART_BaudRate = bound;
        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);  
屏蔽掉USART1的初始化后,TIM8的4个pwm通道有正常输出,不屏蔽的话,没有输出,能告诉是什么原因么
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
21
金钱
21
注册时间
2016-8-3
在线时间
1 小时
发表于 2016-12-23 14:35:24 | 显示全部楼层
我这边有个程序跟你这情况相反 串口初始化屏蔽后 PWM就没有输出 测试其他程序运行都正常  ,
串口不初始化PWM就没有输出   什么鬼
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2018-7-16
在线时间
1 小时
发表于 2018-7-16 12:01:17 | 显示全部楼层
兄弟,解决了吗?我也遇到了,看了一下底层,当你把串口初始化放在定时器初始化下面就可以用了,但是不知道原因是什么,有知道的大神告知一下啊
回复 支持 反对

使用道具 举报

18

主题

78

帖子

0

精华

初级会员

Rank: 2

积分
100
金钱
100
注册时间
2013-6-27
在线时间
82 小时
发表于 2018-10-26 14:29:08 | 显示全部楼层
vention 发表于 2016-12-8 11:44
我也遇到一样的问题,屏蔽掉
        USART_InitStructure.USART_BaudRate = bound;
        USART_InitStructure.USAR ...

我遇到过uart1和tim1的初始化顺序调换  才能正常使用tim1 的情况
回复 支持 反对

使用道具 举报

18

主题

78

帖子

0

精华

初级会员

Rank: 2

积分
100
金钱
100
注册时间
2013-6-27
在线时间
82 小时
发表于 2018-10-26 14:30:27 | 显示全部楼层
我之前的项目遇到过tim1和tim8和uart1的初始化顺序调换 才能正常使用tim1或tim8,至今不知道原因,
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-21 14:39

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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