定时器 中断
什么是上拉输入?下拉输入又是什么?
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);
简单理解
上拉输入:即在悬空状态下,将输入信号,上拉成高电平
下拉输入:即在悬空状态下,将输入信号,下拉成低电平
将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);
举报
更多回帖