01_stm32 裸板程序
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,还得查数据手册

浙公网安备 33010602011771号