STM32基础代码(要有基础,下面代码放在合适位置,可用)

目录

一、类型定义

 二、流水灯           

三、按键,pwm

1、pwm

 2、按键

四、USART

五、ADC


一、类型定义


typedef signed char             int8_t; 
typedef short int               int16_t;
typedef int                     int32_t;
typedef long int                int64_t;
typedef long long int           int64_t;

/* Unsigned.  */
typedef unsigned char           uint8_t;
typedef unsigned short int      uint16_t;
typedef unsigned int            uint32_t;
typedef unsigned long int       uint64_t;
typedef unsigned long long int  uint64_t;


 二、流水灯           

                                              
/* USER CODE BEGIN PV */
uint16_t num=0x01;
/* USER CODE END PV */

  /* USER CODE BEGIN 2 */
if(HAL_TIM_Base_Start_IT(&htim6)!=HAL_OK)                                         //判断是否打开
{
  Error_Handler();
}
  /* USER CODE END 2 */

/* USER CODE BEGIN 4 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)            //中断
{
  if (TIM6==htim->Instance)                                                                     //判断是哪个定时器
    {
        HAL_GPIO_WritePin(GPIOE,0xff,GPIO_PIN_SET);      
        HAL_GPIO_WritePin(GPIOE,num,GPIO_PIN_RESET);
      num=num<<1;        /0000000100000000  0000000010000000
        if(num==0x100)
              num=0x01;
    }
}
/* USER CODE END 4 */


三、按键,pwm


/* USER CODE BEGIN PV */
uint8_t keydown_flag = 0;
uint16_t pwm_value = 0;
uint8_t up_down_flag = 0;
/* USER CODE END PV */

1、pwm

  /* USER CODE BEGIN 2 */
HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_3);            //打开定时器4的3通道
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */
if (keydown_flag == 1)
{
  HAL_Delay(20);
    if(pwm_value == 0)
    {
      up_down_flag = 0;
    }
    if(pwm_value == 50)
    {
      up_down_flag = 1;
    }
    
    if(up_down_flag == 0)
    {
      pwm_value++;
    }
    else
    {
      pwm_value--;
    }
    
    __HAL_TIM_SET_COMPARE(&htim4,TIM_CHANNEL_3,pwm_value);  //实现亮灭程度
}
else 
{
  __HAL_TIM_SET_COMPARE(&htim4,TIM_CHANNEL_3,0);  //灭
}


 
2、按键


/* USER CODE BEGIN 4 */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)                //中断
{
  if(GPIO_Pin & GPIO_PIN_13)                                   //判断是哪个按键
    {
      if (keydown_flag == 0)
        {
          keydown_flag = 1;
        }
        else
        {
          keydown_flag = 0;
        }
        pwm_value = 0;
    }
}
/* USER CODE END 4 */

四、USART


改:stm32f1xx_it.c    210行
void USART1_IRQHandler(void)
{
  /* USER CODE BEGIN USART1_IRQn 0 */

  /* USER CODE END USART1_IRQn 0 */

  /* USER CODE BEGIN USART1_IRQn 1 */
  USER_UART_IRQHandler();
  /* USER CODE END USART1_IRQn 1 */
}

改:main.h    57行
/* USER CODE BEGIN EFP */
void USER_UART_IRQHandler();
/* USER CODE END EFP */


加头文件
#include <stdio.h>


/* USER CODE BEGIN PV */
#include "string.h"

const char stringMode1[8] = "mode_1#";
const char stringMode2[8] = "mode_2#";
const char stringStop[8] = "stop#";
int8_t ledMode = -1;
uint16_t LED_value = 0;
uint8_t uart1RxState = 0;
uint8_t uart1RxCounter = 0;
uint8_t uart1RxBuff[128] = {0};
/* USER CODE END PV */

int fputc(int ch,FILE *f)                                                             //用printf定义
{
  HAL_UART_Transmit(&huart1,(uint8_t *)&ch,1,0xffff);
    return ch;
}
/* USER CODE END 0 */


/* USER CODE BEGIN 2 */
        __HAL_UART_ENABLE_IT(&huart1,UART_IT_RXNE);           //初始化时开启USART1的RXNE中断
        printf("hello world.\r\n");
  /* USER CODE END 2 */


 /* USER CODE BEGIN WHILE */
  while (1)
  {
        /*如果串口1已接受完毕*/
        if(uart1RxState == 1)
           {
                 /*收到了模式一指令*/
                 if(strstr((const char *)uart1RxBuff, stringMode1) !=NULL)
                 {
                   printf("I'm in mode_1!\r\n");
                     ledMode = 1;        
           LED_value = 0x80;                     
                 }
                 
                  /*收到了模式二指令*/
                 else if(strstr((const char *)uart1RxBuff, stringMode2) !=NULL)
                 {
                   printf("I'm in mode_2!\r\n");
                     ledMode = 2;
                     LED_value = 0x01;
             }
                
        /*收到了停止指令*/
             else if(strstr((const char *)uart1RxBuff,stringStop) != NULL)
             {
                printf("I'm stop!\r\n");
                ledMode = 0;
                 LED_value = 0;
             }                 
             /*串口相关参数恢复*/
             uart1RxState = 0;
             uart1RxCounter = 0;
             memset(uart1RxBuff,0,128);
         }
             
         
         HAL_GPIO_WritePin(GPIOE,0xff,GPIO_PIN_SET);
         HAL_GPIO_WritePin(GPIOE,LED_value,GPIO_PIN_RESET);
         HAL_Delay(1000);
         
         switch(ledMode)
         {
             case 1:
                 LED_value = LED_value>>1;
                 if(LED_value == 0)
                         LED_value = 0X80;
                 break;
           case 2:
                  LED_value = LED_value<<1;
                 if(LED_value == 0X100)
                         LED_value = 0X01;
                 break;
              case 0:               
                 LED_value = 0;        
                 break;
         }
    /* USER CODE END WHILE */

void USER_UART_IRQHandler()                      //调用修改的函数
{
  if(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_RXNE)!=RESET)            //判断是否收到数据
    {
      __HAL_UART_ENABLE_IT(&huart1,UART_IT_IDLE);             //开空闲中断
        uart1RxBuff[uart1RxCounter]=(uint8_t)(huart1.Instance->DR & (uint8_t)0x00ff);
        uart1RxCounter++;
        __HAL_UART_CLEAR_FLAG(&huart1,UART_FLAG_RXNE);   //清0
    }
    if((__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE) != RESET))   //判断是否收完
    {
      __HAL_UART_DISABLE_IT(&huart1,UART_IT_IDLE);                 //关空闲中断
        uart1RxState = 1;    
    }
}


五、ADC


加头文件
#include <stdio.h>

/* USER CODE BEGIN PV */
uint16_t adc_value = 0;
float voltage = 0.0;
char voltString[50] = {0};
/* USER CODE END PV */

   

 /* USER CODE BEGIN WHILE */
  while (1)
  {
        HAL_ADC_Start(&hadc1);                    //开启
        HAL_ADC_PollForConversion(&hadc1,100);         //等待结束
        adc_value = HAL_ADC_GetValue(&hadc1);         //获取值
        voltage = (float)adc_value /4096*3.3;           //转换为电压值
        sprintf(voltString,"采集到的电压值为:%.2f V",voltage);//第二种转换为字符串输出
        printf("%s\r\n",voltString);//第二种
        HAL_Delay(1000);
    /* USER CODE END WHILE */

/* USER CODE BEGIN 4 */
int fputc(int ch,FILE *f)
{
  HAL_UART_Transmit(&huart1,(uint8_t*)&ch,1,0xffff);
    return ch;
}
/* USER CODE END 4 */

若文章有错,欢迎私信告诉,有问题亦可私信提问

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32 FOC(基于STM32的场感应无刷直流电机控制)是一种利用STMicroelectronics公司的STM32系列微控制器实现的电机控制算法。场感应无刷直流电机是一种高效、高性能的电机控制技术,它通过传感器测量转子位置和速度,并通过控制电流来实现电机转矩和转速的精确控制。 STM32 FOC代码通常包括以下几个方面的内容: 1. 传感器接口:STM32 FOC代码需要与电机的位置和速度测量传感器进行通信,以便获得准确的转子位置和速度信息。常见的传感器接口包括编码器、霍尔传感器等。 2. 控制算法:STM32 FOC代码实现了一种称为矢量控制(或称为磁场定向控制)的电机控制算法。该算法通过测量电机电流、转子位置和速度,并使用闭环控制技术来实现对电机转矩和速度的精确控制。 3. 硬件驱动:STM32 FOC代码还包括了与电机电源和驱动器接口的相关代码。这些代码负责控制电机的电流输出和控制信号的生成,以实现电机的精确控制。 4. 保护机制:STM32 FOC代码还包含了一些保护机制,以防止电机过流、过温和过压等异常情况的发生。这些保护机制能够有效地保护电机和电机控制器不受损坏。 通过使用STM32 FOC代码,开发者可以快速实现对场感应无刷直流电机的控制。这种控制方式具有高效、高性能的特点,适用于许多应用领域,包括工业自动化、机器人技术、电动汽车等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值