打印
[APM32F4]

APM32F4脉冲捕捉输入高速计数

[复制链接]
457|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Peixu|  楼主 | 2025-3-3 11:00 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 Peixu 于 2025-3-3 11:02 编辑

这个main.c文件实现了一个基于 APM32F4xx 微控制器的系统,主要功能包括多编码器信号采集、开关量输入检测以及数据的串口输出。
变量定义
编码器计数值:定义了多个int32_t类型的变量,包括hsc0CountA、hsc0CountB、hsc1CountA、hsc1CountB、hsc4Count和hsc5Count,用于分别记录不同编码器通道的脉冲计数值。这些计数值会在定时器中断处理函数中根据编码器脉冲信号的捕获情况进行累加。
开关量输入状态:uint8_t类型的in_mcu_0_2_status和in_mcu_0_5_status用于存储两个开关量输入引脚(PA4 和 PA6)的电平状态,通过读取这些引脚状态可以获取外部开关的通断信息。
其他变量:volatile uint32_t tick变量被声明为volatile类型,表明其值可能会在程序运行过程中被异步修改(例如在中断服务程序中),但其具体用途在当前代码中未详细体现,可能用于系统定时或其他与时间相关的功能。
3. 引脚配置函数
GPIO 时钟使能:使用RCM_EnableAHB1PeriphClock函数使能 GPIOA、GPIOB 和 GPIOC 的时钟,同时通过RCM_EnableAPB2PeriphClock使能 SYSCFG(系统配置控制器)的时钟,为后续的 GPIO 和外部中断配置提供时钟支持。
编码器引脚配置:
对 PB6 和 PB7 引脚进行配置,将其模式设置为复用功能(GPIO_MODE_AF),速度设置为 100MHz,输出类型为推挽(GPIO_OTYPE_PP),上拉电阻使能(GPIO_PUPD_UP),并通过GPIO_ConfigPinAF将其复用功能映射到定时器 4 的通道 1 和通道 2,用于连接第一个编码器的 A、B 相。
类似地,对 PC6 和 PC7 引脚进行配置,使其连接到定时器 3 的通道 1 和通道 2,用于连接第二个编码器的 A、B 相。
配置 PA0 引脚为复用功能,连接到定时器 5 的通道 1,用于采集 HSC4 编码器信号;配置 PA5 引脚为复用功能,连接到定时器 2 的 ETR(外部触发输入),用于采集 HSC5 编码器信号。
开关量输入引脚配置:将 PA4 和 PA6 引脚配置为输入模式(GPIO_MODE_IN),并使能上拉电阻,用于检测外部开关量输入信号。
外部中断配置:
对于 PA4 引脚,通过SYSCFG_ConfigEINTLine将其连接到外部中断线 EINT4,配置 EINT4 的模式为中断模式(EINT_MODE_INTERRUPT),触发方式为下降沿触发(EINT_TRIGGER_FALLING),并使能该中断线。同时,通过NVIC_EnableIRQRequest使能 EINT4 的中断请求,并设置其抢占优先级和子优先级为较低值(0x0f, 0x0f)。
对 PA6 引脚进行类似配置,将其连接到外部中断线 EINT6,配置中断模式、触发方式并使能,同时设置其在 NVIC 中的中断优先级。
4. 定时器配置函数
定时器时钟使能:利用RCM_EnableAPB1PeriphClock函数使能定时器 2、3、4、5 的时钟,为后续的定时器配置和编码器信号捕获提供时钟基础。
定时器配置:
对定时器 4 进行配置,设置时钟分频为 1(TMR_CLOCK_DIV_1),计数模式为向上计数(TMR_COUNTER_MODE_UP),分频系数为之前定义的DIV值,周期为 0xFFFF,重复计数器为 0。然后分别配置通道 1 和通道 2 的输入捕获参数,包括极性为上升沿触发(TMR_IC_POLARITY_RISING),选择直接映射到输入捕获(TMR_IC_SELECTION_DIRECT_TI),预分频为 1(TMR_IC_PSC_1),滤波器为 0,并使能通道 1 和通道 2 的中断。
以类似方式对定时器 3 进行配置,用于处理第二个编码器的信号捕获。
配置定时器 5 用于 HSC4 编码器信号采集,设置基本参数和通道 1 的输入捕获参数,并使能通道 1 的中断。
配置定时器 2 的 ETR 用于 HSC5 编码器信号采集,同样设置相关参数并使能中断。
最后,通过TMR_Enable函数使能定时器 2、3、4、5。
NVIC 中断配置:使用NVIC_EnableIRQRequest函数使能定时器 2、3、4、5 以及外部中断 EINT4 和 EINT6 的中断请求,并为每个中断设置相应的抢占优先级和子优先级,确保在中断发生时系统能够按照预定的优先级顺序进行处理。
5. main函数
初始化部分:
调用APM_LEDInit(LED2)初始化开发板上的 LED2,可能用于系统状态指示。
配置串口,设置波特率为 115200,模式为收发模式(USART_MODE_TX_RX),无硬件流控制(USART_HARDWARE_FLOW_NONE),无奇偶校验(USART_PARITY_NONE),1 位停止位(USART_STOP_BIT_1),数据位长度为 8 位(USART_WORD_LEN_8B),并通过APM_COMInit(COM1, &usartConfig)将配置应用到 COM1 串口。
使用NVIC_ConfigPriorityGroup函数配置中断优先级分组为 2 位抢占优先级和 2 位子优先级。
依次调用GPIO_Configuration和Encoder_Configuration函数,完成 GPIO 和编码器接口的初始化,确保硬件资源能够正常工作。
通过printf("Start\r\n")向串口输出启动信息,标志系统初始化完成。
主循环部分:在无限循环中,通过printf函数持续打印各个编码器通道的计数值(hsc0CountA、hsc0CountB、hsc1CountA、hsc1CountB、hsc4Count、hsc5Count)以及开关量输入状态(in_mcu_0_2_status、in_mcu_0_5_status),以便开发者实时监测系统的运行状态。

使用特权

评论回复
沙发
霜之闪耀| | 2025-3-26 23:49 | 只看该作者
APM32F4系列的主频是168MHz,中断输入捕获可以得到的最高输入频率是多少啊?
实际测试的结果呢?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

31

主题

57

帖子

0

粉丝