流水灯

 实现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初始化的基本过程是:

  1. 启用时钟
  2. 置初值
  3. 配置 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

  • 定义GPIO所有寄存器地址
常量

GPIOx (GPIOA, GPIOB ...)

  • 类型为GPIO_TypeDef* 指针
  • 值为端口的内存映射地址

 

 

 

 

 

 

 

 

  • 通用HAL模块 - stm32f3xx_hal.h

  

函数

HAL_Delay()

  • 用空循环实现延时

 

 

 

 

 

  • RCC HAL模块 - stm32f3xx_hal_rcc.h

  

函数

__HAL_RCC_GPIOx_CLK_ENABLE()

__HAL_RCC_GPIOA_CLK_DISABLE()

  • 设置/清除 RCC寄存器 AHBENR  中GPIO对应的位

 

 

 

 

 

 

  • GPIO HAL模块 - stm32f3xx_hal_gpio.h

  

结构

GPIO_InitTypeDef

  • 定义GPIO工作模式、上拉/下拉电阻、速度、alternate功能
enum

GPIO_PinState

枚举值:

  • GPIO_PIN_RESET
  • GPIO_PIN_SET
函数 HAL_GPIO_Init()
HAL_GPIO_ReadPin()
HAL_GPIO_WritePin()
HAL_GPIO_TogglePin()
常量

GPIO_PIN_x (GPIO_PIN_0, GPIO_PIN_1 ...)

  • 端口的PIN bit mask,可以按位或指定多个PIN,例如:GPIO_PIN_0 | GPIO_PIN_4

 

 

 

posted @ 2018-01-10 16:15 vinccc 阅读(...) 评论(...) 编辑 收藏