【发布时间】:2021-11-13 18:21:08
【问题描述】:
我从微控制器开始我的旅程,我正在使用 STM32F1(带有 STM32F103RB 的 Nucleo 板)开始我的旅程。我尝试使用寄存器学习写作,看起来我被第一个“任务”困住了 - 闪烁的 LED。我设法打开了led,但我不能让它闪烁。奇怪的是,当我去调试(我在 Keil uVision 上工作)并查看 GPIOA 外围设备时,端口 5(led 是 PA5)有这个滴答声,这意味着它应该在现实中闪烁。但不是。我尝试更改延迟,但没有任何反应。我被困住了。 我究竟做错了什么? 这是我的代码:
#include "stm32f10x.h"
void delay(unsigned int ms){
unsigned int i, j;
for(i = 0; i < ms; i++)
for(j = 0; j < 20000; j++);
}
int main(void){
RCC->APB2ENR |= (1<<2);
GPIOA->CRL |= ( (1<<21));
GPIOA->CRL &= ~( (1<<22) | (1<<23) | (1<<20) );
while(1){
GPIOA->BSRR |= (1<<5);
delay(200);
GPIOA->BSRR |= (1<<21);
delay(200);
}
}
谢谢
【问题讨论】:
-
嗨!你确定你的
delay函数会持续 200 毫秒吗? -
还要注意
BSRR寄存器是只写的。因此按位 or 操作具有未定义的行为。只需使用GPIOA->BSRR = (1<<5)。 -
您可以通过使用 Keil 单步执行代码来检查 GPIOA->BSRR 命令。这将消除其他人提到的延迟函数可能出现的错误行为。