STM32裸机编程的基础知识(5)

闪烁 led现在我们已经搭建好了完整的构建、烧写的基础设施,是时候让固件做点儿有用的事情了。什么是有用的事情?当然是闪烁 led 了!nucleo-f429zi 开发板有 3 颗 led,在开发板数据手册的 6.5 节,我们可以看到板载 led 连接的引脚:
pb0: green ledpb7: blue ledpb14: red led再次修改 main.c 文件,添加上引脚定义,然后把蓝色 led 引脚设为输出模式,开始无限循环。首先,把我们之前讨论过的 gpio 定义和模式设置拷贝过来,注意,现在又新加了一个 bit(position) 工具宏:
#include #include #define bit(x) (1ul < < (x))#define pin(bank, num) ((((bank) - 'a') < > 8)struct gpio {volatile uint32_t moder, otyper, ospeedr, pupdr, idr, odr, bsrr, lckr, afr[2];};#define gpio(bank) ((struct gpio *) (0x40020000 + 0x400 * (bank)))// enum values are per datasheet: 0, 1, 2, 3enum { gpio_mode_input, gpio_mode_output, gpio_mode_af, gpio_mode_analog };static inline void gpio_set_mode(uint16_t pin, uint8_t mode) {struct gpio *gpio = gpio(pinbank(pin)); // gpio bankint n = pinno(pin); // pin numbergpio- >moder &= ~(3u < moder |= (mode & 3) < ahb1enr |= bit(pinbank(led)); // enable gpio clock for ledgpio_set_mode(led, gpio_mode_output); // set blue led to output modefor (;;) asm volatile(nop); // infinite loopreturn 0;}接下来需要做的就是找到如何开关 gpio 引脚,然后在主循环中点亮 led,延时,熄灭 led,延时。在芯片数据手册 8.4.7 节,可以看到 bsrr 寄存器与设置电压高低有关,低 16 位设置 odr 寄存器输出高,高 16 位设置 odr 寄存器输出低。为此定义一个 api 函数:
static inline void gpio_write(uint16_t pin, bool val) {struct gpio *gpio = gpio(pinbank(pin));gpio- >bsrr |= (1u < < pinno(pin)) < < (val ? 0 : 16);}下一步我们需要实现一个延时函数,目前还不需要精确延时,所以定义一个 spin() 函数,执行 nop 指令给定的次数:
static inline void spin(volatile uint32_t count) {while (count--) asm(nop);}最后,修改主循环来让 led 闪烁起来:
for (;;) {gpio_write(pin, true);spin(999999);gpio_write(pin, false);spin(999999);}执行 make flash 来看蓝色 led 闪烁吧!
完整工程源码可以在 step-1-blinky 文件夹找到。

恒流和恒压两种驱动差异化原因
没有云计算,IT设备的利用率只有20%?
Vue基础知识和案例展示
随着AI的发展在未来将会拥有很高的市场价值
苹果有哪些产品是改变了世界科技的发展趋势
STM32裸机编程的基础知识(5)
安防企业助力下 ETC推广速度越来越快
第二届eSmart虚拟现实备受关注
Ryzen Pro系列处理器正式发布:提供一系列的管理和安全特性
2017CES展上,智能家居刮起哪些突破的旋风?
学会这些焊接要领,带你轻松上手后焊
「摩尔定律」:半导体产业最重要的法则之一
导波雷达物位计的工作原理及安装说明
一加5:为狙击小米6而生
焊锡丝的焊接方式有什么?大家了解吗?
电机保护控制器的功能有哪些
技嘉发布推出BRIX Pro系列mini PC,最高4.20 GHz的最高线程数
2022年我国有望发放5G毫米波牌照
疫情爆发,进一步加剧“缺芯潮”
电力变压器交流耐压试验标准及注意事项