
自己写的delay函数用定时器 72Mhz#includestm32f10x.h#includedelay.h#includeled.h#includekey.h#includebuzzer.h#includelightSensor.h#includestdio.h#includeoled.h#includecounterSensor.h#includeencoder.hvoidapp_systemClock_init(void){// 开启 HSERCC_HSEConfig(RCC_HSE_ON);// 等待HSE开启完while(RCC_GetFlagStatus(RCC_FLAG_HSERDY)RESET);// 配置锁相环 phase locked loopRCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);// 开启锁相环RCC_PLLCmd(ENABLE);// 等待锁相环开启完while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)RESET);// 配置 AHB advanced high-speed bus APB1 advance peripheral bus1RCC_HCLKConfig(RCC_SYSCLK_Div1);RCC_PCLK1Config(RCC_HCLK_Div2);RCC_PCLK2Config(RCC_HCLK_Div1);// 切换时钟来源 切换来自于锁相环RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);// 等待时钟来源切换成功 0x00是 HSI 0x40是HSE 0x80是锁相环 phase locked loopwhile(RCC_GetSYSCLKSource()!0x80);// 开启指令预取,, instruction prefetch 72Mhz等待周期为2FLASH_PrefetchBufferCmd(ENABLE);FLASH_SetLatency(FLASH_Latency_2);}volatileuint32_tcurrentTick0;voidapp_delay(uint32_tms){uint32_texpireTimecurrentTickms;while(currentTickexpireTime);}voidapp_tim3_timebaseInit(void){// 开启tim3时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);TIM_TimeBaseInitTypeDef tim_timeBaseInitStructure;tim_timeBaseInitStructure.TIM_Prescaler71;tim_timeBaseInitStructure.TIM_Period999;tim_timeBaseInitStructure.TIM_CounterModeTIM_CounterMode_Up;tim_timeBaseInitStructure.TIM_RepetitionCounter0;TIM_TimeBaseInit(TIM3,tim_timeBaseInitStructure);// 闭合时基单元的开关TIM_Cmd(TIM3,ENABLE);// 开启定时器update中断 TIM允许发出中断请求但是cpu还不知道要不要处理这个请求TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);// nvic允许cpu响应这个中断没有nvic就不会跳转到中断函数// 配置nvic nested vectored intterupt controllerNVIC_InitTypeDef nvic_initStruct;nvic_initStruct.NVIC_IRQChannelTIM3_IRQn;// 抢占优先级nvic_initStruct.NVIC_IRQChannelPreemptionPriority0;nvic_initStruct.NVIC_IRQChannelSubPriority0;nvic_initStruct.NVIC_IRQChannelCmdENABLE;NVIC_Init(nvic_initStruct);}// 中断响应函数voidTIM3_IRQHandler(void){// 很多标志位都能触发中断if(TIM_GetFlagStatus(TIM3,TIM_FLAG_Update)SET){currentTick;// 清除标志位TIM_ClearFlag(TIM3,TIM_FLAG_Update);}}voidapp_onBoardLED_init(void){RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);GPIO_InitTypeDef gpio_InitStruct;gpio_InitStruct.GPIO_PinGPIO_Pin_13;gpio_InitStruct.GPIO_ModeGPIO_Mode_Out_OD;gpio_InitStruct.GPIO_SpeedGPIO_Speed_2MHz;GPIO_Init(GPIOC,gpio_InitStruct);GPIO_WriteBit(GPIOC,GPIO_Pin_13,Bit_SET);}intmain(void){// 设置中断组NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);app_tim3_timebaseInit();app_onBoardLED_init();while(1){GPIO_WriteBit(GPIOC,GPIO_Pin_13,Bit_RESET);app_delay(500);GPIO_WriteBit(GPIOC,GPIO_Pin_13,Bit_SET);app_delay(500);}}PWM pulse width modulation 脉冲宽度调制名词CNT counterPSC prescaler 预分频器ARR auto reload register 自动重装寄存器CCR capture compare register 捕获比较寄存器RCR repetition counter register 重复计数器PWM pulse width modulation 脉冲宽度调制输出比较模式选择 8中不同的模式ocxREf output compare x reference 输出比较通道x参考这8种模式通过cnt 和 CCR 参数来产生结果的相等有效 当 cnt的值和 CCR的值相等的时候是有效的是高电压toggle反转当cnt和CCR值相等的时候电平发生一次反转pwm1模式 当cnt CCR 这个 ocxREf 是高电压否则是低电压pwm2模式 当cnt CCR,输出低电压否则是高电压pwm pulse width modulationccr capture compare registerCH channel 正常输出CHxN n:negative 互补输出为什么要有互补输出 CHx 和 CHxN 是两个物理引脚你不可能为了用互补去换一个物理引脚加了个极性选择DAC digital to analog converter 把数字量变成模拟电压定时器主模式 master mode 这个TIM可以向外发送同步信号TRGO trigger output 触发输出普通情况下TIM自己玩自己的但是有时候我们希望TIM触发 ADC或者ADC或者触发别的TIM也就是外设之间的联动STM32搞了主从模式TIM可以对外发送同步信号比如每1ms采样一次ADC三相无刷电机 四轴飞行器电动车的后轮// 告诉编译器我有这个变量在别的文件定义了至于在哪里自己去找externuint16_tnum;