发新帖我要提问
12
返回列表
打印
[STM32F0]

请教STM32F030K6复用功能选择问题

[复制链接]
楼主: hopewise
手机看帖
扫描二维码
随时随地手机跟帖
21
hopewise|  楼主 | 2014-11-28 16:48 | 只看该作者 |只看大图 回帖奖励 |倒序浏览
1.神的礼物,你说的对,因为PB4/TIM3-CH1脚复用为TIM3-CH1,是AFRL1(注:
AFR[0]最低是AFRL0(它占用4位,下同),接着是AFRL1,AFRL2....AFRL7.
2.因为要想复用AFRL1,得设置AFRL1值,而AFRL1值=0001,所以我设置GPIOB->AFR[0]=0X00000010,但它输出不了PWM

使用特权

评论回复
22
hopewise|  楼主 | 2014-11-28 16:59 | 只看该作者
能工作的PWM是PA4/TIM14-CH1,复用值是AF4,而AF4规定等于0100.现PB4/TIM3-CH1的复用值是AF1,而AF1规定等于0001.我正常设置好了,为何4路PWM置有1路能正常,而其它3路则不工作

使用特权

评论回复
23
神的礼物| | 2014-11-29 18:44 | 只看该作者
PB4复用功能得设置AFRL4的值,不是设置AFRL1值,不是你的复用值是AF1就设置AFRL1,好好读一下参考手册

使用特权

评论回复
24
hopewise|  楼主 | 2014-12-1 10:13 | 只看该作者
神的礼物,按你的说法,PB4复用功能,设置为AFRL4(如下),也不行:
            GPIOB->AFR[0] &=0XFFF0FFFF;       //清除PB4原来的设置
            GPIOB->AFR[0] |=1<<18;            //设置PB4为AF4
按STM32F030K6数据手册表P32页(复用内容说明如下):
引脚         AF0              AF1               AF2              AF3
PB4        SPI1_MISO        TIM3_CH1          EVENTOUT          ----
这说明要复用为TIM3_CH1功能,得设置设置为AFRL1,不知神的礼物是怎么要设置为AF4?(数据手册表也没有提到哪个引脚要用到AF4)

使用特权

评论回复
25
hopewise|  楼主 | 2014-12-1 10:18 | 只看该作者
(一) 先贴出能工作的PWM初始化程序,如下
void TIM14_Init()
{        
        RCC->AHBENR|=1<<17;                   //使能PORTA时钟   
        GPIOA->MODER   = 0X68AAA6F5 ;     //PA4/TIM14-CH1复用功能输出
        GPIOA->OTYPER  = 0X00000000;  
        GPIOA->OSPEEDR = 0X00000000;  
        GPIOA->PUPDR   = 0X25000000;  
        GPIOA->AFR[0] &=0XFFF0FFFF;;       //清除PA4原来的设置
        GPIOA->AFR[0] |=1<<18;                 //设置PA4为AF4

        RCC->APB1ENR|=1<<8;                  //TIM14时钟使能
        TIM14->PSC=0;                               //预分频器1分频
        TIM14->ARR=240;                          //设置频率(200K)
        TIM14->CCR1 =72;                         //设置占空比   
        TIM14->EGR |= 1;                           //产生一次更新事件  
        TIM14->CCMR1|=6<<4;                 //CH1 PWM1模式  
        TIM14->CCMR1|=1<<3;                 //CH1预装载使能   
        TIM14->CCER|=1<<0;                   //OC1输出使?高电平有效有效  
        TIM14->CR1=0x0080;                    //ARPE使能
       TIM14->CR1|=0x01;                        //使能定时器14
}


(二) 不能工作的第1路PWM(TIMI-CH1/PA8)初始化程序,如下
void TIM1_Init()
{   
       RCC->AHBENR|=1<<17;                //使能PORTA时钟
     
      GPIOA->MODER   = 0X68AAA6F5 ;
      GPIOA->OTYPER  = 0X00000000;  
      GPIOA->OSPEEDR = 0X00000000;  
      GPIOA->PUPDR   = 0X25000000;  
      GPIOA->AFR[0] &=0XFFFFF0FF;;      //清除PA8原来的设置
      GPIOA->AFR[0] |=1<<9;                  //设置PA8为AF2

      RCC->APB2ENR|=1<<11;               //TIM1时钟使能
     TIM1->PSC=47;                               //预分频器48分频
     TIM1->ARR=1000;                           //设置频率
     TIM1->CCR1 =500;                          //设置占空比   
     TIM1->CCMR1|=7<<4;                    //CH1 PWM2模式  
     TIM1->CCMR1|=1<<3;                     //CH1预装载使能   
     TIM1->CCER|=1<<0;                       //OC1输出使能   
     TIM1->CR1|=1<<7;                         //ARPE使能
     TIM1->EGR |= 1;                              //产生一次更新事件
     TIM1->CR1|=0x01;                          //使能定时器1
     TIM1->BDTR |=1<<15;
}


(三) 不能工作的第2路PWM(TIM3-CH1/PB4)初始化程序,如下
void TIM3_Init()
{   
        RCC->APB1ENR|=1<<1;                   //TIM3时钟使能
        RCC->AHBENR|=1<<18;                   //使能PORTB时钟
        GPIOB->MODER   = 0X55551655;     //PB4复用功能输出   
        GPIOB->OTYPER  = 0X00000000;     //推挽输出
        GPIOB->OSPEEDR = 0X00000000;    //低速
        GPIOB->PUPDR   = 0X00004000;      //除了PB7带上拉,其它脚则无上拉/下拉

         GPIOB->AFR[0] &=0XFFFFFF0F;        //清除PB4原来的设置
         GPIOB->AFR[0] |=1<<4;                  //设置PB4为AF1

         TIM3->PSC=47;                               //预分频器48分频
         TIM3->ARR=1000;                          //设置频率
         TIM3->EGR |= 1;                             //产生一次更新事件
         TIM3->CCR1 =500;                         //设置占空比

         TIM3->CCMR1|=7<<4;                   //CH1 PWM2模式  
         TIM3->CCMR1|=1<<3;                   //CH1预装载使能   
         TIM3->CCER|=1<<0;                     //OC1输出使能,高电平有效   
      
          TIM3->CR1|=1<<7;                     //ARPE使能
          TIM3->CR1|=0x01;                      //使能定时器3
   }

(三) 不能工作的第3路PWM(TIM16-CH1/PA6)初始化程序,如下
void TIM16_Init()
{            
        RCC->AHBENR|=1<<17;                   //使能PORTA时钟
        GPIOA->MODER   = 0X68AAA6F5 ;     //PA6复用功能输出
        GPIOA->OTYPER  = 0X00000000;  
        GPIOA->OSPEEDR = 0X00000000;  
        GPIOA->PUPDR   = 0X25000000;
      
        GPIOA->AFR[0] &=0XFF0FFFFF;;       //清除PA6原来的设置
        GPIOA->AFR[0] |=1<<20;                //设置PA6为AF5
        GPIOA->AFR[0] |=1<<22;

        RCC->APB2ENR|=1<<17;               //TIM16时钟使能
        TIM16->PSC=47;                             //预分频器48分频
        TIM16->ARR=1000;                        //设置频率
        TIM16->CCR1 =170;                       //设置占空比   
        TIM16->EGR |= 1;                           //产生一次更新事件  
        TIM16->CCMR1|=6<<4;                 //CH1 PWM1模式  
         TIM16->CCMR1|=1<<3;                //CH1预装载使能   
         TIM16->CCER|=1<<0;                   //OC1输出使能   
         TIM16->CR1=0x0080;                   //ARPE使能
         TIM16->CR1|=0x01;                      //使能定时器16

}

使用特权

评论回复
26
神的礼物| | 2014-12-2 17:22 | 只看该作者
hopewise 发表于 2014-12-1 10:13
神的礼物,按你的说法,PB4复用功能,设置为AFRL4(如下),也不行:
            GPIOB->AFR[0] &=0XFFF0FFFF ...


ARFLy对应引脚y

使用特权

评论回复
27
hopewise|  楼主 | 2014-12-2 17:35 | 只看该作者
多谢神的礼物,我终于明白了GPIOx->AFRL和GPIOx->AFRH的含义了,现4路PWM可以正常工作了

使用特权

评论回复
28
神的礼物| | 2014-12-2 18:57 | 只看该作者

使用特权

评论回复
29
破天#mcu| | 2017-8-7 10:38 | 只看该作者
代理兆易创新(GD)32-bit ARM架构,Cortex-M3、M4内核MCU,可提供技术支持等服务;
GD32F130系列 M3内核与STM32F030/051系列,硬件pin to pin兼容;烧录器、寄存器、开发环境完全兼容;
欢迎来电咨询探讨,邱先生 电话:136 8955 5135;

使用特权

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

本版积分规则