STM32
直播中

李莉

7年用户 1387经验值
私信 关注
[问答]

STM32CubeMX是怎样去设置定时器time2每0.1秒进入一次中断呢

什么是上拉输入?下拉输入又是什么?
STM32CubeMX是怎样去设置定时器time2每0.1秒进入一次中断呢?

回帖(1)

孙婷

2021-12-1 11:32:19
简单理解
上拉输入:即在悬空状态下,将输入信号,上拉成高电平
下拉输入:即在悬空状态下,将输入信号,下拉成低电平
将PB 3,4,6,7设置为,输出,
将PB 9,10,11,12设置为上拉输入
因为stm32的io口改输出,输入模式比较麻烦,所以,选择一行一行读取的方法
STM32CubeMX配置如下:





设置定时器 time2 每0.1秒进入一次中断




串口输出





其他时钟,debug等配置,按平常一样配置
重定向

#include


#define   USER_MAIN_PRINTF
#ifdef   USER_MAIN_PRINTF


#define  USE_MAIN_INFO(format,...)    printf("t[main info] "format "rn",##__VA_ARGS__)
#define  USE_MAIN_DEBUG(format,...)   printf("t[main debug]"format"rn",##__VA_ARGS__)
#define  USE_MAIN_ERROR(format,...)   printf("t[main error]"format"rn",##__VA_ARGS__)
#define   _DEBUG_                  printf("testrn");


#else
#define  USE_MAIN_INFO(format,...)
#define  USE_MAIN_DEBUG(format,...)
#define  USE_MAIN_ERROR(format,...)
#define   _DEBUG_
#endif


设置扫描函数


int rowread(void)
{
        if (HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_11)==GPIO_PIN_RESET)
                                        return 1;
  
if (HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_10)==GPIO_PIN_RESET)
                                        return 2;

if (HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_9)==GPIO_PIN_RESET)
                        return 4;
  
if (HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_12)==GPIO_PIN_RESET)
                        return 3;
       
return 0;
}


设置读取函数
while()循环为消抖


void columnread(void)


{ int column_flag=0  ;  


          HAL_GPIO_WritePin(GPIOB,GPIO_PIN_3,GPIO_PIN_SET);
                HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_SET);
                HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_SET);
                HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,GPIO_PIN_SET);
       
          HAL_GPIO_WritePin(GPIOB,GPIO_PIN_3,GPIO_PIN_RESET);
                if((column_flag=rowread())!=0){
          while(rowread()!=0);
                USE_MAIN_INFO("按下第%d个数字",column_flag);
          
                }
          HAL_GPIO_WritePin(GPIOB,GPIO_PIN_3,GPIO_PIN_SET);
               
          HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_RESET);
                if((column_flag=rowread())!=0){
               while(rowread()!=0);
                     USE_MAIN_INFO("按下第%d个数字",column_flag+4);
          
                }
                HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_SET);
               
          HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_RESET);
                if((column_flag=rowread())!=0){
    while(rowread()!=0);
        USE_MAIN_INFO("按下第%d个数字",column_flag+8);
                }
          HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_SET);
               
        HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,GPIO_PIN_RESET);
        if((column_flag=rowread())!=0){
          
   while(rowread()!=0);
                USE_MAIN_INFO("按下第%d个数字",column_flag+12);
        }
                HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,GPIO_PIN_SET);
               


}


在中断函数中调用读取函数


void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
  if (htim->Instance==TIM2)
        {
        columnread();
        }


}


别忘了在 主函数 main()中的while()循环前调用,定时器启动函数`


HAL_TIM_Base_Start_IT(&htim2);
举报

更多回帖

发帖
×
20
完善资料,
赚取积分