一、前言 这是一篇总结。 在开始前,我必须知道1000hz的脉冲是怎样的。 我必须知道的: 1、脉冲是由晶振产生。 2、STM32F103RCTx 晶振在4-16HZ的范围。 3、脉冲的周期长短由Period决定的。 4、脉冲是由Pulse产生的。 5、占空比 = Pulse/Period。 6、频率freqyency= 时钟频率/(分频系数Prescaler+1)/(周期Period+1)。 7、若Pulse=500-1,Period=1000-1,配置的时钟频率为72MHZ,则频率frequency=7210001000/(71+1)/(999+1)=1000HZ,也就是说每秒发出1000个脉冲。 二、环境 软件:CUBE MX,RT-Thread Studio 硬件:正点原子STM32F103RCT6,示波器(验证PWM),ST-LINK(下载、调试)。 三、在CUBE上初始化定时器TIM 选择自己用的芯片型号;
在定时器配置中设置外部高速时钟HSE; debug模式设置未串口Serial模式; 选择一个需要用到的引脚,我选择一个PA6,PA6上有一个TIM3_CH1(定时器3通道1)。
这是对外部高速时钟的配置,TIM3挂靠在APB1(查阅资料); 以下四个就是CUBE生成的初始化函数,我们只需要其中的3个函数。 从main.c中复制的初始化函数
void MX_TIM3_Init(void){}
从msp文件中复制引脚初始化
void HAL_TIM_MspPostInit(TIM_HandleTypeDef* htim){}
和定时器使能函数
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base){}
复制到RT-Thread里,复制到能调用的地方就行。 在Studio中打开定时器总开关 我们使用的是16MHZ的高速外部时钟 所以这里要改成16000000
在drv_clk中使用外部时钟 因为我们上面写了RCC_PLL_MUL9,下面的RCC_PLL_MUL16会覆盖掉RCC_PLL_MUL9,所以删除以下这句话。 再把JTAG禁用掉以防万一,放到能执行的地方
__HAL_RCC_AFIO_CLK_ENABLE();
__HAL_AFIO_REMAP_SWJ_NOJTAG();
最后 在main函数里调用初始化函数
MX_TIM3_Init();
调用初始化函数,初始化PWM的配置
HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1);
定时器3通道1(即PA6产生100HZ的脉冲) 这样就能产生1000HZ的脉冲了(误差小于一千分之一),
总结 1、脉冲可以驱动步进电机、舵机等, 2、调节LED灯的亮度(脉冲宽度调制)等。 PS:这是对学习STM32的一个总结,过程中参考了很多篇博客,还有大佬的答疑。
|