精华内容
下载资源
问答
  • 为什么 STM32有多个时钟源呢? 我们在学习51单片机时,其最小系统必晶振电路,这块电路就是单片机的时钟来源,晶振的振荡频率直接影响单片机的处理速度。STM32相比51单片机就复杂得多,不仅是外设非常多,就连...

    时钟是处理器运行的基础,时钟信号推动处理器内各个部分执行相应的指令。时钟系统就是CPU的脉搏,决定CPU速率,像人的心跳一样 只有有了心跳,人才能做其他的事情,而单片机有了时钟,才能够运行执行指令,才能够做其他的处理 (点灯,串口,ADC),时钟的重要性不言而喻。

    为什么 STM32 要有多个时钟源呢?

    我们在学习51单片机时,其最小系统必有晶振电路,这块电路就是单片机的时钟来源,晶振的振荡频率直接影响单片机的处理速度。STM32相比51单片机就复杂得多,不仅是外设非常多,就连时钟来源就有四个。但我们实际使用的时候只会用到有限的几个外设,使用任何外设都需要时钟才能启动,但并不是所有的外设都需要系统时钟那么高的频率,为了兼容不同速度的设备,有些高速,有些低速,如果都用高速时钟,势必造成浪费,而且,同一个电路,时钟越快功耗越快,同时抗电磁干扰能力也就越弱,所以较为复杂的MCU都是采用多时钟源的方法来解决这些问题,因此便有了STM32的时钟系统和时钟树。



    在这里插入图片描述

    1 STM32时钟硬件电路

    STM32三个不同的时钟源可以用来驱动系统时钟(SYSCLK):

    ● HSI晶振时钟(高速内部时钟信号)
    ● HSE晶振时钟(高速外部时钟信号)
    ● PLL时钟

    STM32有两个二级时钟源:

    ● 40kHz的低速内部RC,它可以驱动独立看门狗,还可选择地通过程序选择驱动RTC。 RTC用于从停机/待机模式下自动唤醒系统。
    ● 32.768kHz的低速外部晶振,可选择它用来驱动RTC(RTCCLK)。
    每个时钟源在不使用时都可以单独被打开或关闭,这样就可以优化系统功耗。

    在这里插入图片描述

    图1时钟树

    当使用HSI作为PLL时钟的输入时,所能达到的最大系统时钟为64MHz。

    1.1 HSE时钟

    高速外部时钟信号(HSE)由以下两种时钟源产生:
    ● HSE外部晶体 / 陶瓷 谐振器(见图2(a))
    ● HSE用户外部时钟(见图2(b))
    在这里插入图片描述

    (a)外部时钟 (b)晶振时钟

    图2 HSE时钟

    1.外部时钟源(HSE旁路)
    在这种模式下,必须提供一个外部时钟源。它的频率可高达25MHz。外部时钟信号(占空比为50%的方波、 正弦波或三角波)必须连到OSC_IN引脚,同时保证OSC_OUT引脚悬空,见图2(a)。这个外部时钟源是指从其他处理器等引入的时钟源,STM32的demo板就是使用的这种方式,主控器MCU的外部时钟源来自ST Link处理器提供的时钟信号。

    2.外部晶体 / 陶瓷谐振器(HSE晶体)
    这个4~16MHz的外部晶振的优点在于能产生非常精确的主时钟。 图3显示了它需要的相关硬件配置。谐振器和负载电容需要尽可能近地靠近振荡器的引脚,以减小输出失真和启动稳定时间。负载电容值必须根据选定的晶振进行调节。这种方式也是我们常用的方式,具体电路如下所示。
    在这里插入图片描述

    图3外部晶体电路图

    1.2 LSE时钟

    低速外部时钟源(LSE)可以由两个可能的时钟源来产生:

    ● LSE外部晶体 / 陶瓷谐振器(见图4(a))
    ● LSE用户外部时钟(见图4(b))

    1.外部源(LSE 旁路)
    在这种模式下,必须提供一个外部时钟源。它的频率必须为32.768kHz。外部信号(占空比为50%的方波、 正弦波或三角波)必须连到OSC32_IN引脚,同时保证OSC_OUT引脚悬空。

    2.外部晶体 / 陶瓷谐振器(LSE晶体)
    这个LSE晶体是一个32.768kHz的低速外部晶体或陶瓷谐振器。它的优点在于能为实时时钟部件(RTC)提供一个低速的,但高精确的时钟源。 RTC可以用于时钟/日历或其它需要计时的场合。谐振器和加载电容需要尽可能近地靠近晶振引脚,这样能使输出失真和启动稳定时间减到最小。负载电容值必须根据选定的晶振进行调节。外部晶体时钟如图5所示。
    在这里插入图片描述

    (a)外部时钟 (b)晶振时钟

    图4 LSE时钟

    在这里插入图片描述

    图5外部RTC时钟源

    HSE和LSE外部晶体两时钟电路的两个电容式为了抗干扰。对抗自然界中的一些干扰,如雷击。

    2 STM32 的时钟系统

    STM32 芯片为了实现低功耗,设计了一个功能完善但却非常复杂的时钟系统。普通的MCU 一般只要配置好 GPIO 的寄存器就可以使用了,但 STM32 还有一个步骤,就是开启外设时钟。

    在这里插入图片描述

    图6 STM32的时钟树

    在 STM32 中,可分为五种时钟源,为 HSI、 HSE、 LSI、 LSE、 PLL。 从时钟频率来分可以分为高速时钟源和低速时钟源,其中 HIS, HSE 以及 PLL 是高速时钟, LSI 和 LSE 是低速时钟。从来源可分为外部时钟源和内部时钟源,外部时钟源就是从外部通过接晶振的方式获取时钟源,其中 HSE 和 LSE 是外部时钟源,其他的是内部时钟源。下面我们看看 STM32 的 5 个时钟源,我们讲解顺序是按图中红圈标示的顺序:

    1.HSI 是高速内部时钟, RC 振荡器,频率为 8MHz。

    2.HSE 是高速外部时钟,可接石英 /陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~16MHz。 我们的开发板接的是 8M 的晶振。当使用有源晶振时,时钟从 OSC_IN 引脚进入, OSC_OUT 引脚悬空,当选用无源晶振时,时钟从 OSC_IN 和 OSC_OUT 进入,并且要配谐振电容。HSE 最常使用的就是 8M 的无源晶振。当确定 PLL 时钟来源的时候, HSE 可以不分频或者 2 分频,这个由时钟配置寄存器 CFGR 的位 17。

    3.LSI 是低速内部时钟,RC 振荡器,频率为 40kHz。独立看门狗的时钟源只能是 LSI,同时 LSI 还可以作为 RTC 的时钟源。

    4.LSE 是低速外部时钟,接频率为 32.768kHz 的石英晶体。这个主要是 RTC 的时钟源。

    5.PLL 为锁相环倍频输出,其时钟输入源可选择为 HSI/2、HSE 或者 HSE/2。倍频可选择为2~16 倍,但是其输出频率最大不得超过 72MHz。

    图中我们用 A~E 标示我们要讲解的地方。

    A. MCO 是 STM32 的一个时钟输出 IO(PA8),它可以选择一个时钟信号输出, 可以选择为 PLL 输出的 2 分频、 HSI、 HSE、或者系统时钟。这个时钟可以用来给外部其他系统提供时钟源。

    B. 这里是 RTC 时钟源,从图上可以看出, RTC 的时钟源可以选择 LSI, LSE,以及HSE 的 128 分频。

    C. 从图中可以看出 C 处 USB 的时钟是来自 PLL 时钟源。 STM32 中有一个全速功能的 USB 模块,其串行接口引擎需要一个频率为 48MHz 的时钟源。该时钟源只能从 PLL 输出端获取,可以选择为 1.5 分频或者 1 分频,也就是,当需要使用 USB模块时, PLL 必须使能,并且时钟频率配置为 48MHz 或 72MHz。

    D. D 处就是 STM32 的系统时钟 SYSCLK,它是供 STM32 中绝大部分部件工作的时钟源。系统时钟可选择为 PLL 输出、 HSI 或者 HSE。系统时钟最大频率为 72MHz,当然你也可以超频,不过一般情况为了系统稳定性是没有必要冒风险去超频的。

    E. 这里的 E 处是指其他所有外设了。从时钟图上可以看出,其他所有外设的时钟最终来源都是 SYSCLK。 SYSCLK 通过 AHB 分频器分频后送给各模块使用。这些模块包括:
    ①AHB 总线、内核、内存和 DMA 使用的 HCLK 时钟。
    ②通过 8 分频后送给 Cortex 的系统定时器时钟,也就是 systick 了。
    ③直接送给 Cortex 的空闲运行时钟 FCLK。
    ④送给 APB1 分频器。 APB1 分频器输出一路供 APB1 外设使用(PCLK1,最大频率 36MHz),另一路送给定时器(Timer)2、 3、 4 倍频器使用。
    ⑤送给 APB2 分频器。 APB2 分频器分频输出一路供 APB2 外设使用(PCLK2,最大频率 72MHz),另一路送给定时器(Timer)1 倍频器使用。
    其中需要理解的是 APB1 和 APB2 的区别, APB1 上面连接的是低速外设,包括电源接口、备份接口、 CAN、 USB、 I2C1、 I2C2、 UART2、 UART3 等等, APB2 上面连接的是高速外设包括 UART1、 SPI1、 Timer1、 ADC1、 ADC2、所有普通 IO 口(PA~PE)、第二功能 IO 口等。

    不同的总线有不同的频率,不同的外设挂在不同的总线下,为了更适合初学者查阅,笔者把常用的外设与总线的对应关系总结如下:
    在这里插入图片描述

    图7 STM32F1总线与外设对应关系

    SystemInit()函数中设置的系统时钟大小:

     SYSCLK(系统时钟) =72MHz
     AHB 总线时钟(使用 SYSCLK) =72MHz
     APB1 总线时钟(PCLK1) =36MHz
     APB2 总线时钟(PCLK2) =72MHz
     PLL 时钟 =72MHz

    具体代码请读者查看工程文件的system_stm32f10x.c文件。

    举个例子:Keil编写程序是默认的时钟为72Mhz,其实是这么来的:外部晶振(HSE)提供的8MHz(与电路板上的晶振的相关)通过PLLXTPRE分频器后,进入PLLSRC选择开关,进而通过PLLMUL锁相环进行倍频(x9)后,为系统提供72MHz的系统时钟(SYSCLK)。之后是AHB预分频器对时钟信号进行分频,然后为低速外设提供时钟。

    或者内部RC振荡器(HSI) 为8MHz /2 为4MHz 进入PLLSRC选择开关,通过PLLMUL锁相环进行倍频(x18)后 为72MHz。

    PS: 网上有很多人说是5个时钟源,这种说法有点问题,学习之后就会发现PLL并不是自己产生的时钟源,而是通过其他三个时钟源倍频得到的时钟,这点在前文已近讲解得很清楚了。

    3 Systick系统定时器工作原理分析

    SysTick 定时器被捆绑在 NVIC 中,用于产生 SysTick 异常(异常号 :15)。在以前,操作系统和所有使用了时基的系统都必须有一个硬件定时器来产生需要的“滴答”中断,作为整个系统的时基。滴答中断对操作系统尤其重要。例如,操作系统可以为多个任务分配不同数目的时间片,确保没有一个任务能霸占系统 ;或者将每个定时器周期的某个时间范围赐予特定的任务等,操作系统提供的各种定时功能都与这个滴答定时器有关。因此,需要一个定时器来产生周期性的中断,而且最好还让用户程序不能随意访问它的寄存器,以维持操作系统“心跳”的节律。

    Cortex-M3 在内核部分包含了一个简单的定时器——SysTick。因为所有的 CM3 芯片都带有这个定时器,软件在不同芯片生产厂商的 CM3 器件间的移植工作就得以简化。该定时器的时钟源可以是内部时钟(FCLK,CM3 上的自由运行时钟),或者是外部时钟( CM3 处理器上的 STCLK 信号)。不过,STCLK 的具体来源则由芯片设计者决定,因此不同产品之间的时钟频率可能大不相同。因此,需要阅读芯片的使用手册来确定选择什么作为时钟源。在 STM32 中 SysTick 以 HCLK(AHB 时钟)或 HCLK/8 作为运行时钟。

    SysTick 定时器能产生中断,CM3 为它专门开出一个异常类型,并且在向量表中有它的一席之地。它使操作系统和其他系统软件在 CM3 器件间的移植变得简单多了,因为在所有 CM3 产品间,SysTick 的处理方式都是相同的。SysTick 定时器除了能服务于操作系统之外,还能用于其他目的,如作为一个闹铃、用于测量时间等。Systick 定时器属于Cortex 内核部件,可以参考《ARM Cortex-M3 权威指南》((英)JosephYiu 著,宋岩译,北京航空航天大学出版社出版)或“STM32xxx-Cortex-M3programmingmanual”(这是 ST 官方提供的电子版编程手册,可以在 ST 官网下载)来了解。

    [ps]本文的时钟系统基于STM32F1,ST的其他系列的时钟系统类似。

    关于SysTick 定时器实现请看笔者博文:

    Systick系统定时器
    Systick系统定时器(HAL库)


    欢迎访问我的网站:

    BruceOu的哔哩哔哩
    BruceOu的主页
    BruceOu的博客
    BruceOu的CSDN博客
    BruceOu的简书

    接收更多精彩文章及资源推送,请订阅我的微信公众号:

    在这里插入图片描述

    展开全文
  • 1,意思是APB2接高速设备2、Stm32f10x.h相当于reg52.h(里面基本的位操作定义),另一个为stm32f10x_conf.h专门控制外围器件的配置,也就是开关头文件的作用3、HSE Osc(High Speed External Oscillator)高速外部晶振...
    1、AHB系统总线分为APB1(36MHz)和APB2(72MHz),其中2>1,意思是APB2接高速设备 2、Stm32f10x.h相当于reg52.h(里面有基本的位操作定义),另一个为stm32f10x_conf.h专门控制外围器件的配置,也就是开关头文件的作用 3、HSE Osc(High Speed External Oscillator)高速外部晶振,一般为8MHz,HSI RC(High Speed InternalRC)高速内部RC,8MHz 4、LSE Osc(Low Speed External Oscillator)低速外部晶振,一般为32.768KHz,LSI RC(Low Speed InternalRC)低速内部晶振,大概为40KHz左右,提供看门狗时钟和自动唤醒单元时钟源 5、SYSCLK时钟源有三个来源:HSI RC、HSE OSC、PLL 95b6f80401cc5d02dbf01affb133f920.png 6、MCO[2:0]可以提供4源不同的时钟同步信号,PA8 7、GPIO口貌似有两个反向串联的二极管用作钳位二极管 77bb236333d12ac1d3dd4df5256940d8.png 8、总线矩阵采用轮换算法对系统总线和DMA进行仲裁 9、ICode总线,DCode总线、系统总线、DMA总线、总线矩阵、AHB/APB桥 10、在使用一个外设之前,必须设置寄存器RCC_AHBENR来打开该外设的时钟 11、数据字节以小端存储形式保存在存储器中 12、内存映射区分为8个大块,每个块为512MB 13、FLASH的一页为1K(小容量和中容量),大容量是2K 14、系统存储区(SystemMemory)为ST公司出厂配置锁死,用户无法编辑,用于对FLASH区域进行重新编程。所以我们烧写程序务必选择BOOT1 = 0,这样通过内嵌的自举程序对FLASH进行烧写,比如中断向量表和代码 15、STM32核心电压为1.8V 16、STM32复位有三种:系统复位、上电复位、备份区域复位。其中系统复位除了RCC_CSR中的复位标志和BKP中的数值不复位之外,其他的所有寄存器全部复位。触发方式例如外部复位、看门狗复位、软件复位等;电源复位由于外部电源的上电/掉电复位或者待机模式返回。复位除了BKP中的寄存器值不动,其他全部复位;备份区域复位的触发源为软件复位或者VDD和VBAT全部掉电时 17、单片机复位后所有I/O口均为浮空输入状态 18、68个可屏蔽中断通道,16个可编程优先级,16个内核中断,一共68+16=84个中断。103系列只有60个中断,107系列才有68个中断 19、系统启动从0x00000004开始,0x000 0000保留 20、(NestedVectored Interrupt Controller)NVIC嵌套向量中断控制器,分为两种:抢先式优先级(可嵌套)和中断优先级(副优先级,不能嵌套)。两种优先级由4位二进制位决定。分配下来有十六种情况: bef3dc7c894c98129f3fc89ff5f0d3e0.png 21、0号抢先优先级的中断,可以打断任何中断抢先优先级为非0号的中断;1号抢先优先级的中断,可以打断任何中断抢先优先级为2、3、4号的中断;……;构成中断嵌套。如果两个中断的抢先优先级相同,谁先出现,就先响应谁,不构成嵌套。如果一起出现(或挂在那里等待),就看它们2个谁的子优先级高了,如果子优先级也相同,就看它们的中断向量位置了。原来中断向量的位置是最后的决定因素 22、上电初始化后AIRC初始化为0,为16个抢先式优先级,但是由于所有的外部通道中断优先级控制字PRI_n为0,所以抢先式优先级相同,此时就不能嵌套了 23、NVI中有ISER[2](Interrupt Set-Enable Registers),ICER[2](Interrupt  Clear-Enable Registers),ISPR[2](Interrupt Set-Pending  Registers),ICPR[2](Interrupt Clear-Pending Registers),IABR[2](Active Bit Registers),IPR[15](InterruptPriority  Registers)定义。其中ISER和ICER分别为中断使能和中断失能寄存器,都是写1来使能/失能中断的。为什么写1?为什么不采用一个寄存器而用两个寄存器来表示中断使能/失能状态?由于硬件,写0比较复杂,并且可能造成其他位的状态改变,所以用1来表示打开或者关断是比较合理的 24、中断标志位需要手动清除 25、配置外围器件的一般步骤:1、打开端口时钟。2、定义初始化结构体并初始化。3、调用 26、串口的奇偶校验:如果是奇偶校验,那么USART_InitStructure.USART_WordLength= USART_WordLength_9b;这个数据的长度必须设定为9位! 27、ADC的规则组可以自定义转换通道顺序和转换的通道个数。在实际应用中,有时候希望有一些特别的通道具有很高的优先权,需要在规则组进行转换的时候强制打断,进行另一个通道的转换,这样一组通道,叫做注入组 28、定时器的输出比较模式:Timing(冻结,什么都不做,普通定时),Active(OCxREF输出高电平有效),Inactive(OCxREF输出低电平),Toggle(比较成功后翻转电平) 29、STM32的定时器从0开始计数,满足一些条件,给出标志位(比如匹配成功、时间更新、溢出等)然后从0开始计数。这一点和51不同 30、OCx=OCxREF+极性 31、自动装载寄存器和影子寄存器:前者相当于51当中的溢出设定数值。而影子寄存器顾名思义是影子,就是寄存器的另一分copy。实际起作用的是影子寄存器,而程序员操纵的则是自动装载寄存器。如果APPE位使能,表明自动装载寄存器的值在下一次更新事件发生后才写入新值。否则,写入自动装载寄存器的值会被立即更新到影子寄存器。

    dc0d34655403e237e4bd57f3bbaa2aa7.png

    32、RCC_PCLK1Config(RCC_HCLK_Div4);PCLK1的4分频给定时器基准时钟 33、定时器配置:RCC、NVIC、GPIO(OC输出或者PWM)、TIMx 34、通用定时器可以输出4路不同的PWM,高级定时器可以输出4路不同的PWM外,还可以输出3路互补的PWM信号(驱动三相电机),一共有7路。这样算出来STM32可以产生30路PWM=7*2+4*4 35、计数器的数值与输出比较寄存器相等时,翻转输出信号 ea20a80bdf63291e6519965645d10a9e.png 36、高级定时器时钟源挂在了APB2上,而通用定时器挂在APB1上。AHB(72mhz)→APB1分频器(默认2)→APB1时钟信号(36mhz)→倍频器(*2倍)→通用定时器时钟信号(72mhz)。如果APB1没有分频,那么通用定时器的时钟信号频率就直接等于APB1的时钟频率,没有上述的倍频器*2过程。TIM_SetAutoreload()用来改变PWM的频率,TIM_SetCompare1()用来改变占空比 37、有刷电机一般启动力矩大一些,无刷电机启动力矩小,运行起来力矩大。有刷电机采用电刷机械电流换向,而无刷电机则通过霍尔传感器测出转子的电流来判断电机的运动位置和方向,返回给控制回路 38、死区是必须要有的,因为这涉及到电路的短路问题。晶闸管在换向的时候需要死区时间来彻底关断线路 39、刹车功能用来在控制回路出现问题时,硬件自动给予外部电机进行紧急刹车制动,反应在PWM上持续给出一个固定的占空比?(三相驱动也是?) 40、PWM输出最好采用PWM模式,其他的比较输出模式相位会慢慢改变,不精准 41、对FLASH的读写需要先解锁后加锁。FLASH写0容易,写1难 42、下载程序有两种方式,一种为ICP(在线编程),适用于JTAG或SWD协议下的烧写程序。另一种成为IAP(在应用编程),适用于很多接口(USB,串口,CAN)下载到存储器中,IAP允许在程序运行时重新烧写FLASH 43、FLASH分为主存储器(这里放置用户的程序代码)和信息块(启动代码),除此之外,还有一部分叫做系统存储器,这一块用户不可操作,为ST公司出产后固化,为系统的上电自举程序 44、FLASH在写的时候,一定不能读,如果有读操作,那么将会锁住总线 45、对FLASH操作时,必须打开HIS 46、STM32有两种看门狗(IWDG独立看门狗《独立时钟》,WWDG窗口看门狗《由APB1分频而来》) 47、SPI的的最高频率为36MHz(fpclk/2) 48、 TIM1和TIM8高级定时器在输出PWM时,需要配置一下主输出功能(CtrlPWMOutputs)才能输出PWM。其他的通用定时器不需要这样配置。但是TIM6和TIM7没有PWM输出功能 49、Code为程序代码部分 RO-data 表示程序定义的常量(如:const temp等); RW-data 表示已初始化的全局变量 ZI-data 表示未初始化的全局变量,以及初始化为0的变量 Code, RO-data,RW-data..............flash RW-data, ZIdata...................RAM 初始化时RW-data从flash拷贝到RAM 50、STM32F103ZET6有144个引脚(Z为144),其中,可用IO口为112个(7X16=112,ABCDEFG口) 51、ARM公司只生产内核标准,不生产芯片。ST、TI这样的公司从ARM公司那里购买内核,然后外加自己的总线结构、外设、存储器、始终和复位、I/O后就组成了自己的芯片。Cortex-M3芯片结构如下如图所示

    96ecc7a880bd006d26e5aa8f08c97f36.png

    52、CMSIS标准用于在向上的用户层和下面的硬件层交换信息。这个架构当然可以自己定义,但是这样的话就会没有标准。所以强制使用CMSISI标准来设计芯片。通俗点的讲就是系统初始化的函数名称CMSIS定义为SystemInit(),GPIO_ResetBits()等 53、端口复用和端口重映射是两个概念:前者在使能其对应的端口和对应的功能时钟即可。后者需要打开AFIO时钟,然后进行端口的重映射GPIO_PinRemapConfig() 54、下载程序只能使用串口1,在硬件设计时一定要注意! 55、J-TAG调试频率一般设定为2MHz,而SWD调试频率可以设定为10MHz 56、SysTick的中断实现可以有两种方式:循环等待和中断法。推荐用循环等待,中断法可能会出问题而且占用资源 57、部分I/O引脚是5V兼容的。单个I/O的最大驱动电流和灌入电流均为25mA。整个芯片的电流为150mA 58、KEIL支持位段操作,可以利用C语言中的位段知识定义位段结构体,然后对单独的寄存器进行单独的位操作 59、关于内部上下拉电阻的设置:如果外部的按键另一头接地,那么需要设置成上拉电阻。(理由是当没有按下按键时,由于上拉,输入为高电平;按下时,由于外部接地,输入为低电平。)同理,如果外部的按键另一头接高电平,那么需要设置成下拉电阻 60、串口中断TXE和TC的区别:其实很明显,一个是发送寄存器空标志,一个是发送完成标志。因为串口在发送的时候首先需要把发送寄存器中的数据移位到移位寄存器(影子寄存器)后再串行发送出去。所以当发送寄存器DR空时说明现在可能正在往外面发送数据,数据可能还没有发送完。但是发送完成不一样,他是在移位寄存器将本次数据全部移位完成后设置的标志位(也就是发送完了停止位)。这么看来:TXE允许程序有更充裕的时间填写TDR寄存器,保证发送的数据流不间断。TC可以让程序知道发送结束的确切时间,有利于程序控制外部数据流的时序 61、窗口看门狗顾名思义有一个窗口,这个窗口的横坐标为时间,意思是在指定的时间范围内刷新寄存器,否则单片机复位。窗口的上限由人来设定W[6:0],下线定死为0x40Twwdg=(4096×2^WDGTB×(T[5:0]+1)) /Fpclk1;Twwdg为超时时间ms,Fpclk1为APB1时钟 62、TIMx通用定时器有4个独立通道,分别可以用来作为:输入捕获、比较输出、PWM生成、单脉冲模式输出 63、定时器的时钟来源有4个:内部时钟(CK_INT),外部时钟模式1(TIx),外部时钟模式2(ETR),内部触发模式(ITRx,这个用来定时器的同步) 64、定时器中断溢出更新时间:Tout=((arr+1)*(psc+1))/Tclk,ARR为自动装载寄存器(1~65535)、PSC为分频系数,TCLK为输入时钟频率(Mhz) 65、PWM1和PWM2模式的区别仅在于相位的180度。前者高电平时,后者低电平。感觉好鸡肋,OCxREF极性就可以实现这个功能 66、定时器输入捕捉有一个滤波器,顾名思义滤波器起到的就是滤波的作用,在捕捉外部信号时,信号可能不稳定,此时需要滤波:当检测到有外部输入时,需要再连续采样N次如果确定为高电平/低电平,则触发响应中断(如果开启了的话) 67、电容触摸屏原理:通过充放电的曲线不同来检测是否被按下。实际的实验过程中,TPAD可以用一块覆铜区域来替代,通过电容的充放电常数来确定是否按下 b075ba69c63f65ea4bb9ca241592b3dd.png 68、OLED,即有机发光二极管(OrganicLight-Emitting Diode),又称为有机电激光显示(Organic Electroluminesence Display,OELD)。下图为OLED的GRAM与屏幕的对应表 b9e5968dac724170fa79b096a7feed41.png PAGE2单独列出来: 6a81509c8e5bfa5d2fc66decfe8947d3.png 69、USART可以操纵SPI设备。不过最大频率只有4.5MHz 70、使用I/O口时应该注意的问题 13b7257b61dafbb8c012fb47eccceda5.png 71、ADC的Vref+和Vdda与VSS,Vref-一定要加高质量的滤波电容,切靠近单片机 0ff6be60d3d443aa927ff0a0d6ec0c91.png 72、ADC分为规则组和注入组,前者有16个通道,后者有4个通道。并且16个通道公用一个数值寄存器,注入组的4个通道分别有一个数值寄存器 0bf34974b1efbc1ae3700dc5cf557a33.png 73、采样频率越高,输入阻抗要求越小 74、Stm32进入中断的最短周期为6个周期 75、 98ae8099015352a8f5eadda58de4ddb5.png 76、 beee7362889930c88ee4be957c29acfc.png 77、FSMC,即灵活的静态存储控制器。能够与同步或异步存储器和16位PC存储器卡接口,STM32的FSMC接口支持包括SRAM、NANDFLASH、NORFLASH和PSRAM等存储器 78、平时所说的U盘里的FLASH存储器有两种类型:NANDflash和NOR flash
    NAND FLASHNOR FLASH
    不能直接运行里面的代码可以直接运行里面的代码
    写入和擦除速度快写入和擦除速度慢
    读取速度稍慢读取速度稍快
    擦写周期100万次擦写周期10万次
    成本低,容量高成本高,容量低
    一般为串行接口有SRAM接口
      79、TFT在操作时,可以当作外部SRAM来操作,这样的话,如果单片机有FSMC接口,就可以使用NORFLASH的SRAM接口去控制,速度非常快 80、Stm32的的FSMC有4个256MB的存储块,一共寻址1GB的外部存储器空间 762adaabb07b272fd6abed5806f96dd0.png 81、在STM32内部,FSMC的一端通过内部高速总线AHB连接到内核Cortex-M3,另一端则是面向扩展存储器的外部总线。内核对外部存储器的访问信号发送到AHB总线后,经过FSMC转换为符合外部存储器通信规约的信号,送到外部存储器的相应引脚,实现内核与外部存储器之间的数据交互 82、FSMC中的DATASET和ADDSET的设置需要参看外部存储器的时序图来确定。一般而言,DATASET指的是数据建立时间,也就是读/写信号开始到读/写信号停止(上升沿存储数据)的持续时间。(一般来说写比读快!)。而ADDSET指的是地址建立时间,指的是片选之后到读/写操作之前的时间,这是针对SRAM来说的,如果操纵的是TFT,不存在地址线,所以此时的ADDSET就是读/写信号结束到RS电平的转换时间 d68be3e86f7831ca2506cb488b017185.png 83、 762adaabb07b272fd6abed5806f96dd0.png 84、 ec60564e677a9af8590d5118aeb6014b.png 85、FSMC的三个配置寄存器:FSMC_BCRx(片选控制配置)、FSMC_BTRx(片选时序)、FSMC_BWTRx(片选写时序) 86、RTC时钟配置必须要用到BKP寄存器,BKP寄存器在单片机复位、电源复位、待机唤醒模式下是不会更改值的,他的供电由VDD供电,VDD被切断后自动切换至外部的VBAT供电 87、要修改BKP寄存器的值,必须取消其写保护的标志。BKP寄存器在上电时自动写保护 88、 Stm32有三种省电模式: ccb8da6345cfb420a4c6f766543d64fd.png 三种省电模式中,耗电量从上到下依次降低,待机模式的电流仅为2uA。 89、从待机模式中唤醒单片机等效于让单片机复位,但是电源寄存器的值会有一个标志位指示单片机是被唤醒的,不是被复位的。 90、ADC的时钟不要超过14MHz,否则转换精度会下降。最大转换速率为1MHz,即转换周期为1us(14MHz,采样周期为1.5个ADC时钟) 91、Tcovn=采样时间+12.5个周期。采样时间尽量选长一点,这样精度高一些,但是转换速率下降,这也是有利必有弊。 92、    ef187a0bf4912bf806e3a4b0177a4ac4.png 93、拿ARM7TDMI来说,T代表Thumb指令集,D是说支持JTAG调试(Debugging),M意指快速乘法器,I则对应一个嵌入式ICE模块。 94、 MMU作为嵌入式处理器与应用处理器的分水岭标志à具有内存管理单元的嵌入式处理器可以定位为应用处理器。这么说M系列和A系列的处理器的区别在于A系列的处理器具有MMU单元可以进行内存模块的管理。 95、ARM处理器有两种状态:ARM状态和Thumb状态。 f94976df6619c9c5ea35a66531392727.png 96、这张图说明了一切:Thumb2指令集做了一件很伟大的事情:将16位和32位的指令集融为一体,兼容性非常强!(这么说CM3不支持某些32位ARM指令集??) 97、 a102db5e06ce2d5e01c44d6f1da40129.png 98、MSP是系统复位后使用的堆栈指针,PSP由用户的代码使用。两个堆栈指针为4字节对齐 99、在ARM编程领域中,凡是打断程序运行的事件,统称为异常(exception) 100、因为存在LR(链接寄存器),所以可支持1级的子程序调用而不用压栈到内存,大大提高了运行速度。---à这就是说,我们在编程的时候,一级调用是不会耗费太多时间的,除非是二级调用 101、处理器有两种操作模式:handler模式和线程模式

    c2e2cb67d350842fdfa8471cb490b72c.png

         处理器也有两种特权分级:特权级和用户级。这张图说明了一切:复位进入特权级线程模式,如果有异常,进入特权级的handler模式处理异常或中断例程,然后返回至特权级线程模式。通过修改CONTROL寄存器可以进入用户级线程模式 102、两个高级定时器TIM1和TIM8是挂接在APB1总线上 103、STM32的外部中断是以组来区分的,也就是说PA0,PB0,PC0单片机是无法区分其中哪个触发的中断à均为EXIT0线中断服务例程。所以,外部中断支持16路的中断分辨率。从另一个方面来讲,我们可以设置GPIO_EXTILineConfig(GPIO_PortSourceGPIOx, GPIO_PinSourcex);来开通中断线实现组内的不同中断 104、DAC有两个寄存器,一个是DHR(Data HoldingRegister)数据保持寄存器,一个DOR(Data Output  Register)数据输出寄存器。真正起作用的是DOR寄存器,该寄存器把值给数模转换发生单元输出以VREF+为参考电压的电压值。如果是硬件触发转换,系统将在1个ABP时钟周期后把值给DOR,如果是软件触发转换,时间为3个APB时钟周期。然后,均等待Tsetting时间(Typical为3us,Max为4us)后真正输出电压值 105、DAC分8位模式和12位模式,其中后者可以选择左右对齐 106、DMA仲裁器分为软件和硬件两种。软件部分分为4个等级,分别是很高优先级、高优先级、中等、低。硬件部分由通道的大小来决定优先级,越低优先级越高 107、DMA有一个实时的传输数据量寄存器叫做DMA_CNDTR,最大值为65535,存放的是当前传输所要传输的数据量。当数据量变为0时,表明传输完成 108、 CAN总线(ControllerArea Network)。CAN控制器根据两根线上的电位差来判断总线电平,总线电平又分为显性电平和隐性电平,二者必居其一 109、CAN总线具有6个特点:1:多主控制(挂接在总线上的所有设备均可以成为主设备,并且设备ID是用来决定设备的优先级,没有设备地址概念),2:系统若软性(没有设备地址概念),3、通讯速度较快,通讯距离较远(1Mbps下40M,5kbps下10KM),4、具有错误检测、错误通知(通知其他设备)和错误恢复功能(强制结束发送,重复发送接收错误的信息。),5、故障封闭,当总线上的设备发生连续故障错误时,CAN控制器会把改控制器踢出总线。6、连接节点多。理论上可以无限制加载,但是受到时间延迟和电气负载的限制,实际数目是有限制的。降低传输速度可以适当增加可挂接负载个数 110、CAN协议有两个标准,ISO11898(针对125kbps~1Mbps的高速速率)和ISO11519-2(125kbps以下的低速速率) 67cb8f81d6d101a5d6d44a2e79d1b863.png 111、     6d622b00f4cee43054d0314bf40af808.png 112、CAN协议的有5种类型的帧:数据帧、遥控帧、错误帧、过载帧、帧间隔。其中前两种帧有标准格式(11位ID)和扩展格式(29位ID) 37cb21dff144e49179076bab406cf5da.png 113、数据帧构成: (1) 帧起始。表示数据开的段帧起始。 (2) 仲裁段。表示该帧优先级的仲裁段。 (3) 控制段。表示数据的字节及保留位段。 (4) 数据段。数据的内容,一帧可发送0~8个字节的数据。 (5) CRC段。  检查帧的传输错误段。 (6) ACK段。  表示确认正常接收的段。 (7) 帧结束。 表示数据的段帧结束 a4280a305d77321e24c164612ed02946.png 114、Stm32f103系列只有一个CAN控制器,有3个发送邮箱和3级深度的2个FIFO,14个过滤组器 115、STM32的每个过滤组可以配置为1个32位过滤器和2个16位过滤器。除此之外,还可以配置为屏蔽位模式(ID+屏蔽)和标识符列表(ID和屏蔽寄存器均用来做ID寄存器)模式 116、CAN接收到有效报文被放置在3级邮箱深度的FIFO中,FIFO完全由硬件来管理 117、 CAN总线的波特率 c9543345571dd945f31fe6c949780f55.png 118、触摸屏一般分为电阻式触摸屏和电容式触摸屏。前者检测触摸的位置原理是利用触摸屏控制器中的A/D转换器经过两次A/D读值后得出X和Y的坐标值。注意:这个X和Y的值是相对于触摸屏的,而非LCD屏。所以在这里需要注意两个概念:触摸屏和LCD屏。这是两个不同的概念,也是两个不同的物理结构,其中电阻触摸屏是由上下两个导电层中间夹着一层非常薄的透明隔层;而LCD就是指显示屏 119、 电阻触摸屏有X和Y、X和Y的比例因子、坐标轴方向、偏移量。LCD也有自己的这些参数。两者完全不相干,所以在定位的时候需要进行坐标转换。公式: a5d052c7ecaf4444ec1285175b81bdde.png 通过对屏幕的四个点进行校准,得到四元一次方程,求解即可 120、NEC协议的数据帧格式:同步码头、地址码、地址反码、控制码、控制反码。同步码由一个9ms的低电平和一个4.5ms的高电平组成,地址码、地址反码、控制码、控制反码均是8位数据格式。按照低位在前,高位在后的顺序发送 121、NEC协议在发送的时候,会有560us的38KHz的载波信号,而在接收的时候这部分载波信号被认定为低电平,而剩余的(2.25ms-650us)的逻辑“1”和(1.12ms-650us)的逻辑“0”时间则被认定为高电平 122、在单位时间内的位移被定义为速度,速度有线速度和角速度之分,分别对应两种传感器测量这两种不同的速度:线速度传感器(加速度计)、角速度传感器(陀螺仪)。前者多应用在静态或者低慢速运动中的姿态求解,后者多应用在动态运动中姿态求解 123、根据标准约定,零加速度(或零  G 准位)通常定义为相当于最大输出值(12 位输出为 4096,10 位输出为 1024 等)一半的输出。对于提供 12 位输出的加速度计,零  G 准位将等于 2048。输出大于 2048 表示正加速度。输出小于 2048 表示负加速度。加速度的数量通常用单位 g (1g =  9.8m/s2 = 重力加速度)表示。通过确定测量的输出与零 G 准位之间的差值,然后除以加速度计的灵敏度(用计数/g 或  LSB/g表示)来计算加速度。对于提供 12 位数字输出的 2g 加速度计,灵敏度为 819 计数/g 或 819 LSB/g。加速度等于:a = (Aout - 2048)/(819 计数/g),单位为g 124、加速度计测得的加速度的方向和设备设定的坐标系是相反的,因为原理表明在测量力的时候采用的是非惯性系参考系,而我们高中时代研究的坐标系是惯性系参考系,前者在物体进行运动产生加速度时,假想一个与速度方向相反的力作用在物体上,这个力就是惯性力;后者我们说不存在惯性力,只说存在惯性,因为在惯性坐标系中,我们研究的是物体,而非坐标系(即假定坐标系相对地球静止),当我们把坐标系也考虑在内时,当坐标系运动,就产生了惯性力f,这种力作用会假想作用在物体上,只是与运动方向相反 125、由上可知,加速度计的本质是测量力而非加速度 126、NRF24L01工作在2.4GHz的频段,由于频段频率较高,所以传输速率较快,为2Mbps 127、STM32的闪存模块由:主存储器、信息块和闪存存储器接口寄存器3个部分构成。主存储器用来存放代码和const常量;信息块由两个部分组成:启动程序代码、用户选择字节。其中启动程序代码为ST公司自带的启动程序,用于串口下载。最后的闪存存储器接口寄存器用于控制整个对闪存区域的操作 128、CPU的运行速度比FLASH的操作速度快的多,一般FLASH的最快访问速度≤24Mhz。如果CPU的速度超过这个频率,那么在读取FLASH的时候必须加入等待时间(FLASH_ACR设置) 129、FLASH编程时,写入必须为半字(16位)。并且在写入的时候必须保证所写区域的数据必须为0xFFFF 130、STM32的FSMC有HADDR[27:0],其中[27:26]用来选择BANK区域的4个不同块。剩下的[25:0]则用来连接外部存储区域的地址线FSMC_A[25:0]。如果数据宽度是8bit,此时的HADDR[25:0]和FSMC_A[25:0]是完全对应的。如果数据宽度是16bit,此时的HADDR[25:1]和FSMC_A[24:0]是对应起来的。需要注意:无论数据宽度是多少,外部的FSMC_A[0]和A[0]总是对应的 131、关于LB和UB的信号控制是由硬件自动控制的,当AHB的数据宽度小于外部存储器的数据宽度时,此时LB和UB的控制信号自动产生(比如字节读取/写入16bit的外部存储器) 132、 __attribute__ (函数属性、变量属性、类型属性等)。如果在使用SRAM时,可以采用u32 sram_array[xx] __attribute__  ((at(0x68000000))代表将外部SRAM的空间全部给了sram_array这个变量,他具有在at0x68000000这个地址的属性。往里面写值就直接在SRAM里面写值 133、 d10a8dc84eace539ba58ba9de7933f69.png 内存管理有一种方式叫做分块式内存管理。

    注意表中的分配方向,从顶到底。每一项对应一个内存块。里面的数值代表了内存池的状态:如果为0,表示该内存没有被分配;如果非0,那么数值的大小就表示了该块内存被连续占用的内存数。比如说数值为20,意思是包括该项在内的内存块被连续占用了20块分给了指针。

    134、SD卡的分类: d8d33467d565dfa086f29e29b33d1176.png 一般的SD卡支持两种传输模式:SD卡模式(SDIO)、SPI模式。显然前面一种是专用模式,所以速度比较快 135、常用的汉字内码系统有GB2313、GB13000、GBK、BIG5(繁体)。其中GB2313只有几千个汉字,而GBK则有2万多汉字 136、 要显示汉字,采用的方式如果用点阵的形式是不可取的,因为这无法查找汉字。采用的方式就是内码系统。GBK标准中,一个汉字对应2个字节:前者称为区(0x81~0xFE)后者为(0x40~0x7E)和(0x80~0xFE)。前者有126个区,后者有190,那么可以显示的汉字数量有126*190=23940个。根据这两个值用来查找字库,字库中存放的还是每个汉字的点阵数据。这个字库非常大,如果是16*16的字体,那么一个字体就需要32个字节,如此说来需要23940*32=748K的空间,可见非常大,所以需要外部的Flash来存储这个字库 137、由于汉字内码系统不具有国际通用性,但是Unicode几乎把所有的语言都放置进来,这样在单片机中操作汉字时,就需要将GBK和Unicode转化。尤其是在FATFS中,创建中文文件名和读取中文文件信息时需要将Unicode换转为GBK后再进行修改操作,再反转换成Unicode保存修改。这么说,两者的存在是由于标准的不统一,并且Unicode中只有6064个汉字,而GBK显然是一种汉字扩展 138、BMP图片编码的顺序是从左到右,从下到上 139、VS1053是一款高性能的数字音频解码芯片,从SD卡中将mp3等音乐音频文件通过SPI送给VS1053后,由其进行音频解码,输出音乐给耳机。耳机驱动可以采用TDA1308芯片,这款芯片为AB类耳机驱动芯片 140、 5376918436a3eb0dafacac145ab68d5d.png 141、IAP(In Application Programming)在应用编程是为了后期开发更新程序方便而提出的概念。具体的实现方法如下图所示: 44fb0341b82c50f43f1cb04be0d52125.png 在普通编程中,flash中的code是通过JTAG和ISP等工具下载到单片机中。而在IAP编程中,flash被分区为A和B两个区域,A区域只允许用USB/USART等方式下载,此区域作为更新B区域的代码用。B区域则是用户的code区域,真正的代码在这里被执行,放置的就是app。STM32正常运行流程图如下 13bf4eaa557a86d7123bd3835f6c9b86.png 上图表示STM32正常运行的流程图,可以看到上电复位后系统从0x80000004处开始运行程序,这里放置的是复位中断向量,然后跳转至复位中断程序入口后再跳转至main函数运行用户的程序。加入IAP之后的程序运行流程图如下

    1bad56cd733050d5b85aba8db99de062.png

    上图表示加入IAP后的STM32程序运行流程图。可以看到上电复位后跳到IAP程序的main函数处运行IAP过程(这个过程就是把下面灰底色块的程序代码烧进B区域à代码更新)。后面的过程和STM32正常运行一样,如果出现中断请求,还是跳转到A区域中的中断向量表中,然后再跳转到B区域的中断服务入口 142、    USB有四根线,VCC、GND、D+、D-。在USB主机上,D+和D-均通过一个15K的电阻接地,这样两条线均为低电平。在USB设备中,对于高速设备会在D+通过一个1.5K的电阻接到VCC,而低俗设备会在D-通过一个1.5K的电阻接到VCC。这样主机就可以通过D+和D-的高电平的到来来检测是否有设备接入,并且识别高低速设备 143、    UCOSII是一种实时操作系统,具有执行效率高、占有空间小(最小内核2KB)、实施性能优良、扩展性强和移植性强等优点。

    8a8b94704ad1490d3d4cd465b6ee3697.png

        UCOS具有多任务并发工作的特点(注意,任何时候只有一个任务能够占用CPU。并发只是任务轮流占用CPU而不是同时工作)。最大支持255个任务并发工作
    展开全文
  • STM32的SysTick时钟源来自哪里?

    千次阅读 2019-03-26 20:33:10
    置顶/星标公众号,不错过每一条消息! 位朋友在后台大概问了这样一问题:STM32的SysTick时钟源是来自Cortex系统定时器吗?引伸: 为什么ST...

    置顶/星标公众,不错过每一条消息!

    640?wx_fmt=jpeg

        有位朋友在后台大概问了这样一个问题:STM32的SysTick时钟源是来自Cortex系统定时器吗? 


    引伸:

        为什么STM32CubeMX中Cortex系统定时器可选择1分频(和8分频)?

    1写在前面

    看到这个问题,我在想,这位朋友可能没有认真看手册,同时也存在一个误区。


    我顺便也搜索了一下,网上很多文章都说到:SysTick时钟源是来自Cortex系统定时器,就是那个有8分频的时钟

    640?wx_fmt=png

    但是,我们实际应用中,SysTick时钟源真的是来自这个Cortex系统定时器吗?


    2

    SysTick时钟初始化代码

    不管是使用标准外设库,还是HAL库,你初始化SysTick,都会调用内核中的SysTick_Config函数。


    比如:

    SysTick_Config(SystemCoreClock / 1000);

    初始化调用这段代码之后,SysTick将会实现1ms中断一次。


    这段代码实现1ms中断一次相信大家都能理解,但是这里SysTick初始化和上面说的时钟『/8』有关系吗?

    3

    SysTick时钟源是来自哪里?

    这个问题只要认真看参考手册都能找到答案。

    RCC通过AHB时钟(HCLK)8分频后作为Cortex系统定时器(SysTick)的外部时钟。

    通过对SysTick控制与状态寄存器的设置,可选择上述时钟或Cortex(HCLK)时钟作为SysTick时钟。

    --来自参考手册

    也就是说SysTick时钟源可以来自两个地方:

    • AHB时钟8分频

    • HCLK(内核)时钟


    通过SysTick控制与状态寄存器的设置进行选择时钟源。

    具体就是通过CLKSOURCE(时钟源)这一Bit位来选择:640?wx_fmt=png

    再次看SysTick_Config函数源码:

    __STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)	
    {	
      if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk)	
      {	
        return (1UL);                                                   /* Reload value impossible */	
      }	
    
    	
      SysTick->LOAD  = (uint32_t)(ticks - 1UL);                         /* set reload register */	
      NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */	
      SysTick->VAL   = 0UL;                                             /* Load the SysTick Counter Value */	
      SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |	
                       SysTick_CTRL_TICKINT_Msk   |	
                       SysTick_CTRL_ENABLE_Msk;                         /* Enable SysTick IRQ and SysTick Timer */	
      return (0UL);                                                     /* Function successful */	
    }

    你会发现,其实源码已经默认使用HCLK(内核)时钟。

    SysTick_Config函数属于内核(如core_cm3.h)已经写好源码,一般我们不去修改。


    所以,到这里,你会明白:SysTick时钟源其实就是用的HCLK(内核)时钟


    4

    STM32CubeMX...可选择1分频

    分析上面问题的时候,我突然发现一个问题:为什么STM32CubeMX中Cortex系统定时器可选择1分频(和8分频)?640?wx_fmt=png

    (使用STM32CubeMX V5.1.0)


    我通过配置1分频和8分频,各自生成代码,进行对比,发现生成的代码完全一样


    然后,我又查看手册,RCC时钟树中的这个位置是固定『/8』,也没有看到可『/1』的说明。640?wx_fmt=png

    这里就留下一个问题:

    你认为STM32CubeMX配置Cortex系统定时器时钟是有Bug吗? (欢迎留言讨论)

     


    推荐阅读:

    1.透露一下我分享文章的几个平台

    2.HAL库中do{...} while(0U)宏定义的作用和意义

    5最后

    我的知乎:strongerHuang

    我的网站:www.strongerhuang.com

    若觉得文章对你有帮助,随手点“好看、转发分享,也是我继续更新的动力。

    扫描下面二维码、关注公众号,在底部菜单中查看更多精彩内容!

    640?wx_fmt=jpeg

    长按识别图中二维码关注

    展开全文
  • 1,意思是APB2接高速设备2、Stm32f10x.h相当于reg52.h(里面基本的位操作定义),另一个为stm32f10x_conf.h专门控制外围器件的配置,也就是开关头文件的作用3、HSE Osc(High Speed External Oscillator)高速外部晶振...
    d96f7f0a512106fa8fb21fc539dab62a.gif点击上方蓝色字关注我们~

    e67a151a13bc416850c604f755675cc5.png

    1、AHB系统总线分为APB1(36MHz)和APB2(72MHz),其中2>1,意思是APB2接高速设备

    2、Stm32f10x.h相当于reg52.h(里面有基本的位操作定义),另一个为stm32f10x_conf.h专门控制外围器件的配置,也就是开关头文件的作用

    3、HSE Osc(High Speed External Oscillator)高速外部晶振,一般为8MHz,HSI RC(High Speed InternalRC)高速内部RC,8MHz

    4、LSE Osc(Low Speed External Oscillator)低速外部晶振,一般为32.768KHz,LSI RC(Low Speed InternalRC)低速内部晶振,大概为40KHz左右,提供看门狗时钟和自动唤醒单元时钟源

    5、SYSCLK时钟源有三个来源:HSI RC、HSE OSC、PLL

    1a976184c0b0675bd56a046510d66bf3.png

    6、MCO[2:0]可以提供4源不同的时钟同步信号,PA8

    7、GPIO口貌似有两个反向串联的二极管用作钳位二极管。

    7b346c6518f3ff6396e4fa31050996b0.png

    8、总线矩阵采用轮换算法对系统总线和DMA进行仲裁

    9、ICode总线,DCode总线、系统总线、DMA总线、总线矩阵、AHB/APB桥

    10、在使用一个外设之前,必须设置寄存器RCC_AHBENR来打开该外设的时钟

    11、数据字节以小端存储形式保存在存储器中

    12、内存映射区分为8个大块,每个块为512MB

    13、FLASH的一页为1K(小容量和中容量),大容量是2K。

    14、系统存储区(SystemMemory)为ST公司出厂配置锁死,用户无法编辑,用于对FLASH区域进行重新编程。所以我们烧写程序务必选择BOOT1 = 0,这样通过内嵌的自举程序对FLASH进行烧写,比如中断向量表和代码

    15、STM32核心电压为1.8V

    16、STM32复位有三种:系统复位、上电复位、备份区域复位。其中系统复位除了RCC_CSR中的复位标志和BKP中的数值不复位之外,其他的所有寄存器全部复位。触发方式例如外部复位、看门狗复位、软件复位等;电源复位由于外部电源的上电/掉电复位或者待机模式返回。复位除了BKP中的寄存器值不动,其他全部复位;备份区域复位的触发源为软件复位或者VDD和VBAT全部掉电时。

    17、单片机复位后所有I/O口均为浮空输入状态

    18、68个可屏蔽中断通道,16个可编程优先级,16个内核中断,一共68+16=84个中断。103系列只有60个中断,107系列才有68个中断

    19、系统启动从0x00000004开始,0x000 0000保留

    20、(NestedVectored Interrupt Controller)NVIC嵌套向量中断控制器,分为两种:抢先式优先级(可嵌套)和中断优先级(副优先级,不能嵌套)。两种优先级由4位二进制位决定。分配下来有十六种情况:

    f7d58e4017d711298f0c63aecf163a44.png

    21、0号抢先优先级的中断,可以打断任何中断抢先优先级为非0号的中断;1号抢先优先级的中断,可以打断任何中断抢先优先级为2、3、4号的中断;……;构成中断嵌套。如果两个中断的抢先优先级相同,谁先出现,就先响应谁,不构成嵌套。如果一起出现(或挂在那里等待),就看它们2个谁的子优先级高了,如果子优先级也相同,就看它们的中断向量位置了。原来中断向量的位置是最后的决定因素!!!!

    22、上电初始化后AIRC初始化为0,为16个抢先式优先级,但是由于所有的外部通道中断优先级控制字PRI_n为0,所以抢先式优先级相同,此时就不能嵌套了

    23、NVI中有ISER[2](Interrupt Set-Enable Registers),ICER[2](Interrupt Clear-Enable Registers),ISPR[2](Interrupt Set-Pending Registers),ICPR[2](Interrupt Clear-Pending Registers),IABR[2](Active Bit Registers),IPR[15](InterruptPriority Registers)定义。其中ISER和ICER分别为中断使能和中断失能寄存器,都是写1来使能/失能中断的。为什么写1?为什么不采用一个寄存器而用两个寄存器来表示中断使能/失能状态?由于硬件,写0比较复杂,并且可能造成其他位的状态改变,所以用1来表示打开或者关断是比较合理的

    24、中断标志位需要手动清除

    25、配置外围器件的一般步骤:1、打开端口时钟。2、定义初始化结构体并初始化。3、调用

    26、串口的奇偶校验:如果是奇偶校验,那么USART_InitStructure.USART_WordLength= USART_WordLength_9b;这个数据的长度必须设定为9位!

    27、ADC的规则组可以自定义转换通道顺序和转换的通道个数。在实际应用中,有时候希望有一些特别的通道具有很高的优先权,需要在规则组进行转换的时候强制打断,进行另一个通道的转换,这样一组通道,叫做注入组。

    28、定时器的输出比较模式:Timing(冻结,什么都不做,普通定时),Active(OCxREF输出高电平有效),Inactive(OCxREF输出低电平),Toggle(比较成功后翻转电平)。

    29、STM32的定时器从0开始计数,满足一些条件,给出标志位(比如匹配成功、时间更新、溢出等)然后从0开始计数。这一点和51不同。

    30、OCx=OCxREF+极性

    31、自动装载寄存器和影子寄存器:前者相当于51当中的溢出设定数值。而影子寄存器顾名思义是影子,就是寄存器的另一分copy。实际起作用的是影子寄存器,而程序员操纵的则是自动装载寄存器。如果APPE位使能,表明自动装载寄存器的值在下一次更新事件发生后才写入新值。否则,写入自动装载寄存器的值会被立即更新到影子寄存器。

    006e7229c1983707d1d58eb4e8b73f75.png

    32、RCC_PCLK1Config(RCC_HCLK_Div4);PCLK1的4分频给定时器基准时钟

    33、定时器配置:RCC、NVIC、GPIO(OC输出或者PWM)、TIMx

    34、通用定时器可以输出4路不同的PWM,高级定时器可以输出4路不同的PWM外,还可以输出3路互补的PWM信号(驱动三相电机),一共有7路。这样算出来STM32可以产生30路PWM=7*2+4*4

    35、

    693ff2c91f416b61d8c7041f306275e2.png

    36、高级定时器时钟源挂在了APB2上,而通用定时器挂在APB1上。AHB(72mhz)→APB1分频器(默认2)→APB1时钟信号(36mhz)→倍频器(*2倍)→通用定时器时钟信号(72mhz)。如果APB1没有分频,那么通用定时器的时钟信号频率就直接等于APB1的时钟频率,没有上述的倍频器*2过程。TIM_SetAutoreload()用来改变PWM的频率,TIM_SetCompare1()用来改变占空比

    37、有刷电机一般启动力矩大一些,无刷电机启动力矩小,运行起来力矩大。有刷电机采用电刷机械电流换向,而无刷电机则通过霍尔传感器测出转子的电流来判断电机的运动位置和方向,返回给控制回路。

    38、死区是必须要有的,因为这涉及到电路的短路问题。晶闸管在换向的时候需要死区时间来彻底关断线路

    39、刹车功能用来在控制回路出现问题时,硬件自动给予外部电机进行紧急刹车制动,反应在PWM上持续给出一个固定的占空比?(三相驱动也是?)

    40、PWM输出最好采用PWM模式,其他的比较输出模式相位会慢慢改变,不精准

    41、对FLASH的读写需要先解锁后加锁。FLASH写0容易,写1难。

    42、下载程序有两种方式,一种为ICP(在线编程),适用于JTAG或SWD协议下的烧写程序。另一种成为IAP(在应用编程),适用于很多接口(USB,串口,CAN)下载到存储器中,IAP允许在程序运行时重新烧写FLASH

    43、FLASH分为主存储器(这里放置用户的程序代码)和信息块(启动代码),除此之外,还有一部分叫做系统存储器,这一块用户不可操作,为ST公司出产后固化,为系统的上电自举程序

    44、FLASH在写的时候,一定不能读,如果有读操作,那么将会锁住总线

    45、对FLASH操作时,必须打开HIS

    46、STM32有两种看门狗(IWDG独立看门狗《独立时钟》,WWDG窗口看门狗《由APB1分频而来》)

    47、SPI的的最高频率为36MHz(fpclk/2)

    48、 TIM1和TIM8高级定时器在输出PWM时,需要配置一下主输出功能(CtrlPWMOutputs)才能输出PWM。其他的通用定时器不需要这样配置。但是TIM6和TIM7没有PWM输出功能。

    49、Code为程序代码部分

    RO-data 表示程序定义的常量(如:const temp等);

    RW-data 表示已初始化的全局变量

    ZI-data 表示未初始化的全局变量,以及初始化为0的变量

    Code, RO-data,RW-data..............flash

    RW-data, ZIdata...................RAM

    初始化时RW-data从flash拷贝到RAM

    50、STM32F103ZET6有144个引脚(Z为144),其中,可用IO口为112个(7X16=112,ABCDEFG口)

    51、ARM公司只生产内核标准,不生产芯片。ST、TI这样的公司从ARM公司那里购买内核,然后外加自己的总线结构、外设、存储器、始终和复位、I/O后就组成了自己的芯片。

    a14564f91f91fde696f06b8bed63ee08.png

    52、CMSIS标准用于在向上的用户层和下面的硬件层交换信息。这个架构当然可以自己定义,但是这样的话就会没有标准。所以强制使用CMSISI标准来设计芯片。通俗点的讲就是系统初始化的函数名称CMSIS定义为SystemInit(),GPIO_ResetBits()等

    53、端口复用和端口重映射是两个概念:前者在使能其对应的端口和对应的功能时钟即可。后者需要打开AFIO时钟,然后进行端口的重映射GPIO_PinRemapConfig()

    54、下载程序只能使用串口1,在硬件设计时一定要注意!

    55、J-TAG调试频率一般设定为2MHz,而SWD调试频率可以设定为10MHz

    56、SysTick的中断实现可以有两种方式:循环等待和中断法。推荐用循环等待,中断法可能会出问题而且占用资源。

    57、部分I/O引脚是5V兼容的。单个I/O的最大驱动电流和灌入电流均为25mA。整个芯片的电流为150mA

    58、KEIL支持位段操作,可以利用C语言中的位段知识定义位段结构体,然后对单独的寄存器进行单独的位操作。

    59、关于内部上下拉电阻的设置:如果外部的按键另一头接地,那么需要设置成上拉电阻。(理由是当没有按下按键时,由于上拉,输入为高电平;按下时,由于外部接地,输入为低电平。)同理,如果外部的按键另一头接高电平,那么需要设置成下拉电阻。

    60、串口中断TXE和TC的区别:其实很明显,一个是发送寄存器空标志,一个是发送完成标志。因为串口在发送的时候首先需要把发送寄存器中的数据移位到移位寄存器(影子寄存器)后再串行发送出去。所以当发送寄存器DR空时说明现在可能正在往外面发送数据,数据可能还没有发送完。但是发送完成不一样,他是在移位寄存器将本次数据全部移位完成后设置的标志位(也就是发送完了停止位)。这么看来:TXE允许程序有更充裕的时间填写TDR寄存器,保证发送的数据流不间断。TC可以让程序知道发送结束的确切时间,有利于程序控制外部数据流的时序。

    61、窗口看门狗顾名思义有一个窗口,这个窗口的横坐标为时间,意思是在指定的时间范围内刷新寄存器,否则单片机复位。窗口的上限由人来设定W[6:0],下线定死为0x40Twwdg=(4096×2^WDGTB×(T[5:0]+1)) /Fpclk1;Twwdg为超时时间ms,Fpclk1为APB1时钟KHz,

    62、TIMx通用定时器有4个独立通道,分别可以用来作为:输入捕获、比较输出、PWM生成、单脉冲模式输出。

    63、定时器的时钟来源有4个:内部时钟(CK_INT),外部时钟模式1(TIx),外部时钟模式2(ETR),内部触发模式(ITRx,这个用来定时器的同步)

    64、定时器中断溢出更新时间:Tout=((arr+1)*(psc+1))/Tclk,ARR为自动装载寄存器(1~65535)、PSC为分频系数,TCLK为输入时钟频率(Mhz)

    65、PWM1和PWM2模式的区别仅在于相位的180度。前者高电平时,后者低电平。感觉好鸡肋,OCxREF极性就可以实现这个功能。

    66、定时器输入捕捉有一个滤波器,顾名思义滤波器起到的就是滤波的作用,在捕捉外部信号时,信号可能不稳定,此时需要滤波:当检测到有外部输入时,需要再连续采样N次如果确定为高电平/低电平,则触发响应中断(如果开启了的话)。

    67、电容触摸屏原理:通过充放电的曲线不同来检测是否被按下。实际的实验过程中,TPAD可以用一块覆铜区域来替代,通过电容的充放电常数来确定是否按下。

    a1eb3481e2d0daadad1282e5f4081c76.png

    68、OLED,即有机发光二极管(OrganicLight-Emitting Diode),又称为有机电激光显示(Organic Electroluminesence Display,OELD)。下图为OLED的GRAM与屏幕的对应表

    2138e06a30b4e9a72de871ad9c89a3a9.png

    PAGE2单独列出来:

    271c6a51a793c59e9793665761db4872.png

    69、USART可以操纵SPI设备。不过最大频率只有4.5MHz

    70、使用I/O口时应该注意的问题

    c4ff2d81699817500676da952272f920.png

    71、ADC的Vref+和Vdda与VSS,Vref-一定要加高质量的滤波电容,切靠近单片机。

    f4cbb7503c07e9fec85a4eaa472bebdd.png

    72、ADC分为规则组和注入组,前者有16个通道,后者有4个通道。并且16个通道公用一个数值寄存器,注入组的4个通道分别有一个数值寄存器。

    a09433306a11fe49f5fc77cb709a6cd2.png

    73、采样频率越高,输入阻抗要求越小。

    74、Stm32进入中断的最短周期为6个周期

    75、

    fd649fd6014f3577df991c560e145813.png

    76、

    34165a3183c03bfa9a44e5207c87df7b.png

    77、FSMC,即灵活的静态存储控制器。能够与同步或异步存储器和16位PC存储器卡接口,STM32的FSMC接口支持包括SRAM、NANDFLASH、NORFLASH和PSRAM等存储器。

    \78、平时所说的U盘里的FLASH存储器有两种类型:NANDflash和NOR flash。

    NAND FLASH

    NOR FLASH

    不能直接运行里面的代码

    可以直接运行里面的代码

    写入和擦除速度快

    写入和擦除速度慢

    读取速度稍慢

    读取速度稍快

    擦写周期100万次

    擦写周期10万次

    成本低,容量高

    成本高,容量低

    一般为串行接口

    有SRAM接口

    79、TFT在操作时,可以当作外部SRAM来操作,这样的话,如果单片机有FSMC接口,就可以使用NORFLASH的SRAM接口去控制,速度非常快。

    80、Stm32的的FSMC有4个256MB的存储块,一共寻址1GB的外部存储器空间。

    bf0b9fabdd769f18e894f91a77e48280.png

    81、在STM32内部,FSMC的一端通过内部高速总线AHB连接到内核Cortex-M3,另一端则是面向扩展存储器的外部总线。内核对外部存储器的访问信号发送到AHB总线后,经过FSMC转换为符合外部存储器通信规约的信号,送到外部存储器的相应引脚,实现内核与外部存储器之间的数据交互。

    82、FSMC中的DATASET和ADDSET的设置需要参看外部存储器的时序图来确定。一般而言,DATASET指的是数据建立时间,也就是读/写信号开始到读/写信号停止(上升沿存储数据)的持续时间。(一般来说写比读快!)。而ADDSET指的是地址建立时间,指的是片选之后到读/写操作之前的时间,这是针对SRAM来说的,如果操纵的是TFT,不存在地址线,所以此时的ADDSET就是读/写信号结束到RS电平的转换时间。

    a457f88d44fc33d0d4396e6578ee025e.png

    83、bf0b9fabdd769f18e894f91a77e48280.png

    84、

    003e97660dea28f62330ce54e9f6eab0.png

    85、FSMC的三个配置寄存器:FSMC_BCRx(片选控制配置)、FSMC_BTRx(片选时序)、FSMC_BWTRx(片选写时序)。

    86、RTC时钟配置必须要用到BKP寄存器,BKP寄存器在单片机复位、电源复位、待机唤醒模式下是不会更改值的,他的供电由VDD供电,VDD被切断后自动切换至外部的VBAT供电。

    87、要修改BKP寄存器的值,必须取消其写保护的标志。BKP寄存器在上电时自动写保护。

    88、 Stm32有三种省电模式:

    d05ab6d215097de88e45294f16a71e5c.png

    三种省电模式中,耗电量从上到下依次降低,待机模式的电流仅为2uA。

    89、从待机模式中唤醒单片机等效于让单片机复位,但是电源寄存器的值会有一个标志位指示单片机是被唤醒的,不是被复位的。

    90、ADC的时钟不要超过14MHz,否则转换精度会下降。最大转换速率为1MHz,即转换周期为1us(14MHz,采样周期为1.5个ADC时钟)

    91、Tcovn=采样时间+12.5个周期。采样时间尽量选长一点,这样精度高一些,但是转换速率下降,这也是有利必有弊。

    92、   

    4df35a016e2b9c3442f14c6bd054897d.png

    93、拿ARM7TDMI来说,T代表Thumb指令集,D是说支持JTAG调试(Debugging),M意指快速乘法器,I则对应一个嵌入式ICE模块。

    94、 MMU作为嵌入式处理器与应用处理器的分水岭标志à具有内存管理单元的嵌入式处理器可以定位为应用处理器。这么说M系列和A系列的处理器的区别在于A系列的处理器具有MMU单元可以进行内存模块的管理。

    95、ARM处理器有两种状态:ARM状态和Thumb状态。

    efd03724aa601180c2f7bd00864922f6.png

    96、这张图说明了一切:Thumb2指令集做了一件很伟大的事情:将16位和32位的指令集融为一体,兼容性非常强!(这么说CM3不支持某些32位ARM指令集??)

    97、

    bb3320093bf751146f2d39d597912fc2.png

    98、MSP是系统复位后使用的堆栈指针,PSP由用户的代码使用。两个堆栈指针为4字节对齐!!

    99、在ARM编程领域中,凡是打断程序运行的事件,统称为异常(exception)。

    100、因为存在LR(链接寄存器),所以可支持1级的子程序调用而不用压栈到内存,大大提高了运行速度。---à这就是说,我们在编程的时候,一级调用是不会耗费太多时间的,除非是二级调用!

    101、处理器有两种操作模式:handler模式和线程模式。

    f824687ad930127079b7318074e67c94.png

    处理器也有两种特权分级:特权级和用户级。这张图说明了一切:复位进入特权级线程模式,如果有异常,进入特权级的handler模式处理异常或中断例程,然后返回至特权级线程模式。通过修改CONTROL寄存器可以进入用户级线程模式。

    102、两个高级定时器TIM1和TIM8是挂接在APB1总线上

    103、STM32的外部中断是以组来区分的,也就是说PA0,PB0,PC0单片机是无法区分其中哪个触发的中断à均为EXIT0线中断服务例程。所以,外部中断支持16路的中断分辨率。从另一个方面来讲,我们可以设置GPIO_EXTILineConfig(GPIO_PortSourceGPIOx, GPIO_PinSourcex);来开通中断线实现组内的不同中断。

    104、DAC有两个寄存器,一个是DHR(Data HoldingRegister)数据保持寄存器,一个DOR(Data Output Register)数据输出寄存器。真正起作用的是DOR寄存器,该寄存器把值给数模转换发生单元输出以VREF+为参考电压的电压值。如果是硬件触发转换,系统将在1个ABP时钟周期后把值给DOR,如果是软件触发转换,时间为3个APB时钟周期。然后,均等待Tsetting时间(Typical为3us,Max为4us)后真正输出电压值。

    105、DAC分8位模式和12位模式,其中后者可以选择左右对齐

    106、DMA仲裁器分为软件和硬件两种。软件部分分为4个等级,分别是很高优先级、高优先级、中等、低。硬件部分由通道的大小来决定优先级,越低优先级越高。

    107、DMA有一个实时的传输数据量寄存器叫做DMA_CNDTR,最大值为65535,存放的是当前传输所要传输的数据量。当数据量变为0时,表明传输完成。

    108、 CAN总线(ControllerArea Network)。CAN控制器根据两根线上的电位差来判断总线电平,总线电平又分为显性电平和隐性电平,二者必居其一。

    109、CAN总线具有6个特点:1:多主控制(挂接在总线上的所有设备均可以成为主设备,并且设备ID是用来决定设备的优先级,没有设备地址概念),2:系统若软性(没有设备地址概念),3、通讯速度较快,通讯距离较远(1Mbps下40M,5kbps下10KM),4、具有错误检测、错误通知(通知其他设备)和错误恢复功能(强制结束发送,重复发送接收错误的信息。),5、故障封闭,当总线上的设备发生连续故障错误时,CAN控制器会把改控制器踢出总线。6、连接节点多。理论上可以无限制加载,但是受到时间延迟和电气负载的限制,实际数目是有限制的。降低传输速度可以适当增加可挂接负载个数。

    110、CAN协议有两个标准,ISO11898(针对125kbps~1Mbps的高速速率)和ISO11519-2(125kbps以下的低速速率)

    f183efbdd4435820c6d565ca1d677fca.png

    111、    

    7e3e731c7410a6771c36b45c06fcc57c.png

    112、CAN协议的有5种类型的帧:数据帧、遥控帧、错误帧、过载帧、帧间隔。其中前两种帧有标准格式(11位ID)和扩展格式(29位ID)。

    09bf6310270cbbd284db8d014235e929.png

    113、数据帧构成:

    (1) 帧起始。表示数据开的段帧起始。

    (2) 仲裁段。表示该帧优先级的仲裁段。

    (3) 控制段。表示数据的字节及保留位段。

    (4) 数据段。数据的内容,一帧可发送0~8个字节的数据。

    (5) CRC段。  检查帧的传输错误段。

    (6) ACK段。  表示确认正常接收的段。

    (7) 帧结束。 表示数据的段帧结束。

    6802de0202eacbb6cc98a86997797069.png

    114、Stm32f103系列只有一个CAN控制器,有3个发送邮箱和3级深度的2个FIFO,14个过滤组器。

    115、STM32的每个过滤组可以配置为1个32位过滤器和2个16位过滤器。除此之外,还可以配置为屏蔽位模式(ID+屏蔽)和标识符列表(ID和屏蔽寄存器均用来做ID寄存器)模式。

    116、CAN接收到有效报文被放置在3级邮箱深度的FIFO中,FIFO完全由硬件来管理。

    117、 CAN总线的波特率

    1a5a296d05a43619bd4fc683d3d9cb60.png

    118、触摸屏一般分为电阻式触摸屏和电容式触摸屏。前者检测触摸的位置原理是利用触摸屏控制器中的A/D转换器经过两次A/D读值后得出X和Y的坐标值。注意:这个X和Y的值是相对于触摸屏的,而非LCD屏。所以在这里需要注意两个概念:触摸屏和LCD屏。这是两个不同的概念,也是两个不同的物理结构,其中电阻触摸屏是由上下两个导电层中间夹着一层非常薄的透明隔层;而LCD就是指显示屏。

    119、 电阻触摸屏有X和Y、X和Y的比例因子、坐标轴方向、偏移量。LCD也有自己的这些参数。两者完全不相干,所以在定位的时候需要进行坐标转换。公式:

    6ac9fecf24e4c586027133b9537b14ec.png

    ,通过对屏幕的四个点进行校准,得到四元一次方程,求解即可。

    120、NEC协议的数据帧格式:同步码头、地址码、地址反码、控制码、控制反码。同步码由一个9ms的低电平和一个4.5ms的高电平组成,地址码、地址反码、控制码、控制反码均是8位数据格式。按照低位在前,高位在后的顺序发送。

    121、NEC协议在发送的时候,会有560us的38KHz的载波信号,而在接收的时候这部分载波信号被认定为低电平,而剩余的(2.25ms-650us)的逻辑“1”和(1.12ms-650us)的逻辑“0”时间则被认定为高电平。

    122、在单位时间内的位移被定义为速度,速度有线速度和角速度之分,分别对应两种传感器测量这两种不同的速度:线速度传感器(加速度计)、角速度传感器(陀螺仪)。前者多应用在静态或者低慢速运动中的姿态求解,后者多应用在动态运动中姿态求解。

    123、根据标准约定,零加速度(或零 G 准位)通常定义为相当于最大输出值(12 位输出为 4096,10 位输出为 1024 等)一半的输出。对于提供 12 位输出的加速度计,零 G 准位将等于 2048。输出大于 2048 表示正加速度。输出小于 2048 表示负加速度。加速度的数量通常用单位 g (1g = 9.8m/s2 = 重力加速度)表示。通过确定测量的输出与零 G 准位之间的差值,然后除以加速度计的灵敏度(用计数/g 或 LSB/g表示)来计算加速度。对于提供 12 位数字输出的 2g 加速度计,灵敏度为 819 计数/g 或 819 LSB/g。加速度等于:a = (Aout - 2048)/(819 计数/g),单位为 g。

    124、加速度计测得的加速度的方向和设备设定的坐标系是相反的,因为原理表明在测量力的时候采用的是非惯性系参考系,而我们高中时代研究的坐标系是惯性系参考系,前者在物体进行运动产生加速度时,假想一个与速度方向相反的力作用在物体上,这个力就是惯性力;后者我们说不存在惯性力,只说存在惯性,因为在惯性坐标系中,我们研究的是物体,而非坐标系(即假定坐标系相对地球静止),当我们把坐标系也考虑在内时,当坐标系运动,就产生了惯性力f,这种力作用会假想作用在物体上,只是与运动方向相反。

    125、由上可知,加速度计的本质是测量力而非加速度。

    126、NRF24L01工作在2.4GHz的频段,由于频段频率较高,所以传输速率较快,为2Mbps

    127、STM32的闪存模块由:主存储器、信息块和闪存存储器接口寄存器3个部分构成。主存储器用来存放代码和const常量;信息块由两个部分组成:启动程序代码、用户选择字节。其中启动程序代码为ST公司自带的启动程序,用于串口下载。最后的闪存存储器接口寄存器用于控制整个对闪存区域的操作。

    128、CPU的运行速度比FLASH的操作速度快的多,一般FLASH的最快访问速度≤24Mhz。如果CPU的速度超过这个频率,那么在读取FLASH的时候必须加入等待时间(FLASH_ACR设置)

    129、FLASH编程时,写入必须为半字(16位)。并且在写入的时候必须保证所写区域的数据必须为0xFFFF。

    130、STM32的FSMC有HADDR[27:0],其中[27:26]用来选择BANK区域的4个不同块。剩下的[25:0]则用来连接外部存储区域的地址线FSMC_A[25:0]。如果数据宽度是8bit,此时的HADDR[25:0]和FSMC_A[25:0]是完全对应的。如果数据宽度是16bit,此时的HADDR[25:1]和FSMC_A[24:0]是对应起来的。需要注意:无论数据宽度是多少,外部的FSMC_A[0]和A[0]总是对应的。

    131、关于LB和UB的信号控制是由硬件自动控制的,当AHB的数据宽度小于外部存储器的数据宽度时,此时LB和UB的控制信号自动产生(比如字节读取/写入16bit的外部存储器)

    132、 __attribute__ (函数属性、变量属性、类型属性等)。如果在使用SRAM时,可以采用u32 sram_array[xx] __attribute__ ((at(0x68000000))代表将外部SRAM的空间全部给了sram_array这个变量,他具有在at0x68000000这个地址的属性。往里面写值就直接在SRAM里面写值。

    133、

    7ad94f9874d7894b938e96ebdba671e5.png

    内存管理有一种方式叫做分块式内存管理。

    注意表中的分配方向,从顶到底。每一项对应一个内存块。里面的数值代表了内存池的状态:如果为0,表示该内存没有被分配;如果非0,那么数值的大小就表示了该块内存被连续占用的内存数。比如说数值为20,意思是包括该项在内的内存块被连续占用了20块分给了指针。

    134、SD卡的分类:

    743b3a1bb15e3399eb90316999fa9fbf.png

    一般的SD卡支持两种传输模式:SD卡模式(SDIO)、SPI模式。显然前面一种是专用模式,所以速度比较快。

    135、常用的汉字内码系统有GB2313、GB13000、GBK、BIG5(繁体)。其中GB2313只有几千个汉字,而GBK则有2万多汉字。

    136、 要显示汉字,采用的方式如果用点阵的形式是不可取的,因为这无法查找汉字。采用的方式就是内码系统。GBK标准中,一个汉字对应2个字节:前者称为区(0x81~0xFE)后者为(0x40~0x7E)和(0x80~0xFE)。前者有126个区,后者有190,那么可以显示的汉字数量有126*190=23940个。根据这两个值用来查找字库,字库中存放的还是每个汉字的点阵数据。这个字库非常大,如果是16*16的字体,那么一个字体就需要32个字节,如此说来需要23940*32=748K的空间,可见非常大,所以需要外部的Flash来存储这个字库。

    137、由于汉字内码系统不具有国际通用性,但是Unicode几乎把所有的语言都放置进来,这样在单片机中操作汉字时,就需要将GBK和Unicode转化。尤其是在FATFS中,创建中文文件名和读取中文文件信息时需要将Unicode换转为GBK后再进行修改操作,再反转换成Unicode保存修改。这么说,两者的存在是由于标准的不统一,并且Unicode中只有6064个汉字,而GBK显然是一种汉字扩展。

    138、BMP图片编码的顺序是从左到右,从下到上。

    139、VS1053是一款高性能的数字音频解码芯片,从SD卡中将mp3等音乐音频文件通过SPI送给VS1053后,由其进行音频解码,输出音乐给耳机。耳机驱动可以采用TDA1308芯片,这款芯片为AB类耳机驱动芯片。

    8d46c58554153dc05b0dd94fed17c8bd.png

    140、    

    141、IAP(In Application Programming)在应用编程是为了后期开发更新程序方便而提出的概念。具体的实现方法如下图所示:

    142f5564685777153940815421da3442.png

    在普通编程中,flash中的code是通过JTAG和ISP等工具下载到单片机中。而在IAP编程中,flash被分区为A和B两个区域,A区域只允许用USB/USART等方式下载,此区域作为更新B区域的代码用。B区域则是用户的code区域,真正的代码在这里被执行,放置的就是app。

    3fe786c9dfdd78bd21cb1757fe9c980f.png

    上图表示STM32正常运行的流程图,可以看到上电复位后系统从0x80000004处开始运行程序,这里放置的是复位中断向量,然后跳转至复位中断程序入口后再跳转至main函数运行用户的程序。

    3933c84bf34615c3c77a9f28f82f0fc8.png

    上图表示加入IAP后的STM32程序运行流程图。可以看到上电复位后跳到IAP程序的main函数处运行IAP过程(这个过程就是把下面灰底色块的程序代码烧进B区域à代码更新)。后面的过程和STM32正常运行一样,如果出现中断请求,还是跳转到A区域中的中断向量表中,然后再跳转到B区域的中断服务入口。

    142、    USB有四根线,VCC、GND、D+、D-。在USB主机上,D+和D-均通过一个15K的电阻接地,这样两条线均为低电平。在USB设备中,对于高速设备会在D+通过一个1.5K的电阻接到VCC,而低俗设备会在D-通过一个1.5K的电阻接到VCC。这样主机就可以通过D+和D-的高电平的到来来检测是否有设备接入,并且识别高低速设备。

    143、    UCOSII是一种实时操作系统,具有执行效率高、占有空间小(最小内核2KB)、实施性能优良、扩展性强和移植性强等优点。

    82713e7d10754cb36a81ada3f48d8eff.png

    UCOS具有多任务并发工作的特点(注意,任何时候只有一个任务能够占用CPU。并发只是任务轮流占用CPU而不是同时工作)。最大支持255个任务并发工作。

    推荐阅读:

    • 【MCU】一种单片机节省内存的方法

    • 芯片级拆解:世界第一颗FPGA

    • 你眼里的嵌入式工程师是这样的吗?

    • 模块化编程到底有多重要?

    • 硬件工程师日常崩溃图鉴

    • 33岁入行嵌入式软件开发晚不晚啊?

    • 干货||稀里煳涂学习STM32完整版

    • 【视频】教你DC-DC及做一个开关电源,不信你学不会!

    • 什么是PWM“死区”?

    • 这2个单片机编程的思想,请你掌握

    • 长文:嵌入式程序员的编程修养

    • 485通信自动收发电路 历史上最详细的解释

    • 多个单片机的通信方式【详细】

    • 10个单片机电路设计中的难点,你都解决了吗?

    扫描二维码关注我们

    dfb306bc5c3cc07c5c2c341c648745c3.png

    微信号 : danpianji888

    展开全文
  • 1)实验平台:【正点原子】 NANO STM32F103 开发板2)摘自《正点原子STM32 F1 开发指南(NANO 板-HAL 库版)》关注官方微信号公众号,获取更资料:正点原子第十三章 定时器中断实验第十三章 定时器中断实验这一章,...
  • 基于STM32的RTC实时时钟实验

    千次阅读 2020-09-26 11:00:56
    基于STM32的RTC实时时钟实验 RTC是什么STM32的RTC外设,实质是一掉电后还继续运行的定时器,从定时器的角度来看,相对于通用定时器TIM外设,它的功能十分简单,只有计时功能(也可以触发中断).但是从掉电还能继续...
  • STM32F103制作模拟时钟成功

    千次阅读 2020-12-21 19:55:44
    认识众多玩家高手/拆客/DIYer,查阅更资源,一起学习技术知识您需要 登录 才可以下载或查看,没有帐号?...让我们一起来做一LCD320*240模拟指针式时钟,Let\'s GO!!LCD320*240的底层驱动很简单,利用时序图...
  • STM32时钟模块 STM32F103RCT6

    千次阅读 2017-08-15 22:14:23
    跟51相比较STM32时钟模块变得比较复杂起来这主要得益于STM强大的各种功能。对于不同的模块需要用到的时钟频率是不一样的。... 首先我们来聊一下时钟的来源(图中标红了的5数据),时钟源一共5。其中的PLLC
  • STM32之RTC(实时时钟)代码讲解

    千次阅读 2020-06-01 23:20:41
    STM32 的实时时钟(RTC)是一独立的定时器。STM32 的 RTC 模块拥有一组连续计数的计数器,在相应软件配置下,可提供时钟日历的功能。修改计数器的值可以重新设置系统当前的时间和日期。 RTC 模块和时钟配置系统...
  • stm32——RTC实时时钟

    千次阅读 2017-12-04 10:48:55
    一、关于时间  2038年问题  在计算机应用上,2038年问题...这种时间表示法在类Unix(Unix-like)操作系统上是一标准,并会影响以其C编程语言开发给其他大部份操作系统使用的软件。  在大部份的32位操作系
  • 当设计中使用I2C的数量多于1个时,其底层I2C的代码逻辑都是一样的,只有IO口变了,为此还要复制粘贴、修改IO,不仅费时,而且还浪费片内资源,因此可以使用指针来重复执行IIC底层代码,实现一个代码,多个IO使用。...
  • stm32通过ESP8266模块获取天气,时间
  • STM32中文参考手册V10》-第16章 实时时钟(RTC)   RTC实时时钟 RTC实时时钟简介 实时时钟是一独立的定时器。RTC模块拥有一组连续计数的计数器,在相应软件配置下,可提供时钟日历的功能。修改计数器的值...
  • stm32 RTC时钟配置

    千次阅读 2017-12-11 11:27:25
    stm32——RTC实时时钟一、关于时间 2038年问题 在计算机应用上,2038年问题可能会导致某些软件在2038年无法正常工作。所有使用UNIX时间表示时间的程序都将将受其影响,因为它们以自1970年1月1日经过的秒数(忽略...
  • stm32点亮三led灯

    2021-10-23 14:34:27
    stm32点亮led灯stm32点灯原理建立工程文件...首先我们要明白,利用stm32点灯一等要相关的启动文件,和寄存器配置文件 [点灯相关文件] (https://pan.baidu.com/s/14K3Xz5KyCv-5iLk0U2iP3w) 提取码:936q 三级目录 ...
  • STM32+RTC实现时钟无法设置时间以及掉电时间清零的问题 最近在实现一万年历的功能,其中遇到了无法设置时间以及掉电时间清零的问题。 .h文件代码如下: #ifndef __RTC_H #define __RTC_H //时间结构体 typedef ...
  • STM32 中 SysTick时钟的配置

    千次阅读 2018-03-17 15:25:55
    SysTick_Config(SystemFrequency / 10) 函数的形参就是systick重装...SysTick是124bit递减计数器,通过对SysTick控制与状态寄存器的设置,可选择HCLK时钟(72M)或HCLK的8分频(9M,缺省是这)作为SysTick的时钟源...
  • #include "stm32f10x.h" //STM32头文件#include "sys.h"#include "delay.h"#include "usart.h"#include "flash.h"#define FLASH_START_ADDR0x0801f000 //写入的起始地址//READ_RTC_ADDR[7] = {0x81, 0x83, 0x85, 0x....
  • 关键字:分析RT-Thread源码、stm32、RTOS、时钟管理。 简介 完成了调度器,对象管理,线程管理后,我们就可以任务并行执行了,但是还是问题,例如我们同优先级的线程,在不挂起的情况下,只能通过手动...
  • 江涛带你玩0.96-OLED之实战stm32的RTC时钟(上)

    千次阅读 多人点赞 2020-03-19 14:05:17
    前言 准备工作 关于OLED驱动 SPI和IIC的异同点 显示函数 改造显示函数 RTC时钟 特殊指令 演示效果 代码地址 参考文献 ...
  • STM32 最小系统

    千次阅读 多人点赞 2021-03-23 08:57:39
    单片机最小系统是指用最少的电路组成单片机可以工作的系统,通常最小系统包含:电源电路、时钟电路、复位电路、调试/下载电路,对于STM32还需要启动选择电路。 电源电路 不同的MCU的工作电压可能是不一样的,比如51...
  • STM32滴答时钟SYStick的优先级设定方法 原文链接 滴答寄存器Systick的定义和地址分配如下 typedef struct { __IO uint32_t CTRL; /*!< Offset: 0x00 SysTick Control and Status Register */ __IO uint32...
  • 手把手之STM32I2C总线

    2020-12-22 12:36:46
    ●IIC总线1、IIC的概念I?C是Inter-IntegratedCircuit的缩写,用两条双向的线,一条 Serial Data Line (SDA) ,另一条...SDA:双向数据线,OD门,与其它任意数量的OD与OC门成"线与"关系。每一I2C总线器件内部的...
  • 【From Zero To Hero】专栏开刊词STM32服务上线月了,非常感谢大家的关注。我们在大家提供产品资讯、技术内容以外,还想通过这窗口初级工程师解读普适性的技术要点,以帮助大家更快更好地了解产品、...
  • 参考STM32F1开发指南(精英版)库函数版---第五章 一、SystemInit时钟初始化函数 使用V3.5版本的库函数,该函数在系统启动之后会自动调用: startup_stm32f10x_xx.s文件中: ; Reset handler Reset_Handler...
  • 你会担心STM32时钟PLL各参数配错吗?

    千次阅读 2019-05-08 20:59:56
    置顶/星标公众号,不错过每一条消有些朋友不理解为什么STM32时钟要先倍频N倍,再分频?你会担心这值太大吗?1写在前面STM32时钟的功能,可以说是越来越强大了。从各个...
  • STM32时钟系统

    2015-08-24 11:18:11
    众所周知,时钟系统是 CPU 的脉搏,就像人...为什么 STM32 要有多个时钟源呢? 因为首先STM32 本身非常复杂,外设非常的多,但是并不是所有外设都需要系统时钟这么高的频率,比如看门狗以及 RTC 只需要几十 k
  • 一、 硬件连接如下图 二、 Main程序设计1、 初始化IO口。 void GPIO_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOD, ENABLE); /*开启时钟*/
  • 使用STM32固件库开发GD32 汇总

    千次阅读 2021-10-01 00:07:23
    内部FLASH 区别使用STM32库开发时钟配置区别1. 晶振起振区别描述解决方法2. 部分客户使用有源晶振出现问题,在 GD32F103 小容量产品,发现会在 MCU 的复 位管脚一直把电平拉到0.89V,电平不能保持在高电平描述解决...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,920
精华内容 1,568
关键字:

为什么stm32要有多个时钟源

友情链接: vcshijian.rar