ST意法半导体
直播中

胡秋阳

13年用户 1547经验值
私信 关注
[问答]

为什么我的代码仅适用于L476RG而不适用于G474RE呢?

我想使用 ETR 来计算脉冲并设置第二个定时器,所以每隔 ...
STM32 频率计数器 – LAB10
代码是
  • #include "main.h"
  • uint32_t gu32_Counterticks = 0x00;
  • uint32_t gu32_Freq = 0x00;
  • uint8_t gu8_MSG[40] = {''};
  • TIM_HandleTypeDef htim2;
  • TIM_HandleTypeDef htim5;
  • UART_HandleTypeDef huart1;
  • void SystemClock_Config(void);
  • static void MX_GPIO_Init(void);
  • static void MX_TIM2_Init(void);
  • static void MX_TIM5_Init(void);
  • static void MX_USART1_UART_Init(void);
  • int main(void)
  • {
  •     HAL_Init();
  •     SystemClock_Config();
  •     MX_GPIO_Init();
  •     MX_TIM2_Init();
  •     MX_TIM5_Init();
  •     MX_USART1_UART_Init();
  •     HAL_TIM_Base_Start(&htim2);
  •     HAL_TIM_Base_Start_IT(&htim5);
  •     while (1)
  •     {
  •     }
  • }
  • void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef* htim)
  • {
  •     if(htim->Instance == TIM5)
  •     {
  •             gu32_CounterTicks = TIM2->CNT;
  •             gu32_Freq = gu32_CounterTicks * 20;
  •             sprintf(gu8_MSG, "Frequency = %d Hznr", gu32_Freq);
  •             HAL_UART_Transmit(&huart1, gu8_MSG, sizeof(gu8_MSG), 100);
  •             TIM5->CNT = 0;
  •             TIM2->CNT = 0;
  •     }
  • }
虽然该示例在 L476RG 上运行良好,但我无法在 G474RE 上运行。
两者都在定时器 2 处具有 ETR2 读取模式,而定时器 5 是一个普通定时器,可以设置为运行特定时间。
我查看了两个 Nucleo 开发板的数据表,但我找不到任何差异来解释为什么代码仅适用于 L476RG 而我也需要它适用于 G474RE。
提前致谢

回帖(1)

邢待湘

2023-1-4 09:28:46
我通过更改线路解决了问题
gu32_CounterTicks = TIM2->CNT;

TIM5->CNT = 0;

gu32_CounterTicks = __HAL_TIM_GET_COUNTER(&htim2);

__HAL_TIM_SET_COUNTER(&htim2,0);
但我不知道为什么没有 HAL 的访问不能在我的 G474RE 上工作,而它在 476RG 上工作。(时钟和引出线完全相同,代码闪烁无误返回。)
举报

更多回帖

发帖
×
20
完善资料,
赚取积分