准备使用激光测距模块,需要进行微秒计数,我用定时器4,设定时间为1um,每次中断时对变量进行加1操作,测试时是在主循环中先将变量清零,然后启动定时器4,稍后停止定时器4,再显示变量值。代码是用CubeMX生成的,程序编译通过,也可以运行,但变量值不会变化,可能是定时器4没有正常启动,也许是配置不正确造成的。相关的代码如下,麻烦大家帮我看看是什么问题,在此先谢谢各位!
1、tim.c文件
- #include "tim.h"
- extern uint16_t distance;
- TIM_HandleTypeDef htim4;
- void MX_TIM4_Init(void) //static
- {
- TIM_SlaveConfigTypeDef sSlaveConfig = {0};
- TIM_MasterConfigTypeDef sMasterConfig = {0};
- htim4.Instance = TIM4;
- htim4.Init.Prescaler = (72-1); //预分频值
- htim4.Init.CounterMode = TIM_COUNTERMODE_UP; //向上计数
- htim4.Init.Period = (1000-1); //重载值
- htim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; //不分频
- htim4.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
- if (HAL_TIM_Base_Init(&htim4) != HAL_OK)
- {
- Error_Handler();
- }
- sSlaveConfig.SlaveMode = TIM_SLAVEMODE_RESET;
- sSlaveConfig.InputTrigger = TIM_TS_ITR0;
- if (HAL_TIM_SlaveConfigSynchronization(&htim4, &sSlaveConfig) != HAL_OK)
- {
- Error_Handler();
- }
- sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; //主输出触发器
- sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; //
- if (HAL_TIMEx_MasterConfigSynchronization(&htim4, &sMasterConfig) != HAL_OK)
- {
- Error_Handler();
- }
- //开启定时器时钟
- _HAL_TIM_Base_MspInit(&htim4);
- }
- void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle)
- {
- if(tim_baseHandle->Instance==TIM4)
- {
- /* TIM4 clock enable */
- __HAL_RCC_TIM4_CLK_ENABLE();
- /* TIM4 interrupt Init */
- HAL_NVIC_SetPriority(TIM4_IRQn, 0, 0);
- HAL_NVIC_EnableIRQ(TIM4_IRQn);
- /* USER CODE BEGIN TIM4_MspInit 1 */
- /* USER CODE END TIM4_MspInit 1 */
- }
- }
复制代码
2、tim.h文件
- #ifndef __tim_H
- #define __tim_H
- #ifdef __cplusplus
- extern "C" {
- #endif
- /* Includes ------------------------------------------------------------------*/
- #include "main.h"
- extern TIM_HandleTypeDef htim4;
- void MX_TIM4_Init(void);
- #ifdef __cplusplus
- }
- #endif
- #endif /*__ tim_H */
复制代码
3、stm321xx_it.c文件(部分)
- void TIM4_IRQHandler(void)
- {
- /* USER CODE BEGIN TIM4_IRQn 0 */
- /* USER CODE END TIM4_IRQn 0 */
- HAL_TIM_IRQHandler(&htim4);
- /* USER CODE BEGIN TIM4_IRQn 1 */
- distance++;
- /* USER CODE END TIM4_IRQn 1 */
- }
复制代码
4、main.c文件中对定时器的操作
- int main(void)
- {
- uint8_t i;
- HAL_Init();
- SystemClock_Config();
- MX_GPIO_Init();
- MX_RTC_Init();
- MX_TIM4_Init();
- MX_ADC1_Init();
- MX_I2C1_Init();
- MX_SPI1_Init();
- MX_USART1_UART_Init();
- LCD_init();
- display_main();
- led_green_off();
- while (1)
- {
- distance = 0; //清零计数值
- HAL_TIM_Base_Start(&htim4); //开启定时器
- if(keyf>0){
- LCD_write_value(10,1,3,0,1,keyf);
- LCD_write_value(10,2,3,0,1,keys);
- }
- if(ms>999){
- ms = 0;
- led_green_flashing();
- led_red_flashing();
- }
- HAL_TIM_Base_Stop(&htim4); //关闭定时器
- LCD_write_value(10,3,5,0,1,distance); //显示定时器中断次数(计时)
- }
- }
复制代码
|
找了多个都是标准库函数的,而我这个用CudeMX生成的是用HAL库,我尚未入门,所以就不知所措了。
CUBEMX生成的是HAL_DELAY();是MS的,用标准库也可以呀,不会改的话,上网看看正点原子的HAL库程序,直接复制过来用就好了。
评分
查看全部评分
评分
查看全部评分
谢谢您提供参考资料的链接,现在已经基本上解决了。
网速慢,重复提交了。