经过多次调试,我发现Proteus 8的仿真效果并不是很理想,所以接下来的例程将改用STM32F103RCT6单片机实物进行讲解.
前期准备:
- STM32CubeMX
- STM32RCT6核心板
- IDE Keil(MDK-ARM)
STM32CubeMX部分
1. 配置时钟
选择STM32F103RCTx系列芯片,配置时钟的同时会自动配置IO口引脚 将HCLK设置为最大频率72MHz
2.配置TIM
选择: Internal Clock(内部时钟) Prtscaler (定时器分频系数) : 71 Counter Mode(计数模式) Up(向上计数模式) Counter Period(自动重装载值) : 999 CKD(时钟分频因子) :No Division (不分频 ) auto-reload-preload(自动重装载) : Enable (使能)
1. 定时器溢出时间计算公式:
Tout:中断溢出的时间 arr:自动重装载值 psc:定时器分频系数 Tclk:时钟频率
Tout = ((71+1)*(999+1))/72 us Tout = ( 72 * 1000 ) / 72 us 1000us = 1ms 所以这里我们的定时时间为:1ms 也就是说单片机1ms进入一次定时器中断
2. 定时器计数模式:
- 向上计数模式:计数器从0计数到自动加载值(TIMx_ARR),然后重新从0开始计数并且产生一个计数器溢出事件。
- 向下计数模式:计数器从自动装入的值(TIMx_ARR)开始向下计数到0,然后从自动装入的值重新开始,并产生一个计数器向下溢出事件。
- 向上/向下计数模式(中央对齐模式):计数器从0开始计数到自动装入的值-1,产生一个计数器溢出事件,然后向下计数到1并且产生一个计数器溢出事件;然后再从0开始重新计数。
2. 计数时钟:
- 内部时钟(TIMx_CLK):
- 外部时钟模式1:外部捕捉比较引脚(TIx)
- 外部时钟模式2:外部引脚输入(TIMx_ETR)
- 内部触发输入(ITRx):使用一个定时器作为另一个定时器的预分频器,如可以配置一个定时器Timer1而作为另一个定时器Timer2的预分频器。
3.配置IO口
将PB0设置为: 低电平 Output模式 既不上拉也不下拉 响应速度低
3. 工程生成
工程管理依旧是这几个选项,然后GENERATE CODE,STM32CubeMX部分完成。
Keil部分
HAL_TIM_IRQHandler(&htim1);//定时器中断处理函数 此函数的作用是判断中断是否正常,是哪一类定时器中断(溢出中断/捕获中断/PWM中断…),然后进入相应的中断回调函数void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)//定时器溢出中断回调函数 定时器中断时,每进行完一个中断,并不会立刻退出,而是会进入到中断回调函数中
点开main.c 在如图位置上添加
HAL_TIM_Base_Start_IT(&htim1);
然后再tim.c文件中,添加
uint16_t Tim_cnt = 0;
然后在tim.c文件中重写 void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)函数
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if (htim->Instance == htim1.Instance)
{
Tim_cnt++;
if(Tim_cnt==500)
{
Tim_cnt=0;
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_0);
}
}
}
设一个全局变量,每进一次中断+1,因为1ms进入一次中断,所以当Tim_cnt=500的时候(即0.5s)写入我们需要运行的代码(不要忘记清0)
编译下载时需要选择相对应的下载器,勾选以下 运行即可
链接:本期内容Keil工程 提取码:lctq
到此本期的STMCubeMX、Keil、Proteus 8的学习到此结束啦!
|