惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

酷 壳 – CoolShell
酷 壳 – CoolShell
H
Hacker News: Front Page
P
Palo Alto Networks Blog
T
ThreatConnect
Apple Machine Learning Research
Apple Machine Learning Research
博客园_首页
T
True Tiger Recordings
P
Privacy & Cybersecurity Law Blog
B
Blog
IT之家
IT之家
Last Week in AI
Last Week in AI
F
Full Disclosure
Hacker News: Ask HN
Hacker News: Ask HN
C
Comments on: Blog
Microsoft Azure Blog
Microsoft Azure Blog
C
Cybersecurity and Infrastructure Security Agency CISA
Microsoft Security Blog
Microsoft Security Blog
博客园 - 【当耐特】
N
News and Events Feed by Topic
NISL@THU
NISL@THU
腾讯CDC
雷峰网
雷峰网
Security Latest
Security Latest
李成银的技术随笔
M
Microsoft Research Blog - Microsoft Research
L
LangChain Blog
L
Lohrmann on Cybersecurity
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
C
Check Point Blog
Y
Y Combinator Blog
Recent Announcements
Recent Announcements
博客园 - Franky
N
News | PayPal Newsroom
V
V2EX
A
About on SuperTechFans
The Register - Security
The Register - Security
月光博客
月光博客
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Google Online Security Blog
Google Online Security Blog
MyScale Blog
MyScale Blog
Cisco Talos Blog
Cisco Talos Blog
Vercel News
Vercel News
WordPress大学
WordPress大学
C
Cyber Attacks, Cyber Crime and Cyber Security
The Hacker News
The Hacker News
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
爱范儿
爱范儿
A
Arctic Wolf
L
LINUX DO - 最新话题
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More

博客园 - 靖意风

使用QT 将可执行程序 进行打包 对使用的屏幕的整理 对mmc 设备进行分区 开发板启动时间优化 nmcli 设置网络配置 虚拟机下 安装 ubuntu 18.04 硬件基础知识__串口 字节对齐问题和 小端格式 在ubuntu下 编译23位的测试文件 31_了解 x6818开发板是 如何使用/dev/ttySAC0 进行打印log 10_linux dirver platform 框架 ubuntu24.04.02 下安装软件 记录 ubuntu 更新源 vmware 虚拟机的三种网卡 vmware 安装 ubuntu 24.04.02 07_linux 字符设备了解 04_kernel编程框架和 printk传参 05_使用linux内核的gpio库函数 03_uboot 命令整理 01_了解嵌入式开发
01_stm32 裸板程序
靖意风 · 2025-05-25 · via 博客园 - 靖意风

1. 使用C语言 设置位运算 

如果将某位设置为0:就将该位和0做与运算,其他位和1做与运算
如果将某位设置为1:就将该位和1做或运算,其他位和0做或运算
举例如下:
将a 的 第 5位 设置为0, 其他位 不变
a &= ~(1<<5); // A[5] = 0
将 a[6-9] 共 四位 设置成 1
a |= (0xF << 6);
// a |= (~((~0)<< 4)); //这个是其他的参考方法
将 a[24-19] 共6位 设置成 0
a &= ~(0x3f << 19)

2. 查看stm32裸盘程序

寄存器可以通过指定的内存地址进行访问,对寄存器的某些位读写,就可以将寄存器地址当成指针来处理。举例对GPIOB5控制的led,设置亮灭

// stm32f10x.h
#ifndef __STM32F10X_H
#define __STM32F10X_H

// 定义宏表示基地址和两条总线地址
#define  PERIPH_BASE         ((unsigned int)0X40000000)

#define  APB2PERIPH_BASE      (PERIPH_BASE + 0X10000)
#define  AHBPERIPH_BASE        (PERIPH_BASE + 0X20000)

// 定义宏表示3个控制器地址 
#define  GPIOB_BASE            (APB2PERIPH_BASE + 0X0C00)
#define  GPIOE_BASE            (APB2PERIPH_BASE + 0X1800)
#define  RCC_BASE                (AHBPERIPH_BASE  + 0X1000)

// 定义宏表示寄存器
#define  RCC_APB2ENR            (*(unsigned int *)(RCC_BASE   + 0X18))

#define  GPIOB_CRL                (*(unsigned int *)(GPIOB_BASE + 0X00))
#define  GPIOB_CRH                (*(unsigned int *)(GPIOB_BASE + 0X04))
#define  GPIOB_ODR                (*(unsigned int *)(GPIOB_BASE + 0X0C))

#define  GPIOE_CRL                (*(unsigned int *)(GPIOE_BASE + 0X00))
#define  GPIOE_CRH                (*(unsigned int *)(GPIOE_BASE + 0X04))
#define  GPIOE_ODR                (*(unsigned int *)(GPIOE_BASE + 0X0C))

#endif
#include "stm32f10x.h"

void delay(unsigned int i) {
    while(i--); // 延时函数
}

// 防止报错
void SystemInit(void) {
    // ...
}

// 入口函数 
int main(void) {
    // led硬件初始化 
    // 1. 打开GPIOB控制器的时钟
    // RCC_APB2ENR[3] = 1
    RCC_APB2ENR |= (1 << 3);
    
    // 2. 配置GPIOB5 - 推挽输出, 50MHz 
    // GPIOB_CRL[23:20] = 0011
    GPIOB_CRL &= ~(0XF << 20); // [23:20]=0000
    GPIOB_CRL |= (3 << 20);    // [21:20]=11// 3. 配置PB5, 输出高电平, 灭
    // GPIOB_ODR[5] = 1
    GPIOB_ODR |= (1 << 5);
    
    while(1) {
        // 开灯
        GPIOB_ODR &= ~(1 << 5);
        // 延时
        delay(0xfffff);
        // 关灯
        GPIOB_ODR |= (1 << 5);-
        // 延时
        delay(0xfffff);
    }
}

 该方法编程的缺点:几天之后,不知道寄存器为什么这样设置。要是换一个gpio,还得查数据手册