一、定时器的配置
1、概述
STM32的定时器功能比较多、配置也较复杂,我现在了解不多,边用边学吧。智林开发板上有两个用定时器的地方,一个是液晶的背光电源,要求输出一定的PWM波形,用于整流提供电源;二是用于控制喇叭,也是时钟脉冲输出。
定时器首先的选择是计数、还是定时,我这里用的都是定时,输出模式可以是输入时定时器的捕获,可以是比较匹配时设定输出(经常用到这一种)。
2、源程序
void TIMx_Config(void) {
TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;//时基单元配置数据结构
TIM_OCInitTypeDefTIM_OCInitStructure;//输出模式设置数据结构
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;//PA2,复用输出模式
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//即用于定时2通道3
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
TIM_TimeBaseStructure.TIM_Period = CCR3_Val;//40写入自动装载寄存器,150KHz输出。
TIM_TimeBaseStructure.TIM_Prescaler = 2;//分频系数3
TIM_TimeBaseStructure.TIM_ClockDivision = 0;//与什么采样相关,这里用不到
//向上计数的特点是:从0到加载值,产生溢出;然后重新从0计数。
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle;//定时器计数与比较通道匹配时翻转
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//开启输出通道
TIM_OCInitStructure.TIM_Pulse = CCR3_Val;//比较通道的计数值
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;//低电平有效
TIM_OC3Init(TIM2, &TIM_OCInitStructure);
TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Enable);//自动重装载,预装载
TIM_Cmd(TIM2, ENABLE);
//TIM_ITConfig(TIM2, TIM_IT_CC3, ENABLE);
}
这里只列出了液晶使用的定时器2通道3的输出,输出150kHz的频率。没用到中断。这个频率是怎么得到的呢?首先是TIM2使用APB1的36M,经过预分频,分频系数为(Prescaler+1)=3,3分频后为12MHz。计数周期为40,计数到40与输出比较寄存器产生匹配,触发输出翻转,然后计数器重新开始计数。故输出通道的频率为12MHz除以80,得到150kHz。
二、串口的配置
按键输入命令不怎么方便,很快我就要编写串口通信程序,用串口输入命令,控制开发板。串口配置用库函数很方便。
void UART_Config(void){//进行串口的初始化配置
USART_InitTypeDef USART_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
USART1->BRR =0x0271;
USART_Cmd(USART1, ENABLE);
}