OpenEdv-开源电子网

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

USART3和TIM初始化的问题

[复制链接]

13

主题

126

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
399
金钱
399
注册时间
2016-5-25
在线时间
101 小时
发表于 2016-11-14 12:30:35 | 显示全部楼层 |阅读模式
10金钱
TIM8的初始化:

[mw_shl_code=c,true]void PWM_TIM8_Init(u16 arr,u16 psc)
{
        GPIO_InitTypeDef GPIO_Init_TypeDef;
        TIM_TimeBaseInitTypeDef TIM_TimeBaseInit_TypeDef;
        TIM_OCInitTypeDef TIM_OCInit_TypeDef;
        NVIC_InitTypeDef NVIC_Init_TypeDef;
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8 |
                                                   RCC_APB2Periph_GPIOC, ENABLE);
       
        TIM_DeInit(TIM8);
       
        GPIO_Init_TypeDef.GPIO_Mode = GPIO_Mode_AF_PP;
        GPIO_Init_TypeDef.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9;
        GPIO_Init_TypeDef.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOC,&GPIO_Init_TypeDef);
       
        TIM_TimeBaseInit_TypeDef.TIM_Period = arr;//设置在下一个更新事件装入活动的自动重装载寄存器周期的值
        TIM_TimeBaseInit_TypeDef.TIM_Prescaler = (psc-1);//设置用来作为TIMx时钟频率除数的预分频值
        TIM_TimeBaseInit_TypeDef.TIM_ClockDivision = TIM_CKD_DIV1;//设置时钟分割:TDTS = Tck_tim
        TIM_TimeBaseInit_TypeDef.TIM_CounterMode = TIM_CounterMode_Up;//TIM向上计数模式
        TIM_TimeBaseInit(TIM8,&TIM_TimeBaseInit_TypeDef);
       
        TIM_OCInit_TypeDef.TIM_OCMode = TIM_OCMode_PWM2;//选择定时器模式 TIM脉冲宽度调制模式2
        TIM_OCInit_TypeDef.TIM_OCPolarity = TIM_OutputState_Enable;//比较脉冲输出使能
        TIM_OCInit_TypeDef.TIM_Pulse = 0;//设置待装入捕获比较寄存器的脉冲值
        TIM_OCInit_TypeDef.TIM_OutputState = TIM_OCPolarity_High;//输出极性  TIM输出比较极性高
        TIM_OC1Init(TIM8,&TIM_OCInit_TypeDef);//根据TIM_OCInitStruct中指定的参数初始化外设TIMx
        TIM_OC2Init(TIM8,&TIM_OCInit_TypeDef);
        TIM_OC3Init(TIM8,&TIM_OCInit_TypeDef);
        TIM_OC4Init(TIM8,&TIM_OCInit_TypeDef);

        TIM_CtrlPWMOutputs(TIM8,ENABLE);        //MOE 主输出使能       
       
        TIM_OC1PreloadConfig(TIM8,TIM_OCPreload_Enable);//CH1预装载使能
        TIM_OC2PreloadConfig(TIM8,TIM_OCPreload_Enable);//CH2预装载使能
        TIM_OC3PreloadConfig(TIM8,TIM_OCPreload_Enable);//CH3预装载使能
        TIM_OC4PreloadConfig(TIM8,TIM_OCPreload_Enable);//CH4预装载使能
       
        NVIC_Init_TypeDef.NVIC_IRQChannel = TIM8_UP_IRQn;  
        NVIC_Init_TypeDef.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级0级
        NVIC_Init_TypeDef.NVIC_IRQChannelSubPriority = 1;  //从优先级0级
        NVIC_Init_TypeDef.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
        NVIC_Init(&NVIC_Init_TypeDef);
       
        TIM_ARRPreloadConfig(TIM8,ENABLE);//使能TIMx在ARR上的预装载寄存器
        TIM_Cmd(TIM8, ENABLE);  //使能TIM8
}[/mw_shl_code]



USART3的初始化:
[mw_shl_code=c,true]void USART3_Init(u32 Baud)
{
        GPIO_InitTypeDef GPIO_Init_TypeDef;
        USART_InitTypeDef USART_Init_TypeDef;
        NVIC_InitTypeDef NVIC_Init_TypeDef;    //结构体重定义
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);
       
//  USART3_TX   GPIOB.10
        GPIO_Init_TypeDef.GPIO_Mode = GPIO_Mode_AF_PP;//复用推挽输出
        GPIO_Init_TypeDef.GPIO_Pin = GPIO_Pin_10;
        GPIO_Init_TypeDef.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB,&GPIO_Init_TypeDef);
       
//  USART3_RX   GPIOB.11
        GPIO_Init_TypeDef.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
        GPIO_Init_TypeDef.GPIO_Pin = GPIO_Pin_11;
        GPIO_Init(GPIOB,&GPIO_Init_TypeDef);
       
//        USART3 NVIC
        NVIC_Init_TypeDef.NVIC_IRQChannel = USART3_IRQn;
        NVIC_Init_TypeDef.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init_TypeDef.NVIC_IRQChannelPreemptionPriority = 3;//抢占优先级
        NVIC_Init_TypeDef.NVIC_IRQChannelSubPriority = 2;//子优先级
        NVIC_Init(&NVIC_Init_TypeDef);
       
//        USART3 初始化设置
        USART_Init_TypeDef.USART_BaudRate = Baud;//设置波特率
        USART_Init_TypeDef.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
        USART_Init_TypeDef.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
        USART_Init_TypeDef.USART_Parity = USART_Parity_No;//无奇偶校验位
        USART_Init_TypeDef.USART_StopBits = USART_StopBits_1;//一个停止位
        USART_Init_TypeDef.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
        USART_Init(USART3,&USART_Init_TypeDef);
        USART_ITConfig(USART3,USART_IT_RXNE,ENABLE);
        USART_Cmd(USART3,ENABLE);
}[/mw_shl_code]

现在遇到的问题就是:先初始化USART3 后初始化TIM8    TIM8产生PWM就会出问题,问题是只有CH4有波形   CH1-3无波形    ,
反过来,先初始化TIM8,再初始化USART3.TIM8就正常,不过偶尔会跑死。
他们两个有什么千丝万缕的关系
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2016-11-14 12:30:36 | 显示全部楼层
王轩 发表于 2016-11-17 14:20
使用寄存器操作没有问题的话,那就是库函数的问题咯?

是的
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

3

主题

2165

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
5773
金钱
5773
注册时间
2013-11-22
在线时间
1211 小时
发表于 2016-11-14 22:54:52 | 显示全部楼层
之前有人遇到过类似的问题,不过交换一下初始化顺序就可以正常工作,还有一种解决办法就是使用寄存器操作。
回复

使用道具 举报

11

主题

73

帖子

0

精华

高级会员

Rank: 4

积分
956
金钱
956
注册时间
2016-10-8
在线时间
123 小时
发表于 2016-11-15 09:19:12 | 显示全部楼层
用J-LINK调试看一下寄存器的配置呗。
回复

使用道具 举报

28

主题

218

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
498
金钱
498
注册时间
2013-11-19
在线时间
92 小时
发表于 2016-11-15 16:43:16 | 显示全部楼层
不会吧,这么奇怪,建议Debug看一下寄存器,把寄存器图贴出来看看
回复

使用道具 举报

13

主题

126

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
399
金钱
399
注册时间
2016-5-25
在线时间
101 小时
 楼主| 发表于 2016-11-17 14:18:53 | 显示全部楼层
lycreturn 发表于 2016-11-14 22:54
之前有人遇到过类似的问题,不过交换一下初始化顺序就可以正常工作,还有一种解决办法就是使用寄存器操作。

初始化顺序交换一下确实没问题,但是这种莫名奇妙的感觉很不好啊~
回复

使用道具 举报

13

主题

126

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
399
金钱
399
注册时间
2016-5-25
在线时间
101 小时
 楼主| 发表于 2016-11-17 14:19:52 | 显示全部楼层
1375917982gxut 发表于 2016-11-15 16:43
不会吧,这么奇怪,建议Debug看一下寄存器,把寄存器图贴出来看看

这两天干别的去了    回过头来继续搞~看看寄存器的变化
回复

使用道具 举报

13

主题

126

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
399
金钱
399
注册时间
2016-5-25
在线时间
101 小时
 楼主| 发表于 2016-11-17 14:20:07 | 显示全部楼层
RobertHand 发表于 2016-11-15 09:19
用J-LINK调试看一下寄存器的配置呗。

嗯   试试咯
回复

使用道具 举报

13

主题

126

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
399
金钱
399
注册时间
2016-5-25
在线时间
101 小时
 楼主| 发表于 2016-11-17 14:20:38 | 显示全部楼层
王轩 发表于 2016-11-17 14:18
初始化顺序交换一下确实没问题,但是这种莫名奇妙的感觉很不好啊~

使用寄存器操作没有问题的话,那就是库函数的问题咯?
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2016-11-17 21:20:58 | 显示全部楼层
王轩 发表于 2016-11-17 14:20
使用寄存器操作没有问题的话,那就是库函数的问题咯?

是的
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

13

主题

126

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
399
金钱
399
注册时间
2016-5-25
在线时间
101 小时
 楼主| 发表于 2016-11-18 18:47:50 | 显示全部楼层

刚把四路的PWM初始化用寄存器写了一遍,Ok了   问题解决
回复

使用道具 举报

78

主题

271

帖子

0

精华

高级会员

Rank: 4

积分
695
金钱
695
注册时间
2013-10-20
在线时间
36 小时
发表于 2016-11-18 19:09:48 | 显示全部楼层
大哥  你吧那句TIM_DeInit(TIM8);  去掉 再试试
回复

使用道具 举报

13

主题

126

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
399
金钱
399
注册时间
2016-5-25
在线时间
101 小时
 楼主| 发表于 2016-11-18 22:02:35 | 显示全部楼层
l692519765 发表于 2016-11-18 19:09
大哥  你吧那句TIM_DeInit(TIM8);  去掉 再试试

本来就是没有的   实在没办法了  才加上去的
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-25 10:28

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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