F4的认识

注意:该同学学识超级浅,文章可能会有许多错误额地方,如果有不认同的和觉得错误的,请麻烦您指出,互相学习。  

自我认为:学习一款单片机的方法, 先看其本身的性能的参数,以及启动函数,时钟的设置(特别是时钟树的分析,基本分析过之后,对整个芯片的架构就会有很大的了解)。在学习如何通过该芯片驱动外设。

        f4 的时钟的配置:(一张图告诉你太多太多的信息,在配上一个内部设备的映射和连接图。简直“太库啦”)

x

HSE:取值的范围大概4到25MHZ, 但目前使用的大多数的采用外部的高速晶振8M, 经过8M分频进入PLL锁相环电路中的336N的倍频,然后2P分频为168Mhz的sysclk, 8分频为21MHZ作为系统定时器的系统时钟的滴答定时器,DMA直接不分频,经过二分频为84MHz作为APB2的时钟频率, 经过四分频为42MHz作为APB1的时钟频率,

        注意:在APB1和APB2上的定时器的不同的情况下时钟的频率不一样, 这对后期的定时器的使用有用处:

        

定时器时钟频率分配由硬件按以下 2 种情况自动设置:
  如果相应的 APB 预分频系数是 1,定时器的时钟频率与所在 APB 总线频率一致。
 否则,定时器的时钟频率被设为与其相连的 APB 总线频率的 2 倍。
当APB1 prescaler != 1时, APB1上的TIMxCLK = PCLK1 x 2 = SystemCoreClock / 2;   168M
当APB2 prescaler != 1时, APB2上的TIMxCLK = PCLK2 x 2 = SystemCoreClock;     84M
APB1 定时器有 TIM2, TIM3 ,TIM4, TIM5, TIM6, TIM6, TIM12, TIM13,TIM14
APB2 定时器有 TIM1, TIM8 ,TIM9, TIM10, TIM11
接下来是时钟的配置和开始的函数
         SystemInit()函数
        该函数的用处:复位前使用的LSI作为时钟震荡源。接着会失能所有的中断后进入一个特别重要的函数SetSysClock()进行各个时钟的配置和设置(设置HSE作为系统的时钟源,等待和检测是否配置成功,以及是能电源的管理和HCLK的配置,随后判断芯片的类型进行对相应的PCLK1和PCLK2分频,以及PLL内部的设置使能,并进行等待检测是否设置成功。初始化成功后,便可以进入主函数了。)查看该函数的使用尽量结合这参考手册,尝试着分析。

接着就是GPIO的探讨了。

F4的GPIO和F1的GPIO还是有很大的区别的。首先是寄存器的数目就要比F1的多(但引脚的配置的更丰富和细致操作化)

        (1)有四个 32 位配置寄存器(GPIOx_MODER,GPIOx_OTYPER, GPIOx_OSPEEDR 和

GPIOx_PUPDR):用来配置输出的模式,类型,速度,上下拉
        (2)两个 32 位数据寄存器(GPIOx_IDR 和 GPIOx_ODR):数据的写入和读取
        (3)一个 32 位置位/复位寄存器(GPIOx_BSRR):对 GPIOx_ODR相应的某一个位进行输出的操作。
        (4)一个 32 位 GPIO 锁寄存器(GPIOx_LCKR):锁定IO的寄存器, 我觉得用的地方少,
        (5)两个 32 位复用功能寄存器(GPIOx_AFRH和 GPIOx_AFRL):引脚的复用功能的操作。
gpio可配置的模式:
输入浮空
输入上拉
输入下拉
模拟输入
具有上拉下拉功能的开漏输出
具有上拉下拉功能的推挽输出
具有上拉下拉功能的推挽复用功能
具有上拉下拉功能的开漏复用功能(和F1的区别在于输出的时候可以配置上下拉的功能,)在某些的传感器的外设的数据的获取上需要配置,但是该上拉网上有的说是若上拉,有些时候还要加上外部硬件电路的强上拉(外接上拉电阻)
与F1的区别在于输入口的上拉电阻,在F1的上拉和下拉只在输入部分单元。需要注意一下。
关于JTAG引脚的复位前后的状态:
复位期间和刚复位后,复用功能未开启,I/O 端口被配置成浮空输入模式,复位后,JTAG 引脚被置
于输入上拉或下拉模式。
PA15:JTDI 置于上拉模式
PA14:JTCK/SWCLK 置于下拉模式
PA13:JTMS/SWDAT 置于上拉模式
PB4:JNTRST 置于上拉模式
PB3:JTDO 浮空状态
可以禁止部分或者全部的 JTAG/SWD 引脚,当做通用 IO 来使用。(对于F103C8T6的单片机而言:多处两个口是真的有用。我经常就是用c8t6的时候,在最后程序快调试完后,失能JTAG,用在其他的地方。)
引脚的复用的查询:可以通过电路和复用表来进行查询:

 具体的其他的可参考相关的参考手册和数据手册来进行查询。

另外对于时钟引脚:

当 LSE 振荡器关闭时,LSE 振荡器引脚 OSC32_IN/OSC32_OUT 可以分别用做 GPIO 的 PC14/PC15, LSE 功能始终优先于通用 I/O 口的功能,这里有一点需要注意,当关闭 1.8V 电压区(进入待机模式)或后备 区域使用 VBAT 供电(不再有 VDD 供电)时,不能使用 PC14/PC15 的 GPIO 口功能。
外部振荡器引脚 OSC_IN/OSC_OUT 可以用做 GPIO 的 PH0/PH1,前提是 HSE 外部振荡器是关闭着 的。当 HSE 振荡器开启的话,这两个引脚只能配置成 OSC_IN/OSC_OUT。
外设GPIO的模式的配置:

更多相关的可以参考F103和F407的手册。

GPIO库函数的分析:

1.使能 GPIO AHB 时钟
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOx, ENABLE);
2.用函数 GPIO_Init()配置 GPIO 引脚,主要有以下四种配置方式
3.通过函数 GPIO_ReadInputDataBit()读取输入数据寄存器的数据
4.在输出模式时,通过函数 GPIO_SetBits()/GPIO_ResetBits()配置引脚的置位和复位
5. void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal)
上面三个函数很简单主要通过操作寄存器 BSSRL 和 BSSRH 两个寄存器来操作 ODR 寄存器,这样的 好处,防止使用“读-修改-写”的方式来操作寄存器时发生中断,造成数据错误。
6. void GPIO_ToggleBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
通过 GPIOx->ODR ^= GPIO_Pin;实现翻转功能。
LED 的驱动使用的是灌电流的方式,也就是 IO 口输出低电平时 LED 点亮。STM32 的 GPIO 输
出拉电流和灌电流的驱动能力是一样的。如果使用拉电流方式,那么 LED 的驱动电流将由 MCU 的 VCC 引脚提供。
下一次交流交流EXTI。
EXTI(External interrupt/event controller)外部中断事件控制器,分享一张图,对整个EXTI做出全面的分析

 

从图中可以看到上升沿寄存器(EXTI_RTSR),下降沿寄存器(EXTI_FTSR),软件中断事件寄存器(EXTI_SWIER),中断屏蔽寄存器(EXTI_IMR),事件屏蔽寄存器(EXTI_EMR),挂起寄存器(EXTI_PR)
中断可以分为:硬件中断选择,硬件事件选择,软件中断/时间寄存器
要产生中断,线使能相应的中断线,配置上升沿或者下降沿的触发的寄存器,同时在中断屏蔽寄存器位“1”允许中断使能,当外部中断发生了相应的边沿触发后,产生中断的请求,对应的挂起寄存器置为“1”,然后对其写“1”,清楚中断的请求。
三种中断的相应的寄存器的操作:
中断寄存器的高级为被用作:
EXTI 线 16 连接到 PVD 输出
EXTI 线 17 连接到 RTC 闹钟事件
EXTI 线 18 连接到 USB OTG FS Wakeup 事件
EXTI 线 19 连接到 Ethernet Wakeup 事件
EXTI 线 20 连接到 USB OTG HS (configured in FS) Wakeup 事件
EXTI 线 21 连接到 RTC Tamper and TimeStamp 事件
EXTI 线 22 连接到 RTC Wakeup 事件
(1): 硬件中断选择
通过下面的过程来配置 23 个线路做为中断源:
配置 23 个中断线的屏蔽位(EXTI_IMR)
配置所选中断线的触发选择位(EXTI_RTSR 和 EXTI_FTSR)
配置对应到外部中断控制器(EXTI)的 NVIC 中断通道的使能和屏蔽位,使得 23 个中断线中的请求 可以被正确地响应。
(2) 硬件事件选择
通过下面的过程,可以配置 23 个线路为事件源
配置 23 个事件线的屏蔽位(EXTI_EMR)
配置事件线的触发选择位(EXTI_RTSR 和 EXTI_FTSR)
(3) 软件中断/事件的选择
23 个线路可以被配置成软件中断/事件线。下面是产生软件中断的过程:
配置 23 个中断/事件线屏蔽位(EXTI_IMR, EXTI_EMR)
设置软件中断寄存器的请求位(EXTI_SWIER)
外部中断的几个重要的函数的分析及其相应的作用:
        通过函数 GPIO_Init()配置相应 I/O 是输入模式
        通过函数 SYSCFG_EXTILineConfig()将 I/O 复用到中断线
        通过函数 EXTI_Init()选择中断模式(interrupt, event)和触发方式(Rising, falling or both)
         通过函数 NVIC_Init(),将中断线映射到相应的 NVIC 中断通道。
通过void EXTI_DeInit(void) 进行复位相应的寄存器的操作。

引脚配置相应的输入后,通过void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct)对相应的寄存器进行初始化(中断线号,中断的模式的选择,中断的触发的方式,使能中断失能)需要注意的是:当PA0和PB0同时复用到同一中断的线上的时候,只有一个中断被响应。中断配置完成后,通过void EXTI9_5_IRQHandler(void)执行响应的操作。具体用到哪一个中断,可用中断状态获取中断线if(EXTI_GetITStatus(EXTI_Line5) != RESET)。

特别注意的是,一定要注意:产生中断后必须在中断请求函数中清除中断位,要不一直会进入中断。

SYSTICK(滴答定时器):24位递减计数器,可以喊声中断,用的最多的做延时函数的调用,中断使用较少(我感觉啊,可能错误)
相应的四个寄存器如下图所示:
相应的systick的库函数的分析:
(1)void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource)
滴答定时器的时钟源的配置。(时钟源可以为HCLK或者是HCLK/8,经常用的为HCLK/8 = 168/8 = 21MHZ)
(2) __STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)

 函数主要检测冲转载的值是否大于一,设置滴答定时器的中断优先级为15,最低,和使能相应的中断寄存器。

具体相关函数可参考正点原子和野火的代码。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值