关于用SysTick进行微秒级延时的问题

[复制链接]
390|0
 楼主| lmn2005 发表于 2023-7-12 14:11 | 显示全部楼层 |阅读模式
TI, ic, ck, sy
本帖最后由 lmn2005 于 2023-7-12 14:12 编辑

CSDN博客的一篇文章( https://blog.csdn.net/m0_53904877/article/details/128375870
)详细介绍了SysTick的工作原理和如何用SysTick进行微秒级或毫秒级延时的方法,本人用STM32CubeMX初始化工程模板(芯片用GD32F103C8T6或STM32F401RCT8),用文章中介绍的延时方法进行延时,结果延时不正常(比正常的时间长),不知道是什么原因,请各位大佬指教,谢谢!
附:int main代码:

  1. /* USER CODE BEGIN Header */
  2. /**

  3.   */
  4. /* USER CODE END Header */

  5. /* Includes ------------------------------------------------------------------*/
  6. #include "main.h"

  7. /* Private includes ----------------------------------------------------------*/
  8. /* USER CODE BEGIN Includes */
  9. #include <stdio.h>
  10. /* USER CODE END Includes */

  11. /* Private typedef -----------------------------------------------------------*/
  12. /* USER CODE BEGIN PTD */

  13. /* USER CODE END PTD */

  14. /* Private define ------------------------------------------------------------*/
  15. /* USER CODE BEGIN PD */

  16. /* USER CODE END PD */

  17. /* Private macro -------------------------------------------------------------*/
  18. /* USER CODE BEGIN PM */

  19. /* USER CODE END PM */

  20. /* Private variables ---------------------------------------------------------*/
  21. UART_HandleTypeDef huart1;

  22. /* USER CODE BEGIN PV */
  23. /* USER CODE END PV */

  24. /* Private function prototypes -----------------------------------------------*/
  25. void SystemClock_Config(void);
  26. static void MX_GPIO_Init(void);
  27. static void MX_USART1_UART_Init(void);
  28. /* USER CODE BEGIN PFP */

  29. /* USER CODE END PFP */

  30. /* Private user code ---------------------------------------------------------*/
  31. /* USER CODE BEGIN 0 */
  32. int32_t fac_us, fac_ms ;

  33. //STM32 printf重定义
  34. int fputc(int ch, FILE *f)
  35. {
  36.   HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
  37.   return ch;
  38. }

  39. int fgetc(FILE *f)
  40. {
  41.   uint8_t ch = 0;
  42.   HAL_UART_Receive(&huart1, &ch, 1, 0xffff);
  43.   return ch;
  44. }
  45. void delay_init()
  46. {
  47.     /* 配置时钟源 --> 48MHz         */
  48.         HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK  );//配置时钟源为HCLK  
  49.         /* fac_us 和 fac_ms 是定义的全局变量,是倍频因子*/
  50.         fac_us = SystemCoreClock / 1000000;        
  51.         fac_ms = 1000 * fac_us;
  52. }

  53. void delay_us(unsigned int us)
  54. {
  55.         unsigned int temp = 0;
  56.         SysTick->LOAD = fac_us * us;//设置重装载值.1us需要计数48次,计数初值为48
  57.         SysTick->VAL = 0x00;//当前值寄存器清0,即清空计数器
  58.         SysTick->CTRL |= 0x01;//滴答定时器控制寄存器,使能滴答定时器        
  59.         do
  60.         {
  61.                 temp = SysTick->CTRL;//获取控制寄存器的当前状态               
  62.         }while((temp & 0x01) && !(temp & (0x01 << 16)));
  63.         SysTick->CTRL &= 0x00;
  64.         SysTick->VAL = 0x00;
  65. }

  66. void delay_ms(unsigned int ms)
  67. {
  68.         unsigned int temp = 0;
  69.         /*设置重装载值*/
  70.     if(fac_ms * ms <= ((0x01 << 24) - 1))
  71.     {
  72.         SysTick->LOAD = fac_ms * ms;
  73.     }
  74.     else
  75.     {
  76.         return ;
  77.     }
  78.         /*设置重装载值*/
  79.         SysTick->VAL = 0x00;
  80.         /*滴答定时器控制寄存器,使能滴答定时器*/
  81.         SysTick->CTRL |= 0x01;
  82.         
  83.         do
  84.         {
  85.                 /*获取控制寄存器的当前状态*/
  86.                 temp = SysTick->CTRL;
  87.                
  88.         }while((temp & 0x01) && !(temp & (0x01 << 16)));
  89.         SysTick->CTRL &= 0x00;
  90.         SysTick->VAL = 0x00;
  91. }

  92. /* USER CODE END 0 */

  93. /**
  94.   * [url=home.php?mod=space&uid=247401]@brief[/url]  The application entry point.
  95.   * @retval int
  96.   */
  97. int main(void)
  98. {
  99.   /* USER CODE BEGIN 1 */
  100. //int32_t SysClk;        
  101.   /* USER CODE END 1 */
  102.   

  103.   /* MCU Configuration--------------------------------------------------------*/

  104.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  105.   HAL_Init();

  106.   /* USER CODE BEGIN Init */
  107.   /* USER CODE END Init */

  108.   /* Configure the system clock */
  109.   SystemClock_Config();

  110.   /* USER CODE BEGIN SysInit */
  111.         delay_init();
  112.   /* USER CODE END SysInit */

  113.   /* Initialize all configured peripherals */
  114.   MX_GPIO_Init();
  115.   MX_USART1_UART_Init();
  116.   /* USER CODE BEGIN 2 */
  117.   /* USER CODE END 2 */

  118.   /* Infinite loop */
  119.   /* USER CODE BEGIN WHILE */
  120.   while (1)
  121.   {
  122.                 HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_0);               
  123.                 //HAL_Delay(1000);
  124.                 delay_ms(1000);                        
  125.     /* USER CODE END WHILE */

  126.     /* USER CODE BEGIN 3 */
  127.   }
  128.   /* USER CODE END 3 */
  129. }



您需要登录后才可以回帖 登录 | 注册

本版积分规则

74

主题

609

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部