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

推荐订阅源

Recent Announcements
Recent Announcements
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
B
Blog
T
The Blog of Author Tim Ferriss
J
Java Code Geeks
腾讯CDC
D
Docker
G
Google Developers Blog
D
DataBreaches.Net
雷峰网
雷峰网
Blog — PlanetScale
Blog — PlanetScale
S
SegmentFault 最新的问题
The Cloudflare Blog
有赞技术团队
有赞技术团队
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Stack Overflow Blog
Stack Overflow Blog
大猫的无限游戏
大猫的无限游戏
量子位
美团技术团队
aimingoo的专栏
aimingoo的专栏
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Engineering at Meta
Engineering at Meta
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More

博客园 - 靖意风

设置ttyUSB0 使用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,还得查数据手册