通过TIM3定时器精确定时1000毫秒的 GPIO 电平翻转以及 LED 闪烁。
第一步:
创建项目 LED005
一.打开STM32CubeMX,在电脑桌面找到下面的这个图标(不是你放电脑显示器的桌子面哦)。
二.选择这次用的开发版(STM32F411REx),双击打开。
三.生成项目前的配置。
1.管脚配置默认是设置好的。
2.调试方式配置,选Serial Wire
3.时钟树配置:由于开发板上没有外部晶振,使用内部RC振荡器,配置主频100MHz。
注:关于这个PSC=9999和ARR=9999怎么来的,我没有去算,直接给了DeepSeek一段话让他帮我算的,呵呵。不愿费脑子。
T = (psc+1)(arr+1)/Tclk Tclk=100mhz 我想要T=1000毫秒(1秒)的话,PSC=多少?arr=多少?
以下是DeepSeek解答的过程:
目标公式:
定时时间 T=fclk(psc+1)(arr+1),需实现 T=1秒,且 fclk=100MHz=100×106Hz。
推导参数关系:
变形公式得:
需找到整数 psc 和 arr,满足:
psc+1≤65536(假设寄存器为16位)
arr+1≤65536
可能的参数组合:
组合1:
则:
验证:
组合2:
则:
验证:
组合3:
则:
验证:
验证合法性:
所有参数均满足 psc≤65535、arr≤65535。
结果:
实现 1秒定时 的参数组合(任选其一):
psc=9999,arr=9999
psc=19,999,arr=4,999
psc=24,999,arr=3,999
任一组合同样满足精确的1秒定时需求。
4.GPIO配置,PC13连接蓝色按键,配置为输入模式;PA5连接LED2,配置为推挽输出模式。
5.非常关键的设置,不设置他就不能正常中断,我反正不懂为啥这样设置,希望大佬们能给小白们普及一下知识,万分感谢。
6.配置项目名称等,全程不能有中文。
配置全部完成,开始生成。
四.项目生成 完成后的详细操作
1.生成成功后,打开项目应该是这样的。
2.写入以下代码( HAL_TIM_Base_Start_IT(&htim3); )。
3.定义一个变量 (uint16_t dtTime3; )
4.时钟中断代码:
/* USER CODE BEGIN 1 */ void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if(htim == &htim3){ dtTime3++; if(dtTime3 >=10)//这里如果是10就是10秒 { dtTime3 = 0 ; HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5); } } } /* USER CODE END 1 */
五.编译配置
1.编译时可能会出现以下错误。
修改编译器版本
选择debug模式
六.编译完成没有问题就可以写入了。
祝各位小白和我一样可以入门。