OpenEdv-开源电子网

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

【STM32F103奇怪问题】USART1和TIM1PWM相互影响

[复制链接]

2

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
76
金钱
76
注册时间
2016-8-3
在线时间
11 小时
发表于 2016-8-3 10:13:02 | 显示全部楼层 |阅读模式
1金钱
最近做项目遇到了一个奇怪的问题 就是TIM1PWM和usart1相互影响, 就是谁放后面,就会覆盖前面的,
TIM_Config();
USART_Config();  例如这样的话就会覆盖掉前面的TIM1PWM波,

USART_Config();  
TIM_Config();    例如这样的话就会覆盖掉前面的USART1,

我怀疑是端口复用搞得鬼,大家有解决的办法吗?

[mw_shl_code=c,true]void TIM_Config(void)
{
                GPIO_InitTypeDef GPIO_InitStructure;
                TIM_TimeBaseInitTypeDef TIM_TimeBaseStructureInit;
                TIM_OCInitTypeDef TIM_OCInitStructure;
                TIM_BDTRInitTypeDef  TIM_BDTRInitStructure;

                RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);  
                RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);  
                RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);       
                RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);

                GPIO_DeInit(GPIOA);
                GPIO_DeInit(GPIOB);

/*****TIM1_CH1 2 3*****/
                GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10;    //PA8
                GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;  
                GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;

                GPIO_Init(GPIOA,&GPIO_InitStructure);

/*****TIM1_CH1N 2N 3N*****/
                GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;   //PB13
                GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;  
                GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;

                GPIO_Init(GPIOB,&GPIO_InitStructure);[/mw_shl_code]


[mw_shl_code=c,true]void USART_Config(void)
{
                GPIO_InitTypeDef GPIO_InitStructure;       
                USART_InitTypeDef USART_InitStructure;
                NVIC_InitTypeDef NVIC_InitStructure;

                RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
          RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //¿ªÆô¸´ÓÃʱÖÓ
                GPIO_PinRemapConfig(GPIO_Remap_USART1,ENABLE);

                GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_6 ;
                GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF_PP;
                GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
                GPIO_Init(GPIOB, &GPIO_InitStructure);

                GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_7 ;
                GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_IN_FLOATING;
                GPIO_Init(GPIOB, &GPIO_InitStructure);[/mw_shl_code]

最佳答案

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

GPIO_DeInit,这样你把整个IO都重置了。。。之前的配置就自动无效了。。不要这个代码。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2016-8-3 10:13:03 | 显示全部楼层
GPIO_DeInit,这样你把整个IO都重置了。。。之前的配置就自动无效了。。不要这个代码。
回复

使用道具 举报

2

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
76
金钱
76
注册时间
2016-8-3
在线时间
11 小时
 楼主| 发表于 2016-8-3 10:16:46 | 显示全部楼层
主函数这样的话TIM就被覆盖掉了,反过来TIM在后面的话,USART就被覆盖掉了
[mw_shl_code=c,true]int main(void)
{
        SystemInit();
        TIM_Config();
        USART_Config(); [/mw_shl_code]
回复

使用道具 举报

5

主题

184

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1050
金钱
1050
注册时间
2016-5-13
在线时间
111 小时
发表于 2016-8-4 08:52:56 | 显示全部楼层
正点原子 发表于 2016-8-3 10:13
GPIO_DeInit,这样你把整个IO都重置了。。。之前的配置就自动无效了。。不要这个代码。

我的也是这种情况,但是配置时没有用GPIO_DeInit,只要配置TIM1 输出PWM,串口1能接收PC端数据,不能发送。
回复

使用道具 举报

2

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
76
金钱
76
注册时间
2016-8-3
在线时间
11 小时
 楼主| 发表于 2016-8-5 10:55:42 | 显示全部楼层
谢谢原子哥!!!!  
回复

使用道具 举报

13

主题

126

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
399
金钱
399
注册时间
2016-5-25
在线时间
101 小时
发表于 2016-11-14 11:23:21 | 显示全部楼层
zhuifeng8911 发表于 2016-8-4 08:52
我的也是这种情况,但是配置时没有用GPIO_DeInit,只要配置TIM1 输出PWM,串口1能接收PC端数据,不能发送 ...

我也遇到了,用的TIm8和USART3,没有用Deinit   还不知道问题出在了哪里
回复

使用道具 举报

26

主题

96

帖子

0

精华

高级会员

Rank: 4

积分
669
金钱
669
注册时间
2015-9-15
在线时间
143 小时
发表于 2016-12-23 11:28:49 | 显示全部楼层
王轩 发表于 2016-11-14 11:23
我也遇到了,用的TIm8和USART3,没有用Deinit   还不知道问题出在了哪里

问题解决了吗?我也遇到了
回复

使用道具 举报

11

主题

52

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
461
金钱
461
注册时间
2014-11-23
在线时间
192 小时
发表于 2017-2-16 14:16:20 | 显示全部楼层
我也遇到了 求解!!!
/*
  适用于STM32F103CBT6 / STM32F103C8T6
*/
int main(void)
{       
        u16 led0pwmval=0;   
        u8 dir=1;       
        u8 T_Clock;
        delay_init();                       //延时函数初始化          
        LED_GPIO_Config();         //LED I/O初始化
//        uart_init(115200);         //初始化串口1的波特率为115200 初始化串口1(PA9 PA10)放TIM1_PWM_Init()前PA8(不正常)无电压变化-0V 串口发送正常
        TIM1_PWM_Init(900-1,1-1); //3分频,则计数频率为72M/3=24 Hz,PWM频率=24M/24000=1Khz (PA8)
        uart_init(115200);         //初始化串口1的波特率为115200 初始化串口1(PA9 PA10)放TIM1_PWM_Init()后PA8正常 串口发送也正常
        while(1)
        {
               
                if(dir)led0pwmval++;
                else led0pwmval--;         
                if(led0pwmval>300)dir=0;
                if(led0pwmval==0)dir=1;                                                    
                TIM_SetCompare1(TIM1,led0pwmval);       
               
                if(T_Clock==200)
                {
                        LED0 = !LED0;
                }
                T_Clock++;
                printf("程序正在运行\r\n");
                delay_ms(5);                        
        }
}
菜鸟不可怕,就怕菜鸟不愿飞 | | | -===+=====_/(T)\_=====+===- | |/.\| | `-|\_/|-'
回复

使用道具 举报

4

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
91
金钱
91
注册时间
2017-5-24
在线时间
25 小时
发表于 2017-5-24 21:48:37 | 显示全部楼层
hxyqq87 发表于 2017-2-16 14:16
我也遇到了 求解!!!
/*
  适用于STM32F103CBT6 / STM32F103C8T6

学长 问题原因找到了吗 求赐教
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2017-7-19
在线时间
3 小时
发表于 2017-7-19 09:16:18 | 显示全部楼层
我的也是 求解 串口1和串口2都会遇到这个问题
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2017-6-16
在线时间
2 小时
发表于 2017-10-13 10:18:19 | 显示全部楼层
我也遇到了,我先初始化串口,然后在初始化pwm,PA8无pwm输出,查看 PA8 除了是TIM1_ch1 外 也是 串口1CK 引脚 如何解决这个为题
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2017-6-16
在线时间
2 小时
发表于 2017-10-13 12:22:35 | 显示全部楼层
外道超car 发表于 2017-10-13 10:18
我也遇到了,我先初始化串口,然后在初始化pwm,PA8无pwm输出,查看 PA8 除了是TIM1_ch1 外 也是 串口1CK  ...

我调整我的 串口优先级 然后 pwm就有输出了
回复

使用道具 举报

2

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2013-12-10
在线时间
9 小时
发表于 2020-6-17 15:11:16 | 显示全部楼层
zhuifeng8911 发表于 2016-8-4 08:52
我的也是这种情况,但是配置时没有用GPIO_DeInit,只要配置TIM1 输出PWM,串口1能接收PC端数据,不能发送 ...

我遇到的问题跟你差不多,我是用TIM3的ch1即PA6管脚比较输出一个方波。但是神奇的事是TIM3在UART1前初始化,一点问题没有,把TIM3放到USART1后初始化,方波就没有输出了。经过比对寄存器发现CCR1的值正常应该是0结果不输出方波时CCR1的值大多数时候是0xA5A5,有的时候还是0x0800,影响这个CCR1的值就是TIM_OCInitTypeDef  TIM_OCInitStructure;这个结构体变量,所以我猜想可能的原因是因为结构体变量是局部变量,没有指定初始化值,使结构体成员TIM_Pulse是个随机值,最终导致CCR1的值错误。所以没输出了。所以在申请变量的地方给这个结构体的局部变量赋初值为0就好了。
回复

使用道具 举报

4

主题

13

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2018-4-5
在线时间
5 小时
发表于 2020-8-11 10:37:02 | 显示全部楼层
外道超car 发表于 2017-10-13 10:18
**** 作者被禁止或删除 内容自动屏蔽 ****

解决了 吗
回复

使用道具 举报

1

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2020-10-3
在线时间
9 小时
发表于 2020-10-26 11:46:28 | 显示全部楼层
本帖最后由 一车一世界 于 2020-10-26 11:51 编辑

遇到了同样的问题!!!我这样放置ADC、PWM和usart就都能运行,但是换个顺序就不行了。我感觉很奇怪。


这是三个初始化函数,
void ADC_InitFunction(void)
{
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_ADC1,ENABLE);
        
        GPIO_InitTypeDef GPIO_InitStructure;
        ADC_InitTypeDef ADC_InitStructure;

        
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模拟输入
        //GPIO_InitStructure.GPIO_Speed
        GPIO_Init(GPIOA,&GPIO_InitStructure);
        
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
        GPIO_Init(GPIOA,&GPIO_InitStructure);
        
        ADC_DeInit(ADC1);  //复位ADC1,将外设 ADC1 的全部寄存器重设为缺省值
        RCC_ADCCLKConfig(RCC_PCLK2_Div8);

        
        ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
        ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
        ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
        ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
        ADC_InitStructure.ADC_NbrOfChannel = 2;
        ADC_InitStructure.ADC_ScanConvMode = DISABLE;
        ADC_Init(ADC1,&ADC_InitStructure);

        ADC_Cmd(ADC1,ENABLE);
        
        //开启校准
        ADC_ResetCalibration(ADC1); //开启复位校准
        while(ADC_GetResetCalibrationStatus(ADC1)); //等待校准结束
        ADC_StartCalibration(ADC1); //开启AD校准
        while(ADC_GetCalibrationStatus(ADC1)); //等待校准结束
}

/*******************************************************/
void PWM_DAC_InitFunction(u16 arr,u16 psc)
{
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);
        
        GPIO_InitTypeDef GPIO_InitStructure;
        TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
        TIM_OCInitTypeDef TIM_OCInitStructure;
        
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //作为TIM1的Channel1
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用功能输出
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA,&GPIO_InitStructure);

        TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
        TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
        TIM_TimeBaseInitStructure.TIM_Period = arr;
        TIM_TimeBaseInitStructure.TIM_Prescaler = psc;
        //TIM_TimeBaseInitStructure.TIM_RepetitionCounter =
        TIM_TimeBaseInit(TIM1,&TIM_TimeBaseInitStructure);
        
        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 = 0;
        TIM_OC1Init(TIM1,&TIM_OCInitStructure); //初始化OC1
        
        TIM_OC1PreloadConfig(TIM1,TIM_OCPreload_Enable);
        TIM_ARRPreloadConfig(TIM1,ENABLE);
        
        TIM_CtrlPWMOutputs(TIM1,ENABLE);        //MOE 主输出使能,高级定时器必须开启这个!!!
        
        TIM_Cmd(TIM1,ENABLE);

}


/*******************************************************/
void uart_init(u32 bound)
{
        //GPIO端口设置
        GPIO_InitTypeDef GPIO_InitStructure;
        USART_InitTypeDef USART_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);        //使能USART1,GPIOA时钟

        //USART1_TX   GPIOA.9
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;        //复用推挽输出
        GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.9

        //USART1_RX          GPIOA.10初始化
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
        GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.10  

        //Usart1 NVIC 配置
        NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;                //子优先级3
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                        //IRQ通道使能
        NVIC_Init(&NVIC_InitStructure);        //根据指定的参数初始化VIC寄存器

        //USART 初始化设置

        USART_InitStructure.USART_BaudRate = bound;//串口波特率
        USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
        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); //初始化串口1
  USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启串口接受中断
  USART_Cmd(USART1, ENABLE);                    //使能串口1

}

OXG%$)L7Z1W61_7$~7GP@G5.png
回复

使用道具 举报

1

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2020-10-3
在线时间
9 小时
发表于 2020-10-26 11:50:01 | 显示全部楼层
本帖最后由 一车一世界 于 2020-10-26 11:52 编辑

查了好久,没找到合适的解释。
OXG%$)L7Z1W61_7$~7GP@G5.png
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-20 22:54

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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