打印
[STM32F4]

STM32F4_时钟系统精讲

[复制链接]
手机看帖
扫描二维码
随时随地手机跟帖
21
3 SysTick定时器
3.1 为什么会有Systick定时器?
        SysTick定时器被捆绑在NVIC(中断优先级)中,用于产生SYSTICK异常(异常号:15)。在以前,大多操作系统需要一个硬件定时器来产生操作系统需要的滴答中断,作为整个系统的时基。例如,为多个任务许以不同数目的时间片,确保没有一个任务能霸占系统;或者把每个定时器周期的某个时间范围赐予特定的任务等,还有操作系统提供的各种定时功能,都与这个滴答定时器有关。因此,需要一个定时器来产生周期性的中断,而且最好还让用户程序不能随意访问它的寄存器,以维持操作系统“心跳”的节律。

3.2 SysTick定时器的作用
        SysTick是一个24位的倒计数定时器,计到0时,将从RELOAD寄存器中自动重装载定时初值。只要不把他在SysTick控制及状态寄存器中的使能位清除,就永不停歇,即使在睡眠模式下也能工作;

        SysTick定时器除了能服务于操作系统之外,还可以作为一个时钟,用于测量时间。但是需要注意:当处理器在调试期间被喊停时,SysTick定时器也会暂停运作;SysTick定时器常用来做延时,或者实时系统的心跳时钟;

        SysTick定时器能产生中断;SysTick中断的优先级也可以设置;

        定时器的作用简单来说就是我们在中断中定义一个时间,时间会从当前值Value--;当减到0以后,重装载寄存器会重装载到定义的值,也就是回到定义的数值,源源不断的进行减减;就像51单片机里面的定时器中断一样,我定义interruptCount=1000,1000--;执行中断的内容;if(interruptCount==0){interruptCount=1000;}源源不断的进行;

使用特权

评论回复
22
工程师犹饿死|  楼主 | 2023-7-25 01:16 | 只看该作者
3.3 SysTick定时器的寄存器
有4个寄存器控制SysTick定时器:

SysTick控制及状态寄存器:

COUNTFLAG:16位,读取寄存器,复位值0,如果在上次读取本寄存器后,SysTick已经数到了0,则该位为1。如果读取该位,该位将自动清0;

CLKSOURCE:2位,读写寄存器,复位值0,0=外部时钟源(STCLK),1=内核时钟(FCLK);外部时钟源是AHB总线时钟的1/8,内核时钟是HCLK时钟;

TICKINT:1位,读写寄存器,复位值0,1=SysTick倒数到0时产生SysTick异常请求;(确定我们是否要产生中断)

ENABLE:0位,读写寄存器,复位值0,SysTick定时器的使能位;(使能);

SysTick重装载数值寄存器:

RELOAD:23:0位段,读写寄存器,复位值0,当倒数至零时,将被重装载值;

SysTick当前数值寄存器:

CURRENT:23:0位段,读写寄存器,复位值0,读取时返回当前倒计数的值,写入时他则使之清0,同时还会清除在SysTick控制及状态寄存器中的COUNTFLAG标志;

SysTick校准数值寄存器:

NOREF:31位,读取寄存器,1=没有外部参考时钟(STCLK不可用),0=外部参考时钟可用;

SKEW:30位,读取寄存器,1=校准值不是准确的10ms,0=校准值是准确的10ms;

TENMS:23:0位,读写寄存器,10ms时间内倒计数的格数;

配置函数:SysTick_CLKSourceConfig();

SysTick_Config(uint32_t ticks);初始化SysTick,时钟为HCLK,并开启中断;

void SysTick_Handler(void);中断服务函数;

使用特权

评论回复
23
工程师犹饿死|  楼主 | 2023-7-25 01:17 | 只看该作者
4. IO引脚复用和映射
STM32F4有很多的内置外设,这些外设的外部引脚都是与GPIO复用的。也就是说,一个GPIO如果可以复用为内置外设的功能引脚,那么当这个GPIO作为内置外设使用的时候,就叫做复用。

ag. 引脚上标注  PC11——PC11/SPI3 MISO/U3 RX/U4 RX/SDIO D3/DCMI D4/I2S3ext SD   那么,PC11可以作为SPI3_MISO/U3_RX/U4_RX/SDIO_D3/DCMI_D4/I2S3ext_SD等复用功能输出;但是这么多的复用功能,如果同时的全部开启,系统会乱套;STM32F4的复用选择功能可以让PC11仅连接到某个特定的外设,防止相互之间的干扰;

STM32F4系列微控制器IO引脚通过一个复用器连接到内置外设或模块。该复用器一次只允许一个外设的复用功能(AF)连接到对应的IO口。这样可以确保共用同一个IO引脚的外设之间不会发生冲突。

我们配置相应的寄存器GPIOx_AFRL或者GPIOx_AFRH,让对应引脚通过复用器连接到对应的复用功能外设。GPIOx_AFRH控制的是一组IO口的高八位,GPIOx_AFRL控制的是一组IO口的低八位。

对于外设复用功能的配置,除了ADC和DAC要将IO配置为模拟通道之外其他外设功能一律 要配置为复用功能模式,这个配置是在IO口对应的GPIOx_MODER寄存器中配置的。同时要配置GPIOx_AFRH或者GPIOx_AFRL寄存器,将IO口通过复用器连接到所需要的复用功能对应的AFx。

使用特权

评论回复
24
工程师犹饿死|  楼主 | 2023-7-25 01:17 | 只看该作者
通过MCU微控制器的PA9和PA10引脚我们来介绍一下如何配置串口1为复用功能:

1. 首先打开IO时钟和复用功能时钟(切记:32不同于51的最大区别就是想要使用任何外设,必须先对外设所对应时钟的寄存器进行使能)

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); ---使能GPIOA时钟

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); ---使能USART1时钟

2. 在初始化GPIO口的寄存器GIPOx_MODER中将所需的IO配置为复用功能(ADC和DAC设置为模拟通道)

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;---复用功能

3. 配置GPIOx_AFRL或者GPIOx_AFRH寄存器,将IO连接到所需的AFx。

GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1); ---PA9复用为USART1

GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1); ---PA10复用为USART1

使用特权

评论回复
25
工程师犹饿死|  楼主 | 2023-7-25 01:17 | 只看该作者
5. NVIC中断优先级
CM4内核支持256个中断,其中包含了16个内核中断和240个外部中断,并且具有256级的可编程中断设置;开发板STM32F4xx系列共92个中断,包括10个内核中断和82个可屏蔽中断;其中最常用的就是82个可屏蔽中断;

5.1 中断寄存器
ISER[8]:

ISER全称是:Interrupt Set-Enable Registers,这是一个中断使能寄存器组。

CM4内核支持256个中断,在ISER中用8个32位寄存器来控制;要想使能某个中断,必须设置相应的ISER位为1,使该中断使能(但需要注意:这里也仅仅是使能,要想设置一个完整的中断还需要配合中断分组、屏蔽、IO口映射)

ICER[8]:

ICER全称是:Interrupt Clear-Enable Registers,是一个中断除能寄存器组。

除能---使能;正如其名,该寄存器和ISER作用正好相反,是用来清除某中断使能的;NVIC的这些寄存器都是写1有效的,写0是无效的。

ISPR[8]:

ISPR全称是:Interrupt Set-Pending Registers,是一个中断挂起控制寄存器组。

通过置1,将正在进行的中断挂起,而执行同级或更高级别的中断。

ICPR[8]:

ICPR全称是:Interrupt Clear-Pending Registers,是一个中断解挂控制寄存器组。

通过置1,可以将挂起的中断解挂;

IABR[8]:

IABR全称是:Interrupt Active Bit Registers,是一个中断激活标志位寄存器组。

对应位所代表的中断和ISER一样,如果为1,则表示该位所对应的中断正在被执行。这是一个只读寄存器,通过它可以知道当前在执行的中断是哪一个。在中断执行完了由硬件自动清零。

IP[240]:-----------NVIC寄存器中最重要的寄存器

IP全称是:Interrupt Priority Registers,是一个中断优先级控制的寄存器组。

使用特权

评论回复
26
工程师犹饿死|  楼主 | 2023-7-25 01:18 | 只看该作者
IP寄存器由240个8bit寄存器组成,8bit的高四位和低四位分别表示抢占优先级和响应优先级;抢占优先级在前;

规则:

1. 抢占优先级的级别高于响应优先级。而数值越小所代表的优先级就越高。

2. 如果两个中断的抢占优先级和响应优先级都是一样的话,看哪个中断先发生就先执行。

3. 高优先级的抢占优先级是可以打断正在进行的低强占优先级中断的。

ag. 假定设置中断优先级组为2,然后设置中断3(RTC_WKUP中断)的抢占优先级为2,响应优先级为1。中断6(外部中断0)的抢占优先级为3,响应优先级为0。中断7(外部中断1)的抢占优先级为2,响应优先级为0。那么这3个中断的优先级顺序为:中断7>中断3>中断6。 切记:抢占优先级数值越小,所代表的优先级就越高。

使用特权

评论回复
27
工程师犹饿死|  楼主 | 2023-7-25 01:18 | 只看该作者
5.2 NVIC中断优先级设置函数
1. 首先进行中断优先级分组:NVIC_PriorityGroupConfig

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  --- 根据上述表格,设置2位抢占优先级,2位响应优先级;

2. 中断初始化函数NVIC_Init

中断初始化函数和GPIO初始化函数是一样的,是用结构体来进行初始化的;其共有4个成员变量;

NVIC_InitTypeDef NVIC_InitStructure;---定义结构体变量NVIC_InitStructure

NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;---初始化的是哪一个中断(串口1)

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;---中断的抢占优先级别(抢占优先级1)

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;---中断的响应优先级别(响应优先级2)   子优先级就是响应优先级

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; ---中断通道是否使能(使能)

NVIC_Init(&NVIC_InitStructure); ---取地址,初始化NVIC寄存器

使用特权

评论回复
28
工程师犹饿死|  楼主 | 2023-7-25 01:18 | 只看该作者
5.3 中断优先级设置步骤
1. 系统运行开始的时候设置中断分组。确定组号,也就是确定抢占优先级和响应优先级的分配位数。调用函数为NVIC_PriorityGroupConfig();   main函数

2. 设置所用到的中断的中断优先级别。对每个中断调用函数为NVIC_Init();

使用特权

评论回复
29
Bblythe| | 2023-12-29 07:07 | 只看该作者

超过变量128后必须使用compact模式编译

使用特权

评论回复
30
周半梅| | 2023-12-29 09:03 | 只看该作者

一般要进行内存优化,尽量提高内存的使用效率

使用特权

评论回复
31
Pulitzer| | 2023-12-29 10:06 | 只看该作者

让尽可能多的变量使用直接寻址,提高速度

使用特权

评论回复
32
童雨竹| | 2023-12-29 12:02 | 只看该作者

访问时采用不同的指令,所以并不会占用 RAM 空间

使用特权

评论回复
33
Wordsworth| | 2023-12-29 13:05 | 只看该作者

极限情况下可以定义的变量可占 247 个字节

使用特权

评论回复
34
Clyde011| | 2023-12-29 14:08 | 只看该作者

128以上的某些地址为特殊寄存器使用,不能给程序用

使用特权

评论回复
35
公羊子丹| | 2023-12-29 15:01 | 只看该作者

51 单片机不使用线性编址

使用特权

评论回复
36
万图| | 2023-12-29 16:04 | 只看该作者

超出 120 个字节则必须用 idata 显式的指定为间接寻址

使用特权

评论回复
37
Uriah| | 2023-12-29 17:07 | 只看该作者

只要内存占用量不超过 256.0 就可以用 small 模式编译

使用特权

评论回复
38
帛灿灿| | 2023-12-29 19:03 | 只看该作者

small 模式下未指存储类型的变量默认为data型

使用特权

评论回复
39
xdvca| | 2024-7-31 23:42 | 只看该作者
SysTick 定时器是 Cortex-M 系列处理器的一部分,作为一个系统定时器来简化实时操作系统(RTOS)的实现。SysTick 定时器设计得相对简单且易于使用,目的是提供一个标准化的周期性中断源,以支持操作系统的任务调度和时间管理。

使用特权

评论回复
40
鹿鼎计| | 2024-8-1 14:07 | 只看该作者
超过120个字节必须用idata明确指定为间接寻址,

使用特权

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

本版积分规则