STM32学习笔记6(TIM模块定时器)
//Step4.中断服务子程序:void TIM1_UP_IRQHandler(void){GPIOC-> //TIM2_OC2模块设置(设置2通道占空比)TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;TIM_OCInitStructure.TIM_Pulse = 680;TIM_OC2Init(TIM1, &TIM_OCInitStructure);//启用CCR2寄存器的影子寄存器(直到产生更新事件才更改设置)TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable);//死区设置TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable;TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable;TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_OFF;TIM_BDTRInitStructure.TIM_DeadTime = 0x90;//这里调整死区大小0-0xffTIM_BDTRInitStructure.TIM_Break = TIM_Break_Disable;TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_High;TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;TIM_BDTRConfig(TIM1, &TIM_BDTRInitStructure);//TIM1开启TIM_Cmd(TIM1, ENABLE);//TIM1_OC通道输出PWM(一定要加)TIM_CtrlPWMOutputs(TIM1, ENABLE); }其实,PWM模块还可以有很多花样可以玩,比方在异常时(如CPU时钟有问题),可以紧急关闭输出,以免发生电路烧毁等严重事故 《九九的STM32笔记》整理(2) 这是一个综合的例子,演示了ADC模块、DMA模块和USART模块的基本使用。我们在这里设置ADC为连续转换模式,常规转换序列中有两路转换通道,分别是ADC_CH10(PC0)和ADC_CH16(片内温度传感器)。因为使用了自动多通道转换,数据的取出工作最适合使用DMA方式取出,so,我们在内存里开辟了一个u16 AD_Value[2]数组,并设置了相应的DMA模块,使ADC在每个通道转换结束后启动DMA传输,其缓冲区数据量为2个HalfWord,使两路通道的转换结果自动的分别落到 AD_Value[0]和AD_Value[1]中。然后,在主函数里,就无需手动启动AD转换,等待转换结束,再取结果了。我们可以在主函数里随时取AD_Value中的数值,那里永远都是最新的AD转换结果。如果我们定义一个更大的AD_Value数组,并调整DMA的传输数据量(BufferSize)可以实现AD结果的循环队列存储,从而可以进行各种数字滤波算法。接着,取到转换结果后,根据V=(AD_Value/4096)*Vref+的公式可以算出相应通道的电压值,也可以根据 T(℃) = (1.43 - Vad)/34*10^(-6) + 25的算法,得到片内温度传感器的测量温度值了。通过重新定义putchar函数,及包含"stdio.h"头文件,我们可以方便的使用标准C的库函数printf(),实现串口通信。相关的官方例程,可以参考FWLib V2.0的ADCADC1_DMA和USARTprintf两个目录下的代码。 本代码例子是基于万利199的开发板EK-STM32F实现,CPU=STM32F103VBT6 #i nclude "stm32f10x_lib.h"#i nclude "stdio.h" #define ADC1_DR_Address((u32)0x4001244C)vu16 AD_Value[2];vu16 i=0;s16 Temp;u16 Volt; void RCC_Configuration(void);void GPIO_Configuration(void);void NVIC_Configuration(void);void USART1_Configuration(void);void ADC1_Configuration(void);void DMA_Configuration(void); int fputc(int ch, FILE *f);void Delay(void);u16 GetTemp(u16 advalue);u16 GetVolt(u16 advalue);int main(void){RCC_Configuration();GPIO_Configuration();NVIC_Configuration();USART1_Configuration();DMA_Configuration();ADC1_Configuration();//启动第一次AD转换ADC_SoftwareStartConvCmd(ADC1, ENABLE);//因为已经配置好了DMA,接下来AD自动连续转换,结果自动保存在AD_Value处while (1){Delay();Temp = GetTemp(AD_Value[1]);Volt = GetVolt(AD_Value[0]);USART_SendData(USART1, 0x0c);//清屏//注意,USART_SendData函数不检查是否发送完成//等待发送完成while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); printf("电压:%d.%d 温度:%d.%d℃", Volt/100, Volt0, Temp/100, Temp0);}} int fputc(int ch, FILE *f){//USART_SendData(USART1, (u8) ch);USART1->DR = (u8) ch;while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET){} return ch;} void Delay(void){u32 i;for(i=0;i<0x4f0000;i++);return;} u16 GetTemp(u16 advalue){u32 Vtemp_sensor;s32 Current_Temp;//ADC转换结束以后,读取ADC_DR寄存器中的结果,转换温度值计算公式如下://V25 - VSENSE// T(℃) = ------------ + 25//Avg_Slope//V25: 温度传感器在25℃时 的输出电压,典型值1.43 V。// V
STM32学习笔记TIM模块定时 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)