一些库函数的用法手册上讲得不甚详细,网上也几乎没有资料,把我个人理解的一些东西和大家分享一下,如有错漏请批评指正。
TIM_DeInit(TIM2);
//注意:按缺省值复位后,时钟源为内部时钟,不必再调用函数设置。如需要更改定时器计时的时钟源,
//调用后面的那几个相关函数就行。定时器的时钟不是直接来自APB1/2,而是来自于输入为APB1/2的一个倍频器。
//当APB1/2的预分频系数为1时,定时器的时钟频率等于APB1/2的频率;
//当APB1/2的预分频系数为其它数值时,定时器的时钟频率等于APB1/2的频率两倍。
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_TimeBaseStructure.TIM_Period = 10000-1;
//设置在下一个更新事件装入活动的自动重装载寄存器周期的值
//由于计数从0开始,所以此处应为理想周期减1,最大值为0xFFFF
TIM_TimeBaseStructure.TIM_Prescaler = 0xF;
//设置用来作为TIMx时钟频率除数的预分频值,最大值为0xFFFF
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
//设置定时器输入频率fCK_INT与数字滤波器采样频率基准fDTS使用的采样频率之间的分频比例
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
//中央对齐模式1 计数器交替地向上和向下计数。输出比较中断标志位,只在计数器向下计数时被设置
//中央对齐模式2 计数器交替地向上和向下计数。输出比较中断标志位,只在计数器向上计数时被设置
//中央对齐模式3 计数器交替地向上和向下计数。输出比较中断标志位,只在计数器向下和向上计数时均被设置
TIM_TimeBaseInit(TIM2, & TIM_TimeBaseStructure);
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;//设置输出模式
//TIM_OCMode_Timing: 比较成功后不在对应输出管脚上产生输出(输出引脚冻结,可另作他用),但产生中断,用来作软件定时器用。
//TIM_OCMode_Toggle: 比较成功后翻转对应输出管脚上的电平。
//TIM_OCMode_Active: 输出比较主动模式,匹配时设置输出引脚为有效电平,当计数值为比较/捕获寄存器值相同时,强制输出为高电平
//TIM_OCMode_Inactive:输出比较非主动模式,匹配时设置输出引脚为无效电平,当计数值为比较/捕获寄存器值相同时,强制输出为低电平
//TIM_OCMode_PWM1: 当计时器值小于比较器设定值时则TIMX输出脚此时输出有效高电位。
// 当计时器值大于或等于比较器设定值时则TIMX输出脚此时输出低电位。
//TIM_OCMode_PWM2时: 与TIM_OCMode_PWM1相反
TIM_OCInitStructure.TIM_Pulse=0xFFFF;//设置输出脉宽,最大只能取0xFFFF
TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;//使能输出
TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;//设置输出极性
// TIM_OCInitStructure.TIM_OCNPolarity=TIM_OCNPolarity_High;
// //指定TIM互补输出引脚的在比较有效时的输出电平。仅供高级定时器有效。
// TIM_OCInitStructure.TIM_OutputNState=TIM_OutputNState_Enable;
// //使能或使能TIM的互补输出。仅供高级定时器有效
// TIM_OCInitStructure.TIM_OCIdleState=TIM_OCIdleState_Set;
// TIM_OCInitStructure.TIM_OCNIdleState=TIM_OCNIdleState_Reset;
// //指定在空闲状态下的TIM输出比较引脚的状态。仅供高级定时器有效。
TIM_OC1Init(TIM2, & TIM_OCInitStructure);//使用哪个通道,就把前面的OCxInit改成几
TIM_ICInitTypeDef TIM_ICInitStructure;
TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;//选择通道。
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;//选择输入捕获的边沿
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
// TIM_ICSelection_DirectTI TIM输入1,2,3或4与IC1或IC2或IC3或IC4相连
// TIM_ICSelection_IndirectTI TIM输入1,2,3或4与IC2或IC1或IC4或IC3相连
// TIM_ICSelection_TRC TIM输入1,2,3或4与TRC(内部触发)相连。
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;//设置输入捕获预分频器
TIM_ICInitStructure.TIM_ICFilter = 0x0;
//选择输入比较滤波器。该参数取值在0x0和0xF
//不同的取值代表着不同的采样频率和带宽,详见手册336页表
//实际采样频率fSAMPLING不一定等于采样频率基准fDTS
TIM_ICInit(TIM2, &TIM_ICInitStructure);
//TIM_PWMIConfig(TIM2, &TIM_ICInitStructure);
//新版函数库里取消了TIM_ICMode,TIM_ICInit()默认为输入捕获模式ICAP
//如果使用PWM输入模式,要用TIM_PWMIConfig()来初始化
TIM_Cmd(TIM2, ENABLE);
TIM_ITConfig(TIM2, TIM_IT_CC1, ENABLE );
//TIM_IT_Update: 更新事件:计数器上溢/下溢,计数器初始化(由软件或内部/外部触发)
//TIM_IT_CC1: 通道1输入捕获/输出比较
//TIM_IT_CC2: 通道2输入捕获/输出比较
//TIM_IT_CC3: 通道3输入捕获/输出比较
//TIM_IT_CC4: 通道4输入捕获/输出比较
//TIM_IT_COM: TIM Commutation Interrupt source
//TIM_IT_Trigger: 触发事件:计数器开始、停止、初始化或由内部/外部触发计数
//TIM_IT_Break: 打断输入
TIM_InternalClockConfig(TIM2);
//禁止从模式,用内部时钟直接驱动定时器的预分频器
TIM_ITRxExternalClockConfig(TIM2, TIM_TS_ITR3);
//设置定时器工作于从模式,时钟源为其他定时器的输出分频.此时钟源无滤波
//TIM_TS_ITR0 TIM内部触发0 TIM1
//TIM_TS_ITR1 TIM内部触发1 TIM2
//TIM_TS_ITR2 TIM内部触发2 TIM3
//TIM_TS_ITR3 TIM内部触发3 TIM4
TIM_TIxExternalClockConfig(TIM2, TIM_TS_TI1FP1,TIM_ICPolarity_Rising, 0);
//设置 TIMx 触发为外部时钟(从四个通道引脚引入)
//触发源选择:
//TIM_TIxExternalCLK1Source_TI1ED: 未经滤波的Timer Input 1
//TIM_TIxExternalCLK1Source_TI1: 滤波后的Timer Input 1
//TIM_TIxExternalCLK1Source_TI2: 滤波后Timer Input 2
//设置输入捕获的边沿:
//TIM_ICPolarity_Rising
//TIM_ICPolarity_Falling
//设置滤波设置:
//必须在0x0与0xF之间
TIM_ETRClockMode1Config(TIM2, TIM_ExtTRGPSC_DIV2,TIM_ExtTRGPolarity_NonInverted, 0x0);
//外部时钟模式1.需要设置预分频,以及外部触发极性:
//TIM_ExtTRGPolarity_Inverted TIM外部触发极性翻转: 低电平或下降沿有效
//TIM_ExtTRGPolarity_NonInverted TIM外部触发极性非翻转:高电平或上升沿有效
//最后要设置滤波环节。
TIM_ETRClockMode2Config(TIM2, TIM_ExtTRGPSC_DIV2,TIM_ExtTRGPolarity_NonInverted, 0x0);
//外部时钟模式2.
//通用定时器的计数时钟有三种:
//内部时钟(CK_INT)
//外部时钟源,包括:
//外部时钟模式1 外部输入脚(TIx)
//外部时钟模式2 外部触发输入(ETR)
//内部触发输入(ITRx) 这三种
//ETR仅用于外部触发,CHx还可以输出PWM,ETR是不可能输出PWM的。
//这个函数后面的一些函数大部分是为实现上述功能而需要调用的底层函数,不需要熟练掌握
TIM_ARRPreloadConfig(TIM2, ENABLE);
//使能预装载寄存器后其与影子寄存器间将不再是立即写入的关系,而是等更新事件产生后才写入
//输入捕获和输出比较相关的预装载寄存器同理
TIM_OC1FastConfig(TIM2, TIM_OCFast_Enable);
//输出比较快速特征性能用在缩短单脉冲输出模式时的最小输出延迟
//失能时,由于从激励进入到打开计数器需要时间,因此最小延迟为5个时钟周期
//使能后,一旦有激励进入,将立即输出活动电平,而不管比较结果如何。延迟被缩短为3个时钟周期
//必须将通道配置为PWM模式此设置才有作用
上一篇:STM32在MDK下的一种通用建立库函数工程的方法(标准库)
下一篇:stm32的TIM定时器HAL库函数的使用
推荐阅读
史海拾趣
FINECHIPS公司自成立以来,始终将技术创新视为企业发展的核心驱动力。公司投入大量资源于研发部门,专注于集成电路(IC)和电子元器件的技术创新。在某一关键时期,FINECHIPS成功研发出一款高性能、低功耗的模拟开关芯片,该芯片凭借其卓越的性能迅速获得市场认可,不仅在国内市场占据一席之地,还成功打入国际市场,为公司带来了显著的品牌影响力和市场份额增长。
面对日益激烈的市场竞争,ATO SOLUTION公司不断创新营销策略,提升品牌知名度和影响力。公司利用互联网和社交媒体等新媒体平台,开展线上宣传和推广活动;同时,还积极参加各类行业展会和论坛,与业界同行和潜在客户进行深入交流和合作。这些创新的营销策略有效地提升了公司的市场影响力,为公司的业务拓展提供了有力支持。
在1902年,Joseph C. Belden在美国芝加哥创立了Belden公司,标志着这家电线电缆公司的诞生。创立初期,公司便专注于电线电缆的研发和生产,凭借其卓越的产品质量和可靠的性能,逐渐在市场上崭露头角。随着业务的发展,Belden逐渐扩大了生产规模,并增设了多个生产基地,以满足不断增长的市场需求。
在环保意识日益增强的背景下,Corstat Containers公司积极响应,推出了可回收、可降解的环保电子元件包装盒。这一产品不仅满足了市场对环保产品的需求,还为公司赢得了良好的社会声誉。同时,公司还加大了对环保技术的研发投入,不断推出更加环保、高效的电子产品包装解决方案,进一步巩固了其在电子行业的领先地位。
随着公司业务的不断发展,芯邦开始积极布局UWB(超宽带通信)产品线。UWB技术以其高速率、高精度和低功耗的特点,在智能家居、物联网等领域展现出巨大的应用潜力。芯邦通过研发UWB等信息传输技术及产品,致力于从移动存储及智能家电市场出发,以手机及移动智能设备、车规及汽车周边产品应用、智能家居及物联网领域为目标市场,打造多系列产品线格局,提升公司的市场竞争力。
随着公司的发展,Codeco逐渐意识到技术创新的重要性。他们投入大量资源研发新技术,不断提升产品的性能和用户体验。在一次关键的研发项目中,Codeco的团队突破了某项技术难题,推出了一款引领行业潮流的新产品。这一创新不仅为公司带来了可观的收益,也进一步巩固了Codeco在电子行业的地位。
请问这段代码哪里有问题?怎么改? /*中断实现串口通信 */ #include unsigned char flag; void main() { void init(); init(); while(1) { whi ...… 查看全部问答∨ |
|
我想转投嵌入式程序设计,请问目前主流的嵌入式软件开发环境有哪些?我看了有C、C++、WinCE、Linux等等,那么我该主攻哪个啊?我原来是搞ASP.Net+C#的。… 查看全部问答∨ |
|
LED电子钟的制作方法在很多电子报刊杂志上都可以见到,但大多数在断电后都要重新设置时间等参数,给使用带来很多不便。也有用后备电池作为备用电源的,但往往体积较大。本文介绍的LED电子钟克服了以往的弊端,而且采用了家电通用的红外遥控器进行控 ...… 查看全部问答∨ |
|
要想在职场混得好,可真是如履薄冰,什么事情都得加倍小心。对此,工作了半年多的小刘可是深有体会。上个月,他因为对公司的人事关系不了解说错了一句话,结果挨了好几个领导的批评。从此,小刘变得战战兢兢、时刻小心,什么话也不敢多说,生怕 ...… 查看全部问答∨ |