|
打开STM32CubeMX新建工程,选择STM32F303VCT6芯片,LQFP100。选择外部高速晶振(HSE)
根据stm32discovery开发板原理图(原理图可在st网站上下载),选择按键和LED引脚
PA0为按键输入管脚,选择GPIO_INPUT模式。
PE8, PE9, PE10, PE10,PE11,PE12,PE13,PE14, PE15为LED输出控制管脚,选择GPIO_OUTPUT模式。
点击Clock Configuration配置系统时钟为72M最高速度。
点击Configuration->System->GPIO配置管脚。,WakeUp按键已经为外部下拉,故不用配置(R4为下拉电阻,R38,C38为R37滤波去抖动)。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 2和USER CODE END 2中间添加如下四个函数。
(用户代码要加在USER CODE BEGIN N和USER 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,熄灭LED,LED状态翻转,读取按键状态。
在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_TypeDef和JOYState_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灯显示不同的转态。以后写的程序我们可以在这个模板的基础上修改。