1.使能gpio的复用功能,指的是1)gpio_pinafconfig(gpioa, gpio_pinsource1, gpio_af_tim2);和2)gpio_initstructure.gpio_mode = gpio_mode_af。这两条缺一不可,在f4里没有了开始复用时钟(rcc)功能。
2.分频和周期计算公式:
prescaler = (timxclk / timx counter clock) - 1;
period = (timx counter clock / tim3 output clock) - 1
timx counter clock为你所需要的txm的定时器时钟
3.pwm的幅值为3.3v
/************************************************************
皇冠最新app版本 copyright (c), 2012-2022, yin.
filename: main.c
author: ycw version : 1.0 date: 2012.04.24
description: tim2 pwm
version: v1.0
function list: tim2 pwm
history:
#include
static __io uint32_t timingdelay;//__io为volatile的宏定义
int8_t led_flag = 1;//led灯翻转标志位
void gpio_config(void);
void tim_config(void);
void nvic_config(void);
void delay(__io uint32_t ntime);
main ()
{
/*在主函数main之前通过调用启动代码运行了systeminit函数,而
这个函数位于system_stm32f4xx.c”。程序运行起始于启动文件的第
175行(ldr r0, =systeminit)。sys时钟为hse频率/pll_m*pll_n/pll_p,
定义hse为25m,则sys时钟频率为168m */
gpio_config();
tim_config();
nvic_config();
/*systemcoreclock / 1000时基为1ms*/
if (systick_config(systemcoreclock / 1000))
{
/* capture error */
while (1);
}
while (1)
{/*产生一个软件中断
exti_generateswinterrupt(exti_line0);
delay(1000); */
if (led_flag != 1)
{
gpio_setbits(gpiog, gpio_pin_6); //setbits使能io,当前下指输出(此时为灭)
}
else
{
gpio_resetbits(gpiog, gpio_pin_6); //resetbits屏蔽io,当前下指不输出(此时为亮)
}
}
}
/*************************************************
function: void gpio_config(void)
description: gpio配置函数
input: 无
output:无
return:无
*************************************************/
void gpio_config(void)
{
/*定义了一个gpio_initstructure的结构体,方便一下使用 */
gpio_inittypedef gpio_initstructure;
/* 使能gpiog时钟(时钟结构参见“stm32图解.pdf”)*/
rcc_ahb1periphclockcmd(rcc_ahb1periph_gpiog | rcc_ahb1periph_gpioa, enable);
/*仅设置结构体中的部分成员:这种情况下,用户应当首先调用函数ppp_sturcinit(..)
来初始化变量ppp_initstructure,然后再修改其中需要修改的成员。这样可以保证其他
成员的值(多为缺省值)被正确填入。*/
gpio_structinit(&gpio_initstructure);
/* 初始化gpiog的pin_6为推挽输出*/
gpio_initstructure.gpio_pin = gpio_pin_6; //指定第六引脚
gpio_initstructure.gpio_mode = gpio_mode_out; //模式为输出
gpio_initstructure.gpio_speed = gpio_speed_50mhz; //频率为快速
gpio_init(gpiog, &gpio_initstructure); //调用io初始化函数
/*配置gpioa_pin_1,作为tim_channel2 pwm输出*/
gpio_initstructure.gpio_pin = gpio_pin_1; //指定第六引脚
gpio_initstructure.gpio_mode = gpio_mode_af; //模式必须为复用!
gpio_initstructure.gpio_speed = gpio_speed_50mhz; //频率为快速
//gpio_initstructure.gpio_pupd = gpio_pupd_up; //上拉与否对pwm产生无影响
gpio_init(gpioa, &gpio_initstructure);
gpio_pinafconfig(gpioa, gpio_pinsource1, gpio_af_tim2);//复用gpioa_pin1为tim2_ch2
}
/*************************************************
function: void tim_config(void)
description: 定时器配置函数
input: 无
output: 无
*************************************************/
void tim_config(void)
{
tim_timebaseinittypedef tim_timebasestructure;
tim_ocinittypedef tim_ocinitstructure;
rcc_apb1periphclockcmd(rcc_apb1periph_tim2,enable);
tim_deinit(tim2);//初始化tim2寄存器
/*分频和周期计算公式:
prescaler = (timxclk / timx counter clock) - 1;
period = (timx counter clock / tim3 output clock) - 1
timx counter clock为你所需要的txm的定时器时钟
*/
tim_timebasestructure.tim_period = 10000-1; //查数据手册可知,tim2与tim5为32位自动装载
/*在system_stm32f4xx.c中设置的apb1 prescaler = 4 ,可知
apb1时钟为168m/4*2,因为如果apb1分频不为1,则定时时钟*2
*/
tim_timebasestructure.tim_prescaler = 8400-1;
tim_timebasestructure.tim_clockdivision = tim_ckd_div1;
tim_timebasestructure.tim_countermode = tim_countermode_up;//向上计数
tim_timebaseinit(tim2, &tim_timebasestructure);
/*配置输出比较,产生占空比为20%的pwm方波*/
tim_ocstructinit(&tim_ocinitstructure);
tim_ocinitstructure.tim_ocmode = tim_ocmode_pwm1;//pwm1为正常占空比模式,pwm2为反极性模式
tim_ocinitstructure.tim_outputstate = tim_outputstate_enable;
tim_ocinitstructure.tim_pulse = 2000;//输入ccr(占空比数值)
tim_ocinitstructure.tim_ocpolarity = tim_ocpolarity_high;//high为占空比高极性,此时占空比为20%;low则为反极性,占空比为80%
tim_oc2init(tim2, &tim_ocinitstructure);
tim_oc2preloadconfig(tim2, tim_ocpreload_enable);//ccr自动装载默认也是打开的
tim_arrpreloadconfig(tim2, enable); //arr自动装载默认是打开的,可以不设置
tim_clearflag(tim2, tim_flag_update);
tim_itconfig(tim2, tim_it_update,enable);
tim_cmd(tim2, enable); //使能tim2定时器
}
/*************************************************
function: void nvic_config(void)
description: 嵌套中断断配置函数
input: 无
output: 无
*************************************************/
void nvic_config(void)
{
/*配置定时器tim2中断嵌套*/
nvic_inittypedef nvic_initstructure;
nvic_prioritygroupconfig(nvic_prioritygroup_1);
nvic_initstructure.nvic_irqchannel = tim2_irqn;
nvic_initstructure.nvic_irqchannelpreemptionpriority = 1;
nvic_initstructure.nvic_irqchannelsubpriority = 0;
nvic_initstructure.nvic_irqchannelcmd = enable;
nvic_init(&nvic_initstructure);
}
/*************************************************
function: void delay(__io uint32_t ntime)
description: 精确延时函数,时基根据前面设定,当前
为1ms
input: 需要延时的时间,单位ms
output:无
*************************************************/
void delay(__io uint32_t ntime)
{
timingdelay = ntime;
while (timingdelay != 0);
}
/*************************************************
function: void timingdelay_decrement(void)
description: systick中断服务函数,加在_it.h中的
void systick_handler(void)函数内
input: 无
output:无
*************************************************/
void timingdelay_decrement(void)
{
if (timingdelay != 0x00)
{
timingdelay--;
}
}




热门文章

