实验环境
为了让大家能跟得上,我们选用课程32位单片机开发板来做实验,Cortex-M4 内核,性能强劲,性价比超高,特别适合用来学习。
实验环境如下:
硬件:Cortex-M4 内核的开发板
调试工具:Jlink V11
实验目标很简单:写个程序,让开发板上的 LED 小灯闪烁。代码不复杂,但麻雀虽小,五脏俱全,足够我们用来研究启动过程。
以下是我们的“点灯”代码,先贴出来给大家瞅瞅:
- #include "MCUxx.h"
- #define LED_PIN GPIO_PIN_13
- #define LED_PORT GPIOC
- void set_output(GPIO_TypeDef* port, uint16_t pin) {
- // 使能 GPIOC 时钟
- RCC->AHB1ENR |= RCC_AHB1ENR_GPIOCEN;
-
- // 配置引脚为推挽输出
- port->MODER &= ~(GPIO_MODER_MODER13); // 清零
- port->MODER |= GPIO_MODER_MODER13_0; // 设置为输出模式
- port->OTYPER &= ~(GPIO_OTYPER_OT13); // 推挽输出
- port->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR13; // 高速
- port->PUPDR &= ~(GPIO_PUPDR_PUPDR13); // 无上拉/下拉
-
- // 默认输出低电平
- port->BSRR = GPIO_BSRR_BR13;
- }
- int main(void) {
- set_output(LED_PORT, LED_PIN);
- while (1) {
- // 翻转 LED 状态
- LED_PORT->ODR ^= LED_PIN;
- // 简单延时
- for (volatileuint32_t i = 0; i < 100000; i++) {}
- }
- }
运行这段代码,板子上的 LED(接在 PC13 引脚)就会开始闪。这代码看着简单,但问题来了:我们是怎么从“上电”跑到 main() 的?芯片到底干了啥?别急,下面一步步拆解。
|