15 保留 7 保留 14 6 13 CC4P 5 CC2P 12 CC4E 4 CC2E 11 保留 3 保留 10 2 9 CC3P 1 CC1P 8 CC3E 0 CC1E
TIMx_CCER(捕获/比较使能寄存器) TIM2->CCER&=0X03;
TIM2->CCMR|=1<<4; // //设置极性并输出时能
void Timerx2_Init(u16 arr,u16 psc) {
RCC->APB1ENR|=1<<0;//使能TIME2的时钟 TIM3->ARR=arr;//设定计数器自动重装值 TIM3->PSC=psc;//预分频器不分频
TIM2->CCMR1|=7<<12; //选择PWM模式2 TIM2->CCMR1|=1<<11; //使能预装载寄存器
TIM2->CR1|=1<<7; //使能自动装载的预分频寄存器 TIM2->CR1|=1<<0; //使能定时器
// TIM2->CCER=0X3303;
TIM2->CCER|=1<<4; //设置极性并输出时能 }
比如利用TIM3的通道TH3产生PWM输出: void PWM_Init(u16 arr,u16 psc) { RCC->APB1ENR|=1<<1; //TIM3时钟使能 GPIOA->CRL&=0X0FFFFFFF;//PA7输出 GPIOA->CRL|=0XB0000000;//复用功能输出 GPIOA->ODR|=1<<7;//PA7上拉 TIM3->ARR=arr;//设定计数器自动重装值 TIM3->PSC=psc;//预分频器不分频 TIM3->CCMR1|=7<<12; //CH2 PWM2模式 TIM3->CCMR1|=1<<11; //CH2预装载使能 TIM3->CCER|=1<<4; //OC2 输出使能 TIM3->CR1=0x8000; //ARPE使能 TIM3->CR1|=0x01; //使能定时器3 }
其余几个定时器的PWM输出寄存器配置依次类推。
以下例子说明如何在TI1 输入的上升沿时捕获计数器的值到TIM1_CCR1寄存器中,步骤如下:
1、使能TIM1时钟:
15 ADC3EN 7 IOPFEN 14 13 USART1EN TIM8EN 6 5 IOPEEN IOPDEN 12 SPI1EN 4 IOPCEN 11 TIM1EN 3 IOPBEN 10 ADC2EN 2 IOPAEN 9 ADC1EN 1 保留 8 IOPGEN 0 AFIOEN
RCC_APB2ENR的0~15位(06~32位保留) RCC->APB2ENR|=1<<11; //使能TIME1的时钟 2、选择有效输入端:
TIM1_CCMR1必须.接到TI1 输入,所以写入TIM1_CCMR1寄存器中的CC1S=01,一旦CC1S=01不为00时,通道被配置为输入,并且TIM1_CCMR1 寄存器变.只读。
15 OC2CE 7 OC1CE 14 13 OC2M[2:0] IC2F[3:0] 6 5 OC1M[2:0] IC1F[3:0] 12 4 11 10 OC2PE OC2FE IC2PSC[1:0] 3 2 OC1PE OC1FE IC1PSC[1:0] 9 8 CC2S[1:0] 1 0 CC1S[1:0] TIM1_CCMR1(捕获/比较模式寄存器1)
TIM1->CCMR1=0X01; //CC1通道选择输入,IC1映射在TI1上
3、根据输入信号的特点,配置输入滤波器为所需的带宽(输入为TI1时TIM1_CCMRx寄存器中的ICxF位)。假设输入信号在最多5 个时钟周期的时间内抖动,我们.配置滤波器的带长于5个时钟周期。因此我们可以(以fDTS 频率)连续采样8次,已确认在TI1上一次真实的边沿变换,即在TIM1_CCMR1寄存器中写入IC1F=0011. 15 OC2CE 7 OC1CE 14 13 OC2M[2:0] IC2F[3:0] 6 5 OC1M[2:0] IC1F[3:0] 12 4 11 10 OC2PE OC2FE IC2PSC[1:0] 3 2 OC1PE OC1FE IC1PSC[1:0] 9 8 CC2S[1:0] 1 0 CC1S[1:0]
TIM1_CCMR1(捕获/比较模式寄存器1) TIM1->CCMR1|=3<<4; //
4、选择TI1 通道的有效转.边沿,在TIM1_CCER寄存器中写入CC1P=0(即上升沿)。 15 保留 7 保留
14 6 13 CC4P 5 CC2P 12 CC4E 4 CC2E 11 保留 3 保留 10 2 9 CC3P 1 CC1P 8 CC3E 0 CC1E TIMx_CCER(捕获/比较使能寄存器) TIM1->CCER&=0<<1; 5、配置输入预分频器。
在本例中,我们希望捕获发生在每一个有效的电平转换时刻,因此预分频器被禁止(写TIM1_CCMR1 寄存器的IC1PS=00)。 15 OC2CE 7 OC1CE 14 13 OC2M[2:0] IC2F[3:0] 6 5 OC1M[2:0] IC1F[3:0] 12 4 11 10 OC2PE OC2FE IC2PSC[1:0] 3 2 OC1PE OC1FE IC1PSC[1:0] 9 8 CC2S[1:0] 1 0 CC1S[1:0]
TIM1_CCMR1(捕获/比较模式寄存器1) (见第二步)
6、设置TIM1_CCER 寄存器的CC1E=1,允许捕获计数器的值到捕获寄存器中。 15 保留 7 保留 14 6 13 CC4P 5 CC2P 12 CC4E 4 CC2E 11 保留 3 保留 10 2 9 CC3P 1 CC1P 8 CC3E 0 CC1E
TIMx_CCER(捕获/比较使能寄存器) TIM1->CCER|=1<<0; 7、如果需要,通过.置TIM1_DIER 寄存器中的CC1IE 位允许相关中断求,通过置TIM1_DIER寄存器中的CC1DE允许DAM请求。
15 保留 7 BIE 14 TDE 6 TIE 13 COMDE 5 COMIE 12 CC4DE 4 CC4IE 11 CC3DE 3 CC3IE 10 CC2DE 2 CC2IE 9 CC1DE 1 CC1IE 8 UDE 0 UIE TIMx_DIER(TIM1和TIM8 DMA/中断使能寄存器) TIM1->DIER|=1<<1; TIM1->DIER|=1<<0; 捕获函数:
void Tim1_th1_cap_Init(u16 arr,u16 psc) {
RCC->APB2ENR|=1<<11; //使能TIME1的时钟
RCC->APB2ENR|=1<<2; //就是使能GPIOA的时钟
RCC->CHL&=0XFFFFFFF0;
RCC->CHL|=0X00000004; //设置PA8为浮空输入 TIM1->ARR=arr; TIM1->PSC=psc;
TIM1->CCMR1=0X01; //CC1通道选择输入,IC1映射在TI1上 TIM1->CCMR1|=3<<4; //
TIM1->CCER&=0<<1; //上升沿触发 TIM1->CCER|=1<<0; //捕获使能
TIM1->DIER|=1<<1; //允许捕获中断 TIM1->DIER|=1<<0; //允许更新中断
TIM1->CR1|=1<<0; //使能计数器1
MY_NVIC_Init(1,1,TIM1_IRQChannel,2); //抢占1,子1,组2 }
中断服务程序: 主函数:
五、SPI总线
SPI_CR寄存器的CPOL和CPHA位,能够组合成四种可能的时序关系。CPOL(时钟极性)位控制在没有数据传输时时钟的空闲状态电平,此位对主模式和从模式下的设备都有效。如果CPOL被清’0’,SCK引脚在空闲状态保持低电平;如果CPOL被置’1’,SCK引脚在空闲状态保持高电平。
如果CPHA(时钟相位)位被置’1’,SCK时钟的第二个边沿(CPOL位为0时就是下降沿,CPOL位为’1’时就是上升沿)进行数据位的采样,数据在第二个时钟边沿被锁。如果CPHA位被清’0’,SCK时钟的第一边沿(CPOL位为’0’时就是下降沿,CPOL位为’1’时就是上升沿)进行数据位采样,数据在第一个时钟边沿被锁存。
空闲SCK 0 1 第二个时钟边沿下降沿采样 第二个时钟边沿上升沿采样 第一个时钟边沿下降沿采样 第一个时钟边沿上升沿采样
SPI配置成主模式:
1、使能SPI时钟和PORTA时钟:
CPOL(时钟极性) 0 1 0 1 0 1 CPHA(时钟相位) 1 1 0 0 15 ADC3EN 7 IOPFEN 14 13 USART1EN TIM8EN 6 5 IOPEEN IOPDEN 12 SPI1EN 4 IOPCEN 11 TIM1EN 3 IOPBEN 10 ADC2EN 2 IOPAEN 9 ADC1EN 1 保留 8 IOPGEN 0 AFIOEN RCC_APB2ENR的0~15位(06~32位保留)
RCC->APB2ENR|=1<<2; //PORTA时钟使能 RCC->APB2ENR|=1<<12; //SPI1时钟使能 2、开全双工模式并软件管理NSS: 15 14 BIDIMODE BIDIOE 7 6 LSBFIRST SPE 13 CRCEN 5 12 11 CRCNEXT DFF 4 3 BR[2:0] 10 RXONLY 2 MSTR 9 SSM 1 CPOL SSI 8 0 CPHA
SPI控制寄存器1(SPI_CR1) SPI1->CR1|=0<<10;//全双工模式 SPI1->CR1|=1<<9; SPI1->CR1|=1<<8; //软件nss管理 3、设置SPI为主机并设置数据帧格式: 15 14 BIDIMODE BIDIOE 7 6 LSBFIRST SPE 13 CRCEN 5 12 11 CRCNEXT DFF 4 3 BR[2:0] 10 RXONLY 2 MSTR 9 SSM 1 CPOL SSI 8 0 CPHA