T: 时钟周期,最小重复的信号单元的时间长度。
f: 频率Hz 单位时间内(电平)完成周期性变化的次数
同步信号:大部分时钟逻辑电路需要时钟信号来同步
一个解决方案:
(1)T > 2 * delt_t (delt_t 电路单元中最大延时)T为clock信号的周期,50%
(2)输入信号只能在clock低电平(无效)改变,在clock的高电平时保持稳定
“晶振”: 产生周期性的信号。8M 但是MPU的频率要求高168M,怎么办?
“分频/倍频”电路
分频: 把输入频率变小 **倍频:**把输入频率变大
PLL: 锁相环 技术
在STM32F4中,有5个最重要的时钟源,后三个是主要的时钟源。
LSI: Low Speed Internal 内部低速时钟
LSE: Low Speed External 外部低速时钟
HSI: High Speed Internal 内部高速时钟
HSE: High Speed External 外部高速时钟
PLLCLK 其中PLL实际是分为两个时钟源,分别为主PLL和专用PLL
在开发板上面, HSE_VALUE = 8M #define HSE_VALUE ((uint32_t)8000000)
分频器PLL_M=8,倍频器倍频系数PLL_N=336,分频器分频系数PLL_P=2,
PLL=8MHzN/ (MP)=8MHz336 /(82) = 168MHz(主PLL)
Cortex M4 F407主频 最高可达 168M Hz
用户可通过多个预分频器配置AHB总线、高速APB2总线和低速APB1总线的频率。
AHB 域 的最大频率为 168 MHz。AHB prescaler
M4 clock = AHB BUS clock = 168M
低速 APB1 域 的最大允许频率为 42 MHz。
APB1 BUS clock = AHB BUS Clock/(APB1 prescaler)= 168M / 4 = 42M
高速 APB2 域 的最大允许频率为 84MHz。
APB2 bus clock = AHB BUS Clock/(APB2 prescaler) = 168M / 2 = 84M
注意:STM32F405xx/07xx 和 STM32F415xx/17xx 的定时器时钟频率由硬件自动设置。
分为两种情况:
(1)如果 APB 预分频器为 1,定时器时钟频率等于 APB 域的频率。
(2) 否则,等于 APB 域的频率的两倍 (×2)。
例子:
TIM13在APB1总线上:
APB1 prescaler = 4
APB1 BUS clock = AHB BUS clock / APB1 prescaler= 168M / 4= 42M
定时器:用来定时的器件。
在STM32上,定时器由三个部分组成
(1)时基单元:Time Base Unit定时器的基本部件。
“计数器”可以设置为从设定值递减到0,也可以设置从0按照递增到设定值。然后产生一个溢出事件/中断,从而达到定时的功能。
例子:假设一个定时器TM的时钟频率f,设定的计数值为N,按照递减的方式计数,每隔(1/f)s就 -1 ,减到零时产生一个中断,时间为:(N+1)*(1/f)s
任务:延时2秒 168M 84M 168000000-1 84000000-1
核心部件:“计数器”,内部含3个寄存器
TIMx_ARR: Auto Reload Register 自动加载寄存器 <- -N
TIMx_CNT: Counter 计数器
TIMx_PSC: PreSCaler 时钟预分频
(2)输入捕获单元: 可以对一个或多个输入信号进行处理
有些定时器没有。
可以捕获一个或多个输入信号(看你这个定时器有几个输入通道 CHx_IN)
有什么用呢?如: 可以计算输入信号的频率
输入信号经过“输入捕获阶段”(数字滤波、多路复用、预分频等等),到信号检测,当检测到需要的信号状态变化时(上升沿/下降沿),就会把定时器时基单元中计数器的值,锁定到“捕获/比较寄存器”这样,就可能根据预先设定的定时器的参数(时钟频率,N值等等),就可以算出从开始到捕获这个信号状态的这一段的时间。
(3)输出比较单元: 可以输出一个或多个信号
有些定时器没有。
定时器还可以输出一个电平、并且可以根据“比较寄存器”的值,翻转电平的状态。
如: CCR: Capture Compare Register捕获/比较寄存器
定时器的第(2)输入捕获单元 和第(3) 输出比较单元 不同时用。
CNT >= CCR 输出一个高电平
CNT < CCR 输出一个低电平
作用:如PWM方波(实例中用)
SysTick 系统定时器,作为整个系统的基本的时间单元。
所有Cortex M3/M4中都会内置于NVIC一个SysTick的定时器。这个定时器只有一个时基单元。并且在溢出时,会产生一个SysTick异常(中断)。
NVIC exception type #15. decrement 24-bit
它被内置于NVIC中,它能够产生一个SysTick异常(异常类型 #15).这个SysTick定时器是一个简单的24bits的递减定时器,它可以运行在处理器的时钟频率上,也可以运行在一个外部的时钟频率上(通常在片上的时钟源)
SysTick控制及状态寄存器(地址:0xE000_E010)
[0]:SYSTICK使能1/禁止0
[1]:计数中断使能1/禁止0
[2]:使用系统内核时钟168M 1 外部时钟源 0
[16]:如果在上次读取本寄存器后,SysTick 已经数到了0,则该位为 1。如果读取该位,该位将自动清零。
SysTick重装载数值寄存器(地址:0xE000_E014)
[23:0]:重载计数值,当倒数至零时,将被重装载的值。
SysTick当前数值寄存器(地址:0xE000_E018)
[23:0]:当前计数值,读取时返回当前倒计数的值,写它则使之清零
只有时基单元
无输入输出引脚
计数器只有16bit,而且只支持递增模式
TIM2~TIM5
16bits(TIM3,TIM4)或32bits(TIM2,TIM5)计数器,可以配置为递增,递减,先递增后递减(0->N->0)的模式,多达4个独立通道,可用于:输入捕获、输出比较、PWM生成(边沿或中心对齐模式)、单脉冲模式输出
TIM9~TIM14
16bits自动加载递增计数器,2个独立通道,可用于:输入捕获、输出比较、PWM生成(边沿或中心对齐模式)、单脉冲模式输出
16bits计数器,可以可以配置为递增,递减,先递增后递减(0->N->0)的模式,多达4个独立通道,可用于:输入捕获、输出比较、PWM生成(边沿或中心对齐模式)、单脉冲模式输出
“高级”:重复计数器(TIMx_RCR) : Repeation Counter Register
如果使用重复计数,则当计数器重复溢出的次数达到设定的重复计数器的值+1时,才会产生溢出事件/中断。
如果不用重复计数器,在每次计数器溢出时都会产生事件/中断。这个时候,和通用定时器没有区别。
问题引入
“死机”:用户任何操作都没有反应,必须掉电重启
掉电重启 —> 当你的程序出现"死机"/"跑飞了"这种情况时
看门狗”复位:用于程序"死机、跑飞"时,自动复位系统。
看门狗本质就是一个定时器,这个定时器有一个输出引脚,直接连到cpu的复位引脚上去。
看门狗的操作
配置好后,就会从一个值N - 0 => cpu复位。
(1)当你的程序"死机、跑飞了", 看门狗 减至0时,就会复位系统
(2)当你的程序正常情况下,看门狗 减至0时,也会复位系统 所以----当你程序正常情况,就要周期性地“喂狗”把定时器的值,赋值一个比较大的值。让他不要减至0!!!
怎么喂狗:
Thread Mode下(用户程序的业务处理逻辑中),周期性的喂狗。
根据蜂鸣器原理图可以发现,蜂鸣器可复用为 TIM13。同时根据总线地址表查询 TIM13 在 APB1 上。 有 BEEP—PF8—TIM13 在初始化的时候,要使用复用模式,控制蜂鸣器的发声频率,即可控制音调。
typedef struct
{
uint16_t TIM_Prescaler; /*!< Specifies the prescaler value used to divide the TIM clock.
This parameter can be a number between 0x0000 and 0xFFFF */
uint16_t TIM_CounterMode; /*!< Specifies the counter mode.
This parameter can be a value of @ref TIM_Counter_Mode */
uint32_t TIM_Period; /*!< Specifies the period value to be loaded into the active
Auto-Reload Register at the next update event.
This parameter must be a number between 0x0000 and 0xFFFF. */
uint16_t TIM_ClockDivision; /*!< Specifies the clock division.
This parameter can be a value of @ref TIM_Clock_Division_CKD */
uint8_t TIM_RepetitionCounter; /*!< Specifies the repetition counter value. Each time the RCR downcounter
reaches zero, an update event is generated and counting restarts
from the RCR value (N).
This means in PWM mode that (N+1) corresponds to:
- the number of PWM periods in edge-aligned mode
- the number of half PWM period in center-aligned mode
This parameter must be a number between 0x00 and 0xFF.
@note This parameter is valid only for TIM1 and TIM8. */
} TIM_TimeBaseInitTypeDef;
TIM_Prescaler:设置预分频的数值
TIM_CLK: 计数器(定时器)的时钟
TIM_CLK = Fin(定时器的输入时钟频率)/ (TIM_Prescaler + 1)
if APBx prescaler == 1
则: Fin = APBx BUS clock
else
Fin = APBx Bus clock * 2
TIM13 的计数器时钟:
APB1 BUS clock = AHB BUS Clock/(APB1 prescaler)= 168M / 4 = 42M Fin = 42M × 2 = 84M
假设 Fin=84000000/8400=10Khz
TIM_Prescaler = 8399 (故在初始化时设置预分频为 8399)
TIM_CounterMode
#define TIM_CounterMode_Up ((uint16_t)0x0000)
#define TIM_CounterMode_Down ((uint16_t)0x0010)
#define TIM_CounterMode_CenterAligned1 ((uint16_t)0x0020)
#define TIM_CounterMode_CenterAligned2 ((uint16_t)0x0040)
#define TIM_CounterMode_CenterAligned3 ((uint16_t)0x0060)
指定计数器模式:递增、递减、先递增后递减
定时器输入出通道/输入通道配置
typedef struct
{
uint16_t TIM_OCMode; /*!< Specifies the TIM mode.
This parameter can be a value of @ref TIM_Output_Compare_and_PWM_modes */
uint16_t TIM_OutputState; /*!< Specifies the TIM Output Compare state.
This parameter can be a value of @ref TIM_Output_Compare_State */
uint16_t TIM_OutputNState; /*!< Specifies the TIM complementary Output Compare state.
This parameter can be a value of @ref TIM_Output_Compare_N_State
@note This parameter is valid only for TIM1 and TIM8. */
uint32_t TIM_Pulse; /*!< Specifies the pulse value to be loaded into the Capture Compare Register.
This parameter can be a number between 0x0000 and 0xFFFF */
uint16_t TIM_OCPolarity; /*!< Specifies the output polarity.
This parameter can be a value of @ref TIM_Output_Compare_Polarity */
uint16_t TIM_OCNPolarity; /*!< Specifies the complementary output polarity.
This parameter can be a value of @ref TIM_Output_Compare_N_Polarity
@note This parameter is valid only for TIM1 and TIM8. */
uint16_t TIM_OCIdleState; /*!< Specifies the TIM Output Compare pin state during Idle state.
This parameter can be a value of @ref TIM_Output_Compare_Idle_State
@note This parameter is valid only for TIM1 and TIM8. */
uint16_t TIM_OCNIdleState; /*!< Specifies the TIM Output Compare pin state during Idle state.
This parameter can be a value of @ref TIM_Output_Compare_N_Idle_State
@note This parameter is valid only for TIM1 and TIM8. */
} TIM_OCInitTypeDef;
TIM_OCMode:指定输出通道的模式
#define TIM_OCMode_Timing ((uint16_t)0x0000)
#define TIM_OCMode_Active ((uint16_t)0x0010)
#define TIM_OCMode_Inactive ((uint16_t)0x0020)
#define TIM_OCMode_Toggle ((uint16_t)0x0030)
#define TIM_OCMode_PWM1 ((uint16_t)0x0060)
#define TIM_OCMode_PWM2 ((uint16_t)0x0070)
其中 TIM_OCMode_PWM1:当 TIMx_CNT<TIMEx_CCRn 时,输出高电平,否则输出低电压
占空比:在一个时钟周期中有效电平(高电平)所占的比值 选择 PWM1 占空比一目了然
TIM_OutputState: 设置为输出信号 TIM_OutputState_Enable
TIM_Pulse: 指定要比较的值(每个板子不一样,根据具体情况调参) (占空比系数)
TIM_OCPolarity: 指定输出极性。本实验中设置高电平为有效电平
#ifndef _BEEP_H_
#define _BEEP_H_
#include "stm32f4xx.h"
#include "systick.h"
#include "key.h"
void beep_init(int);
void music_play(void);
#define L1 10000/131-1
#define L2 10000/147-1
#define L3 10000/165-1
#define L4 10000/175-1
#define L5 10000/196-1
#define L6 10000/221-1
#define L7 10000/248-1
#define M1 10000/262-1
#define M2 10000/294-1
#define M3 10000/330-1
#define M4 10000/350-1
#define M5 10000/393-1
#define M6 10000/441-1
#define M7 10000/495-1
#define H1 10000/589-1
#define H2 10000/661-1
#define H3 10000/700-1
#define H4 10000/786-1
#define H5 10000/882-1
#define H6 10000/990-1
#define H7 10000/1112-1
#define clap 400
#endif
#include "beep.h"
#include "systick.h"
extern u8 status;
//蜜雪冰城主题曲
int music[]={
M3, M5, M5, M6, M5, M3, M1, M1, M2, M3, M3, M2, M1, M2, 0,
M3, M5, M5, M6, M5, M3, M1, M1, M2, M3, M3, M2, M2, M1, 0,
M4, M4, M4, M6, M5, M5, M3, M2, 0,
M3, M5, M5, M6, M5, M3, M1, M1, M2, M3, M3, M2, M2, M1
};
float time[]={
0.5, 0.5, 0.75, 0.25, 0.5, 0.5, 0.5, 0.25, 0.25, 0.5, 0.5, 0.5, 0.5, 1, 1,
0.5, 0.5, 0.75, 0.25, 0.5, 0.5, 0.5, 0.25, 0.25, 0.5, 0.5, 0.5, 0.5, 1, 1,
1, 1, 0.5, 1.5, 1, 0.5, 0.5, 1, 1,
0.5, 0.5, 0.75, 0.25, 0.5, 0.5, 0.5, 0.25, 0.25, 0.5, 0.5, 0.5, 0.5, 1, 1
};
void music_play()
{
for(int i=0; i<sizeof(music)/4 ;i++){
if(status == 1 && music[i] != 0){
//使得歌曲能够随时停止
beep_init(music[i]);
Delay_ms((int)(clap*time[i]));
TIM_ARRPreloadConfig(TIM13, DISABLE);
TIM_Cmd(TIM13, DISABLE);
}
}
}
void beep_init(int n)
{
//0.clk enable PF8 GPIOF-AHB1
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM13, ENABLE);
//1.GPIOF8 MODE-AF--TIM13
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Mode =GPIO_Mode_AF;
GPIO_InitStruct.GPIO_OType =GPIO_OType_PP;
GPIO_InitStruct.GPIO_Pin =GPIO_Pin_8;
GPIO_InitStruct.GPIO_PuPd =GPIO_PuPd_NOPULL;
GPIO_InitStruct.GPIO_Speed =GPIO_Speed_50MHz;
GPIO_Init(GPIOF, &GPIO_InitStruct);
GPIO_PinAFConfig(GPIOF,GPIO_PinSource8, GPIO_AF_TIM13);
//2.TIM13-TIMEBASE
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
TIM_TimeBaseInitStruct.TIM_Prescaler =8399;//84M---10K
TIM_TimeBaseInitStruct.TIM_CounterMode =TIM_CounterMode_Down;
TIM_TimeBaseInitStruct.TIM_Period =n;
TIM_TimeBaseInit(TIM13, &TIM_TimeBaseInitStruct);
//3.TIM13 OUT CH1---1
TIM_OCInitTypeDef TIM_OCInitStruct;
TIM_OCInitStruct.TIM_OCMode =TIM_OCMode_PWM1;
TIM_OCInitStruct.TIM_OutputState =TIM_OutputState_Enable;
TIM_OCInitStruct.TIM_OCPolarity =TIM_OCPolarity_High;
TIM_OCInitStruct.TIM_Pulse =0.3*n;
TIM_OC1Init(TIM13, &TIM_OCInitStruct);
TIM_OC1PreloadConfig(TIM13, TIM_OCPreload_Enable);
//3.TIM13-ENABLE
TIM_ARRPreloadConfig(TIM13, ENABLE);
TIM_Cmd(TIM13, ENABLE);
}
int main(void)
{
key_init();
while (1)
{
if(status==1)
{
music_play();
}
}
}
第一部分 嵌入式系统概述
第二部分 ARM指令系统
第三部分 通用 I/O (GPIO)
第四部分 中断机制
第五部分 时钟定时器
下面我们讲提交表单以及控制器接收数据通常使用的四种方式1.将数据获取并提交到控制器中,name属性是必不可少的如上form表单中的input元素,name属性决定了一个提交上去的数据,表单提交时,【name:该input的value值】将作为表单其中一个数据提交到控制器。2.设定好需要传输的数据相应元素的name值,获取该表单,(1)设置提交方式(默认提交方式为get),可在表单上通过method属性设定,也可以在JS中设置,看个人喜好;(2)设定提交路径,即将数据提交到控制器的某个方法中使
这是台大李宏毅教师Machine Learning 2017Fall课程 关于讲述卷积神经网络 Convolutional Neural Network内容的部分。课程主页如下:台大Machine Learning 2017Fall 感兴趣的可以去学习下,主页提供了教学ppt和教学视频。首先有这样一个问题,为什么CNN非常适用于图像识别?这里给出了3个解释。1.
(点击上方蓝字,快速关注我们)转自:开源中国、solidot、cnBeta、腾讯科技等0、3 月全球数据库排名:PostgreSQL 再迎暴涨DB-Engines 发布了...
【摘要】这一节我们对 SQL 和集算器 SPL 在序列值查找、分栏、动态行、动态列、指定序排序等方面进行了对比,如果需要了解更多,请前往乾学院:SQL 难点解决:特殊示例!1、 列出中文人口和英文人口均达到 1% 的国家代码MySQL8:select countrycode from world.countrylanguagewhere languag...
问题虚拟机中使用Ubuntu设置桥接模式配置1.ubuntu-20.04.4-desktop-amd64.iso(老版本与新版本不一样哈)2.VMware Workstation 12 Pro步骤1.虚拟网络编辑器可以看到桥接模式,可以自己选择网卡,也可以选择自动(这里选择自动,我的网络是不会经常变动的)2.将Ubuntu系统的网络适配器选桥接模式3.查看真机的IP地址(192.168.43.241)在cmd里面输入ipconfig4.在虚拟机里面修改配置文件打开
超图|CESIUM - 集成echarts图表
Linux 系统服务有时也称为守护程序,是在Linux启动时自动加载并在Linux退出时自动停止的系统任务。在Linux 启动过程中我们可以看得很多starting … 提示信息,该信息表示正在启动系统服务,而在Linux 退出时,我们也能够看到相应的Stopping … 信息,表示系统服务正在停止。Linux自身有许多系统任务如network 服务用于支持网络连接等。
1、min-height: calc(100vh - 0rem);2、width: calc(100% - 0.4rem);3、width: calc(100vw - 0.4rem)
什么是Python语言?Python是一种计算机程序设计语言。你可能已经听说过很多种流行的编程语言,比如非常难学的C语言,非常流行的Java语言,适合初学者的Basic语言,适合网页编程的JavaScript语言等等。那Python是一种什么语言?首先,我们普及一下编程语言的基础知识。用任何编程语言来开发程序,都是为了让计算机干活,比如下载一个MP3,编写一个文档等等,而计算机干活的CPU只认识机...
自动检测BeanSpring提供 &lt;context:component-scan&gt; 元素,除了完成与 &lt;context:annotation-config&gt; 一样的工作,还可以自动检测和定义Bean。有了 &lt;context:component-scan&gt; 元素,可以不使用 &lt;bean&gt; 元素,Spring应用中的大多数Bean能实现定义和装配。...
1、打开 ~/kernel/arch/arm64/configs/rockchip_defconfig 文件,然后屏蔽如下“#CONFIG_FIQ_DEBUGGER=y#CONFIG_FIQ_DEBUGGER_NO_SLEEP=y#CONFIG_FIQ_DEBUGGER_CONSOLE=y#CONFIG_FIQ_DEBUGGER_CONSOLE_DEFAULT_ENABLE=y#CONFIG_FIQ_DEBUGGER_TRUST_ZONE=y”2、编译源码就可以了,这样修改以后uboot还是
tf.data.Dataset.from_tensor_slices该函数是dataset核心函数之一,它的作用是把给定的元组、列表和张量等数据进行特征切片。切片的范围是从最外层维度开始的。如果有多个特征进行组合,那么一次切片是把每个组合的最外维度的数据切开,分成一组一组的。假设我们现在有两组数据,分别是特征和标签,为了简化说明问题,我们假设每两个特征对应一个标签。之后把特征和标签组合成一个tuple,那么我们的想法是让每个标签都恰好对应2个特征,而且像直接切片,比如:[f11, f12] [t1]。