- 积分
- 10879
- 回帖
- 0
- 西莫币
-
- 贡献
-
- 威望
-
- 存款
-
- 阅读权限
- 80
- 最后登录
- 1970-1-1
签到天数: 40 天 连续签到: 1 天 [LV.5]常住居民I
|
楼主 |
发表于 2020-10-5 18:28
|
显示全部楼层
来自: 中国江苏
本帖最后由 czvmkl 于 2020-10-5 18:32 编辑
还有几个main函数里需要调用的函数,有感按键调速的程序都已经上传了,大家慢慢享用
void SysTick_Init(u8 SYSCLK) //SysTick初始化函数
{
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);
fac_us=SYSCLK/8; //SYSCLK的8分频 保存1us所需的计数次数
fac_ms=(u16)fac_us*1000; //1ms 需要计数的次数
}
void delay_ms(u16 nms) //利用SysTick自定义的延时毫秒函数
{
u32 temp;
SysTick->LOAD=(u32)nms*fac_ms; // nms毫秒需要装载的寄存器值 最大1864ms
SysTick->VAL =0x00; //清空计数器
SysTick->CTRL=0x01; //开始倒数
do
{
temp=SysTick->CTRL;
}while((temp&0x01)&&!(temp&(1<<16))); //等待时间到达
SysTick->CTRL&=~0x01; //关闭计数器
SysTick->VAL =0X00; //清空计数器
}
/*******************************************************************************
扫描按键,读取按键参数的函数
*******************************************************************************/
u8 key_con(void)
{ static u8 key;
key=0;
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0))//如果按下WK_UP键,返回键值1 启停电机
{ delay_ms(10); //延时去抖
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0))
{while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)==1);//等待WK_UP键松开
key=1;}
}
if(!GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_0))//如果PC0接地,返回键值2 电机停转
{ key=2;
}
if(!GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_15))//如果按下KEY1键,返回键值3 电机加速
{ key=3;
}
if(!GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_5))//如果按下KEY0键,返回键值4 电机减速
{ key=4;
}
if(!GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_13))//如果PC13接地电机反转
{ Direction=1;
}
else Direction=0;
return key;
}
/*******************************************************************************
GPIO端口初始化函数
*******************************************************************************/
void GPIO_Configuration(void)
{ GPIO_InitTypeDef GPIO_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
/*配置5个按键端口*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO|RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD ,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_5|GPIO_Pin_13;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//IO口上拉输入
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;//IO口下拉输入
GPIO_Init(GPIOA, &GPIO_InitStructure); // 配置wk_up键控制电机启停
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//IO口上拉输入
GPIO_Init(GPIOA, &GPIO_InitStructure); //配置KEY1加速按键
/* 配置Hall接口IO */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//IO口浮空输入
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
/*霍尔信号线外部中断配置*/
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource6);//设置PB6与EXTI6中断线连接
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource7);//设置PB7与EXTI7中断线连接
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource8);//设置PB8与EXTI8中断线连接
EXTI_InitStructure.EXTI_Line = EXTI_Line6|EXTI_Line7|EXTI_Line8;//待配置的中断线标号为6,7,8
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//中断模式
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;//上升沿和下降沿响应中断请求
EXTI_InitStructure.EXTI_LineCmd = ENABLE;//使能中断线EXTI_Line6~8
EXTI_Init(&EXTI_InitStructure);
/*PA8,PA9,PA10为上半桥臂端口配置*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8| GPIO_Pin_9 | GPIO_Pin_10 ;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//复用推挽输出
GPIO_Init(GPIOA, &GPIO_InitStructure);
/*PB13,PB14,PB15 为下半桥臂端口配置*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15 ;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
/*******************************************************************************
NVIC中断管理配置初始化函数
*******************************************************************************/
void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);//设置中断优先级分组值为1,即1位抢占式3位响应式
/*初始化霍尔中断优先级*/
NVIC_InitStructure.NVIC_IRQChannel=EXTI9_5_IRQn;//设置中断通道为EXTI9_5 (霍尔)
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;//抢占优先级0
NVIC_InitStructure.NVIC_IRQChannelSubPriority=3; //响应优先级3
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;//使能IRQ通道
NVIC_Init(&NVIC_InitStructure);
/*初始化TIM2中断优先级*/
NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQn; //TIM2中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;//抢占优先级为1
NVIC_InitStructure.NVIC_IRQChannelSubPriority=2; //响应优先级为1
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; //使能TIM2中断
NVIC_Init(&NVIC_InitStructure);
} |
|