回答

收藏

cubemx hal 工程中 微秒延迟 delay_us

STMCU STMCU 2583 人阅读 | 0 人回复 | 2017-08-01

参考的正点原子的代码
测试平台
stm32f429i-disco
配了一个gpio


时钟


gpio


代码
  1. /* USER CODE BEGIN 0 */
  2. typedef uint8_t u8;
  3. typedef uint32_t u32;

  4. u8 fac_us;

  5. void delay_init(u8 SYSCLK)
  6. {
  7.     #if SYSTEM_SUPPORT_OS //?????? OS.
  8.         u32 reload;
  9.     #endif
  10.    
  11.     HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
  12.     //SysTick ??? HCLK
  13.     fac_us=SYSCLK; //?????? OS,fac_us ?????
  14.    
  15.     #if SYSTEM_SUPPORT_OS //?????? OS.
  16.         reload=SYSCLK; //???????? ??? K
  17.         reload*=1000000/delay_ostickspersec; //?? delay_ostickspersec ??????
  18.         //reload ? 24 ????,???:16777216,? 180M ?,?? 0.745s ??
  19.         fac_ms=1000/delay_ostickspersec; //?? OS ?????????
  20.         SysTick->CTRL|=SysTick_CTRL_TICKINT_Msk;//?? SYSTICK ??
  21.         SysTick->LOAD=reload; //? 1/OS_TICKS_PER_SEC ?????
  22.         SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk; //?? SYSTICK
  23.         #else
  24.     #endif
  25. }

  26. void delay_us(u32 nus)
  27. {
  28.     u32 ticks;
  29.     u32 told,tnow,tcnt=0;
  30.     u32 reload=SysTick->LOAD; //LOAD ??
  31.     ticks=nus*fac_us; //??????
  32.     told=SysTick->VAL; //?????????
  33.     while(1)
  34.     {
  35.         tnow=SysTick->VAL;
  36.         if(tnow!=told)
  37.         {
  38.             if(tnow<told)tcnt+=told-tnow;//???? SYSTICK ??????????.
  39.             else tcnt+=reload-tnow+told;
  40.             told=tnow;
  41.             if(tcnt>=ticks)break; //????/????????,???.
  42.         }
  43.     };
  44. }
  45. /* USER CODE END 0 */
复制代码
  1. int main(void)
  2. {

  3.   /* USER CODE BEGIN 1 */

  4.   /* USER CODE END 1 */

  5.   /* MCU Configuration----------------------------------------------------------*/

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

  8.   /* Configure the system clock */
  9.   SystemClock_Config();

  10.   /* Initialize all configured peripherals */
  11.   MX_GPIO_Init();

  12.   /* USER CODE BEGIN 2 */
  13.     delay_init(168);
  14.   /* USER CODE END 2 */

  15.   /* Infinite loop */
  16.   /* USER CODE BEGIN WHILE */
  17.   while (1)
  18.   {
  19.   /* USER CODE END WHILE */
  20.     HAL_GPIO_WritePin(GPIOF, GPIO_PIN_7, GPIO_PIN_SET);
  21.     delay_us(50);
  22.     HAL_GPIO_WritePin(GPIOF, GPIO_PIN_7, GPIO_PIN_RESET);
  23.     delay_us(50);
  24.   /* USER CODE BEGIN 3 */

  25.   }
  26.   /* USER CODE END 3 */

  27. }
复制代码
实际测试, 函数调用能带来几百ns的误差.
转自网络
关注下面的标签,发现更多相似文章
分享到:
回复

使用道具 举报

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

本版积分规则

关闭

站长推荐上一条 /3 下一条