一、启动时钟

PWC_Fcg2PeriphClockCmd(PWC_FCG2_TMR6_x, Enable);

TMR6对应FCG2,根据PWM输入引脚来确定是TMR6_x(本例为TMR6_2)。运行以后PWC的FCG2寄存器相应位被清0。

同时TM62的这些寄存器被全部置1,GCONR的DIR位被置一。

以上步骤类似STM32的开启RCC时钟。

二、功能初始化

设置TIM62的GCONR寄存器。

    /* Timer6 general count function configuration */stcTIM6BaseCntCfg.u32CntMode = TMR6_MODE_SAWTOOTH;stcTIM6BaseCntCfg.u32CntDir = TMR6_CNT_INCREASE;stcTIM6BaseCntCfg.u32CntClkDiv = TMR6_CLK_PCLK0_DIV1024;stcTIM6BaseCntCfg.u32CntStpAftOvf = TMR6_CNT_CONTINUOUS;(void)TMR6_Init(M4_TMR6_2, &stcTIM6BaseCntCfg);

设为锯齿波(TMR6_MODE_SAWTOOTH),计数增长(TMR6_CNT_INCREASE),1024分频(TMR6_CLK_PCLK0_DIV1024),计满溢出后继续计数(TMR6_CNT_CONTINUOUS)。

三、配置GPIO为PWM输入

本例为PB07
PB07可以作为TIM62_PWM的A通道使用

#define         TMR6_2_PWMA_PORT       (GPIO_PORT_B)
#define         TMR6_2_PWMA_PIN        (GPIO_PIN_07)
GPIO_SetFunc(TMR6_2_PWMA_PORT, TMR6_2_PWMA_PIN, GPIO_FUNC_3_TIM62_PWMA, PIN_SUBFUNC_DISABLE);

四、确立TMR62定时周期

    /* Period register set */u32Period = 0xFFFFFFFFu;TMR6_SetPeriodReg(M4_TMR6_2, TMR6_PERIOD_REG_A, u32Period);

TMR62是32位计数器最大值可以设置到0xFFFFFFFF。对PERAR寄存器设置0xFFFFFFFF。PERBR和PERCR可以作为缓存,这里不用,不管它们。

五、开启外部PWM信号捕获并配置滤波

设定端口控制寄存器PCNAR(PCNBR)的 CAPMDA(CAPMDB)位为1,捕获输入功能变为有效,同时设置FCNGR的对应A或B开启滤波,并配置其时钟分频。本例使用channel A。

    /* Capture input port configuration */stcTIM6PortInCfg.u32PortMode = TMR6_PORT_CAPTURE_INPUT;stcTIM6PortInCfg.u32FilterSta = TMR6_PORT_INPUT_FILTER_ON;stcTIM6PortInCfg.u32FltClk = TMR6_INPUT_FILTER_PCLK0_DIV16;(void)TMR6_PortInputConfig(M4_TMR6_2,TMR6_IO_PWMA, &stcTIM6PortInCfg);


在滤波采样基准时钟采样到端口上 3 次一致的电平时,该电平被当作有效电平传送到模块内部;小于 3 次一致的电平会被当作外部干扰滤掉,不传送到模块内部。其动作。

六、配置PWM捕获(HCPAR)

这个库函数是专门配置通道A的,操作寄存器HCPAR。

    TMR6_HwCaptureChACondCmd(M4_TMR6_2, TMR6_HW_CTRL_PWMA_RISING, Enable);

请注意,如果需要使用通道B,则需要换函数。

void TMR6_HwCaptureChBCondCmd(M4_TMR6_TypeDef *TMR6x,uint32_t u32CondSrc,en_functional_state_t enNewState)


七、捕获到跳变沿后,计数器计数硬件清零(HCLRR)

配置硬件清零事件选择寄存器(HCLRR),使得每次发生捕获事件后,计数器从0开始重新计数。

如果想测量PWM周期,则应该与捕获条件一致,本例捕获为上升沿,所以清0条件也应为上升沿。

    TMR6_HwClrCondCmd(M4_TMR6_2, TMR6_HW_CTRL_PWMA_RISING, Enable);

    TMR6_HwClrFuncCmd(M4_TMR6_2, Enable);


八、配置中断(ICONR,发生捕获时触发)

启动捕获功能时,每当发生捕获事件,当前的计数值就被保存到相应的捕获寄存器(GCMAR、GCMBR)中,本例使用GCMAR。我们开启ICONR寄存器中的最低位。

    /* Enable M4_TMR6_2 GCMAR interrupt */TMR6_IntCmd(M4_TMR6_2, TMR6_IRQ_EN_CNT_MATCH_A, Enable);

这样就可以在发生捕获时触发中断。
到这里总结一下,当外部上升沿进来时,TMR62会直接产生:

  1. 产生捕获事件
  2. 计数器清零0

进而由于产生捕获事件间接产生:

  1. 触发中断

九、配置中断向量及回调函数(NVIC)

STM32F4的中断向量通道和对应功能是固定死的,而HC32F4A0的非常灵活,可以自由配置。不过使用STM32的标准库函数来配NVIC非常方便,所以移植了STM32F4的misc.c文件,来对HC32F4A0进行NVIC配置。移植的时候需要修改以下几处:

1.misc.h


2. misc.c





然后即可使用misc文件里面的函数来配置NVIC了。

/**因为HC32F4A0的中断向量通道与中断源以及相应的中断服务函数可以灵活映射,所以需要手动配置**/stcIrqRegiConf.enIRQn = Int003_IRQn;                    /* Register INT_TMR6_2_GCMA Int to Vect.No.003 */stcIrqRegiConf.enIntSrc = INT_TMR6_2_GCMA;              /* Select Event interrupt of M4_TMR6_2 */stcIrqRegiConf.pfnCallback = &Tmr6_2_CapInputCallBack;  /* Callback function */(void)INTC_IrqSignIn(&stcIrqRegiConf);  /**后面就使用移植过来的misc文件中的库函数来配置NVIC了,注意ENABLE要改为Enable,其它跟STM32一样了**/NVIC_InitTypeDef NVIC_InitStructure;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitStructure.NVIC_IRQChannel = Int003_IRQn;      NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;         NVIC_InitStructure.NVIC_IRQChannelCmd = Enable;NVIC_Init(&NVIC_InitStructure);

Intxxx_IRQn可选择为Int000_IRQn ~ Int031_IRQn,以及Int056_IRQn ~ Int061_IRQn。

华大半导体HC32F4A0笔记(一),PWM输入捕获,使用TIM6相关推荐

  1. 华大半导体HC32F4A0笔记(三),RS485通信,使用串口USART1,DMA接收

    一.USART的工作频率和波特率 看用户手册一上来就糊涂了,手册里面写的PCLK是什么?翻看手册第4章有关CMU章节.似乎这里说的PCLK就是PCLK1?手册是第一版,纰漏其实蛮多的. 在官方库函数验 ...

  2. 华大半导体HC32F4A0笔记(五),使用CMSIS-DSP库进行FFT运算

    一.开启FPU功能 点这个麻将牌四筒,展开CMSIS,把DSP勾了. 点开后 然后点这个锤子 No Auto Includes的勾不要打,让它自动include,因为CMSIS-DSP库在KEIL的安 ...

  3. 华大半导体HC32F4A0笔记(四),SPI读写国产128kB EEPROM 上海贝岭BL25CMIA

    一.配置SPI引脚 本例中SPI只连接了一个设备,即国产128kB EEPROM上海贝岭BL25CMIA. NSS脚采用软件控制. 其它引脚通过查看手册可知其连接的SPI外设为SPI1. /* SPI ...

  4. stm32 PWM输入捕获

    普通的输入捕获,可使用定时器的四个通道,一路捕获占用一个捕获寄存器. PWM输入,只能使用两个通道,通道1和通道2. 一路PWM输入占用两个捕获寄存器,一个捕获周期,一个捕获占空比. 这里,用通用定时 ...

  5. 【WB32库开发】第12章(上)TIM1高级定时器——PWM输入捕获

    本章要学习的PWM输入捕获是定时器又一重要应用,使用PWM输入捕获可以测量输入PWM的频率和占空比. PWM输入只能使用定时器的两个通道:通道1和通道2,且一路PWM输入要占用两个捕获寄存器,一个用于 ...

  6. 单片机之PWM输入捕获

    首先要明白什么是PWM输入捕获? 第一,PWM输入捕获是基于TIM实现的一个功能:输入捕获就是当连接到定时器的引脚上产生电平变化时对应的捕获装置会立即将当前计数值复制到另一个寄存器中.你可以开启捕获中 ...

  7. 华大半导体HC32F4A0系列ARM芯片EXMC并口通信时序的FPGA实现

    华大半导体HC32F4A0系列ARM芯片EXMC并口通信时序的FPGA实现 EXMC简介 外部存储器控制器EXMC是一个用来访问各种片外存储器.实现数据交换的独立模块.EXMC通过配置可以把内部的AM ...

  8. 华大半导体 HC32F4A0 系列开发笔记

    HC32F4A0 系列开发笔记目录 选用芯片 对比STM32的优势 踩过的坑和一些总结: 1--串口空中断bug 2--标志位的寄存器 3--写IAP遇到的问题 4--CPU主频配置 5--RTC时钟 ...

  9. PWM输入捕获(只使用一路定时器通道)

    前言 上一篇文章介绍了使用<STM32参考手册>上 PWM 输入模式捕获的 PWM 波,这种方法简单且准确,但是它占用的资源太多了,因为它使用定时器的两个通道,且这两个通道映射在一个通道上 ...

最新文章

  1. ANSYS滑块导轨配合方法
  2. 批处理bat命令--获取当前盘符和当前目录和上级目录
  3. linux 监控命令
  4. Dws同步mysql数据_数据库技术丨GaussDB(DWS)数据同步状态查看方法
  5. toolbar java_Java ToolBar.layout方法代码示例
  6. 机器学习没有想象中的那么难
  7. 服务器pg信号指的是什么信号,关于atx电源PG信号检测和分析
  8. ffmpeg和SDL学习笔记
  9. 工作流实战_15_flowable 我发起的流程实例查询
  10. 深入理解 Java 内存模型(一)——基础
  11. 地图整饰-框架与格网
  12. jquery中ajax加载js和json文件
  13. Sound Of Firmware 学习 (一) 注册SOF
  14. rest_framework--过滤器filters--搜索
  15. 【Cactus仙人掌图】仙人掌基础知识学习笔记
  16. 网上零售进入垂直时代
  17. PCIE-XPDMA-Simple DMA传输笔记
  18. 欧盟人工智能立法提案的核心思想 及未来影响分析
  19. 创业,请神志不清者走开—leo看赢在中国第三季(3)
  20. 基金持仓数据分析,满仓干还是等风来?

热门文章

  1. 重磅!《2022中国开源发展蓝皮书》正式发布
  2. AppTransition
  3. 何夕:泛零售企业如何构建核心数智化能力 | 数智泛零售01课回顾
  4. jQuery :一个 JavaScript 库
  5. .NET(C#):ToString(CultureInfo.InvariantCulture)
  6. PTA L1-054 福到了 (15 分)
  7. 在MobaXterm中使用键盘快捷键
  8. 元认知能力---反思能力
  9. 易语言 base64转图片的简单方法
  10. Java长盛不衰的12个原因