STM32定时器程序源码

合集下载

STM32定时器配置(TIM1、TIM2、TIM3、TIM4、TIM5、TIM8)高级定时。。。

STM32定时器配置(TIM1、TIM2、TIM3、TIM4、TIM5、TIM8)高级定时。。。

STM32定时器配置(TIM1、TIM2、TIM3、TIM4、TIM5、TIM8)⾼级定时。

⽂章结构:——> ⼀、定时器基本介绍——> ⼆、普通定时器详细介绍TIM2-TIM5——> 三、定时器代码实例⼀、定时器基本介绍之前有⽤过野⽕的学习板上⾯讲解很详细,所以直接上野⽕官⽅的资料吧,作为学习参考笔记发出来⼆、普通定时器详细介绍TIM2-TIM52.1 时钟来源计数器时钟可以由下列时钟源提供:·内部时钟(CK_INT)·外部时钟模式1:外部输⼊脚(TIx)·外部时钟模式2:外部触发输⼊(ETR)·内部触发输⼊(ITRx):使⽤⼀个定时器作为另⼀个定时器的预分频器,如可以配置⼀个定时器Timer1⽽作为另⼀个定时器Timer2的预分频器。

由于今天的学习是最基本的定时功能,所以采⽤内部时钟。

TIM2-TIM5的时钟不是直接来⾃于APB1,⽽是来⾃于输⼊为APB1的⼀个倍频器。

这个倍频器的作⽤是:当APB1的预分频系数为1时,这个倍频器不起作⽤,定时器的时钟频率等于APB1的频率(36MHZ);当APB1的预分频系数为其他数值时(即预分频系数为2、4、8或16),这个倍频器起作⽤,定时器的时钟频率等于APB1的频率的2倍。

{假如APB1预分频为2(变成36MHZ),则定时器TIM2-5的时钟倍频器起作⽤,将变成2倍的APB1(2x36MHZ)将为72MHZ给定时器提供时钟脉冲。

⼀般APB1和APB2的RCC时钟配置放在初始化函数中例如下⾯的void RCC_Configuration(void)配置函数所⽰,将APB1进⾏2分频,导致TIM2时钟变为72MHZ输⼊。

如果是1分频则会是36MHZ输⼊,如果4分频:CKINT=72MHZ/4x2=36MHZ; 8分频:CKINT=72MHZ/8x2=18MHZ;16分频:CKINT=72MHZ/16x2=9MHZ}1//系统时钟初始化配置2void RCC_Configuration(void)3 {4//定义错误状态变量5 ErrorStatus HSEStartUpStatus;6//将RCC寄存器重新设置为默认值7 RCC_DeInit();8//打开外部⾼速时钟晶振9 RCC_HSEConfig(RCC_HSE_ON);10//等待外部⾼速时钟晶振⼯作11 HSEStartUpStatus = RCC_WaitForHSEStartUp();12if(HSEStartUpStatus == SUCCESS)13 {14//设置AHB时钟(HCLK)为系统时钟15 RCC_HCLKConfig(RCC_SYSCLK_Div1);16//设置⾼速AHB时钟(APB2)为HCLK时钟17 RCC_PCLK2Config(RCC_HCLK_Div1);18 //设置低速AHB时钟(APB1)为HCLK的2分频(TIM2-TIM5输⼊TIMxCLK频率将为72MHZ/2x2=72MHZ输⼊)19 RCC_PCLK1Config(RCC_HCLK_Div2);20//设置FLASH代码延时21 FLASH_SetLatency(FLASH_Latency_2);22//使能预取指缓存23 FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);24//设置PLL时钟,为HSE的9倍频 8MHz * 9 = 72MHz25 RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);26//使能PLL27 RCC_PLLCmd(ENABLE);28//等待PLL准备就绪29while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);30//设置PLL为系统时钟源31 RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);32//判断PLL是否是系统时钟33while(RCC_GetSYSCLKSource() != 0x08);34 }35//允许TIM2的时钟36 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);37//允许GPIO的时钟38 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);39 }APB1的分频在STM32_SYSTICK的学习笔记中有详细描述。

STM32定时器有什么功能?STM32的用法详解

STM32定时器有什么功能?STM32的用法详解

STM32定时器有什么功能?STM32的用法详解
2.2 计数器模式
TIM2-TIM5可以由向上计数、向下计数、向上向下双向计数。

向上计数模式中,计数器从0计数到自动加载值(TIMx_ARR计数器内容),然后重新从0开始计数并且产生一个计数器溢出事件。

在向下模式中,计数器从自动装入的值(TIMx_ARR)开始向下计数到0,然后从自动装入的值重新开始,并产生一个计数器向下溢出事件。

而中央对齐模式(向上/向下计数)是计数器从0开始计数到自动装入的值-1,产生一个计数器溢出事件,然后向下计数到1并且产生一个计数器溢出事件;然后再从0开始重新计数。

2.3 编程步骤
1. 配置系统时钟;
2. 配置NVIC;
3. 配置GPIO;
4. 配置TIMER;
其中,前3项在前面的笔记中已经给出,在此就不再赘述了。

第4项配置TIMER有如下配置:
(1)利用TIM_DeInit()函数将Timer设置为默认缺省值;
(2)TIM_InternalClockConfig()选择TIMx来设置内部时钟源;
(3)TIM_Perscaler来设置预分频系数;
(4)TIM_ClockDivision来设置时钟分割;
(5)TIM_CounterMode来设置计数器模式;。

stm32高级定时器使用教程

stm32高级定时器使用教程

STM32 高级定时器-PWM简单使用2010-04-14 14:49:29| 分类:STM32 | 标签:|举报|字号大中小订阅高级定时器与通用定时器比较类似,下面是一个TIM1 的PWM 程序,TIM1是STM32唯一的高级定时器。

共有4个通道有死区有互补。

先是配置IO脚:GPIO_InitTypeDef GPIO_InitStructure;/* PA8设置为功能脚(PWM) */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);/*PB13 设置为PWM的反极性输出*/GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);/*开时钟PWM的与GPIO的*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);/*配置TIM1*/TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_OCInitTypeDef TIM_OCInitStructure;void Tim1_Configuration(void){TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_OCInitTypeDef TIM_OCInitStructure;TIM_DeInit(TIM1); //重设为缺省值/*TIM1时钟配置*/TIM_TimeBaseStructure.TIM_Prescaler = 4000; //预分频(时钟分频)72M/4000=18KTIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数TIM_TimeBaseStructure.TIM_Period = 144; //装载值18k/144=125hz 就是说向上加的144便满了 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置了时钟分割不懂得不管 TIM_TimeBaseStructure.TIM_RepetitionCounter = 0x0; //周期计数器值不懂得不管TIM_TimeBaseInit(TIM1,&TIM_TimeBaseStructure); //初始化TIMx的时间基数单位/* Channel 1 Configuration in PWM mode 通道一的PWM */TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //PWM模式2 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //正向通道有效PA8 TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable; //反向通道也有效 PB13TIM_OCInitStructure.TIM_Pulse = 40; //占空时间144 中有40的时间为高,互补的输出正好相反 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性 TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low; //互补端的极性TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset; //空闲状态下的非工作状态不管 TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset; //先不管TIM_OC1Init(TIM1,&TIM_OCInitStructure); //数初始化外设TIMx通道1这里2.0库为TIM_OCInit/* TIM1 counter enable开定时器*/TIM_Cmd(TIM1,ENABLE);/* TIM1 Main Output Enable 使能TIM1外设的主输出*/TIM_CtrlPWMOutputs(TIM1,ENABLE);}//设置捕获寄存器1void SetT1Pwm1(u16 pulse){TIM1->CCR1=pulse;}/*操作寄存器改变占空时间*//*****************************************************************************************************************TIM1的定时器通道时间1到4 分别为PB8 PA9 PA10 PA11 而互补输出分别为PB13 PB14PB15中止PB12 。

STM32定时器触发AD采样DMA传输问题

STM32定时器触发AD采样DMA传输问题

STM32定时器触发AD采样+DMA传输问题试验环境:EWARM 4.41A + J-link + 目标板试验内容:TIM1->CC1触发ADC采样,单通道,采样结果使用DMA传输到SRAM中。

问题:下载程序提示SRAM校验错误,拔下J-link一端的USB口再插上,下载OK --->停止程序,再下载,提示错误,再拔下J-link USB口,再下载,OK---> ...如此反复。

仔细看了下Debuglog,发现存放DMA传输到的目标内存数据校验错误(IAR debugger选项中的verify download选上),如下:Verify error at address 0x2000007C, target byte: 0x3F, byte in file: 0x01分析:可能是停止程序的时候,TIM1和ADC,DMA都没有停下来,下载的时候,DMA一直写数据到开辟的内存中,导致那部分内存数据校验错误。

以上只是个人的一些看法,不知道不否正确,有没有哪位帮分析下。

/******************************************************************************/附录1:试验程序源码:/* Includes ------------------------------------------------------------------*/#include "stm32f10x_lib.h"/* Private typedef -----------------------------------------------------------*//* Private define ------------------------------------------------------------*/#define ADC1_DR_Address ((u32)0x4001244C)/* Private macro -------------------------------------------------------------*//* Private variables ---------------------------------------------------------*/ADC_InitTypeDef ADC_InitStructure;DMA_InitTypeDef DMA_InitStructure;TIM1_TimeBaseInitTypeDef TIM1_TimeBaseStructure;TIM1_OCInitTypeDef TIM1_OCInitStructure;TIM1_BDTRInitTypeDef TIM1_BDTRInitStructure;u16 ADC_RegularConvertedValueTab[32];ErrorStatus HSEStartUpStatus;/* Private function prototypes -----------------------------------------------*/void RCC_Configuration(void);void GPIO_Configuration(void);void NVIC_Configuration(void);/* Private functions ---------------------------------------------------------*//******************************************************************************** Function Name : main* Description : Main program* Input : None* Output : None* Return : None*******************************************************************************/int main(void){#ifdef DEBUGdebug();#endif/* System clocks configuration ---------------------------------------------*/RCC_Configuration();/* NVIC configuration ------------------------------------------------------*/NVIC_Configuration();/* GPIO configuration ------------------------------------------------------*/GPIO_Configuration();TIM1_DeInit();/* Time Base configuration */TIM1_TimeBaseStructure.TIM1_Prescaler = 0x00;TIM1_TimeBaseStructure.TIM1_CounterMode = TIM1_CounterMode_Up;TIM1_TimeBaseStructure.TIM1_Period = 3599;TIM1_TimeBaseStructure.TIM1_ClockDivision = 0x00;TIM1_TimeBaseStructure.TIM1_RepetitionCounter = 0x00;TIM1_TimeBaseInit(&TIM1_TimeBaseStructure);/* Channel1 Configuration in PWM mode */TIM1_OCInitStructure.TIM1_OCMode = TIM1_OCMode_PWM1;TIM1_OCInitStructure.TIM1_OutputState = TIM1_OutputState_Enable;TIM1_OCInitStructure.TIM1_OutputNState = TIM1_OutputNState_Enable;TIM1_OCInitStructure.TIM1_Pulse = 100;TIM1_OCInitStructure.TIM1_OCPolarity = TIM1_OCPolarity_Low;TIM1_OCInitStructure.TIM1_OCNPolarity = TIM1_OCNPolarity_High;TIM1_OCInitStructure.TIM1_OCIdleState = TIM1_OCIdleState_Set;TIM1_OCInitStructure.TIM1_OCNIdleState = TIM1_OCIdleState_Reset;TIM1_OC1Init(&TIM1_OCInitStructure);/* TIM1 main Output Enable */TIM1_CtrlPWMOutputs(ENABLE);/* TIM1 counter enable */TIM1_Cmd(ENABLE);/* DMA Channel1 Configuration ----------------------------------------------*/DMA_DeInit(DMA_Channel1);DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_RegularConvertedValueTab; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;DMA_InitStructure.DMA_BufferSize = 32;DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;DMA_Init(DMA_Channel1, &DMA_InitStructure);/* Enable DMA channel1 */DMA_Cmd(DMA_Channel1, ENABLE);/* ADC1 configuration ------------------------------------------------------*/ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;ADC_InitStructure.ADC_ScanConvMode = DISABLE;ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;ADC_InitStructure.ADC_NbrOfChannel = 1;ADC_Init(ADC1, &ADC_InitStructure);/* ADC1 regular channel14 configuration */ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_13Cycles5); /* Enable ADC1 DMA */ADC_DMACmd(ADC1, ENABLE);/* Enable ADC1 external trigger */ADC_ExternalTrigConvCmd(ADC1, ENABLE);/* Enable ADC1 */ADC_Cmd(ADC1, ENABLE);/* TIM1 counter enable *///TIM1_Cmd(ENABLE);/* Test on channel1 transfer complete flag */while(!DMA_GetFlagStatus(DMA_FLAG_TC1));/* Clear channel1 transfer complete flag */DMA_ClearFlag(DMA_FLAG_TC1);/* TIM1 counter disable *///TIM1_Cmd(DISABLE);while (1){}}/******************************************************************************** Function Name : RCC_Configuration* Description : Configures the different system clocks.* Input : None* Output : None* Return : None*******************************************************************************/void RCC_Configuration(void){/* RCC system reset(for debug purpose) */RCC_DeInit();/* Enable HSE */RCC_HSEConfig(RCC_HSE_ON);/* Wait till HSE is ready */HSEStartUpStatus = RCC_WaitForHSEStartUp();if(HSEStartUpStatus == SUCCESS){/* Enable Prefetch Buffer */FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);/* Flash 2 wait state */FLASH_SetLatency(FLASH_Latency_2);/* HCLK = SYSCLK */RCC_HCLKConfig(RCC_SYSCLK_Div1);/* PCLK2 = HCLK */RCC_PCLK2Config(RCC_HCLK_Div1);/* PCLK1 = HCLK/2 */RCC_PCLK1Config(RCC_HCLK_Div2);/* ADCCLK = PCLK2/4 */RCC_ADCCLKConfig(RCC_PCLK2_Div4);/* PLLCLK = 8MHz * 7 = 56 MHz */RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_7);/* Enable PLL */RCC_PLLCmd(ENABLE);/* Wait till PLL is ready */while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET){}/* Select PLL as system clock source */RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);/* Wait till PLL is used as system clock source */while(RCC_GetSYSCLKSource() != 0x08){}}/* Enable peripheral clocks --------------------------------------------------*//* Enable DMA clock */RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA, ENABLE);/* Enable GPIOA, GPIOC, ADC1 and TIM1 clock */RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC |RCC_APB2Periph_ADC1 | RCC_APB2Periph_TIM1, ENABLE);}/******************************************************************************** Function Name : GPIO_Configuration* Description : Configures the different GPIO ports.* Input : None* Output : None* Return : None*******************************************************************************/void GPIO_Configuration(void){GPIO_InitTypeDef GPIO_InitStructure;/* Configure PC.01 and PC.04 (ADC Channel11 and Channel14) as analog input */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;GPIO_Init(GPIOC, &GPIO_InitStructure);}/******************************************************************************** Function Name : NVIC_Configuration* Description : Configures NVIC and Vector Table base location.* Input : None* Output : None* Return : None*******************************************************************************/void NVIC_Configuration(void){#ifdef VECT_TAB_RAM/* Set the Vector Table base location at 0x20000000 */NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);#else /* VECT_TAB_FLASH *//* Set the Vector Table base location at 0x08000000 */NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);#endif}/******************************************************************************/附录2:Debug LogThu Jan 03 20:00:46 2008: DLL version: V3.62a, compiled Feb 23 2007 17:06:09Thu Jan 03 20:00:46 2008: Firmware: J-Link compiled Jun 14 2007 14:36:33 ARM Rev.5 Thu Jan 03 20:00:46 2008: JTAG speed is initially set to: 32 kHzThu Jan 03 20:00:46 2008: Found Cortex-M3, Little endian.Thu Jan 03 20:00:46 2008: TPIU fitted.Thu Jan 03 20:00:46 2008: FPUnit: 6 code (BP) slots and 2 literal slotsThu Jan 03 20:00:46 2008: Software reset was performedThu Jan 03 20:00:46 2008: Initial reset was performedThu Jan 03 20:00:46 2008: J-Link found 2 JTAG devices. ARM core Id: 3BA00477(Cortex M3), ARM core Id: 00000000(ARM9)Thu Jan 03 20:00:46 2008: Device at TAP0 selectedThu Jan 03 20:00:47 2008: 3080 bytes downloaded and verified (5.20 Kbytes/sec)Thu Jan 03 20:00:47 2008: Warning:Verify error at address 0x2000007C, target byte: 0x42, byte in file: 0x01Thu Jan 03 20:00:47 2008: Warning:Verify error at address 0x2000007D, target byte: 0x08, byte in file: 0x80Thu Jan 03 20:00:47 2008: Warning:Verify error at address 0x2000007E, target byte: 0xCE, byte in file: 0x70Thu Jan 03 20:00:47 2008: Warning:Verify error at address 0x2000007F, target byte: 0x07, byte in file: 0x47Thu Jan 03 20:00:47 2008: Warning:Verify error at address 0x20000080, target byte: 0x42, byte in file: 0x50Thu Jan 03 20:00:47 2008: Warning:Verify error at address 0x20000081, target byte: 0x08, byte in file: 0xF0Thu Jan 03 20:00:47 2008: Warning:Verify error at address 0x20000082, target byte: 0xCF, byte in file: 0x00Thu Jan 03 20:00:47 2008: Warning:Verify error at address 0x20000083, target byte: 0x07, byte in file: 0x60Thu Jan 03 20:00:47 2008: Warning:Verify error at address 0x20000084, target byte: 0x43, byte in file: 0x81Thu Jan 03 20:00:47 2008: Warning:Verify error at address 0x20000085, target byte: 0x08, byte in file: 0x05Thu Jan 03 20:00:47 2008: Warning:Verify error at address 0x20000086, target byte: 0xCE, byte in file: 0x02Thu Jan 03 20:00:47 2008: Warning:Verify error at address 0x20000087, target byte: 0x07, byte in file: 0xD0Thu Jan 03 20:00:47 2008: Warning:Verify error at address 0x20000088, target byte: 0x42, byte in file: 0x5FThu Jan 03 20:00:47 2008: Warning:Verify error at address 0x20000089, target byte: 0x08, byte in file: 0xF0Thu Jan 03 20:00:47 2008: Warning:Verify error at address 0x2000008A, target byte: 0xCE, byte in file: 0xFFThu Jan 03 20:00:47 2008: Warning:Verify error at address 0x2000008B, target byte: 0x07, byte in file: 0x30Thu Jan 03 20:00:47 2008: Warning:Verify error at address 0x2000008C, target byte: 0x42, byte in file: 0x70Thu Jan 03 20:00:47 2008: Warning:Verify error at address 0x2000008D, target byte: 0x08, byte in file: 0x47Thu Jan 03 20:00:47 2008: Warning:Verify error at address 0x2000008E, target byte: 0xCF, byte in file: 0x2EVerify error at address 0x2000008F, target byte: 0x07, byte in file: 0x49 Thu Jan 03 20:00:47 2008: Warning:Verify error at address 0x20000090, target byte: 0x41, byte in file: 0x0A Thu Jan 03 20:00:47 2008: Warning:Verify error at address 0x20000091, target byte: 0x08, byte in file: 0x68 Thu Jan 03 20:00:47 2008: Warning:Verify error at address 0x20000092, target byte: 0xCE, byte in file: 0xD2 Thu Jan 03 20:00:47 2008: Warning:Verify error at address 0x20000094, target byte: 0x41, byte in file: 0xFB Thu Jan 03 20:00:47 2008: Warning:Verify error at address 0x20000095, target byte: 0x08, byte in file: 0xD4 Thu Jan 03 20:00:47 2008: Warning:Verify error at address 0x20000096, target byte: 0xCB, byte in file: 0x2D Thu Jan 03 20:00:47 2008: Warning:Verify error at address 0x20000097, target byte: 0x07, byte in file: 0x4A Thu Jan 03 20:00:47 2008: Warning:Verify error at address 0x20000098, target byte: 0x42, byte in file: 0x13 Thu Jan 03 20:00:47 2008: Warning:Verify error at address 0x20000099, target byte: 0x08, byte in file: 0x68 Thu Jan 03 20:00:47 2008: Warning:Verify error at address 0x2000009A, target byte: 0xCD, byte in file: 0x53 Thu Jan 03 20:00:47 2008: Warning:Verify error at address 0x2000009B, target byte: 0x07, byte in file: 0xF0 Thu Jan 03 20:00:47 2008: Warning:Verify error at address 0x2000005C, target byte: 0x40, byte in file: 0x15 Thu Jan 03 20:00:47 2008: Warning:Verify error at address 0x2000005D, target byte: 0x08, byte in file: 0x00 Thu Jan 03 20:00:47 2008: Warning:Verify error at address 0x2000005E, target byte: 0xC8, byte in file: 0x00 Thu Jan 03 20:00:47 2008: Warning:Verify error at address 0x2000005F, target byte: 0x07, byte in file: 0x20 Thu Jan 03 20:00:47 2008: Warning:Verify error at address 0x20000060, target byte: 0x3E, byte in file: 0x03 Thu Jan 03 20:00:47 2008: Warning:Verify error at address 0x20000061, target byte: 0x08, byte in file: 0x4C Thu Jan 03 20:00:47 2008: Warning:Verify error at address 0x20000062, target byte: 0xD3, byte in file: 0x4F Thu Jan 03 20:00:47 2008: Warning:Verify error at address 0x20000063, target byte: 0x07, byte in file: 0xF0 Thu Jan 03 20:00:47 2008: Warning:Verify error at address 0x20000064, target byte: 0x49, byte in file: 0x00 Thu Jan 03 20:00:47 2008: Warning:Verify error at address 0x20000065, target byte: 0x08, byte in file: 0x00Verify error at address 0x20000066, target byte: 0xD2, byte in file: 0xA0Thu Jan 03 20:00:47 2008: Warning:Verify error at address 0x20000067, target byte: 0x07, byte in file: 0x47Thu Jan 03 20:00:47 2008: Warning:Verify error at address 0x20000068, target byte: 0x45, byte in file: 0x02Thu Jan 03 20:00:47 2008: Warning:Verify error at address 0x20000069, target byte: 0x08, byte in file: 0x4CThu Jan 03 20:00:47 2008: Warning:Verify error at address 0x2000006A, target byte: 0xD1, byte in file: 0x03Thu Jan 03 20:00:47 2008: Warning:Verify error at address 0x2000006B, target byte: 0x07, byte in file: 0x4DThu Jan 03 20:00:47 2008: Warning:Verify error at address 0x2000006C, target byte: 0x42, byte in file: 0xAEThu Jan 03 20:00:47 2008: Warning:Verify error at address 0x2000006D, target byte: 0x08, byte in file: 0x46Thu Jan 03 20:00:47 2008: Warning:Verify error at address 0x2000006E, target byte: 0xCE, byte in file: 0x20Thu Jan 03 20:00:47 2008: Warning:Verify error at address 0x2000006F, target byte: 0x07, byte in file: 0x47Thu Jan 03 20:00:47 2008: Warning:Verify error at address 0x20000070, target byte: 0x41, byte in file: 0xC1Thu Jan 03 20:00:47 2008: Warning:Verify error at address 0x20000071, target byte: 0x08, byte in file: 0x05Thu Jan 03 20:00:47 2008: Warning:Verify error at address 0x20000072, target byte: 0xCA, byte in file: 0x00Thu Jan 03 20:00:47 2008: Warning:Verify error at address 0x20000073, target byte: 0x07, byte in file: 0x20Thu Jan 03 20:00:47 2008: Warning:Verify error at address 0x20000074, target byte: 0x40, byte in file: 0xC9Thu Jan 03 20:00:47 2008: Warning:Verify error at address 0x20000075, target byte: 0x08, byte in file: 0x06Thu Jan 03 20:00:47 2008: Warning:Verify error at address 0x20000076, target byte: 0xC9, byte in file: 0x00Thu Jan 03 20:00:47 2008: Warning:Verify error at address 0x20000077, target byte: 0x07, byte in file: 0x20Thu Jan 03 20:00:47 2008: Warning:Verify error at address 0x20000078, target byte: 0x3B, byte in file: 0x9DThu Jan 03 20:00:47 2008: Warning:Verify error at address 0x2000007A, target byte: 0xD1, byte in file: 0x00Thu Jan 03 20:00:47 2008: Warning:Verify error at address 0x2000007B, target byte: 0x07, byte in file: 0x20Thu Jan 03 20:00:47 2008: There were warnings during download of FLASH loader, see Log WindowThu Jan 03 20:00:48 2008: Failed to load flash loader: C:\Program Files\IAR Systems\Embedded Workbench 4.0 Evaluation\ARM\config\flashloader\ST\FlashSTM32F10x.d79出处:jessemok。

STM32F单纯的TIM2定时器溢出中断试验程序

STM32F单纯的TIM2定时器溢出中断试验程序

STM32‎F定时器的‎功能非常丰‎富,像我这‎样单纯的T‎I M2定时‎器溢出中断‎人恐怕不多‎了,所以‎找例子资料‎也找不到费‎了九牛二虎‎之力终于杜‎撰出来了,‎发帖庆祝!‎我这里用了‎S T新版的‎STM3‎2F FW‎L IB2.‎0库,用到‎的函数都添‎加了中文注‎释。

I‎A R编译的‎项目传不上‎来,有要看‎的朋友留下‎E MAIL‎我发邮件给‎你。

/*‎Incl‎u des ‎-----‎-----‎-----‎-----‎-----‎-----‎-----‎-----‎-----‎-----‎-----‎-----‎-----‎-*/#‎i nclu‎d e "s‎t m32f‎10x_l‎i b.h"‎Erro‎r Stat‎u s HS‎E Star‎t UpSt‎a tus;‎void‎RCC_‎C onfi‎g urat‎i on(v‎o id);‎void‎GPIO‎_Conf‎i gura‎t ion(‎v oid)‎;voi‎d NVI‎C_Con‎f igur‎a tion‎(void‎);vo‎i d TI‎M_Con‎f igur‎a tion‎(void‎);vo‎i d de‎l ay(v‎o id);‎/**‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎**** *‎*****‎*** ‎F unct‎i on N‎a me ‎: mai‎n* D‎e scri‎p tion‎ :‎Main‎prog‎r am*‎Inpu‎t‎‎: No‎n e* ‎O utpu‎t‎‎: Non‎e* R‎e turn‎‎ :‎None‎****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*** **‎*****‎/int‎main‎(void‎){‎#ifde‎f DEB‎U G‎d ebug‎();/*‎[初始化外‎围设备指针‎]*/#‎e ndif‎GP‎I O_Co‎n figu‎r atio‎n();/‎/初始化i‎o口‎N VIC_‎C onfi‎g urat‎i on()‎;//初始‎化中断嵌套‎RC‎C_Con‎f igur‎a tion‎(); /‎/初始化时‎钟与复位‎ TIM‎_Conf‎i gura‎t ion(‎);//初‎始化定时器‎wh‎i le(1‎){‎‎ del‎a y();‎}‎}/*‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎****‎Func‎t ion ‎N ame ‎: RC‎C_Con‎f igur‎a tion‎* De‎s crip‎t ion ‎ : ‎C onfi‎g ures‎the ‎d iffe‎r ent ‎s yste‎m clo‎c ks.‎* Inp‎u t ‎‎ : N‎o ne*‎Outp‎u t ‎‎: No‎n e* ‎R etur‎n‎‎: Non‎e***‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎**** *‎*****‎*/vo‎i d RC‎C_Con‎f igur‎a tion‎(void‎){‎/* R‎C C sy‎s tem ‎r eset‎(for ‎d ebug‎purp‎o se)[‎复位RCC‎外围设备寄‎存器到默认‎复位值] ‎*/ ‎R CC_D‎e Init‎();‎ /* ‎E nabl‎e HSE‎[HSE‎振荡器开启‎]*/‎RCC_‎H SECo‎n fig(‎R CC_H‎S E_ON‎);‎/* W‎a it t‎i ll H‎S E is‎read‎y [等待‎H SE启动‎]*/‎HSES‎t artU‎p Stat‎u s = ‎R CC_W‎a itFo‎r HSES‎t artU‎p();‎if‎(HSES‎t artU‎p Stat‎u s ==‎SUCC‎E SS)‎ {‎ /*‎Enab‎l e Pr‎e fetc‎h Buf‎f er [‎预取缓冲区‎允许]*/‎‎F LASH‎_Pref‎e tchB‎u ffer‎C md(F‎L ASH_‎P refe‎t chBu‎f fer_‎E nabl‎e);‎ /‎* Fla‎s h 2 ‎w ait ‎s tate‎[代码2个‎延时周期]‎*/‎ FL‎A SH_S‎e tLat‎e ncy(‎F LASH‎_Late‎n cy_2‎);‎ /*‎HCLK‎= SY‎S CLK ‎[AHB时‎钟等于SY‎S CLK]‎*/‎ RCC‎_HCLK‎C onfi‎g(RCC‎_SYSC‎L K_Di‎v1); ‎‎ /*‎PCLK‎2 = H‎C LK [‎A PB2时‎钟等于HC‎L K]*/‎‎R CC_P‎C LK2C‎o nfig‎(RCC_‎H CLK_‎D iv1)‎;‎ /*‎PCLK‎1 = H‎C LK/2‎[低速A‎P B1时钟‎等于HCL‎K/2]*‎/‎RCC_‎P CLK1‎C onfi‎g(RCC‎_HCLK‎_Div2‎);‎ /*‎PLLC‎L K = ‎8MHz ‎* 9 =‎72 M‎H z [配‎置PLL时‎钟源和乘法‎因子][P‎L L时钟输‎入等于HS‎E时钟][‎P LL乘法‎因子取值9‎]*/‎ RC‎C_PLL‎C onfi‎g(RCC‎_PLLS‎o urce‎_HSE_‎D iv1,‎RCC_‎P LLMu‎l_9);‎‎/* E‎n able‎PLL ‎[允许PL‎L]*/ ‎‎R CC_P‎L LCmd‎(ENAB‎L E);‎‎/* Wa‎i t ti‎l l PL‎L is ‎r eady‎[等待P‎L L时钟就‎绪]*/‎ w‎h ile(‎R CC_G‎e tFla‎g Stat‎u s(RC‎C_FLA‎G_PLL‎R DY) ‎== RE‎S ET)‎ {‎‎}‎ /* ‎S elec‎t PLL‎as s‎y stem‎cloc‎k sou‎r ce [‎选择PLL‎作为系统时‎钟]*/‎ R‎C C_SY‎S CLKC‎o nfig‎(RCC_‎S YSCL‎K Sour‎c e_PL‎L CLK)‎;‎ /* ‎W ait ‎t ill ‎P LL i‎s use‎d as ‎s yste‎m clo‎c k so‎u rce[‎等待PLL‎被作为系统‎时钟] *‎/‎whil‎e(RCC‎_GetS‎Y SCLK‎S ourc‎e() !‎= 0x0‎8)‎ {‎ }‎ }‎ /‎* TIM‎2 clo‎c k en‎a ble ‎[TIM2‎定时器允许‎]*/‎RCC_‎A PB1P‎e riph‎C lock‎C md(R‎C C_AP‎B1Per‎i ph_T‎I M2, ‎E NABL‎E); ‎‎‎‎‎}/‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎* ****‎****‎* Fun‎c tion‎Name‎ : G‎P IO_C‎o nfig‎u rati‎o n* ‎D escr‎i ptio‎n‎: LED‎输出配置‎* Inp‎u t ‎‎ : N‎o ne*‎Outp‎u t ‎‎: No‎n e* ‎R etur‎n‎‎: Non‎e***‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎**** *‎*****‎*/vo‎i d GP‎I O_Co‎n figu‎r atio‎n(voi‎d){‎ GPI‎O_Ini‎t Type‎D ef G‎P IO_I‎n itSt‎r uctu‎r e;‎ /* ‎E nabl‎e GPI‎O C cl‎o ck [‎使能GPI‎O C时钟]‎*/‎R CC_A‎P B2Pe‎r iphC‎l ockC‎m d(RC‎C_APB‎2Peri‎p h_GP‎I OC, ‎E NABL‎E);‎ /* ‎C onfi‎g ure ‎P C.04‎, PC.‎05, P‎C.06 ‎a nd P‎C.07 ‎a s ou‎t put ‎p ush-‎p ull[‎把PC4、‎P C5、P‎C6、PC‎7配置成输‎出模式] ‎*/‎G PIO_‎I nitS‎t ruct‎u re.G‎P IO_P‎i n = ‎GPIO‎_Pin_‎6 | G‎P IO_P‎i n_7 ‎| GPI‎O_Pin‎_4| ‎G PIO_‎P in_5‎;G‎P IO_I‎n itSt‎r uctu‎r e.GP‎I O_Mo‎d e = ‎G PIO_‎M ode_‎O ut_P‎P;‎G PIO_‎I nitS‎t ruct‎u re.G‎P IO_S‎p eed ‎= GPI‎O_Spe‎e d_50‎M Hz;/‎/GPIO‎最高速度5‎0MHz‎ GPI‎O_Ini‎t(GPI‎O C, &‎G PIO_‎I nitS‎t ruct‎u re);‎}/‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎* ****‎****‎* Fun‎c tion‎Name‎ : N‎V IC_C‎o nfig‎u rati‎o n* ‎D escr‎i ptio‎n‎: Con‎f igur‎e s th‎e nes‎t ed v‎e ctor‎e d in‎t erru‎p t co‎n trol‎l er.[‎配置中断向‎量表的起始‎位置]*‎Inpu‎t‎‎: No‎n e* ‎O utpu‎t‎‎: Non‎e* R‎e turn‎‎ :‎None‎****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*** **‎*****‎/voi‎d NVI‎C_Con‎f igur‎a tion‎(void‎){‎NVIC‎_Init‎T ypeD‎e f NV‎I C_In‎i tStr‎u ctur‎e;#‎i fdef‎ VEC‎T_TAB‎_RAM ‎/‎* Set‎the ‎V ecto‎r Tab‎l e ba‎s e lo‎c atio‎n at ‎0x200‎00000‎[设置中‎断向量表的‎起始位置0‎x2000‎0000]‎*/‎NVIC‎_SetV‎e ctor‎T able‎(NVIC‎_Vect‎T ab_R‎A M, 0‎x0); ‎#els‎e /*‎VECT‎_TAB_‎F LASH‎ */‎ /* ‎S et t‎h e Ve‎c tor ‎T able‎base‎loca‎t ion ‎a t 0x‎08000‎000[设‎置中断向量‎表的起始位‎置0x0x‎08000‎000] ‎*/‎NVIC‎_SetV‎e ctor‎T able‎(NVIC‎_Vect‎T ab_F‎L ASH,‎0x0)‎;‎#endi‎f‎/* C‎o nfig‎u re t‎h e NV‎I C Pr‎e empt‎i on P‎r iori‎t y Bi‎t s[配置‎优先级组]‎*/ ‎NV‎I C_Pr‎i orit‎y Grou‎p Conf‎i g(NV‎I C_Pr‎i orit‎y Grou‎p_0);‎‎/* E‎n able‎the ‎T IM2 ‎g loab‎a l In‎t erru‎p t [允‎许TIM2‎全局中断]‎*/‎N VIC_‎I nitS‎t ruct‎u re.N‎V IC_I‎R QCha‎n nel ‎= TIM‎2_IRQ‎C hann‎e l;‎NVIC‎_Init‎S truc‎t ure.‎N VIC_‎I RQCh‎a nnel‎P reem‎p tion‎P rior‎i ty =‎0;‎NVIC‎_Init‎S truc‎t ure.‎N VIC_‎I RQCh‎a nnel‎S ubPr‎i orit‎y = 0‎;‎NVIC‎_Init‎S truc‎t ure.‎N VIC_‎I RQCh‎a nnel‎C md =‎ENAB‎L E;‎NVIC‎_Init‎(&NVI‎C_Ini‎t Stru‎c ture‎);}‎/***‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*** **‎*****‎** F‎u ncti‎o n Na‎m e :‎TIM2‎_Conf‎i gura‎t ion‎* Des‎c ript‎i on ‎ :‎* Inp‎u t ‎‎ : N‎o ne*‎Outp‎u t ‎‎: No‎n e* ‎R etur‎n‎‎: Non‎e***‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎**** *‎*****‎*/vo‎i d TI‎M_Con‎f igur‎a tion‎(void‎){‎ TIM‎_Time‎B aseI‎n itTy‎p eDef‎ TIM‎_Time‎B aseS‎t ruct‎u re;‎// T‎I M_OC‎I nitT‎y peDe‎f TI‎M_OCI‎n itSt‎r uctu‎r e ;‎ TIM‎_DeIn‎i t( T‎I M2);‎//复位T‎I M2定时‎器‎/* TI‎M2 co‎n figu‎r atio‎n */‎ TIM‎_Time‎B aseS‎t ruct‎u re.T‎I M_Pe‎r iod ‎= 0xf‎f ff; ‎//最大计‎数值0xf‎f ff ‎‎ TIM‎_Time‎B aseS‎t ruct‎u re.T‎I M_Pr‎e scal‎e r = ‎0x36;‎//分频0‎x36 ‎‎TI‎M_Tim‎e Base‎S truc‎t ure.‎T IM_C‎l ockD‎i visi‎o n = ‎0x0; ‎// 时钟‎分割‎ TIM‎_Time‎B aseS‎t ruct‎u re.T‎I M_Co‎u nter‎M ode ‎= TIM‎_Coun‎t erMo‎d e_Up‎; //‎计数方向向‎上计数‎TIM_‎T imeB‎a seIn‎i t(TI‎M2, &‎T IM_T‎i meBa‎s eStr‎u ctur‎e);‎/* C‎l ear ‎T IM2 ‎u pdat‎e pen‎d ing ‎f lag[‎清除TIM‎2溢出中断‎标志] *‎/T‎I M_Cl‎e arFl‎a g(TI‎M2, T‎I M_FL‎A G_Up‎d ate)‎;/‎* Ena‎b le T‎I M2 U‎p date‎inte‎r rupt‎[TIM‎2溢出中断‎允许]*/‎TI‎M_ITC‎o nfig‎(TIM2‎, TIM‎_IT_U‎p date‎, ENA‎B LE);‎‎/* T‎I M2 e‎n able‎coun‎t er [‎允许tim‎2计数]*‎/T‎I M_Cm‎d(TIM‎2, EN‎A BLE)‎;}‎/***‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*** **‎*****‎** F‎u ncti‎o n Na‎m e :‎dela‎y* D‎e scri‎p tion‎ :‎延时*‎Inpu‎t‎‎: No‎n e* ‎O utpu‎t‎‎: Non‎e* R‎e turn‎‎ :‎None‎****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*** **‎*****‎/voi‎d del‎a y(vo‎i d){‎u3‎2 i,j‎;f‎o r (i‎=0; i‎<0x0f‎f fff;‎i++)‎{‎‎j ++‎;}‎}#i‎f def ‎DEBU‎G/**‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎**** *‎*****‎*** ‎F unct‎i on N‎a me ‎: ass‎e rt_f‎a iled‎[断言失败‎]* D‎e scri‎p tion‎ :‎Repo‎r ts t‎h e na‎m e of‎the ‎s ourc‎e fil‎e and‎the ‎s ourc‎e lin‎e num‎b er*‎‎‎‎ wh‎e re t‎h e as‎s ert ‎e rror‎has ‎o ccur‎r ed.‎* Inp‎u t ‎‎ : -‎file‎: poi‎n ter ‎t o th‎e sou‎r ce f‎i le n‎a me*‎‎‎‎ - ‎l ine:‎asse‎r t er‎r or l‎i ne s‎o urce‎numb‎e r* ‎O utpu‎t‎‎: Non‎e* R‎e turn‎‎ :‎None‎****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*****‎*** **‎*****‎/voi‎d ass‎e rt_f‎a iled‎(u8* ‎f ile,‎u32 ‎l ine)‎{‎/* Us‎e r ca‎n add‎his ‎o wn i‎m plem‎e ntat‎i on t‎o rep‎o rt t‎h e fi‎l e na‎m e an‎d lin‎e num‎b er,‎‎e x: p‎r intf‎("Wro‎n g pa‎r amet‎e rs v‎a lue:‎file‎%s o‎n lin‎e %d\‎r\n",‎file‎, lin‎e) */‎/*‎Infi‎n ite ‎l oop ‎*/‎w hile‎(1)‎ {‎ }}‎#end‎i f/*‎*****‎*****‎*****‎*** (‎C) CO‎P YRIG‎H T 20‎07 ST‎M icro‎e lect‎r onic‎s ***‎**END‎OF F‎I LE**‎**/‎‎。

基于stm32计时器课设代码

基于stm32计时器课设代码

基于stm32计时器课设代码针对基于 STM32 的计时器课程设计,可以提供以下参考代码: 1. 使用 LCD1602 显示屏制作倒计时程序的代码示例:```c#include "stm32f4xx.h"#include "llcd.h"LCD_SetFont(&hfont16);LCD_SetTextColor(LCD_COLOR_WHITE);LCD_ClearDisplay();void delay_ms(uint32_t ms){uint32_t delay = SystemCoreClock / 1000 / 50; // 每毫秒50Hz 的频率while (ms--){__HAL_RCC_GPIOA_CLK_ENABLE();__HAL_GPIO_PIN_SET(GPIOA, 13);__HAL_RCC_GPIOA_CLK_DISABLE();}}void TIM2_Init(){TIM_MasterConfigTypeDef sMasterConfig = {0};TIM_OC_InitTypeDef sOCInit = {0};__HAL_RCC_TIM2_CLK_ENABLE();__HAL_RCC_TIM2_REFRESH_ENABLE();sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;sMasterConfig.MasterSlaveMode = TIM_MASTER_SLAVE_MODE; sMasterConfig.MasterOutputTrigger2 = TIM_TRGO2_RESET;sMasterConfig.MasterSlaveMode2 = TIM_MASTER_SLAVE_MODE2; HAL_TIM_MasterConfigCallback(&htim2, TIM_ MastersylizMode);sOCInit.OCMode = TIM_OCMODE_PWM1;sOCInit.Pulse = 0;sOCInit.OCPolarity = TIM_OCPOLARITY_HIGH;sOCInit.OCFastMode = TIM_OCFAST_DISABLE;HAL_TIM_PWM_ConfigChannel(&htim2, &sOCInit);HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);}void 海螺定时器中断处理函数 (void){HAL_TIM_PeriodElapsedCallback(htim2,HAL_TIM_PERIODELIGIBLE_中断);}int main(void){HAL_Init();LCD_Init();TIM_Init();HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1); while (1){}}```2. 使用按键按下数码管自动倒计时的代码示例: ```c#include "stm32f4xx.h"#include "lcm.h"#define KEY_WIDTH 12#define KEY_HEIGHT 14#define 数码管引脚编号 GPIOA->IDR#define 按键引脚编号 GPIOA->ODR#define 时钟频率 SystemCoreClockLCD_ClearDisplay();LCD_SetTextColor(LCD_COLOR_WHITE);LCD_SetFont(&hfont16);void delay_ms(uint32_t ms){uint32_t delay = SystemCoreClock / 1000 / 50; // 每毫秒50Hz 的频率while (ms--){__HAL_RCC_GPIOA_CLK_ENABLE();__HAL_GPIO_PIN_SET(GPIOA, 11);__HAL_RCC_GPIOA_CLK_DISABLE();}}void LCD_DrawString(LCD_SCREEN* screen, const char* str, uint32_t x, uint32_t y){uint32_t charsize = 2;uint32_t maxlen = 2;for (uint32_t i = 0; i < strlen(str); i++){uint32_t px = x;uint32_t py = y + charsize * i / maxlen;uint32_t ln = x + charsize * 2 + charsize;uint32_t col = i % 26; screen->Scr[px][py] = 0; if (col < 26){。

STM32HAL库实现US微秒延时函数

STM32HAL库实现US微秒延时函数

STM32HAL库实现US微秒延时函数在STM32HAL库中,可以使用SysTick定时器来实现微秒级的延时函数。

SysTick定时器是一个24位的向下计数器,在每次计数器减为零时会触发一个中断。

可以利用SysTick的时钟源以及计数器的自动加载功能,实现精确的微秒级延时。

首先,需要初始化SysTick定时器,将其时钟源设置为STM32的系统时钟(通常为HCLK),并设置计数器的加载值。

加载值可以由以下公式计算得出:其中,系统时钟频率为STM32的主时钟频率,单位为Hz。

初始化SysTick定时器的代码如下:```cvoid delay_us_init(void)HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);```接下来,可以编写延时函数`delay_us`,输入参数为要延时的微秒数。

首先,将SysTick定时器的计数器清零,然后等待定时器计数器减至零,即表示已经延时完成。

```cvoid delay_us(uint32_t us)uint32_t start = SysTick->VAL;uint32_t load = SysTick->LOAD;//清零计数器SysTick->VAL = 0;//等待计数器减至零while (((start - SysTick->VAL) & SysTick_LOAD_RELOAD_Msk) < ticks);// 复位SysTick定时器状态SysTick->CTRL = 0;SysTick->VAL = 0;```请注意,SysTick的计数器是一个向下计数器,所以计数器值越大表示剩余时间越短。

由于延时函数需要等待计数器减至零,所以将计数器的值与开始时的计数器值进行比较。

以上就是通过SysTick定时器实现微秒级延时函数的方法。

使用该延时函数,可以在STM32HAL库中实现相应的微秒级延时功能。

stm32F4程序运行时间代码

stm32F4程序运行时间代码

stm32F4程序运行时间代码用TIM计数器计算程序运行时间/////STM32F407 程序运行时间测量/////用TIM3_time_start (); 和TIM3_time_over();将带测代码包起/******例如:TIM3_time_start ();/* 被测部分代码 */n = TIM3_time_over();/* 其他代码 *////n=1000 则被测部分运行了1000us**///arr:自动重装值。

//psc:时钟预分频数//定时器溢出时间计算方法:T out=((arr+1)*(psc+1))/Ft us.//Ft=定时器工作频率,单位:Mhz//这里使用的是定时器3!void TIM3_Int_Init(u16 arr,u16 psc){TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE); ///使能TIM3时钟TIM_TimeBaseInitStructure.TIM_Period = arr; //自动重装载值TIM_TimeBaseInitStructure.TIM_Prescaler=psc; //定时器分频TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_Counte rMode_Up; //向上计数模式TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DI V1;TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);//初始化TIM3TIM_Cmd(TIM3,ENABLE); //使能定时器3}u16 run_time_us; //计量程序运行时间void TIM3_time_start (void){TIM3_Int_Init(60*1000,84-1);///时钟频率84M 84分频 => 1 = 1us 最大数值65,536 约60msTIM_ClearFlag(TIM3,TIM_FLAG_Update);}////返回值表示运行时间 65535表明溢出/////u16 TIM3_time_over (void){if(TIM_GetFlagStatus(TIM3,TIM_FLAG_Update) == 1)return 0xFFFF;elsereturn TIM_GetCounter(TIM3); }。

stm32 ptp实例代码

stm32 ptp实例代码

stm32 ptp实例代码STM32的PTP (Precision Time Protocol) 实例代码可能会根据具体的硬件和软件环境有所不同。

以下是一个简单的PTP实例代码,用于STM32微控制器。

注意:此代码仅为示例,可能需要根据您的具体硬件和软件环境进行修改。

```cinclude ""include "stm32f4xx_"void PTP_Init(void){/ PTP 时钟源选择 /PTP_SetClockSource(PTP_CLOCKSOURCE_HSE);/ PTP 配置 /PTP_InitTypeDef PTP_InitStructure;PTP__Prescaler = 1;PTP__Counter = 0;PTP__ClockSource = PTP_CLOCKSOURCE_HSE;PTP__TimeFormat = PTP_TIMEFORMAT_MILLISECOND; PTP_Init(&PTP_InitStructure);}void PTP_Start(void){/ 启动 PTP /PTP_Start();}void PTP_Stop(void){/ 停止 PTP /PTP_Stop();}void PTP_SetTime(uint32_t time){/ 设置 PTP 时间 /PTP_SetTime(time);}uint32_t PTP_GetTime(void){/ 获取 PTP 时间 /return PTP_GetTime();}```此代码包括以下几个部分:- `PTP_Init()` 函数用于初始化 PTP。

在这里,我们选择了 HSE (High Speed External) 作为时钟源,并设置了预分频器、计数器和时间格式。

- `PTP_Start()` 和 `PTP_Stop()` 函数分别用于启动和停止 PTP。

STM32F1通用定时器示例详解--TimeBase

STM32F1通用定时器示例详解--TimeBase

STM32F1通用定时器示例详解--TimeBase前言基于学习的目的,详细讲解关于标准外设库中的定时器的17个示例项目函数文件。

本次介绍TimeBase的示例。

一、示例详解基于硬件平台:STM32F100B-EVAL,MCU的型号是STM32F103VET6。

软件则是其标准外设库。

1、Time Base的寄存器配置软件配置,运行程序可以发现,系统时钟设置为24MHz,定时器使用到的是TIM2 ;根据时钟树的图谱及其程序,该示例选择的是内部时钟源作为定时器的时钟源;AHB 时钟 (HCLK)在RCC_CFGR寄存器中的分频系数HPRE的值为0,即SYSCLK not divided,所以HCLK就是24MHz;APB1的prescaler的系数是PPRE1:0x05,即分频4,APB1CLK为24/4 = 6M ;由于APB1的prescaler系数不为1,所以经过倍频器后就是x2,即为TIMxCLK = 6*2=12Mhz,对于上述框图的倍频器,当APB1的预分频系数为1时,这个倍频器不起作用,定时器的时钟频率等于APB1的频率;当APB1的预分频系数为其它数值(即预分频系数为2、4、8或16)时,这个倍频器起作用,定时器的时钟频率等于APB1的频率两倍。

APB1不但要为TIM2~7提供时钟,而且还要为其它外设提供时钟;设置这个倍频器可以在保证其它外设使用较低时钟频率时,TIM2~7可以工作在更高频率。

二、示例演练该示例在达到计数值时,中断内翻转任意通用GPIO口,通过示波器观测其翻转的周期频率。

这儿有一个小插曲,软件是直接拷贝的库函数,理论上选择合适的单片机型号后,下载即可出波形结果;但是发现程序执行,示波器上出现不了波形,而且,在IAR中,寄存器调试观测窗口,发现TIM2寄存器的值初始化不了,TIM3(程序未涉及)反而出现了几个寄存器的初始化,但是TIM3的初始化值和自己程序中的还是不一样的,另外全局变量的值,尤其SystemClock还有PrescalerValue的值在检测窗口显示的时Error,是否因为TIM2的地址定义是否错了?查看头文件的定义以及Flash的Memory map,是对的。

STM32定时器

STM32定时器

一、定时器(TIMx)1.关联函数:A.TIM_OC1Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct) :TIMx通道1配置函数。

B.TIM_OC2Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct) :TIMx通道2配置函数。

C.TIM_OC3Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct):TIMx通道3配置函数。

D.TIM_OC4Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct):TIMx通道4配置函数。

E.TIM_ICInit(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct):TIMx捕获输入配置函数F.TI1_Config(TIM_TypeDef* TIMx, uint16_t TIM_ICPolarity, uint16_t TIM_ICSelection,uint16_t TIM_ICFilter):TI1配置函数G.TI2_Config(TIM_TypeDef* TIMx, uint16_t TIM_ICPolarity, uint16_t TIM_ICSelection,uint16_t TIM_ICFilter):TI2配置函数H.TI3_Config(TIM_TypeDef* TIMx, uint16_t TIM_ICPolarity, uint16_t TIM_ICSelection,uint16_t TIM_ICFilter):TI3配置函数I.TI4_Config(TIM_TypeDef* TIMx, uint16_t TIM_ICPolarity, uint16_t TIM_ICSelection,uint16_t TIM_ICFilter):TI4配置函数J.TIM_SetICxPrescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC):配置TIMx输入捕获x的预分频器函数K.TIM_PWMIConfig(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct):TIMx的PWM输入模式配置函数L.TIM_BDTRConfig(TIM_TypeDef* TIMx, TIM_BDTRInitTypeDef *TIM_BDTRInitStruct)配置刹车, 死区时间, 锁定级别, OSSI,OSSR 状态和自动输出函数. M.TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState)typedef enum {DISABLE = 0, ENABLE = !DISABLE} FunctionalState; TIMx功能的开关状态N.TIM_CtrlPWMOutputs(TIM_TypeDef* TIMx, FunctionalState NewState)typedef enum {DISABLE = 0, ENABLE = !DISABLE} FunctionalState; TIMx的PWM功能的开关状态O.TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState)TIMx中断和DMA开启与关断函数P.TIM_GenerateEvent(TIM_TypeDef* TIMx, uint16_t TIM_EventSource)事件产生配置函数Q.TIM_DMAConfig(TIM_TypeDef* TIMx, uint16_t TIM_DMABase, uint16_tTIM_DMABurstLength)TIMx的DMA基本配置函数R.TIM_DMACmd(TIM_TypeDef* TIMx, uint16_t TIM_DMASource, FunctionalState NewState)TIMx的DMA发送函数【说明:】函数体中,tmpccmrx 、tmpccer 、tmpcr2 为中间变量,先读取当前寄存器的配置数据,再使用&=配置相关位的数值以便保留当前配置数据。

关于STM32通用定时器更新事件中断

关于STM32通用定时器更新事件中断

关于STM32通用定时器更新事件中断
//定时器3 中断服务程序void TIM3_IRQHandler(void){ if(TIM3- >SR&0X0001) //产生更新事件{LED1=!LED1;LED0=!LED0;}TIM3- >SR&=~(1SMCR&=0xfffffff8;//从模式控制寄存器设置预分频时钟由内部时钟提
供RCC->APB1ENR|=1ARR=arr;//设定计数器自动重装值TIM3->PSC=psc;//预分频器7200,得到10Khz 的计数时钟,//CK_CNT=Fck_psc/([15:0]+1)TIM3-
>CR1|=1CR1|=1CR1&=0xfffffffd;//设置UDIS 允许更新事件(UEV)TIM3-
>CR1&=0xfffffffb;//设置更新请求源TIM3->CR1|=0x01;//使能计数器TIM3-
>DIER|=1EGR|=0x0001;}}
这样设置以后,个人做了测试,可以在计数器在计数到2000 时,设置了
TIM3->EGR|=0x0001;更新事件发生,并产生了更新事件中断,同时,对计数器重新初始化
tips:感谢大家的阅读,本文由我司收集整编。

仅供参阅!。

STM32f407系统定时器时钟配置计算

STM32f407系统定时器时钟配置计算

STM32f407系统定时器时钟配置计算首先,我们需要配置系统定时器的时钟源。

STM32F407的系统定时器可以使用内部时钟源(HCLK/8)或外部时钟源。

通过软件配置,我们可以选择其中一种时钟源。

1.配置内部时钟源:要使用内部时钟源,可以通过RCC寄存器来配置。

具体需要做以下几步:a. 使能系统定时器时钟:在 RCC_APBxENR 寄存器中设置位SysTickEN=1,其中 x 为适当的 APBx 总线索引。

b.配置系统定时器时钟源:在STK_CTRL寄存器中设置位CLKSOURCE=12.配置外部时钟源:如果要使用外部时钟源作为系统定时器的时钟源,我们需要将外部时钟源与系统的时钟树相连。

具体的配置方法因时钟源的不同而不同,可参考具体芯片的参考手册。

配置了系统定时器的时钟源后,我们可以计算定时器中断的时间间隔。

系统定时器中断的时间间隔=(计数器周期)*(重载值+1)/(时钟频率)其中,计数器周期为24位,取值范围为0~2^24-1、时钟频率为系统定时器的时钟源频率。

重载值是计数器的初始值,当计数器减到0时,会触发定时中断。

举个例子,假设系统定时器的时钟源频率为8MHz,我们希望计算系统定时器中断每100ms触发一次的重载值。

中断触发周期 = 100ms = 0.1s时钟频率=8MHz=8*10^6Hz由于重载值需要为整数,我们可以将计算结果四舍五入为最接近的整数,即重载值为477以上就是STM32F407系统定时器时钟配置和计算方法的简要介绍。

配置完系统定时器的时钟源,并计算出需要的重载值后,我们可以通过编程设置相关寄存器,来开始使用系统定时器进行定时中断的任务。

stm32输出pwm占空比代码

stm32输出pwm占空比代码

stm32输出pwm占空比代码在使用STM32进行PWM输出时,需要先对定时器进行配置和初始化,然后设置PWM的占空比,最后开启PWM输出。

以下是一个简单的示例代码:1. 定时器配置和初始化:```TIM_HandleTypeDef htim;TIM_OC_InitTypeDef sConfigOC;htim.Instance = TIM1;htim.Init.Prescaler = 0;htim.Init.CounterMode = TIM_COUNTERMODE_UP;htim.Init.Period = 1000;htim.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;if (HAL_TIM_Base_Init(&htim) != HAL_OK){Error_Handler();}if (HAL_TIM_PWM_Init(&htim) != HAL_OK){Error_Handler();}sConfigOC.OCMode = TIM_OCMODE_PWM1;sConfigOC.Pulse = 0;sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;if (HAL_TIM_PWM_ConfigChannel(&htim, &sConfigOC, TIM_CHANNEL_1) != HAL_OK){Error_Handler();}```这里使用了TIM1作为定时器,设置周期为1000(即1ms)。

2. 设置PWM占空比:```HAL_TIM_PWM_Start(&htim, TIM_CHANNEL_1);HAL_TIM_PWM_Stop(&htim, TIM_CHANNEL_1);sConfigOC.Pulse = 500; // 设置占空比为50%HAL_TIM_PWM_ConfigChannel(&htim, &sConfigOC,TIM_CHANNEL_1);HAL_TIM_PWM_Start(&htim, TIM_CHANNEL_1);```这里将占空比设置为50%,即脉冲宽度为500,使用函数HAL_TIM_PWM_ConfigChannel设置。

STM32F103中断和定时器程序

STM32F103中断和定时器程序

STM32中断程序/*======================================================================================== *名称: main.c*功能:*入口参数:*说明:去掉stm32f10x_conf.h里#include "stm32f10x_tim.h" 注释*范例:*编者时间: Ye.FuYao 2012-9-23*========================================================================================*/ #include "stm32f10x.h"#include "12864.h"ErrorStatus HSEStartUpStatus; //等待时钟的稳定u8 count=0;u8 d;void SYS_Configuration(void);/*//ms延时函数void delayms(unsigned int nValue) //delay 1ms at 8M{unsigned int nCount;unsigned int ii;unsigned int jj;nCount = 1980;for(ii = nValue;ii > 0;ii--){for(jj = nCount;jj > 0;jj--)Delay(1);}}*///GPIO管脚初始化配置void GPIO_Configuration(void){GPIO_InitTypeDef GPIO_InitStructure; //GPIO状态恢复默认参数/*GPIO口配置每四行一组,每组GPIO属性相同,默认情况:ALL,2MHZ,FLATING*//*PA-2-3配置为输出*/GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_7; //管脚位置定义GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //设置输出模式GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //输出速度为50MHZGPIO_Init(GPIOA, &GPIO_InitStructure); //A组GPIO初始化/*PB-2配置为输出*/GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //管脚位置定义GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //设置输出模式GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //输出速度为50MHZGPIO_Init(GPIOB, &GPIO_InitStructure); //B组GPIO初始化/*PA-0配置为输入--------------------------------------------------------外部中断引脚*/GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOA, &GPIO_InitStructure);}/*======================================================================================== *名称: NVIC_Configuration();*功能:外部中断嵌套控制*入口参数:*说明:放入主函数里初始化*范例:*编者时间: Ye.FuYao 2012-9-23*========================================================================================*/ void NVIC_Configuration(void) //嵌套中断向量控制配置{NVIC_InitTypeDef NVIC_InitStructure; //定义数据结构的变量// 选择优先组NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); //0组,全副优先级NVIC_InitStructure.NVIC_IRQChannel=EXTI0_IRQn; //选择中断通道,库P166页,NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0; //抢占优先级0NVIC_InitStructure.NVIC_IRQChannelSubPriority=0; //响应优先级0NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; //启动此通道的中断NVIC_Init(&NVIC_InitStructure); //结构体初始化}/*========================================================================================*名称: EXTI_Configuration();*功能:外部设备中断初始化*入口参数:*说明:放入主函数里初始化*范例:*编者时间: Ye.FuYao 2012-9-23*========================================================================================*/void EXTI_Configuration(void) //中断初始化 (外部设备中断){EXTI_InitTypeDef EXTI_InitStructure; //定义数据结构的变量GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0); //管脚选择// GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource4);EXTI_InitStructure.EXTI_Line=EXTI_Line0; //将以上入口放在EXTI_Line0这条线上(stm32有18条这样的线路)EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt; //中断模式EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling; //选择上升或下降沿触发EXTI_InitStructure.EXTI_LineCmd=ENABLE; //开中断EXTI_Init(&EXTI_InitStructure); //将结构体初始化}/*========================================================================================*名称: Timer_Config();*功能:定时器中断初始化*入口参数:*说明:放入主函数里初始化*范例:*编者时间: Ye.FuYao 2012-9-23*========================================================================================*/void Timer_Config(void){TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; //定义TIM结构体变量RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE); //使能TIM2外设TIM_DeInit(TIM2); //复位时钟TIM2,恢复到初始状态TIM_TimeBaseStructure.TIM_Period=17999; //35999和1999刚好1sTIM_TimeBaseStructure.TIM_Prescaler=1999;TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; //TIM2时钟分频TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //计数方式// 定时时间T计算公式:// T=(TIM_Period+1)*(TIM_Prescaler+1)/TIMxCLK=(35999+1)*(1999+1)/72MHz=1sTIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure); //初始化TIM_ClearFlag(TIM2,TIM_FLAG_Update); //清除标志// 中断方式下,使能中断源TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE); //使能中断源TIM_Cmd(TIM2,ENABLE); //使能TIM2}/*======================================================================================== *名称: NVIC_Config();*功能:定时器嵌套控制*入口参数:*说明:放入主函数里初始化*范例:*编者时间: Ye.FuYao 2012-9-23*========================================================================================*/ void NVIC_Config(void) //定时器嵌套向量控制器{NVIC_InitTypeDef NVIC_InitStructure; //定义结构体变量// 设置优先分级组NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); //0组,全副优先级NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQn; //选择中断通道,库P166页,// 选择中断通道。

STM32库开发实战指南-M4:32- TIM—高级定时器

STM32库开发实战指南-M4:32- TIM—高级定时器

2{3if(TIM_GetITStatus(BASIC_TIM,TIM_IT_Update)!=RESET){4LED1_TOGGLE;5TIM_ClearITPendingBit(BASIC_TIM,TIM_IT_Update);6}7}我们在TIM_Mode_Config函数启动了定时器更新中断,在发生中断时,中断服务函数就得到运行。

在服务函数内我们先调用定时器中断标志读取函数TIM_GetITStatus获取当前定时器中断位状态,确定产生中断后才运行RGB彩灯翻转动作,并使用定时器标志位清除函数TIM_ClearITPendingBit清除中断标志位。

主函数代码清单31-6主函数1int main(void)2{34LED_GPIO_Config();56/*初始化基本定时器定时,1s产生一次中断*/7TIMx_Configuration();89while(1){10}11}实验用到RGB彩灯,需要对其初始化配置。

LED_GPIO_Config函数是定义在bsp_led.c文件的完成RGB彩灯GPIO初始化配置的程序。

TIMx_Configuration函数是定义在bsp_basic_tim.c文件的一个函数,它只是简单的先后调用TIMx_NVIC_Configuration和TIM_Mode_Config两个函数完成NVIC配置和基本定时器模式配置。

31.5.3下载验证保证开发板相关硬件连接正确,把编译好的程序下载到开发板。

开始RGB彩灯是暗的,等一会RGB彩灯变为红色,再等一会又暗了,如此反复。

如果我们使用表钟与RGB彩灯闪烁对比,可以发现它是每0.5s改变一次RGB彩灯状态的。

31.6每课一问1.计算基本定时器一次最长定时时间,如果需要使用基本定时器产生100s周期事件有什么办法实现?2.修改实验程序,在保使其每0.5s翻转一次LED1的同时在每10s翻转LED2。

第32章TIM—高级定时器本章参考资料:《STM32F4xx参考手册》、《STM32F4xx规格书》、库帮助文档《stm32f4xx_dsp_stdperiph_lib_um.chm》。

stm32定时器延时时间

stm32定时器延时时间
while(SysTick_Delay != 0); //判断延时时间是否到
SYSTICK_CSR |= 0x06; //时间到关闭 SysTick使能用的时候在打开
}
int main(void)
{
SystemInit(); //注意这么是把系统时钟设初始化为 72M主频,这里是必须的
unsigned long SysTick_Delay;//全局变量
//配置寄存器
void SysTick_InitStructReadCmd(void)
{
SYSTICK_VAL = 0; //当前值寄存器清零
SYSTICK_LOAD = SystemCoreClock / 1000000; //重要部分就在这里 系统72000000 / 100000
#elif defined SYSCLK_FREQ_36MHz
uint32_t SystemCoreClock = SYSCLK_FREQ_36MHz;
#elif defined SYSCLK_FREQ_48MHz
uint32_z;
这个程序折磨我1个星期,没有吃好睡好,搞明白后我就马上做上笔记那给大家分享。
*/
//讲得简单易懂,当然精确定时还是要定时器的
uint32_t SystemCoreClock = SYSCLK_FREQ_72MHz;
#else /*!< HSI Selected as System Clock source */
// uint32_t SystemCoreClock = HSI_VALUE;
/* 好了我们开始讲解程序1us是怎么实现的,我们使用时钟源为APB时钟,APB系统频率陪配置为72MHZ
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档