打印
[STM32F1]

STM32F103ZET为什么找不到AFIO_MAPR2 ?TIM4CH2无输出的原因是什么

[复制链接]
4325|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dontium|  楼主 | 2014-4-25 11:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 dontium 于 2014-4-25 15:01 编辑

  我用IAR7.1(盗版)编译STM32F103ZET,也设置为HD并使用相应的文件。因为现在要用到在PB6、7、8、9上的TIM4 CH1、CH2、CH3、CH4,在调试时,CH1、CH3、CH4有正常输出,唯独CH2无输出(恒高)。

经查看手册,AFIO_MAPR2中有一位
        Bit 10 FSMC_NADV: NADV connect/disconnect                       This bit is set and cleared by software. It controls the use of the optional FSMC_NADV signal.
              0: The NADV signal is connected to the output (default)
              1: The NADV signal is not connected. The I/O pin can be used by another peripheral.

所以就怀疑是不是它的问题,但是,经REMAP设置后,仍不能正常工作,随后就监视AFIO_MAPR2 的值,在IAR的AFIO寄存器查看列表中没有发现它的存在,

又用一32位变量读取它的值,放在AFIO->MAPR2 |= 0x0400;前后、及前后若干个语句(排除寄存器更新慢的问题),这个变量始终为0!

烦请帮忙找找解决办法,谢谢大家!
沙发
mmuuss586| | 2014-4-25 12:11 | 只看该作者
PWM程序发上来看看

使用特权

评论回复
板凳
dontium|  楼主 | 2014-4-25 12:39 | 只看该作者
mmuuss586 发表于 2014-4-25 12:11
PWM程序发上来看看

这是RCC

        /* ADCCLK = PCLK2/4 */
        RCC_ADCCLKConfig(RCC_PCLK2_Div4);
       
        /* Enable All GPIO and AFIO clocks */
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |RCC_APB2Periph_GPIOC
                                                   | RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE | RCC_APB2Periph_GPIOF | RCC_APB2Periph_GPIOG
                                                   | RCC_APB2Periph_AFIO, ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_ADC3 | RCC_APB2Periph_TIM1, ENABLE);
       
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2 | RCC_APB1Periph_TIM3 | RCC_APB1Periph_TIM4 , ENABLE);

        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1 | RCC_AHBPeriph_DMA2 | RCC_AHBPeriph_SRAM
                                                  | RCC_AHBPeriph_FSMC | RCC_AHBPeriph_SDIO, ENABLE);


这是GPIO


void GPIO_PortInit(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
       
        /*  -------------------    Button   ------------------------------------  */
        /* Configure PE.02, PE.03, PE.04, PE.05, PE.06 as input floating, for buttun used  */
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 ;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_Init(GPIOE, &GPIO_InitStructure);

        /*  -------------------    Buzzer and LED   ---------------------------  */
        GPIO_InitStructure.GPIO_Pin = BUZZER_PIN | LED_PIN;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
        GPIO_Init(BUZ_LED_PORT, &GPIO_InitStructure);

        /*  ----------------------    ADC Port   ------------------------------  */
        // Panel
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 |GPIO_Pin_6 | GPIO_Pin_7;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
        GPIO_Init(GPIOA, &GPIO_InitStructure);

        // Actuator and BackLight (PC4)
        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_AIN;
        GPIO_Init(GPIOC, &GPIO_InitStructure);

        /*  ----------------------    PWM Port   ------------------------------  */
        // VIBRATE, Heat,
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 |GPIO_Pin_6 | GPIO_Pin_7
                                                                | GPIO_Pin_8 | GPIO_Pin_9 | BL_PWM_PIN;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
        GPIO_Init(GPIOB, &GPIO_InitStructure);

        ////////////////////////////////////////////////////////////////////////
        AfioMapr2 = AFIO->MAPR2;
        GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3,ENABLE);
        GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);
        GPIO_PinRemapConfig(GPIO_Remap_TIM4, DISABLE);
        AFIO->MAPR2 |= 0x0400;                        // The NADV signal is not connected. The I/O pin can be used by another peripheral
        AfioMapr2 = AFIO->MAPR2;
        //GPIO_PinRemapConfig(GPIO_PartialRemap_TIM1,ENABLE);

        // BackLight  
/*        GPIO_InitStructure.GPIO_Pin = BL_PWM_PIN;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(BL_PWM_PORT, &GPIO_InitStructure);
*/       
        /*  ---------------------  Keyboard Port   --------------------------  */
        GPIO_InitStructure.GPIO_Pin  = KEY_UP | KEY_DOWN | KEY_LIFT | KEY_RIGHT | KEY_ENTER;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_Init(KEYBOARD_PORT, &GPIO_InitStructure);
        AfioMapr2 = AFIO->MAPR2;
#if 0       
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource1);

  /* Configure EXTI0 line */
  EXTI_InitStructure.EXTI_Line = EXTI_Line0;
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;  
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  EXTI_Init(&EXTI_InitStructure);
#endif
}

TIM:
void TIMER_Init(void)
{
        TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
        TIM_OCInitTypeDef  TIM_OCInitStructure;
        //----------  Back light ----------- TIM1 C2N
        TIM_DeInit(TIM1);
        TIM_TimeBaseStructure.TIM_ClockDivision        = TIM_CKD_DIV1;                        //72M
        TIM_TimeBaseStructure.TIM_Prescaler                = 0;                                        //
        TIM_TimeBaseStructure.TIM_CounterMode        = TIM_CounterMode_Up;
        TIM_TimeBaseStructure.TIM_Period                = 360;                                        // 200kHz
        TIM_TimeBaseStructure.TIM_RepetitionCounter=0;        //  RepetitionCounter+1 times overflow
       
        TIM_TimeBaseInit(TIM1,&TIM_TimeBaseStructure);

        /* Channel 2N Configuration in PWM mode */
        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;                // TIM_OCMode_Timing
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
        TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
        TIM_OCInitStructure.TIM_Pulse = 50;                                                                // write to CCR
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
        TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;
        TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
        TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;

        TIM_OC2Init(TIM1, &TIM_OCInitStructure);

        TIM_SelectOutputTrigger(TIM1,TIM_TRGOSource_Update);// TIM1 Update events as a trigger TRGO
        TIM_ClearFlag(TIM1,TIM_FLAG_Update);                                 // prevent interrupt at initial state
       
        TIM_Cmd(TIM1,ENABLE);                                                                //enable TIM1

        //----------------------------------------- vibrate  TIM3 CH1, 2
        TIM_DeInit(TIM3);
       
        TIM_TimeBaseStructure.TIM_ClockDivision                = TIM_CKD_DIV4;        //18M
        TIM_TimeBaseStructure.TIM_Prescaler                        = 180;                        //100KHz, 1Tick=1ms
        TIM_TimeBaseStructure.TIM_CounterMode                = TIM_CounterMode_Up;
        TIM_TimeBaseStructure.TIM_Period                        = 1000  ;//  period = 0.01s
        TIM_TimeBaseStructure.TIM_RepetitionCounter        = 0;
        TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);

        /* Channel 1, 2 Configuration in PWM mode */
        TIM_OCInitStructure.TIM_OCMode                         = TIM_OCMode_PWM2;
        TIM_OCInitStructure.TIM_OutputState         = TIM_OutputState_Enable;
        TIM_OCInitStructure.TIM_OutputNState        = TIM_OutputNState_Enable;
        TIM_OCInitStructure.TIM_Pulse                        = 500;                                                // write to CCR
        TIM_OCInitStructure.TIM_OCPolarity                = TIM_OCPolarity_Low;
        TIM_OCInitStructure.TIM_OCNPolarity                = TIM_OCNPolarity_High;
        TIM_OCInitStructure.TIM_OCIdleState                = TIM_OCIdleState_Set;
        TIM_OCInitStructure.TIM_OCNIdleState        = TIM_OCIdleState_Reset;

        TIM_OC1Init(TIM3, &TIM_OCInitStructure);
        TIM_OC2Init(TIM3, &TIM_OCInitStructure);

        TIM_ClearFlag(TIM3,TIM_FLAG_Update);                                 // prevent interrupt at initial state
       
        TIM_Cmd(TIM3,ENABLE);                                                                //enable TIM1

        // -------------------------------------  PWM , heat , TIM4 CH1, 2, 3, 4
        TIM_DeInit(TIM4);
       
        TIM_TimeBaseStructure.TIM_ClockDivision                = TIM_CKD_DIV4;        //18M
        TIM_TimeBaseStructure.TIM_Prescaler                        = 1800;                        //100KHz, 1Tick=1ms
        TIM_TimeBaseStructure.TIM_CounterMode                = TIM_CounterMode_Up;
        TIM_TimeBaseStructure.TIM_Period                        = 1000  ;//  period = 0.1s
        TIM_TimeBaseStructure.TIM_RepetitionCounter        = 0;
        TIM_TimeBaseInit(TIM4,&TIM_TimeBaseStructure);

        /* Channel 1 Configuration in PWM mode */
        TIM_OCInitStructure.TIM_OCMode                         = TIM_OCMode_PWM2;
        TIM_OCInitStructure.TIM_OutputState         = TIM_OutputState_Enable;
        TIM_OCInitStructure.TIM_OutputNState        = TIM_OutputNState_Enable;
        TIM_OCInitStructure.TIM_Pulse                        = 500;                                                // write to CCR
        TIM_OCInitStructure.TIM_OCPolarity                = TIM_OCPolarity_Low;
        TIM_OCInitStructure.TIM_OCNPolarity                = TIM_OCNPolarity_High;
        TIM_OCInitStructure.TIM_OCIdleState                = TIM_OCIdleState_Set;
        TIM_OCInitStructure.TIM_OCNIdleState        = TIM_OCIdleState_Reset;

        //AFIO->MAPR =
        TIM_OC1Init(TIM4, &TIM_OCInitStructure);
        TIM_OC2Init(TIM4, &TIM_OCInitStructure);////////////////////////////////////
        TIM_OC3Init(TIM4, &TIM_OCInitStructure);
        TIM_OC4Init(TIM4, &TIM_OCInitStructure);
       
        TIM_SelectOutputTrigger(TIM4,TIM_EventSource_CC4);// TIM4 OC events as a trigger TRGO

        TIM_ClearFlag(TIM4,TIM_FLAG_Update);

        TIM_Cmd(TIM4,ENABLE);                // enable TIM3  --- Counter enable

       
        //TIM_ITConfig(TIM1, TIM_IT_COM, ENABLE);

        /* Main Output Enable */
        TIM_CtrlPWMOutputs(TIM1, ENABLE);
        TIM_CtrlPWMOutputs(TIM3, ENABLE);
        TIM_CtrlPWMOutputs(TIM4, ENABLE);
       
}

使用特权

评论回复
地板
mmuuss586| | 2014-4-25 15:25 | 只看该作者
本帖最后由 mmuuss586 于 2014-4-25 15:27 编辑

你试下这段程序看看
http://www.openedv.com/posts/list/5403.htm
原文在这里
/*PWM输出初始化*/
void Timer4_Init(u16 arr,u16 psc)
{                                                         
        //此部分需手动修改 IO口设置  
RCC->APB2ENR|=1<<0;    //复用  
RCC->APB1ENR|=1<<2;    //TIM4 时钟使能  
RCC->APB2ENR|=1<<3;    //使能PORTB时钟
         
GPIOB->CRL&=0XF0FFFFFF;//PB6 输出  
GPIOB->CRL|=0X0B000000;//复用功能输出      
GPIOB->ODR|=1<<6;//PB6 上拉   
         
GPIOB->CRL&=0X0FFFFFFF;//PB7 输出  
GPIOB->CRL|=0XB0000000;//复用功能输出      
GPIOB->ODR|=1<<7;//PB7 上拉   

GPIOB->CRH&=0XFFFFFFF0;//PB8 输出  
GPIOB->CRH|=0X0000000B;//复用功能输出      
GPIOB->ODR|=1<<8;//PB8 上拉  

GPIOB->CRH&=0XFFFFFF0F;//PB9 输出  
GPIOB->CRH|=0X000000B0;//复用功能输出      
GPIOB->ODR|=1<<9;//PB9 上拉   
  
TIM4->ARR=arr;//设定计数器自动重装值   
TIM4->PSC=psc;//预分频器不分频  

TIM4->CCMR1|=6<<4;  //CH1 PWM1模式      
        //TIM4->CCMR1|=1<<3; //CH1 预装载使能      
TIM4->CCER|=1<<0;  //OC1  输出使能     
TIM4->CR1=0x0080;  //ARPE使能   

TIM4->CCMR1|=6<<12;  //CH2 PWM1模式      
        //TIM4->CCMR1|=1<<11; //CH2 预装载使能      
TIM4->CCER|=1<<4;   //OC2  输出使能      
TIM4->CR1=0x0080;   //ARPE使能

TIM4->CCMR2|=6<<4;  //CH3 PWM1模式      
        //TIM4->CCMR2|=1<<3; //CH3 预装载使能   
TIM4->CCER|=1<<8;  //OC3  输出使能      
TIM4->CR1=0x0080;   //ARPE使能

TIM4->CCMR2|=6<<12;  //CH4 PWM1模式      
        //TIM4->CCMR2|=1<<11; //CH4 预装载使能      
TIM4->CCER|=1<<12;   //OC4  输出使能      
TIM4->CR1=0x0080;   //ARPE使能

TIM4->DIER|=1<<0;   //允许更新中断                                
TIM4->DIER|=1<<6;   //允许触发中断
MY_NVIC_Init(9,0,TIM4_IRQChannel,4);//抢占1,子优先级1,组1
        TIM4->CR1|=0x01;    //使能定时器4

        TIM4->CCR1 = 3035;         //CH1占空比初值         
TIM4->CCR2 = 3035;         //CH2占空比初值
TIM4->CCR3 = 3035;                 
        //TIM4->CCR4 = 3035;         //CH6占空比初值
                                                                                                                                                                              
}

使用特权

评论回复
5
dontium|  楼主 | 2014-4-25 15:41 | 只看该作者
mmuuss586 发表于 2014-4-25 15:25
你试下这段程序看看
http://www.openedv.com/posts/list/5403.htm
原文在这里

你的热心让我非常感动。

我试你的程序看看,并将分频填入1、ARR填入3055*2

使用特权

评论回复
6
dontium|  楼主 | 2014-4-25 16:48 | 只看该作者
mmuuss586 发表于 2014-4-25 15:25
你试下这段程序看看
http://www.openedv.com/posts/list/5403.htm
原文在这里

还是不行,与原来的现象一样。

反复检查电路及PCB,没有发现异常。

PB7输出的是高电平 -- 并非上拉的那种高电平。所以我在怀疑是不是FSMC_NADV起了作用,但DEBUG时找不到AFIO_MAPR2,对它的内存0X4001001C读取也是全0

使用特权

评论回复
7
香水城| | 2014-4-26 20:33 | 只看该作者
配置AFIO的寄存器之前,RCC_APB2Periph_AFIO时钟使能了么?

使用特权

评论回复
8
dontium|  楼主 | 2014-4-26 21:27 | 只看该作者
本帖最后由 dontium 于 2014-4-26 21:35 编辑
香水城 发表于 2014-4-26 20:33
配置AFIO的寄存器之前,RCC_APB2Periph_AFIO时钟使能了么?

已经配置了:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |RCC_APB2Periph_GPIOC
                                                   | RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE | RCC_APB2Periph_GPIOF | RCC_APB2Periph_GPIOG
                                                   | RCC_APB2Periph_AFIO, ENABLE);


现在一个关键的问题是,AFIO->MAPR2这个寄存器在IAR中没有,根本找不到,读取这个地址的值也是0,

FSMC_NADV: NADV connect/disconnect
                                      This bit is set and cleared by software. It controls the use of the optional FSMC_NADV signal.
                                            0: The NADV signal is connected to the output (default)
                                             1: The NADV signal is not connected. The I/O pin can be used by another peripheral.

使用特权

评论回复
9
dontium|  楼主 | 2014-4-29 00:46 | 只看该作者
俺再自己顶

使用特权

评论回复
10
huzi2099| | 2014-4-29 09:29 | 只看该作者
:lol

使用特权

评论回复
11
jjjkkk00| | 2014-4-29 09:35 | 只看该作者
数据手册和参考手册中也没有发现AFIO_MAPR2的存在,lz是从哪里获知的这个寄存器?
我只看到AFIO_MAPR这一个复用重映射配置寄存器。
------------------------------------------------
将MAPR2这部分代码屏蔽了再试试看?

使用特权

评论回复
12
dontium|  楼主 | 2014-4-29 10:50 | 只看该作者
jjjkkk00 发表于 2014-4-29 09:35
数据手册和参考手册中也没有发现AFIO_MAPR2的存在,lz是从哪里获知的这个寄存器?
我只看到AFIO_MAPR这一个 ...

或者真的没有这个寄存器,但文档及头文件中有这个。

文档号:RM0008
文档名称:Reference manual
STM32F101xx, STM32F102xx, STM32F103xx, STM32F105xx
and STM32F107xx advanced ARM-based 32-bit MCUs

Doc ID 13902 Rev 14

第九章:
9 General-purpose and alternate-function I/Os (GPIOs
and AFIOs)

---- This section applies to the whole STM32F10xxx family, unless otherwise specified.

9.4.7 AF remap and debug I/O configuration register2 (AFIO_MAPR2)

使用特权

评论回复
13
dontium|  楼主 | 2014-4-29 10:52 | 只看该作者
jjjkkk00 发表于 2014-4-29 09:35
数据手册和参考手册中也没有发现AFIO_MAPR2的存在,lz是从哪里获知的这个寄存器?
我只看到AFIO_MAPR这一个 ...

现在需要的是,将PB7的约定值NADV这个功能分配给TIM4CH2,

使用特权

评论回复
14
dontium|  楼主 | 2014-5-6 14:30 | 只看该作者
嗨……, 提醒结帖了。

在这个我认为高手林立的网站没有找到答案,说明ST公司的MCU有问题了,解铃还需要JI铃人啊!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:官向官来民向民,穷人向的是穷人

151

主题

1173

帖子

10

粉丝