CubeMX操作:
1.1选择芯片型号
1.2双击右下角型号进入设置部分
1.3打开System Core,并勾选SYS中的Debug为Serial Wire
在系统核心中,Sys组件被用于实现调试功能。Sys通常是一个特殊的调试接口,用于与处理器进行通信,并允许开发人员读取和写入内部寄存器、跟踪程序执行等。
在系统内核(system core)中,sys使用serial wire而不是JTAG(Joint Test Action Group)的原因有以下几点:
1. 简化连接:Serial wire使用少量的引脚(通常只需要两根),而JTAG需要更多的引脚(通常需要四根或更多),这使得使用serial wire更加方便和灵活。
2. 调试速度:Serial wire具有更高的调试速度,可以实现更快的数据传输速率,从而加快调试和开发过程。
3. 调试能力:Serial wire可以提供与JTAG相同的基本调试功能,例如读写寄存器、设置断点和单步执行代码等。因此,从功能上来说,serial wire可以满足大多数调试需求。
4. 功耗考虑:相比JTAG,serial wire通信的功耗更低。这对于功耗敏感的系统设计非常重要。
需要注意的是,选择使用serial wire还是JTAG取决于具体的应用和所使用的MCU(Microcontroller Unit)或处理器。不同芯片可能会使用不同的调试接口,开发者需要根据具体情况做出合适的选择。
1.4在RCC中选择系统高速时钟
RCC(Reset and Clock Control)是一个硬件模块或外设,它用于控制和配置处理器系统的复位和时钟。
RCC模块通常包含以下功能:
1. 时钟源选择:RCC模块允许选择不同的时钟源,如内部振荡器、外部晶振、PLL(Phase-Locked Loop)等。时钟源的选择会影响整个系统的时钟频率和稳定性。
2. 时钟分频和倍频:RCC模块可以通过分频和倍频功能来调整系统时钟的频率。这对于匹配不同外设和处理器的工作频率非常重要。
3. 时钟使能:RCC模块通过控制各个外设的时钟使能位,来启用或禁用这些外设的时钟信号。这样可以在需要的时候降低整个系统的功耗。
4. 复位信号控制:RCC模块可以产生和控制系统复位信号,包括系统复位、外设复位和引脚复位等。复位信号用于将系统和外设恢复到初始状态,以确保系统的可靠启动和初始化。
RCC模块通常是嵌入式系统中的重要组成部分,它的功能非常关键,因为时钟和复位是处理器和外设正常运行的基础。在编程中,开发者可以使用相关的寄存器和位字段来配置和控制RCC模块的功能。
1.5配置GPIO,设置PC2引脚为输出模式(GPIO_OutPut)
1.6配置系统时钟
定时器概述:
STM32F411RCT6 有 1个高级定时器TIM17个通用定时器TIM2-5, TIM8-111个实时时钟RTC2 个看门狗 定时器, 独立看门狗 IWDG 和窗口看门狗 WWDG1 个 CM4 内核 SysTick 定时器
定时器特征比较:
我们选择TIM3作为系统时钟:
TIM3功能:16位向上、向下、中央对齐方式自动装载 计数器16位 可编程预分频器 ,可实时修改每个TIM 有 4 个 独立通道 ,可用于输入捕获、输出比较、 PWM 输出TIM3硬件结构可分成3个部分:
时钟源时基单元(TimeBase)捕获和比较通道
时钟树:
系统时钟频率为96MHZ,根据定时时间T,来计算Period与Prescaler
定时时间由 TIM_Base_InitTypeDef 中的 Prescaler 和 Period 设定设定定时器时钟源频率为TIMxCLK , 定时时间T=(Period+1)*(Prescaler+1)/TIMxCLK
Period(周期)和Prescaler(分频器)是用于控制定时器和计数器的两个重要参数。
Period是指定时器或计数器的计数周期,也可以理解为计数器从0开始递增至指定值的时间。它决定了计时器或计数器的精度和时间间隔。
Prescaler是用于分频器的参数。分频器可以将输入信号的频率降低,从而降低输出频率。例如,如果将分频器的值设置为2,那么输入信号的频率将被除以2,输出信号的频率也将降低一半。
在定时器和计数器中,周期和分频器通常被用来控制计数的速度。周期决定了计数器在多长时间内进行一次计数,而分频器决定了计数器每个周期中进行几次计数。通过调整这两个参数,可以实现不同的计时或计数需求。
例如,如果我们需要一个精确的1秒钟的定时器,我们可以设置一个特定的周期(比如1秒钟所需的计数)和一个适当的分频器(使计数器以适当的速率进行计数),以实现精确的1秒钟的定时。
1.6配置定时器
Clock configuration(时钟配置)是指在微控制器或嵌入式系统中设置和配置系统时钟源和时钟分频器等参数的过程。
在嵌入式系统中,时钟被用来同步各个组件和外设的操作,并提供准确的计时和定时功能。时钟配置的目的是确保系统内部的各个部件和外设都能按照预期的速率和时间间隔进行操作。
时钟配置通常包括以下几个方面:
1. 选择时钟源:根据具体的硬件平台和需求,选择适合的时钟源,例如晶体振荡器、内部RC振荡器、PLL(锁相环)等。
2. 配置时钟分频器:根据系统的需求,设置时钟分频器,可以将系统时钟分频为更低频率的时钟信号,用于不同的模块或外设。
3. 配置时钟模式:设置时钟的工作模式,如连续工作模式、低功耗模式等。
4. 校准时钟:有时候需要对时钟进行校准,以确保准确的时间计算和定时功能。时钟配置对于系统的稳定性、功耗、性能和准确性至关重要。不正确的时钟配置可能导致系统运行不稳定、时序错误、外设无法正常工作等问题。
1.7选择Toolchain 为MDK-ARM V5,STM32Cube FW_F4 V1.24.0
1.8最后点击右上角的GENERATE CODE生成代码框架
1.9打开生成的keil文件,在main函数中添加如下代码,同时打开时钟
HAL_TIM_Base_Start(&htim3);//打开时钟
if(__HAL_TIM_GET_FLAG(&htim3, TIM_FLAG_UPDATE))
{
HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_2);
__HAL_TIM_CLEAR_FLAG(&htim3, TIM_FLAG_UPDATE);
}//设定标志位
`__HAL_TIM_GET_FLAG`函数用于检测定时器3的指定标志位是否被置位。在这里,它的第一个参数是定时器的句柄`htim3`,第二个参数是要检测的标志`TIM_FLAG_UPDATE`,该标志位表示定时器的更新事件。如果该标志位被置位,则条件成立,进入代码块中的逻辑。
在代码块中,`HAL_GPIO_TogglePin`函数用于在GPIOC的第2个引脚上切换电平状态,即将引脚状态从低电平切换到高电平或从高电平切换到低电平。这段代码的作用是使GPIOC的第2个引脚在每次定时器3更新时切换电平。
最后,`__HAL_TIM_CLEAR_FLAG`函数用于清除定时器3的指定标志位。在这里,它的第一个参数是定时器的句柄`htim3`,第二个参数是要清除的标志`TIM_FLAG_UPDATE`。通过清除标志位,可以准备下一次对定时器更新事件的检测。