参考:
【【正点原子】手把手教你学STM32CubeIDE开发】 https://www.bilibili.com/video/BV1Wp42127Cx/?p=13&share_source=copy_web&vd_source=9332b8fc5ea8d349a54c3989f6189fd3
《嵌入式系统基础与实践》刘黎明等编著,第九章定时器,PWM从P289开始。
【【STM32教程】入门教程(基于HAL库+CubeMX+MDK-ARM)】 https://www.bilibili.com/video/BV1y7411m7gg/?share_source=copy_web&vd_source=9332b8fc5ea8d349a54c3989f6189fd3
定时器引脚映射
STM32F103定时器复用功能映射及其通道_stm32定时器通道复用-CSDN博客
参看上面的文章或者查看手册(8.3.7)。
实验内容
3、外部脉冲计数设计。 设计计数器,对外部脉冲(开发板上 PIC 单片机提供的脉冲信号)进行计数,并在 数码管上实时显示计数值。
提供信号的外部电路(TEST引脚处,可输出1khz,2khz等多种频率):
使用定时器2进行外部脉冲计数,使用的引脚为PA0。
cubeMX配置如下(由于频率过快,计数值设为1000-1,计1000次才真正记一次数):
硬件连接:用跳线短接 PA0和TEST输出引脚。
代码编写同按键外部中断的写法大同小异:
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
/*定时器更新中断回调函数
1.该函数由定时器中断通用处理函数 HAL_TIM_IRQHandler 调用,完成所 有定时器的更新中 断的任务处理
2.函数内部需要根据定时器句柄的实例来判断是哪一个定时器产生的本次更 新中断
3.函数由用户根据具体的处理任务编写 */
uint8_t flag=0;int res=0;
uint8_t table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40 };//10表示'-'
uint8_t s[]={0,0,0,0,0,0,0,0};void write_byte(uint8_t date){unsigned char i;for(i=0;i<8;i++){HAL_GPIO_WritePin(GPIOA,GPIO_PIN_7,(date>>(7-i))&0x01);HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,1);HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,0);}HAL_GPIO_WritePin(GPIOA,GPIO_PIN_8,1);HAL_GPIO_WritePin(GPIOA,GPIO_PIN_8,0);}void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{if(htim->Instance==htim2.Instance){//int cntt=__HAL_TIM_GET_COUNTER(&htim2);测试用,取出计数寄存器的值res=res+1;flag=1;}
}
主函数中启动中断
HAL_TIM_Base_Start_IT(&htim2);
while循环,只显示了计数值的末两位
/* USER CODE BEGIN 3 */if(flag==1){flag=0;s[7]=res%10;s[6]=res/10%10;}for(int i=8;i<16;i++){write_byte(table[s[15-i]]);HAL_GPIO_WritePin(GPIOF,0x01<<i,0);HAL_Delay(1);HAL_GPIO_WritePin(GPIOF,0x01<<i,1);}//HAL_Delay(1000);}/* USER CODE END 3 */