打印
[方案相关]

从滴答时钟了解STM32库操作

[复制链接]
1479|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
l63t89|  楼主 | 2022-4-30 18:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
STM32的库函数操作给设计开发人员带来了诸多的便利,开发人员不必十分了解STM32的内部寄存器及硬件机制,只要有C语言基础,即可完成单片机的开发,缩短了开发周期,降低了开发难度,因而备受工程师喜爱。今天areak为大家讲讲从滴答时钟了解STM32库操作。

  基于库函数的开发模式,与基于API(Application Programming Interface)的软件开发有着异曲同工之处,程序员通过调用 API 函数对应用程序进行开发,而又无需访问源码,或理解内部工作机制的细节,可以减轻编程任务。STM32的基于函数库的开发模式也是一样的道理,因此对于有单片机开发经验的工程师来说,学习STM32,很容易就可以上手。

  虽然可以不考虑库函数内部的细节,不考虑如何实现硬件寄存器的配置,但是深入了解库函数对于提高编程能力是很有好处的,下面以系统滴答时钟为例,详解其工作流程。

  滴答时钟是STM32内部的一个24位定时器,其操作相对简单,配置寄存器较少。大体的工作流程是这样的,定时器首先要有时钟源,时钟源配置好之后,设置定时时间,然后定时器启动,当定时时间到时,置位标志位,重载定时器初值,系统可采用查询标志位和中断两种工作方式做出相应的响应,下面来看看程序如何实现延时功能。

使用特权

评论回复
沙发
l63t89|  楼主 | 2022-4-30 18:26 | 只看该作者
//初始化配置函数

Void Delay_Init()

{

       RCC_ClocksTypeDef RCC_ClocksStatus;

    RCC_GetClocksFreq(&RCC_ClocksStatus);//获取时钟频率

SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);//时钟源配置为系统主时钟频率/8

       SysTick_ITConfig(DISABLE);//不使能中断,采用查询方式

delay_fac_us = RCC_ClocksStatus.HCLK_Frequency / 8000000;// 1us的定时初值

}



//实现延时Nus的延时功能

void Delay_us(u32 Nus)

{

SysTick_SetReload(delay_fac_us * Nus);//载入初值

SysTick_CounterCmd(SysTick_Counter_Clear);//计数器清零

SysTick_CounterCmd(SysTick_Counter_Enable);//计数器开始计数

do

{

     Status = SysTick_GetFlagStatus(SysTick_FLAG_COUNT);

}while (Status != SET);//不断查询标志位,当载入初值与计数器相等时,标志位置位。

SysTick_CounterCmd(SysTick_Counter_Disable);//关闭计数器

SysTick_CounterCmd(SysTick_Counter_Clear);//清零计数器

}

//实现闪灯

Delay_Init();

While(1)

{

LED1(ON);

       Delay_us(500000);//延时500ms

       LED1(OFF);

}

  下面来看看库函数如何实现相应的寄存器配置。

void SysTick_ITConfig(FunctionalState NewState)

{

  /* Check the parameters */

  assert_param(IS_FUNCTIONAL_STATE(NewState));



  if (NewState != DISABLE)

  {

    SysTick->CTRL |= CTRL_TICKINT_Set;

  }

  else

  {

    SysTick->CTRL &= CTRL_TICKINT_Reset;

  }

}

使用特权

评论回复
板凳
l63t89|  楼主 | 2022-4-30 18:27 | 只看该作者
 这个函数的作用是配置寄存器开启/关闭中断,FunctionalState是自定义的数据类型,是一个枚举类型,typedef enum {DISABLE = 0, ENABLE = !DISABLE} FunctionalState;

  枚举类型是一种基本数据类型而不是构造类型,它用于声明一组命名的常数,将变量的值一一列出来,变量的值只限于列举出来的值的范围内,因此当一个变量有几种可能的取值时,可以将它定义为枚举类型。

使用特权

评论回复
地板
l63t89|  楼主 | 2022-4-30 18:28 | 只看该作者
 assert_param(IS_FUNCTIONAL_STATE(NewState));

  这句话的作用是判断参数NewState的值是否正确,如果发现参数出错,它会调用函数assert_failed()向程序员报告错误。

void assert_failed(uint8_t* file, uint32_t line)

{

while (1)

{}

}

使用特权

评论回复
5
cyclefly| | 2022-5-7 17:47 | 只看该作者
了解不多,略懂

使用特权

评论回复
6
duo点| | 2022-5-9 16:00 | 只看该作者
看了一下,表示懂得不多

使用特权

评论回复
7
fuqinyyy| | 2022-5-9 19:52 | 只看该作者
这是小华半导体板块

使用特权

评论回复
8
tpgf| | 2022-6-1 11:15 | 只看该作者
比较方便新手工作

使用特权

评论回复
9
aoyi| | 2022-6-1 11:34 | 只看该作者
非常基础的时钟

使用特权

评论回复
10
nawu| | 2022-6-1 11:54 | 只看该作者
这是一个非常简单的定时器

使用特权

评论回复
11
zljiu| | 2022-6-1 12:03 | 只看该作者
其实用习惯了很方便的

使用特权

评论回复
12
gwsan| | 2022-6-1 12:12 | 只看该作者
滴答时钟应用的多吗

使用特权

评论回复
13
tfqi| | 2022-6-1 12:20 | 只看该作者
每次都需要判定状态值吗

使用特权

评论回复
14
caigang13| | 2022-6-1 19:34 | 只看该作者
发错板块了吧

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

90

主题

798

帖子

1

粉丝