关于滴答寄存器问题

2019-08-14 02:26发布

本人菜鸟,之前在网上查看相关滴答寄存器,动手操作了下,运行发现得不到自己想要的延迟效果,请教下各位大神,代码如下:
#include "delay.h"
#include "stm32f1xx_hal.h"

void SystemClock_Config()
{
  RCC_OscInitTypeDef RCC_OscInitStruct;
  RCC_ClkInitTypeDef RCC_ClkInitStruct;

  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;  // 外部晶振,8MHz
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;  // 9倍频,得到72MHz主时钟
  HAL_RCC_OscConfig(&RCC_OscInitStruct);

  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;       // 系统时钟:72MHz
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;              // AHB时钟:72MHz
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;               // APB1时钟:36MHz
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;               // APB2时钟:72MHz
  HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2);

        // HAL_RCC_GetHCLKFreq()/1000    1ms中断一次,即HAL_Delay函数延时基准为1ms
        // HAL_RCC_GetHCLKFreq()/100000         10us中断一次,即HAL_Delay函数延时基准为10us
        // HAL_RCC_GetHCLKFreq()/1000000 1us中断一次,即HAL_Delay函数延时基准为1us
  //HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000000);  // 配置并启动系统滴答定时器
/* 系统滴答定时器时钟源 */
//  HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK_DIV8);
  /* 系统滴答定时器中断优先级配置 */
// HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
}

void delay_ms(u32 nms)
{

  SysTick->LOAD=(u32)(9000*nms);
  SysTick->VAL=0x00;
  SysTick->CTRL=0x01;
  while((SysTick->CTRL)>>16==0)
  {
    ;
  }
  SysTick->CTRL=0x01;
  SysTick->VAL=0x00;
}

void delay_us(u32 nus)
{
   SysTick->LOAD=(u32)(9*nus);
     SysTick->VAL=0x00;
    SysTick->CTRL=0x01;
    while((SysTick->CTRL)>>16==0)
    {
    ;
    }
    SysTick->CTRL=0x01;
    SysTick->VAL=0x00;
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
xuande
1楼-- · 2019-08-14 06:34

(SysTick->CTRL)>>16
目测这个句子是错的。


superliu588
2楼-- · 2019-08-14 11:02
哈哈,哪里不对啦?麻烦请指点下该怎么改动,其实我之前的写的是while((SysTick->CTRL&0XFFFFF)>>16==0),后来感觉有点累赘,就索性把&0XFFFFF给去掉了,还是不对,主函数设置的语句是delay_ms(500),但是实际示波器测量延迟有4.5S之久。
superliu588
3楼-- · 2019-08-14 14:34
本帖最后由 superliu588 于 2017-9-8 11:14 编辑
xuande 发表于 2017-9-7 20:55
(SysTick->CTRL)>>16
目测这个句子是错的。

问题解决了,这个(SysTick->CTRL)>>16语句是对的,问题是出在main()函数里,调用了delays初始化,却没有调用SystemClock_Config()初始化函数,因此延时不准确。谢谢你。

一周热门 更多>