#include "stm32f4xx.h" #include "stm32f4xx_gpio.h" #include "stm32f4xx_rcc.h" // ?????? #define SEG_PORT GPIOB #define SEG_PINS (GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 | \ GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_12) // PB4-10,12 #define DIGIT_SEL_PORT GPIOB #define DIGIT_SEL_PINS (GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15) // 138 ABC?? #define MATRIX_COL_PORT GPIOC #define MATRIX_COL_PINS 0x00FF // PC0-PC7 #define MATRIX_ROW_PORT GPIOC #define MATRIX_ROW_PINS (GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10) // 138 ABC?? // ???????(??????) const uint16_t SEGMENT_CODES[] = { 0xC0, 0xF9, 0xA4, 0xB0, 0x99, // 0-4 0x92, 0x82, 0xF8, 0x80, 0x90 // 5-9 }; const uint8_t DISPLAY_DIGITS[] = {2,3,4,1,7,0,1,0}; // ????:23417010 // "?"?????(???,??) const uint8_t GONG_MATRIX[8] = { 0xFF, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0xFF // ???? }; void GPIO_Config(void) { GPIO_InitTypeDef GPIO_InitStruct; // ??GPIO?? RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC, ENABLE); // ??????? GPIO_InitStruct.GPIO_Pin = SEG_PINS | DIGIT_SEL_PINS; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOB, &GPIO_InitStruct); // ?????? GPIO_InitStruct.GPIO_Pin = MATRIX_COL_PINS | MATRIX_ROW_PINS; GPIO_Init(GPIOC, &GPIO_InitStruct); // ????? GPIOB->ODR |= SEG_PINS; // ????? GPIOC->ODR = 0xFF; // ????? } // ??????(??SysTick???) void Delay(uint32_t ms) { uint32_t ticks = ms * 16800; // 168MHz?? SysTick->LOAD = ticks - 1; SysTick->VAL = 0; SysTick->CTRL = SysTick_CTRL_ENABLE_Msk; while(!(SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk)); SysTick->CTRL = 0; } // ???????(?????) void ShowDigit(uint8_t num, uint8_t pos) { // ???? GPIOB->ODR |= SEG_PINS;
时间: 2025-05-19 16:10:58 浏览: 63
### STM32F4系列GPIO和SysTick相关代码实现及功能解释
#### GPIO配置说明
STM32F4系列微控制器的GPIO通过`stm32f4xx_gpio.c/h`文件中的HAL库API进行操作。这些API允许开发者轻松初始化、设置和读取GPIO引脚的状态。以下是典型的GPIO配置过程及其对应的代码示例。
```c
// 初始化结构体定义
GPIO_InitTypeDef GPIO_InitStruct;
// 使能GPIO端口时钟 (假设使用GPIOA)
__HAL_RCC_GPIOA_CLK_ENABLE();
// 配置GPIO引脚为输出模式
GPIO_InitStruct.Pin = GPIO_PIN_5; // 设置具体引脚,例如PA5
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // 推挽输出模式
GPIO_InitStruct.Pull = GPIO_NOPULL; // 不带上下拉电阻
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; // 输出速度低
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); // 初始化GPIOA
// 控制GPIO状态
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); // PA5高电平
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); // PA5低电平
```
上述代码展示了如何启用GPIOA端口时钟并配置PA5引脚为推挽输出模式[^1]。此外,还演示了如何通过`HAL_GPIO_WritePin()`函数控制该引脚的高低电平。
---
#### SysTick配置说明
SysTick是一个基于Cortex-M内核的功能模块,主要用于提供精确的时间延迟或周期性中断服务程序。其配置通常涉及以下几个步骤:
1. **使能SysTick时钟源**
默认情况下,SysTick使用处理器的核心时钟作为时间基准。
2. **加载重装载寄存器值**
这决定了每次触发中断之间的时间间隔。
3. **启动SysTick计数**
以下是一个简单的SysTick配置实例:
```c
void MX_SysTick_Init(void) {
uint32_t ticks;
// 计算每毫秒所需的滴答次数
ticks = HAL_RCC_GetHCLKFreq() / 1000;
// 加载重装载值
SysTick->LOAD = ticks - 1;
// 清除当前值寄存器
SysTick->VAL = 0;
// 配置SysTick中断优先级
NVIC_SetPriority(SysTick_IRQn, 0);
// 启用SysTick异常请求和系统时钟
SysTick->CTRL |= SysTick_CTRL_TICKINT_Msk | SysTick_CTRL_ENABLE_Msk;
}
// 中断处理函数
void SysTick_Handler(void) {
static uint32_t counter = 0;
counter++;
}
```
此代码片段实现了每毫秒一次的SysTick中断,并设置了相应的中断优先级。在实际项目中,可以通过修改`ticks`变量来调整延时精度。
---
#### RCC时钟树简介
为了确保外设正常运行,在任何硬件资源被访问之前都需要先开启对应总线上的时钟信号。对于GPIO而言,则需调用如下宏指令完成这一动作:
```c
__HAL_RCC_GPIOA_CLK_ENABLE(); // 开启GPIOA时钟
```
这是因为在未激活相应区域供电前,默认状态下所有I/O接口均处于关闭节能状态[^2]。
---
#### 综合应用案例
当需要利用SysTick配合GPIO生成固定频率方波时可参照下述逻辑框架编写应用程序:
```c
int main(void) {
HAL_Init();
SystemClock_Config(); // 系统时钟配置
__HAL_RCC_GPIOA_CLK_ENABLE(); // 使能GPIOA时钟
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = GPIO_PIN_5;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
MX_SysTick_Init(); // 初始化SysTick
while (1){
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5); // 切换LED灯状态
delay_ms(500); // 延迟一段时间
}
}
void delay_ms(uint32_t ms) {
volatile uint32_t count = 0;
for(count=0;count<ms*SystemCoreClock/1000UL;count++);
}
```
以上例子展示了一个完整的工程架构雏形——从基础环境搭建直至最终达成预期效果的过程描述得一清二楚。
---
问题
阅读全文
相关推荐


