最近记忆力以指数形式下降,以前弄明白的东西结果又忘了,故而将之写下避免下次又得重新查阅资料
这里讲的是关于STM32F10X的,和STM32F0XX系列的还是有一些区别的,F0的下次有空在写了....
概括一下:复用就是一个引脚有几个功能,1.做普通IO输入输出2.其他外设的输入输出(比如I2C,TIM,SPI等等),这就是复用。
重映射就是将引脚功能重新定义到其他引脚,例如PA9是USART1-TX默认的管脚,但是现在PA9用做它用了,那可以将USART1-TX重新映射到PB6,当然这种映射不是随意的想映射到哪个脚就哪个脚,芯片内部已经固定了只能映射到固定的地方
OK,说完了概念 下面是用法
MCU复位后PA8的默认功能是普通IO管脚,我想将它设为TIM1的PWM-CH1复用输出
步骤就是:1、将TIM1初始化好,设成PWM输出,使能定时器。2、将PA8管脚设为复用推挽输出。这样就可以使用PWM了,也就是复用的用法
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);
/*Timer时基设置外设时钟频率*/
TIM_TimeBaseStructure.TIM_Period = 240;
TIM_TimeBaseStructure.TIM_Prescaler = 0;
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseStructure.TIM_RepetitionCounter =0;
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;
TIM_OCInitStructure.TIM_Pulse = 10;
TIM_OC1Init(TIM1, &TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);
TIM_ARRPreloadConfig(TIM1,ENABLE);
TIM_Cmd(TIM1,ENABLE);
那如果我PA8已经用作其他了。想将其重映射咋办,,,
按照上图 只有两种映射 部分映射和完全映射 如果是部分映射 改变的是BKIN,CH1N,CH2N,CH3N这几个脚而已,所以应该选完全映射 就可以将TIM1的PWM-CH1重映射到PE9这个脚去
GPIO_PinRemapConfig(GPIO_FullRemap_TIM1,ENABLE);
//不懂你们有没有这样的疑问,这样会不会改变其他引脚,本来我就不想改变其他只改变一个引脚,结果其他引脚也被重映射走了....
关于这个问题,我的理解是:例如上图,假如说 连CH2 CH3 CH4也以前用了的话 那就没办法了 都会一起被重新映射走了,也就说CH2=PE11 CH3=PE13 CH4 =PE14没办法只做到只映射了一个过来而已
上述乃个人理解,不对之处还望指出.....