裸机 C 编程中的 LED 闪烁:STM32L476RG Nucleo 板
Blinking Led in Bare-Metal C programming: STM32L476RG Nucleo Board
我尝试在 STM32L476RG Nucleo 板上实现经典的闪烁示例。
根据 STM32L4x 数据表:LD2 连接到 GPIOA 端口 5 (PA5)。
PA5使用AHB2总线。
注:我用的是Keil uVision 5;我用 STM32L476RGTx 目标创建了一个新的 uVision 项目。
在"Manage Run-Time Environment"对话框中我选择了:
- CMSIS >> 核心(标志)
- 设备 >> 启动(标志)
这里是代码:
#include "stm32l4xx.h" // Device header
//#include <stdint.h>
//#define MASK(x) ((uint32_t) (1<<(x))) // bitmasking
void delayMs(int delay);
int main(void){
// RCC->AHB2RSTR |=1;
// RCC->AHB2RSTR &=~1;
// RCC->AHB2ENR |= MASK(0); //bitwise OR. Enable GPIOA clock
RCC->AHB2ENR |= 1;
//GPIOA->MODER |= MASK(10);
GPIOA->MODER |= 0x400;
while(1){
//GPIOA->ODR |= MASK(4);
GPIOA->ODR |= 0x20;
delayMs(500);
//GPIOA->ODR &= ~MASK(4);
GPIOA->ODR &= ~0x20;
delayMs(500);
}
}
void delayMs(int delay){
int i;
for(;delay>0; delay --){
for (i=0; i<3195;i++);
}
}
构建输出returns:
Build started: Project: blinknew
*** Using Compiler 'V5.06 update 6 (build 750)', folder: 'C:\Keil_v5\ARM\ARMCC\Bin'
Build target 'Target 1'
compiling main.c...
linking...
Program Size: Code=520 RO-data=408 RW-data=0 ZI-data=1632
".\Objects\blinknew.axf" - 0 Error(s), 0 Warning(s).
Build Time Elapsed: 00:00:09
当我下载它时,Keil uV 5 returns:
Load "C:\Users\gmezz\OneDrive\Documenti\Bare_Metal\Blinknew\Objects\blinknew.axf"
Erase Done.
Programming Done.
Verify OK.
Flash Load finished at 22:37:52
LED 应该以 1 秒的周期闪烁,但实际上没有任何反应。
老实说,我不明白哪里出了问题。
有人可以帮助我吗?
GM
我可能错了,但根据参考手册(RM0351)第6.2.19节,您应该在启用外设时钟后等待2个时钟周期,然后再访问其寄存器。尝试在 RCC->AHB2ENR |= 1 之后引入一个短暂的延迟;线。在你的情况下,我认为 MODER 寄存器没有得到正确的值。
我还建议使用调试器检查寄存器的实际值。
我尝试在 STM32L476RG Nucleo 板上实现经典的闪烁示例。
根据 STM32L4x 数据表:LD2 连接到 GPIOA 端口 5 (PA5)。 PA5使用AHB2总线。
注:我用的是Keil uVision 5;我用 STM32L476RGTx 目标创建了一个新的 uVision 项目。 在"Manage Run-Time Environment"对话框中我选择了:
- CMSIS >> 核心(标志)
- 设备 >> 启动(标志)
这里是代码:
#include "stm32l4xx.h" // Device header
//#include <stdint.h>
//#define MASK(x) ((uint32_t) (1<<(x))) // bitmasking
void delayMs(int delay);
int main(void){
// RCC->AHB2RSTR |=1;
// RCC->AHB2RSTR &=~1;
// RCC->AHB2ENR |= MASK(0); //bitwise OR. Enable GPIOA clock
RCC->AHB2ENR |= 1;
//GPIOA->MODER |= MASK(10);
GPIOA->MODER |= 0x400;
while(1){
//GPIOA->ODR |= MASK(4);
GPIOA->ODR |= 0x20;
delayMs(500);
//GPIOA->ODR &= ~MASK(4);
GPIOA->ODR &= ~0x20;
delayMs(500);
}
}
void delayMs(int delay){
int i;
for(;delay>0; delay --){
for (i=0; i<3195;i++);
}
}
构建输出returns:
Build started: Project: blinknew
*** Using Compiler 'V5.06 update 6 (build 750)', folder: 'C:\Keil_v5\ARM\ARMCC\Bin'
Build target 'Target 1'
compiling main.c...
linking...
Program Size: Code=520 RO-data=408 RW-data=0 ZI-data=1632
".\Objects\blinknew.axf" - 0 Error(s), 0 Warning(s).
Build Time Elapsed: 00:00:09
当我下载它时,Keil uV 5 returns:
Load "C:\Users\gmezz\OneDrive\Documenti\Bare_Metal\Blinknew\Objects\blinknew.axf"
Erase Done.
Programming Done.
Verify OK.
Flash Load finished at 22:37:52
LED 应该以 1 秒的周期闪烁,但实际上没有任何反应。
老实说,我不明白哪里出了问题。
有人可以帮助我吗?
GM
我可能错了,但根据参考手册(RM0351)第6.2.19节,您应该在启用外设时钟后等待2个时钟周期,然后再访问其寄存器。尝试在 RCC->AHB2ENR |= 1 之后引入一个短暂的延迟;线。在你的情况下,我认为 MODER 寄存器没有得到正确的值。
我还建议使用调试器检查寄存器的实际值。