当前位置: 首页 > news >正文

网站后台添加编辑器潍坊集团网站建设

网站后台添加编辑器,潍坊集团网站建设,谷歌企业邮箱怎么注册,快速网络推广第一个项目 第一步#xff0c;RCC开启时钟#xff0c;这个基本上每个代码都是第一步#xff0c;不用多想#xff0c;在这里打开时钟后#xff0c;定时器的基准时钟和整个外设的工作时钟就都会同时打开了 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);第二步RCC开启时钟这个基本上每个代码都是第一步不用多想在这里打开时钟后定时器的基准时钟和整个外设的工作时钟就都会同时打开了 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);第二步选择时基单元的时钟源对于定时中断我们就选择内部时钟源 TIM_InternalClockConfig(TIM2);//很多人不写这个函数因为定时器上电后默认就是内部时钟第三步配置时基单元包括预分频器、自动重装器、计数模式等等这些参数用一个struct就可以配置好 TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; TIM_TimeBaseInitStructure.TIM_ClockDivision TIM_CKD_DIV1; TIM_TimeBaseInitStructure.TIM_CounterMode TIM_CounterMode_Up; TIM_TimeBaseInitStructure.TIM_Period 10000 - 1; //ARR自动重装器的值【0-65535】 TIM_TimeBaseInitStructure.TIM_Prescaler 7200 - 1; //PSC预分频器的值【0-65535】两者取值都不是唯一的 TIM_TimeBaseInitStructure.TIM_RepetitionCounter 0; //重复计数器的值高级定时器c TIM_TimeBaseInit(TIM2, TIM_TimeBaseInitStructure); 上面并没有CNT计数器的参数如果我们需要的话可以用之前说的SetCounter和GetCounter这两个函数来操作计数器如果我们想定时1秒也就是定时频率为1Hz用下面这个公式来算 计数器溢出频率 C K _ C N T _ O V C K _ C N T / ( A R R 1 ) C K _ P S C / ( P S C 1 ) / ( A R R 1 ) CK\_CNT\_OV CK\_CNT / (ARR 1) CK\_PSC / (PSC 1) / (ARR 1) CK_CNT_OVCK_CNT/(ARR1)CK_PSC/(PSC1)/(ARR1) TIM_TimeBaseInitStructure typedef struct {uint16_t TIM_Prescaler; /*! Specifies the prescaler value used to divide the TIM clock.This parameter can be a number between 0x0000 and 0xFFFF */uint16_t TIM_CounterMode; /*! Specifies the counter mode.This parameter can be a value of ref TIM_Counter_Mode */uint16_t TIM_Period; /*! Specifies the period value to be loaded into the activeAuto-Reload Register at the next update event.This parameter must be a number between 0x0000 and 0xFFFF. */ uint16_t TIM_ClockDivision; /*! Specifies the clock division.//指定时钟分频This parameter can be a value of ref TIM_Clock_Division_CKD */ //TIM_Clock_Division_CKD是用来干啥的呢滤波器可以滤掉信号的抖动干扰怎么工作的呢就是在一个固定时钟频率f下进行采样如果连续N个采样点都为相同的电平那就代表输入信号稳定了就把采样值输出出去如果这N个采样值不全都相同那就说明信号有抖动这时就保持上一次的输出或者直接输出低电平也行这样就可以保证输出信号在一定程度上的滤波了这里的采样频率f可以内部时钟直接而来也可以由内部时钟加一个时钟分频而来分频多少就是由TIM_Clock_Division_CKD决定这个参数和时基单元关系并不大我们随便配一个就行和采样点N都是滤波器的参数频率越低采样点数越多那滤波效果就越好不过相应的信号延迟就大uint8_t TIM_RepetitionCounter; /*! Specifies the repetition counter value. Each time the RCR downcounterreaches zero, an update event is generated and counting restartsfrom the RCR value (N).This means in PWM mode that (N1) corresponds to:- the number of PWM periods in edge-aligned mode- the number of half PWM period in center-aligned modeThis parameter must be a number between 0x00 and 0xFF. note This parameter is valid only for TIM1 and TIM8. */ } TIM_TimeBaseInitTypeDef; TIM_Clock_Division_CKD /** defgroup TIM_Clock_Division_CKD * {*/#define TIM_CKD_DIV1 ((uint16_t)0x0000) //不分频 #define TIM_CKD_DIV2 ((uint16_t)0x0100) //二分频 #define TIM_CKD_DIV4 ((uint16_t)0x0200) //四分频 #define IS_TIM_CKD_DIV(DIV) (((DIV) TIM_CKD_DIV1) || \((DIV) TIM_CKD_DIV2) || \((DIV) TIM_CKD_DIV4)) /*** }*/TIM_Counter_Mode /** defgroup TIM_Counter_Mode * {*/#define TIM_CounterMode_Up ((uint16_t)0x0000) //向上计数 #define TIM_CounterMode_Down ((uint16_t)0x0010) //向下计数 #define TIM_CounterMode_CenterAligned1 ((uint16_t)0x0020) //三种中央对齐模式 #define TIM_CounterMode_CenterAligned2 ((uint16_t)0x0040) #define TIM_CounterMode_CenterAligned3 ((uint16_t)0x0060) #define IS_TIM_COUNTER_MODE(MODE) (((MODE) TIM_CounterMode_Up) || \((MODE) TIM_CounterMode_Down) || \((MODE) TIM_CounterMode_CenterAligned1) || \((MODE) TIM_CounterMode_CenterAligned2) || \((MODE) TIM_CounterMode_CenterAligned3)) /*** }*/ 第四步配置输出中断控制允许更新中断输出到NVIC TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);//开启了更新中断到NVIC的通路 /*** brief Enables or disables the specified TIM interrupts.* param TIMx: where x can be 1 to 17 to select the TIMx peripheral.* param TIM_IT: specifies the TIM interrupts sources to be enabled or disabled.* This parameter can be any combination of the following values:* arg TIM_IT_Update: TIM update Interrupt source \\ 更新中断* arg TIM_IT_CC1: TIM Capture Compare 1 Interrupt source* arg TIM_IT_CC2: TIM Capture Compare 2 Interrupt source* arg TIM_IT_CC3: TIM Capture Compare 3 Interrupt source* arg TIM_IT_CC4: TIM Capture Compare 4 Interrupt source* arg TIM_IT_COM: TIM Commutation Interrupt source* arg TIM_IT_Trigger: TIM Trigger Interrupt source* arg TIM_IT_Break: TIM Break Interrupt source* note * - TIM6 and TIM7 can only generate an update interrupt.* - TIM9, TIM12 and TIM15 can have only TIM_IT_Update, TIM_IT_CC1,* TIM_IT_CC2 or TIM_IT_Trigger. * - TIM10, TIM11, TIM13, TIM14, TIM16 and TIM17 can have TIM_IT_Update or TIM_IT_CC1. * - TIM_IT_Break is used only with TIM1, TIM8 and TIM15. * - TIM_IT_COM is used only with TIM1, TIM8, TIM15, TIM16 and TIM17. * param NewState: new state of the TIM interrupts.* This parameter can be: ENABLE or DISABLE.* retval None*/ void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState) { /* Check the parameters */assert_param(IS_TIM_ALL_PERIPH(TIMx));assert_param(IS_TIM_IT(TIM_IT));assert_param(IS_FUNCTIONAL_STATE(NewState));if (NewState ! DISABLE){/* Enable the Interrupt sources */TIMx-DIER | TIM_IT;}else{/* Disable the Interrupt sources */TIMx-DIER (uint16_t)~TIM_IT;} }第五步配置NVIC在NVIC中打开定时器中断的通道并分配一个优先级和中断那一节流程一样 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel TIM2_IRQn; NVIC_InitStructure.NVIC_IRQChannelCmd ENABLE; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority 2; NVIC_InitStructure.NVIC_IRQChannelSubPriority 1; NVIC_Init(NVIC_InitStructure);第六步运行控制 TIM_Cmd(TIM2, ENABLE);整个模块配置完成后我们还需要使能一下计数器要不然计数器不会运行当定时器使能后计数器就会开始计数了当数器更新时触发中断 最后我们再写一个定时器的中断函数 void TIM2_IRQHandler(void) {if (TIM_GetITStatus(TIM2, TIM_IT_Update) SET){TIM_ClearITPendingBit(TIM2, TIM_IT_Update);} }这样这个中断函数每隔一段时间就能自动执行一次了 定时器的库函数 void TIM_DeInit(TIM_TypeDef* TIMx);void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct); //时基单元初始化它就是用来配置这个图里这里的时基单元的 //第一个TIMx选择某个定时器第二个是结构体里面包含了配置时基单元的一些参数void TIM_TimeBaseStructInit(TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);//结构体变量赋一个默认值void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState);//这个是用来使能计数器的对应的就是图里面的运行控制第二个NewState新的状态也就是使能还是失能void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState);//这个是用来使能外设的中断输出信号的对应的就是图里面的中断输出控制第二个TIM_IT选择要配置哪个中断输出第三个使能与否下面6个函数对应的就是时基单元的时钟选择部分可以选择RCC内部时钟、ETR外部时钟、ITRx其他定时器、TIx捕获通道这些void TIM_InternalClockConfig(TIM_TypeDef* TIMx);//选择内部时钟void TIM_ITRxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource);//选择ITRx其他定时器的时钟InputTriggerSource选择要接入哪个其他的定时器void TIM_TIxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_TIxExternalCLKSource,uint16_t TIM_ICPolarity, uint16_t ICFilter);//选择TIx捕获通道的时钟TIxExternalCLKSource,选择TIx具体的某个引脚,接着还有两个参数ICPolarity和CFilter,输入的极性和滤波器对于外部引脚的波形一般都会有极性选择和滤波器这样更灵活一些void TIM_ETRClockMode1Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity, uint16_t ExtTRGFilter);//选择ETR通过外部时钟模式1输入的时钟ExtTRGPrescaler外部触发预分频器这里可以对ETR的外部时钟再提前做一个分频接下来两个和上面那个函数参数一样 void TIM_ETRClockMode2Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity, uint16_t ExtTRGFilter);//选择ETR通过外部时钟模式2输入的时钟 //对于ETR输入的外部时钟而言上面这两个函数是等效的它们的参数是一样的如果不需要触发输入的功能那这两个函数可以互换void TIM_ETRConfig(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity, uint16_t ExtTRGFilter);//这个不是用来选择时钟的就是单独用来配置ETR引脚的预分频器、极性、滤波器这些参数的TIM_ITRxExternalClockConfig 因为在初始化结构体里有很多关键的参数比如自动重装值和预分频值等等这些参数可能会在初始化之后还需要更改如果为了改某个参数再调用一次初始化函数这样太麻烦了所以这里有一些单独的函数可以方便地更改这些关键参数 void TIM_PrescalerConfig(TIM_TypeDef* TIMx, uint16_t Prescaler, uint16_t TIM_PSCReloadMode); //单独用来写预分频值的Prescaler要写入的预分频值TIM_PSCReloadMode写入的模式预分频器有一个缓冲器这个参数决定这个影子寄存器是否生效或者是在写入后手动产生一个更新事件让这个值立刻生效void TIM_CounterModeConfig(TIM_TypeDef* TIMx, uint16_t TIM_CounterMode); //改变计数器的计数模式的TIM_CounterMode选择新的计数器模式void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState);//自动重装器预装功能配置有无预装是可以自己选择的使能与否就可以使这个是否有无预装void TIM_SetCounter(TIM_TypeDef* TIMx, uint16_t Counter);//给计数器写入一个值如果你想手动给一个计数值就可以用这个函数void TIM_SetAutoreload(TIM_TypeDef* TIMx, uint16_t Autoreload);//给自动重装器写入一个值uint16_t TIM_GetCounter(TIM_TypeDef* TIMx);//获取当前计数器的值uint16_t TIM_GetPrescaler(TIM_TypeDef* TIMx);//获取当前预分频器的值下面四个就是之前中断里面学习的那四个函数获取标志位和清除标志位的 FlagStatus TIM_GetFlagStatus(TIM_TypeDef* TIMx, uint16_t TIM_FLAG); void TIM_ClearFlag(TIM_TypeDef* TIMx, uint16_t TIM_FLAG); ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t TIM_IT); void TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT);主函数内容 #include stm32f10x.h // Device header #include Delay.h #include OLED.h #include Timer.huint16_t Num;int main(void) {OLED_Init();Timer_Init();OLED_ShowString(1, 1, Num:);while (1){OLED_ShowNum(1, 5, Num, 5);} } //为了不让Num跨文件所以把中断函数放到了这个 void TIM2_IRQHandler(void) {if (TIM_GetITStatus(TIM2, TIM_IT_Update) SET){Num ;TIM_ClearITPendingBit(TIM2, TIM_IT_Update);} }我们调试运行发现每次复位Num都是从1开始计数的按理说Num的初始值是0应该是从0开始计数的这说明中断函数在初始化之后就立刻进入了一次这是怎么回事呢 打开一下TIM_TimeBaseInit函数的定义 英文意思是生成一个更新事件来重新装载预分频器和重复计数器的值立刻 我们知道这个预分频器是有个缓冲寄存器的我们写的值只有在更新事件时才会真正起作用这里为了让值立刻起作用所以在这最后手动生成了一个更新事件这样预分频器的值就有效了但同时它的副作用就是更新事件和更新中断是同时发生的更新中断会置更新中断标志位当我们之后一但初始化完了更新中断就会立刻进入这就是我们刚一上电就立该进中断的原因 解决方案在TIM_TimeBaseInit后面开启中断的前面再手动调用一下TIM_ClearFlag(TIM2, TIM_FLAG_Update); 第二个项目 接线图 这个PA0引脚就是TIM2的ETR引脚我们在这个引脚输入一个外部时钟 TIM_ETRClockMode2Config(TIM2, TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_NonInverted, 0x0F);//通过ETR引脚的外部时钟模式2配置/*** brief Configures the External clock Mode2* param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral.* param TIM_ExtTRGPrescaler: The external Trigger Prescaler. 外部触发预分频器可以是下面这些值* This parameter can be one of the following values:* arg TIM_ExtTRGPSC_OFF: ETRP Prescaler OFF. //不需要分频就选择第一个* arg TIM_ExtTRGPSC_DIV2: ETRP frequency divided by 2.* arg TIM_ExtTRGPSC_DIV4: ETRP frequency divided by 4.* arg TIM_ExtTRGPSC_DIV8: ETRP frequency divided by 8.* param TIM_ExtTRGPolarity: The external Trigger Polarity. //外部触发的极性* This parameter can be one of the following values:* arg TIM_ExtTRGPolarity_Inverted: active low or falling edge active. //反向就是低电平或下降沿有效* arg TIM_ExtTRGPolarity_NonInverted: active high or rising edge active.//不反向高电平或上升沿有效目前选这个* param ExtTRGFilter: External Trigger Filter.外部触发滤波器这个值必须是0x00到0x0F之间的一个值这个值就是来决定上面讲的滤波器的f和N的* This parameter must be a value between 0x00 and 0x0F* retval None*/ void TIM_ETRClockMode2Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity, uint16_t ExtTRGFilter) {/* Check the parameters */assert_param(IS_TIM_LIST3_PERIPH(TIMx));assert_param(IS_TIM_EXT_PRESCALER(TIM_ExtTRGPrescaler));assert_param(IS_TIM_EXT_POLARITY(TIM_ExtTRGPolarity));assert_param(IS_TIM_EXT_FILTER(ExtTRGFilter));/* Configure the ETR Clock source */TIM_ETRConfig(TIMx, TIM_ExtTRGPrescaler, TIM_ExtTRGPolarity, ExtTRGFilter);/* Enable the External clock mode2 */TIMx-SMCR | TIM_SMCR_ECE; }ExtTRGFilter的取值 我们暂时不用滤波器所以写0x00就行了 因为引脚用到了GPIO所以我们也要初始化GPIO GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Mode GPIO_Mode_IPU; GPIO_InitStructure.GPIO_Pin GPIO_Pin_0; GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; GPIO_Init(GPIOA, GPIO_InitStructure);但是浮空输入如果你外部的输入信号功率很小内部的这个上拉电阻可能会影响到这个输入信号这时采用浮空输入防止外部输入的电平会导致电平跳个没完所以还是给了上拉输入 TIM_TimeBaseInitStructure.TIM_Period 10 - 1; //从0计到9就行了 TIM_TimeBaseInitStructure.TIM_Prescaler 1 - 1;//手动模拟的输入没有那么快所以不需要分频
http://www.hkea.cn/news/14324965/

相关文章:

  • 网站开发的中国银行门户网站
  • 金阊公司网站建设电话建设银行优缺点
  • 吉林省建设厅证件查询网站中国商标注册网官网
  • 台州超值营销型网站建设地址常州网站制作维护
  • 淄博公益网站建设中建招标平台叫什么网
  • 有帮忙做网站的吗flash网站 seo
  • 上海网站建设开发哪佛山网络公司推荐
  • 做网站需要多大的空间成都网站建设市场
  • 大坪网站公司强的小企业网站建设
  • 国外好的做电视包装的网站大连网络广告
  • 通辽市城乡建设局网站企业门户网站开发
  • 分类目录网站大全移动端的网站建设
  • 不动产登记门户网站建设如何进行网站建设和推广
  • 站长之家ip地址查询网站备案没有了
  • 网站建设的总结与评价网站建设性能指标
  • 怎么给网站做外链邵连虎网站建设规划方案
  • 林芝北京网站建设wordpress zerif lite
  • 天津建站管理系统信息述职报告ppt免费模板下载
  • 南安市网站建设店面布置效果图大全
  • 空间业务建设网站多个链接的网站怎么做
  • 网站作为医院形象建设北京标本制作
  • c 精品课程建设网站源程序携程网站 建设平台分析
  • 做期货主要看哪几个财经网站徐东做网站
  • 网站建设优化服务行情苏州专业设计网站
  • 华为云 搭建网站专业网站建设86215
  • 惠州网站建设电话网站改版必要性
  • 外贸soho自己建站公司建推广网站多少钱
  • dede网站婚纱模板郴州网站制作公司招聘
  • 网站推广关键词长春网站建设方案托管
  • 珠海网站建设成功案例给宝宝做衣服网站