李敬宁的个人空间 https://bbs.21ic.com/?83498 [收藏] [复制] [RSS]

日志

基于STM32F3discovery的STM32CubeMX系列教程1:GPIO

已有 600 次阅读2016-7-9 16:49 |系统分类:兴趣爱好

打开STM32CubeMX新建工程,选择STM32F303VCT6芯片,LQFP100。选择外部高速晶振(HSE

根据stm32discovery开发板原理图(原理图可在st网站上下载),选择按键和LED引脚

PA0为按键输入管脚,选择GPIO_INPUT模式。

PE8, PE9, PE10, PE10,PE11,PE12,PE13,PE14, PE15LED输出控制管脚,选择GPIO_OUTPUT模式。

点击Clock Configuration配置系统时钟为72M最高速度。

点击Configuration->System->GPIO配置管脚。,WakeUp按键已经为外部下拉,故不用配置R4为下拉电阻,R38,C38R37滤波去抖动)。LED管脚配置为低速推挽输出模式,既不上拉也不下拉(即默认的模式不用配置)。

点击生成报告,软件会提示新建工程,输入工程名,选择工程保存路径。IDE选择MDK-ARM V5.

Code Generator中找到Generated files框,勾选Generated periphera
initialization as a pair of
'.c/.h' files per IP。外设初始化为独立的C文件和头文件


点击生成代码。点击OpenProject打开工程。到这里我们就配置好工程外设初始化

点击Build按钮,然后等一会,BuildOptput信息框会输出没有错误没有警告。

gpio.c文件中最后面的USERCODE BEGIN 2USER CODE END 2中间添加如下四个函数。

用户代码要加在USER CODE BEGIN NUSER CODE END N之间,否则下次重新生成代码后,会被删除

/* USER CODE BEGIN 2 */

/**

  *
@brief  Turns selected LED On.

  *
@param  Led: LED to be set on

 
*          This parameter can be
one of the following values:

 
*            @arg  LED3

 
*            @arg 
LED4

 
*            @arg  LED5

 
*            @arg  LED6

 
*            @arg  LED7

 
*            @arg  LED8

 
*            @arg  LED9

 
*            @arg  LED10

  *
@retval None

  */

void BSP_LED_On(Led_TypeDef Led)

{

 
HAL_GPIO_WritePin(GPIO_PORT[Led], GPIO_PIN[Led], GPIO_PIN_SET);

}

 

/**

  *
@brief  Turns selected LED Off.

  *
@param  Led: LED to be set off

 
*          This parameter can be
one of the following values:

 
*            @arg  LED3

 
*            @arg  LED4

 
*            @arg  LED5

 
*            @arg  LED6

 
*            @arg  LED7

 
*            @arg  LED8

 
*            @arg  LED9

 
*            @arg  LED10

  *
@retval None

  */

void BSP_LED_Off(Led_TypeDef Led)

{

 
HAL_GPIO_WritePin(GPIO_PORT[Led], GPIO_PIN[Led], GPIO_PIN_RESET);

}

 

/**

  *
@brief  Toggles the selected LED.

  *
@param  Led: LED to be toggled

 
*          This parameter can be
one of the following values:

 
*            @arg  LED3

 
*            @arg  LED4

 
*            @arg  LED5

 
*            @arg  LED6

 
*            @arg  LED7

 
*            @arg  LED8

 
*            @arg  LED9

 
*            @arg  LED10

  *
@retval None

  */

void BSP_LED_Toggle(Led_TypeDef Led)

{

 
HAL_GPIO_TogglePin(GPIO_PORT[Led], GPIO_PIN[Led]);

}

 

/**

  *
@brief  Returns the current joystick
status.

  *
@retval Code of the joystick key pressed

 
*          This code can be one of
the following values:

 
*            @arg  WAKEUP

 
*            @arg  JOY_NONE

 
*            @arg  JOY_CTR

 
*            @arg  JOY_DOWN

 
*            @arg 
JOY_LEFT

 
*            @arg  JOY_RIGHT

 
*            @arg  JOY_UP

  */

JOYState_TypeDef BSP_JOY_GetState(void)

  /*
Check the pressed keys */ 

   
if(HAL_GPIO_ReadPin(WAKEUP_GPIO_Port,WAKEUP_Pin) == GPIO_PIN_SET)

  {

   
return (JOYState_TypeDef) WAKEUP;

  }

// 
else if(HAL_GPIO_ReadPin(CTR_GPIO_Port,CTR_Pin) == GPIO_PIN_RESET)

//  {

//   
return (JOYState_TypeDef) JOY_CTR;

//  }

// 
else if(HAL_GPIO_ReadPin(DOWN_GPIO_Port,DOWN_Pin) == GPIO_PIN_RESET)

//  {

//   
return (JOYState_TypeDef) JOY_DOWN;

//  }

// 
else if(HAL_GPIO_ReadPin(LEFT_GPIO_Port,LEFT_Pin) == GPIO_PIN_RESET)

//  {

//   
return (JOYState_TypeDef) JOY_LEFT;

//  }

// 
else if(HAL_GPIO_ReadPin(RIGHT_GPIO_Port,RIGHT_Pin) == GPIO_PIN_RESET)

//  {

//   
return (JOYState_TypeDef) JOY_RIGHT;

//  }

// 
else if(HAL_GPIO_ReadPin(UP_GPIO_Port,UP_Pin) == GPIO_PIN_RESET)

//  {

//   
return (JOYState_TypeDef) JOY_UP;

//  }

 
else

  {

   
return (JOYState_TypeDef) JOY_NONE;

 

}

/* USER CODE END 2 */

 以上三个函数的功能分别为点亮LED,熄灭LEDLED状态翻转,读取按键状态。

gpio.c前面添加LED3-LED10的管脚的数组变量

/* USER CODE BEGIN 1 */

GPIO_TypeDef* GPIO_PORT[] =
{LED3_GPIO_Port,

                             LED4_GPIO_Port,

                             LED5_GPIO_Port,

                             LED6_GPIO_Port,

                             LED7_GPIO_Port,

                             LED8_GPIO_Port,

                             LED9_GPIO_Port,

                             LED10_GPIO_Port};

const uint16_t GPIO_PIN[] = {LED3_Pin,

                             LED4_Pin,

                             LED5_Pin,

                             LED6_Pin,

                             LED7_Pin,

                             LED8_Pin,

                             LED9_Pin,

                             LED10_Pin};

/* USER CODE END 1 */

gpio.h前面添加Led_TypeDefJOYState_TypeDef两个枚举类型。声明刚才添加的四个函数。

/* USER CODE BEGIN Private defines */

typedef enum

{ 

LED3 = 0, 

LED4 = 1, 

LED5 = 2, 

LED6 = 3,       

LED7= 4,

LED8= 5,

LED9= 6,

LED10= 7    

}Led_TypeDef;



 



typedef enum



{



 
JOY_NONE  = 0,



 
JOY_CTR   = 1,



 
JOY_DOWN  = 2,



 
JOY_LEFT  = 3,



 
JOY_RIGHT = 4,



 
JOY_UP    = 5,



 
WAKEUP    = 6



}JOYState_TypeDef;



/* USER CODE END Private defines */



 



void MX_GPIO_Init(void);



 



/* USER CODE BEGIN Prototypes */



void BSP_LED_On(Led_TypeDef Led);



void BSP_LED_Off(Led_TypeDef Led);



void BSP_LED_Toggle(Led_TypeDef Led);



JOYState_TypeDef BSP_JOY_GetState(void);



/* USER CODE END Prototypes */



 



main.c文件中的main函数的while循环中添加应用代码。代码中使用switch case语句。先通过BSP_JOY_GetState()语句判断是否有按键按下,然后根据按下的按键改变LED3~LED10的状态。



switch(BSP_JOY_GetState())



       
{



//            case JOY_UP:



//                BSP_LED_On(LED1);break;



//            case JOY_RIGHT:



//                BSP_LED_On(LED2);break;



//            case JOY_DOWN:



//                BSP_LED_On(LED3);break;  



//            case JOY_LEFT:



//                BSP_LED_On(LED4);break;



//            case JOY_CTR:



           
case WAKEUP:



                BSP_LED_On(LED3);



                BSP_LED_On(LED4);



                BSP_LED_On(LED5);



          
     BSP_LED_On(LED6);



                            BSP_LED_On(LED7);



                            BSP_LED_On(LED8);



                            BSP_LED_On(LED9);



                         BSP_LED_On(LED10);



                break;



           
default:



                BSP_LED_Off(LED3);



                BSP_LED_Off(LED4);



                BSP_LED_Off(LED5);



                BSP_LED_Off(LED6);



                                              BSP_LED_Off(LED7);



                BSP_LED_Off(LED8);



                BSP_LED_Off(LED9);



                BSP_LED_Off(LED10);                                  



                break;



       
}    



再次编译程序,如果编译没有错误。点击

下载到STM32F3discovery开发板。如果提示错误,可以点击

图标对Option for Target Dubug选项进行修改。(图上选的是ST-LINK)







点击Settings->Flash Download勾选 Reset and Run选项。这样程序下载后自动启动运行,不用再按一下复位或者重新上电才能运行。







最后,下载程序见证奇迹的时候。按下不同按键,LED3~LED10灯显示不同的转态。以后写的程序我们可以在这个模板的基础上修改。



 


路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)