1.按键外部中断
exti.c:
#include "exti.h"
#include "delay.h"
#include "led.h"
#include "key.h"
#include "usart.h"
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
delay_ms(50); //消抖
switch(GPIO_Pin)
{
case GPIO_PIN_2:
if(KEY1==0) //停止
len=2;
break;
case GPIO_PIN_3:
if(KEY0==0) //反转
{
LED0(1);
len=1;
}
break;
case GPIO_PIN_13:
if(KEY2==0) //正转
{
LED0(0);
len=0;
}
break;
}
}
exti.h:
#ifndef _EXTI_H
#define _EXTI_H
#include "sys.h"
void EXTI_Init(void); //外部中断初始化
#endif
2.串口通信
usart.c:
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance==USART1)//如果是串口1
{
if((USART_RX_STA&0x8000)==0)//接收未完成
{
if(USART_RX_STA&0x4000)//接收到了0x0d
{
if(aRxBuffer[0]!=0x0a)USART_RX_STA=0;//接收错误,重新开始
else USART_RX_STA|=0x8000; //接收完成了
}
else //还没收到0X0D
{
if(aRxBuffer[0]==0x0d)USART_RX_STA|=0x4000;
else
{
USART_RX_BUF[USART_RX_STA&0X3FFF]=aRxBuffer[0] ;
USART_RX_STA++;
if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收
}
}
}
}
if(USART_RX_STA&0x8000)
{
USART_RX_STA=0;
switch(USART_RX_BUF[0])
{
case 0x0A: //zhengzhuan
len=0;
LED0(0);
break;
case 0x0B: //tinzhi
len=2;
break;
case 0x0C: //fanzhuan
LED0(1);
len=1;
break;
}
}
}
usart.h:
extern u8 len;
这里有一个extern的全局变量,在usart.h中声明,usart.c中定义,那么在main.c中只需要#include“usart.h”即可,在exti.c中只需要#include“usart.h”即可。
3.定时器控制转速
如果没有添加HAL库文件的话,赶紧右键添加到hallib,如图:
timer.c:
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim==(&TIM3_Handler))
{
LED1_Toggle; //LED0反转
}
}
4.主函数
main.c:
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "exti.h"
#include "timer.h"
int main(void)
{
Cache_Enable(); //打开L1-Cache
HAL_Init(); //初始化HAL库
Stm32_Clock_Init(432,25,2,9); //设置时钟,216Mhz
delay_init(216); //延时初始化
uart_init(115200); //串口初始化
LED_Init(); //初始化LED
EXTI_Init(); //外部中断初始化
while(1)
{
if(len==0)
{
HAL_TIM_Base_Stop_IT(&TIM3_Handler);
TIM3_Init(50-1,10800-1); //5ms
printf("电机正转!\r\n\r\n");//插入换行
len=3;
}
else if(len==1)
{
HAL_TIM_Base_Stop_IT(&TIM3_Handler);
TIM3_Init(50-1,10800-1);
printf("电机反转!\r\n\r\n");//插入换行
len=3;
}
else if(len==2)
{
HAL_TIM_Base_Stop_IT(&TIM3_Handler);
printf("电机停止!\r\n\r\n");//插入换行
len=3;
}
}
// delay_ms(1000);
// HAL_TIM_Base_Stop_IT(&TIM3_Handler);
}
最后的两行是用来测试转180度角的,2*5ms=10ms=1.8°步距角,1000ms=180°步距角,刚好转半圈后关闭定时器。