STM32-05-STM32_SYSTEM文件夹

发布时间:2024年01月10日

STM32 SYSTEM文件夹介绍

1. delay文件夹

  • delay文件夹中的文件delay.cdelay.h用来实现系统的延时功能,其包括7个函数:

    	//仅在操作系统的支持下使用
    void delay_osschedlock(void);
    void delay_osschedunlock(void);
    void delay_ostimedly(uint32_t ticks);
    void SysTick_Handler(void);
    
    //无论是否有操作系统,都要使用
    void delay_init(uint16_t sysclk);
    void delay_us(uint32_t nus);
    void delay_ms(uint16_t nms);
    

    delay编程思想:CM3内核处理器,内部包含一个SysTick定时器,SysTick是一个24位的向下递减的计数定时器,当计数值减到0时,将从RELOAD寄存器中自动重装载定时初值,开始新一轮计数。只要不把它在SysTick控制及状态寄存器中的使能位清除,就不会停止。我们利用STM32的内部SysTick来实现延时的,这样即不占用中断,也不占用系统定时器。

  • 使用的寄存器

    • SysTick->CTRL寄存器

    在这里插入图片描述

    • SysTick->LOAD寄存器

    在这里插入图片描述

    • SysTick->VAL寄存器

    在这里插入图片描述

  • delay_us函数

    void delay_us(uint32_t nus)
    {
         uint32_t temp;
         SysTick->LOAD = nus * g_fac_us; //向LOAD寄存器的RELOAD位装载初始值
         SysTick->VAL = 0x00; //清空VAL寄存器的CURRENT位,使计数器从0开始
         SysTick->CTRL |= 1 << 0 ; //使能CTRL寄存器的ENABLE位,开始计数
         do
         {
         	temp = SysTick->CTRL;   //获取CTRL寄存器的各个位的状态
         } 
         while ((temp & 0x01) &&!(temp & (1 << 16))); //判断使能位是否为1且通过COUNTFLAG判断是否数到0
         SysTick->CTRL &= ~(1 << 0) ; /* 关闭 SYSTICK */
         SysTick->VAL = 0X00; /* 清空计数器 */
    }
    
  • delay_ms函数

    void delay_ms(uint16_t nms)
    {
        /*这里用 1000,是考虑到可能有超频应用,如 128Mhz 时,delay_us 最大只能延时 1048576us 左右*/
         uint32_t repeat = nms / 1000;
         uint32_t remain = nms % 1000;
         while (repeat)
         {
             delay_us(1000 * 1000); /* 利用 delay_us 实现 1000ms 延时 */
             repeat--;
         }
         if (remain)
         {
             delay_us(remain * 1000); /* 利用 delay_us, 把尾数延时(remain ms)给做了 */
         }
    }
    

    函数接受一个参数 nms,表示需要延时的毫秒数。函数内部首先将毫秒数分解为整秒数剩余的毫秒数。接着使用一个循环,每次循环调用 delay_us 函数来实现 1000 毫秒(1秒)的延时,直到整秒数全部延时完成。最后,如果有剩余的毫秒数,再调用 delay_us 函数来延时剩余的时间。 这样处理使delay_us函数调用次数减少,计数会更加精准。

2. sys文件夹

  • sys文件夹包含sys.c和sys.h两个文件,在sys.c包含以下函数:

    //函数声明
    void sys_nvic_set_vector_table(uint32_t baseaddr, uint32_t offset); //设置中断向量表偏移地址
    void sys_standby(void); //进入待机模式
    void sys_soft_reset(void); //系统软复位
    uint8_t sys_stm32_clock_init(uint32_t plln);  //系统时钟初始化函数
    
    

声明:资料来源(战舰STM32F103ZET6开发板资源包)

  1. Cortex-M3权威指南(中文).pdf
  2. STM32F10xxx参考手册_V10(中文版).pdf
  3. STM32F103 战舰开发指南V1.3.pdf
  4. STM32F103ZET6(中文版).pdf
  5. 战舰V4 硬件参考手册_V1.0.pdf
文章来源:https://blog.csdn.net/Lshuangye/article/details/135505448
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。