OpenEdv-开源电子网

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

STM32F103高级定时器TIME1和硬件SPI2相互干扰

[复制链接]

8

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
117
金钱
117
注册时间
2016-11-4
在线时间
13 小时
发表于 2022-4-4 15:03:10 | 显示全部楼层 |阅读模式
你好,我在开发的时候遇到一个问题,在STM32中使用高级定时器1产生舵机信号,同时使用硬件SPI2通讯NRF时候,发现一旦开启了RCC_APB2Periph_TIM1时钟就会出现硬件SPI2通讯报错的情况。请问大家有遇到过这个问题的时候嘛?
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

8

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
117
金钱
117
注册时间
2016-11-4
在线时间
13 小时
 楼主| 发表于 2022-4-4 15:16:20 | 显示全部楼层
好像使用了高级定时器时钟,硬件SPI的功能就会收到干扰
回复 支持 反对

使用道具 举报

8

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
117
金钱
117
注册时间
2016-11-4
在线时间
13 小时
 楼主| 发表于 2022-4-4 15:16:43 | 显示全部楼层
static void PA8_PA9_PA10_PA11_PWM_TIME1_CH1_Init(u16 arr,u16 psc)
{
        GPIO_InitTypeDef         GPIO_InitStructure;
        TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
        TIM_OCInitTypeDef       TIM_OCInitStructure;

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_TIM1,ENABLE);  //RCC_APB2Periph_TIM1
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA,&GPIO_InitStructure);

        TIM_DeInit(TIM1);
        TIM_TimeBaseInitStructure.TIM_Period = arr;     
        TIM_TimeBaseInitStructure.TIM_Prescaler = psc;  
        TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;   
        TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
        TIM_TimeBaseInit(TIM1,&TIM_TimeBaseInitStructure);
        //
        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
        TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
        TIM_OCInitStructure.TIM_Pulse = 0;
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
        TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;
        TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;     
        TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;
        //
        TIM_OC1Init(TIM1, &TIM_OCInitStructure);
        TIM_OC2Init(TIM1, &TIM_OCInitStructure);
        TIM_OC3Init(TIM1, &TIM_OCInitStructure);
        TIM_OC4Init(TIM1, &TIM_OCInitStructure);
       
        TIM_OC1PreloadConfig(TIM1,TIM_OCPreload_Enable);
        TIM_OC2PreloadConfig(TIM1,TIM_OCPreload_Enable);
        TIM_OC3PreloadConfig(TIM1,TIM_OCPreload_Enable);
        TIM_OC4PreloadConfig(TIM1,TIM_OCPreload_Enable);
        //
        TIM_Cmd(TIM1, ENABLE);
        TIM_CCPreloadControl(TIM1,ENABLE);
        TIM_CtrlPWMOutputs(TIM1, ENABLE);
        //
}
//
回复 支持 反对

使用道具 举报

8

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
117
金钱
117
注册时间
2016-11-4
在线时间
13 小时
 楼主| 发表于 2022-4-4 15:19:31 | 显示全部楼层
static void SPI2_INIT(void)
{
        SPI_InitTypeDef   SPI_InitStructure;
        GPIO_InitTypeDef  GPIO_InitStructure;
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE);
       
        //配置SPI的SCK,MISO和MOSI引脚为复用推挽模式
        GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB,&GPIO_InitStructure);

        SPI_InitStructure.SPI_Mode=SPI_Mode_Master;//配置为主机模式
        SPI_InitStructure.SPI_NSS=SPI_NSS_Soft;//NSS软件管理
        SPI_InitStructure.SPI_CPHA=SPI_CPHA_1Edge;//第一个时钟沿捕获
        SPI_InitStructure.SPI_CPOL=SPI_CPOL_Low;//空闲状态为低电平
        SPI_InitStructure.SPI_DataSize=SPI_DataSize_8b;//8位数据帧
        SPI_InitStructure.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_8; //SPI波特率8分频         72/8=9M
        SPI_InitStructure.SPI_Direction=SPI_Direction_2Lines_FullDuplex;//全双工模式
        SPI_InitStructure.SPI_FirstBit=SPI_FirstBit_MSB;        //数据高位先行
        SPI_InitStructure.SPI_CRCPolynomial=7;//CRC计算多项式
        SPI_Init(SPI2,&SPI_InitStructure);
        SPI_Cmd(SPI2,ENABLE);        //SPI2使能
}
//
//检测24L01是否存在
//返回值:0,成功;1,失败
static u8 nrf24l01_check(void)
{
        u8 buf[5]={0XA5,0XA5,0XA5,0XA5,0XA5};
        u8 i;
        nrf24l01_write_buf(NRF_WRITE_REG+TX_ADDR,buf,5);
        nrf24l01_read_buf(TX_ADDR,buf,5);
        for(i=0; i<5; i++)if(buf[i]!=0xA5)break;
        if(i!=5)return 1;
        return 0;
}
//
//返回1 初始化失败
u8 nrf24l01_init(u8 debug0)//
{
  u8 sdf=0;
        GPIO_InitTypeDef GPIO_InitStruct;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOA,ENABLE);
       
        /*   配置CSN引脚   */
        GPIO_InitStruct.GPIO_Pin=GPIO_Pin_12;
        GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
        GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Init(GPIOB,&GPIO_InitStruct);
        GPIO_ResetBits(GPIOB,GPIO_Pin_12);
       
        /*  配置CE引脚  */
        GPIO_InitStruct.GPIO_Pin=GPIO_Pin_11;
        GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
        GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Init(GPIOB,&GPIO_InitStruct);
        GPIO_ResetBits(GPIOB,GPIO_Pin_11);

        /*  配置IRQ引脚  */
        GPIO_InitStruct.GPIO_Pin=GPIO_Pin_10;
        GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING;
        GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Init(GPIOB,&GPIO_InitStruct);
       
        SPI2_INIT(); //SPI2初始化
        NRF24L01_CSN=1; //失能NRF
        NRF24L01_CE=0;          //待机模式
  sdf = nrf24l01_check();
        if(debug0)d_Printf("nrf24l01_check() = ",sdf);
        return sdf;
}
//
回复 支持 反对

使用道具 举报

8

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
117
金钱
117
注册时间
2016-11-4
在线时间
13 小时
 楼主| 发表于 2022-4-4 15:20:37 | 显示全部楼层
欢迎路过的大神可以解惑,我想两个都能实现。非常感谢!
回复 支持 反对

使用道具 举报

8

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
117
金钱
117
注册时间
2016-11-4
在线时间
13 小时
 楼主| 发表于 2022-4-4 15:24:13 | 显示全部楼层
我在正点原子无线通讯的例程中也添加了time1输出PWM的代码,发现未添加前,nrf模块可以初始化通过,添加后就初始化不了了
        u8 key,mode;
        u16 t=0;                         
        u8 tmp_buf[33];                    
        delay_init();                     //延时函数初始化          
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
        uart_init(115200);                 //串口初始化为115200
        LED_Init();                                          //初始化与LED连接的硬件接口
        KEY_Init();                                        //初始化按键
        LCD_Init();                                           //初始化LCD  
  PA8_PA9_PA10_PA11_PWM_TIME1_CH1_Init(9999,143);
        NRF24L01_Init();                    //初始化NRF24L01
        POINT_COLOR=RED;                        //设置字体为红色
        LCD_ShowString(30,50,200,16,16,"WarShip STM32");       
        LCD_ShowString(30,70,200,16,16,"NRF24L01 TEST");       
        LCD_ShowString(30,90,200,16,16,"ATOM@ALIENTEK");
        LCD_ShowString(30,110,200,16,16,"2015/1/17");

        u16 t=0;                         
        u8 tmp_buf[33];                    
        delay_init();                     //延时函数初始化          
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
        uart_init(115200);                 //串口初始化为115200
        LED_Init();                                          //初始化与LED连接的硬件接口
        KEY_Init();                                        //初始化按键
        LCD_Init();                                           //初始化LCD  
  //PA8_PA9_PA10_PA11_PWM_TIME1_CH1_Init(9999,143);
        NRF24L01_Init();                    //初始化NRF24L01
        POINT_COLOR=RED;                        //设置字体为红色
        LCD_ShowString(30,50,200,16,16,"WarShip STM32");       
        LCD_ShowString(30,70,200,16,16,"NRF24L01 TEST");       
        LCD_ShowString(30,90,200,16,16,"ATOM@ALIENTEK");
        LCD_ShowString(30,110,200,16,16,"2015/1/17");

回复 支持 反对

使用道具 举报

8

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
117
金钱
117
注册时间
2016-11-4
在线时间
13 小时
 楼主| 发表于 2022-4-6 08:41:52 | 显示全部楼层
问题已经解决,是使用高级定时器额时候配置了反向PWM输出导致的。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-27 17:20

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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