当前位置:网站首页>单片机STM32F103RB,BLDC直流电机控制器设计,原理图、源码和电路方案

单片机STM32F103RB,BLDC直流电机控制器设计,原理图、源码和电路方案

2022-06-24 06:47:00 1ShyJn25

基于STM32 BLDC直流无刷电机控制器设计,并附上原理图和源码等。源代码是基于免费开源CoOS(UCOS类似)操作系统上写的,在学习无刷电机的控制同时还能学习到操作系统的知识。同时提供用Matlab的GUI编写的串口接收程序和开源的代码,实时接收速度和电流信息,便于PID测试,并且有CAN(TJA1050)接口。同时自己可以进行修改学习Matlab的GUI编程。

在这里插入图片描述

在这里插入图片描述

1.STM32F103RB处理器 时钟72M Flash 64K RAM 20K
2.MOSFET SUD35N05-26L 55V 35A Rds=0.02
3. MOSFET驱动 IR2101S

在这里插入图片描述

在这里插入图片描述

部分代码:
main.c

#include "includes.h"
/********************CoOS±äÁ¿**********************/
#define TASK_STK_SIZE 128

#define TASK0_PRIO 2
#define TASK1_PRIO 3
#define TASK2_PRIO 4
#define TASK3_PRIO 5


OS_STK STK_TASK0[TASK_STK_SIZE];
OS_STK STK_TASK1[TASK_STK_SIZE];
OS_STK STK_TASK2[TASK_STK_SIZE];
OS_STK STK_TASK3[TASK_STK_SIZE];

void TASK0(void *param);
void TASK1(void *param);
void TASK2(void *param);
void TASK3(void *param);
/*************************************************/

/*********************Ò»°ã±äÁ¿********************/
extern uint32_t Speed_count;
uint8_t USART_Flag = 0;

/*************************************************/
int main(void)
{
    
	/* ƬÄÚÍâÉè³õʼ»¯ */	
	Periph_Init();
	
	/* ²Ù×÷ϵͳ³õʼ»¯ */
    CoInitOS();

	CoCreateTask( TASK0, (void*)0, TASK0_PRIO, &STK_TASK0[TASK_STK_SIZE - 1], TASK_STK_SIZE);
	CoCreateTask( TASK1, (void*)0, TASK1_PRIO, &STK_TASK1[TASK_STK_SIZE - 1], TASK_STK_SIZE);
	CoCreateTask( TASK2, (void*)0, TASK2_PRIO, &STK_TASK2[TASK_STK_SIZE - 1], TASK_STK_SIZE);
	CoCreateTask( TASK3, (void*)0, TASK3_PRIO, &STK_TASK3[TASK_STK_SIZE - 1], TASK_STK_SIZE);
	CoStartOS();
    while(1);
}

void TASK0(void *param)
{
    
  uint8_t start_flag=0;
  uint8_t sw_state = 1;
  KEY_Init();
  Speed_PIDInit();			
  for(;;)
  {
    
  	//SW__Read()=1 Direction = SET
    if(SW__Read()^sw_state)
	{
    
	   if(start_flag)
	   {
    
		   BLDC_Stop();
	   }
	   sw_state = SW__Read();
	   if(sw_state)
	   {
    
	   		Direction = SET;
	   }
	   else
	   {
    
	   		Direction = RESET;
	   }
	   if(start_flag)
	   {
    
	   	  BLDC_Start();
	   }
	} 
    if(KEY_Read(KEY1))
	{
    
		CoTickDelay(5);
		if(KEY_Read(KEY1))
		{
    
		   BLDC_Start();
		   start_flag = 1;	
		}
	}
	if(KEY_Read(KEY2))
	{
    
		CoTickDelay(5);
		if(KEY_Read(KEY2))
		{
    
		   BLDC_Stop();
		   start_flag = 0;
		}
	}
	CoTickDelay(10);
  }			
}
void TASK1(void *param)
{
    
  uint16_t adc_value= 0;
  uint8_t i = 0; 
  for(;;)
  {
    
  	   adc_value= 0;
       for(i=0;i<4;i++)
	   {
    
	   		ADC_SoftwareStartConvCmd(ADC1,ENABLE);    /* ʹÄÜת»»¿ªÊ¼ */
	   		while(ADC_GetSoftwareStartConvStatus(ADC1));
			adc_value += ADC_GetConversionValue(ADC1);
	   }
	   ADC_Speed = adc_value/4;
	   CoTickDelay(10);
  }
}
void TASK2(void *param)
{
    
  uint16_t data;
  for(;;)
  {
    
  	if(USART_Flag)
	{
    
    	data = 1000000/(6*Speed_count);
		USART_SendData( USART2, data);
		USART_Flag = 0;
	}
	CoTickDelay(1);
  }
}
void TASK3(void *param)
{
    
	LED_Off();
  for(;;)
  {
    
	   LED_On();
	   CoTickDelay(200);
	   LED_Off();
	   CoTickDelay(200);
  }
}

BLDC.c

#include "includes.h"

/**********³£Á¿¶¨Òå**********/
#define IDLE 0
#define START 1
#define RUN 2
#define STOP 3
#define FAULT 4
#define HIGH 1480
#define LOW 3
/*********È«¾Ö±äÁ¿***********/
u8 state;				   //Ö÷״̬
FlagStatus Direction = SET;//³õʼ»¯ºóΪÕýת
uint8_t stalling_count = 0;		   //¶Âת¼ÆÊýÆ÷

void Delay_us(uint8_t t);
/********************************************************************** * Description : ¶Ô¶¨Ê±Æ÷1ºÍ¶¨Ê±Æ÷3µÄGPIO¶¨Òå * Input : None * Output : None * Return : None * Attention : None **********************************************************************/
void BLDC_GPIOConfig(void)
{
    
    GPIO_InitTypeDef GPIO_InitStructure;
 	 
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10;  //TIM1Êä³ö
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;						   
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
			 
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;//TIM1Êä³ö
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;						   
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;              //TIM3µÄ»ô¶ûÊäÈë
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;                         //TIM3µÄ»ô¶ûÊäÈë
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
	
// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; //TIM1_BKIN
// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
// GPIO_Init(GPIOB, &GPIO_InitStructure);
	   
}
/********************************************************************** * Description : None * Input : None * Output : None * Return : None * Attention : None **********************************************************************/
void BLDC_TIM1Config(void)
{
    
   TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;			   //»ù±¾½á¹¹Ìå±äÁ¿¶¨Òå
   TIM_OCInitTypeDef  		TIM_OCInitStructure;               //Êä³ö½á¹¹Ìå±äÁ¿¶¨Òå
   TIM_BDTRInitTypeDef  	TIM_BDTRInitStructure;			   //ËÀÇøÉ²³µ½á¹¹Ìå±äÁ¿¶¨Òå

   TIM_DeInit(TIM1);

   TIM_TimeBaseStructure.TIM_Prescaler = 2;					   //TIM»ù±¾³õʼ»¯
   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_CenterAligned2;//ÖÐÑë¶ÔÆë¼ÆÊýģʽ,Êä³ö±È½Ï±ê־λֻÓÐÔÚ±È½ÏÆ÷ÏòÉϼÆËã±»ÉèÖÃ
   TIM_TimeBaseStructure.TIM_Period = 1500 - 1;					   //PWM 16K
   TIM_TimeBaseStructure.TIM_ClockDivision = 0;
   TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;				   

   TIM_TimeBaseInit(TIM1,&TIM_TimeBaseStructure);

   TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; 		   //TIMÊä³öͨµÀ³õʼ»¯
   TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Disable; 
   TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable;                  
   TIM_OCInitStructure.TIM_Pulse =1200; 
   TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; 
   TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;         
   TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;//TIM_OCIdleState_Set;
   TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;          
  
   TIM_OC1Init(TIM1,&TIM_OCInitStructure); 

   TIM_OCInitStructure.TIM_Pulse =1200;
   TIM_OC2Init(TIM1,&TIM_OCInitStructure);

   TIM_OCInitStructure.TIM_Pulse =1200;
   TIM_OC3Init(TIM1,&TIM_OCInitStructure);

   TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; 		   //TIMÊä³öͨµÀ4³õʼ»¯£¬ÓÃÀ´´¥·¢AD×¢Èë²ÉÑù
   TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Disable;                   
   TIM_OCInitStructure.TIM_Pulse =1495; 
   TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;           
  
   TIM_OC4Init(TIM1,&TIM_OCInitStructure); 
 
   TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable;	//ËÀÇøÉ²³µ³õʼ»¯
   TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable;
   TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_1; 
   TIM_BDTRInitStructure.TIM_DeadTime = 100;
   TIM_BDTRInitStructure.TIM_Break = TIM_Break_Disable;	 //Èç´ò¿ª£¬¿ª»úÎÞÊä³öÇÒ״̬ÎÉÂÒ£¿£¿£¿£¿
   TIM_BDTRInitStructure.TIM_BreakPolarity =  TIM_BreakPolarity_Low ;
   TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Disable;

   TIM_BDTRConfig(TIM1,&TIM_BDTRInitStructure);


   TIM_OC1PreloadConfig(TIM1,TIM_OCPreload_Enable);  //ʹÄܲ¶»ñ±È½Ï¼Ä´æÆ÷Ô¤×°ÔØ£¨Í¨µÀ1£

   TIM_OC2PreloadConfig(TIM1,TIM_OCPreload_Enable);	 //ʹÄܲ¶»ñ±È½Ï¼Ä´æÆ÷Ô¤×°ÔØ£¨Í¨µÀ2£

   TIM_OC3PreloadConfig(TIM1,TIM_OCPreload_Enable);	 //ʹÄܲ¶»ñ±È½Ï¼Ä´æÆ÷Ô¤×°ÔØ£¨Í¨µÀ3£
   
   TIM_SelectInputTrigger(TIM1, TIM_TS_ITR2);        //ÊäÈë´¥·¢Ô´Ñ¡ÔñTIM3 
  
   //TIM_SelectSlaveMode(TIM1, TIM_SlaveMode_Trigger);//´ÓģʽѡÔñ ´¥·¢ 

   TIM_CtrlPWMOutputs(TIM1,ENABLE);

// TIM_ClearITPendingBit(TIM1, TIM_IT_Break|TIM_IT_COM);
// TIM_ITConfig(TIM1, TIM_IT_Break | TIM_IT_COM ,ENABLE);
   TIM_ClearITPendingBit( TIM1, TIM_IT_COM);
   TIM_ITConfig(TIM1, TIM_IT_COM ,ENABLE);

   TIM_Cmd(TIM1,ENABLE);
}
/********************************************************************** * Description : None * Input : None * Output : None * Return : None * Attention : None **********************************************************************/
void BLDC_TIM3Config(void)
{
    
   TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;			   //»ù±¾½á¹¹Ìå±äÁ¿¶¨Òå
   TIM_ICInitTypeDef  TIM_ICInitStructure;                      //¶¨Òå½á¹¹Ìå±äÁ¿
   TIM_OCInitTypeDef  TIM_OCInitStructure;                     //Êä³ö½á¹¹Ìå±äÁ¿¶¨Òå
      
   TIM_DeInit(TIM3);

   TIM_TimeBaseStructure.TIM_Prescaler = 71;				   //TIM»ù±¾³õʼ»¯
   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
   TIM_TimeBaseStructure.TIM_Period =65535;
   TIM_TimeBaseStructure.TIM_ClockDivision = 0;
   TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;

   TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);     
      
   TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;            //Ñ¡ÔñͨµÀ1
   TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //ÊäÈëÉÏÉýÑØ²¶»ñ 
   TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_TRC;  //ÅäÖÃͨµÀΪÊäÈ룬²¢Ó³Éäµ½ÄÄÀï
   TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;       //ÊäÈë²¶»ñÔ¤·ÖƵֵ
   TIM_ICInitStructure.TIM_ICFilter = 10;                      //ÊäÈëÂ˲¨Æ÷´ø¿íÉèÖÃ

   TIM_ICInit(TIM3, &TIM_ICInitStructure);                     //ÊäÈëͨµÀÅäÖÃ

   TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; 		    //TIMÊä³öͨµÀ³õʼ»¯
   TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;             
   TIM_OCInitStructure.TIM_Pulse =1023; 
   TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;      
  
   TIM_OC2Init(TIM3,&TIM_OCInitStructure);

   TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Timing; 		    //TIMÊä³öͨµÀ³õʼ»¯
   TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Disable;             
   TIM_OCInitStructure.TIM_Pulse =65535; 
   TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;      
  
   TIM_OC4Init(TIM3,&TIM_OCInitStructure);

   TIM_SelectHallSensor(TIM3,ENABLE);                          //ʹÄÜTIMxµÄ»ô¶û´«¸ÐÆ÷½Ó¿Ú
   
   TIM_SelectInputTrigger(TIM3, TIM_TS_TI1F_ED);               //ÊäÈë´¥·¢Ô´Ñ¡Ôñ 
  
   TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset);             //´ÓģʽѡÔñ

   TIM_SelectMasterSlaveMode(TIM3, TIM_MasterSlaveMode_Enable);//Ö÷´ÓģʽѡÔñ 
   
   TIM_SelectOutputTrigger(TIM3, TIM_TRGOSource_OC2Ref);      //Ñ¡ÔñÊä³ö´¥·¢Ä£Ê½(TRGO¶Ë)

   TIM_ITConfig(TIM3, TIM_IT_Trigger|TIM_IT_CC4, ENABLE);      //¿ª¶¨Ê±Æ÷ÖÐ¶Ï 
   //TIM_Cmd(TIM3,ENABLE);
}
/********************************************************************** * Description : None * Input : None * Output : None * Return : None * Attention : None **********************************************************************/
void huanxiang(void)
{
    
  u8 Hall_data = 0; 
  Hall_data=(u8)((GPIOA->IDR&0x000000c0)>>6);	//¶Áת×ÓλÖÃ
  Hall_data|=(u8)((GPIOB->IDR&0x00000001)<<2);
  if(Direction)
  {
    									 //Õýת
    switch(Hall_data)				 //¸ù¾Ýת×ÓλÖ㬾ö¶¨CCERÊä³öÏàλºÍת×Ó×ÖÆ«ÒÆÁ¿
    {
    
	  case 0x05:{
    	                      												
			  	  TIM1->CCER=0x3081;    //1,4
			    };break;
	  case 0x04:{
    
				  TIM1->CCER=0x3180;	//4,5 
	            };break;							
  	  case 0x06:{
    
				  TIM1->CCER=0x3108;	//2,5
			    };break;
	  case 0x02:{
    
				  TIM1->CCER=0x3018;	//2,3 
	            };break;
	  case 0x03:{
    
				  TIM1->CCER=0x3810;	//3,6 
	            };break;
	  case 0x01:{
    
	             			
				  TIM1->CCER=0x3801;    //1,6 
	            };break;
	  default:break;
    }  
  }
  else
  {
    									 //·´×ª
	switch(Hall_data)				 //¸ù¾Ýת×ÓλÖ㬾ö¶¨CCERÊä³öÏàλºÍת×Ó×ÖÆ«ÒÆÁ¿
    {
    
	  case 0x05:{
    	  										
			  	  TIM1->CCER=0x3018; //2 3 
			    };break;
	  case 0x04:{
    
				  TIM1->CCER=0x3810; //3 6 
	            };break;							
  	  case 0x06:{
    
	  				TIM1->CCER=0x3801; //1 6
			    };break;
	  case 0x02:{
    
				  TIM1->CCER=0x3081; //1 4 
	            };break;
	  case 0x03:{
    
				  TIM1->CCER=0x3180; //4 5 
	            };break;
	  case 0x01:{
    
	  			  TIM1->CCER=0x3108; //2 5 
	            };break;
	  default:break;
    }
  }
}
/**************Æô¶¯******************/
void BLDC_Start(void)
{
    
   TIM1->SMCR|=0x0006;        //¿ªTIM1µÄÊäÈë´¥·¢ 
   TIM1->DIER=0x0040;         //¿ªTIM1µÄ´¥·¢ÖжÏ
   huanxiang();			      //µ÷Óû»Ïòº¯Êý£¬Æô¶¯ 
   TIM3->CR1|=0x0001;		  //¿ªTIM3
   TIM3->DIER|=0x0050;		  //¿ªTIM3ÖÐ¶Ï 
}
void BLDC_Stop(void)
{
    
   TIM1->SMCR&=0xfff8;		  //¹Ø±ÕTIM1µÄÊäÈë´¥·¢
   TIM1->CCER=0;              //¹Ø±ÕTIM1µÄÁù·Êä³ö
   Delay_us(40);			      //ÑÓʱ£¨¼ÓËÀÇø£
   TIM1->CCER=0x0ccc;         //´ò¿ªÈý·Ï¹ܣ¬½øÐÐÄܺÄÖÆ¶¯
   while(stalling_count<1);    //µÈ´ýµç»úÍ£Ö¹£¨TIM3Á¬ÐøÒç³ö10´Î£¬¼´ÈÏΪµç»úÒÑͣת£ 
   TIM1->CCER=0;              //¹Ø±ÕTIM1µÄÁù·Êä³ö£¬¹ØÉ²³µ 
   TIM3->CR1&=0xfffe;         //¹Ø±ÕTIM3 
   TIM3->CNT=0;               //ÇåTIM3µÄ¼ÆÊýÆ÷ 
   TIM3->DIER&=0xffaf;		  //¹ØTIM3ÖжÏ
}
void Delay_us(uint8_t t)
{
    
   while(t--)
   {
    
   }
}
/**************Í£Ö¹******************/
/*void stop(void) { TIM1->SMCR&=0xfff8; //¹Ø±ÕTIM1µÄÊäÈë´¥·¢ TIM1->CCER=0; //¹Ø±ÕTIM1µÄÁù·Êä³ö Delay(20); //ÑÓʱ£¨¼ÓËÀÇø£ TIM1->CCER=0x0ccc; //´ò¿ªÈý·Ï¹ܣ¬½øÐÐÄܺÄÖÆ¶¯ while(duzhuan_value<1); //µÈ´ýµç»úÍ£Ö¹£¨TIM3Á¬ÐøÒç³ö10´Î£¬¼´ÈÏΪµç»úÒÑͣת£ TIM1->CCER=0; //¹Ø±ÕTIM1µÄÁù·Êä³ö£¬¹ØÉ²³µ TIM3->CR1&=0xfffe; //¹Ø±ÕTIM3 TIM3->CNT=0; //ÇåTIM3µÄ¼ÆÊýÆ÷ TIM3->DIER&=0xffaf; //¹ØTIM3ÖÐ¶Ï data_reset(); //¸´Î»ÔËÐвÎÊý }*/

BLDC.h

#ifndef BLDC_H
#define BLDC_H
extern FlagStatus Direction;

extern void BLDC_GPIOConfig(void);
extern void BLDC_TIM1Config(void);
extern void BLDC_TIM3Config(void);
extern void huanxiang(void);
extern void BLDC_Start(void);
extern void BLDC_Stop(void);
#endif

usart.c

#include "includes.h"
/** *@Function *@Description *@Calls *@Call By *@Param xxx * @arg * @arg *@Param xxx * @arg * @arg *@Reture *@Others **/
void USART1_GPIOConfig(void)
{
    
  GPIO_InitTypeDef	GPIO_InitStruct;
  /* ÅäÖÃ USART1 Tx (PA9) */
  GPIO_InitStruct.GPIO_Pin 		= GPIO_Pin_9;
  GPIO_InitStruct.GPIO_Mode 	= GPIO_Mode_AF_PP;	 			/* ¸´ÓÃÍÆÍìÊä³öģʽ */
  GPIO_InitStruct.GPIO_Speed 	= GPIO_Speed_50MHz;				/* Êä³ö×î´óƵÂÊΪ50MHz */
  GPIO_Init(GPIOA, &GPIO_InitStruct);
    
  /* ÅäÖÃ USART1 Rx (PA10) */
  GPIO_InitStruct.GPIO_Pin 		= GPIO_Pin_10;
  GPIO_InitStruct.GPIO_Mode 	= GPIO_Mode_IN_FLOATING;		/* ¸¡¿ÕÊäÈëģʽ */
  GPIO_Init(GPIOA, &GPIO_InitStruct);
}
/*************************************************** * Descirbe : * Input : * Output : * Attention : * author : ***************************************************/
void USART1_NVICConfig(void)
{
    
  NVIC_InitTypeDef NVIC_InitStruct;
 	
  NVIC_InitStruct.NVIC_IRQChannel = USART1_IRQn;
  NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0; 
  NVIC_InitStruct.NVIC_IRQChannelSubPriority = 2;
  NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStruct);
}
/** *@Function *@Description *@Calls *@Call By *@Param xxx * @arg * @arg *@Param xxx * @arg * @arg *@Reture *@Others **/
void USART1_Config(void)
{
    
	USART_InitTypeDef USART_InitStruct;
	/* USART and USART2 configured as follow: - BaudRate = 9600 baud - Word Length = 8 Bits - One Stop Bit - No parity - Hardware flow control disabled (RTS and CTS signals) - Receive and transmit enabled */
 	USART_InitStruct.USART_BaudRate            = 9600;	  					
	USART_InitStruct.USART_StopBits            = USART_StopBits_1;	 
	USART_InitStruct.USART_WordLength          = USART_WordLength_8b; 
	USART_InitStruct.USART_Parity              = USART_Parity_No;
	USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
	USART_InitStruct.USART_Mode                = USART_Mode_Rx | USART_Mode_Tx;

	/* ÅäÖô¿Ú1 */
	USART_Init(USART1, &USART_InitStruct);
	/* ´¿Ú1½ÓÊÕÖжÏʹÄÜ USART_IT_RXNE : ½ÓÊÕ²»¿ÕÖÐ¶Ï */
	USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
	/* ʹÄÜ´¿Ú1 */
	USART_Cmd(USART1, ENABLE);
}
/** *@Function *@Description *@Calls *@Call By *@Param xxx * @arg * @arg *@Param xxx * @arg * @arg *@Reture *@Others **/
void USART1_SendString(char* data)
{
    
   unsigned char i = 0;
   for (i=0; data[i] != '\0'; i++)
   {
    
	  USART_SendData( USART1, data[i]);
	  while( USART_GetFlagStatus(USART1 , USART_FLAG_TXE) == RESET );
		/* ·¢ËÍÊý¾ÝÖ±µ½ USART_FLAG_TXE ·¢ËÍ¿ÕÎªÕæ,¾Í¿ÉÒÔ½øÐÐÏ´η¢ËÍ */
   }
}

usart.h

#ifndef _USART1_H
#define _USART1_H


extern void USART1_GPIOConfig(void);
extern void USART1_Config(void);
extern void USART1_NVICConfig(void);
extern void USART1_SendString( char* data);

extern u8 ASCII_Buff[5];

#endif

原网站

版权声明
本文为[1ShyJn25]所创,转载请带上原文链接,感谢
https://shy25.blog.csdn.net/article/details/125406030