爱板网论坛

查看: 197|回复: 0

[基础] cubemx hal 工程中 微秒延迟 delay_us

[复制链接]

144

主题

1

好友

2195

积分

进士

Rank: 5Rank: 5

  • TA的每日心情
    开心
    2014-2-20 10:23
  • 签到天数: 45 天

    连续签到: 1 天

    [LV.5]常住居民I

    发表于 2017-8-1 15:50:37 |显示全部楼层
    参考的正点原子的代码
    测试平台
    stm32f429i-disco
    配了一个gpio
    615864-20160804112558387-1358330656.png


    时钟
    615864-20160804112614590-237081536.png


    gpio
    615864-20160804112636012-987493565.png


    代码
    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的误差.
    转自网络
    回复

    使用道具 举报

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

    关闭

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

    手机版|爱板网 |网站地图  

    GMT+8, 2017-12-18 03:25 , Processed in 0.159146 second(s), 13 queries , Memcache On.

    苏公网安备 32059002001056号

    Powered by Discuz!

    回顶部