arm - STM32F103C8 LED 闪烁
问题描述
我尝试对 STM32F103C8 电路进行编程。我使用 ST-LINK V2 编程器。运行使用特殊库的代码示例后,我能够看到内置 LED 亮起,但现在我想在不使用这些库的情况下对电路板进行编程,我不知道为什么我什么都看不到,LED一直处于关闭状态。这是代码:
#include "stm32f10x.h" // Device header
int main(){
RCC->APB2ENR |= 1<<4;
GPIOC->CRH &= ~0xFF0FFFF;
GPIOC->CRH |= 0x00300000;
GPIOC->ODR |= 1<<13;//turn PC_13 ON
while(1){
}
}
解决方案
根据您在 PC13 上有 LED 的信息,我假设您使用的是著名的Blue Pill板。在该板上,由于 PC13 的特殊限制,LED 连接被反转 - 该引脚只能吸收电流,而不是源。因此,为了打开它,您需要将 0 写入 ODR 的相应位。
通常,我反对使用幻数。但对于 STM32F103,使用十六进制文字进行 GPIO 配置是可行的,因为一个十六进制数字唯一地定义了引脚模式。人们可以记住 GPIO 设置的十六进制文字的含义,并在一次定义 GPIO 端口的 8 个引脚的紧凑分配中使用它们。如果您只进行一次 GPIO 配置,则不需要&=
或|=
运算符。
此外,更喜欢使用BSRR
而不是ODR
,因为它允许对输出引脚进行原子修改。
这是Blue Pill板的 LED 闪烁示例:
//========================================================================
// Includes
//========================================================================
#include "stm32f1xx.h"
#include <stdbool.h>
#include <stdint.h>
//========================================================================
// Local Variables
//========================================================================
volatile uint32_t sysTick = 0;
//========================================================================
// Local Function Prototypes
//========================================================================
void initialize(void);
void delayMs(uint32_t ms);
//========================================================================
// Initialization
//========================================================================
void initialize(void) {
SystemCoreClock = 8000000U;
RCC->APB2ENR |= RCC_APB2ENR_IOPCEN // Enable PortC
| RCC_APB2ENR_AFIOEN; // Enable A.F.Z
// Pin Remaps
AFIO->MAPR |= AFIO_MAPR_SWJ_CFG_JTAGDISABLE; // JTAG is disabled
// GPIO Settings
GPIOC->CRH = 0x44244444; // LED connected to PC13
GPIOC->BSRR = (1 << 13); // LED is inverted, turn it off.
// SysTick Settings
SysTick_Config(SystemCoreClock / 1000);
// Initialization Done Signal
GPIOC->BSRR = (1 << (13 + 16));
delayMs(200);
GPIOC->BSRR = (1 << 13);
}
//========================================================================
// Main
//========================================================================
int main(void) {
initialize();
while (true) {
delayMs(500);
GPIOC->BSRR = (1 << (13 + 16));
delayMs(500);
GPIOC->BSRR = (1 << 13);
}
}
//========================================================================
// Interrupt Handlers
//========================================================================
void SysTick_Handler(void)
{
++sysTick;
}
//========================================================================
// Local Functions
//========================================================================
void delayMs(uint32_t ms) {
uint32_t start = sysTick;
while (sysTick - start < ms);
}
推荐阅读
- opengl - GLFW_TRANSPARENT 和 GLFW_ALPHA_MASK 未定义
- python - Keras - Glorot 统一初始化器:输入和输出单元?
- javascript - 在生产环境中构建和运行时找不到模块“./static”
- wordpress - 如何在加载网页 5 分钟后运行 Javascript 代码?
- sql - 如何在 Redshift 中做分层随机样本?
- python - Python protobuf "from google.protobuf.pyext import _message" - "ImportError: DLL load failed: The specified procedure could not be found"
- android - 读取安卓账户数据
- docker - UCP:无法成功设置本地节点。运行“docker logs ucp-reconcile”以获取更多详细信息
- json - 0auth2 API 调用的 PowerShell 标头
- cookies - 如何使 cookie 身份验证中间件重定向到 https URI?