时钟树最主要的就是中间的总频率,左边可以分为内部时钟与外部时钟,右边是各种元件,就是下图的APB1和APB2和其他的元件
一般选用高速外部时钟,频率调成最大,然后让他自己配置。
下面展示一段使用时钟的具体例子:
这里我选用内部时钟,最大频率64MHz。
选基础的TIM4。
配置时钟:
Prescaler:预分频系数,想让频率除以多少就设置多少减一
Counter Mode:向上计数还是向下计数
Counter Period:自动重装载数,设置多少减一就是计数器计到多少就重新计数,最大是65532(8字节)
然后使用USART2串口DMA传输数据,这样占CPU内存少。
生成代码:
先用HAL_TIM_Bast_Start()启动时钟,
定义变量ca(count)与数组me(message)
/* USER CODE BEGIN WHILE */
while (1)
{
ca = __HAL_TIM_GET_COUNTER(&htim4);
sprintf(me,"counter:%d\r\n",ca);
HAL_UART_Transmit_DMA(&huart2,(uint8_t *)me,strlen(me));
HAL_Delay(99);
}
/* USER CODE END WHILE */
while循环里,
__HAL_TIM_GET_COUNTER(&htim4);读取计数器里面的数字;
sprintf打印出来变成数组(#include <stdio.h>)
HAL_UART_Transmit_DMA(&huart2,(uint8_t *)me,strlen(me));将打印出来的数组通过DMA传到电脑。
这里由于不知道数组长度多少,所以用strlen计算数组长度(#include <string.h>)
HAL_Delay(99);隔99+1毫秒
所以整个数据会每隔100ms向电脑发送计数器里面的数据。
通过串口助手看到,发出来的数据是每隔1000发送一次。
算一下:总频率64000000Hz,分频器我设置的是6400-1,所以是
640000000➗6400=10000
一万Hz,一秒数10000个数字,然后自动重装载数设置9999,所以数到10000就归零。
HAL_Delay设置的是100ms发送一次数据,也就是0.1s
因此串口助手上每隔1000发送一次没毛病。
PWM生成主要靠的是TIM_CH口,分1,2,3,4。1是高级,23是一般,4是基础。
设置高速外部时钟,时钟树总频率设置为72MHz,
这里我先配置TIM1时钟:
配置PWN:
- Mode :PWM模式1
- Pulse(占空比值) :50(50%)
- Fast Mode PWM脉冲快速模式(没啥用) :不使能
- PWM 极性(有效电平): 设置为高电平
而PWM的频率则是总频率➗(分频器✖自动重装载数)
也就是72000000➗(72✖100)=10000
打开keil,
写一段输出PWM:
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
开启定时器1,通道1输出PWM。
改天去实验室用示波器演示方波。