流水灯
实现4个LED流水灯效果。
4个LED依次连接在PA5:7、PB6,面包板接线如下图。LED驱动参考另一篇随笔,从Nucleo 5V输出端口获得供电。在通过ST-LINK USB供电的情况下,Nucleo-F303RE最大电流为300mA,除去MCU本身约100mA外,足以供给每个LED所需的约20mA电流。
根据用户手册,Nucleo-64 开发板版本MB1136 Rev C-04 从ST-LINK MCO获得HSE时钟源,固定8MHz。因此,指定RCC HSE类型为 BYPASS,启用PLL获得最大72MHz SYSCLK,如下图:
GPIO配置如下:
Project源码结构如下:
main.h 中包含CubeMX 自动生成的GPIO常量定义:
1 #define LED1_Pin GPIO_PIN_5 2 #define LED1_GPIO_Port GPIOA 3 ...
gpio.c中的 MX_GPIO_Init() 函数为GPIO初始化:
1 void MX_GPIO_Init(void) 2 { 3 4 /* GPIO Ports Clock Enable */
5 __HAL_RCC_GPIOA_CLK_ENABLE();
6 7 /*Configure GPIO pin Output Level */ 8 HAL_GPIO_WritePin(GPIOA, LED1_Pin|LED2_Pin|LED3_Pin, GPIO_PIN_RESET); 9 10 GPIO_InitTypeDef GPIO_InitStruct; 11 12 /*Configure GPIO pins : PAPin PAPin PAPin */ 13 GPIO_InitStruct.Pin = LED1_Pin|LED2_Pin|LED3_Pin; 14 GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; 15 GPIO_InitStruct.Pull = GPIO_NOPULL; 16 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; 17 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
18 ... 19 }
GPIO初始化的基本过程是:
- 启用时钟
- 置初值
- 配置 GPIO_InitTypeDef,包括操作模式、内部上拉/下拉电阻、速度等
main() 函数主要部分如下:
1 /* Infinite loop */ 2 /* USER CODE BEGIN WHILE */ 3 while (1) 4 { 5 /* USER CODE END WHILE */ 6 7 /* USER CODE BEGIN 3 */ 8 HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin); 9 HAL_Delay(100); 10 HAL_GPIO_TogglePin(LED2_GPIO_Port, LED2_Pin); 11 HAL_Delay(100); 12 HAL_GPIO_TogglePin(LED3_GPIO_Port, LED3_Pin); 13 HAL_Delay(100); 14 HAL_GPIO_TogglePin(LED4_GPIO_Port, LED4_Pin); 15 HAL_Delay(100); 16 } 17 /* USER CODE END 3 */
-
Cube API小结
-
CMSIS设备接口定义 - stm32f303xe.h
此头文件定义所有外围接口内存映射地址。
结构 |
GPIO_TypeDef
|
常量 |
GPIOx (GPIOA, GPIOB ...)
|
-
通用HAL模块 - stm32f3xx_hal.h
函数 |
HAL_Delay()
|
- RCC HAL模块 - stm32f3xx_hal_rcc.h
函数 |
__HAL_RCC_GPIOx_CLK_ENABLE() __HAL_RCC_GPIOA_CLK_DISABLE()
|
- GPIO HAL模块 - stm32f3xx_hal_gpio.h
结构 |
GPIO_InitTypeDef
|
enum |
GPIO_PinState 枚举值:
|
函数 | HAL_GPIO_Init() |
HAL_GPIO_ReadPin() | |
HAL_GPIO_WritePin() | |
HAL_GPIO_TogglePin() | |
常量 |
GPIO_PIN_x (GPIO_PIN_0, GPIO_PIN_1 ...)
|