打印
[STM32F0]

请教STM32F030K6复用功能选择问题

[复制链接]
7305|31
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hopewise|  楼主 | 2014-11-27 10:28 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
      关于GPIOx_AFRL 和GPIOx_AFRH怎么用,参考手册没说明,一笔带过。比如,第27脚是PB4/SPI1_MISO/TIM3_CH1/EVENTOUT.上电复位时,看参考手册,默认是PB4,
1.假如我想第27脚输出PWM波形,在TIM3初始化时,设置第27脚为复用功能模式,除了这点,还要怎么设置GPIOB->AFRL和GPIOB->AFRH?
2.哪里可以找到STM32F030K6的IO口复用与AF0,AF1...
引脚   AF0  AF1 AF2 AF3  AF4  AF5 AF6 AF7
PA0
PA1
PA2
  .
  .
  .
PB0
PB1
PB2
  .
  .
沙发
hopewise|  楼主 | 2014-11-27 10:36 | 只看该作者
3.添加GPIOB->AFRL =0X00;这条指令会报如下报警:
Struct <unnamed> has no field :AFRL",GPIOx_AFRL和GPIOx_AFRH,GPIOX_MODER等都是寄存器,定义GPIOB->MODER   = 0X55551655;则OK.
该怎么解决?Thanks

使用特权

评论回复
板凳
神的礼物| | 2014-11-27 14:55 | 只看该作者
在030的数据手册的31和32页

使用特权

评论回复
地板
hopewise|  楼主 | 2014-11-27 15:44 | 只看该作者
多谢神的礼物 ,我后来找到了。PB4/TIM3-CH1脚想输出PWM,是不是GPIOB->AFR[0] =0X00000010;????,结果还是没反应

使用特权

评论回复
5
神的礼物| | 2014-11-27 16:40 | 只看该作者
GPIOB->AFR[0] =0X00000010你写的是PB1不是PB4,PB4应该是0x00010000

使用特权

评论回复
6
hopewise|  楼主 | 2014-11-28 10:12 | 只看该作者
多谢神的礼物的回复,按你说法,也不行.因为PB4/TIM3-CH1脚复用,故设置PB4为AF1,也就是说GPIOB->AFR[0] =0X00000010;是对的。我设置断点查看过,以下设置与仿真器查到的内容相同,现还是查不出来

使用特权

评论回复
7
hopewise|  楼主 | 2014-11-28 10:16 | 只看该作者
因为GPIOB->AFR[0]是32位的,每4位对应1个AFRx(x=0-7),因为要复用PB4/TIM3-CH1脚为AF1---这是STM32F030K6数据手册提到的,那么GPIOB->AFR[0] =0X00000010;是对的

使用特权

评论回复
8
hopewise|  楼主 | 2014-11-28 10:18 | 只看该作者
现重贴如下:
            RCC->AHBENR|=1<<18;                   //使能PORTB时钟       
            GPIOB->OTYPER  = 0X00000000;   //推挽输出
            GPIOB->MODER   = 0X55551655;   //PB4复用功能输出        
            GPIOB->OSPEEDR = 0XFFFFFFFF;   //高速
            GPIOB->PUPDR   = 0X00004000;   //除了PB7带上拉,其它脚则无上拉/下拉
       
            GPIOB->AFR[0] &=~(0X0F<<4);          //清除PB4原来的设置
       
            RCC->APB1ENR|=1<<1;                  //TIM3时钟使能
            TIM3->PSC=47;                         //预分频器48分频
            TIM3->ARR=1000;                         //设置频率
            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->EGR |= 1;                     //产生一次更新事件
            TIM3->CR1|=0x01;                     //使能定时器3

使用特权

评论回复
9
hopewise|  楼主 | 2014-11-28 10:27 | 只看该作者
改正为:     GPIOB->AFR[0] &=~(0X0F<<4);    //清除PB4原来的设置
            GPIOB->AFR[0] |=1<<4;          //设置PB4为AF1

原先是:     GPIOB->AFR[0] &=~(0X0F<<4);    //清除PB4原来的设置

使用特权

评论回复
10
hopewise|  楼主 | 2014-11-28 10:28 | 只看该作者
搞我2天了,还是搞不定。

使用特权

评论回复
11
神的礼物| | 2014-11-28 15:34 | 只看该作者
hopewise 发表于 2014-11-28 10:27
改正为:     GPIOB->AFR[0] &=~(0X0F

你这两句很有问题,你说的GPIOB->AFR[0]是32位的,每4位对应1个AFRx(x=0-7),那么PB4对应AFR4,但你写的那对应AFR4l了

官方图

使用特权

评论回复
12
hopewise|  楼主 | 2014-11-28 15:56 | 只看该作者
多谢神的礼物的回答,下面2句话,我J-LINK仿真时查到GPIOB->AFR[0]=0X00000010,也就是说下面那2句是没问题的
             GPIOB->AFR[0] &=~(0X0F<<4);    //清除PB4原来的设置
             GPIOB->AFR[0] |=1<<4;          //设置PB4为AF1

使用特权

评论回复
13
神的礼物| | 2014-11-28 16:20 | 只看该作者
GPIOB->AFR[0]=0X00000010那来的

使用特权

评论回复
14
hopewise|  楼主 | 2014-11-28 16:26 | 只看该作者
这是从STM32F0XX.H文件得到的

使用特权

评论回复
15
hopewise|  楼主 | 2014-11-28 16:29 | 只看该作者
是从STM32F0XX.H文件中的GPIO_TypeDef里面内容;

使用特权

评论回复
16
hopewise|  楼主 | 2014-11-28 16:30 | 只看该作者
typedef struct
{
  __IO uint32_t MODER;        /*!< GPIO port mode register,                                  Address offset: 0x00 */
  __IO uint16_t OTYPER;       /*!< GPIO port output type register,                           Address offset: 0x04 */
  uint16_t RESERVED0;         /*!< Reserved,                                                                 0x06 */
  __IO uint32_t OSPEEDR;      /*!< GPIO port output speed register,                          Address offset: 0x08 */
  __IO uint32_t PUPDR;        /*!< GPIO port pull-up/pull-down register,                     Address offset: 0x0C */
  __IO uint16_t IDR;          /*!< GPIO port input data register,                            Address offset: 0x10 */
  uint16_t RESERVED1;         /*!< Reserved,                                                                 0x12 */
  __IO uint16_t ODR;          /*!< GPIO port output data register,                           Address offset: 0x14 */
  uint16_t RESERVED2;         /*!< Reserved,                                                                 0x16 */
  __IO uint32_t BSRR;         /*!< GPIO port bit set/reset registerBSRR,                     Address offset: 0x18 */
  __IO uint32_t LCKR;         /*!< GPIO port configuration lock register,                    Address offset: 0x1C */
  __IO uint32_t AFR[2];       /*!< GPIO alternate function low register,                Address offset: 0x20-0x24 */
  __IO uint16_t BRR;          /*!< GPIO bit reset register,                                  Address offset: 0x28 */
  uint16_t RESERVED3;         /*!< Reserved,                                                                 0x2A */
}GPIO_TypeDef;

使用特权

评论回复
17
hopewise|  楼主 | 2014-11-28 16:33 | 只看该作者
AFR[0]包含GPIOx->AFRL的内容(x=0--7),同理AFR[1]包含GPIOx->AFRH的内容(x=8--15)

使用特权

评论回复
18
神的礼物| | 2014-11-28 16:35 | 只看该作者
hopewise 发表于 2014-11-28 15:56
多谢神的礼物的回答,下面2句话,我J-LINK仿真时查到GPIOB->AFR[0]=0X00000010,也就是说下面那2句是没问题的 ...

GPIOB->AFR[0]对应GPIOB->AFRL寄存器,0X00000010=0000_0000_0000_0000_0000_0000_0001_0000也就是AFRL1,不是ARFL4

使用特权

评论回复
19
hopewise|  楼主 | 2014-11-28 16:38 | 只看该作者
今天我做4路PWM,其中有1路(PA4/TIM14-CH1)则OK,其它3路都没PWM输出(宝含PB4/TIM3-CH1),能功作的那路代码如下:

            RCC->AHBENR|=1<<17;                   //使能PORTA时钟         
            GPIOA->MODER   = 0X68AAA6F5 ;  //PA4复用功能输出
            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

使用特权

评论回复
20
hopewise|  楼主 | 2014-11-28 16:40 | 只看该作者
我查过其它3路不工作的子函数,没发现不对的地方.

使用特权

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

本版积分规则

46

主题

468

帖子

3

粉丝