STM32F767+TB6600+57步进电机(升级版)

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,如图:
STM32F767+TB6600+57步进电机(升级版)_第1张图片
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°步距角,刚好转半圈后关闭定时器。

5.实验效果

STM32F767+TB6600+57步进电机(升级版)_第2张图片

6.程序源代码

程序源代码下载地址

你可能感兴趣的:(05STM32)